Commit b0f4a252c747fadfda2d2d95b7be3e33f08f3ba7
1 parent
28c818e9
【功能完善】INFRA:代码生成 vben5 antd 树表模版
Showing
2 changed files
with
76 additions
and
13 deletions
yudao-module-infra/yudao-module-infra-biz/src/main/resources/codegen/vue3_vben5_antd/general/views/form.vue.vm
| @@ -5,11 +5,11 @@ import type { Rule } from 'ant-design-vue/es/form'; | @@ -5,11 +5,11 @@ import type { Rule } from 'ant-design-vue/es/form'; | ||
| 5 | import { useVbenModal } from '@vben/common-ui'; | 5 | import { useVbenModal } from '@vben/common-ui'; |
| 6 | import { Tinymce as RichTextarea } from '#/components/tinymce'; | 6 | import { Tinymce as RichTextarea } from '#/components/tinymce'; |
| 7 | import { ImageUpload, FileUpload } from "#/components/upload"; | 7 | import { ImageUpload, FileUpload } from "#/components/upload"; |
| 8 | -import { message, Tabs, Form, Input, Textarea, Select, RadioGroup, Radio, CheckboxGroup, Checkbox, DatePicker } from 'ant-design-vue'; | 8 | +import { message, Tabs, Form, Input, Textarea, Select, RadioGroup, Radio, CheckboxGroup, Checkbox, DatePicker, TreeSelect } from 'ant-design-vue'; |
| 9 | import { DICT_TYPE, getDictOptions } from '#/utils/dict'; | 9 | import { DICT_TYPE, getDictOptions } from '#/utils/dict'; |
| 10 | #if($table.templateType == 2)## 树表需要导入这些 | 10 | #if($table.templateType == 2)## 树表需要导入这些 |
| 11 | import { get${simpleClassName}List } from '#/api/${table.moduleName}/${simpleClassName_strikeCase}'; | 11 | import { get${simpleClassName}List } from '#/api/${table.moduleName}/${simpleClassName_strikeCase}'; |
| 12 | -import { handleTree } from '#/utils/tree'; | 12 | +import { handleTree } from '@vben/utils' |
| 13 | #end | 13 | #end |
| 14 | ## 特殊:主子表专属逻辑 | 14 | ## 特殊:主子表专属逻辑 |
| 15 | #if ( $table.templateType == 10 || $table.templateType == 12 ) | 15 | #if ( $table.templateType == 10 || $table.templateType == 12 ) |
| @@ -90,10 +90,12 @@ const resetForm = () => { | @@ -90,10 +90,12 @@ const resetForm = () => { | ||
| 90 | /** 获得${table.classComment}树 */ | 90 | /** 获得${table.classComment}树 */ |
| 91 | const get${simpleClassName}Tree = async () => { | 91 | const get${simpleClassName}Tree = async () => { |
| 92 | ${classNameVar}Tree.value = [] | 92 | ${classNameVar}Tree.value = [] |
| 93 | - const data = await get${simpleClassName}List() | ||
| 94 | - const root: Tree = { id: 0, name: '顶级${table.classComment}', children: [] } | ||
| 95 | - root.children = handleTree(data, 'id', '${treeParentColumn.javaField}') | ||
| 96 | - ${classNameVar}Tree.value.push(root) | 93 | + const data = await get${simpleClassName}List({}); |
| 94 | + data.unshift({ | ||
| 95 | + id: 0, | ||
| 96 | + name: '顶级${table.classComment}', | ||
| 97 | + }); | ||
| 98 | + ${classNameVar}Tree.value = handleTree(data); | ||
| 97 | } | 99 | } |
| 98 | #end | 100 | #end |
| 99 | 101 | ||
| @@ -205,9 +207,17 @@ const [Modal, modalApi] = useVbenModal({ | @@ -205,9 +207,17 @@ const [Modal, modalApi] = useVbenModal({ | ||
| 205 | v-model:value="formData.${javaField}" | 207 | v-model:value="formData.${javaField}" |
| 206 | :treeData="${classNameVar}Tree" | 208 | :treeData="${classNameVar}Tree" |
| 207 | #if ($treeNameColumn.javaField == "name") | 209 | #if ($treeNameColumn.javaField == "name") |
| 208 | - :fieldNames="defaultProps" | 210 | + :fieldNames="{ |
| 211 | + label: 'name', | ||
| 212 | + value: 'id', | ||
| 213 | + children: 'children', | ||
| 214 | + }" | ||
| 209 | #else | 215 | #else |
| 210 | - :fieldNames="{...defaultProps, label: '$treeNameColumn.javaField'}" | 216 | + :fieldNames="{ |
| 217 | + label: '$treeNameColumn.javaField', | ||
| 218 | + value: 'id', | ||
| 219 | + children: 'children', | ||
| 220 | + }" | ||
| 211 | #end | 221 | #end |
| 212 | checkable | 222 | checkable |
| 213 | treeDefaultExpandAll | 223 | treeDefaultExpandAll |
yudao-module-infra/yudao-module-infra-biz/src/main/resources/codegen/vue3_vben5_antd/general/views/index.vue.vm
| @@ -26,7 +26,7 @@ import { getRangePickerDefaultProps } from '#/utils/date'; | @@ -26,7 +26,7 @@ import { getRangePickerDefaultProps } from '#/utils/date'; | ||
| 26 | import { ref, h, reactive,onMounted,nextTick } from 'vue'; | 26 | import { ref, h, reactive,onMounted,nextTick } from 'vue'; |
| 27 | import { $t } from '#/locales'; | 27 | import { $t } from '#/locales'; |
| 28 | #if (${table.templateType} == 2)## 树表接口 | 28 | #if (${table.templateType} == 2)## 树表接口 |
| 29 | -import { handleTree } from '@/utils/tree' | 29 | +import { handleTree,isEmpty } from '@vben/utils' |
| 30 | import { get${simpleClassName}List, delete${simpleClassName}, export${simpleClassName} } from '#/api/${table.moduleName}/${simpleClassName_strikeCase}'; | 30 | import { get${simpleClassName}List, delete${simpleClassName}, export${simpleClassName} } from '#/api/${table.moduleName}/${simpleClassName_strikeCase}'; |
| 31 | #else## 标准表接口 | 31 | #else## 标准表接口 |
| 32 | import { get${simpleClassName}Page, delete${simpleClassName}, export${simpleClassName} } from '#/api/${table.moduleName}/${simpleClassName_strikeCase}'; | 32 | import { get${simpleClassName}Page, delete${simpleClassName}, export${simpleClassName} } from '#/api/${table.moduleName}/${simpleClassName_strikeCase}'; |
| @@ -42,7 +42,12 @@ const select${simpleClassName} = ref<${simpleClassName}Api.${simpleClassName}>() | @@ -42,7 +42,12 @@ const select${simpleClassName} = ref<${simpleClassName}Api.${simpleClassName}>() | ||
| 42 | #end | 42 | #end |
| 43 | 43 | ||
| 44 | const loading = ref(true) // 列表的加载中 | 44 | const loading = ref(true) // 列表的加载中 |
| 45 | +#if ( $table.templateType == 2 ) | ||
| 46 | +const list = ref<any[]>([]) // 树列表的数据 | ||
| 47 | +#else | ||
| 45 | const list = ref<${simpleClassName}Api.${simpleClassName}[]>([]) // 列表的数据 | 48 | const list = ref<${simpleClassName}Api.${simpleClassName}[]>([]) // 列表的数据 |
| 49 | +#end | ||
| 50 | + | ||
| 46 | ## 特殊:树表专属逻辑(树不需要分页接口) | 51 | ## 特殊:树表专属逻辑(树不需要分页接口) |
| 47 | #if ( $table.templateType != 2 ) | 52 | #if ( $table.templateType != 2 ) |
| 48 | const total = ref(0) // 列表的总页数 | 53 | const total = ref(0) // 列表的总页数 |
| @@ -83,8 +88,7 @@ const getList = async () => { | @@ -83,8 +88,7 @@ const getList = async () => { | ||
| 83 | #end | 88 | #end |
| 84 | ## 特殊:树表专属逻辑(树不需要分页接口) | 89 | ## 特殊:树表专属逻辑(树不需要分页接口) |
| 85 | #if ( $table.templateType == 2 ) | 90 | #if ( $table.templateType == 2 ) |
| 86 | - const data = await get${simpleClassName}List(params) | ||
| 87 | - list.value = handleTree(data, 'id', '${treeParentColumn.javaField}') | 91 | + list.value = await get${simpleClassName}List(params); |
| 88 | #else | 92 | #else |
| 89 | const data = await get${simpleClassName}Page(params) | 93 | const data = await get${simpleClassName}Page(params) |
| 90 | list.value = data.list | 94 | list.value = data.list |
| @@ -97,7 +101,9 @@ const getList = async () => { | @@ -97,7 +101,9 @@ const getList = async () => { | ||
| 97 | 101 | ||
| 98 | /** 搜索按钮操作 */ | 102 | /** 搜索按钮操作 */ |
| 99 | const handleQuery = () => { | 103 | const handleQuery = () => { |
| 104 | +#if ( $table.templateType != 2 ) | ||
| 100 | queryParams.pageNo = 1 | 105 | queryParams.pageNo = 1 |
| 106 | +#end | ||
| 101 | getList() | 107 | getList() |
| 102 | } | 108 | } |
| 103 | 109 | ||
| @@ -163,6 +169,16 @@ try { | @@ -163,6 +169,16 @@ try { | ||
| 163 | const hiddenSearchBar = ref(false); | 169 | const hiddenSearchBar = ref(false); |
| 164 | const tableToolbarRef = ref<InstanceType<typeof TableToolbar>>(); | 170 | const tableToolbarRef = ref<InstanceType<typeof TableToolbar>>(); |
| 165 | const tableRef = ref<VxeTableInstance>(); | 171 | const tableRef = ref<VxeTableInstance>(); |
| 172 | + | ||
| 173 | +#if (${table.templateType} == 2) | ||
| 174 | +/** 切换树形展开/收缩状态 */ | ||
| 175 | +const isExpanded = ref(true); | ||
| 176 | +function toggleExpand() { | ||
| 177 | + isExpanded.value = !isExpanded.value; | ||
| 178 | + tableRef.value?.setAllTreeExpand(isExpanded.value); | ||
| 179 | +} | ||
| 180 | +#end | ||
| 181 | + | ||
| 166 | /** 初始化 */ | 182 | /** 初始化 */ |
| 167 | onMounted(async () => { | 183 | onMounted(async () => { |
| 168 | await getList(); | 184 | await getList(); |
| @@ -270,6 +286,11 @@ onMounted(async () => { | @@ -270,6 +286,11 @@ onMounted(async () => { | ||
| 270 | ref="tableToolbarRef" | 286 | ref="tableToolbarRef" |
| 271 | v-model:hidden-search="hiddenSearchBar" | 287 | v-model:hidden-search="hiddenSearchBar" |
| 272 | > | 288 | > |
| 289 | + #if (${table.templateType} == 2) | ||
| 290 | + <Button @click="toggleExpand" class="mr-2"> | ||
| 291 | + {{ isExpanded ? '收缩' : '展开' }} | ||
| 292 | + </Button> | ||
| 293 | + #end | ||
| 273 | <Button | 294 | <Button |
| 274 | class="ml-2" | 295 | class="ml-2" |
| 275 | :icon="h(Plus)" | 296 | :icon="h(Plus)" |
| @@ -277,7 +298,7 @@ onMounted(async () => { | @@ -277,7 +298,7 @@ onMounted(async () => { | ||
| 277 | @click="onCreate" | 298 | @click="onCreate" |
| 278 | v-access:code="['${permissionPrefix}:create']" | 299 | v-access:code="['${permissionPrefix}:create']" |
| 279 | > | 300 | > |
| 280 | - {{ $t('ui.actionTitle.create', ['示例联系人']) }} | 301 | + {{ $t('ui.actionTitle.create', ['${table.classComment}']) }} |
| 281 | </Button> | 302 | </Button> |
| 282 | <Button | 303 | <Button |
| 283 | :icon="h(Download)" | 304 | :icon="h(Download)" |
| @@ -291,7 +312,21 @@ onMounted(async () => { | @@ -291,7 +312,21 @@ onMounted(async () => { | ||
| 291 | </Button> | 312 | </Button> |
| 292 | </TableToolbar> | 313 | </TableToolbar> |
| 293 | </template> | 314 | </template> |
| 294 | - <vxe-table ref="tableRef" :data="list" show-overflow :loading="loading"> | 315 | + <vxe-table |
| 316 | + ref="tableRef" | ||
| 317 | + :data="list" | ||
| 318 | + #if ( $table.templateType == 2 ) | ||
| 319 | + :tree-config="{ | ||
| 320 | + parentField: '${treeParentColumn.javaField}', | ||
| 321 | + rowField: 'id', | ||
| 322 | + transform: true, | ||
| 323 | + expandAll: true, | ||
| 324 | + reserve: true, | ||
| 325 | + }" | ||
| 326 | + #end | ||
| 327 | + show-overflow | ||
| 328 | + :loading="loading" | ||
| 329 | + > | ||
| 295 | ## 特殊:主子表专属逻辑 | 330 | ## 特殊:主子表专属逻辑 |
| 296 | #if ( $table.templateType == 12 && $subTables && $subTables.size() > 0 ) | 331 | #if ( $table.templateType == 12 && $subTables && $subTables.size() > 0 ) |
| 297 | <!-- 子表的列表 --> | 332 | <!-- 子表的列表 --> |
| @@ -330,6 +365,8 @@ onMounted(async () => { | @@ -330,6 +365,8 @@ onMounted(async () => { | ||
| 330 | <dict-tag :type="DICT_TYPE.$dictType.toUpperCase()" :value="row.${javaField}" /> | 365 | <dict-tag :type="DICT_TYPE.$dictType.toUpperCase()" :value="row.${javaField}" /> |
| 331 | </template> | 366 | </template> |
| 332 | </vxe-column> | 367 | </vxe-column> |
| 368 | + #elseif ($table.templateType == 2 && $javaField == $treeNameColumn.javaField) | ||
| 369 | + <vxe-column field="${javaField}" title="${comment}" align="center" tree-node/> | ||
| 333 | #else | 370 | #else |
| 334 | <vxe-column field="${javaField}" title="${comment}" align="center" /> | 371 | <vxe-column field="${javaField}" title="${comment}" align="center" /> |
| 335 | #end | 372 | #end |
| @@ -337,6 +374,16 @@ onMounted(async () => { | @@ -337,6 +374,16 @@ onMounted(async () => { | ||
| 337 | #end | 374 | #end |
| 338 | <vxe-column field="operation" title="操作" align="center"> | 375 | <vxe-column field="operation" title="操作" align="center"> |
| 339 | <template #default="{row}"> | 376 | <template #default="{row}"> |
| 377 | +#if ( $table.templateType == 2 ) | ||
| 378 | + <Button | ||
| 379 | + size="small" | ||
| 380 | + type="link" | ||
| 381 | + @click="onAppend(row as any)" | ||
| 382 | + v-access:code="['${permissionPrefix}:create']" | ||
| 383 | + > | ||
| 384 | + 新增下级 | ||
| 385 | + </Button> | ||
| 386 | +#end | ||
| 340 | <Button | 387 | <Button |
| 341 | size="small" | 388 | size="small" |
| 342 | type="link" | 389 | type="link" |
| @@ -348,7 +395,11 @@ onMounted(async () => { | @@ -348,7 +395,11 @@ onMounted(async () => { | ||
| 348 | <Button | 395 | <Button |
| 349 | size="small" | 396 | size="small" |
| 350 | type="link" | 397 | type="link" |
| 398 | + danger | ||
| 351 | class="ml-2" | 399 | class="ml-2" |
| 400 | + #if ( $table.templateType == 2 ) | ||
| 401 | + :disabled="!isEmpty(row?.children)" | ||
| 402 | + #end | ||
| 352 | @click="onDelete(row as any)" | 403 | @click="onDelete(row as any)" |
| 353 | v-access:code="['${permissionPrefix}:delete']" | 404 | v-access:code="['${permissionPrefix}:delete']" |
| 354 | > | 405 | > |
| @@ -357,6 +408,7 @@ onMounted(async () => { | @@ -357,6 +408,7 @@ onMounted(async () => { | ||
| 357 | </template> | 408 | </template> |
| 358 | </vxe-column> | 409 | </vxe-column> |
| 359 | </vxe-table> | 410 | </vxe-table> |
| 411 | +#if ( $table.templateType != 2 ) | ||
| 360 | <!-- 分页 --> | 412 | <!-- 分页 --> |
| 361 | <div class="mt-2 flex justify-end"> | 413 | <div class="mt-2 flex justify-end"> |
| 362 | <Pagination | 414 | <Pagination |
| @@ -367,6 +419,7 @@ onMounted(async () => { | @@ -367,6 +419,7 @@ onMounted(async () => { | ||
| 367 | @change="getList" | 419 | @change="getList" |
| 368 | /> | 420 | /> |
| 369 | </div> | 421 | </div> |
| 422 | +#end | ||
| 370 | </ContentWrap> | 423 | </ContentWrap> |
| 371 | 424 | ||
| 372 | #if ($table.templateType == 11) ## erp情况 | 425 | #if ($table.templateType == 11) ## erp情况 |