diff --git a/src/home.vue b/src/home.vue index 11a79faf66c86346e52a9eb24986f19ae15542aa..5bf83f67441050d12c6534956e99be8a8f08d1de 100644 --- a/src/home.vue +++ b/src/home.vue @@ -61,7 +61,7 @@ const router = useRouter(); const { proxy } = getCurrentInstance(); const menuInfoStore = menuStore(); const userStore = useUserInfoStore(); -const { activeTabArray, editableTabsValue } = storeToRefs(menuInfoStore); // 响应式 +const { activeTabArray, editableTabsValue, allArray } = storeToRefs(menuInfoStore); // 响应式 const { userInfo } = storeToRefs(userStore); const userData = ref(null); const breadList = ref([]); @@ -235,8 +235,10 @@ onMounted(async () => { document.addEventListener('click', handleClickOutside); getMatched(); try { - const res = await proxy.$api.menus(); - userData.value = res.data; + userData.value = allArray.value; + return; + // const res = await proxy.$api.menus(); + // userData.value = res.data; getscoket(); } catch (error) { console.error('失败信息:', error); diff --git a/src/main.js b/src/main.js index a2d99aae9c34ae40bb1275becc98c2a74e58e497..e9656745ef733853c10c72e14f2a48d07cf3a445 100644 --- a/src/main.js +++ b/src/main.js @@ -13,7 +13,7 @@ const app = createApp(App); app.config.globalProperties.$api = axios; app.config.globalProperties.$icon = ElementPlusIconsVue; // size: 'small', -app.use(pinia).use(router).use(ElementPlus, { locale: zhCn, zIndex: 3000 }); +app.use(router).use(pinia).use(ElementPlus, { locale: zhCn, zIndex: 3000 }); for (const [key, component] of Object.entries(ElementPlusIconsVue)) { app.component(key, component); } diff --git a/src/pages/404.vue b/src/pages/404.vue new file mode 100644 index 0000000000000000000000000000000000000000..f59f58070a5116d35d3f53bd5bee16c7777d66c7 --- /dev/null +++ b/src/pages/404.vue @@ -0,0 +1,9 @@ + diff --git a/src/pages/systemSetting/roleManagement.vue b/src/pages/systemSetting/roleManagement.vue index 052e3281680d7e9593c67c257433c0ccea8ebc39..663b9b936ead044d2b759fe82c445f632515adf1 100644 --- a/src/pages/systemSetting/roleManagement.vue +++ b/src/pages/systemSetting/roleManagement.vue @@ -7,13 +7,13 @@ - + - + - - + + + + 父子联动 + + + + + + + @@ -134,16 +185,13 @@ onMounted(() => { cursor: pointer; } .iconS { - .el-icon-check { - color: #00ff00; - font-weight: 800; - font-size: 20px; - } + font-size: 22px; +} +.el-icon-check { + color: #00ff00; +} - .el-icon-close { - color: #ff0000; - font-weight: 800; - font-size: 20px; - } +.el-icon-close { + color: #ff0000; } diff --git a/src/router/index.js b/src/router/index.js index 87c405bd48022573cd120c8504a2c55e8dbda2b4..fb4acb113439b07d9628001b0a74e890006225d1 100644 --- a/src/router/index.js +++ b/src/router/index.js @@ -37,6 +37,12 @@ const router = createRouter({ ], }, { + name: '404', + path: '/404', + component: () => import('@/pages/404.vue'), + }, + { + name: 'login', path: '/login', component: () => import('@/pages/login.vue'), }, @@ -61,10 +67,10 @@ function transformRoute(route, parentPath = '') { transformed.component = components[componentPath]; } else { console.error(`组件不存在: ${componentPath}`); + // router.addRoute({ path: '/:catchAll(.*)', redirect: '/404' }); return null; // 跳过无效路由 } } - return transformed; } @@ -73,15 +79,19 @@ const setupDynamicRoutes = async () => { try { const res = await api.menus(); const backendRoutes = res.data; - // const useMenuStores = useMenuStore(); - // useMenuStores.changeRemoveAll(); - + const useMenuStores = useMenuStore(); + useMenuStores.getAllMenu(backendRoutes); // 转换路由 const transformedRoutes = backendRoutes.map(route => transformRoute(route)).filter(Boolean); // 过滤掉无效路由 // 添加动态路由到 `/home` transformedRoutes.forEach(route => { router.addRoute('home', route); }); + // 添加一个catch-all路由,确保无效路由会重定向到 404 + router.addRoute({ + path: '/:catchAll(.*)', // 使用 catchAll 匹配所有路径 + redirect: '/404', // 重定向到 404 页面 + }); return res; } catch (error) { console.error('Failed to setup dynamic routes:', error); @@ -93,18 +103,20 @@ let dynamicRoutesLoaded = false; // 防止重复加载动态路由 router.beforeEach(async (to, from, next) => { NProgress.start(); // 开启进度条 const useMenuStores = useMenuStore(); - if (to.path === '/login') { + const funcAll = () => { localStorage.clear(); // 清除所有 localStorage 数据 - useMenuStores.changeRemoveAll(); + }; + if (to.path === '/login') { + // localStorage.clear(); // 清除所有 localStorage 数据 + // useMenuStores.changeRemoveAll(); + funcAll(); next(); // 登录页直接放行 return; } // 如果没有 refToken 则跳转回登录页 if (!localStorage.getItem('refreshToken')) { - console.log('没有refToken'); - localStorage.clear(); // 清除所有 localStorage 数据 - useMenuStores.changeRemoveAll(); + funcAll(); return next('/login'); } @@ -115,8 +127,7 @@ router.beforeEach(async (to, from, next) => { next({ ...to, replace: true }); // 重新导航到当前路径,确保新添加的路由生效 return; } catch (err) { - localStorage.clear(); // 清除所有 localStorage 数据 - useMenuStores.changeRemoveAll(); + funcAll(); next('/login'); // 跳转到登录页 } } else { diff --git a/src/stortes/menu.js b/src/stortes/menu.js index ea3e89b6b2bf85443bebb97a1106171bde4054b0..e94efd751a202b400df42590d1cc3568e66062f7 100644 --- a/src/stortes/menu.js +++ b/src/stortes/menu.js @@ -10,9 +10,15 @@ const menuStore = defineStore('menu', { }, ], editableTabsValue: '/index', + allArray: [], }), // 修改 actions: { + // 获取所有菜单 + getAllMenu(val) { + this.allArray = val; + return val; + }, /** * 添加一个新的菜单项到活跃菜单数组中。 * 如果新菜单项的URL已经存在于活跃菜单数组中,则不执行任何操作。 @@ -88,4 +94,4 @@ const menuStore = defineStore('menu', { }, }); -export default menuStore; \ No newline at end of file +export default menuStore; diff --git a/src/utils/request.js b/src/utils/request.js index d184865927922e669af382ba80e36dc9af2ad7e4..ed00fd2d9a0b1fd9c2bbd9537fe3a9fd06a75074 100644 --- a/src/utils/request.js +++ b/src/utils/request.js @@ -210,11 +210,13 @@ export default { detailRoles(params) { return oGet(baseUrl + '/role/detail', params); }, + + // 给角色分配菜单 assignMenusToRole(params) { - return oGet(baseUrl + '/role/assignMenusToRole', params); + return oPost(baseUrl + '/role/assignMenusToRole', params); }, getRoleMenus(params) { - return oPost(baseUrl + '/role/getRoleMenus', params); + return oGet(baseUrl + '/role/getRoleMenus', params); }, };