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