Commit c6582b2a61f4ecc27c843a165927cfe74093d3e5
1 parent
515cbbb2
【功能完善】INFRA:代码生成 vben5 antd 主子表 erp 模版
Showing
3 changed files
with
162 additions
and
29 deletions
yudao-module-infra/yudao-module-infra-biz/src/main/resources/codegen/vue3_vben5_antd/general/views/index.vue.vm
| @@ -38,6 +38,9 @@ import { downloadByData } from '#/utils/download'; | @@ -38,6 +38,9 @@ import { downloadByData } from '#/utils/download'; | ||
| 38 | const subTabsName = ref('$subClassNameVars.get(0)') | 38 | const subTabsName = ref('$subClassNameVars.get(0)') |
| 39 | #if ($table.templateType == 11) | 39 | #if ($table.templateType == 11) |
| 40 | const select${simpleClassName} = ref<${simpleClassName}Api.${simpleClassName}>(); | 40 | const select${simpleClassName} = ref<${simpleClassName}Api.${simpleClassName}>(); |
| 41 | +async function onCellClick({ row }: { row: ${simpleClassName}Api.${simpleClassName} }) { | ||
| 42 | + select${simpleClassName}.value = row | ||
| 43 | +} | ||
| 41 | #end | 44 | #end |
| 42 | #end | 45 | #end |
| 43 | 46 | ||
| @@ -323,7 +326,15 @@ onMounted(async () => { | @@ -323,7 +326,15 @@ onMounted(async () => { | ||
| 323 | expandAll: true, | 326 | expandAll: true, |
| 324 | reserve: true, | 327 | reserve: true, |
| 325 | }" | 328 | }" |
| 326 | - #end | 329 | + #end |
| 330 | +#if ($table.templateType == 11) ## erp情况 | ||
| 331 | + @cell-click="onCellClick" | ||
| 332 | + :row-config="{ | ||
| 333 | + keyField: 'id', | ||
| 334 | + isHover: true, | ||
| 335 | + isCurrent: true, | ||
| 336 | + }" | ||
| 337 | +#end | ||
| 327 | show-overflow | 338 | show-overflow |
| 328 | :loading="loading" | 339 | :loading="loading" |
| 329 | > | 340 | > |
yudao-module-infra/yudao-module-infra-biz/src/main/resources/codegen/vue3_vben5_antd/general/views/modules/form_sub_erp.vue.vm
| @@ -4,49 +4,54 @@ | @@ -4,49 +4,54 @@ | ||
| 4 | #set ($subSimpleClassName = $subSimpleClassNames.get($subIndex)) | 4 | #set ($subSimpleClassName = $subSimpleClassNames.get($subIndex)) |
| 5 | <script lang="ts" setup> | 5 | <script lang="ts" setup> |
| 6 | import type { ${simpleClassName}Api } from '#/api/${table.moduleName}/${simpleClassName_strikeCase}'; | 6 | import type { ${simpleClassName}Api } from '#/api/${table.moduleName}/${simpleClassName_strikeCase}'; |
| 7 | + import type { Rule } from 'ant-design-vue/es/form'; | ||
| 7 | 8 | ||
| 8 | import { useVbenModal } from '@vben/common-ui'; | 9 | import { useVbenModal } from '@vben/common-ui'; |
| 9 | - import { message } from 'ant-design-vue'; | 10 | + import { Tinymce as RichTextarea } from '#/components/tinymce'; |
| 11 | + import { ImageUpload, FileUpload } from "#/components/upload"; | ||
| 12 | + import { message, Tabs, Form, Input, Textarea, Select, RadioGroup, Radio, CheckboxGroup, Checkbox, DatePicker, TreeSelect } from 'ant-design-vue'; | ||
| 13 | + import { DICT_TYPE, getDictOptions } from '#/utils/dict'; | ||
| 10 | 14 | ||
| 11 | import { computed, ref } from 'vue'; | 15 | import { computed, ref } from 'vue'; |
| 12 | import { $t } from '#/locales'; | 16 | import { $t } from '#/locales'; |
| 13 | - import { useVbenForm } from '#/adapter/form'; | ||
| 14 | - import { get${subSimpleClassName}, create${subSimpleClassName}, update${subSimpleClassName} } from '#/api/${table.moduleName}/${simpleClassName_strikeCase}'; | ||
| 15 | 17 | ||
| 16 | - import { use${subSimpleClassName}FormSchema } from '../data'; | 18 | + import { get${subSimpleClassName}, create${subSimpleClassName}, update${subSimpleClassName} } from '#/api/${table.moduleName}/${simpleClassName_strikeCase}'; |
| 17 | 19 | ||
| 18 | const emit = defineEmits(['success']); | 20 | const emit = defineEmits(['success']); |
| 19 | - const formData = ref<${simpleClassName}Api.${subSimpleClassName}>(); | ||
| 20 | const getTitle = computed(() => { | 21 | const getTitle = computed(() => { |
| 21 | return formData.value?.id | 22 | return formData.value?.id |
| 22 | ? $t('ui.actionTitle.edit', ['${subTable.classComment}']) | 23 | ? $t('ui.actionTitle.edit', ['${subTable.classComment}']) |
| 23 | : $t('ui.actionTitle.create', ['${subTable.classComment}']); | 24 | : $t('ui.actionTitle.create', ['${subTable.classComment}']); |
| 24 | }); | 25 | }); |
| 25 | 26 | ||
| 26 | - const [Form, formApi] = useVbenForm({ | ||
| 27 | - commonConfig: { | ||
| 28 | - componentProps: { | ||
| 29 | - class: 'w-full', | ||
| 30 | - }, | ||
| 31 | - formItemClass: 'col-span-2', | ||
| 32 | - labelWidth: 80, | ||
| 33 | - }, | ||
| 34 | - layout: 'horizontal', | ||
| 35 | - schema: use${subSimpleClassName}FormSchema(), | ||
| 36 | - showDefaultActions: false | 27 | + const formRef = ref(); |
| 28 | + const formData = ref<Partial<${simpleClassName}Api.${subSimpleClassName}>>({ | ||
| 29 | + #foreach ($column in $subColumns) | ||
| 30 | + #if ($column.createOperation || $column.updateOperation) | ||
| 31 | + #if ($column.htmlType == "checkbox") | ||
| 32 | + $column.javaField: [], | ||
| 33 | + #else | ||
| 34 | + $column.javaField: undefined, | ||
| 35 | + #end | ||
| 36 | + #end | ||
| 37 | + #end | ||
| 37 | }); | 38 | }); |
| 39 | + const rules: Record<string, Rule[]> = { | ||
| 40 | + #foreach ($column in $subColumns) | ||
| 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 | + }; | ||
| 38 | 47 | ||
| 39 | const [Modal, modalApi] = useVbenModal({ | 48 | const [Modal, modalApi] = useVbenModal({ |
| 40 | async onConfirm() { | 49 | async onConfirm() { |
| 41 | - const { valid } = await formApi.validate(); | ||
| 42 | - if (!valid) { | ||
| 43 | - return; | ||
| 44 | - } | 50 | + await formRef.value?.validate(); |
| 45 | 51 | ||
| 46 | modalApi.lock(); | 52 | modalApi.lock(); |
| 47 | // 提交表单 | 53 | // 提交表单 |
| 48 | - const data = (await formApi.getValues()) as ${simpleClassName}Api.${subSimpleClassName}; | ||
| 49 | - data.${subJoinColumn.javaField} = formData.value?.${subJoinColumn.javaField}; | 54 | + const data = formData.value as ${simpleClassName}Api.${subSimpleClassName}; |
| 50 | try { | 55 | try { |
| 51 | await (formData.value?.id ? update${subSimpleClassName}(data) : create${subSimpleClassName}(data)); | 56 | await (formData.value?.id ? update${subSimpleClassName}(data) : create${subSimpleClassName}(data)); |
| 52 | // 关闭并提示 | 57 | // 关闭并提示 |
| @@ -62,7 +67,7 @@ | @@ -62,7 +67,7 @@ | ||
| 62 | }, | 67 | }, |
| 63 | async onOpenChange(isOpen: boolean) { | 68 | async onOpenChange(isOpen: boolean) { |
| 64 | if (!isOpen) { | 69 | if (!isOpen) { |
| 65 | - formData.value = undefined; | 70 | + resetForm() |
| 66 | return; | 71 | return; |
| 67 | } | 72 | } |
| 68 | 73 | ||
| @@ -81,13 +86,127 @@ | @@ -81,13 +86,127 @@ | ||
| 81 | } | 86 | } |
| 82 | // 设置到 values | 87 | // 设置到 values |
| 83 | formData.value = data; | 88 | formData.value = data; |
| 84 | - await formApi.setValues(formData.value); | ||
| 85 | }, | 89 | }, |
| 86 | }); | 90 | }); |
| 91 | + | ||
| 92 | + /** 重置表单 */ | ||
| 93 | + const resetForm = () => { | ||
| 94 | + formData.value = { | ||
| 95 | + #foreach ($column in $subColumns) | ||
| 96 | + #if ($column.createOperation || $column.updateOperation) | ||
| 97 | + #if ($column.htmlType == "checkbox") | ||
| 98 | + $column.javaField: [], | ||
| 99 | + #else | ||
| 100 | + $column.javaField: undefined, | ||
| 101 | + #end | ||
| 102 | + #end | ||
| 103 | + #end | ||
| 104 | + }; | ||
| 105 | + formRef.value?.resetFields(); | ||
| 106 | + } | ||
| 87 | </script> | 107 | </script> |
| 88 | 108 | ||
| 89 | <template> | 109 | <template> |
| 90 | <Modal :title="getTitle"> | 110 | <Modal :title="getTitle"> |
| 91 | - <Form class="mx-4" /> | 111 | + <Form |
| 112 | + ref="formRef" | ||
| 113 | + :model="formData" | ||
| 114 | + :rules="rules" | ||
| 115 | + :label-col="{ span: 5 }" | ||
| 116 | + :wrapper-col="{ span: 18 }" | ||
| 117 | + > | ||
| 118 | + #foreach($column in $subColumns) | ||
| 119 | + #if ($column.createOperation || $column.updateOperation) | ||
| 120 | + #set ($dictType = $column.dictType) | ||
| 121 | + #set ($javaField = $column.javaField) | ||
| 122 | + #set ($javaType = $column.javaType) | ||
| 123 | + #set ($comment = $column.columnComment) | ||
| 124 | + #if ($javaType == "Integer" || $javaType == "Long" || $javaType == "Byte" || $javaType == "Short") | ||
| 125 | + #set ($dictMethod = "number") | ||
| 126 | + #elseif ($javaType == "String") | ||
| 127 | + #set ($dictMethod = "string") | ||
| 128 | + #elseif ($javaType == "Boolean") | ||
| 129 | + #set ($dictMethod = "boolean") | ||
| 130 | + #end | ||
| 131 | + #if ($column.htmlType == "input" && !$column.primaryKey)## 忽略主键,不用在表单里 | ||
| 132 | + <Form.Item label="${comment}" name="${javaField}"> | ||
| 133 | + <Input v-model:value="formData.${javaField}" placeholder="请输入${comment}" /> | ||
| 134 | + </Form.Item> | ||
| 135 | + #elseif($column.htmlType == "imageUpload")## 图片上传 | ||
| 136 | + <Form.Item label="${comment}" name="${javaField}"> | ||
| 137 | + <ImageUpload v-model:value="formData.${javaField}" /> | ||
| 138 | + </Form.Item> | ||
| 139 | + #elseif($column.htmlType == "fileUpload")## 文件上传 | ||
| 140 | + <Form.Item label="${comment}" name="${javaField}"> | ||
| 141 | + <FileUpload v-model:value="formData.${javaField}" /> | ||
| 142 | + </Form.Item> | ||
| 143 | + #elseif($column.htmlType == "editor")## 文本编辑器 | ||
| 144 | + <Form.Item label="${comment}" name="${javaField}"> | ||
| 145 | + <RichTextarea v-model="formData.${javaField}" height="500px" /> | ||
| 146 | + </Form.Item> | ||
| 147 | + #elseif($column.htmlType == "select")## 下拉框 | ||
| 148 | + <Form.Item label="${comment}" name="${javaField}"> | ||
| 149 | + <Select v-model:value="formData.${javaField}" placeholder="请选择${comment}"> | ||
| 150 | + #if ("" != $dictType)## 有数据字典 | ||
| 151 | + <Select.Option | ||
| 152 | + v-for="dict in getDictOptions(DICT_TYPE.$dictType.toUpperCase(), '$dictMethod')" | ||
| 153 | + :key="dict.value" | ||
| 154 | + :value="dict.value" | ||
| 155 | + > | ||
| 156 | + {{ dict.label }} | ||
| 157 | + </Select.Option> | ||
| 158 | + #else##没数据字典 | ||
| 159 | + <Select.Option label="请选择字典生成" value="" /> | ||
| 160 | + #end | ||
| 161 | + </Select> | ||
| 162 | + </Form.Item> | ||
| 163 | + #elseif($column.htmlType == "checkbox")## 多选框 | ||
| 164 | + <Form.Item label="${comment}" name="${javaField}"> | ||
| 165 | + <CheckboxGroup v-model:value="formData.${javaField}"> | ||
| 166 | + #if ("" != $dictType)## 有数据字典 | ||
| 167 | + <Checkbox | ||
| 168 | + v-for="dict in getDictOptions(DICT_TYPE.$dictType.toUpperCase(), '$dictMethod')" | ||
| 169 | + :key="dict.value" | ||
| 170 | + :value="dict.value" | ||
| 171 | + > | ||
| 172 | + {{ dict.label }} | ||
| 173 | + </Checkbox> | ||
| 174 | + #else##没数据字典 | ||
| 175 | + <Checkbox label="请选择字典生成" /> | ||
| 176 | + #end | ||
| 177 | + </CheckboxGroup> | ||
| 178 | + </Form.Item> | ||
| 179 | + #elseif($column.htmlType == "radio")## 单选框 | ||
| 180 | + <Form.Item label="${comment}" name="${javaField}"> | ||
| 181 | + <RadioGroup v-model:value="formData.${javaField}"> | ||
| 182 | + #if ("" != $dictType)## 有数据字典 | ||
| 183 | + <Radio | ||
| 184 | + v-for="dict in getDictOptions(DICT_TYPE.$dictType.toUpperCase(), '$dictMethod')" | ||
| 185 | + :key="dict.value" | ||
| 186 | + :value="dict.value" | ||
| 187 | + > | ||
| 188 | + {{ dict.label }} | ||
| 189 | + </Radio> | ||
| 190 | + #else##没数据字典 | ||
| 191 | + <Radio value="1">请选择字典生成</Radio> | ||
| 192 | + #end | ||
| 193 | + </RadioGroup> | ||
| 194 | + </Form.Item> | ||
| 195 | + #elseif($column.htmlType == "datetime")## 时间框 | ||
| 196 | + <Form.Item label="${comment}" name="${javaField}"> | ||
| 197 | + <DatePicker | ||
| 198 | + v-model:value="formData.${javaField}" | ||
| 199 | + valueFormat="x" | ||
| 200 | + placeholder="选择${comment}" | ||
| 201 | + /> | ||
| 202 | + </Form.Item> | ||
| 203 | + #elseif($column.htmlType == "textarea")## 文本框 | ||
| 204 | + <Form.Item label="${comment}" name="${javaField}"> | ||
| 205 | + <Textarea v-model:value="formData.${javaField}" placeholder="请输入${comment}" /> | ||
| 206 | + </Form.Item> | ||
| 207 | + #end | ||
| 208 | + #end | ||
| 209 | + #end | ||
| 210 | + </Form> | ||
| 92 | </Modal> | 211 | </Modal> |
| 93 | </template> | 212 | </template> |
yudao-module-infra/yudao-module-infra-biz/src/main/resources/codegen/vue3_vben5_antd/general/views/modules/list_sub_erp.vue.vm
| @@ -14,11 +14,15 @@ | @@ -14,11 +14,15 @@ | ||
| 14 | import { VxeColumn, VxeTable } from 'vxe-table'; | 14 | import { VxeColumn, VxeTable } from 'vxe-table'; |
| 15 | import { reactive,ref, h, nextTick,watch,onMounted } from 'vue'; | 15 | import { reactive,ref, h, nextTick,watch,onMounted } from 'vue'; |
| 16 | import { cloneDeep, formatDateTime } from '@vben/utils'; | 16 | import { cloneDeep, formatDateTime } from '@vben/utils'; |
| 17 | + import { ContentWrap } from "#/components/content-wrap"; | ||
| 17 | 18 | ||
| 18 | #if ($table.templateType == 11) ## erp | 19 | #if ($table.templateType == 11) ## erp |
| 19 | import { useVbenModal } from '@vben/common-ui'; | 20 | import { useVbenModal } from '@vben/common-ui'; |
| 20 | import ${subSimpleClassName}Form from './${subSimpleClassName_strikeCase}-form.vue' | 21 | import ${subSimpleClassName}Form from './${subSimpleClassName_strikeCase}-form.vue' |
| 21 | - import { Button, message } from 'ant-design-vue'; | 22 | + import { Tinymce as RichTextarea } from '#/components/tinymce'; |
| 23 | + import { ImageUpload, FileUpload } from "#/components/upload"; | ||
| 24 | + import { message,Button, Tabs,Pagination, Form, Input, Textarea, Select, RadioGroup, Radio, CheckboxGroup, Checkbox,RangePicker, DatePicker, TreeSelect } from 'ant-design-vue'; | ||
| 25 | + import { DICT_TYPE, getDictOptions } from '#/utils/dict'; | ||
| 22 | import { Plus } from '@vben/icons'; | 26 | import { Plus } from '@vben/icons'; |
| 23 | import { $t } from '#/locales'; | 27 | import { $t } from '#/locales'; |
| 24 | import { TableToolbar } from '#/components/table-toolbar'; | 28 | import { TableToolbar } from '#/components/table-toolbar'; |
| @@ -99,8 +103,6 @@ async function onDelete(row: ${simpleClassName}Api.${subSimpleClassName}) { | @@ -99,8 +103,6 @@ async function onDelete(row: ${simpleClassName}Api.${subSimpleClassName}) { | ||
| 99 | #end | 103 | #end |
| 100 | #end | 104 | #end |
| 101 | #end | 105 | #end |
| 102 | - | ||
| 103 | - ${subJoinColumn.javaField}: props.${subJoinColumn.javaField}, | ||
| 104 | }) | 106 | }) |
| 105 | 107 | ||
| 106 | /** 搜索按钮操作 */ | 108 | /** 搜索按钮操作 */ |
| @@ -134,6 +136,7 @@ const resetQuery = () => { | @@ -134,6 +136,7 @@ const resetQuery = () => { | ||
| 134 | #end | 136 | #end |
| 135 | #end | 137 | #end |
| 136 | #end | 138 | #end |
| 139 | + params.${subJoinColumn.javaField} = props.${subJoinColumn.javaField}; | ||
| 137 | const data = await get${subSimpleClassName}Page(params) | 140 | const data = await get${subSimpleClassName}Page(params) |
| 138 | list.value = data.list | 141 | list.value = data.list |
| 139 | total.value = data.total | 142 | total.value = data.total |