Commit 03d3239463702eaf99c52ff477ef8123dcf521bd
1 parent
ff39a2b5
【功能完善】INFRA:代码生成 vben5 antd 单表表单模版
Showing
2 changed files
with
303 additions
and
188 deletions
yudao-module-infra/yudao-module-infra-biz/src/main/resources/codegen/vue3_vben5_antd/general/views/form.vue.vm
| ... | ... | @@ -7,7 +7,10 @@ import { Tinymce as RichTextarea } from '#/components/tinymce'; |
| 7 | 7 | import { ImageUpload, FileUpload } from "#/components/upload"; |
| 8 | 8 | import { message, Tabs, Form, Input, Textarea, Select, RadioGroup, Radio, CheckboxGroup, Checkbox, DatePicker } from 'ant-design-vue'; |
| 9 | 9 | import { DICT_TYPE, getDictOptions } from '#/utils/dict'; |
| 10 | - | |
| 10 | +#if($table.templateType == 2)## 树表需要导入这些 | |
| 11 | +import { get${simpleClassName}List } from '#/api/${table.moduleName}/${simpleClassName_strikeCase}'; | |
| 12 | +import { handleTree } from '#/utils/tree'; | |
| 13 | +#end | |
| 11 | 14 | ## 特殊:主子表专属逻辑 |
| 12 | 15 | #if ( $table.templateType == 10 || $table.templateType == 12 ) |
| 13 | 16 | #foreach ($subSimpleClassName in $subSimpleClassNames) |
| ... | ... | @@ -44,29 +47,19 @@ const rules: Record<string, Rule[]> = { |
| 44 | 47 | #end |
| 45 | 48 | #end |
| 46 | 49 | }; |
| 47 | -#if (${table.templateType} == 2)## 树表特有:父ID处理 | |
| 48 | -const parentId = ref<number>(); // 新增下级时的父级 ID | |
| 49 | - | |
| 50 | -const getTitle = computed(() => { | |
| 51 | - if (formData.value?.id) { | |
| 52 | - return $t('ui.actionTitle.edit', ['${table.classComment}']); | |
| 53 | - } | |
| 54 | - return parentId.value | |
| 55 | - ? $t('ui.actionTitle.create', ['下级${table.classComment}']) | |
| 56 | - : $t('ui.actionTitle.create', ['${table.classComment}']); | |
| 57 | -}); | |
| 58 | -#else## 标准表标题 | |
| 50 | +## 特殊:树表专属逻辑 | |
| 51 | +#if ( $table.templateType == 2 ) | |
| 52 | +const ${classNameVar}Tree = ref<any[]>([]) // 树形结构 | |
| 53 | +#end | |
| 59 | 54 | const getTitle = computed(() => { |
| 60 | 55 | return formData.value?.id |
| 61 | 56 | ? $t('ui.actionTitle.edit', ['${table.classComment}']) |
| 62 | 57 | : $t('ui.actionTitle.create', ['${table.classComment}']); |
| 63 | 58 | }); |
| 64 | -#end | |
| 65 | 59 | |
| 66 | 60 | ## 特殊:主子表专属逻辑 |
| 67 | 61 | #if ( $table.templateType == 10 || $table.templateType == 12 ) |
| 68 | 62 | #if ( $subTables && $subTables.size() > 0 ) |
| 69 | - | |
| 70 | 63 | /** 子表的表单 */ |
| 71 | 64 | const subTabsName = ref('$subClassNameVars.get(0)') |
| 72 | 65 | #foreach ($subClassNameVar in $subClassNameVars) |
| ... | ... | @@ -77,6 +70,34 @@ const getTitle = computed(() => { |
| 77 | 70 | #end |
| 78 | 71 | #end |
| 79 | 72 | |
| 73 | +/** 重置表单 */ | |
| 74 | +const resetForm = () => { | |
| 75 | + formData.value = { | |
| 76 | + #foreach ($column in $columns) | |
| 77 | + #if ($column.createOperation || $column.updateOperation) | |
| 78 | + #if ($column.htmlType == "checkbox") | |
| 79 | + $column.javaField: [], | |
| 80 | + #else | |
| 81 | + $column.javaField: undefined, | |
| 82 | + #end | |
| 83 | + #end | |
| 84 | + #end | |
| 85 | + }; | |
| 86 | + formRef.value?.resetFields(); | |
| 87 | +} | |
| 88 | + | |
| 89 | +## 特殊:树表专属逻辑 | |
| 90 | +#if ( $table.templateType == 2 ) | |
| 91 | +/** 获得${table.classComment}树 */ | |
| 92 | +const get${simpleClassName}Tree = async () => { | |
| 93 | + ${classNameVar}Tree.value = [] | |
| 94 | + const data = await get${simpleClassName}List() | |
| 95 | + const root: Tree = { id: 0, name: '顶级${table.classComment}', children: [] } | |
| 96 | + root.children = handleTree(data, 'id', '${treeParentColumn.javaField}') | |
| 97 | + ${classNameVar}Tree.value.push(root) | |
| 98 | +} | |
| 99 | +#end | |
| 100 | + | |
| 80 | 101 | const [Modal, modalApi] = useVbenModal({ |
| 81 | 102 | async onConfirm() { |
| 82 | 103 | await formRef.value?.validate(); |
| ... | ... | @@ -101,7 +122,7 @@ const [Modal, modalApi] = useVbenModal({ |
| 101 | 122 | #end |
| 102 | 123 | modalApi.lock(); |
| 103 | 124 | // 提交表单 |
| 104 | - const data = formData.value; | |
| 125 | + const data = formData.value as ${simpleClassName}Api.${simpleClassName}; | |
| 105 | 126 | ## 特殊:主子表专属逻辑 |
| 106 | 127 | #if ( $table.templateType == 10 || $table.templateType == 12 ) |
| 107 | 128 | #if ( $subTables && $subTables.size() > 0 ) |
| ... | ... | @@ -132,18 +153,7 @@ const [Modal, modalApi] = useVbenModal({ |
| 132 | 153 | }, |
| 133 | 154 | async onOpenChange(isOpen: boolean) { |
| 134 | 155 | if (!isOpen) { |
| 135 | - formData.value = { | |
| 136 | - #foreach ($column in $columns) | |
| 137 | - #if ($column.createOperation || $column.updateOperation) | |
| 138 | - #if ($column.htmlType == "checkbox") | |
| 139 | - $column.javaField: [], | |
| 140 | - #else | |
| 141 | - $column.javaField: undefined, | |
| 142 | - #end | |
| 143 | - #end | |
| 144 | - #end | |
| 145 | - }; | |
| 146 | - formRef.value?.resetFields(); | |
| 156 | + resetForm() | |
| 147 | 157 | return; |
| 148 | 158 | } |
| 149 | 159 | |
| ... | ... | @@ -160,8 +170,11 @@ const [Modal, modalApi] = useVbenModal({ |
| 160 | 170 | modalApi.lock(false); |
| 161 | 171 | } |
| 162 | 172 | } |
| 163 | - // 设置到 values | |
| 164 | 173 | formData.value = data; |
| 174 | +#if ( $table.templateType == 2 ) | |
| 175 | + // 加载树数据 | |
| 176 | + await get${simpleClassName}Tree() | |
| 177 | +#end | |
| 165 | 178 | }, |
| 166 | 179 | }); |
| 167 | 180 | </script> |
| ... | ... | @@ -180,7 +193,6 @@ const [Modal, modalApi] = useVbenModal({ |
| 180 | 193 | #set ($dictType = $column.dictType) |
| 181 | 194 | #set ($javaField = $column.javaField) |
| 182 | 195 | #set ($javaType = $column.javaType) |
| 183 | - #set ($AttrName = $column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)}) | |
| 184 | 196 | #set ($comment = $column.columnComment) |
| 185 | 197 | #if ($javaType == "Integer" || $javaType == "Long" || $javaType == "Byte" || $javaType == "Short") |
| 186 | 198 | #set ($dictMethod = "number") |
| ... | ... | @@ -224,14 +236,14 @@ const [Modal, modalApi] = useVbenModal({ |
| 224 | 236 | <Form.Item label="${comment}" name="${javaField}"> |
| 225 | 237 | <Select v-model:value="formData.${javaField}" placeholder="请选择${comment}"> |
| 226 | 238 | #if ("" != $dictType)## 有数据字典 |
| 227 | - <SelectOption | |
| 239 | + <Select.Option | |
| 228 | 240 | v-for="dict in getDictOptions(DICT_TYPE.$dictType.toUpperCase(), '$dictMethod')" |
| 229 | 241 | :key="dict.value" |
| 230 | 242 | :label="dict.label" |
| 231 | 243 | :value="dict.value" |
| 232 | 244 | /> |
| 233 | 245 | #else##没数据字典 |
| 234 | - <SelectOption label="请选择字典生成" value="" /> | |
| 246 | + <Select.Option label="请选择字典生成" value="" /> | |
| 235 | 247 | #end |
| 236 | 248 | </Select> |
| 237 | 249 | </Form.Item> | ... | ... |
yudao-module-infra/yudao-module-infra-biz/src/main/resources/codegen/vue3_vben5_antd/general/views/index.vue.vm
| 1 | 1 | <script lang="ts" setup> |
| 2 | -import type { OnActionClickParams, VxeTableGridOptions } from '#/adapter/vxe-table'; | |
| 3 | 2 | import type { ${simpleClassName}Api } from '#/api/${table.moduleName}/${simpleClassName_strikeCase}'; |
| 4 | 3 | |
| 5 | 4 | import { Page, useVbenModal } from '@vben/common-ui'; |
| 6 | -import { Button, message,Tabs } from 'ant-design-vue'; | |
| 7 | -import { Download, Plus } from '@vben/icons'; | |
| 8 | -import Form from './modules/form.vue'; | |
| 5 | +import { formatDateTime } from '@vben/utils'; | |
| 6 | +import { Button, message,Tabs,Pagination,Form,RangePicker,DatePicker,Select,Input } from 'ant-design-vue'; | |
| 7 | +import { DictTag } from '#/components/dict-tag'; | |
| 8 | +import { DICT_TYPE, getDictOptions } from '#/utils/dict'; | |
| 9 | +import ${simpleClassName}Form from './modules/form.vue'; | |
| 10 | +import { Download, Plus, RefreshCw, Search } from '@vben/icons'; | |
| 11 | +import { ContentWrap } from "#/components/content-wrap"; | |
| 12 | +import { VxeColumn, VxeTable } from 'vxe-table'; | |
| 13 | +import { getRangePickerDefaultProps } from '#/utils/date'; | |
| 9 | 14 | |
| 10 | 15 | ## 特殊:主子表专属逻辑 |
| 11 | 16 | #if ( $table.templateType == 11 || $table.templateType == 12 ) |
| ... | ... | @@ -16,18 +21,16 @@ import Form from './modules/form.vue'; |
| 16 | 21 | #end |
| 17 | 22 | #end |
| 18 | 23 | |
| 19 | -import { ref, h } from 'vue'; | |
| 24 | +import { ref, h, reactive,onMounted } from 'vue'; | |
| 20 | 25 | import { $t } from '#/locales'; |
| 21 | -import { useVbenVxeGrid } from '#/adapter/vxe-table'; | |
| 22 | 26 | #if (${table.templateType} == 2)## 树表接口 |
| 27 | +import { handleTree } from '@/utils/tree' | |
| 23 | 28 | import { get${simpleClassName}List, delete${simpleClassName}, export${simpleClassName} } from '#/api/${table.moduleName}/${simpleClassName_strikeCase}'; |
| 24 | 29 | #else## 标准表接口 |
| 25 | 30 | import { get${simpleClassName}Page, delete${simpleClassName}, export${simpleClassName} } from '#/api/${table.moduleName}/${simpleClassName_strikeCase}'; |
| 26 | 31 | #end |
| 27 | 32 | import { downloadByData } from '#/utils/download'; |
| 28 | 33 | |
| 29 | -import { useGridColumns, useGridFormSchema } from './data'; | |
| 30 | - | |
| 31 | 34 | #if ($table.templateType == 12 || $table.templateType == 11) ## 内嵌和erp情况 |
| 32 | 35 | /** 子表的列表 */ |
| 33 | 36 | const subTabsName = ref('$subClassNameVars.get(0)') |
| ... | ... | @@ -36,29 +39,67 @@ const select${simpleClassName} = ref<${simpleClassName}Api.${simpleClassName}>() |
| 36 | 39 | #end |
| 37 | 40 | #end |
| 38 | 41 | |
| 39 | -const [FormModal, formModalApi] = useVbenModal({ | |
| 40 | - connectedComponent: Form, | |
| 41 | - destroyOnClose: true, | |
| 42 | -}); | |
| 42 | +const loading = ref(true) // 列表的加载中 | |
| 43 | +const list = ref<${simpleClassName}Api.${simpleClassName}[]>([]) // 列表的数据 | |
| 44 | +## 特殊:树表专属逻辑(树不需要分页接口) | |
| 45 | +#if ( $table.templateType != 2 ) | |
| 46 | +const total = ref(0) // 列表的总页数 | |
| 47 | +#end | |
| 48 | +const queryParams = reactive({ | |
| 49 | +## 特殊:树表专属逻辑(树不需要分页接口) | |
| 50 | +#if ( $table.templateType != 2 ) | |
| 51 | + pageNo: 1, | |
| 52 | + pageSize: 10, | |
| 53 | +#end | |
| 54 | +#foreach ($column in $columns) | |
| 55 | + #if ($column.listOperation) | |
| 56 | + #if ($column.listOperationCondition != 'BETWEEN') | |
| 57 | + $column.javaField: undefined, | |
| 58 | + #end | |
| 59 | + #if ($column.htmlType == "datetime" || $column.listOperationCondition == "BETWEEN") | |
| 60 | + $column.javaField: undefined, | |
| 61 | + #end | |
| 62 | + #end | |
| 63 | +#end | |
| 64 | +}) | |
| 65 | +const queryFormRef = ref() // 搜索的表单 | |
| 66 | +const exportLoading = ref(false) // 导出的加载中 | |
| 43 | 67 | |
| 44 | -#if (${table.templateType} == 2)## 树表特有:控制表格展开收缩 | |
| 45 | -/** 切换树形展开/收缩状态 */ | |
| 46 | -const isExpanded = ref(true); | |
| 47 | -function toggleExpand() { | |
| 48 | - isExpanded.value = !isExpanded.value; | |
| 49 | - gridApi.grid.setAllTreeExpand(isExpanded.value); | |
| 68 | +/** 查询列表 */ | |
| 69 | +const getList = async () => { | |
| 70 | + loading.value = true | |
| 71 | + try { | |
| 72 | + ## 特殊:树表专属逻辑(树不需要分页接口) | |
| 73 | + #if ( $table.templateType == 2 ) | |
| 74 | + const data = await get${simpleClassName}List(queryParams) | |
| 75 | + list.value = handleTree(data, 'id', '${treeParentColumn.javaField}') | |
| 76 | + #else | |
| 77 | + const data = await get${simpleClassName}Page(queryParams) | |
| 78 | + list.value = data.list | |
| 79 | + total.value = data.total | |
| 80 | + #end | |
| 81 | + } finally { | |
| 82 | + loading.value = false | |
| 83 | + } | |
| 50 | 84 | } |
| 51 | -#end | |
| 52 | 85 | |
| 53 | -/** 刷新表格 */ | |
| 54 | -function onRefresh() { | |
| 55 | -#if ($table.templateType == 12) ## 内嵌情况 | |
| 56 | - gridApi.reload(); | |
| 57 | -#else | |
| 58 | - gridApi.query(); | |
| 59 | -#end | |
| 86 | +/** 搜索按钮操作 */ | |
| 87 | +const handleQuery = () => { | |
| 88 | + queryParams.pageNo = 1 | |
| 89 | + getList() | |
| 90 | +} | |
| 91 | + | |
| 92 | +/** 重置按钮操作 */ | |
| 93 | +const resetQuery = () => { | |
| 94 | + queryFormRef.value.resetFields() | |
| 95 | + handleQuery() | |
| 60 | 96 | } |
| 61 | 97 | |
| 98 | +const [FormModal, formModalApi] = useVbenModal({ | |
| 99 | + connectedComponent: ${simpleClassName}Form, | |
| 100 | + destroyOnClose: true, | |
| 101 | +}); | |
| 102 | + | |
| 62 | 103 | /** 创建${table.classComment} */ |
| 63 | 104 | function onCreate() { |
| 64 | 105 | formModalApi.setData({}).open(); |
| ... | ... | @@ -89,7 +130,7 @@ async function onDelete(row: ${simpleClassName}Api.${simpleClassName}) { |
| 89 | 130 | content: $t('ui.actionMessage.deleteSuccess', [row.id]), |
| 90 | 131 | key: 'action_process_msg', |
| 91 | 132 | }); |
| 92 | - onRefresh(); | |
| 133 | + await getList(); | |
| 93 | 134 | } catch { |
| 94 | 135 | hideLoading(); |
| 95 | 136 | } |
| ... | ... | @@ -97,147 +138,209 @@ async function onDelete(row: ${simpleClassName}Api.${simpleClassName}) { |
| 97 | 138 | |
| 98 | 139 | /** 导出表格 */ |
| 99 | 140 | async function onExport() { |
| 100 | - const data = await export${simpleClassName}(await gridApi.formApi.getValues()); | |
| 141 | +try { | |
| 142 | + exportLoading.value = true; | |
| 143 | + const data = await export${simpleClassName}(queryParams); | |
| 101 | 144 | downloadByData(data, '${table.classComment}.xls'); |
| 145 | +}finally { | |
| 146 | + exportLoading.value = false; | |
| 102 | 147 | } |
| 103 | - | |
| 104 | -/** 表格操作按钮的回调函数 */ | |
| 105 | -function onActionClick({ | |
| 106 | - code, | |
| 107 | - row, | |
| 108 | -}: OnActionClickParams<${simpleClassName}Api.${simpleClassName}>) { | |
| 109 | - switch (code) { | |
| 110 | - #if (${table.templateType} == 2)## 树表特有:新增下级 | |
| 111 | - case 'append': { | |
| 112 | - onAppend(row); | |
| 113 | - break; | |
| 114 | - } | |
| 115 | - #end | |
| 116 | - case 'edit': { | |
| 117 | - onEdit(row); | |
| 118 | - break; | |
| 119 | - } | |
| 120 | - case 'delete': { | |
| 121 | - onDelete(row); | |
| 122 | - break; | |
| 123 | - } | |
| 124 | - } | |
| 125 | 148 | } |
| 126 | 149 | |
| 127 | -const [Grid, gridApi] = useVbenVxeGrid({ | |
| 128 | - formOptions: { | |
| 129 | - schema: useGridFormSchema(), | |
| 130 | - }, | |
| 131 | - gridOptions: { | |
| 132 | - columns: useGridColumns(onActionClick), | |
| 133 | -#if (${table.templateType} == 11) | |
| 134 | - height: '600px', | |
| 135 | -#else | |
| 136 | - height: 'auto', | |
| 137 | -#end | |
| 138 | -#if (${table.templateType} == 2)## 树表设置 | |
| 139 | - treeConfig: { | |
| 140 | - parentField: '${treeParentColumn.javaField}', | |
| 141 | - rowField: 'id', | |
| 142 | - transform: true, | |
| 143 | - expandAll: true, | |
| 144 | - reserve: true, | |
| 145 | - }, | |
| 146 | - pagerConfig: { | |
| 147 | - enabled: false, | |
| 148 | - }, | |
| 149 | -#else## 标准表设置 | |
| 150 | - pagerConfig: { | |
| 151 | - enabled: true, | |
| 152 | - }, | |
| 153 | -#end | |
| 154 | - proxyConfig: { | |
| 155 | - ajax: { | |
| 156 | -#if (${table.templateType} == 2)## 树表数据加载 | |
| 157 | - query: async (_, formValues) => { | |
| 158 | - return await get${simpleClassName}List(formValues); | |
| 159 | - }, | |
| 160 | -#else## 标准表数据加载 | |
| 161 | - query: async ({ page }, formValues) => { | |
| 162 | - return await get${simpleClassName}Page({ | |
| 163 | - pageNo: page.currentPage, | |
| 164 | - pageSize: page.pageSize, | |
| 165 | - ...formValues, | |
| 166 | - }); | |
| 167 | - }, | |
| 168 | -#end | |
| 169 | - }, | |
| 170 | - }, | |
| 171 | - rowConfig: { | |
| 172 | - keyField: 'id', | |
| 173 | - isHover: true, | |
| 174 | -#if (${table.templateType} == 11) | |
| 175 | - isCurrent: true, | |
| 176 | -#end | |
| 177 | - }, | |
| 178 | - toolbarConfig: { | |
| 179 | - refresh: { code: 'query' }, | |
| 180 | - search: true, | |
| 181 | - }, | |
| 182 | - } as VxeTableGridOptions<${simpleClassName}Api.${simpleClassName}>, | |
| 183 | -#if (${table.templateType} == 11) | |
| 184 | - gridEvents:{ | |
| 185 | - cellClick: ({ row }: { row: ${simpleClassName}Api.${simpleClassName}}) => { | |
| 186 | - select${simpleClassName}.value = row; | |
| 187 | - }, | |
| 188 | - } | |
| 189 | -#end | |
| 190 | -}); | |
| 150 | +/** 初始化 **/ | |
| 151 | +onMounted(() => { | |
| 152 | + getList() | |
| 153 | +}) | |
| 191 | 154 | </script> |
| 192 | 155 | |
| 193 | 156 | <template> |
| 194 | 157 | <Page auto-content-height> |
| 195 | - <FormModal @success="onRefresh" /> | |
| 158 | + <FormModal @success="getList" /> | |
| 196 | 159 | |
| 197 | -#if ($table.templateType == 11) ## erp情况 | |
| 198 | - <div> | |
| 199 | -#end | |
| 200 | - <Grid table-title="${table.classComment}列表"> | |
| 201 | - #if ($table.templateType == 12) ## 内嵌情况 | |
| 202 | - <template #expand_content="{ row }"> | |
| 203 | - <!-- 子表的表单 --> | |
| 204 | - <Tabs v-model:active-key="subTabsName" class="mx-8"> | |
| 205 | - #foreach ($subTable in $subTables) | |
| 206 | - #set ($index = $foreach.count - 1) | |
| 207 | - #set ($subClassNameVar = $subClassNameVars.get($index)) | |
| 208 | - #set ($subSimpleClassName = $subSimpleClassNames.get($index)) | |
| 209 | - #set ($subJoinColumn_strikeCase = $subJoinColumn_strikeCases.get($index)) | |
| 210 | - <Tabs.TabPane key="$subClassNameVar" tab="${subTable.classComment}" force-render> | |
| 211 | - <${subSimpleClassName}List :${subJoinColumn_strikeCase}="row?.id" /> | |
| 212 | - </Tabs.TabPane> | |
| 213 | - #end | |
| 214 | - </Tabs> | |
| 160 | + <ContentWrap> | |
| 161 | + <!-- 搜索工作栏 --> | |
| 162 | + <Form | |
| 163 | + class="-mb-15px" | |
| 164 | + :model="queryParams" | |
| 165 | + ref="queryFormRef" | |
| 166 | + layout="inline" | |
| 167 | + > | |
| 168 | + #foreach($column in $columns) | |
| 169 | + #if ($column.listOperation) | |
| 170 | + #set ($dictType = $column.dictType) | |
| 171 | + #set ($javaField = $column.javaField) | |
| 172 | + #set ($javaType = $column.javaType) | |
| 173 | + #set ($comment = $column.columnComment) | |
| 174 | + #if ($javaType == "Integer" || $javaType == "Long" || $javaType == "Byte" || $javaType == "Short") | |
| 175 | + #set ($dictMethod = "number") | |
| 176 | + #elseif ($javaType == "String") | |
| 177 | + #set ($dictMethod = "string") | |
| 178 | + #elseif ($javaType == "Boolean") | |
| 179 | + #set ($dictMethod = "boolean") | |
| 180 | + #end | |
| 181 | + #if ($column.htmlType == "input") | |
| 182 | + <Form.Item label="${comment}" name="${javaField}"> | |
| 183 | + <Input | |
| 184 | + v-model:value="queryParams.${javaField}" | |
| 185 | + placeholder="请输入${comment}" | |
| 186 | + allowClear | |
| 187 | + @pressEnter="handleQuery" | |
| 188 | + class="!w-240px" | |
| 189 | + /> | |
| 190 | + </Form.Item> | |
| 191 | + #elseif ($column.htmlType == "select" || $column.htmlType == "radio" || $column.htmlType == "checkbox") | |
| 192 | + <Form.Item label="${comment}" name="${javaField}"> | |
| 193 | + <Select | |
| 194 | + v-model:value="queryParams.${javaField}" | |
| 195 | + placeholder="请选择${comment}" | |
| 196 | + allowClear | |
| 197 | + class="!w-240px" | |
| 198 | + > | |
| 199 | + #if ("" != $dictType)## 设置了 dictType 数据字典的情况 | |
| 200 | + <Select.Option | |
| 201 | + v-for="dict in getDictOptions(DICT_TYPE.$dictType.toUpperCase(), '$dictMethod')" | |
| 202 | + :key="dict.value" | |
| 203 | + :label="dict.label" | |
| 204 | + :value="dict.value" | |
| 205 | + /> | |
| 206 | + #else## 未设置 dictType 数据字典的情况 | |
| 207 | + <Select.Option label="请选择字典生成" value="" /> | |
| 208 | + #end | |
| 209 | + </Select> | |
| 210 | + </Form.Item> | |
| 211 | + #elseif($column.htmlType == "datetime") | |
| 212 | + #if ($column.listOperationCondition != "BETWEEN")## 非范围 | |
| 213 | + <Form.Item label="${comment}" name="${javaField}"> | |
| 214 | + <DatePicker | |
| 215 | + v-model:value="queryParams.${javaField}" | |
| 216 | + valueFormat="YYYY-MM-DD" | |
| 217 | + placeholder="选择${comment}" | |
| 218 | + allowClear | |
| 219 | + class="!w-240px" | |
| 220 | + /> | |
| 221 | + </Form.Item> | |
| 222 | + #else## 范围 | |
| 223 | + <Form.Item label="${comment}" name="${javaField}"> | |
| 224 | + <RangePicker | |
| 225 | + v-model:value="queryParams.${javaField}" | |
| 226 | + v-bind="getRangePickerDefaultProps()" | |
| 227 | + class="!w-220px" | |
| 228 | + /> | |
| 229 | + </Form.Item> | |
| 230 | + #end | |
| 231 | + #end | |
| 232 | + #end | |
| 233 | + #end | |
| 234 | + <Form.Item> | |
| 235 | + <Button class="ml-2" @click="handleQuery" :icon="h(Search)">搜索</Button> | |
| 236 | + <Button class="ml-2" @click="resetQuery" :icon="h(RefreshCw)">重置</Button> | |
| 237 | + <Button | |
| 238 | + class="ml-2" | |
| 239 | + :icon="h(Plus)" | |
| 240 | + type="primary" | |
| 241 | + @click="onCreate" | |
| 242 | + v-access:code="['${permissionPrefix}:create']" | |
| 243 | + > | |
| 244 | + {{ $t('ui.actionTitle.create', ['示例联系人']) }} | |
| 245 | + </Button> | |
| 246 | + <Button | |
| 247 | + :icon="h(Download)" | |
| 248 | + type="primary" | |
| 249 | + class="ml-2" | |
| 250 | + :loading="exportLoading" | |
| 251 | + @click="onExport" | |
| 252 | + v-access:code="['${permissionPrefix}:export']" | |
| 253 | + > | |
| 254 | + {{ $t('ui.actionTitle.export') }} | |
| 255 | + </Button> | |
| 256 | + </Form.Item> | |
| 257 | + </Form> | |
| 258 | + </ContentWrap> | |
| 259 | + | |
| 260 | + <!-- 列表 --> | |
| 261 | + <ContentWrap> | |
| 262 | + <vxe-table :data="list" show-overflow :loading="loading"> | |
| 263 | + ## 特殊:主子表专属逻辑 | |
| 264 | + #if ( $table.templateType == 12 && $subTables && $subTables.size() > 0 ) | |
| 265 | + <!-- 子表的列表 --> | |
| 266 | + <vxe-column type="expand" width="60"> | |
| 267 | + <template #content="{ row }"> | |
| 268 | + <!-- 子表的表单 --> | |
| 269 | + <Tabs v-model:active-key="subTabsName" class="mx-8"> | |
| 270 | + #foreach ($subTable in $subTables) | |
| 271 | + #set ($index = $foreach.count - 1) | |
| 272 | + #set ($subClassNameVar = $subClassNameVars.get($index)) | |
| 273 | + #set ($subSimpleClassName = $subSimpleClassNames.get($index)) | |
| 274 | + #set ($subJoinColumn_strikeCase = $subJoinColumn_strikeCases.get($index)) | |
| 275 | + <Tabs.TabPane key="$subClassNameVar" tab="${subTable.classComment}" force-render> | |
| 276 | + <${subSimpleClassName}List :${subJoinColumn_strikeCase}="row?.id" /> | |
| 277 | + </Tabs.TabPane> | |
| 278 | + #end | |
| 279 | + </Tabs> | |
| 280 | + </template> | |
| 281 | + </vxe-column> | |
| 282 | + #end | |
| 283 | + #foreach($column in $columns) | |
| 284 | + #if ($column.listOperationResult) | |
| 285 | + #set ($dictType=$column.dictType) | |
| 286 | + #set ($javaField = $column.javaField) | |
| 287 | + #set ($AttrName=$column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)}) | |
| 288 | + #set ($comment=$column.columnComment) | |
| 289 | + #if ($column.javaType == "LocalDateTime")## 时间类型 | |
| 290 | + <vxe-column field="${javaField}" title="${comment}" align="center"> | |
| 291 | + <template #default="{row}"> | |
| 292 | + {{formatDateTime(row.${javaField})}} | |
| 293 | + </template> | |
| 294 | + </vxe-column> | |
| 295 | + #elseif($column.dictType && "" != $column.dictType)## 数据字典 | |
| 296 | + <vxe-column field="${javaField}" title="${comment}" align="center"> | |
| 297 | + <template #default="{row}"> | |
| 298 | + <dict-tag :type="DICT_TYPE.$dictType.toUpperCase()" :value="row.${javaField}" /> | |
| 299 | + </template> | |
| 300 | + </vxe-column> | |
| 301 | + #else | |
| 302 | + <vxe-column field="${javaField}" title="${comment}" align="center" /> | |
| 303 | + #end | |
| 304 | + #end | |
| 305 | + #end | |
| 306 | + <vxe-column field="operation" title="操作" align="center"> | |
| 307 | + <template #default="{row}"> | |
| 308 | + <Button | |
| 309 | + size="small" | |
| 310 | + type="link" | |
| 311 | + @click="onEdit(row as any)" | |
| 312 | + v-access:code="['${permissionPrefix}:update']" | |
| 313 | + > | |
| 314 | + {{ $t('ui.actionTitle.edit') }} | |
| 315 | + </Button> | |
| 316 | + <Button | |
| 317 | + size="small" | |
| 318 | + type="link" | |
| 319 | + class="ml-2" | |
| 320 | + @click="onDelete(row as any)" | |
| 321 | + v-access:code="['${permissionPrefix}:delete']" | |
| 322 | + > | |
| 323 | + {{ $t('ui.actionTitle.delete') }} | |
| 324 | + </Button> | |
| 215 | 325 | </template> |
| 216 | - #end | |
| 217 | - <template #toolbar-tools> | |
| 218 | -#if (${table.templateType} == 2)## 树表特有:展开/收缩按钮 | |
| 219 | - <Button @click="toggleExpand" class="mr-2"> | |
| 220 | - {{ isExpanded ? '收缩' : '展开' }} | |
| 221 | - </Button> | |
| 222 | -#end | |
| 223 | - <Button :icon="h(Plus)" type="primary" @click="onCreate" v-access:code="['${table.moduleName}:${simpleClassName_strikeCase}:create']"> | |
| 224 | - {{ $t('ui.actionTitle.create', ['${table.classComment}']) }} | |
| 225 | - </Button> | |
| 226 | - <Button | |
| 227 | - :icon="h(Download)" | |
| 228 | - type="primary" | |
| 229 | - class="ml-2" | |
| 230 | - @click="onExport" | |
| 231 | - v-access:code="['${table.moduleName}:${simpleClassName_strikeCase}:export']" | |
| 232 | - > | |
| 233 | - {{ $t('ui.actionTitle.export') }} | |
| 234 | - </Button> | |
| 235 | - </template> | |
| 236 | - </Grid> | |
| 326 | + </vxe-column> | |
| 327 | + </vxe-table> | |
| 328 | + <!-- 分页 --> | |
| 329 | + <div class="mt-2 flex justify-end"> | |
| 330 | + <Pagination | |
| 331 | + :total="total" | |
| 332 | + v-model:current="queryParams.pageNo" | |
| 333 | + v-model:page-size="queryParams.pageSize" | |
| 334 | + show-size-changer | |
| 335 | + @change="getList" | |
| 336 | + /> | |
| 337 | + </div> | |
| 338 | + </ContentWrap> | |
| 237 | 339 | |
| 238 | 340 | #if ($table.templateType == 11) ## erp情况 |
| 341 | + <ContentWrap> | |
| 239 | 342 | <!-- 子表的表单 --> |
| 240 | - <Tabs v-model:active-key="subTabsName" class="mt-2"> | |
| 343 | + <Tabs v-model:active-key="subTabsName"> | |
| 241 | 344 | #foreach ($subTable in $subTables) |
| 242 | 345 | #set ($index = $foreach.count - 1) |
| 243 | 346 | #set ($subClassNameVar = $subClassNameVars.get($index)) |
| ... | ... | @@ -248,7 +351,7 @@ const [Grid, gridApi] = useVbenVxeGrid({ |
| 248 | 351 | </Tabs.TabPane> |
| 249 | 352 | #end |
| 250 | 353 | </Tabs> |
| 251 | - </div> | |
| 354 | + </ContentWrap> | |
| 252 | 355 | #end |
| 253 | 356 | </Page> |
| 254 | 357 | </template> | ... | ... |