From 10e01aa71d494ece26214bd57017e045f13b2a08 Mon Sep 17 00:00:00 2001 From: zhengyiming <540361168@qq.com> Date: 星期三, 06 八月 2025 09:12:34 +0800 Subject: [PATCH] fix: 修改功能模块 --- src/views/System/ModuleManage.vue | 343 ++++++++++++++++++++++++++++++++++---------------------- 1 files changed, 206 insertions(+), 137 deletions(-) diff --git a/src/views/System/ModuleManage.vue b/src/views/System/ModuleManage.vue index a0bedc2..5a20161 100644 --- a/src/views/System/ModuleManage.vue +++ b/src/views/System/ModuleManage.vue @@ -3,10 +3,26 @@ <AppContainer> <ProTableQueryFilterBar @on-reset="handleReset"> <template #query> + <QueryFilterItem> + <FieldRadio + v-model="state.clientType" + :value-enum="EnumClientTypeText" + buttonStyle + @change="getAllModule()" + /> + </QueryFilterItem> + <QueryFilterItem> + <FieldRadio + v-model="state.userType" + :value-enum="EnumUserTypeText" + buttonStyle + @change="getAllModule()" + /> + </QueryFilterItem> <div class="query-filter-list-item"> <SearchInput v-model="state.searchValue" - placeholder="瑙掕壊鍚嶇О" + placeholder="鑿滃崟鍚嶇О" @on-click-search="handleSearch" @keyup.enter="handleSearch()" > @@ -45,19 +61,19 @@ </template> <template v-else-if="column.property === 'isMenu'"> <el-switch - v-model="row.isMenu" + :modelValue="row.type === EnumMenuType.Menu" + :onUpdate:modelValue="(v: boolean) =>{ + row.type=v?EnumMenuType.Menu:EnumMenuType.Page + }" inline-prompt - :active-value="1" - :inactive-value="0" - @change="(v: number) => handleChangeStatus(v, row, 'isMenu')" + @change="(v: boolean) => handleChangeStatus(v, row, 'isMenu')" ></el-switch> </template> <template v-else-if="column.property === 'enabledMark'"> <el-switch - v-model="row.enabledMark" - :active-value="1" - :inactive-value="0" - @change="(v: number) => handleChangeStatus(v, row, 'enabledMark')" + :modelValue="!row.isDisabled" + :onUpdate:modelValue="(v: boolean) => row.isDisabled =!v" + @change="(v: boolean) => handleChangeStatus(v, row, 'enabledMark')" ></el-switch> </template> </template> @@ -94,16 +110,29 @@ LoadingLayout, OperationBtnType, SearchInput, + QueryFilterItem, + FieldRadio, } from '@bole-core/components'; -import * as baseModuleServices from '@/services/api/BaseModule'; -import { ModuleUtils, TreeModuleDtoGroupDto, Message, TreeStore } from '@/utils'; +import { ModuleUtils, TreeModuleDtoGroupDto, Message, TreeStore, flattenTree } from '@/utils'; import { TableInstance } from 'element-plus'; -import { SubModuleType, SubModuleTitle, SubModuleKey, FastBtn, ModuleColumns } from '@/constants'; +import { + SubModuleType, + SubModuleTitle, + SubModuleKey, + FastBtn, + ModuleColumns, + EnumMenuType, + EnumClientTypeText, + EnumUserTypeText, +} from '@/constants'; import SubModuleEditDrawer from './components/SubModuleEditDrawer.vue'; import AddOrEditModuleDialog from './components/AddOrEditModuleDialog.vue'; import { useDebounceFn } from '@vueuse/core'; import _ from 'lodash'; import { useReset } from '@bole-core/core'; +import * as menuServices from '@/services/api/menu'; +import { DrawerTableDataItem } from './types'; + defineOptions({ name: 'ModuleManage', }); @@ -173,6 +202,9 @@ const BaseState = { loading: true, searchValue: '', + group: 'default', + userType: EnumUserType.Operation, + clientType: EnumClientType.PcWeb, }; const state = reactive({ ...BaseState }); const moduleTreeStore = ref<TreeStore<TreeModuleDtoGroupDto>>(); @@ -189,8 +221,8 @@ sortCode: 0, path: '', isCache: true, - isMenu: 1, - enabledMark: 1, + isMenu: true, + enabledMark: true, showCacheSelect: false, showIconSelect: false, showSubMenuIconSelect: false, @@ -198,13 +230,14 @@ title: '', }; const editForm = reactive({ ...BaseFormData }); -const currentDialogModule = ref<TreeModuleDtoGroupDto>({}); +const currentDialogModule = ref<API.GetMenuQueryResult>({}); //drawer const drawerVisible = ref(false); -const currentDrawerModule = ref<TreeModuleDtoGroupDto>({}); +const currentDrawerModule = ref<API.GetMenuQueryResult>({}); + const drawerState = reactive<{ type: SubModuleType; - tableData: ValueOf<API.AllSubModule>; + tableData: DrawerTableDataItem[]; }>({ type: SubModuleType.PageButton, tableData: [], @@ -215,35 +248,53 @@ }); async function getAllModule() { try { - let res = await baseModuleServices.getAllModuleList({ - showLoading: !state.loading, - }); - const treeStore = ModuleUtils.convertToModuleGroup(res); + let res = await menuServices.getMenus( + { + userType: state.userType, + clientType: state.clientType, + }, + { + showLoading: false, + } + ); + const treeStore = ModuleUtils.convertToModuleGroup(flattenTree(res)); moduleTreeStore.value = treeStore; originModuleTree.value = [...treeStore.data]; } catch (error) {} } type StatusEventType = { isCache: boolean; - isMenu: number; - enabledMark: number; + isMenu: boolean; + enabledMark: boolean; }; async function handleChangeStatus<T extends keyof StatusEventType>( - value: StatusEventType[T], + value: boolean, data: TreeModuleDtoGroupDto, statusType: T ) { try { - let params = { - ..._.omit(data, ['children', 'parentNode']), - [statusType]: value, + let params: API.SetMenuSwitchCommand = { + ids: [data.id], + type: data.type, + isDisabled: data.isDisabled, + isCache: data.isCache, }; - await baseModuleServices.addOrEditModule(params); - } catch (error) { - Message.errorMessage('鎿嶄綔澶辫触'); - } + if (statusType === 'isMenu') { + params.type = value ? EnumMenuType.Menu : EnumMenuType.Page; + } else if (statusType === 'isCache') { + params.isCache = value; + } else { + params.isDisabled = !value; + } + await menuServices.setMenuSwitch(params); + } catch (error) {} } -function openDialog(options: { + +async function getMenu(id: string) { + return await menuServices.getMenu({ id: id }); +} + +async function openDialog(options: { module?: TreeModuleDtoGroupDto; showCacheSelect: boolean; showIconSelect: boolean; @@ -252,46 +303,48 @@ parentId: string; baseSortCode?: number; }) { - const { - module, - showCacheSelect, - showIconSelect, - showSubMenuIconSelect, - showParentSelect, - parentId, - baseSortCode, - } = options; - if (module) { - currentDialogModule.value = module; - useSetReactive(editForm, { - title: `${module.name}缂栬緫`, - enCode: module.enCode, - name: module.name, - icon: module.icon, - sortCode: module.sortCode, - path: module.path, - isMenu: module.isMenu, - enabledMark: module.enabledMark, - parentId: parentId, + try { + const { + module, showCacheSelect, showIconSelect, showSubMenuIconSelect, showParentSelect, - isCache: module.isCache, - }); - } else { - currentDialogModule.value = {}; - useSetReactive(editForm, BaseFormData, { - title: '鏂板鍔熻兘妯″潡', - parentId: parentId, - showCacheSelect, - showIconSelect, - showSubMenuIconSelect, - showParentSelect, - sortCode: baseSortCode, - }); - } - editDialogFormVisible.value = true; + parentId, + baseSortCode, + } = options; + if (module) { + currentDialogModule.value = await getMenu(module.id); + useSetReactive(editForm, { + title: `${module.name}缂栬緫`, + enCode: module.code, + name: module.name, + icon: module.icon, + sortCode: module.sort, + path: module.url, + isMenu: module.type == EnumMenuType.Menu, + enabledMark: !module.isDisabled, + parentId: parentId, + showCacheSelect, + showIconSelect, + showSubMenuIconSelect, + showParentSelect, + isCache: module.isCache, + }); + } else { + currentDialogModule.value = {}; + useSetReactive(editForm, BaseFormData, { + title: '鏂板鍔熻兘妯″潡', + parentId: parentId, + showCacheSelect, + showIconSelect, + showSubMenuIconSelect, + showParentSelect, + sortCode: baseSortCode, + }); + } + editDialogFormVisible.value = true; + } catch (error) {} } function handleAddOrEditRootModule(module?: TreeModuleDtoGroupDto) { const showCacheSelect = false; @@ -341,16 +394,17 @@ } async function handleAddOrEditModule() { try { - let params: API.ModuleDto = { - enCode: editForm.enCode, + let params: API.SaveMenuCommand = { + userType: state.userType, + clientType: state.clientType, + code: editForm.enCode, name: editForm.name, - sortCode: editForm.sortCode, - path: editForm.path, - // isCache: true, - isMenu: editForm.isMenu, - enabledMark: editForm.enabledMark, + type: editForm.isMenu ? EnumMenuType.Menu : EnumMenuType.Page, + visitLevel: EnumMenuVisitLevel.NeedPower, icon: editForm.icon, - // parentId:, + url: editForm.path, + isDisabled: !editForm.enabledMark, + sort: editForm.sortCode, }; if (editForm.showCacheSelect) { params.isCache = editForm.isCache; @@ -360,8 +414,9 @@ } if (currentDialogModule.value.id) { params.id = currentDialogModule.value.id; + params.groups = currentDialogModule.value.groups; } - const res = await baseModuleServices.addOrEditModule(params); + const res = await saveMenu(params); if (res) { Message.successMessage('淇濆瓨鎴愬姛'); getAllModule(); @@ -370,28 +425,57 @@ } catch (e) {} } +async function saveMenu(params: API.SaveMenuCommand) { + try { + const res = await menuServices.saveMenu(params); + return res; + } catch (error) {} +} + async function handleDelete(module: TreeModuleDtoGroupDto) { try { await Message.deleteMessage(); - const res = await baseModuleServices.deleteModule({ id: module.id }); + const res = await menuServices.deleteMenu({ ids: [module.id] }); if (res) { Message.successMessage('鍒犻櫎鎴愬姛'); getAllModule(); } } catch (error) {} } -function openDrawer(module: TreeModuleDtoGroupDto, type: SubModuleType) { - drawerState.type = type; - currentDrawerModule.value = module; - getBaseModuleGetAllSubModule(module, type); +async function openDrawer(module: TreeModuleDtoGroupDto, type: SubModuleType) { + try { + drawerState.type = type; + getBaseModuleGetAllSubModule(module, type); + } catch (error) {} } async function getBaseModuleGetAllSubModule(module: TreeModuleDtoGroupDto, type: SubModuleType) { try { - let params = { - moduleId: module.id, - }; - const res = await baseModuleServices.getAllSubModule(params); - drawerState.tableData = res[SubModuleKey[type]]; + const menu = await getMenu(module.id); + currentDrawerModule.value = menu; + const currentGroup = menu.groups.find((g) => g.group === state.group) ?? {}; + if (type === SubModuleType.Column) { + drawerState.tableData = (currentGroup.fields ?? []).map((f) => ({ + enCode: f.code, + name: f.name, + sortCode: f.sort, + width: f.width, + isEdit: false, + isShow: false, + id: f.id, + })); + } else { + drawerState.tableData = ( + currentGroup.buttonLocations?.find((b) => b.location === SubModuleKey[type])?.buttons ?? [] + ).map((b) => ({ + enCode: b.code, + name: b.name, + sortCode: b.sort, + width: b.width, + isEdit: false, + isShow: false, + id: b.id, + })); + } drawerVisible.value = true; } catch (error) {} } @@ -401,10 +485,10 @@ enCode: '', name: '', sortCode: sortCode, - width: 0, + width: 0 as any as string, isEdit: true, - apiName: '', - realColumn: '', + // apiName: '', + // realColumn: '', isShow: true, }; drawerState.tableData?.push(baseData); @@ -420,13 +504,13 @@ enCode: key, name: '', sortCode: sortCode + index, - width: 0, + width: 0 as any as string, isEdit: true, })); drawerState.tableData?.push(...baseDataList); } function handleAddFastBtn(fastBtn: FastBtn) { - let subModule: API.ModuleButtonDto | API.ModuleColumnDto = { + let subModule: DrawerTableDataItem = { enCode: fastBtn.enCode, name: fastBtn.name, sortCode: getDefaultSortCode(), @@ -437,37 +521,29 @@ } handleSaveSubModule(subModule); } -async function handleSaveSubModule(subModule: API.ModuleButtonDto | API.ModuleColumnDto) { +async function handleSaveSubModule(subModule: DrawerTableDataItem) { try { - let params = { - moduleId: currentDrawerModule.value.id, - enCode: subModule.enCode, + let params: API.SaveMenuFieldCommand = { + parentId: currentDrawerModule.value.id, + code: subModule.enCode, name: subModule.name, - sortCode: subModule.sortCode, + group: state.group, + // location: 'string', + width: subModule.width, + sort: subModule.sortCode, }; if (subModule.id) { - //@ts-ignore params.id = subModule.id; } if (drawerState.type === SubModuleType.Column) { - const _subModule = subModule as API.ModuleColumnDto; - params = { - ...params, - //@ts-ignore - width: _subModule.width, - apiName: _subModule.apiName, - realColumn: _subModule.realColumn, - isShow: _subModule.isShow, - }; } else { - //@ts-ignore - params.buttonType = drawerState.type; + params.location = SubModuleKey[drawerState.type]; } let res = null; if (drawerState.type === SubModuleType.Column) { - res = await baseModuleServices.addOrEditModuleColumn(params); + res = await menuServices.saveMenuField(params); } else { - res = await baseModuleServices.addOrEditModuleButton(params); + res = await menuServices.saveMenuButton(params); } if (res) { getBaseModuleGetAllSubModule(currentDrawerModule.value, drawerState.type); @@ -478,28 +554,24 @@ async function handelBatchSaveColumn() { try { if (drawerState.type === SubModuleType.Column) { - let columnModuleList = drawerState.tableData as (API.ModuleColumnDto & { isEdit: boolean })[]; //.filter((d) => d.isEdit); + let columnModuleList = drawerState.tableData; //.filter((d) => d.isEdit); if (columnModuleList.length > 0) { - let params = columnModuleList.map((columnModule) => { - let columnItem = { - moduleId: currentDrawerModule.value.id, - enCode: columnModule.enCode, - name: columnModule.name, - sortCode: columnModule.sortCode, - apiName: columnModule.apiName, - realColumn: columnModule.realColumn, - isShow: columnModule.isShow, - width: columnModule.width, - }; - if (columnModule.id) { - //@ts-ignore - columnItem.id = columnModule.id; + const groups = currentDrawerModule.value.groups.map((group) => { + if (group.group === state.group) { + group.fields = columnModuleList.map((c) => ({ + code: c.enCode, + name: c.name, + width: c.width, + sort: c.sortCode, + })); } - return columnItem; + return group; }); - let res = await baseModuleServices.addModuleColumnList(params, { - getResponse: true, - }); + let params: API.SaveMenuCommand = { + ...currentDrawerModule.value, + groups: groups, + }; + const res = await saveMenu(params); if (res) { getBaseModuleGetAllSubModule(currentDrawerModule.value, drawerState.type); Message.successMessage('淇濆瓨鎴愬姛'); @@ -509,15 +581,12 @@ } catch (error) {} } -async function handleDeleteSubModule(subModule: API.ModuleButtonDto | API.ModuleColumnDto) { +async function handleDeleteSubModule(subModule: DrawerTableDataItem) { try { await Message.deleteMessage(); - let res = null; - if (drawerState.type === SubModuleType.Column) { - res = await baseModuleServices.deleteModuleColumn({ id: subModule.id }); - } else { - res = await baseModuleServices.deleteModuleButton({ id: subModule.id }); - } + let res = await menuServices.deleteMenu({ + ids: [subModule.id], + }); if (res) { Message.successMessage('鍒犻櫎鎴愬姛'); getBaseModuleGetAllSubModule(currentDrawerModule.value, drawerState.type); -- Gitblit v1.9.1