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.

430 lines
18 KiB

4 months ago
3 months ago
3 months ago
3 months ago
3 months ago
3 weeks ago
3 months ago
3 weeks ago
3 months ago
3 weeks ago
3 months ago
3 months ago
3 weeks ago
3 weeks ago
3 weeks ago
3 weeks ago
3 weeks ago
3 months ago
3 months ago
3 weeks ago
3 weeks ago
3 weeks ago
3 months ago
3 months ago
3 weeks ago
3 weeks ago
3 weeks ago
3 weeks ago
3 weeks ago
3 weeks ago
3 weeks ago
3 weeks ago
3 weeks ago
3 months ago
3 months ago
3 weeks ago
3 weeks ago
3 weeks ago
3 weeks ago
3 months ago
3 weeks ago
3 weeks ago
3 weeks ago
3 weeks ago
3 months ago
3 weeks ago
3 weeks ago
3 weeks ago
3 months ago
3 weeks ago
3 weeks ago
3 months ago
3 months ago
3 weeks ago
3 weeks ago
3 weeks ago
3 weeks ago
2 months ago
3 months ago
3 months ago
4 months ago
3 months ago
4 months ago
3 months ago
3 months ago
3 months ago
3 months ago
3 months ago
3 months ago
2 months ago
3 months ago
3 months ago
3 months ago
3 weeks ago
3 months ago
3 months ago
3 months ago
3 months ago
3 months ago
3 months ago
  1. import { createRouter, createWebHashHistory } from 'vue-router';
  2. import axios from "axios";
  3. import { storeToRefs } from "pinia";
  4. import { useAdminStore } from "@/store/index.js";
  5. // 路由定义(包含权限映射 meta.permissionId)
  6. const routes = [
  7. {
  8. path: '/',
  9. redirect: "/login"
  10. },
  11. {
  12. path: "/login",
  13. name: "login",
  14. component: () => import("../views/login.vue"),
  15. },
  16. {
  17. meta: { requireAuth: true },
  18. path: '/',
  19. component: () => import("../views/home.vue"),
  20. children: [
  21. // 工作台
  22. {
  23. path: 'workbench',
  24. name: "workbench",
  25. component: () => import("../views/workspace/index.vue"),
  26. meta: { permissionId: 13 } //
  27. },
  28. //金币管理
  29. {
  30. path: '/goldManage',
  31. name: 'goldManage',
  32. meta:{permissionId:3},
  33. children: [
  34. // 审核
  35. {
  36. path: '/audit',
  37. name: "audit",
  38. component: () => import("../views/audit/gold/audit.vue"),
  39. meta: { permissionId: 14 },
  40. // redirect: '/index',
  41. children: [
  42. // 充值审核
  43. {
  44. path: 'rechargeAudit',
  45. name: "rechargeAudit",
  46. component: () => import("../views/audit/gold/rechargeAudit.vue"),
  47. meta: { permissionId: [28,30,31,32,33,34,35] } // 对应"查看充值审核"id=11、"充值审批"id=12
  48. },
  49. // 退款审核
  50. {
  51. path: 'refundAudit',
  52. name: "refundAudit",
  53. component: () => import("../views/audit/gold/refundAudit.vue"),
  54. meta: { permissionId: [29,36,37,38,39,40,41] } // 对应"查看退款审核"id=13、"退款审批"id=14
  55. },
  56. ]
  57. }, {
  58. path: '/beanAudit',
  59. name: "beanAudit",
  60. component: () => import("../views/audit/bean/beanAudit.vue"),
  61. meta: { permissionId: 15 },
  62. children: [
  63. // 充值审核
  64. {
  65. path: 'addbeanAudit',
  66. name: "addbeanAudit",
  67. component: () => import("../views/audit/bean/beanAudit.vue"),
  68. meta: { permissionId: [42,43,44,45,46,47] } // 对应"查看充值审核"id=11、"充值审批"id=12
  69. },
  70. ]
  71. },
  72. // 金币消耗
  73. {
  74. path: '/coinConsume',
  75. name: "coinConsume",
  76. component: () => import("../views/consume/gold/coinConsume.vue"),
  77. // redirect: '/coinConsume/add',
  78. meta: { permissionId: 19 },
  79. children: [
  80. // 金币新增消耗
  81. {
  82. path: 'add',
  83. name: "addCoinConsume",
  84. component: () => import("../views/consume/gold/addCoinConsume.vue"),
  85. meta: { permissionId: 55 } // 对应"提交金币消耗"id=19
  86. },
  87. // 金币消耗明细详情
  88. {
  89. path: 'detail',
  90. name: "coinConsumeDetail",
  91. component: () => import("../views/consume/gold/coinConsumeDetail.vue"),
  92. meta: { permissionId: 56 } // 对应"查看金币消耗明细"id=20
  93. }
  94. ]
  95. },
  96. // 金豆消耗
  97. {
  98. path: '/beanConsume',
  99. name: "beanConsume",
  100. component: () => import("../views/consume/bean/beanConsume.vue"),
  101. meta: { permissionId: 20 },
  102. children: [
  103. // 金豆新增消耗
  104. {
  105. path: 'add',
  106. name: "addBeanConsume",
  107. component: () => import("../views/consume/bean/addBeanConsume.vue"),
  108. meta: { permissionId: 57 } // 对应"提交金豆消耗"id=49
  109. },
  110. // 直播
  111. {
  112. path: 'live',
  113. name: "liveStream",
  114. component: () => import("../views/consume/bean/liveStream.vue"),
  115. meta: { permissionId: 58 } // 对应"直播"id=50
  116. },
  117. // 铁粉
  118. {
  119. path: 'fan',
  120. name: "dieHardFan",
  121. component: () => import("../views/consume/bean/dieHardFan.vue"),
  122. meta: { permissionId: 59 } // 对应"铁粉"id=51
  123. },
  124. // 文章视频
  125. {
  126. path: 'article',
  127. name: "articleVideo",
  128. component: () => import("../views/consume/bean/articleVideo.vue"),
  129. meta: { permissionId: 60 } // 对应"文章视频"id=52
  130. }
  131. ]
  132. },
  133. // 汇率管理
  134. {
  135. path: '/rate',
  136. name: "rate",
  137. component: () => import("../views/managerecharge/rate.vue"),
  138. meta: { permissionId: [16,48,49] } // 对应"汇率查看"id=15、"汇率修改"id=16
  139. },
  140. // 金币充值
  141. {
  142. path: '/coinRecharge',
  143. name: "coinRecharge",
  144. component: () => import("../views/recharge/gold/coinRecharge.vue"),
  145. meta: { permissionId: 17 },
  146. // redirect: '/coinRecharge/add',
  147. children: [
  148. // 金币新增充值
  149. {
  150. path: 'add',
  151. name: "addCoinRecharge",
  152. component: () => import("../views/recharge/gold/addCoinRecharge.vue"),
  153. meta: { permissionId: 50 } // 对应"提交金币充值"id=17
  154. },
  155. // 金币充值明细详情
  156. {
  157. path: 'detail',
  158. name: "coinRechargeDetail",
  159. component: () => import("../views/recharge/gold/coinRechargeDetail.vue"),
  160. meta: { permissionId: 51 } // 对应"查看金币充值明细"id=18
  161. }
  162. ]
  163. },
  164. // 金豆充值
  165. {
  166. path: '/beanRecharge',
  167. name: "beanRecharge",
  168. component: () => import("../views/recharge/bean/beanRecharge.vue"),
  169. // redirect: '/coinRecharge/add',
  170. meta: { permissionId: 18 },
  171. children: [
  172. // 金豆新增充值
  173. {
  174. path: 'add',
  175. name: "addBeanRecharge",
  176. component: () => import("../views/recharge/bean/addBeanRecharge.vue"),
  177. meta: { permissionId: 52 } // 对应"提交金豆充值"id=46
  178. },
  179. // 金豆系统充值
  180. {
  181. path: 'system',
  182. name: "beanSystemRecharge",
  183. component: () => import("../views/recharge/bean/beanSystemRecharge.vue"),
  184. meta: { permissionId: 53 } // 对应"查看金豆系统充值明细"id=47
  185. },
  186. // 金豆线上充值
  187. {
  188. path: 'online',
  189. name: "beanOnlineRecharge",
  190. component: () => import("../views/recharge/bean/beanOnlineRecharge.vue"),
  191. meta: { permissionId: 54 } // 对应"查看金豆线上充值明细"id=48
  192. }
  193. ]
  194. },
  195. // 金币退款
  196. {
  197. path: '/coinRefund',
  198. name: "coinRefund",
  199. component: () => import("../views/refund/gold/coinRefund.vue"),
  200. meta: { permissionId: 9 },
  201. children: [
  202. // 金币新增退款
  203. {
  204. path: 'add',
  205. name: "addCoinRefund",
  206. component: () => import("../views/refund/gold/addCoinRefund.vue"),
  207. meta: { permissionId: 61 }
  208. },
  209. // 金币退款明细详情
  210. {
  211. path: 'detail',
  212. name: "coinRefundDetail",
  213. component: () => import("../views/refund/gold/coinRefundDetail.vue"),
  214. meta: { permissionId: 62 }
  215. }
  216. ]
  217. },
  218. // 客户账户明细
  219. {
  220. path: '/usergold',
  221. name: "usergold",
  222. component: () => import("../views/usergold/gold/clientCount.vue"),
  223. meta: { permissionId: 10 },
  224. children: [
  225. // 金币明细
  226. {
  227. path: 'detail',
  228. name: "clientCountDetail",
  229. component: () => import("../views/usergold/gold/clientCountDetail.vue"),
  230. meta: { permissionId: 63 }
  231. },
  232. // 金币余额
  233. {
  234. path: 'balance',
  235. name: "clientCountBalance",
  236. component: () => import("../views/usergold/gold/clientCountBalance.vue"),
  237. meta: { permissionId: 64 }
  238. },
  239. ]
  240. },
  241. {
  242. path: '/userbean',
  243. name: "userbean",
  244. component: () => import("../views/usergold/bean/userbean.vue"),
  245. meta: { permissionId: 45 }
  246. },
  247. {
  248. path: '/history',
  249. name: "history",
  250. component: () => import("../views/history/history.vue"),
  251. meta: { permissionId: 12 },
  252. children: [
  253. {
  254. path: 'newHistory',
  255. name: "newHistory",
  256. component: () => import("../views/history/newHistory.vue"),
  257. meta: { permissionId: 26 }
  258. },
  259. {
  260. path: 'oldHistory',
  261. name: "oldHistory",
  262. component: () => import("../views/history/oldHistory.vue"),
  263. meta: { permissionId: 27 }
  264. }
  265. ]
  266. },
  267. // 权限管理
  268. {
  269. path: '/permissions',
  270. name: "permissions",
  271. component: () => import("../views/permissions/permissions.vue"),
  272. meta: { permissionId: 11 },
  273. children: [
  274. // 用户权限
  275. {
  276. path: 'userPermission',
  277. name: "userPermission",
  278. component: () => import("../views/permissions/userPermission.vue"),
  279. meta: { permissionId: 24 }
  280. },
  281. // 角色权限
  282. {
  283. path: 'rolePermission',
  284. name: "rolePermission",
  285. component: () => import("../views/permissions/rolePermission.vue"),
  286. meta: { permissionId: 25 }
  287. }
  288. ]
  289. }
  290. ]
  291. },
  292. {
  293. path:'/moneyManage',
  294. name:'moneyManage',
  295. meta:{permissionId:4},
  296. children:[
  297. // 收款明细
  298. {
  299. path: 'receiveDetail',
  300. name: "receiveDetail",
  301. component: () => import("../views/moneyManage/receiveDetail/receiveDetail.vue"),
  302. meta: { permissionId: 74 }
  303. },
  304. // 退款明细
  305. {
  306. path: 'refundDetail',
  307. name: "refundDetail",
  308. component: () => import("../views/moneyManage/refundDetail/refundDetail.vue"),
  309. meta: { permissionId: 75 }
  310. },
  311. // 执行明细
  312. {
  313. path: 'executor',
  314. name: "executor",
  315. component: () => import("../views/moneyManage/executor/executor.vue"),
  316. meta: { permissionId: 76 }
  317. },
  318. ]
  319. },
  320. // 没有权限
  321. {
  322. path: '/noPermission',
  323. name: "noPermission",
  324. component: () => import("../views/noPermissionPage.vue")
  325. }
  326. ]
  327. },
  328. // 跳转页面(无需权限)
  329. {
  330. path: '/PasswordSuccess',
  331. name: "PasswordSuccess",
  332. component: () => import("../components/PasswordSuccess.vue")
  333. }
  334. ];
  335. // 创建路由实例
  336. const router = createRouter({
  337. history: createWebHashHistory(),
  338. routes
  339. });
  340. // 工具函数:从菜单树提取所有权限ID
  341. const getAllPermissionIds = (menuTree) => {
  342. let permissionIds = [];
  343. const traverse = (menuList) => {
  344. menuList.forEach(menu => {
  345. permissionIds.push(menu.id);
  346. if (menu.children && menu.children.length > 0) {
  347. traverse(menu.children);
  348. }
  349. });
  350. };
  351. traverse(menuTree);
  352. return permissionIds;
  353. };
  354. // 全局路由守卫
  355. router.beforeEach(async (to, from, next) => {
  356. const adminStore = useAdminStore()
  357. const { adminData, menuTree } = storeToRefs(adminStore)
  358. const token = localStorage.getItem("token");
  359. const machineId = localStorage.getItem("machineId");
  360. // 1. 未登录:强制跳转到登录页
  361. if (to.name !== "login" && !token) {
  362. next(`/login?machineId=${machineId || ''}`);
  363. return;
  364. }
  365. // 2. 已登录:处理权限验证
  366. if (token) {
  367. // 获取管理员信息
  368. let roleId = null;
  369. console.log('路由的adminData:', adminData.value)
  370. try {
  371. roleId = adminData.value.roleId;
  372. if (!roleId) {
  373. localStorage.removeItem('token'); // 清除token,强制重新登录
  374. next(`/login?machineId=${machineId || ''}`);
  375. return;
  376. }
  377. } catch (error) {
  378. localStorage.removeItem('token'); // 清除token,强制重新登录
  379. adminStore.clearState()
  380. next(`/login?machineId=${machineId || ''}`);
  381. return;
  382. }
  383. let userPermissionIds = [];
  384. // 拿权限id
  385. userPermissionIds = getAllPermissionIds(menuTree.value)
  386. console.log("userPermissionIds",userPermissionIds)
  387. // 2.4 权限验证(逻辑不变)
  388. console.log('to.meta:', to.meta)
  389. const requiresPermission = to.meta && to.meta.permissionId;
  390. if (requiresPermission) {
  391. const hasPermission = Array.isArray(requiresPermission)
  392. ? requiresPermission.some(id => userPermissionIds.includes(id))
  393. : userPermissionIds.includes(requiresPermission);
  394. if (!hasPermission) {
  395. next('/noPermission');
  396. return;
  397. }
  398. }
  399. }
  400. // 3. 正常跳转
  401. next();
  402. });
  403. export default router;