Commit f29abe853db4563c6cb03866db79669e2002158a

Authored by YunaiV
1 parent d7c62168

reactor:【infra 基础设施】优化 vben5 + element-plus 的 schema 模版

yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/enums/codegen/CodegenFrontTypeEnum.java
... ... @@ -21,9 +21,8 @@ public enum CodegenFrontTypeEnum {
21 21 VUE3_VBEN5_ANTD_SCHEMA(40), // Vue3 VBEN5 + ANTD + schema 模版
22 22 VUE3_VBEN5_ANTD_GENERAL(41), // Vue3 VBEN5 + ANTD 标准模版
23 23  
24   - // TODO @puhui999::50、51 会好点;
25   - VUE3_VBEN5_EP_SCHEMA(42), // Vue3 VBEN5 + EP + schema 模版
26   - VUE3_VBEN5_EP_GENERAL(43), // Vue3 VBEN5 + EP 标准模版
  24 + VUE3_VBEN5_EP_SCHEMA(50), // Vue3 VBEN5 + EP + schema 模版
  25 + VUE3_VBEN5_EP_GENERAL(51), // Vue3 VBEN5 + EP 标准模版
27 26 ;
28 27  
29 28 /**
... ...
yudao-module-infra/src/main/java/cn/iocoder/yudao/module/infra/service/codegen/inner/CodegenEngine.java
... ... @@ -343,7 +343,7 @@ public class CodegenEngine {
343 343 filePath = formatFilePath(filePath, bindingMap);
344 344 String content = templateEngine.getTemplate(vmPath).render(bindingMap);
345 345 // 格式化代码
346   - content = prettyCode(content);
  346 + content = prettyCode(content, vmPath);
347 347 result.put(filePath, content);
348 348 }
349 349  
... ... @@ -383,11 +383,14 @@ public class CodegenEngine {
383 383 * 如果不处理,Vue 的 Pretty 格式校验可能会报错
384 384 *
385 385 * @param content 格式化前的代码
  386 + * @param vmPath 模板路径
386 387 * @return 格式化后的代码
387 388 */
388   - private String prettyCode(String content) {
389   - // Vue 界面:去除字段后面多余的 , 逗号,解决前端的 Pretty 代码格式检查的报错
390   - content = content.replaceAll(",\n}", "\n}").replaceAll(",\n }", "\n }");
  389 + private String prettyCode(String content, String vmPath) {
  390 + // Vue 界面:去除字段后面多余的 , 逗号,解决前端的 Pretty 代码格式检查的报错(需要排除 vben5)
  391 + if (!StrUtil.contains(vmPath, "vben5")) {
  392 + content = content.replaceAll(",\n}", "\n}").replaceAll(",\n }", "\n }");
  393 + }
391 394 // Vue 界面:去除多的 dateFormatter,只有一个的情况下,说明没使用到
392 395 if (StrUtil.count(content, "dateFormatter") == 1) {
393 396 content = StrUtils.removeLineContains(content, "dateFormatter");
... ...
yudao-module-infra/src/main/resources/codegen/vue3_vben5_ele/schema/api/api.ts.vm
  1 +#set ($apiName = "${table.moduleName.substring(0,1).toUpperCase()}${table.moduleName.substring(1)}${simpleClassName}Api")
1 2 import type { PageParam, PageResult } from '@vben/request';
2 3 import type { Dayjs } from 'dayjs';
3 4  
4 5 import { requestClient } from '#/api/request';
5 6 #set ($baseURL = "/${table.moduleName}/${simpleClassName_strikeCase}")
6 7  
7   -export namespace ${simpleClassName}Api {
  8 +export namespace ${apiName} {
8 9 ## 特殊:主子表专属逻辑
9 10 #foreach ($subTable in $subTables)
10 11 #set ($index = $foreach.count - 1)
... ... @@ -60,27 +61,35 @@ export namespace ${simpleClassName}Api {
60 61 #if ( $table.templateType != 2 )
61 62 /** 查询${table.classComment}分页 */
62 63 export function get${simpleClassName}Page(params: PageParam) {
63   - return requestClient.get<PageResult<${simpleClassName}Api.${simpleClassName}>>('${baseURL}/page', { params });
  64 + return requestClient.get<PageResult<${apiName}.${simpleClassName}>>(
  65 + '${baseURL}/page',
  66 + { params },
  67 + );
64 68 }
65 69 #else
66 70 /** 查询${table.classComment}列表 */
67 71 export function get${simpleClassName}List(params: any) {
68   - return requestClient.get<${simpleClassName}Api.${simpleClassName}[]>('${baseURL}/list', { params });
  72 + return requestClient.get<${apiName}.${simpleClassName}[]>(
  73 + '${baseURL}/list',
  74 + { params },
  75 + );
69 76 }
70 77 #end
71 78  
72 79 /** 查询${table.classComment}详情 */
73 80 export function get${simpleClassName}(id: number) {
74   - return requestClient.get<${simpleClassName}Api.${simpleClassName}>(`${baseURL}/get?id=${id}`);
  81 + return requestClient.get<${apiName}.${simpleClassName}>(
  82 + `${baseURL}/get?id=${id}`,
  83 + );
75 84 }
76 85  
77 86 /** 新增${table.classComment} */
78   -export function create${simpleClassName}(data: ${simpleClassName}Api.${simpleClassName}) {
  87 +export function create${simpleClassName}(data: ${apiName}.${simpleClassName}) {
79 88 return requestClient.post('${baseURL}/create', data);
80 89 }
81 90  
82 91 /** 修改${table.classComment} */
83   -export function update${simpleClassName}(data: ${simpleClassName}Api.${simpleClassName}) {
  92 +export function update${simpleClassName}(data: ${apiName}.${simpleClassName}) {
84 93 return requestClient.put('${baseURL}/update', data);
85 94 }
86 95  
... ... @@ -92,7 +101,9 @@ export function delete${simpleClassName}(id: number) {
92 101 #if ( $table.templateType != 2 && $deleteBatchEnable)
93 102 /** 批量删除${table.classComment} */
94 103 export function delete${simpleClassName}List(ids: number[]) {
95   - return requestClient.delete(`${baseURL}/delete-list?ids=${ids.join(',')}`)
  104 + return requestClient.delete(
  105 + `${baseURL}/delete-list?ids=${ids.join(',')}`,
  106 + );
96 107 }
97 108 #end
98 109  
... ... @@ -118,31 +129,38 @@ export function export${simpleClassName}(params: any) {
118 129 #if ( $table.templateType == 11 )
119 130 /** 获得${subTable.classComment}分页 */
120 131 export function get${subSimpleClassName}Page(params: PageParam) {
121   - return requestClient.get<PageResult<${simpleClassName}Api.${subSimpleClassName}>>(`${baseURL}/${subSimpleClassName_strikeCase}/page`, { params });
  132 + return requestClient.get<PageResult<${apiName}.${subSimpleClassName}>>(
  133 + `${baseURL}/${subSimpleClassName_strikeCase}/page`,
  134 + { params },
  135 + );
122 136 }
123 137 ## 情况二:非 MASTER_ERP 时,需要列表查询子表
124 138 #else
125 139 #if ( $subTable.subJoinMany )
126 140 /** 获得${subTable.classComment}列表 */
127 141 export function get${subSimpleClassName}ListBy${SubJoinColumnName}(${subJoinColumn.javaField}: number) {
128   - return requestClient.get<${simpleClassName}Api.${subSimpleClassName}[]>(`${baseURL}/${subSimpleClassName_strikeCase}/list-by-${subJoinColumn_strikeCase}?${subJoinColumn.javaField}=${${subJoinColumn.javaField}}`);
  142 + return requestClient.get<${apiName}.${subSimpleClassName}[]>(
  143 + `${baseURL}/${subSimpleClassName_strikeCase}/list-by-${subJoinColumn_strikeCase}?${subJoinColumn.javaField}=${${subJoinColumn.javaField}}`,
  144 + );
129 145 }
130 146 #else
131 147 /** 获得${subTable.classComment} */
132 148 export function get${subSimpleClassName}By${SubJoinColumnName}(${subJoinColumn.javaField}: number) {
133   - return requestClient.get<${simpleClassName}Api.${subSimpleClassName}>(`${baseURL}/${subSimpleClassName_strikeCase}/get-by-${subJoinColumn_strikeCase}?${subJoinColumn.javaField}=${${subJoinColumn.javaField}}`);
  149 + return requestClient.get<${apiName}.${subSimpleClassName}>(
  150 + `${baseURL}/${subSimpleClassName_strikeCase}/get-by-${subJoinColumn_strikeCase}?${subJoinColumn.javaField}=${${subJoinColumn.javaField}}`,
  151 + );
134 152 }
135 153 #end
136 154 #end
137 155 ## 特殊:MASTER_ERP 时,支持单个的新增、修改、删除操作
138 156 #if ( $table.templateType == 11 )
139 157 /** 新增${subTable.classComment} */
140   -export function create${subSimpleClassName}(data: ${simpleClassName}Api.${subSimpleClassName}) {
  158 +export function create${subSimpleClassName}(data: ${apiName}.${subSimpleClassName}) {
141 159 return requestClient.post(`${baseURL}/${subSimpleClassName_strikeCase}/create`, data);
142 160 }
143 161  
144 162 /** 修改${subTable.classComment} */
145   -export function update${subSimpleClassName}(data: ${simpleClassName}Api.${subSimpleClassName}) {
  163 +export function update${subSimpleClassName}(data: ${apiName}.${subSimpleClassName}) {
146 164 return requestClient.put(`${baseURL}/${subSimpleClassName_strikeCase}/update`, data);
147 165 }
148 166  
... ... @@ -154,13 +172,17 @@ export function delete${subSimpleClassName}(id: number) {
154 172 #if ($deleteBatchEnable)
155 173 /** 批量删除${subTable.classComment} */
156 174 export function delete${subSimpleClassName}List(ids: number[]) {
157   - return requestClient.delete(`${baseURL}/${subSimpleClassName_strikeCase}/delete-list?ids=${ids.join(',')}`)
  175 + return requestClient.delete(
  176 + `${baseURL}/${subSimpleClassName_strikeCase}/delete-list?ids=${ids.join(',')}`,
  177 + );
158 178 }
159 179 #end
160 180  
161 181 /** 获得${subTable.classComment} */
162 182 export function get${subSimpleClassName}(id: number) {
163   - return requestClient.get<${simpleClassName}Api.${subSimpleClassName}>(`${baseURL}/${subSimpleClassName_strikeCase}/get?id=${id}`);
  183 + return requestClient.get<${apiName}.${subSimpleClassName}>(
  184 + `${baseURL}/${subSimpleClassName_strikeCase}/get?id=${id}`,
  185 + );
164 186 }
165 187 #end
166 188 #end
... ...
yudao-module-infra/src/main/resources/codegen/vue3_vben5_ele/schema/views/data.ts.vm
  1 +#set ($apiName = "${table.moduleName.substring(0,1).toUpperCase()}${table.moduleName.substring(1)}${simpleClassName}Api")
1 2 import type { VbenFormSchema } from '#/adapter/form';
2 3 import type { VxeTableGridOptions } from '#/adapter/vxe-table';
3   -import type { ${simpleClassName}Api } from '#/api/${table.moduleName}/${table.businessName}';
  4 +import type { ${apiName} } from '#/api/${table.moduleName}/${table.businessName}';
4 5  
5   -import { z } from '#/adapter/form';
6   -import {
7   - DICT_TYPE,
8   - getDictOptions,
9   - getRangePickerDefaultProps,
10   -} from '#/utils';
  6 +import { DICT_TYPE, getDictOptions, getRangePickerDefaultProps, } from '#/utils';
11 7 #if(${table.templateType} == 2)## 树表需要导入这些
12 8 import { get${simpleClassName}List } from '#/api/${table.moduleName}/${table.businessName}';
13 9 import { handleTree } from '@vben/utils';
... ... @@ -186,7 +182,7 @@ export function useGridFormSchema(): VbenFormSchema[] {
186 182 }
187 183  
188 184 /** 列表的字段 */
189   -export function useGridColumns(): VxeTableGridOptions<${simpleClassName}Api.${simpleClassName}>['columns'] {
  185 +export function useGridColumns(): VxeTableGridOptions<${apiName}.${simpleClassName}>['columns'] {
190 186 return [
191 187 #if ($table.templateType != 2 && $deleteBatchEnable)
192 188 { type: 'checkbox', width: 40 },
... ... @@ -389,7 +385,7 @@ export function use${subSimpleClassName}GridFormSchema(): VbenFormSchema[] {
389 385 }
390 386  
391 387 /** 列表的字段 */
392   -export function use${subSimpleClassName}GridColumns(): VxeTableGridOptions<${simpleClassName}Api.${subSimpleClassName}>['columns'] {
  388 +export function use${subSimpleClassName}GridColumns(): VxeTableGridOptions<${apiName}.${subSimpleClassName}>['columns'] {
393 389 return [
394 390 #if ($table.templateType != 2 && $deleteBatchEnable)
395 391 { type: 'checkbox', width: 40 },
... ... @@ -426,7 +422,7 @@ export function use${subSimpleClassName}GridColumns(): VxeTableGridOptions&lt;${sim
426 422 #else
427 423 #if ($subTable.subJoinMany) ## 一对多
428 424 /** 新增/修改列表的字段 */
429   - export function use${subSimpleClassName}GridEditColumns(): VxeTableGridOptions<${simpleClassName}Api.${subSimpleClassName}>['columns'] {
  425 + export function use${subSimpleClassName}GridEditColumns(): VxeTableGridOptions<${apiName}.${subSimpleClassName}>['columns'] {
430 426 return [
431 427 #foreach($column in $subColumns)
432 428 #if ($column.createOperation || $column.updateOperation)
... ... @@ -602,4 +598,4 @@ export function use${subSimpleClassName}GridColumns(): VxeTableGridOptions&lt;${sim
602 598 }
603 599 #end
604 600 #end
605 601 -#end
  602 +#end
606 603 \ No newline at end of file
... ...
yudao-module-infra/src/main/resources/codegen/vue3_vben5_ele/schema/views/form.vue.vm
  1 +#set ($apiName = "${table.moduleName.substring(0,1).toUpperCase()}${table.moduleName.substring(1)}${simpleClassName}Api")
1 2 <script lang="ts" setup>
2   -import type { ${simpleClassName}Api } from '#/api/${table.moduleName}/${table.businessName}';
  3 +import type { ${apiName} } from '#/api/${table.moduleName}/${table.businessName}';
  4 +
  5 +import { computed, ref } from 'vue';
3 6  
4 7 import { useVbenModal } from '@vben/common-ui';
5   -import { ElMessage, ElTabs, ElTabPane, ElCheckbox, ElInput, ElSelect, ElRadioGroup, ElCheckboxGroup, ElDatePicker } from 'element-plus';
  8 +
  9 +import { ElMessage#if ($table.templateType == 11), ElTabs, ElTabPane#end } from 'element-plus';
  10 +
  11 +import { useVbenForm } from '#/adapter/form';
  12 +import { create${simpleClassName}, get${simpleClassName}, update${simpleClassName} } from '#/api/${table.moduleName}/${table.businessName}';
  13 +import { $t } from '#/locales';
6 14 ## 特殊:主子表专属逻辑
7 15 #if ( $table.templateType == 10 || $table.templateType == 12 )
8 16 #foreach ($subSimpleClassName in $subSimpleClassNames)
... ... @@ -12,21 +20,15 @@ import { ElMessage, ElTabs, ElTabPane, ElCheckbox, ElInput, ElSelect, ElRadioGro
12 20 #end
13 21 #end
14 22  
15   -import { computed, ref } from 'vue';
16   -import { $t } from '#/locales';
17   -import { useVbenForm } from '#/adapter/form';
18   -import { get${simpleClassName}, create${simpleClassName}, update${simpleClassName} } from '#/api/${table.moduleName}/${table.businessName}';
19   -
20 23 import { useFormSchema } from '../data';
21 24  
22 25 const emit = defineEmits(['success']);
23   -const formData = ref<${simpleClassName}Api.${simpleClassName}>();
  26 +const formData = ref<${apiName}.${simpleClassName}>();
24 27 const getTitle = computed(() => {
25 28 return formData.value?.id
26 29 ? $t('ui.actionTitle.edit', ['${table.classComment}'])
27 30 : $t('ui.actionTitle.create', ['${table.classComment}']);
28 31 });
29   -
30 32 ## 特殊:主子表专属逻辑
31 33 #if ( $table.templateType == 10 || $table.templateType == 12 )
32 34 #if ( $subTables && $subTables.size() > 0 )
... ... @@ -51,7 +53,7 @@ const [Form, formApi] = useVbenForm({
51 53 },
52 54 layout: 'horizontal',
53 55 schema: useFormSchema(),
54   - showDefaultActions: false
  56 + showDefaultActions: false,
55 57 });
56 58  
57 59 const [Modal, modalApi] = useVbenModal({
... ... @@ -60,8 +62,8 @@ const [Modal, modalApi] = useVbenModal({
60 62 if (!valid) {
61 63 return;
62 64 }
63   - ## 特殊:主子表专属逻辑
64   - #if ( $table.templateType == 10 || $table.templateType == 12 )
  65 +## 特殊:主子表专属逻辑
  66 +#if ( $table.templateType == 10 || $table.templateType == 12 )
65 67 #if ( $subTables && $subTables.size() > 0 )
66 68 // 校验子表单
67 69 #foreach ($subTable in $subTables)
... ... @@ -78,12 +80,12 @@ const [Modal, modalApi] = useVbenModal({
78 80 #end
79 81 #end
80 82 #end
81   - #end
  83 +#end
82 84 modalApi.lock();
83 85 // 提交表单
84   - const data = (await formApi.getValues()) as ${simpleClassName}Api.${simpleClassName};
85   - ## 特殊:主子表专属逻辑
86   - #if ( $table.templateType == 10 || $table.templateType == 12 )
  86 + const data = (await formApi.getValues()) as ${apiName}.${simpleClassName};
  87 +## 特殊:主子表专属逻辑
  88 +#if ( $table.templateType == 10 || $table.templateType == 12 )
87 89 #if ( $subTables && $subTables.size() > 0 )
88 90 // 拼接子表的数据
89 91 #foreach ($subTable in $subTables)
... ... @@ -96,7 +98,7 @@ const [Modal, modalApi] = useVbenModal({
96 98 #end
97 99 #end
98 100 #end
99   - #end
  101 +#end
100 102 try {
101 103 await (formData.value?.id ? update${simpleClassName}(data) : create${simpleClassName}(data));
102 104 // 关闭并提示
... ... @@ -113,21 +115,20 @@ const [Modal, modalApi] = useVbenModal({
113 115 return;
114 116 }
115 117 // 加载数据
116   - let data = modalApi.getData<${simpleClassName}Api.${simpleClassName}>();
117   - if (!data) {
  118 + const data = modalApi.getData<${apiName}.${simpleClassName}>();
  119 + if (!data || !data.id) {
118 120 return;
119 121 }
120   - if (data.id) {
121   - modalApi.lock();
122   - try {
123   - data = await get${simpleClassName}(data.id);
124   - } finally {
125   - modalApi.unlock();
  122 + modalApi.lock();
  123 + try {
  124 + formData.value = await get${simpleClassName}(data.id);
  125 + // 设置到 values
  126 + if (formData.value) {
  127 + await formApi.setValues(formData.value);
126 128 }
  129 + } finally {
  130 + modalApi.unlock();
127 131 }
128   - // 设置到 values
129   - formData.value = data;
130   - await formApi.setValues(formData.value);
131 132 },
132 133 });
133 134 </script>
... ... @@ -135,20 +136,20 @@ const [Modal, modalApi] = useVbenModal({
135 136 <template>
136 137 <Modal :title="getTitle">
137 138 <Form class="mx-4" />
138   - ## 特殊:主子表专属逻辑
139   - #if ( $table.templateType == 10 || $table.templateType == 12 )
  139 +## 特殊:主子表专属逻辑
  140 +#if ( $table.templateType == 10 || $table.templateType == 12 )
140 141 <!-- 子表的表单 -->
141   - <el-tabs v-model="subTabsName">
  142 + <ElTabs v-model="subTabsName">
142 143 #foreach ($subTable in $subTables)
143 144 #set ($index = $foreach.count - 1)
144 145 #set ($subClassNameVar = $subClassNameVars.get($index))
145 146 #set ($subSimpleClassName = $subSimpleClassNames.get($index))
146 147 #set ($subJoinColumn_strikeCase = $subJoinColumn_strikeCases.get($index))
147   - <el-tab-pane name="$subClassNameVar" label="${subTable.classComment}">
  148 + <ElTabPane name="$subClassNameVar" label="${subTable.classComment}">
148 149 <${subSimpleClassName}Form ref="${subClassNameVar}FormRef" :${subJoinColumn_strikeCase}="formData?.id" />
149   - </el-tab-pane>
  150 + </ElTabPane>
150 151 #end
151   - </el-tabs>
152   - #end
  152 + </ElTabs>
  153 +#end
153 154 </Modal>
154 155 </template>
... ...
yudao-module-infra/src/main/resources/codegen/vue3_vben5_ele/schema/views/index.vue.vm
  1 +#set ($apiName = "${table.moduleName.substring(0,1).toUpperCase()}${table.moduleName.substring(1)}${simpleClassName}Api")
1 2 <script lang="ts" setup>
2 3 import type { VxeTableGridOptions } from '#/adapter/vxe-table';
3   -import type { ${simpleClassName}Api } from '#/api/${table.moduleName}/${table.businessName}';
  4 +import type { ${apiName} } from '#/api/${table.moduleName}/${table.businessName}';
4 5  
5   -import { Page, useVbenModal } from '@vben/common-ui';
6   -import { ElMessage, ElTabs, ElTabPane, ElLoading } from 'element-plus';
7   -import Form from './modules/form.vue';
  6 +import { ref#if ($table.templateType == 2), computed#end } from 'vue';
8 7  
9   -## 特殊:主子表专属逻辑
10   -#if ( $table.templateType == 11 || $table.templateType == 12 )
11   - #foreach ($subSimpleClassName in $subSimpleClassNames)
12   - #set ($index = $foreach.count - 1)
13   - #set ($subSimpleClassName_strikeCase = $subSimpleClassName_strikeCases.get($index))
14   -import ${subSimpleClassName}List from './modules/${subSimpleClassName_strikeCase}-list.vue'
15   - #end
16   -#end
  8 +import {#if ($table.templateType != 2 && $deleteBatchEnable) confirm,#end Page, useVbenModal } from '@vben/common-ui';
  9 +import { downloadFileFromBlobPart, isEmpty } from '@vben/utils';
  10 +
  11 +import { ElLoading, ElMessage#if ($table.templateType == 11), ElTabs, ElTabPane#end } from 'element-plus';
17 12  
18   -import { ref, computed } from 'vue';
19   -import { $t } from '#/locales';
20 13 import { ACTION_ICON, TableAction, useVbenVxeGrid } from '#/adapter/vxe-table';
21 14 #if (${table.templateType} == 2)## 树表接口
22   -import { get${simpleClassName}List, delete${simpleClassName}, export${simpleClassName} } from '#/api/${table.moduleName}/${table.businessName}';
  15 +import {
  16 + delete${simpleClassName},
  17 + export${simpleClassName},
  18 + get${simpleClassName}List,
  19 +} from '#/api/${table.moduleName}/${table.businessName}';
23 20 #else## 标准表接口
24   -import { get${simpleClassName}Page, delete${simpleClassName},#if ($deleteBatchEnable) delete${simpleClassName}List,#end export${simpleClassName} } from '#/api/${table.moduleName}/${table.businessName}';
  21 +import {
  22 + delete${simpleClassName},#if ($deleteBatchEnable)
  23 +
  24 + delete${simpleClassName}List,#end
  25 + export${simpleClassName},
  26 + get${simpleClassName}Page,
  27 +} from '#/api/${table.moduleName}/${table.businessName}';
25 28 #end
26   -import { downloadFileFromBlobPart, isEmpty } from '@vben/utils';
  29 +import { $t } from '#/locales';
27 30  
28 31 import { useGridColumns, useGridFormSchema } from './data';
  32 +import Form from './modules/form.vue';
  33 +## 特殊:主子表专属逻辑
  34 +#if ( $table.templateType == 11 || $table.templateType == 12 )
  35 + #foreach ($subSimpleClassName in $subSimpleClassNames)
  36 + #set ($index = $foreach.count - 1)
  37 + #set ($subSimpleClassName_strikeCase = $subSimpleClassName_strikeCases.get($index))
  38 +import ${subSimpleClassName}List from './modules/${subSimpleClassName_strikeCase}-list.vue';
  39 + #end
  40 +#end
29 41  
30 42 #if ($table.templateType == 12 || $table.templateType == 11) ## 内嵌和erp情况
31 43 /** 子表的列表 */
32 44 const subTabsName = ref('$subClassNameVars.get(0)')
33 45 #if ($table.templateType == 11)
34   -const select${simpleClassName} = ref<${simpleClassName}Api.${simpleClassName}>();
  46 +const select${simpleClassName} = ref<${apiName}.${simpleClassName}>();
35 47 #end
36 48 #end
37   -
38 49 const [FormModal, formModalApi] = useVbenModal({
39 50 connectedComponent: Form,
40 51 destroyOnClose: true,
41 52 });
42   -
43 53 #if (${table.templateType} == 2)## 树表特有:控制表格展开收缩
  54 +
44 55 /** 切换树形展开/收缩状态 */
45 56 const isExpanded = ref(true);
46 57 function toggleExpand() {
... ... @@ -60,26 +71,25 @@ function onRefresh() {
60 71  
61 72 /** 创建${table.classComment} */
62 73 function handleCreate() {
63   - formModalApi.setData({}).open();
  74 + formModalApi.setData(null).open();
64 75 }
65 76  
66 77 /** 编辑${table.classComment} */
67   -function handleEdit(row: ${simpleClassName}Api.${simpleClassName}) {
  78 +function handleEdit(row: ${apiName}.${simpleClassName}) {
68 79 formModalApi.setData(row).open();
69 80 }
70   -
71 81 #if (${table.templateType} == 2)## 树表特有:新增下级
  82 +
72 83 /** 新增下级${table.classComment} */
73   -function handleAppend(row: ${simpleClassName}Api.${simpleClassName}) {
  84 +function handleAppend(row: ${apiName}.${simpleClassName}) {
74 85 formModalApi.setData({ ${treeParentColumn.javaField}: row.id }).open();
75 86 }
76 87 #end
77 88  
78 89 /** 删除${table.classComment} */
79   -async function handleDelete(row: ${simpleClassName}Api.${simpleClassName}) {
  90 +async function handleDelete(row: ${apiName}.${simpleClassName}) {
80 91 const loadingInstance = ElLoading.service({
81 92 text: $t('ui.actionMessage.deleting', [row.id]),
82   - background: 'rgba(0, 0, 0, 0.7)',
83 93 });
84 94 try {
85 95 await delete${simpleClassName}(row.id as number);
... ... @@ -93,9 +103,9 @@ async function handleDelete(row: ${simpleClassName}Api.${simpleClassName}) {
93 103 #if ($table.templateType != 2 && $deleteBatchEnable)
94 104 /** 批量删除${table.classComment} */
95 105 async function handleDeleteBatch() {
  106 + await confirm($t('ui.actionMessage.deleteBatchConfirm'));
96 107 const loadingInstance = ElLoading.service({
97   - text: $t('ui.actionMessage.deleting'),
98   - background: 'rgba(0, 0, 0, 0.7)',
  108 + text: $t('ui.actionMessage.deletingBatch'),
99 109 });
100 110 try {
101 111 await delete${simpleClassName}List(checkedIds.value);
... ... @@ -107,13 +117,13 @@ async function handleDeleteBatch() {
107 117 }
108 118 }
109 119  
110   -const checkedIds = ref<number[]>([])
  120 +const checkedIds = ref<number[]>([]);
111 121 function handleRowCheckboxChange({
112 122 records,
113 123 }: {
114   - records: ${simpleClassName}Api.${simpleClassName}[];
  124 + records: ${apiName}.${simpleClassName}[];
115 125 }) {
116   - checkedIds.value = records.map((item) => item.id);
  126 + checkedIds.value = records.map((item) => item.id!);
117 127 }
118 128 #end
119 129  
... ... @@ -146,9 +156,7 @@ const [Grid, gridApi] = useVbenVxeGrid({
146 156 enabled: false,
147 157 },
148 158 #else## 标准表设置
149   - pagerConfig: {
150   - enabled: true,
151   - },
  159 + keepSource: true,
152 160 #end
153 161 proxyConfig: {
154 162 ajax: {
... ... @@ -178,19 +186,19 @@ const [Grid, gridApi] = useVbenVxeGrid({
178 186 refresh: true,
179 187 search: true,
180 188 },
181   - } as VxeTableGridOptions<${simpleClassName}Api.${simpleClassName}>,
  189 + } as VxeTableGridOptions<${apiName}.${simpleClassName}>,
182 190 #if (${table.templateType} == 11 || $deleteBatchEnable)
183   - gridEvents:{
184   - #if(${table.templateType} == 11)
185   - cellClick: ({ row }: { row: ${simpleClassName}Api.${simpleClassName}}) => {
  191 + gridEvents: {
  192 + #if(${table.templateType} == 11)
  193 + cellClick: ({ row }: { row: ${apiName}.${simpleClassName}}) => {
186 194 select${simpleClassName}.value = row;
187 195 },
188   - #end
189   - #if(${table.templateType} != 2 && $deleteBatchEnable)
190   - checkboxAll: handleRowCheckboxChange,
191   - checkboxChange: handleRowCheckboxChange,
192   - #end
193   - }
  196 + #end
  197 + #if(${table.templateType} != 2 && $deleteBatchEnable)
  198 + checkboxAll: handleRowCheckboxChange,
  199 + checkboxChange: handleRowCheckboxChange,
  200 + #end
  201 + },
194 202 #end
195 203 });
196 204 </script>
... ... @@ -198,7 +206,6 @@ const [Grid, gridApi] = useVbenVxeGrid({
198 206 <template>
199 207 <Page auto-content-height>
200 208 <FormModal @success="onRefresh" />
201   -
202 209 #if ($table.templateType == 11) ## erp情况
203 210 <div>
204 211 #end
... ... @@ -248,8 +255,8 @@ const [Grid, gridApi] = useVbenVxeGrid({
248 255 label: $t('ui.actionTitle.deleteBatch'),
249 256 type: 'danger',
250 257 icon: ACTION_ICON.DELETE,
251   - disabled: isEmpty(checkedIds),
252 258 auth: ['${table.moduleName}:${simpleClassName_strikeCase}:delete'],
  259 + disabled: isEmpty(checkedIds),
253 260 onClick: handleDeleteBatch,
254 261 },
255 262 #end
... ... @@ -262,7 +269,8 @@ const [Grid, gridApi] = useVbenVxeGrid({
262 269 #if (${table.templateType} == 2)## 树表特有:新增下级
263 270 {
264 271 label: '新增下级',
265   - type: 'text',
  272 + type: 'primary',
  273 + link: true,
266 274 icon: ACTION_ICON.ADD,
267 275 auth: ['${table.moduleName}:${simpleClassName_strikeCase}:create'],
268 276 onClick: handleAppend.bind(null, row),
... ... @@ -270,7 +278,8 @@ const [Grid, gridApi] = useVbenVxeGrid({
270 278 #end
271 279 {
272 280 label: $t('common.edit'),
273   - type: 'text',
  281 + type: 'primary',
  282 + link: true,
274 283 icon: ACTION_ICON.EDIT,
275 284 auth: ['${table.moduleName}:${simpleClassName_strikeCase}:update'],
276 285 onClick: handleEdit.bind(null, row),
... ... @@ -278,7 +287,7 @@ const [Grid, gridApi] = useVbenVxeGrid({
278 287 {
279 288 label: $t('common.delete'),
280 289 type: 'danger',
281   - text: true,
  290 + link: true,
282 291 icon: ACTION_ICON.DELETE,
283 292 auth: ['${table.moduleName}:${simpleClassName_strikeCase}:delete'],
284 293 popConfirm: {
... ... @@ -290,21 +299,20 @@ const [Grid, gridApi] = useVbenVxeGrid({
290 299 />
291 300 </template>
292 301 </Grid>
293   -
294 302 #if ($table.templateType == 11) ## erp情况
295 303 <!-- 子表的表单 -->
296   - <el-tabs v-model="subTabsName" class="mt-2">
  304 + <ElTabs v-model="subTabsName" class="mt-2">
297 305 #foreach ($subTable in $subTables)
298 306 #set ($index = $foreach.count - 1)
299 307 #set ($subClassNameVar = $subClassNameVars.get($index))
300 308 #set ($subSimpleClassName = $subSimpleClassNames.get($index))
301 309 #set ($subJoinColumn_strikeCase = $subJoinColumn_strikeCases.get($index))
302   - <el-tab-pane name="$subClassNameVar" label="${subTable.classComment}">
  310 + <ElTabPane name="$subClassNameVar" label="${subTable.classComment}">
303 311 <${subSimpleClassName}List :${subJoinColumn_strikeCase}="select${simpleClassName}?.id" />
304   - </el-tab-pane>
  312 + </ElTabPane>
305 313 #end
306   - </el-tabs>
  314 + </ElTabs>
307 315 </div>
308 316 #end
309 317 </Page>
310 318 -</template>
  319 +</template>
311 320 \ No newline at end of file
... ...
yudao-module-infra/src/main/resources/codegen/vue3_vben5_ele/schema/views/modules/form_sub_erp.vue.vm
... ... @@ -2,8 +2,9 @@
2 2 #set ($subColumns = $subColumnsList.get($subIndex))##当前字段数组
3 3 #set ($subJoinColumn = $subJoinColumns.get($subIndex))##当前 join 字段
4 4 #set ($subSimpleClassName = $subSimpleClassNames.get($subIndex))
  5 +#set ($apiName = "${table.moduleName.substring(0,1).toUpperCase()}${table.moduleName.substring(1)}${simpleClassName}Api")
5 6 <script lang="ts" setup>
6   - import type { ${simpleClassName}Api } from '#/api/${table.moduleName}/${table.businessName}';
  7 + import type { ${apiName} } from '#/api/${table.moduleName}/${table.businessName}';
7 8  
8 9 import { useVbenModal } from '@vben/common-ui';
9 10 import { ElMessage } from 'element-plus';
... ... @@ -16,7 +17,7 @@
16 17 import { use${subSimpleClassName}FormSchema } from '../data';
17 18  
18 19 const emit = defineEmits(['success']);
19   - const formData = ref<${simpleClassName}Api.${subSimpleClassName}>();
  20 + const formData = ref<${apiName}.${subSimpleClassName}>();
20 21 const getTitle = computed(() => {
21 22 return formData.value?.id
22 23 ? $t('ui.actionTitle.edit', ['${subTable.classComment}'])
... ... @@ -45,7 +46,7 @@
45 46  
46 47 modalApi.lock();
47 48 // 提交表单
48   - const data = (await formApi.getValues()) as ${simpleClassName}Api.${subSimpleClassName};
  49 + const data = (await formApi.getValues()) as ${apiName}.${subSimpleClassName};
49 50 data.${subJoinColumn.javaField} = formData.value?.${subJoinColumn.javaField};
50 51 try {
51 52 await (formData.value?.id ? update${subSimpleClassName}(data) : create${subSimpleClassName}(data));
... ... @@ -64,7 +65,7 @@
64 65 }
65 66  
66 67 // 加载数据
67   - let data = modalApi.getData<${simpleClassName}Api.${subSimpleClassName}>();
  68 + let data = modalApi.getData<${apiName}.${subSimpleClassName}>();
68 69 if (!data) {
69 70 return;
70 71 }
... ...
yudao-module-infra/src/main/resources/codegen/vue3_vben5_ele/schema/views/modules/form_sub_normal.vue.vm
... ... @@ -4,8 +4,9 @@
4 4 #set ($subSimpleClassName = $subSimpleClassNames.get($subIndex))
5 5 #set ($subClassNameVar = $subClassNameVars.get($subIndex))
6 6 #set ($SubJoinColumnName = $subJoinColumn.javaField.substring(0,1).toUpperCase() + ${subJoinColumn.javaField.substring(1)})##首字母大写
  7 +#set ($apiName = "${table.moduleName.substring(0,1).toUpperCase()}${table.moduleName.substring(1)}${simpleClassName}Api")
7 8 <script lang="ts" setup>
8   - import type { ${simpleClassName}Api } from '#/api/${table.moduleName}/${table.businessName}';
  9 + import type { ${apiName} } from '#/api/${table.moduleName}/${table.businessName}';
9 10  
10 11 import { computed, ref, h, onMounted,watch,nextTick } from 'vue';
11 12 import { $t } from '#/locales';
... ... @@ -33,7 +34,7 @@ const props = defineProps&lt;{
33 34 function onActionClick({
34 35 code,
35 36 row,
36   -}: OnActionClickParams<${simpleClassName}Api.${subSimpleClassName}>) {
  37 +}: OnActionClickParams<${apiName}.${subSimpleClassName}>) {
37 38 switch (code) {
38 39 case 'delete': {
39 40 onDelete(row);
... ... @@ -67,16 +68,16 @@ const onAdd = async () =&gt; {
67 68 }
68 69  
69 70 /** 删除${subTable.classComment} */
70   -const onDelete = async (row: ${simpleClassName}Api.${subSimpleClassName}) => {
  71 +const onDelete = async (row: ${apiName}.${subSimpleClassName}) => {
71 72 await gridApi.grid.remove(row);
72 73 }
73 74  
74 75 /** 提供获取表格数据的方法供父组件调用 */
75 76 defineExpose({
76   - getData: (): ${simpleClassName}Api.${subSimpleClassName}[] => {
77   - const data = gridApi.grid.getData() as ${simpleClassName}Api.${subSimpleClassName}[];
78   - const removeRecords = gridApi.grid.getRemoveRecords() as ${simpleClassName}Api.${subSimpleClassName}[];
79   - const insertRecords = gridApi.grid.getInsertRecords() as ${simpleClassName}Api.${subSimpleClassName}[];
  77 + getData: (): ${apiName}.${subSimpleClassName}[] => {
  78 + const data = gridApi.grid.getData() as ${apiName}.${subSimpleClassName}[];
  79 + const removeRecords = gridApi.grid.getRemoveRecords() as ${apiName}.${subSimpleClassName}[];
  80 + const insertRecords = gridApi.grid.getInsertRecords() as ${apiName}.${subSimpleClassName}[];
80 81 return data
81 82 .filter((row) => !removeRecords.some((removed) => removed.id === row.id))
82 83 .concat(insertRecords.map((row: any) => ({ ...row, id: undefined })));
... ...
yudao-module-infra/src/main/resources/codegen/vue3_vben5_ele/schema/views/modules/list_sub_erp.vue.vm
... ... @@ -5,9 +5,10 @@
5 5 #set ($subJoinColumn = $subJoinColumns.get($subIndex))##当前 join 字段
6 6 #set ($subSimpleClassName_strikeCase = $subSimpleClassName_strikeCases.get($subIndex))
7 7 #set ($SubJoinColumnName = $subJoinColumn.javaField.substring(0,1).toUpperCase() + ${subJoinColumn.javaField.substring(1)})##首字母大写
  8 +#set ($apiName = "${table.moduleName.substring(0,1).toUpperCase()}${table.moduleName.substring(1)}${simpleClassName}Api")
8 9 <script lang="ts" setup>
9 10 import type { VxeTableGridOptions } from '#/adapter/vxe-table';
10   -import type { ${simpleClassName}Api } from '#/api/${table.moduleName}/${table.businessName}';
  11 +import type { ${apiName} } from '#/api/${table.moduleName}/${table.businessName}';
11 12  
12 13 #if ($table.templateType == 11) ## erp
13 14 import ${subSimpleClassName}Form from './${subSimpleClassName_strikeCase}-form.vue'
... ... @@ -51,15 +52,14 @@ function handleCreate() {
51 52 }
52 53  
53 54 /** 编辑${subTable.classComment} */
54   -function handleEdit(row: ${simpleClassName}Api.${subSimpleClassName}) {
  55 +function handleEdit(row: ${apiName}.${subSimpleClassName}) {
55 56 formModalApi.setData(row).open();
56 57 }
57 58  
58 59 /** 删除${subTable.classComment} */
59   -async function handleDelete(row: ${simpleClassName}Api.${subSimpleClassName}) {
  60 +async function handleDelete(row: ${apiName}.${subSimpleClassName}) {
60 61 const loadingInstance = ElLoading.service({
61 62 text: $t('ui.actionMessage.deleting', [row.id]),
62   - background: 'rgba(0, 0, 0, 0.7)',
63 63 });
64 64 try {
65 65 await delete${subSimpleClassName}(row.id as number);
... ... @@ -75,7 +75,6 @@ async function handleDelete(row: ${simpleClassName}Api.${subSimpleClassName}) {
75 75 async function handleDeleteBatch() {
76 76 const loadingInstance = ElLoading.service({
77 77 text: $t('ui.actionMessage.deleting'),
78   - background: 'rgba(0, 0, 0, 0.7)',
79 78 });
80 79 try {
81 80 await delete${subSimpleClassName}List(checkedIds.value);
... ... @@ -91,7 +90,7 @@ const checkedIds = ref&lt;number[]&gt;([])
91 90 function handleRowCheckboxChange({
92 91 records,
93 92 }: {
94   - records: ${simpleClassName}Api.${subSimpleClassName}[];
  93 + records: ${apiName}.${subSimpleClassName}[];
95 94 }) {
96 95 checkedIds.value = records.map((item) => item.id);
97 96 }
... ... @@ -143,7 +142,7 @@ const [Grid, gridApi] = useVbenVxeGrid({
143 142 keyField: 'id',
144 143 isHover: true,
145 144 },
146   - } as VxeTableGridOptions<${simpleClassName}Api.${subSimpleClassName}>,
  145 + } as VxeTableGridOptions<${apiName}.${subSimpleClassName}>,
147 146 #if (${table.templateType} == 11 && $deleteBatchEnable)
148 147 gridEvents:{
149 148 checkboxAll: handleRowCheckboxChange,
... ...