You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
567 lines
23 KiB
567 lines
23 KiB
import {createRouter, createWebHashHistory} from 'vue-router';
|
|
import {storeToRefs} from "pinia";
|
|
import {useAdminStore, useMessageStore} from "@/store/index.js";
|
|
import API from '@/util/http.js';
|
|
import {ref} from "vue";
|
|
|
|
|
|
// 路由定义(包含权限映射 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: 'workbench',
|
|
name: "workbench",
|
|
component: () => import("../views/workspace/index.vue"),
|
|
meta: {permissionId: 2}
|
|
},
|
|
//金币管理
|
|
{
|
|
path: '/goldManage',
|
|
name: 'goldManage',
|
|
meta: {permissionId: 3},
|
|
children: [
|
|
// 审核
|
|
{
|
|
path: '/audit',
|
|
name: "audit",
|
|
component: () => import("../views/audit/gold/audit.vue"),
|
|
meta: {permissionId: 4},
|
|
children: [
|
|
// 充值审核
|
|
{
|
|
path: 'rechargeAudit',
|
|
name: "rechargeAudit",
|
|
component: () => import("../views/audit/gold/rechargeAudit.vue"),
|
|
meta: {permissionId: [6, 7, 8, 9, 10, 11, 12]}
|
|
},
|
|
// 退款审核
|
|
{
|
|
path: 'refundAudit',
|
|
name: "refundAudit",
|
|
component: () => import("../views/audit/gold/refundAudit.vue"),
|
|
meta: {permissionId: [13, 14, 15, 16, 17, 18, 19]}
|
|
},
|
|
]
|
|
}, {
|
|
path: '/beanAudit',
|
|
name: "beanAudit",
|
|
component: () => import("../views/audit/bean/beanAudit.vue"),
|
|
meta: {permissionId: 20},
|
|
children: [
|
|
// 充值审核
|
|
{
|
|
path: 'addbeanAudit',
|
|
name: "addbeanAudit",
|
|
component: () => import("../views/audit/bean/beanAudit.vue"),
|
|
meta: {permissionId: [21, 22, 23, 24, 25, 26]}
|
|
},
|
|
]
|
|
},
|
|
|
|
|
|
// 金币消耗
|
|
{
|
|
path: '/coinConsume',
|
|
name: "coinConsume",
|
|
component: () => import("../views/consume/gold/coinConsume.vue"),
|
|
meta: {permissionId: 39},
|
|
children: [
|
|
// 金币新增消耗
|
|
{
|
|
path: 'add',
|
|
name: "addCoinConsume",
|
|
component: () => import("../views/consume/gold/addCoinConsume.vue"),
|
|
meta: {permissionId: 41}
|
|
},
|
|
// 金币消耗明细详情
|
|
{
|
|
path: 'detail',
|
|
name: "coinConsumeDetail",
|
|
component: () => import("../views/consume/gold/coinConsumeDetail.vue"),
|
|
meta: {permissionId: 40}
|
|
}
|
|
]
|
|
},
|
|
// 金豆消耗
|
|
{
|
|
path: '/beanConsume',
|
|
name: "beanConsume",
|
|
component: () => import("../views/consume/bean/beanConsume.vue"),
|
|
meta: {permissionId: 42},
|
|
children: [
|
|
// 金豆新增消耗
|
|
{
|
|
path: 'add',
|
|
name: "addBeanConsume",
|
|
component: () => import("../views/consume/bean/addBeanConsume.vue"),
|
|
meta: {permissionId: 46}
|
|
},
|
|
// 直播
|
|
{
|
|
path: 'live',
|
|
name: "liveStream",
|
|
component: () => import("../views/consume/bean/liveStream.vue"),
|
|
meta: {permissionId: 43}
|
|
},
|
|
// 铁粉
|
|
{
|
|
path: 'fan',
|
|
name: "dieHardFan",
|
|
component: () => import("../views/consume/bean/dieHardFan.vue"),
|
|
meta: {permissionId: 44}
|
|
},
|
|
// 文章视频
|
|
{
|
|
path: 'article',
|
|
name: "articleVideo",
|
|
component: () => import("../views/consume/bean/articleVideo.vue"),
|
|
meta: {permissionId: 45}
|
|
}
|
|
|
|
]
|
|
},
|
|
|
|
// 汇率管理
|
|
{
|
|
path: '/rate',
|
|
name: "rate",
|
|
component: () => import("../views/managerecharge/rate.vue"),
|
|
meta: {permissionId: [27, 28, 29]}
|
|
},
|
|
|
|
// 金币充值
|
|
{
|
|
path: '/coinRecharge',
|
|
name: "coinRecharge",
|
|
component: () => import("../views/recharge/gold/coinRecharge.vue"),
|
|
meta: {permissionId: 31},
|
|
children: [
|
|
// 金币新增充值
|
|
{
|
|
path: 'add',
|
|
name: "addCoinRecharge",
|
|
component: () => import("../views/recharge/gold/addCoinRecharge.vue"),
|
|
meta: {permissionId: 33}
|
|
},
|
|
// 金币充值明细
|
|
{
|
|
path: 'detail',
|
|
name: "coinRechargeDetail",
|
|
component: () => import("../views/recharge/gold/coinRechargeDetail.vue"),
|
|
meta: {permissionId: 32}
|
|
}
|
|
]
|
|
},
|
|
|
|
// 金豆充值
|
|
{
|
|
path: '/beanRecharge',
|
|
name: "beanRecharge",
|
|
component: () => import("../views/recharge/bean/beanRecharge.vue"),
|
|
meta: {permissionId: 34},
|
|
children: [
|
|
// 金豆新增充值
|
|
{
|
|
path: 'add',
|
|
name: "addBeanRecharge",
|
|
component: () => import("../views/recharge/bean/addBeanRecharge.vue"),
|
|
meta: {permissionId: 37}
|
|
},
|
|
// 金豆系统充值
|
|
{
|
|
path: 'system',
|
|
name: "beanSystemRecharge",
|
|
component: () => import("../views/recharge/bean/beanSystemRecharge.vue"),
|
|
meta: {permissionId: 35}
|
|
},
|
|
// 金豆线上充值
|
|
{
|
|
path: 'online',
|
|
name: "beanOnlineRecharge",
|
|
component: () => import("../views/recharge/bean/beanOnlineRecharge.vue"),
|
|
meta: {permissionId: 36}
|
|
}
|
|
]
|
|
},
|
|
|
|
// 金币退款
|
|
{
|
|
path: '/coinRefund',
|
|
name: "coinRefund",
|
|
component: () => import("../views/refund/gold/coinRefund.vue"),
|
|
meta: {permissionId: 47},
|
|
children: [
|
|
// 金币新增退款
|
|
{
|
|
path: 'add',
|
|
name: "addCoinRefund",
|
|
component: () => import("../views/refund/gold/addCoinRefund.vue"),
|
|
meta: {permissionId: 48}
|
|
},
|
|
// 金币退款明细详情
|
|
{
|
|
path: 'detail',
|
|
name: "coinRefundDetail",
|
|
component: () => import("../views/refund/gold/coinRefundDetail.vue"),
|
|
meta: {permissionId: 49}
|
|
}
|
|
]
|
|
},
|
|
|
|
// 金币客户账户明细
|
|
{
|
|
path: '/usergold',
|
|
name: "usergold",
|
|
component: () => import("../views/usergold/gold/clientCount.vue"),
|
|
meta: {permissionId: 51},
|
|
children: [
|
|
// 金币明细
|
|
{
|
|
path: 'detail',
|
|
name: "clientCountDetail",
|
|
component: () => import("../views/usergold/gold/clientCountDetail.vue"),
|
|
meta: {permissionId: 52}
|
|
},
|
|
// 金币余额
|
|
{
|
|
path: 'balance',
|
|
name: "clientCountBalance",
|
|
component: () => import("../views/usergold/gold/clientCountBalance.vue"),
|
|
meta: {permissionId: 53}
|
|
},
|
|
]
|
|
},
|
|
{
|
|
path: '/userbean',
|
|
name: "userbean",
|
|
component: () => import("../views/usergold/bean/userbean.vue"),
|
|
meta: {permissionId: 54}
|
|
},
|
|
{
|
|
path: '/history',
|
|
name: "history",
|
|
component: () => import("../views/history/history.vue"),
|
|
meta: {permissionId: 55},
|
|
children: [
|
|
{
|
|
path: 'newHistory',
|
|
name: "newHistory",
|
|
component: () => import("../views/history/newHistory.vue"),
|
|
meta: {permissionId: 56}
|
|
},
|
|
{
|
|
path: 'oldHistory',
|
|
name: "oldHistory",
|
|
component: () => import("../views/history/oldHistory.vue"),
|
|
meta: {permissionId: 57}
|
|
}
|
|
]
|
|
},
|
|
|
|
// 权限管理
|
|
{
|
|
path: '/permissions',
|
|
name: "permissions",
|
|
component: () => import("../views/permissions/permissions.vue"),
|
|
meta: {permissionId: 128},
|
|
children: [
|
|
// 用户权限
|
|
{
|
|
path: 'userPermission',
|
|
name: "userPermission",
|
|
component: () => import("../views/permissions/userPermission.vue"),
|
|
meta: {permissionId: 129}
|
|
},
|
|
// 角色权限
|
|
{
|
|
path: 'rolePermission',
|
|
name: "rolePermission",
|
|
component: () => import("../views/permissions/rolePermission.vue"),
|
|
meta: {permissionId: 130}
|
|
}
|
|
]
|
|
}
|
|
]
|
|
},
|
|
// 现金管理
|
|
{
|
|
path: '/moneyManage',
|
|
name: 'moneyManage',
|
|
meta: {permissionId: 58},
|
|
children: [
|
|
// 收款明细
|
|
{
|
|
path: 'receiveDetail',
|
|
name: "receiveDetail",
|
|
meta: {permissionId: 74},
|
|
children: [
|
|
// 客服页面
|
|
{
|
|
path: 'receiveService',
|
|
name: "receiveService",
|
|
component: () => import("../views/moneyManage/receiveDetail/receiveService.vue"),
|
|
meta: {permissionId: 60}
|
|
},
|
|
// 地区负责人页面
|
|
{
|
|
path: 'receiveManager',
|
|
name: "receiveManager",
|
|
component: () => import("../views/moneyManage/receiveDetail/receiveManage.vue"),
|
|
meta: {permissionId: [67, 79]}
|
|
},
|
|
{//地区财务
|
|
path: 'receiveFinance',
|
|
name: "receiveFinance",
|
|
component: () => import("../views/moneyManage/receiveDetail/receiveFinance.vue"),
|
|
meta: {permissionId: [67, 79]}
|
|
},
|
|
//总部管理员及财务
|
|
{
|
|
path: 'receiveHeader',
|
|
name: "receiveHeader",
|
|
component: () => import("../views/moneyManage/receiveDetail/receiveHead.vue"),
|
|
meta: {permissionId: 91}
|
|
},
|
|
]
|
|
},
|
|
// 退款明细
|
|
{
|
|
path: 'refundDetail',
|
|
name: "refundDetail",
|
|
component: () => import("../views/moneyManage/refundDetail/refundDetail.vue"),
|
|
meta: {permissionId: 98},
|
|
children: [
|
|
// 客服页面
|
|
{
|
|
path: 'refundService',
|
|
name: "refundService",
|
|
component: () => import("../views/moneyManage/refundDetail/refundService.vue"),
|
|
meta: {permissionId: 99}
|
|
},
|
|
// 地区财务页面
|
|
{
|
|
path: 'refundFinance',
|
|
name: "refundFinance",
|
|
component: () => import("../views/moneyManage/refundDetail/refundFinance.vue"),
|
|
meta: {permissionId: 103}
|
|
},
|
|
// 地区负责人页面
|
|
{
|
|
path: 'refundCharge',
|
|
name: "refundCharge",
|
|
component: () => import("../views/moneyManage/refundDetail/refundCharge.vue"),
|
|
meta: {permissionId: 107}
|
|
},
|
|
//总部管理员及财务
|
|
{
|
|
path: 'refundHeader',
|
|
name: "refundHeader",
|
|
component: () => import("../views/moneyManage/refundDetail/refundHeader.vue"),
|
|
meta: {permissionId: 111}
|
|
},
|
|
]
|
|
},
|
|
// 执行明细
|
|
{
|
|
path: 'executor',
|
|
name: "executor",
|
|
component: () => import("../views/moneyManage/executor/executor.vue"),
|
|
meta: {permissionId: 115}
|
|
},
|
|
]
|
|
},
|
|
// 频道管理
|
|
{
|
|
path: 'channelManage',
|
|
name: 'channelManage',
|
|
meta: {permissionId: 124},
|
|
children: [
|
|
// 打赏
|
|
{
|
|
path: 'reward',
|
|
name: "reward",
|
|
component: () => import("../views/channelManage/reward/reward.vue"),
|
|
meta: {permissionId: 125}
|
|
},
|
|
// 铁粉
|
|
{
|
|
path: 'fans',
|
|
name: "fans",
|
|
component: () => import("../views/channelManage/fans/fans.vue"),
|
|
meta: {permissionId: 126}
|
|
},
|
|
// 购物车
|
|
{
|
|
path: 'cart',
|
|
name: "cart",
|
|
component: () => import("../views/noPermissionPage.vue"),
|
|
meta: {permissionId: 127}
|
|
}
|
|
]
|
|
},
|
|
// 活动管理
|
|
{
|
|
path: 'activityManage',
|
|
name: "activityManage",
|
|
component: () => import("../views/activityManage/activity.vue"),
|
|
meta: {permissionId: 119}
|
|
},
|
|
// 多语言配置
|
|
{
|
|
path: 'language',
|
|
name: "language",
|
|
component: () => import("../views/language/languageTranslate.vue"),
|
|
meta: {permissionId: 146}
|
|
},
|
|
// 没有权限
|
|
{
|
|
path: '/noPermission',
|
|
name: "noPermission",
|
|
component: () => import("../views/noPermissionPage.vue")
|
|
}
|
|
]
|
|
},
|
|
// 跳转页面(无需权限)
|
|
{
|
|
path: '/PasswordSuccess',
|
|
name: "PasswordSuccess",
|
|
component: () => import("../components/PasswordSuccess.vue")
|
|
}
|
|
];
|
|
|
|
// 创建路由实例
|
|
const router = createRouter({
|
|
history: createWebHashHistory(),
|
|
routes
|
|
});
|
|
|
|
|
|
// 工具函数:从菜单树提取所有权限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.value)
|
|
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)
|
|
console.log("userPermissionIds", userPermissionIds)
|
|
|
|
// 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();
|
|
});
|
|
const rawItems = ref([])
|
|
|
|
// 全局后置守卫:每次路由切换后执行
|
|
router.afterEach(async (to) => { // 接收to参数获取当前路由信息
|
|
// 判断当前路由是否是登录页,如果是则直接返回不执行后续逻辑
|
|
if (to.path === '/login') {
|
|
return;
|
|
}
|
|
// 1. 从localStorage获取数据(localStorage存储的是字符串,需解析)
|
|
const statusStr = localStorage.getItem('status');
|
|
|
|
if (statusStr) {
|
|
// 示例:如果原始字符串是逗号分隔的格式(如 "1,2,3"),可按分隔符拆分后遍历
|
|
rawItems.value = statusStr.split(','); // 根据实际格式调整分隔符
|
|
rawItems.value.forEach((item, index) => {
|
|
console.log(`索引${index}:`, item.trim()); // trim() 去除空格(可选)
|
|
});
|
|
} else {
|
|
console.log('localStorage中无status数据');
|
|
}
|
|
try {
|
|
// 执行/getMessage请求
|
|
const newMessageRes = await API({
|
|
url: '/getMessage',
|
|
method: 'POST',
|
|
data: {status: rawItems.value}
|
|
});
|
|
console.log('newMessageRes=======================:', newMessageRes.data)
|
|
// 存入全局状态,供所有页面访问
|
|
const messageStore = useMessageStore();
|
|
// 过滤 flag=1的消息
|
|
newMessageRes.data = newMessageRes.data.filter(item => item.flag !== 1);
|
|
|
|
messageStore.setMessages(newMessageRes.data);
|
|
} catch (error) {
|
|
console.error('获取消息失败:', error);
|
|
}
|
|
});
|
|
export default router;
|