From 699754c90264ee62e47229af4cc63b01d82bfdbb Mon Sep 17 00:00:00 2001 From: duyufeng Date: Fri, 30 Aug 2024 10:25:42 +0800 Subject: [PATCH] =?UTF-8?q?=E8=8F=9C=E5=8D=95=E5=8A=A8=E6=80=81=E8=B7=AF?= =?UTF-8?q?=E7=94=B1=E5=8F=8A=E5=A4=B4=E9=83=A8=E8=A7=92=E8=89=B2=E5=88=87?= =?UTF-8?q?=E6=8D=A2=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hx-ai-intelligent/src/config/app.config.ts | 85 +++++++++++++------ hx-ai-intelligent/src/router/dynamicRoute.ts | 44 ++++++++++ hx-ai-intelligent/src/util/dynamicRoutes.ts | 98 ++++++++++++++++++++++ .../systemManage/systemMenu/editSystemMenu.vue | 9 +- lib/paas/store/index.ts | 2 + lib/saas/store/modules/route.ts | 2 + lib/saas/view/system/layout/tags.vue | 22 ++--- lib/saas/view/system/login.vue | 15 +++- lib/util/dynamicRoutesss.ts | 25 ++++++ package.json | 1 + 10 files changed, 262 insertions(+), 41 deletions(-) create mode 100644 hx-ai-intelligent/src/router/dynamicRoute.ts create mode 100644 hx-ai-intelligent/src/util/dynamicRoutes.ts create mode 100644 lib/util/dynamicRoutesss.ts diff --git a/hx-ai-intelligent/src/config/app.config.ts b/hx-ai-intelligent/src/config/app.config.ts index 2a80768..41bd1f6 100644 --- a/hx-ai-intelligent/src/config/app.config.ts +++ b/hx-ai-intelligent/src/config/app.config.ts @@ -3,14 +3,19 @@ import { permission } from '/@/api/origanizemanage'; import { appConfigStore } from '/nerv-lib/saas/store/modules/app-config'; import { authorizationService } from '/nerv-base/store/modules/authorization-service'; import { get } from 'lodash-es'; -import { computed, ref, toRef } from 'vue'; +import { computed, ref, toRef} from 'vue'; -const ORGID = sessionStorage.getItem('ORGID') ? Number(sessionStorage.getItem('ORGID')) : ''; -const isAdmin = sessionStorage.getItem('ISADMIN') - ? Boolean(sessionStorage.getItem('ISADMIN')) - : false; -const selectDefaultValue = ref(ORGID); -const selectDefaultDisabled = ref(isAdmin); +import { router } from '/nerv-lib/saas/router'; +import { replyRoutesButton } from '/@/util/dynamicRoutes'; +import { replyDynamRoutesPath } from '/nerv-lib/util/dynamicRoutesss'; +import { useTags } from '/nerv-base/store/modules/tags'; + +const ROLEID = sessionStorage.getItem('ROLEID') ? Number(sessionStorage.getItem('ROLEID')) : ''; +// const isAdmin = sessionStorage.getItem('ISADMIN') +// ? Boolean(sessionStorage.getItem('ISADMIN')) +// : false; +const selectDefaultValue = ref(ROLEID); +// const selectDefaultDisabled = ref(isAdmin); const transform = (data, map) => { return Object.keys(map).reduce((pre, cur) => { pre[cur] = data[map[cur]]; @@ -46,22 +51,25 @@ export const appConfig = { api: '/carbon-smart/user/login/logInInfo', size: 'large', defaultValue: selectDefaultValue, - disabled: selectDefaultDisabled, + disabled:false, + // disabled: selectDefaultDisabled, // autoSelectFirst: true, placeholder: '请选择', - onSelect: async (cur, record) => { - console.log(cur, record); + onSelect: async (cur:any, record:any) => { const configStore = appConfigStore(); const useAuthorization = authorizationService(); sessionStorage.setItem('ORGID', record.orgId); + sessionStorage.setItem('ROLEID', record.roleId); const res = await configStore.userResource({ data: record }); useAuthorization.updateUserResource(res.data); - window.location.reload(); + setTimeout(() => { + window.location.reload(); + }, 200); // value.value = cur; }, - resultField: 'data.linkList', + resultField: 'data.userRoles', labelField: 'orgName', - valueField: 'orgId', + valueField: 'roleId', immediate: true, dropdownReload: true, }, @@ -71,15 +79,33 @@ export const appConfig = { return http.post('/carbon-smart/user/login', { ...params }); }, userResourceApi: (params) => { - const { orgId } = get(params, 'data') || { orgId: '' }; - const finalId = orgId || ORGID; + const { roleId } = get(params, 'data') || { roleId: '' }; + const finalId = roleId || ROLEID; // 解决初始化登录select无初始值的问题 selectDefaultValue.value = finalId; - const userInfo = JSON.parse(sessionStorage.getItem(import.meta.env.VITE_PUBLIC_PATH)!); - const ownOrgInfo = userInfo.linkList?.filter(({ orgId: id }) => id === finalId)[0]; - - return http.post('/carbon-smart/user/login/logInPermission', ownOrgInfo).then((res) => { + // const userInfo = JSON.parse(sessionStorage.getItem(import.meta.env.VITE_PUBLIC_PATH)!); + // const ownOrgInfo = userInfo.userRoles?.filter(({ roleId: id }) => id === finalId)[0]; + // return http.post('/carbon-smart/user/login/logInPermission', ownOrgInfo).then((res) => { + // return res; + // }); + // 切换角色时获取新的权限菜单 + return http.post('/carbon-smart/user/login/role/permission/'+finalId).then((res) => { + //切换后重新处理动态菜单数据 + let resetDynamicRouteList = replyRoutesButton(res.data); + sessionStorage.setItem("dynamicRouteList",JSON.stringify(resetDynamicRouteList)); + if(resetDynamicRouteList && resetDynamicRouteList.length>0){ + let addDynamicRoutes = replyDynamRoutesPath(resetDynamicRouteList); + addDynamicRoutes.forEach(item => { + if (item.children && !item.component) { + item.component = () => import('/nerv-lib/saas/view/system/application.vue');//hx-ai-intelligent项目下的首页 + } + router.addRoute(item); + }) + } + //删除所有已经打开的tag标签 + useTags().clearTags(); + router.replace({ name: 'home' }); return res; }); }, @@ -96,16 +122,25 @@ export const appConfig = { linkList: 'linkList', permissionVos: 'permissionVos', adminFlag: 'adminFlag', + userRoles:'userRoles', }); sessionStorage.setItem('ORGID', info.orgId); sessionStorage.setItem('LINKLIST', JSON.stringify(info.linkList)); - sessionStorage.setItem('ISADMIN', trD?.adminFlag === '1'); - selectDefaultDisabled.value = info?.adminFlag === '1'; - selectDefaultValue.value = info.orgId; - return { data: { ...trD } }; - }); + // 头部“企业角色”切换暂不需要以下屏蔽的两个参数 + // sessionStorage.setItem('ISADMIN', trD?.adminFlag === '1'); + // selectDefaultDisabled.value = info?.adminFlag === '1'; + if(info.userRoles && info.userRoles.length>0){ + sessionStorage.setItem('ROLEID', info.userRoles[0].roleId); + sessionStorage.setItem('USERROLES', JSON.stringify(info.userRoles)); + selectDefaultValue.value = info.userRoles[0].roleId; + //路由接口数据暂时组装 + let getRoutesList = replyRoutesButton(info.userRoles[0].routes); + sessionStorage.setItem("dynamicRouteList",JSON.stringify(getRoutesList)) + sessionStorage.setItem("isRefrech",'1') + } + return { data: { ...trD } }; + }); }, - useHistoryTag: false, // 修改密码配置 updatePassWordInfo: { diff --git a/hx-ai-intelligent/src/router/dynamicRoute.ts b/hx-ai-intelligent/src/router/dynamicRoute.ts new file mode 100644 index 0000000..99f34a3 --- /dev/null +++ b/hx-ai-intelligent/src/router/dynamicRoute.ts @@ -0,0 +1,44 @@ +const sessionStoreRoute = sessionStorage.getItem("dynamicRouteList"); +let getDynamicRouteList = sessionStoreRoute?JSON.parse(sessionStoreRoute):[]; +let dynamicRoute:any = []; +// getDynamicRouteList.map(itemRouter => { +// if(itemRouter.children && itemRouter.children.length > 0){ +// itemRouter.children.map(childRoute => { +// let modulePath0 = childRoute.component; +// childRoute.component = () => new Function(`return import('/nerv-lib/saas/view/${modulePath0}')`)();///nerv-lib/saas/view/ +// if(childRoute.children && childRoute.children.length > 0){ +// childRoute.children.map(child2=>{ +// let modulePath = child2.component; +// child2.component = () => new Function(`return import('/@/view/${modulePath}')`)();///@/view/ +// }) +// }else{//如没有下一级菜单代表是一级,重新处理一级菜单路由 +// childRoute.component = () => new Function(`return import('/@/view/${modulePath0}')`)(); +// } +// }) +// } +// dynamicRoute.push(itemRouter) +// }) +getDynamicRouteList.forEach(itemRouter => { + if (itemRouter.children && itemRouter.children.length > 0) { + itemRouter.children.forEach(childRoute => { + const modulePath0 = childRoute.component; + // 修改 component 属性 + // childRoute.component = () => import(`/nerv-lib/saas/view/${modulePath0}`).then(mod => mod.default); + childRoute.component = () => new Function(`return import('/nerv-lib/saas/view/${modulePath0}')`)(); + + if (childRoute.children && childRoute.children.length > 0) { + childRoute.children.forEach(child2 => { + const modulePath = child2.component; + // 修改 component 属性 + // child2.component = /* @vite-ignore */ () => import(`/@/view/${modulePath}`).then(mod => mod.default); + child2.component = () => new Function(`return import('/@/view/${modulePath}')`)(); + }); + } else { // 如果没有下一级菜单代表是一级,重新处理一级菜单路由 + // childRoute.component = /* @vite-ignore */ () => import(`/@/view/${modulePath0}`).then(mod => mod.default); + childRoute.component = () => new Function(`return import('/@/view/${modulePath0}')`)(); + } + }); + } + dynamicRoute.push(itemRouter); +}); +export default dynamicRoute; \ No newline at end of file diff --git a/hx-ai-intelligent/src/util/dynamicRoutes.ts b/hx-ai-intelligent/src/util/dynamicRoutes.ts new file mode 100644 index 0000000..fea4dbb --- /dev/null +++ b/hx-ai-intelligent/src/util/dynamicRoutes.ts @@ -0,0 +1,98 @@ +/***公共方法==>处理动态路由数据 将“按钮”部分的数据追加到meta中*/ +//处理路由按钮,存放在meta中 +export const replyRoutesButton = (data:any) => { + if(!data) return; + return data.map(item => { + if(item.children && item.children.length > 0){ + item.meta.operates = []; + item.children.map(itemChild => { + if(itemChild.type=="3"){ + let operateObj = {title:'',code:''}; + operateObj.title = itemChild.meta.title; + operateObj.code = itemChild.name; + item.meta.operates.push(operateObj); + item.children = item.children.filter(its => its.name != itemChild.name); + } + }) + if(item.meta.operates.length == 0){ + delete item.meta.operates; + } + return { + ...item, + children: replyRoutesButton(item.children), + }; + } + + return item; + }); +}; +// //处理路由compontent路径 +// export const replyRoutesPath = (itemRouter:any) => { +// if (itemRouter.children && itemRouter.children.length > 0) { +// itemRouter.children.forEach(childRoute => { +// const modulePath0 = childRoute.component; +// // 修改 component 属性 +// // childRoute.component = () => import(`/nerv-lib/saas/view/${modulePath0}`).then(mod => mod.default); +// childRoute.component = () => new Function(`return import('/nerv-lib/saas/view/${modulePath0}')`)(); + +// if (childRoute.children && childRoute.children.length > 0) { +// childRoute.children.forEach(child2 => { +// const modulePath = child2.component; +// // 修改 component 属性 +// // child2.component = /* @vite-ignore */ () => import(`/@/view/${modulePath}`).then(mod => mod.default); +// child2.component = () => new Function(`return import('/@/view/${modulePath}')`)(); +// }); +// } else { // 如果没有下一级菜单代表是一级,重新处理一级菜单路由 +// // childRoute.component = /* @vite-ignore */ () => import(`/@/view/${modulePath0}`).then(mod => mod.default); +// childRoute.component = () => new Function(`return import('/@/view/${modulePath0}')`)(); +// } +// }); +// } +// return itemRouter; +// } + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/hx-op/src/view/systemManage/systemMenu/editSystemMenu.vue b/hx-op/src/view/systemManage/systemMenu/editSystemMenu.vue index d1b5bb2..bf2f96e 100644 --- a/hx-op/src/view/systemManage/systemMenu/editSystemMenu.vue +++ b/hx-op/src/view/systemManage/systemMenu/editSystemMenu.vue @@ -106,7 +106,7 @@ const componentIsshow = ref(false);//前端组件是否显示 const redirectIsshow = ref(true);//重定向路由是否显示 const keepAliveIsshow = ref(false);//缓存是否显示 - const hideChildrenIsshow = ref(false);//是否隐藏子级是否显示 + const hideChildrenIsshow = ref(true);//是否隐藏子级是否显示 interface FormState { menuName: string; previousMenu:string; @@ -183,7 +183,7 @@ componentIsshow.value = false; redirectIsshow.value = true; keepAliveIsshow.value = false; - hideChildrenIsshow.value = false; + hideChildrenIsshow.value = true; }else if(currentType==2){//二级菜单 menuNameIsshow.value = true; preMenuIsshow.value = true; @@ -244,6 +244,7 @@ } if(menuRadioType.value==1){ params.pid = currentLineData.value?currentLineData.value.pid:"root";//一级菜单pid,传'root' + params.hideChildren = formState.value.hideChildren;//是否隐藏子级 } if(addOrEditType.value==1){//新增 http.post(menuS.queryMenuPageAdd, params).then(() => { @@ -312,7 +313,9 @@ menuCode:'', type:'', menuJumpUrl:'', - menuRedirect:'' + menuRedirect:'', + keepAlive:false, + hideChildren:false }; }else if(type==2){//编辑 drawerTitele.value = '编辑菜单'; diff --git a/lib/paas/store/index.ts b/lib/paas/store/index.ts index ddefcf4..7c19ce2 100644 --- a/lib/paas/store/index.ts +++ b/lib/paas/store/index.ts @@ -1,6 +1,8 @@ import type { App } from 'vue'; import { createPinia } from 'pinia'; const store = createPinia(); +// import piniaPluginPersistedstate from 'pinia-plugin-persistedstate' +// store.use(piniaPluginPersistedstate) export function setupStore(app: App) { app.use(store); diff --git a/lib/saas/store/modules/route.ts b/lib/saas/store/modules/route.ts index 753d410..6da2daf 100644 --- a/lib/saas/store/modules/route.ts +++ b/lib/saas/store/modules/route.ts @@ -135,4 +135,6 @@ export const useRouteStore = defineStore({ }); }, }, + // //开启数据缓存 + // persist:true, }); diff --git a/lib/saas/view/system/layout/tags.vue b/lib/saas/view/system/layout/tags.vue index cb0283f..de6976c 100644 --- a/lib/saas/view/system/layout/tags.vue +++ b/lib/saas/view/system/layout/tags.vue @@ -266,18 +266,18 @@ resizeButtom() { this.$nextTick(() => { if (this.$refs.tags !== undefined) { - const clientWidth = (this.$refs.tags as HTMLElement).clientWidth; - if (this.currentPage === 0) { - this.isdisabledl = this.tagList.length * 100 > clientWidth; - } else { - this.isdisabledl = - (this.tagList.length - this.number * this.currentPage) * 100 > clientWidth; - if (this.tagList.length * 100 < clientWidth) { - (this.$refs.tags as HTMLElement).style.cssText = `transform: translateX(${0}px)`; - this.isdisabledr = false; - this.currentPage = 0; + const clientWidth = (this.$refs.tags as HTMLElement).clientWidth; + if (this.currentPage === 0) { + this.isdisabledl = this.tagList.length * 100 > clientWidth; + } else { + this.isdisabledl = + (this.tagList.length - this.number * this.currentPage) * 100 > clientWidth; + if (this.tagList.length * 100 < clientWidth) { + (this.$refs.tags as HTMLElement).style.cssText = `transform: translateX(${0}px)`; + this.isdisabledr = false; + this.currentPage = 0; + } } - } } }); }, diff --git a/lib/saas/view/system/login.vue b/lib/saas/view/system/login.vue index 5c64d1e..e654921 100644 --- a/lib/saas/view/system/login.vue +++ b/lib/saas/view/system/login.vue @@ -79,6 +79,7 @@ import { Cookies } from '/nerv-lib/util/cookie'; import { storeToRefs } from 'pinia'; import { NsMessage } from '/nerv-lib/component'; + import { replyDynamRoutesPath } from '/nerv-lib/util/dynamicRoutesss'; export default defineComponent({ name: 'UserLogin', @@ -194,12 +195,22 @@ name: initRouterList.length === 0 ? 'error403' : res.data[0]['code'], }); } else { - router.replace({ name: 'root' }); + const sessionStoreRoute = sessionStorage.getItem("dynamicRouteList"); + let getDynamicRouteList = sessionStoreRoute?JSON.parse(sessionStoreRoute):[]; + if(getDynamicRouteList && getDynamicRouteList.lenght>0){ + let addDynamicRoutes = replyDynamRoutesPath(getDynamicRouteList); + addDynamicRoutes.forEach(item => { + if (item.children && !item.component) { + item.component = () => import('/nerv-lib/saas/view/system/application.vue');//hx-ai-intelligent项目下的首页 + } + router.addRoute(item); + }); + } + router.replace({ name: 'home' }); } } } catch (err) { console.log(err); - loading.value = false; } } diff --git a/lib/util/dynamicRoutesss.ts b/lib/util/dynamicRoutesss.ts new file mode 100644 index 0000000..462073c --- /dev/null +++ b/lib/util/dynamicRoutesss.ts @@ -0,0 +1,25 @@ +//处理路由compontent路径 +export const replyDynamRoutesPath = (data:any) => { + return data.map(item => { + if(item.children && item.children.length > 0){ + item.children.map(itemChild => { + if(itemChild.component){ + const modulePath0 = itemChild.component; + itemChild.component = () => new Function(`return import('/nerv-lib/saas/view/${modulePath0}')`)(); + if(itemChild.children && itemChild.children.length > 0){ + itemChild.children.map(itemChildChild => { + if(itemChildChild.component){ + const modulePath1 = itemChildChild.component; + itemChildChild.component = () => new Function(`return import('/@/view/${modulePath1}')`)(); + } + }) + }else{ + itemChild.component = () => new Function(`return import('/@/view/${modulePath0}')`)(); + } + } + }) + } + return item; + }) +} + \ No newline at end of file diff --git a/package.json b/package.json index 076c3fd..26689e3 100644 --- a/package.json +++ b/package.json @@ -68,6 +68,7 @@ "nanoid": "^4.0.2", "path-to-regexp": "^6.2.1", "pinia": "^2.0.14", + "pinia-plugin-persistedstate": "^3.2.1", "pnpm": "^8.7.6", "qrcode.vue": "^3.3.3", "recorder-core": "^1.3.23122400",