Commit ff39a2b57b94530f8435366c1f19c33c804918b2

Authored by puhui999
1 parent ef2d0b35

【功能完善】INFRA:代码生成 vben5 antd 单表表单模版

yudao-module-infra/yudao-module-infra-biz/src/main/java/cn/iocoder/yudao/module/infra/service/codegen/inner/CodegenEngine.java
@@ -164,23 +164,23 @@ public class CodegenEngine { @@ -164,23 +164,23 @@ public class CodegenEngine {
164 .put(CodegenFrontTypeEnum.VUE3_VBEN5_ANTD_SCHEMA.getType(), vue3Vben5AntdSchemaTemplatePath("views/modules/list_sub_erp.vue"), // 特殊:主子表专属逻辑 164 .put(CodegenFrontTypeEnum.VUE3_VBEN5_ANTD_SCHEMA.getType(), vue3Vben5AntdSchemaTemplatePath("views/modules/list_sub_erp.vue"), // 特殊:主子表专属逻辑
165 vue3FilePath("views/${table.moduleName}/${table.businessName}/modules/${subSimpleClassName_strikeCase}-list.vue")) 165 vue3FilePath("views/${table.moduleName}/${table.businessName}/modules/${subSimpleClassName_strikeCase}-list.vue"))
166 // VUE3_VBEN5_ANTD 166 // VUE3_VBEN5_ANTD
167 - .put(CodegenFrontTypeEnum.VUE3_VBEN5_ANTD.getType(), vue3Vben5AntdSchemaTemplatePath("views/data.ts"), 167 + .put(CodegenFrontTypeEnum.VUE3_VBEN5_ANTD.getType(), vue3Vben5AntdGeneralTemplatePath("views/data.ts"),
168 vue3FilePath("views/${table.moduleName}/${table.businessName}/data.ts")) 168 vue3FilePath("views/${table.moduleName}/${table.businessName}/data.ts"))
169 - .put(CodegenFrontTypeEnum.VUE3_VBEN5_ANTD.getType(), vue3Vben5AntdSchemaTemplatePath("views/index.vue"), 169 + .put(CodegenFrontTypeEnum.VUE3_VBEN5_ANTD.getType(), vue3Vben5AntdGeneralTemplatePath("views/index.vue"),
170 vue3FilePath("views/${table.moduleName}/${table.businessName}/index.vue")) 170 vue3FilePath("views/${table.moduleName}/${table.businessName}/index.vue"))
171 - .put(CodegenFrontTypeEnum.VUE3_VBEN5_ANTD.getType(), vue3Vben5AntdSchemaTemplatePath("views/form.vue"), 171 + .put(CodegenFrontTypeEnum.VUE3_VBEN5_ANTD.getType(), vue3Vben5AntdGeneralTemplatePath("views/form.vue"),
172 vue3FilePath("views/${table.moduleName}/${table.businessName}/modules/form.vue")) 172 vue3FilePath("views/${table.moduleName}/${table.businessName}/modules/form.vue"))
173 - .put(CodegenFrontTypeEnum.VUE3_VBEN5_ANTD.getType(), vue3Vben5AntdSchemaTemplatePath("api/api.ts"), 173 + .put(CodegenFrontTypeEnum.VUE3_VBEN5_ANTD.getType(), vue3Vben5AntdGeneralTemplatePath("api/api.ts"),
174 vue3FilePath("api/${table.moduleName}/${table.businessName}/index.ts")) 174 vue3FilePath("api/${table.moduleName}/${table.businessName}/index.ts"))
175 - .put(CodegenFrontTypeEnum.VUE3_VBEN5_ANTD.getType(), vue3Vben5AntdSchemaTemplatePath("views/modules/form_sub_normal.vue"), // 特殊:主子表专属逻辑 175 + .put(CodegenFrontTypeEnum.VUE3_VBEN5_ANTD.getType(), vue3Vben5AntdGeneralTemplatePath("views/modules/form_sub_normal.vue"), // 特殊:主子表专属逻辑
176 vue3FilePath("views/${table.moduleName}/${table.businessName}/modules/${subSimpleClassName_strikeCase}-form.vue")) 176 vue3FilePath("views/${table.moduleName}/${table.businessName}/modules/${subSimpleClassName_strikeCase}-form.vue"))
177 - .put(CodegenFrontTypeEnum.VUE3_VBEN5_ANTD.getType(), vue3Vben5AntdSchemaTemplatePath("views/modules/form_sub_inner.vue"), // 特殊:主子表专属逻辑 177 + .put(CodegenFrontTypeEnum.VUE3_VBEN5_ANTD.getType(), vue3Vben5AntdGeneralTemplatePath("views/modules/form_sub_inner.vue"), // 特殊:主子表专属逻辑
178 vue3FilePath("views/${table.moduleName}/${table.businessName}/modules/${subSimpleClassName_strikeCase}-form.vue")) 178 vue3FilePath("views/${table.moduleName}/${table.businessName}/modules/${subSimpleClassName_strikeCase}-form.vue"))
179 - .put(CodegenFrontTypeEnum.VUE3_VBEN5_ANTD.getType(), vue3Vben5AntdSchemaTemplatePath("views/modules/form_sub_erp.vue"), // 特殊:主子表专属逻辑 179 + .put(CodegenFrontTypeEnum.VUE3_VBEN5_ANTD.getType(), vue3Vben5AntdGeneralTemplatePath("views/modules/form_sub_erp.vue"), // 特殊:主子表专属逻辑
180 vue3FilePath("views/${table.moduleName}/${table.businessName}/modules/${subSimpleClassName_strikeCase}-form.vue")) 180 vue3FilePath("views/${table.moduleName}/${table.businessName}/modules/${subSimpleClassName_strikeCase}-form.vue"))
181 - .put(CodegenFrontTypeEnum.VUE3_VBEN5_ANTD.getType(), vue3Vben5AntdSchemaTemplatePath("views/modules/list_sub_inner.vue"), // 特殊:主子表专属逻辑 181 + .put(CodegenFrontTypeEnum.VUE3_VBEN5_ANTD.getType(), vue3Vben5AntdGeneralTemplatePath("views/modules/list_sub_inner.vue"), // 特殊:主子表专属逻辑
182 vue3FilePath("views/${table.moduleName}/${table.businessName}/modules/${subSimpleClassName_strikeCase}-list.vue")) 182 vue3FilePath("views/${table.moduleName}/${table.businessName}/modules/${subSimpleClassName_strikeCase}-list.vue"))
183 - .put(CodegenFrontTypeEnum.VUE3_VBEN5_ANTD.getType(), vue3Vben5AntdSchemaTemplatePath("views/modules/list_sub_erp.vue"), // 特殊:主子表专属逻辑 183 + .put(CodegenFrontTypeEnum.VUE3_VBEN5_ANTD.getType(), vue3Vben5AntdGeneralTemplatePath("views/modules/list_sub_erp.vue"), // 特殊:主子表专属逻辑
184 vue3FilePath("views/${table.moduleName}/${table.businessName}/modules/${subSimpleClassName_strikeCase}-list.vue")) 184 vue3FilePath("views/${table.moduleName}/${table.businessName}/modules/${subSimpleClassName_strikeCase}-list.vue"))
185 .build(); 185 .build();
186 186
yudao-module-infra/yudao-module-infra-biz/src/main/resources/codegen/vue3_vben5_antd/general/views/form.vue.vm
1 <script lang="ts" setup> 1 <script lang="ts" setup>
2 import type { ${simpleClassName}Api } from '#/api/${table.moduleName}/${simpleClassName_strikeCase}'; 2 import type { ${simpleClassName}Api } from '#/api/${table.moduleName}/${simpleClassName_strikeCase}';
  3 +import type { Rule } from 'ant-design-vue/es/form';
3 4
4 import { useVbenModal } from '@vben/common-ui'; 5 import { useVbenModal } from '@vben/common-ui';
5 -import { message, Tabs, Checkbox, Input, Textarea, Select,RadioGroup,CheckboxGroup, DatePicker } from 'ant-design-vue'; 6 +import { Tinymce as RichTextarea } from '#/components/tinymce';
  7 +import { ImageUpload, FileUpload } from "#/components/upload";
  8 +import { message, Tabs, Form, Input, Textarea, Select, RadioGroup, Radio, CheckboxGroup, Checkbox, DatePicker } from 'ant-design-vue';
  9 +import { DICT_TYPE, getDictOptions } from '#/utils/dict';
  10 +
6 ## 特殊:主子表专属逻辑 11 ## 特殊:主子表专属逻辑
7 #if ( $table.templateType == 10 || $table.templateType == 12 ) 12 #if ( $table.templateType == 10 || $table.templateType == 12 )
8 #foreach ($subSimpleClassName in $subSimpleClassNames) 13 #foreach ($subSimpleClassName in $subSimpleClassNames)
@@ -14,12 +19,12 @@ import { message, Tabs, Checkbox, Input, Textarea, Select,RadioGroup,CheckboxGro @@ -14,12 +19,12 @@ import { message, Tabs, Checkbox, Input, Textarea, Select,RadioGroup,CheckboxGro
14 19
15 import { computed, ref } from 'vue'; 20 import { computed, ref } from 'vue';
16 import { $t } from '#/locales'; 21 import { $t } from '#/locales';
17 -import { useVbenForm } from '#/adapter/form';  
18 import { get${simpleClassName}, create${simpleClassName}, update${simpleClassName} } from '#/api/${table.moduleName}/${simpleClassName_strikeCase}'; 22 import { get${simpleClassName}, create${simpleClassName}, update${simpleClassName} } from '#/api/${table.moduleName}/${simpleClassName_strikeCase}';
19 23
20 -import { useFormSchema } from '../data';  
21 -  
22 const emit = defineEmits(['success']); 24 const emit = defineEmits(['success']);
  25 +const formRef = ref();
  26 +const labelCol = { span: 5 };
  27 +const wrapperCol = { span: 13 };
23 const formData = ref<Partial<${simpleClassName}Api.${simpleClassName}>>({ 28 const formData = ref<Partial<${simpleClassName}Api.${simpleClassName}>>({
24 #foreach ($column in $columns) 29 #foreach ($column in $columns)
25 #if ($column.createOperation || $column.updateOperation) 30 #if ($column.createOperation || $column.updateOperation)
@@ -31,6 +36,14 @@ const formData = ref&lt;Partial&lt;${simpleClassName}Api.${simpleClassName}&gt;&gt;({ @@ -31,6 +36,14 @@ const formData = ref&lt;Partial&lt;${simpleClassName}Api.${simpleClassName}&gt;&gt;({
31 #end 36 #end
32 #end 37 #end
33 }); 38 });
  39 +const rules: Record<string, Rule[]> = {
  40 + #foreach ($column in $columns)
  41 + #if (($column.createOperation || $column.updateOperation) && !$column.nullable && !${column.primaryKey})## 创建或者更新操作 && 要求非空 && 非主键
  42 + #set($comment=$column.columnComment)
  43 + $column.javaField: [{ required: true, message: '${comment}不能为空', trigger: #if($column.htmlType == 'select')'change'#else'blur'#end }],
  44 + #end
  45 + #end
  46 +};
34 #if (${table.templateType} == 2)## 树表特有:父ID处理 47 #if (${table.templateType} == 2)## 树表特有:父ID处理
35 const parentId = ref<number>(); // 新增下级时的父级 ID 48 const parentId = ref<number>(); // 新增下级时的父级 ID
36 49
@@ -66,10 +79,7 @@ const getTitle = computed(() =&gt; { @@ -66,10 +79,7 @@ const getTitle = computed(() =&gt; {
66 79
67 const [Modal, modalApi] = useVbenModal({ 80 const [Modal, modalApi] = useVbenModal({
68 async onConfirm() { 81 async onConfirm() {
69 - const { valid } = await formApi.validate();  
70 - if (!valid) {  
71 - return;  
72 - } 82 + await formRef.value?.validate();
73 ## 特殊:主子表专属逻辑 83 ## 特殊:主子表专属逻辑
74 #if ( $table.templateType == 10 || $table.templateType == 12 ) 84 #if ( $table.templateType == 10 || $table.templateType == 12 )
75 #if ( $subTables && $subTables.size() > 0 ) 85 #if ( $subTables && $subTables.size() > 0 )
@@ -133,6 +143,7 @@ const [Modal, modalApi] = useVbenModal({ @@ -133,6 +143,7 @@ const [Modal, modalApi] = useVbenModal({
133 #end 143 #end
134 #end 144 #end
135 }; 145 };
  146 + formRef.value?.resetFields();
136 return; 147 return;
137 } 148 }
138 149
@@ -151,7 +162,6 @@ const [Modal, modalApi] = useVbenModal({ @@ -151,7 +162,6 @@ const [Modal, modalApi] = useVbenModal({
151 } 162 }
152 // 设置到 values 163 // 设置到 values
153 formData.value = data; 164 formData.value = data;
154 - await formApi.setValues(formData.value);  
155 }, 165 },
156 }); 166 });
157 </script> 167 </script>
@@ -161,9 +171,9 @@ const [Modal, modalApi] = useVbenModal({ @@ -161,9 +171,9 @@ const [Modal, modalApi] = useVbenModal({
161 <Form 171 <Form
162 ref="formRef" 172 ref="formRef"
163 :model="formData" 173 :model="formData"
164 - :rules="formRules"  
165 - label-col="{ span: 6 }"  
166 - :loading="formLoading" 174 + :rules="rules"
  175 + :label-col="labelCol"
  176 + :wrapper-col="wrapperCol"
167 > 177 >
168 #foreach($column in $columns) 178 #foreach($column in $columns)
169 #if ($column.createOperation || $column.updateOperation) 179 #if ($column.createOperation || $column.updateOperation)
@@ -172,16 +182,15 @@ const [Modal, modalApi] = useVbenModal({ @@ -172,16 +182,15 @@ const [Modal, modalApi] = useVbenModal({
172 #set ($javaType = $column.javaType) 182 #set ($javaType = $column.javaType)
173 #set ($AttrName = $column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)}) 183 #set ($AttrName = $column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)})
174 #set ($comment = $column.columnComment) 184 #set ($comment = $column.columnComment)
175 - #set ($dictMethod = "getDictOptions")## 计算使用哪个 dict 字典方法  
176 #if ($javaType == "Integer" || $javaType == "Long" || $javaType == "Byte" || $javaType == "Short") 185 #if ($javaType == "Integer" || $javaType == "Long" || $javaType == "Byte" || $javaType == "Short")
177 - #set ($dictMethod = "getIntDictOptions") 186 + #set ($dictMethod = "number")
178 #elseif ($javaType == "String") 187 #elseif ($javaType == "String")
179 - #set ($dictMethod = "getStrDictOptions") 188 + #set ($dictMethod = "string")
180 #elseif ($javaType == "Boolean") 189 #elseif ($javaType == "Boolean")
181 - #set ($dictMethod = "getBoolDictOptions") 190 + #set ($dictMethod = "boolean")
182 #end 191 #end
183 #if ( $table.templateType == 2 && $column.id == $treeParentColumn.id ) 192 #if ( $table.templateType == 2 && $column.id == $treeParentColumn.id )
184 - <FormItem label="${comment}" name="${javaField}"> 193 + <Form.Item label="${comment}" name="${javaField}">
185 <TreeSelect 194 <TreeSelect
186 v-model:value="formData.${javaField}" 195 v-model:value="formData.${javaField}"
187 :treeData="${classNameVar}Tree" 196 :treeData="${classNameVar}Tree"
@@ -194,29 +203,29 @@ const [Modal, modalApi] = useVbenModal({ @@ -194,29 +203,29 @@ const [Modal, modalApi] = useVbenModal({
194 treeDefaultExpandAll 203 treeDefaultExpandAll
195 placeholder="请选择${comment}" 204 placeholder="请选择${comment}"
196 /> 205 />
197 - </FormItem> 206 + </Form.Item>
198 #elseif ($column.htmlType == "input" && !$column.primaryKey)## 忽略主键,不用在表单里 207 #elseif ($column.htmlType == "input" && !$column.primaryKey)## 忽略主键,不用在表单里
199 - <FormItem label="${comment}" name="${javaField}"> 208 + <Form.Item label="${comment}" name="${javaField}">
200 <Input v-model:value="formData.${javaField}" placeholder="请输入${comment}" /> 209 <Input v-model:value="formData.${javaField}" placeholder="请输入${comment}" />
201 - </FormItem> 210 + </Form.Item>
202 #elseif($column.htmlType == "imageUpload")## 图片上传 211 #elseif($column.htmlType == "imageUpload")## 图片上传
203 - <FormItem label="${comment}" name="${javaField}">  
204 - <UploadImg v-model:value="formData.${javaField}" />  
205 - </FormItem> 212 + <Form.Item label="${comment}" name="${javaField}">
  213 + <ImageUpload v-model:value="formData.${javaField}" />
  214 + </Form.Item>
206 #elseif($column.htmlType == "fileUpload")## 文件上传 215 #elseif($column.htmlType == "fileUpload")## 文件上传
207 - <FormItem label="${comment}" name="${javaField}">  
208 - <UploadFile v-model:value="formData.${javaField}" />  
209 - </FormItem> 216 + <Form.Item label="${comment}" name="${javaField}">
  217 + <FileUpload v-model:value="formData.${javaField}" />
  218 + </Form.Item>
210 #elseif($column.htmlType == "editor")## 文本编辑器 219 #elseif($column.htmlType == "editor")## 文本编辑器
211 - <FormItem label="${comment}" name="${javaField}">  
212 - <Editor v-model:value="formData.${javaField}" height="150px" />  
213 - </FormItem> 220 + <Form.Item label="${comment}" name="${javaField}">
  221 + <RichTextarea v-model="formData.${javaField}" height="500px" />
  222 + </Form.Item>
214 #elseif($column.htmlType == "select")## 下拉框 223 #elseif($column.htmlType == "select")## 下拉框
215 - <FormItem label="${comment}" name="${javaField}"> 224 + <Form.Item label="${comment}" name="${javaField}">
216 <Select v-model:value="formData.${javaField}" placeholder="请选择${comment}"> 225 <Select v-model:value="formData.${javaField}" placeholder="请选择${comment}">
217 #if ("" != $dictType)## 有数据字典 226 #if ("" != $dictType)## 有数据字典
218 <SelectOption 227 <SelectOption
219 - v-for="dict in $dictMethod(DICT_TYPE.$dictType.toUpperCase())" 228 + v-for="dict in getDictOptions(DICT_TYPE.$dictType.toUpperCase(), '$dictMethod')"
220 :key="dict.value" 229 :key="dict.value"
221 :label="dict.label" 230 :label="dict.label"
222 :value="dict.value" 231 :value="dict.value"
@@ -225,13 +234,13 @@ const [Modal, modalApi] = useVbenModal({ @@ -225,13 +234,13 @@ const [Modal, modalApi] = useVbenModal({
225 <SelectOption label="请选择字典生成" value="" /> 234 <SelectOption label="请选择字典生成" value="" />
226 #end 235 #end
227 </Select> 236 </Select>
228 - </FormItem> 237 + </Form.Item>
229 #elseif($column.htmlType == "checkbox")## 多选框 238 #elseif($column.htmlType == "checkbox")## 多选框
230 - <FormItem label="${comment}" name="${javaField}"> 239 + <Form.Item label="${comment}" name="${javaField}">
231 <CheckboxGroup v-model:value="formData.${javaField}"> 240 <CheckboxGroup v-model:value="formData.${javaField}">
232 #if ("" != $dictType)## 有数据字典 241 #if ("" != $dictType)## 有数据字典
233 <Checkbox 242 <Checkbox
234 - v-for="dict in $dictMethod(DICT_TYPE.$dictType.toUpperCase())" 243 + v-for="dict in getDictOptions(DICT_TYPE.$dictType.toUpperCase(), '$dictMethod')"
235 :key="dict.value" 244 :key="dict.value"
236 :label="dict.label" 245 :label="dict.label"
237 :value="dict.value" 246 :value="dict.value"
@@ -240,13 +249,13 @@ const [Modal, modalApi] = useVbenModal({ @@ -240,13 +249,13 @@ const [Modal, modalApi] = useVbenModal({
240 <Checkbox label="请选择字典生成" /> 249 <Checkbox label="请选择字典生成" />
241 #end 250 #end
242 </CheckboxGroup> 251 </CheckboxGroup>
243 - </FormItem> 252 + </Form.Item>
244 #elseif($column.htmlType == "radio")## 单选框 253 #elseif($column.htmlType == "radio")## 单选框
245 - <FormItem label="${comment}" name="${javaField}"> 254 + <Form.Item label="${comment}" name="${javaField}">
246 <RadioGroup v-model:value="formData.${javaField}"> 255 <RadioGroup v-model:value="formData.${javaField}">
247 #if ("" != $dictType)## 有数据字典 256 #if ("" != $dictType)## 有数据字典
248 <Radio 257 <Radio
249 - v-for="dict in $dictMethod(DICT_TYPE.$dictType.toUpperCase())" 258 + v-for="dict in getDictOptions(DICT_TYPE.$dictType.toUpperCase(), '$dictMethod')"
250 :key="dict.value" 259 :key="dict.value"
251 :value="dict.value" 260 :value="dict.value"
252 > 261 >
@@ -256,19 +265,19 @@ const [Modal, modalApi] = useVbenModal({ @@ -256,19 +265,19 @@ const [Modal, modalApi] = useVbenModal({
256 <Radio value="1">请选择字典生成</Radio> 265 <Radio value="1">请选择字典生成</Radio>
257 #end 266 #end
258 </RadioGroup> 267 </RadioGroup>
259 - </FormItem> 268 + </Form.Item>
260 #elseif($column.htmlType == "datetime")## 时间框 269 #elseif($column.htmlType == "datetime")## 时间框
261 - <FormItem label="${comment}" name="${javaField}"> 270 + <Form.Item label="${comment}" name="${javaField}">
262 <DatePicker 271 <DatePicker
263 v-model:value="formData.${javaField}" 272 v-model:value="formData.${javaField}"
264 valueFormat="x" 273 valueFormat="x"
265 placeholder="选择${comment}" 274 placeholder="选择${comment}"
266 /> 275 />
267 - </FormItem> 276 + </Form.Item>
268 #elseif($column.htmlType == "textarea")## 文本框 277 #elseif($column.htmlType == "textarea")## 文本框
269 - <FormItem label="${comment}" name="${javaField}"> 278 + <Form.Item label="${comment}" name="${javaField}">
270 <Textarea v-model:value="formData.${javaField}" placeholder="请输入${comment}" /> 279 <Textarea v-model:value="formData.${javaField}" placeholder="请输入${comment}" />
271 - </FormItem> 280 + </Form.Item>
272 #end 281 #end
273 #end 282 #end
274 #end 283 #end