import {createRouter, createWebHashHistory} from 'vue-router'; import axios from "axios"; import {storeToRefs} from "pinia"; import {useAdminStore} from "@/store/index.js"; // 路由定义(包含权限映射 meta.permissionId) const routes = [ { path: '/', redirect: "/login" }, { path: "/login", name: "login", component: () => import("../views/login.vue"), }, { meta: {requireAuth: true}, path: '/', component: () => import("../views/home.vue"), children: [ // 工作台 { path: '/workspace', name: "workspace", component: () => import("../views/workspace/index.vue"), meta: {permissionId: 10} // 对应"工作台展示"id=10 }, // 审核 { path: '/audit', name: "audit", component: () => import("../views/audit/audit.vue"), meta: {permissionId: 40}, // redirect: '/index', children: [ // 充值审核 { path: 'rechargeAudit', name: "rechargeAudit", component: () => import("../views/audit/rechargeAudit.vue"), meta: {permissionId: [11, 12]} // 对应"查看充值审核"id=11、"充值审批"id=12 }, // 退款审核 { path: 'refundAudit', name: "refundAudit", component: () => import("../views/audit/refundAudit.vue"), meta: {permissionId: [13, 14]} // 对应"查看退款审核"id=13、"退款审批"id=14 }, ] }, // 金币消耗 { path: '/coinConsume', name: "coinConsume", component: () => import("../views/consume/coinConsume.vue"), // redirect: '/coinConsume/add', meta: {permissionId: 6}, children: [ // 金币新增消耗 { path: 'add', name: "addCoinConsume", component: () => import("../views/consume/addCoinConsume.vue"), meta: {permissionId: 19} // 对应"提交金币消耗"id=19 }, // 金币消耗明细详情 { path: 'detail', name: "coinConsumeDetail", component: () => import("../views/consume/coinConsumeDetail.vue"), meta: {permissionId: 20} // 对应"查看金币消耗明细"id=20 } ] }, // 金豆消耗 { path: '/beanConsume', name: "beanConsume", component: () => import("../views/consume/beanConsume.vue"), meta: {permissionId: 6}, children: [ // 金豆新增消耗 { path: 'add', name: "addBeanConsume", component: () => import("../views/consume/addBeanConsume.vue"), meta: {permissionId: 23} // 对应"提交金豆消耗"id=? }, // 直播 { path: 'live', name: "liveStream", component: () => import("../views/consume/liveStream.vue"), meta: {permissionId: 24} // 对应"直播"id=? }, // 铁粉 { path: 'fan', name: "dieHardFan", component: () => import("../views/consume/dieHardFan.vue"), meta: {permissionId: 25} // 对应"铁粉"id=? }, // 文章视频 { path: 'article', name: "articleVideo", component: () => import("../views/consume/articleVideo.vue"), meta: {permissionId: 26} // 对应"文章视频"id=? } ] }, // 汇率管理 { path: '/rate', name: "rate", component: () => import("../views/managerecharge/rate.vue"), meta: {permissionId: [15, 16]} // 对应"汇率查看"id=15、"汇率修改"id=16 }, // 金币充值 { path: '/coinRecharge', name: "coinRecharge", component: () => import("../views/recharge/coinRecharge.vue"), // redirect: '/coinRecharge/add', children: [ // 金币新增充值 { path: 'add', name: "addCoinRecharge", component: () => import("../views/recharge/addCoinRecharge.vue"), meta: {permissionId: 17} // 对应"提交金币充值"id=17 }, // 金币充值明细详情 { path: 'detail', name: "coinRechargeDetail", component: () => import("../views/recharge/coinRechargeDetail.vue"), meta: {permissionId: 18} // 对应"查看金币充值明细"id=18 } ] }, // 金币退款 { path: '/coinRefund', name: "coinRefund", component: () => import("../views/refund/coinRefund.vue"), // redirect: '/coinRefund/add', meta: {permissionId: 7}, children: [ // 金币新增退款 { path: 'add', name: "addCoinRefund", component: () => import("../views/refund/addCoinRefund.vue"), meta: {permissionId: 21} // 对应"提交金币退款"id=21 }, // 金币退款明细详情 { path: 'detail', name: "coinRefundDetail", component: () => import("../views/refund/coinRefundDetail.vue"), meta: {permissionId: 22} // 对应"查看金币退款明细"id=22 } ] }, // 客户账户明细 { path: '/usergold', name: "usergold", component: () => import("../views/usergold/clientCount.vue"), // redirect: '/usergold/detail', meta: {permissionId: 8}, children: [ // 金币明细 { path: 'detail', name: "clientCountDetail", component: () => import("../views/usergold/clientCountDetail.vue"), meta: {permissionId: 23} // 对应"查看金币明细"id=23 }, // 金币余额 { path: 'balance', name: "clientCountBalance", component: () => import("../views/usergold/clientCountBalance.vue"), meta: {permissionId: 24} // 对应"查看金币余额"id=24 }, ] }, // 权限管理 { path: '/permissions', name: "permissions", component: () => import("../views/permissions/permission.vue"), meta: {permissionId: [25, 26, 27, 28, 29]} // 对应权限管理下的所有操作 }, // 没有权限 { path: '/noPermission', name: "noPermission", component: () => import("../views/noPermissionPage.vue") } ] }, // 跳转页面(无需权限) { path: '/PasswordSuccess', name: "PasswordSuccess", component: () => import("../components/PasswordSuccess.vue") } ]; // 创建路由实例 const router = createRouter({ history: createWebHashHistory(), routes }); // 全局拦截器:token过期处理 axios.interceptors.response.use( response => response, error => { if (error.response && error.response.status === 401) { localStorage.removeItem('token'); router.push({ name: 'login', query: { machineId: localStorage.getItem('machineId'), expired: true } }); } return Promise.reject(error); } ); // 工具函数:从菜单树提取所有权限ID const getAllPermissionIds = (menuTree) => { let permissionIds = []; const traverse = (menuList) => { menuList.forEach(menu => { permissionIds.push(menu.id); if (menu.children && menu.children.length > 0) { traverse(menu.children); } }); }; traverse(menuTree); return permissionIds; }; // 全局路由守卫 router.beforeEach(async (to, from, next) => { const adminStore = useAdminStore() const { adminData, menuTree } = storeToRefs(adminStore) const token = localStorage.getItem("token"); const machineId = localStorage.getItem("machineId"); // 1. 未登录:强制跳转到登录页 if (to.name !== "login" && !token) { next(`/login?machineId=${machineId || ''}`); return; } // 2. 已登录:处理权限验证 if (token) { // 获取管理员信息 let roleId = null; console.log('adminData:', adminData) try { roleId = adminData.value.roleId; if (!roleId) { localStorage.removeItem('token'); // 清除token,强制重新登录 next(`/login?machineId=${machineId || ''}`); return; } } catch (error) { localStorage.removeItem('token'); // 清除token,强制重新登录 adminStore.clearState() next(`/login?machineId=${machineId || ''}`); return; } let userPermissionIds = []; // 拿权限id userPermissionIds = getAllPermissionIds(menuTree.value) // 2.4 权限验证(逻辑不变) console.log('to.meta:', to.meta) const requiresPermission = to.meta && to.meta.permissionId; if (requiresPermission) { const hasPermission = Array.isArray(requiresPermission) ? requiresPermission.some(id => userPermissionIds.includes(id)) : userPermissionIds.includes(requiresPermission); if (!hasPermission) { next('/noPermission'); return; } } } // 3. 正常跳转 next(); }); export default router;