admin-vben/apps/web-antd/src/views/infra/codegen/components/GenerateInfoForm.vue

358 lines
13 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<script lang="ts" setup>
import type { InfraCodegenApi } from '#/api/infra/codegen';
import type { SystemMenuApi } from '#/api/system/menu';
import { CircleHelp } from '@vben/icons';
import { Col, Divider, Form, FormItem, Input, Row, Select, SelectOption, Tooltip, TreeSelect } from 'ant-design-vue';
import { getCodegenTableList } from '#/api/infra/codegen';
import { getSimpleMenusList } from '#/api/system/menu';
import { DICT_TYPE, getDictOptions } from '#/utils/dict';
import { onMounted, ref, unref, watch } from 'vue';
defineOptions({ name: 'InfraCodegenGenerateInfoForm' });
const props = defineProps<Props>();
interface Props {
columns?: InfraCodegenApi.CodegenColumn[];
table?: InfraCodegenApi.CodegenTable;
}
const formRef = ref();
const formData = ref<InfraCodegenApi.CodegenTable>({} as InfraCodegenApi.CodegenTable);
const subColumns = ref<InfraCodegenApi.CodegenColumn[]>([]);
const tables = ref<InfraCodegenApi.CodegenTable[]>([]);
const menus = ref<SystemMenuApi.SystemMenu[]>([]);
/** 菜单树选项 */
const menuTreeProps = {
value: 'id',
title: 'name',
children: 'children',
};
const rules = {
templateType: [{ required: true, message: '生成模板不能为空', trigger: 'blur' }],
frontType: [{ required: true, message: '前端类型不能为空', trigger: 'blur' }],
scene: [{ required: true, message: '生成场景不能为空', trigger: 'blur' }],
moduleName: [{ required: true, message: '模块名不能为空', trigger: 'blur' }],
businessName: [{ required: true, message: '业务名不能为空', trigger: 'blur' }],
className: [{ required: true, message: '类名称不能为空', trigger: 'blur' }],
classComment: [{ required: true, message: '类描述不能为空', trigger: 'blur' }],
};
/** 监听 table 属性,复制给 formData 属性 */
watch(
() => props.table,
(table) => {
if (!table) return;
formData.value = { ...table };
},
{
deep: true,
immediate: true,
},
);
/** 子表名称选中 */
async function subTableNameSelected(value) {
// 使用表ID获取子表的字段
const subTableColumns = await getSubCodegenColumns(formData.value.dataSourceConfigId, value);
subColumns.value = subTableColumns;
// 重置已经选择的子表字段
formData.value.subTableFkColumnId = undefined;
formData.value.mainTableFKColumnId = undefined;
}
/** 获取子表的列 */
async function getSubCodegenColumns(dataSourceConfigId: number, tableName: string) {
const tableList = await getCodegenTableList(dataSourceConfigId);
const subTable = tableList.find((item) => item.tableName === tableName);
if (subTable) {
// 这里需要实际API来获取子表的列信息
// 由于没有完整接口信息,这里仅模拟返回
return [];
}
return [];
}
/** 初始化 */
onMounted(async () => {
// 获取菜单列表
menus.value = await getSimpleMenusList();
// 获取表数据,用于主子表选择
tables.value = await getCodegenTableList(formData.value.dataSourceConfigId);
});
/** 暴露方法 */
defineExpose({
validate: async () => {
try {
await unref(formRef).validate();
return true;
} catch {
return false;
}
},
});
</script>
<template>
<Form ref="formRef" :model="formData" :rules="rules" :label-col="{ span: 4 }" :wrapper-col="{ span: 20 }">
<Row :gutter="16">
<Col :span="12">
<FormItem label="生成模板" name="templateType">
<Select v-model:value="formData.templateType">
<SelectOption
v-for="dict in getDictOptions(DICT_TYPE.INFRA_CODEGEN_TEMPLATE_TYPE, 'number')"
:key="dict.value"
:value="dict.value"
>
{{ dict.label }}
</SelectOption>
</Select>
</FormItem>
</Col>
<Col :span="12">
<FormItem label="前端类型" name="frontType">
<Select v-model:value="formData.frontType">
<SelectOption
v-for="dict in getDictOptions(DICT_TYPE.INFRA_CODEGEN_FRONT_TYPE, 'number')"
:key="dict.value"
:value="dict.value"
>
{{ dict.label }}
</SelectOption>
</Select>
</FormItem>
</Col>
<Col :span="12">
<FormItem label="生成场景" name="scene">
<Select v-model:value="formData.scene">
<SelectOption
v-for="dict in getDictOptions(DICT_TYPE.INFRA_CODEGEN_SCENE, 'number')"
:key="dict.value"
:value="dict.value"
>
{{ dict.label }}
</SelectOption>
</Select>
</FormItem>
</Col>
<Col :span="12">
<FormItem label="上级菜单">
<Tooltip placement="top">
<template #title>分配到指定菜单下,例如 系统管理</template>
<template #default>
<TreeSelect
v-model:value="formData.parentMenuId"
:tree-data="menus"
:field-names="menuTreeProps"
show-search
tree-node-filter-prop="title"
:tree-checkable="false"
:tree-default-expand-all="false"
placeholder="请选择系统菜单"
style="width: 100%"
/>
</template>
</Tooltip>
</FormItem>
</Col>
<Col :span="12">
<FormItem label="模块名" name="moduleName">
<Tooltip placement="top">
<template #title>模块名,即一级目录,例如 system、infra、tool 等等</template>
<template #default>
<Input v-model:value="formData.moduleName" />
</template>
</Tooltip>
</FormItem>
</Col>
<Col :span="12">
<FormItem label="业务名" name="businessName">
<Tooltip placement="top">
<template #title>业务名,即二级目录,例如 user、permission、dict 等等</template>
<template #default>
<Input v-model:value="formData.businessName" />
</template>
</Tooltip>
</FormItem>
</Col>
<Col :span="12">
<FormItem label="类名称" name="className">
<Tooltip placement="top">
<template #title>类名称首字母大写例如SysUser、SysMenu、SysDictData 等等</template>
<template #default>
<Input v-model:value="formData.className" />
</template>
</Tooltip>
</FormItem>
</Col>
<Col :span="12">
<FormItem label="类描述" name="classComment">
<Tooltip placement="top">
<template #title>用作类描述,例如 用户</template>
<template #default>
<Input v-model:value="formData.classComment" />
</template>
</Tooltip>
</FormItem>
</Col>
</Row>
<!-- 树表信息 -->
<template v-if="formData.templateType === 2">
<Divider>树表信息</Divider>
<Row :gutter="16">
<Col :span="12">
<FormItem label="父编号字段" name="treeParentColumnId">
<Tooltip placement="top">
<template #title>树显示的父编码字段名, 如parent_Id</template>
<template #icon><CircleHelp /></template>
<template #default>
<Select v-model:value="formData.treeParentColumnId" placeholder="请选择" allow-clear>
<SelectOption v-for="column in columns" :key="column.id" :value="column.id">
{{ column.columnName }}
</SelectOption>
</Select>
</template>
</Tooltip>
</FormItem>
</Col>
<Col :span="12">
<FormItem label="名称字段" name="treeNameColumnId">
<Tooltip placement="top">
<template #title>树节点显示的名称字段一般是name</template>
<template #icon><CircleHelp /></template>
<template #default>
<Select v-model:value="formData.treeNameColumnId" placeholder="请选择" allow-clear>
<SelectOption v-for="column in columns" :key="column.id" :value="column.id">
{{ column.columnName }}
</SelectOption>
</Select>
</template>
</Tooltip>
</FormItem>
</Col>
</Row>
</template>
<!-- 主子表信息 -->
<template v-if="formData.templateType === 3">
<Divider>主子表信息</Divider>
<Row :gutter="16">
<Col :span="24">
<FormItem label="关联子表的成员变量名" name="subJoinColumnId">
<Tooltip placement="top">
<template #title>子表的成员变量名,默认为子表的名称</template>
<template #icon><CircleHelp /></template>
<template #default>
<Input v-model:value="formData.subJoinColumnId" placeholder="请输入" />
</template>
</Tooltip>
</FormItem>
</Col>
<Col :span="12">
<FormItem label="子表的表名" name="subTableName">
<Tooltip placement="top">
<template #title>关联的子表的表名, 如sys_user_post</template>
<template #icon><CircleHelp /></template>
<template #default>
<Select
v-model:value="formData.subTableName"
placeholder="请选择"
allow-clear
@change="subTableNameSelected"
>
<SelectOption v-for="table in tables" :key="table.tableName" :value="table.tableName">
{{ `${table.tableName}${table.tableComment}` }}
</SelectOption>
</Select>
</template>
</Tooltip>
</FormItem>
</Col>
<Col :span="12">
<FormItem label="子表的类名" name="subTableClassName">
<Tooltip placement="top">
<template #title>子表的类名, 如SysUserPost</template>
<template #icon><CircleHelp /></template>
<template #default>
<Input v-model:value="formData.subTableClassName" placeholder="请输入" />
</template>
</Tooltip>
</FormItem>
</Col>
<Col :span="12">
<FormItem label="子表的外键字段" name="subTableFkColumnId">
<Tooltip placement="top">
<template #title>子表的外键字段的编号,对应主表的主键</template>
<template #icon><CircleHelp /></template>
<template #default>
<Select v-model:value="formData.subTableFkColumnId" placeholder="请选择" allow-clear>
<SelectOption v-for="column in subColumns" :key="column.id" :value="column.id">
{{ column.columnName }}
</SelectOption>
</Select>
</template>
</Tooltip>
</FormItem>
</Col>
<Col :span="12">
<FormItem label="主表的类名" name="mainTableClassName">
<Tooltip placement="top">
<template #title>主表的类名, 如SysUser</template>
<template #icon><CircleHelp /></template>
<template #default>
<Input v-model:value="formData.mainTableClassName" placeholder="请输入" />
</template>
</Tooltip>
</FormItem>
</Col>
<Col :span="12">
<FormItem label="主表的外键字段" name="mainTableFKColumnId">
<Tooltip placement="top">
<template #title>子表的外键关联到主表的主键字段编号</template>
<template #icon><CircleHelp /></template>
<template #default>
<Select v-model:value="formData.mainTableFKColumnId" placeholder="请选择" allow-clear>
<SelectOption v-for="column in columns" :key="column.id" :value="column.id">
{{ column.columnName }}
</SelectOption>
</Select>
</template>
</Tooltip>
</FormItem>
</Col>
<Col :span="12">
<FormItem label="子表的类描述" name="subTableClassComment">
<Tooltip placement="top">
<template #title>子表的描述例如 用户岗位</template>
<template #icon><CircleHelp /></template>
<template #default>
<Input v-model:value="formData.subTableClassComment" placeholder="请输入" />
</template>
</Tooltip>
</FormItem>
</Col>
</Row>
</template>
</Form>
</template>
<style scoped>
.form-header {
padding-left: 8px;
margin-bottom: 16px;
font-size: 16px;
border-left: 3px solid #1890ff;
}
</style>