Browse Source

【代码优化】代码生成: vue3_vben5_antd schema 主子表模板优化

puhui999 6 months ago
parent
commit
b3a40af214

+ 7 - 5
yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/service/codegen/inner/CodegenEngine.java

@@ -154,15 +154,15 @@ public class CodegenEngine {
             .put(CodegenFrontTypeEnum.VUE3_VBEN5_ANTD_SCHEMA.getType(), vue3Vben5AntdSchemaTemplatePath("api/api.ts"),
                     vue3FilePath("api/${table.moduleName}/${table.businessName}/index.ts"))
             .put(CodegenFrontTypeEnum.VUE3_VBEN5_ANTD_SCHEMA.getType(), vue3Vben5AntdSchemaTemplatePath("views/modules/form_sub_normal.vue"),  // 特殊:主子表专属逻辑
-                    vue3FilePath("views/${table.moduleName}/${table.businessName}/modules/${subSimpleClassName}Form.vue"))
+                    vue3FilePath("views/${table.moduleName}/${table.businessName}/modules/${subSimpleClassName_strikeCase}-form.vue"))
             .put(CodegenFrontTypeEnum.VUE3_VBEN5_ANTD_SCHEMA.getType(), vue3Vben5AntdSchemaTemplatePath("views/modules/form_sub_inner.vue"),  // 特殊:主子表专属逻辑
-                    vue3FilePath("views/${table.moduleName}/${table.businessName}/modules/${subSimpleClassName}Form.vue"))
+                    vue3FilePath("views/${table.moduleName}/${table.businessName}/modules/${subSimpleClassName_strikeCase}-form.vue"))
             .put(CodegenFrontTypeEnum.VUE3_VBEN5_ANTD_SCHEMA.getType(), vue3Vben5AntdSchemaTemplatePath("views/modules/form_sub_erp.vue"),  // 特殊:主子表专属逻辑
-                    vue3FilePath("views/${table.moduleName}/${table.businessName}/modules/${subSimpleClassName}Form.vue"))
+                    vue3FilePath("views/${table.moduleName}/${table.businessName}/modules/${subSimpleClassName_strikeCase}-form.vue"))
             .put(CodegenFrontTypeEnum.VUE3_VBEN5_ANTD_SCHEMA.getType(), vue3Vben5AntdSchemaTemplatePath("views/modules/list_sub_inner.vue"),  // 特殊:主子表专属逻辑
-                    vue3FilePath("views/${table.moduleName}/${table.businessName}/modules/${subSimpleClassName}List.vue"))
+                    vue3FilePath("views/${table.moduleName}/${table.businessName}/modules/${subSimpleClassName_strikeCase}-list.vue"))
             .put(CodegenFrontTypeEnum.VUE3_VBEN5_ANTD_SCHEMA.getType(), vue3Vben5AntdSchemaTemplatePath("views/modules/list_sub_erp.vue"),  // 特殊:主子表专属逻辑
-                    vue3FilePath("views/${table.moduleName}/${table.businessName}/modules/${subSimpleClassName}List.vue"))
+                    vue3FilePath("views/${table.moduleName}/${table.businessName}/modules/${subSimpleClassName_strikeCase}-list.vue"))
             .build();
 
     @Resource
@@ -451,6 +451,8 @@ public class CodegenEngine {
             filePath = StrUtil.replace(filePath, "${subTable.className}", subTable.getClassName());
             filePath = StrUtil.replace(filePath, "${subSimpleClassName}",
                     ((List<String>) bindingMap.get("subSimpleClassNames")).get(subIndex));
+            filePath = StrUtil.replace(filePath, "${subSimpleClassName_strikeCase}",
+                    ((List<String>) bindingMap.get("subSimpleClassName_strikeCases")).get(subIndex));
         }
         return filePath;
     }

+ 2 - 0
yudao-module-infra/yudao-module-infra-biz/src/main/resources/codegen/vue3_vben5_antd/schema/api/api.ts.vm

@@ -23,6 +23,7 @@ export namespace ${simpleClassName}Api {
       #end
     #end
   }
+
 #end
   /** ${table.classComment}信息 */
   export interface ${simpleClassName} {
@@ -104,6 +105,7 @@ export function export${simpleClassName}(params: any) {
 #set ($subClassNameVar = $subClassNameVars.get($index))
 
 // ==================== 子表($subTable.classComment) ====================
+
 ## 情况一:MASTER_ERP 时,需要分查询页子表
 #if ( $table.templateType == 11 )
 /** 获得${subTable.classComment}分页 */

+ 9 - 3
yudao-module-infra/yudao-module-infra-biz/src/main/resources/codegen/vue3_vben5_antd/schema/views/data.ts.vm

@@ -88,7 +88,7 @@ export function useFormSchema(): VbenFormSchema[] {
         maxCount: 1,
       },
   #elseif($column.htmlType == "editor")## 文本编辑器
-      component: 'Editor',
+      component: 'RichTextarea',
   #elseif($column.htmlType == "select")## 下拉框
       component: 'Select',
       componentProps: {
@@ -279,6 +279,7 @@ export function useGridColumns(
     #set ($subJoinColumn = $subJoinColumns.get($index))##当前 join 字段
     #set ($subSimpleClassName_strikeCase = $subSimpleClassName_strikeCases.get($index))
 // ==================== 子表($subTable.classComment) ====================
+
 #if ($table.templateType == 11) ## erp 情况
 /** 新增/修改的表单 */
 export function use${subSimpleClassName}FormSchema(): VbenFormSchema[] {
@@ -331,7 +332,7 @@ export function use${subSimpleClassName}FormSchema(): VbenFormSchema[] {
                                     maxCount: 1,
                                 },
                             #elseif($column.htmlType == "editor")## 文本编辑器
-                                component: 'Editor',
+                                component: 'RichTextarea',
                             #elseif($column.htmlType == "select")## 下拉框
                                 component: 'Select',
                                 componentProps: {
@@ -391,6 +392,7 @@ export function use${subSimpleClassName}FormSchema(): VbenFormSchema[] {
         #end
     ];
 }
+
 /** 列表的字段 */
 export function use${subSimpleClassName}GridColumns(
     onActionClick?: OnActionClickFn<${simpleClassName}Api.${subSimpleClassName}>,
@@ -445,6 +447,7 @@ export function use${subSimpleClassName}GridColumns(
         },
     ];
 }
+
 #else
     #if ($subTable.subJoinMany) ## 一对多
     /** 新增/修改列表的字段 */
@@ -510,6 +513,7 @@ export function use${subSimpleClassName}GridColumns(
             },
         ];
     }
+
     #else
     /** 新增/修改的表单 */
     export function use${subSimpleClassName}FormSchema(): VbenFormSchema[] {
@@ -562,7 +566,7 @@ export function use${subSimpleClassName}GridColumns(
                                         maxCount: 1,
                                     },
                                 #elseif($column.htmlType == "editor")## 文本编辑器
-                                    component: 'Editor',
+                                    component: 'RichTextarea',
                                 #elseif($column.htmlType == "select")## 下拉框
                                     component: 'Select',
                                     componentProps: {
@@ -622,6 +626,7 @@ export function use${subSimpleClassName}GridColumns(
             #end
         ];
     }
+
     #end
     #if ($table.templateType == 12) ## 内嵌情况
     /** 列表的字段 */
@@ -649,6 +654,7 @@ export function use${subSimpleClassName}GridColumns(
             #end
         ];
     }
+
     #end
 #end
 #end

+ 3 - 3
yudao-module-infra/yudao-module-infra-biz/src/main/resources/codegen/vue3_vben5_antd/schema/views/form.vue.vm

@@ -6,7 +6,9 @@ import { message, Tabs, Checkbox, Input, Textarea, Select,RadioGroup,CheckboxGro
 ## 特殊:主子表专属逻辑
 #if ( $table.templateType == 10 || $table.templateType == 12 )
   #foreach ($subSimpleClassName in $subSimpleClassNames)
-  import ${subSimpleClassName}Form from './${subSimpleClassName}Form.vue'
+  #set ($index = $foreach.count - 1)
+  #set ($subSimpleClassName_strikeCase = $subSimpleClassName_strikeCases.get($index))
+  import ${subSimpleClassName}Form from './${subSimpleClassName_strikeCase}-form.vue'
   #end
 #end
 
@@ -125,9 +127,7 @@ const [Modal, modalApi] = useVbenModal({
     if (!data) {
       return;
     }
-
     if (data.id) {
-      // 编辑
       modalApi.lock();
       try {
         data = await get${simpleClassName}(data.id);

+ 14 - 12
yudao-module-infra/yudao-module-infra-biz/src/main/resources/codegen/vue3_vben5_antd/schema/views/index.vue.vm

@@ -10,7 +10,9 @@ import Form from './modules/form.vue';
 ## 特殊:主子表专属逻辑
 #if ( $table.templateType == 11 || $table.templateType == 12 )
     #foreach ($subSimpleClassName in $subSimpleClassNames)
-    import ${subSimpleClassName}List from './modules/${subSimpleClassName}List.vue'
+    #set ($index = $foreach.count - 1)
+    #set ($subSimpleClassName_strikeCase = $subSimpleClassName_strikeCases.get($index))
+    import ${subSimpleClassName}List from './modules/${subSimpleClassName_strikeCase}-list.vue'
     #end
 #end
 
@@ -54,12 +56,6 @@ function onRefresh() {
 #end
 }
 
-/** 导出表格 */
-async function onExport() {
-  const data = await export${simpleClassName}(await gridApi.formApi.getValues());
-  downloadByData(data, '${table.classComment}.xls');
-}
-
 /** 创建${table.classComment} */
 function onCreate() {
   formModalApi.setData({}).open();
@@ -96,6 +92,12 @@ async function onDelete(row: ${simpleClassName}Api.${simpleClassName}) {
   }
 }
 
+/** 导出表格 */
+async function onExport() {
+  const data = await export${simpleClassName}(await gridApi.formApi.getValues());
+  downloadByData(data, '${table.classComment}.xls');
+}
+
 /** 表格操作按钮的回调函数 */
 function onActionClick({
   code,
@@ -108,14 +110,14 @@ function onActionClick({
       break;
     }
   #end
-    case 'delete': {
-      onDelete(row);
-      break;
-    }
     case 'edit': {
       onEdit(row);
       break;
     }
+    case 'delete': {
+      onDelete(row);
+      break;
+    }
   }
 }
 
@@ -179,7 +181,7 @@ const [Grid, gridApi] = useVbenVxeGrid({
         #if ($table.templateType == 12) ## 内嵌情况
           <template #expand_content="{ row }">
             <!-- 子表的表单 -->
-            <Tabs v-model:active-key="subTabsName">
+            <Tabs v-model:active-key="subTabsName" class="mx-8">
                 #foreach ($subTable in $subTables)
                     #set ($index = $foreach.count - 1)
                     #set ($subClassNameVar = $subClassNameVars.get($index))

+ 24 - 35
yudao-module-infra/yudao-module-infra-biz/src/main/resources/codegen/vue3_vben5_antd/schema/views/modules/form_sub_normal.vue.vm

@@ -24,7 +24,7 @@ import { get${subSimpleClassName}By${SubJoinColumnName} } from '#/api/${table.mo
 #end
 
 const props = defineProps<{
-   ${subJoinColumn.javaField}?: any // ${subJoinColumn.columnComment}(主表的关联字段)
+   ${subJoinColumn.javaField}?: number // ${subJoinColumn.columnComment}(主表的关联字段)
 }>()
 
 #if ($subTable.subJoinMany) ## 一对多
@@ -41,7 +41,7 @@ function onActionClick({
   }
 }
 
-const [${subSimpleClassName}Grid, ${subClassNameVar}GridApi] = useVbenVxeGrid({
+const [Grid, gridApi] = useVbenVxeGrid({
 gridOptions: {
   columns: use${subSimpleClassName}GridEditColumns(onActionClick),
   border: true,
@@ -60,34 +60,25 @@ gridOptions: {
 },
 });
 
-/** 删除${subTable.classComment} */
-const onDelete =  async (row: ${simpleClassName}Api.${subSimpleClassName}) => {
-  await ${subClassNameVar}GridApi.grid.remove(row);
+/** 添加${subTable.classComment} */
+const onAdd = async () => {
+  await gridApi.grid.insertAt({} as ${simpleClassName}Api.${subSimpleClassName}, -1);
 }
 
-/** 添加${subTable.classComment} */
-const handleAdd = async () => {
-  await ${subClassNameVar}GridApi.grid.insertAt({} as ${simpleClassName}Api.${subSimpleClassName}, -1);
+/** 删除${subTable.classComment} */
+const onDelete =  async (row: ${simpleClassName}Api.${subSimpleClassName}) => {
+  await gridApi.grid.remove(row);
 }
 
 /** 提供获取表格数据的方法供父组件调用 */
 defineExpose({
   getData: (): ${simpleClassName}Api.${subSimpleClassName}[] => {
-    // 获取当前数据,但排除已删除的记录
-    const allData = ${subClassNameVar}GridApi.grid.getData();
-    const removedData = ${subClassNameVar}GridApi.grid.getRemoveRecords();
-    const removedIds = new Set(removedData.map((row) => row.id));
-
-    // 过滤掉已删除的记录
-    const currentData = allData.filter((row) => !removedIds.has(row.id));
-
-    // 获取新插入的记录并移除id
-    const insertedData = ${subClassNameVar}GridApi.grid.getInsertRecords().map((row) => {
-      delete row.id;
-      return row;
-    });
-
-    return [...currentData, ...insertedData];
+    const data = gridApi.grid.getData() as ${simpleClassName}Api.${subSimpleClassName}[];
+    const removeRecords = gridApi.grid.getRemoveRecords() as ${simpleClassName}Api.${subSimpleClassName}[];
+    const insertRecords = gridApi.grid.getInsertRecords() as ${simpleClassName}Api.${subSimpleClassName}[];
+    return data
+        .filter((row) => !removeRecords.some((removed) => removed.id === row.id))
+        .concat(insertRecords.map((row: any) => ({ ...row, id: undefined })));
   },
 });
 
@@ -98,14 +89,13 @@ watch(
       if (!val) {
         return;
       }
-
       await nextTick();
-      await ${subClassNameVar}GridApi.grid.loadData(await get${subSimpleClassName}ListBy${SubJoinColumnName}(props.${subJoinColumn.javaField}!));
+      await gridApi.grid.loadData(await get${subSimpleClassName}ListBy${SubJoinColumnName}(props.${subJoinColumn.javaField}!));
     },
     { immediate: true },
 );
 #else
-const [${subSimpleClassName}Form, ${subClassNameVar}FormApi] = useVbenForm({
+const [Form, formApi] = useVbenForm({
 layout: 'horizontal',
 schema: use${subSimpleClassName}FormSchema(),
 showDefaultActions: false
@@ -114,10 +104,10 @@ showDefaultActions: false
 /** 暴露出表单校验方法和表单值获取方法 */
 defineExpose({
   validate: async () => {
-    const { valid } = await ${subClassNameVar}FormApi.validate();
+    const { valid } = await formApi.validate();
     return valid;
   },
-  getValues: ${subClassNameVar}FormApi.getValues,
+  getValues: formApi.getValues,
 });
 
 /** 监听主表的关联字段的变化,加载对应的子表数据 */
@@ -127,9 +117,8 @@ watch(
       if (!val) {
         return;
       }
-
       await nextTick();
-      await ${subClassNameVar}FormApi.setValues(await get${subSimpleClassName}By${SubJoinColumnName}(props.${subJoinColumn.javaField}!));
+      await formApi.setValues(await get${subSimpleClassName}By${SubJoinColumnName}(props.${subJoinColumn.javaField}!));
     },
     { immediate: true },
 );
@@ -138,7 +127,7 @@ watch(
 
 <template>
 #if ($subTable.subJoinMany) ## 一对多
-  <${subSimpleClassName}Grid class="mx-4">
+  <Grid class="mx-4">
       #foreach($column in $subColumns)
           #if ($column.createOperation || $column.updateOperation)
               #set ($javaField = $column.javaField)
@@ -191,13 +180,13 @@ watch(
               #end
           #end
       #end
-  </${subSimpleClassName}Grid>
-  <div class="flex justify-center">
-    <Button :icon="h(Plus)" type="primary" ghost @click="handleAdd" v-access:code="['${subTable.moduleName}:${simpleClassName_strikeCase}:create']">
+  </Grid>
+  <div class="flex justify-center -mt-4">
+    <Button :icon="h(Plus)" type="primary" ghost @click="onAdd" v-access:code="['${subTable.moduleName}:${simpleClassName_strikeCase}:create']">
       {{ $t('ui.actionTitle.create', ['${subTable.classComment}']) }}
     </Button>
   </div>
 #else
-  <${subSimpleClassName}Form class="mx-4" />
+  <Form class="mx-4" />
 #end
 </template>

+ 19 - 20
yudao-module-infra/yudao-module-infra-biz/src/main/resources/codegen/vue3_vben5_antd/schema/views/modules/list_sub_erp.vue.vm

@@ -28,7 +28,7 @@ import { get${subSimpleClassName}By${SubJoinColumnName} } from '#/api/${table.mo
 #end
 
 const props = defineProps<{
-      ${subJoinColumn.javaField}?: any // ${subJoinColumn.columnComment}(主表的关联字段)
+      ${subJoinColumn.javaField}?: number // ${subJoinColumn.columnComment}(主表的关联字段)
 }>()
 
 #if ($table.templateType == 11) ## erp
@@ -46,6 +46,7 @@ function onCreate() {
 function onEdit(row: ${simpleClassName}Api.${subSimpleClassName}) {
   formModalApi.setData(row).open();
 }
+
 /** 删除${subTable.classComment} */
 async function onDelete(row: ${simpleClassName}Api.${subSimpleClassName}) {
   const hideLoading = message.loading({
@@ -71,16 +72,17 @@ function onActionClick({
  row,
 }: OnActionClickParams<${simpleClassName}Api.${subSimpleClassName}>) {
   switch (code) {
-    case 'delete': {
-      onDelete(row);
-      break;
-    }
     case 'edit': {
       onEdit(row);
       break;
     }
+    case 'delete': {
+      onDelete(row);
+      break;
+    }
   }
 }
+
 #end
   const [Grid, gridApi] = useVbenVxeGrid({
     gridOptions: {
@@ -119,7 +121,6 @@ const onRefresh = async ()=> {
         if (!val) {
           return;
         }
-
         await nextTick();
         await onRefresh()
       },
@@ -128,18 +129,16 @@ const onRefresh = async ()=> {
 </script>
 
 <template>
-    <div class="mx-4">
-        #if ($table.templateType == 11) ## erp
-          <FormModal @success="onRefresh" />
-          <Grid table-title="${subTable.classComment}列表">
-            <template #toolbar-tools>
-              <Button :icon="h(Plus)" type="primary" @click="onCreate" v-access:code="['${subTable.moduleName}:${subSimpleClassName_strikeCase}:create']">
-                {{ $t('ui.actionTitle.create', ['${subTable.classComment}']) }}
-              </Button>
-            </template>
-          </Grid>
-        #else
-        <Grid table-title="${subTable.classComment}列表" />
-        #end
-    </div>
+    #if ($table.templateType == 11) ## erp
+      <FormModal @success="onRefresh" />
+      <Grid table-title="${subTable.classComment}列表">
+        <template #toolbar-tools>
+          <Button :icon="h(Plus)" type="primary" @click="onCreate" v-access:code="['${subTable.moduleName}:${subSimpleClassName_strikeCase}:create']">
+            {{ $t('ui.actionTitle.create', ['${subTable.classComment}']) }}
+          </Button>
+        </template>
+      </Grid>
+    #else
+      <Grid table-title="${subTable.classComment}列表" />
+    #end
 </template>