Commit 57138d7995379d5dd0ad371d4b29e0fa1f996fad
1 parent
b0f4a252
【功能完善】INFRA:代码生成 vben5 antd 主子表 normal 模版
Showing
3 changed files
with
255 additions
and
118 deletions
yudao-module-infra/yudao-module-infra-biz/src/main/resources/codegen/vue3_vben5_antd/general/views/form.vue.vm
| @@ -112,10 +112,11 @@ const [Modal, modalApi] = useVbenModal({ | @@ -112,10 +112,11 @@ const [Modal, modalApi] = useVbenModal({ | ||
| 112 | #if ($subTable.subJoinMany) ## 一对多 | 112 | #if ($subTable.subJoinMany) ## 一对多 |
| 113 | ## TODO 列表值校验? | 113 | ## TODO 列表值校验? |
| 114 | #else | 114 | #else |
| 115 | - const ${subClassNameVar}Valid = await ${subClassNameVar}FormRef.value?.validate(); | ||
| 116 | - if (!${subClassNameVar}Valid) { | ||
| 117 | - subTabsName.value = '${subClassNameVar}'; | ||
| 118 | - return; | 115 | + try { |
| 116 | + await ${subClassNameVar}FormRef.value?.validate() | ||
| 117 | + } catch (e) { | ||
| 118 | + subTabsName.value = '${subClassNameVar}' | ||
| 119 | + return | ||
| 119 | } | 120 | } |
| 120 | #end | 121 | #end |
| 121 | #end | 122 | #end |
| @@ -134,7 +135,7 @@ const [Modal, modalApi] = useVbenModal({ | @@ -134,7 +135,7 @@ const [Modal, modalApi] = useVbenModal({ | ||
| 134 | #if ($subTable.subJoinMany) | 135 | #if ($subTable.subJoinMany) |
| 135 | data.${subClassNameVar}s = ${subClassNameVar}FormRef.value?.getData(); | 136 | data.${subClassNameVar}s = ${subClassNameVar}FormRef.value?.getData(); |
| 136 | #else | 137 | #else |
| 137 | - data.${subClassNameVar} = await ${subClassNameVar}FormRef.value?.getValues(); | 138 | + data.${subClassNameVar} = ${subClassNameVar}FormRef.value?.getValues(); |
| 138 | #end | 139 | #end |
| 139 | #end | 140 | #end |
| 140 | #end | 141 | #end |
yudao-module-infra/yudao-module-infra-biz/src/main/resources/codegen/vue3_vben5_antd/general/views/modules/form_sub_normal.vue.vm
| @@ -7,19 +7,19 @@ | @@ -7,19 +7,19 @@ | ||
| 7 | <script lang="ts" setup> | 7 | <script lang="ts" setup> |
| 8 | import type { ${simpleClassName}Api } from '#/api/${table.moduleName}/${simpleClassName_strikeCase}'; | 8 | import type { ${simpleClassName}Api } from '#/api/${table.moduleName}/${simpleClassName_strikeCase}'; |
| 9 | 9 | ||
| 10 | + import { message, Tabs, Form, Input, Textarea,Button, Select, RadioGroup, Radio, CheckboxGroup, Checkbox, DatePicker } from 'ant-design-vue'; | ||
| 10 | import { computed, ref, h, onMounted,watch,nextTick } from 'vue'; | 11 | import { computed, ref, h, onMounted,watch,nextTick } from 'vue'; |
| 11 | import { $t } from '#/locales'; | 12 | import { $t } from '#/locales'; |
| 13 | + import { DICT_TYPE, getDictOptions } from '#/utils/dict'; | ||
| 12 | 14 | ||
| 13 | #if ($subTable.subJoinMany) ## 一对多 | 15 | #if ($subTable.subJoinMany) ## 一对多 |
| 16 | +import type { VxeTableInstance } from 'vxe-table'; | ||
| 14 | import { Plus } from "@vben/icons"; | 17 | import { Plus } from "@vben/icons"; |
| 15 | -import { Button, Tabs, Checkbox, Input, Textarea, Select,RadioGroup,CheckboxGroup, DatePicker } from 'ant-design-vue'; | ||
| 16 | -import type { OnActionClickParams } from '#/adapter/vxe-table'; | ||
| 17 | -import { useVbenVxeGrid } from '#/adapter/vxe-table'; | ||
| 18 | -import { use${subSimpleClassName}GridEditColumns } from '../data'; | 18 | +import { VxeColumn, VxeTable } from 'vxe-table'; |
| 19 | import { get${subSimpleClassName}ListBy${SubJoinColumnName} } from '#/api/${table.moduleName}/${simpleClassName_strikeCase}'; | 19 | import { get${subSimpleClassName}ListBy${SubJoinColumnName} } from '#/api/${table.moduleName}/${simpleClassName_strikeCase}'; |
| 20 | #else | 20 | #else |
| 21 | -import { useVbenForm } from '#/adapter/form'; | ||
| 22 | -import { use${subSimpleClassName}FormSchema } from '../data'; | 21 | +import type { Rule } from 'ant-design-vue/es/form'; |
| 22 | +import { Tinymce as RichTextarea } from '#/components/tinymce'; | ||
| 23 | import { get${subSimpleClassName}By${SubJoinColumnName} } from '#/api/${table.moduleName}/${simpleClassName_strikeCase}'; | 23 | import { get${subSimpleClassName}By${SubJoinColumnName} } from '#/api/${table.moduleName}/${simpleClassName_strikeCase}'; |
| 24 | #end | 24 | #end |
| 25 | 25 | ||
| @@ -28,57 +28,27 @@ const props = defineProps<{ | @@ -28,57 +28,27 @@ const props = defineProps<{ | ||
| 28 | }>() | 28 | }>() |
| 29 | 29 | ||
| 30 | #if ($subTable.subJoinMany) ## 一对多 | 30 | #if ($subTable.subJoinMany) ## 一对多 |
| 31 | -/** 表格操作按钮的回调函数 */ | ||
| 32 | -function onActionClick({ | ||
| 33 | - code, | ||
| 34 | - row, | ||
| 35 | -}: OnActionClickParams<${simpleClassName}Api.${subSimpleClassName}>) { | ||
| 36 | - switch (code) { | ||
| 37 | - case 'delete': { | ||
| 38 | - onDelete(row); | ||
| 39 | - break; | ||
| 40 | - } | ||
| 41 | - } | ||
| 42 | -} | ||
| 43 | - | ||
| 44 | -const [Grid, gridApi] = useVbenVxeGrid({ | ||
| 45 | -gridOptions: { | ||
| 46 | - columns: use${subSimpleClassName}GridEditColumns(onActionClick), | ||
| 47 | - border: true, | ||
| 48 | - showOverflow: true, | ||
| 49 | - autoResize: true, | ||
| 50 | - keepSource: true, | ||
| 51 | - rowConfig: { | ||
| 52 | - keyField: 'id', | ||
| 53 | - }, | ||
| 54 | - pagerConfig: { | ||
| 55 | - enabled: false, | ||
| 56 | - }, | ||
| 57 | - toolbarConfig: { | ||
| 58 | - enabled: false, | ||
| 59 | - }, | ||
| 60 | -}, | ||
| 61 | -}); | ||
| 62 | - | 31 | +const list = ref<${simpleClassName}Api.${subSimpleClassName}[]>([]) // 列表的数据 |
| 32 | +const tableRef = ref<VxeTableInstance>(); | ||
| 63 | /** 添加${subTable.classComment} */ | 33 | /** 添加${subTable.classComment} */ |
| 64 | const onAdd = async () => { | 34 | const onAdd = async () => { |
| 65 | - await gridApi.grid.insertAt({} as ${simpleClassName}Api.${subSimpleClassName}, -1); | 35 | + await tableRef.value?.insertAt({} as ${simpleClassName}Api.${subSimpleClassName}, -1); |
| 66 | } | 36 | } |
| 67 | 37 | ||
| 68 | /** 删除${subTable.classComment} */ | 38 | /** 删除${subTable.classComment} */ |
| 69 | const onDelete = async (row: ${simpleClassName}Api.${subSimpleClassName}) => { | 39 | const onDelete = async (row: ${simpleClassName}Api.${subSimpleClassName}) => { |
| 70 | - await gridApi.grid.remove(row); | 40 | + await tableRef.value?.remove(row); |
| 71 | } | 41 | } |
| 72 | 42 | ||
| 73 | /** 提供获取表格数据的方法供父组件调用 */ | 43 | /** 提供获取表格数据的方法供父组件调用 */ |
| 74 | defineExpose({ | 44 | defineExpose({ |
| 75 | getData: (): ${simpleClassName}Api.${subSimpleClassName}[] => { | 45 | getData: (): ${simpleClassName}Api.${subSimpleClassName}[] => { |
| 76 | - const data = gridApi.grid.getData() as ${simpleClassName}Api.${subSimpleClassName}[]; | ||
| 77 | - const removeRecords = gridApi.grid.getRemoveRecords() as ${simpleClassName}Api.${subSimpleClassName}[]; | ||
| 78 | - const insertRecords = gridApi.grid.getInsertRecords() as ${simpleClassName}Api.${subSimpleClassName}[]; | 46 | + const data = list.value as ${simpleClassName}Api.${subSimpleClassName}[]; |
| 47 | + const removeRecords = tableRef.value?.getRemoveRecords() as ${simpleClassName}Api.${subSimpleClassName}[]; | ||
| 48 | + const insertRecords = tableRef.value?.getInsertRecords() as ${simpleClassName}Api.${subSimpleClassName}[]; | ||
| 79 | return data | 49 | return data |
| 80 | .filter((row) => !removeRecords.some((removed) => removed.id === row.id)) | 50 | .filter((row) => !removeRecords.some((removed) => removed.id === row.id)) |
| 81 | - .concat(insertRecords.map((row: any) => ({ ...row, id: undefined }))); | 51 | + ?.concat(insertRecords.map((row: any) => ({ ...row, id: undefined }))); |
| 82 | }, | 52 | }, |
| 83 | }); | 53 | }); |
| 84 | 54 | ||
| @@ -89,32 +59,35 @@ watch( | @@ -89,32 +59,35 @@ watch( | ||
| 89 | if (!val) { | 59 | if (!val) { |
| 90 | return; | 60 | return; |
| 91 | } | 61 | } |
| 92 | - await nextTick(); | ||
| 93 | - await gridApi.grid.loadData(await get${subSimpleClassName}ListBy${SubJoinColumnName}(props.${subJoinColumn.javaField}!)); | 62 | + list.value = await get${subSimpleClassName}ListBy${SubJoinColumnName}(props.${subJoinColumn.javaField}!); |
| 94 | }, | 63 | }, |
| 95 | { immediate: true }, | 64 | { immediate: true }, |
| 96 | ); | 65 | ); |
| 97 | #else | 66 | #else |
| 98 | -const [Form, formApi] = useVbenForm({ | ||
| 99 | - commonConfig: { | ||
| 100 | - componentProps: { | ||
| 101 | - class: 'w-full', | ||
| 102 | - }, | ||
| 103 | - formItemClass: 'col-span-2', | ||
| 104 | - labelWidth: 80, | ||
| 105 | - }, | ||
| 106 | - layout: 'horizontal', | ||
| 107 | - schema: use${subSimpleClassName}FormSchema(), | ||
| 108 | - showDefaultActions: false | 67 | +const formRef = ref(); |
| 68 | +const formData = ref<Partial<${simpleClassName}Api.${subSimpleClassName}>>({ | ||
| 69 | + #foreach ($column in $subColumns) | ||
| 70 | + #if ($column.createOperation || $column.updateOperation) | ||
| 71 | + #if ($column.htmlType == "checkbox") | ||
| 72 | + $column.javaField: [], | ||
| 73 | + #else | ||
| 74 | + $column.javaField: undefined, | ||
| 75 | + #end | ||
| 76 | + #end | ||
| 77 | + #end | ||
| 109 | }); | 78 | }); |
| 110 | - | 79 | +const rules: Record<string, Rule[]> = { |
| 80 | + #foreach ($column in $subColumns) | ||
| 81 | + #if (($column.createOperation || $column.updateOperation) && !$column.nullable && !${column.primaryKey})## 创建或者更新操作 && 要求非空 && 非主键 | ||
| 82 | + #set($comment=$column.columnComment) | ||
| 83 | + $column.javaField: [{ required: true, message: '${comment}不能为空', trigger: #if($column.htmlType == 'select')'change'#else'blur'#end }], | ||
| 84 | + #end | ||
| 85 | + #end | ||
| 86 | +}; | ||
| 111 | /** 暴露出表单校验方法和表单值获取方法 */ | 87 | /** 暴露出表单校验方法和表单值获取方法 */ |
| 112 | defineExpose({ | 88 | defineExpose({ |
| 113 | - validate: async () => { | ||
| 114 | - const { valid } = await formApi.validate(); | ||
| 115 | - return valid; | ||
| 116 | - }, | ||
| 117 | - getValues: formApi.getValues, | 89 | + validate: async () => await formRef.value?.validate(), |
| 90 | + getValues: ()=> formData.value, | ||
| 118 | }); | 91 | }); |
| 119 | 92 | ||
| 120 | /** 监听主表的关联字段的变化,加载对应的子表数据 */ | 93 | /** 监听主表的关联字段的变化,加载对应的子表数据 */ |
| @@ -125,7 +98,7 @@ watch( | @@ -125,7 +98,7 @@ watch( | ||
| 125 | return; | 98 | return; |
| 126 | } | 99 | } |
| 127 | await nextTick(); | 100 | await nextTick(); |
| 128 | - await formApi.setValues(await get${subSimpleClassName}By${SubJoinColumnName}(props.${subJoinColumn.javaField}!)); | 101 | + formData.value = await get${subSimpleClassName}By${SubJoinColumnName}(props.${subJoinColumn.javaField}!); |
| 129 | }, | 102 | }, |
| 130 | { immediate: true }, | 103 | { immediate: true }, |
| 131 | ); | 104 | ); |
| @@ -134,66 +107,232 @@ watch( | @@ -134,66 +107,232 @@ watch( | ||
| 134 | 107 | ||
| 135 | <template> | 108 | <template> |
| 136 | #if ($subTable.subJoinMany) ## 一对多 | 109 | #if ($subTable.subJoinMany) ## 一对多 |
| 137 | - <Grid class="mx-4"> | 110 | + <vxe-table ref="tableRef" :data="list" show-overflow class="mx-4"> |
| 138 | #foreach($column in $subColumns) | 111 | #foreach($column in $subColumns) |
| 139 | #if ($column.createOperation || $column.updateOperation) | 112 | #if ($column.createOperation || $column.updateOperation) |
| 113 | + #set ($comment = $column.columnComment) | ||
| 140 | #set ($javaField = $column.javaField) | 114 | #set ($javaField = $column.javaField) |
| 115 | + #set ($javaType = $column.javaType) | ||
| 116 | + #if ($javaType == "Integer" || $javaType == "Long" || $javaType == "Byte" || $javaType == "Short") | ||
| 117 | + #set ($dictMethod = "number") | ||
| 118 | + #elseif ($javaType == "String") | ||
| 119 | + #set ($dictMethod = "string") | ||
| 120 | + #elseif ($javaType == "Boolean") | ||
| 121 | + #set ($dictMethod = "boolean") | ||
| 122 | + #end | ||
| 141 | #if ( $column.id == $subJoinColumn.id) ## 特殊:忽略主子表的 join 字段,不用填写 | 123 | #if ( $column.id == $subJoinColumn.id) ## 特殊:忽略主子表的 join 字段,不用填写 |
| 142 | #elseif ($column.htmlType == "input" && !$column.primaryKey)## 忽略主键,不用在表单里 | 124 | #elseif ($column.htmlType == "input" && !$column.primaryKey)## 忽略主键,不用在表单里 |
| 143 | - <template #${javaField}="{ row }"> | ||
| 144 | - <Input v-model:value="row.${javaField}" /> | ||
| 145 | - </template> | 125 | + <vxe-column field="${javaField}" title="${comment}" align="center"> |
| 126 | + <template #default="{row}"> | ||
| 127 | + <Input v-model:value="row.${javaField}" /> | ||
| 128 | + </template> | ||
| 129 | + </vxe-column> | ||
| 130 | + #elseif($column.htmlType == "imageUpload")## 图片上传 | ||
| 131 | + <vxe-column field="${javaField}" title="${comment}" align="center"> | ||
| 132 | + <template #default="{row}"> | ||
| 133 | + <ImageUpload v-model:value="row.${javaField}" /> | ||
| 134 | + </template> | ||
| 135 | + </vxe-column> | ||
| 136 | + #elseif($column.htmlType == "fileUpload")## 文件上传 | ||
| 137 | + <vxe-column field="${javaField}" title="${comment}" align="center"> | ||
| 138 | + <template #default="{row}"> | ||
| 139 | + <FileUpload v-model:value="row.${javaField}" /> | ||
| 140 | + </template> | ||
| 141 | + </vxe-column> | ||
| 142 | + #elseif($column.htmlType == "select")## 下拉框 | ||
| 143 | + <vxe-column field="${javaField}" title="${comment}" align="center"> | ||
| 144 | + <template #default="{row}"> | ||
| 145 | + <Select v-model:value="row.${javaField}" placeholder="请选择${comment}"> | ||
| 146 | + #if ("" != $dictType)## 有数据字典 | ||
| 147 | + <Select.Option | ||
| 148 | + v-for="dict in getDictOptions(DICT_TYPE.$dictType.toUpperCase(), '$dictMethod')" | ||
| 149 | + :key="dict.value" | ||
| 150 | + :value="dict.value" | ||
| 151 | + > | ||
| 152 | + {{ dict.label }} | ||
| 153 | + </Select.Option> | ||
| 154 | + #else##没数据字典 | ||
| 155 | + <Select.Option label="请选择字典生成" value="" /> | ||
| 156 | + #end | ||
| 157 | + </Select> | ||
| 158 | + </template> | ||
| 159 | + </vxe-column> | ||
| 160 | + #elseif($column.htmlType == "checkbox")## 多选框 | ||
| 161 | + <vxe-column field="${javaField}" title="${comment}" align="center"> | ||
| 162 | + <template #default="{row}"> | ||
| 163 | + <CheckboxGroup v-model:value="row.${javaField}"> | ||
| 164 | + #if ("" != $dictType)## 有数据字典 | ||
| 165 | + <Checkbox | ||
| 166 | + v-for="dict in getDictOptions(DICT_TYPE.$dictType.toUpperCase(), '$dictMethod')" | ||
| 167 | + :key="dict.value" | ||
| 168 | + :value="dict.value" | ||
| 169 | + > | ||
| 170 | + {{ dict.label }} | ||
| 171 | + </Checkbox> | ||
| 172 | + #else##没数据字典 | ||
| 173 | + <Checkbox label="请选择字典生成" /> | ||
| 174 | + #end | ||
| 175 | + </CheckboxGroup> | ||
| 176 | + </template> | ||
| 177 | + </vxe-column> | ||
| 178 | + #elseif($column.htmlType == "radio")## 单选框 | ||
| 179 | + <vxe-column field="${javaField}" title="${comment}" align="center"> | ||
| 180 | + <template #default="{row}"> | ||
| 181 | + <RadioGroup v-model:value="row.${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 | + </template> | ||
| 195 | + </vxe-column> | ||
| 196 | + #elseif($column.htmlType == "datetime")## 时间框 | ||
| 197 | + <vxe-column field="${javaField}" title="${comment}" align="center"> | ||
| 198 | + <template #default="{row}"> | ||
| 199 | + <DatePicker | ||
| 200 | + v-model:value="row.${javaField}" | ||
| 201 | + :showTime="true" | ||
| 202 | + format="YYYY-MM-DD HH:mm:ss" | ||
| 203 | + valueFormat='x' | ||
| 204 | + /> | ||
| 205 | + </template> | ||
| 206 | + </vxe-column> | ||
| 207 | + #elseif($column.htmlType == "textarea" || $column.htmlType == "editor")## 文本框 | ||
| 208 | + <vxe-column field="${javaField}" title="${comment}" align="center"> | ||
| 209 | + <template #default="{row}"> | ||
| 210 | + <Textarea v-model:value="row.${javaField}" /> | ||
| 211 | + </template> | ||
| 212 | + </vxe-column> | ||
| 213 | + #end | ||
| 214 | + #end | ||
| 215 | + #end | ||
| 216 | + <vxe-column field="operation" title="操作" align="center"> | ||
| 217 | + <template #default="{row}"> | ||
| 218 | + <Button | ||
| 219 | + size="small" | ||
| 220 | + type="link" | ||
| 221 | + danger | ||
| 222 | + @click="onDelete(row as any)" | ||
| 223 | + v-access:code="['${permissionPrefix}:delete']" | ||
| 224 | + > | ||
| 225 | + {{ $t('ui.actionTitle.delete') }} | ||
| 226 | + </Button> | ||
| 227 | + </template> | ||
| 228 | + </vxe-column> | ||
| 229 | + </vxe-table> | ||
| 230 | + <div class="flex justify-center mt-4"> | ||
| 231 | + <Button :icon="h(Plus)" type="primary" ghost @click="onAdd" v-access:code="['${permissionPrefix}:create']"> | ||
| 232 | + {{ $t('ui.actionTitle.create', ['${subTable.classComment}']) }} | ||
| 233 | + </Button> | ||
| 234 | + </div> | ||
| 235 | +#else | ||
| 236 | + <Form | ||
| 237 | + ref="formRef" | ||
| 238 | + class="mx-4" | ||
| 239 | + :model="formData" | ||
| 240 | + :rules="rules" | ||
| 241 | + :label-col="{ span: 5 }" | ||
| 242 | + :wrapper-col="{ span: 18 }" | ||
| 243 | + > | ||
| 244 | + #foreach($column in $subColumns) | ||
| 245 | + #if ($column.createOperation || $column.updateOperation) | ||
| 246 | + #set ($dictType = $column.dictType) | ||
| 247 | + #set ($javaField = $column.javaField) | ||
| 248 | + #set ($javaType = $column.javaType) | ||
| 249 | + #set ($comment = $column.columnComment) | ||
| 250 | + #if ($javaType == "Integer" || $javaType == "Long" || $javaType == "Byte" || $javaType == "Short") | ||
| 251 | + #set ($dictMethod = "number") | ||
| 252 | + #elseif ($javaType == "String") | ||
| 253 | + #set ($dictMethod = "string") | ||
| 254 | + #elseif ($javaType == "Boolean") | ||
| 255 | + #set ($dictMethod = "boolean") | ||
| 256 | + #end | ||
| 257 | + #if ($column.htmlType == "input" && !$column.primaryKey)## 忽略主键,不用在表单里 | ||
| 258 | + <Form.Item label="${comment}" name="${javaField}"> | ||
| 259 | + <Input v-model:value="formData.${javaField}" placeholder="请输入${comment}" /> | ||
| 260 | + </Form.Item> | ||
| 146 | #elseif($column.htmlType == "imageUpload")## 图片上传 | 261 | #elseif($column.htmlType == "imageUpload")## 图片上传 |
| 147 | - <template #${javaField}="{ row }"> | ||
| 148 | - <UploadImg v-model:value="row.${javaField}" /> | ||
| 149 | - </template> | 262 | + <Form.Item label="${comment}" name="${javaField}"> |
| 263 | + <ImageUpload v-model:value="formData.${javaField}" /> | ||
| 264 | + </Form.Item> | ||
| 150 | #elseif($column.htmlType == "fileUpload")## 文件上传 | 265 | #elseif($column.htmlType == "fileUpload")## 文件上传 |
| 151 | - <template #${javaField}="{ row }"> | ||
| 152 | - <UploadFile v-model:value="row.${javaField}" /> | ||
| 153 | - </template> | 266 | + <Form.Item label="${comment}" name="${javaField}"> |
| 267 | + <FileUpload v-model:value="formData.${javaField}" /> | ||
| 268 | + </Form.Item> | ||
| 154 | #elseif($column.htmlType == "editor")## 文本编辑器 | 269 | #elseif($column.htmlType == "editor")## 文本编辑器 |
| 155 | - <template #${javaField}="{ row }"> | ||
| 156 | - <Textarea v-model:value="row.${javaField}" /> | ||
| 157 | - </template> | 270 | + <Form.Item label="${comment}" name="${javaField}"> |
| 271 | + <RichTextarea v-model="formData.${javaField}" height="500px" /> | ||
| 272 | + </Form.Item> | ||
| 158 | #elseif($column.htmlType == "select")## 下拉框 | 273 | #elseif($column.htmlType == "select")## 下拉框 |
| 159 | - <template #${javaField}="{ row, column }"> | ||
| 160 | - <Select v-model:value="row.${javaField}" class="w-full"> | ||
| 161 | - <Select.Option v-for="option in column.params.options" :key="option.value" :value="option.value"> | ||
| 162 | - {{ option.label }} | ||
| 163 | - </Select.Option> | 274 | + <Form.Item label="${comment}" name="${javaField}"> |
| 275 | + <Select v-model:value="formData.${javaField}" placeholder="请选择${comment}"> | ||
| 276 | + #if ("" != $dictType)## 有数据字典 | ||
| 277 | + <Select.Option | ||
| 278 | + v-for="dict in getDictOptions(DICT_TYPE.$dictType.toUpperCase(), '$dictMethod')" | ||
| 279 | + :key="dict.value" | ||
| 280 | + :value="dict.value" | ||
| 281 | + > | ||
| 282 | + {{ dict.label }} | ||
| 283 | + </Select.Option> | ||
| 284 | + #else##没数据字典 | ||
| 285 | + <Select.Option label="请选择字典生成" value="" /> | ||
| 286 | + #end | ||
| 164 | </Select> | 287 | </Select> |
| 165 | - </template> | 288 | + </Form.Item> |
| 166 | #elseif($column.htmlType == "checkbox")## 多选框 | 289 | #elseif($column.htmlType == "checkbox")## 多选框 |
| 167 | - <template #${javaField}="{ row, column }"> | ||
| 168 | - <CheckboxGroup v-model:value="row.${javaField}" :options="column.params.options" /> | ||
| 169 | - </template> | 290 | + <Form.Item label="${comment}" name="${javaField}"> |
| 291 | + <CheckboxGroup v-model:value="formData.${javaField}"> | ||
| 292 | + #if ("" != $dictType)## 有数据字典 | ||
| 293 | + <Checkbox | ||
| 294 | + v-for="dict in getDictOptions(DICT_TYPE.$dictType.toUpperCase(), '$dictMethod')" | ||
| 295 | + :key="dict.value" | ||
| 296 | + :value="dict.value" | ||
| 297 | + > | ||
| 298 | + {{ dict.label }} | ||
| 299 | + </Checkbox> | ||
| 300 | + #else##没数据字典 | ||
| 301 | + <Checkbox label="请选择字典生成" /> | ||
| 302 | + #end | ||
| 303 | + </CheckboxGroup> | ||
| 304 | + </Form.Item> | ||
| 170 | #elseif($column.htmlType == "radio")## 单选框 | 305 | #elseif($column.htmlType == "radio")## 单选框 |
| 171 | - <template #${javaField}="{ row, column }"> | ||
| 172 | - <RadioGroup v-model:value="row.${javaField}" :options="column.params.options" /> | ||
| 173 | - </template> | 306 | + <Form.Item label="${comment}" name="${javaField}"> |
| 307 | + <RadioGroup v-model:value="formData.${javaField}"> | ||
| 308 | + #if ("" != $dictType)## 有数据字典 | ||
| 309 | + <Radio | ||
| 310 | + v-for="dict in getDictOptions(DICT_TYPE.$dictType.toUpperCase(), '$dictMethod')" | ||
| 311 | + :key="dict.value" | ||
| 312 | + :value="dict.value" | ||
| 313 | + > | ||
| 314 | + {{ dict.label }} | ||
| 315 | + </Radio> | ||
| 316 | + #else##没数据字典 | ||
| 317 | + <Radio value="1">请选择字典生成</Radio> | ||
| 318 | + #end | ||
| 319 | + </RadioGroup> | ||
| 320 | + </Form.Item> | ||
| 174 | #elseif($column.htmlType == "datetime")## 时间框 | 321 | #elseif($column.htmlType == "datetime")## 时间框 |
| 175 | - <template #${javaField}="{ row }"> | 322 | + <Form.Item label="${comment}" name="${javaField}"> |
| 176 | <DatePicker | 323 | <DatePicker |
| 177 | - v-model:value="row.${javaField}" | ||
| 178 | - :showTime="true" | ||
| 179 | - format="YYYY-MM-DD HH:mm:ss" | ||
| 180 | - valueFormat='x' | 324 | + v-model:value="formData.${javaField}" |
| 325 | + valueFormat="x" | ||
| 326 | + placeholder="选择${comment}" | ||
| 181 | /> | 327 | /> |
| 182 | - </template> | 328 | + </Form.Item> |
| 183 | #elseif($column.htmlType == "textarea")## 文本框 | 329 | #elseif($column.htmlType == "textarea")## 文本框 |
| 184 | - <template #${javaField}="{ row }"> | ||
| 185 | - <Textarea v-model:value="row.${javaField}" /> | ||
| 186 | - </template> | 330 | + <Form.Item label="${comment}" name="${javaField}"> |
| 331 | + <Textarea v-model:value="formData.${javaField}" placeholder="请输入${comment}" /> | ||
| 332 | + </Form.Item> | ||
| 187 | #end | 333 | #end |
| 188 | #end | 334 | #end |
| 189 | #end | 335 | #end |
| 190 | - </Grid> | ||
| 191 | - <div class="flex justify-center -mt-4"> | ||
| 192 | - <Button :icon="h(Plus)" type="primary" ghost @click="onAdd" v-access:code="['${subTable.moduleName}:${simpleClassName_strikeCase}:create']"> | ||
| 193 | - {{ $t('ui.actionTitle.create', ['${subTable.classComment}']) }} | ||
| 194 | - </Button> | ||
| 195 | - </div> | ||
| 196 | -#else | ||
| 197 | - <Form class="mx-4" /> | 336 | + </Form> |
| 198 | #end | 337 | #end |
| 199 | </template> | 338 | </template> |
yudao-module-infra/yudao-module-infra-biz/src/main/resources/codegen/vue3_vben5_antd/schema/views/modules/form_sub_normal.vue.vm
| @@ -13,6 +13,7 @@ | @@ -13,6 +13,7 @@ | ||
| 13 | #if ($subTable.subJoinMany) ## 一对多 | 13 | #if ($subTable.subJoinMany) ## 一对多 |
| 14 | import { Plus } from "@vben/icons"; | 14 | import { Plus } from "@vben/icons"; |
| 15 | import { Button, Tabs, Checkbox, Input, Textarea, Select,RadioGroup,CheckboxGroup, DatePicker } from 'ant-design-vue'; | 15 | import { Button, Tabs, Checkbox, Input, Textarea, Select,RadioGroup,CheckboxGroup, DatePicker } from 'ant-design-vue'; |
| 16 | +import { ImageUpload, FileUpload } from "#/components/upload"; | ||
| 16 | import type { OnActionClickParams } from '#/adapter/vxe-table'; | 17 | import type { OnActionClickParams } from '#/adapter/vxe-table'; |
| 17 | import { useVbenVxeGrid } from '#/adapter/vxe-table'; | 18 | import { useVbenVxeGrid } from '#/adapter/vxe-table'; |
| 18 | import { use${subSimpleClassName}GridEditColumns } from '../data'; | 19 | import { use${subSimpleClassName}GridEditColumns } from '../data'; |
| @@ -145,15 +146,11 @@ watch( | @@ -145,15 +146,11 @@ watch( | ||
| 145 | </template> | 146 | </template> |
| 146 | #elseif($column.htmlType == "imageUpload")## 图片上传 | 147 | #elseif($column.htmlType == "imageUpload")## 图片上传 |
| 147 | <template #${javaField}="{ row }"> | 148 | <template #${javaField}="{ row }"> |
| 148 | - <UploadImg v-model:value="row.${javaField}" /> | 149 | + <ImageUpload v-model:value="row.${javaField}" /> |
| 149 | </template> | 150 | </template> |
| 150 | #elseif($column.htmlType == "fileUpload")## 文件上传 | 151 | #elseif($column.htmlType == "fileUpload")## 文件上传 |
| 151 | <template #${javaField}="{ row }"> | 152 | <template #${javaField}="{ row }"> |
| 152 | - <UploadFile v-model:value="row.${javaField}" /> | ||
| 153 | - </template> | ||
| 154 | - #elseif($column.htmlType == "editor")## 文本编辑器 | ||
| 155 | - <template #${javaField}="{ row }"> | ||
| 156 | - <Textarea v-model:value="row.${javaField}" /> | 153 | + <FileUpload v-model:value="row.${javaField}" /> |
| 157 | </template> | 154 | </template> |
| 158 | #elseif($column.htmlType == "select")## 下拉框 | 155 | #elseif($column.htmlType == "select")## 下拉框 |
| 159 | <template #${javaField}="{ row, column }"> | 156 | <template #${javaField}="{ row, column }"> |
| @@ -180,7 +177,7 @@ watch( | @@ -180,7 +177,7 @@ watch( | ||
| 180 | valueFormat='x' | 177 | valueFormat='x' |
| 181 | /> | 178 | /> |
| 182 | </template> | 179 | </template> |
| 183 | - #elseif($column.htmlType == "textarea")## 文本框 | 180 | + #elseif($column.htmlType == "textarea" || $column.htmlType == "editor")## 文本框 |
| 184 | <template #${javaField}="{ row }"> | 181 | <template #${javaField}="{ row }"> |
| 185 | <Textarea v-model:value="row.${javaField}" /> | 182 | <Textarea v-model:value="row.${javaField}" /> |
| 186 | </template> | 183 | </template> |