From 964aab217d7fcdac2a3d8f895d0285afee28e696 Mon Sep 17 00:00:00 2001 From: YeMingfei666 <1619116647@qq.com> Date: Mon, 17 Feb 2025 18:31:33 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E8=8F=9C=E5=8D=95?= =?UTF-8?q?=E7=AE=A1=E7=90=86=E9=A1=B5=E9=9D=A2=EF=BC=8C=E8=A7=92=E8=89=B2?= =?UTF-8?q?=E7=AE=A1=E7=90=86=E9=A1=B5=E9=9D=A2=EF=BC=8C=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E5=90=8E=E5=8F=B0=E8=BF=94=E5=9B=9E=E7=9A=84=E8=B7=AF=E7=94=B1?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E9=80=82=E9=85=8D=E9=A1=B9=E7=9B=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/account/menu.ts | 4 +- src/api/account/role.ts | 18 +- src/api/system/user.ts | 2 +- src/store/modules/permission.ts | 47 +++-- src/utils/request.ts | 12 +- src/views/admim/system/menu/index.vue | 190 +++++++----------- .../admim/system/role/components/menus.vue | 128 ++++++++++++ src/views/admim/system/role/index.vue | 133 ++++++------ src/views/login/index.vue | 57 ++++-- 9 files changed, 382 insertions(+), 209 deletions(-) create mode 100644 src/views/admim/system/role/components/menus.vue diff --git a/src/api/account/menu.ts b/src/api/account/menu.ts index a4b5197..ba291ef 100644 --- a/src/api/account/menu.ts +++ b/src/api/account/menu.ts @@ -21,7 +21,7 @@ const MenuApi = { return request({ url: `${baseURL}/detail`, method: "get", - data: { id } + params: { id } }); }, add(data: addRequest) { @@ -195,7 +195,7 @@ export interface editRequest { /** * 上级菜单,不传递则为顶级菜单 */ - pid?: number; + pid: number | string | null; title: string; [property: string]: any; } diff --git a/src/api/account/role.ts b/src/api/account/role.ts index faea2a6..52007cd 100644 --- a/src/api/account/role.ts +++ b/src/api/account/role.ts @@ -17,20 +17,29 @@ const RoleApi = { data, }); }, - update(data: editRequest) { - return request({ + update(id: number | string | null, data: editRequest) { + const requestData = { ...data, id }; + return request({ url: `${baseURL}`, method: "put", - data, + data: requestData, }); }, delete(data: delRequest) { return request({ url: `${baseURL}`, - method: "put", + method: "delete", data, }); }, + // 获取角色对应的菜单id + getMenu(id: number) { + return request({ + url: `${baseURL}/menu`, + method: "get", + params: { id }, + }); + }, }; export default RoleApi; @@ -226,3 +235,4 @@ export interface delResponse { [property: string]: any; } /** delete end */ + diff --git a/src/api/system/user.ts b/src/api/system/user.ts index fcd4c8d..e893e3d 100644 --- a/src/api/system/user.ts +++ b/src/api/system/user.ts @@ -216,7 +216,7 @@ export default UserAPI; export interface UserInfo { /** 用户ID */ userId?: number; - + id?: number | string; /** 用户名 */ username?: string; diff --git a/src/store/modules/permission.ts b/src/store/modules/permission.ts index 56f133d..c18d156 100644 --- a/src/store/modules/permission.ts +++ b/src/store/modules/permission.ts @@ -4,6 +4,7 @@ import { store } from "@/store"; import router from "@/router"; import MenuAPI, { type RouteVO } from "@/api/account/menu"; +const isTest = true//是否是本地调试 const modules = import.meta.glob("../../views/**/**.vue"); const Layout = () => import("@/layout/index.vue"); @@ -16,6 +17,8 @@ export const usePermissionStore = defineStore("permission", () => { // 路由是否加载完成 const isRoutesLoaded = ref(false); + + /** * 获取后台动态路由数据,解析并注册到全局路由 * @@ -25,12 +28,18 @@ export const usePermissionStore = defineStore("permission", () => { return new Promise((resolve, reject) => { MenuAPI.getRoutes() .then((data) => { - // const dynamicRoutes = parseDynamicRoutes(data); - // routes.value = [...constantRoutes, ...dynamicRoutes]; - // isRoutesLoaded.value = true; - // resolve(dynamicRoutes); - isRoutesLoaded.value = true; - resolve(constantRoutes); + if (!isTest) { + const dynamicRoutes = parseDynamicRoutes(data.filter(v => v.type == 0)); + routes.value = [...constantRoutes, ...dynamicRoutes]; + console.log(routes.value); + isRoutesLoaded.value = true; + resolve(dynamicRoutes); + } else { + + isRoutesLoaded.value = true; + resolve(constantRoutes); + } + }) .catch((error) => { reject(error); @@ -55,7 +64,9 @@ export const usePermissionStore = defineStore("permission", () => { */ const resetRouter = () => { // 清空本地存储的路由和菜单数据 - // routes.value = []; + if (!isTest) { + routes.value = []; + } routes.value = constantRoutes; mixedLayoutLeftRoutes.value = []; // 从 Vue Router 中移除所有动态注册的路由 @@ -90,21 +101,33 @@ export const usePermissionStore = defineStore("permission", () => { */ const parseDynamicRoutes = (rawRoutes: RouteVO[]): RouteRecordRaw[] => { const parsedRoutes: RouteRecordRaw[] = []; - rawRoutes.forEach((route) => { - const normalizedRoute = { ...route } as RouteRecordRaw; + console.log(route.path) + const normalizedRoute = { + path: route.path, + meta: { + title: route.title, + icon: route.icon, + keepAlive: route.cache, + alwaysShow: route.path && route.path.startsWith('/') ? true : false, + hidden: route.hidden, + }, + children: route.children, + component: route.component, + } as RouteRecordRaw; // 处理组件路径 normalizedRoute.component = - normalizedRoute.component?.toString() === "Layout" + !normalizedRoute.component ? Layout : modules[`../../views/${normalizedRoute.component}.vue`] || - modules["../../views/error-page/404.vue"]; - + modules["../../views/error-page/404.vue"]; // 递归解析子路由 if (normalizedRoute.children) { + // normalizedRoute.redirect = (!normalizedRoute.redirect && route.children.length <= 1) ? normalizedRoute.children[0].path : normalizedRoute.path normalizedRoute.children = parseDynamicRoutes(route.children); } + console.log(normalizedRoute) parsedRoutes.push(normalizedRoute); }); diff --git a/src/utils/request.ts b/src/utils/request.ts index e1a9418..983887d 100644 --- a/src/utils/request.ts +++ b/src/utils/request.ts @@ -4,7 +4,6 @@ import { useUserStoreHook } from "@/store/modules/user"; import { ResultEnum } from "@/enums/ResultEnum"; import { getToken } from "@/utils/auth"; import router from "@/router"; - // 创建 axios 实例 const service = axios.create({ baseURL: import.meta.env.VITE_APP_BASE_API, @@ -23,6 +22,7 @@ service.interceptors.request.use( } else { delete config.headers.token; } + config.headers.shopId = useUserStoreHook().userInfo.id; return config; }, (error) => Promise.reject(error) @@ -37,6 +37,16 @@ service.interceptors.response.use( } const { code, data, msg } = response.data; + if (data) { + // 处理后台返回分页相关数据为字符串类型时,elementui组件警告 + const kes = ['pageNumber', 'pageSize', 'totalPage', 'totalRow']; + const keys = Object.keys(data); + for (let i of kes) { + if (keys.includes(i)) { + data[i] = data[i] * 1; + } + } + } if (code === ResultEnum.SUCCESS || code === undefined || code === null) { return data ? data : response.data; } diff --git a/src/views/admim/system/menu/index.vue b/src/views/admim/system/menu/index.vue index 34b74c6..e0e91f9 100644 --- a/src/views/admim/system/menu/index.vue +++ b/src/views/admim/system/menu/index.vue @@ -48,47 +48,67 @@ + + + - + - + - + - - - - + @@ -191,32 +263,68 @@ @@ -232,18 +340,33 @@ - + - + @@ -253,10 +376,16 @@ - - + + @@ -277,17 +406,35 @@ - + - + - + :drag="true" + :limit="1" + :auto-upload="false" + :on-exceed="handleFileExceed" + >
将文件拖到此处,或 @@ -296,8 +443,13 @@