Commit ff39a2b57b94530f8435366c1f19c33c804918b2
1 parent
ef2d0b35
【功能完善】INFRA:代码生成 vben5 antd 单表表单模版
Showing
2 changed files
with
60 additions
and
51 deletions
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<Partial<${simpleClassName}Api.${simpleClassName}>>({ |
| 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(() => { |
| 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 | ... | ... |