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.

120 lines
3.7 KiB

2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
  1. <template>
  2. <div>
  3. <el-button-group>
  4. <el-button
  5. :type="activeTab === 'add' ? 'primary' : 'default'"
  6. @click="navigateTo('add')"
  7. :disabled="!hasAddPermission"
  8. >
  9. 新增消耗
  10. </el-button>
  11. <el-button
  12. :type="activeTab === 'detail' ? 'primary' : 'default'"
  13. @click="navigateTo('detail')"
  14. :disabled="!hasDetailPermission"
  15. >
  16. 金币消耗明细
  17. </el-button>
  18. </el-button-group>
  19. <router-view></router-view>
  20. </div>
  21. </template>
  22. <script setup>
  23. import {ref, watch, onMounted, computed} from 'vue'; // 新增computed导入
  24. import {useRouter, useRoute} from 'vue-router';
  25. import {storeToRefs} from 'pinia';
  26. import {useAdminStore} from '@/store/index.js';
  27. const router = useRouter();
  28. const route = useRoute();
  29. const adminStore = useAdminStore();
  30. const {menuTree} = storeToRefs(adminStore);
  31. const activeTab = ref('');
  32. // 路由名称映射
  33. const routeMap = {
  34. add: 'addCoinConsume',
  35. detail: 'coinConsumeDetail'
  36. };
  37. // 新增消耗权限判断(与其他页面保持一致的computed写法)
  38. const hasAddPermission = computed(() => {
  39. if (!menuTree.value) return false;
  40. return menuTree.value.some(menu =>
  41. menu.menuName === '新增消耗' || menu.menuName === '消耗管理'
  42. );
  43. });
  44. // 金币消耗明细权限判断(补充明细权限逻辑)
  45. const hasDetailPermission = computed(() => {
  46. if (!menuTree.value) return false;
  47. return menuTree.value.some(menu =>
  48. menu.menuName === '金币消耗明细' || menu.menuName === '消耗管理'
  49. );
  50. });
  51. // 导航方法(补充权限校验)
  52. const navigateTo = (tab) => {
  53. // 检查对应权限,无权限则不执行跳转
  54. if ((tab === 'add' && !hasAddPermission.value) ||
  55. (tab === 'detail' && !hasDetailPermission.value)) {
  56. return;
  57. }
  58. activeTab.value = tab;
  59. router.push({name: routeMap[tab]});
  60. };
  61. // 检查权限并返回默认路由(优化权限判断逻辑)
  62. const getDefaultConsumeRoute = () => {
  63. // 优先检查新增消耗权限
  64. if (hasAddPermission.value) return 'add';
  65. // 其次检查明细权限
  66. if (hasDetailPermission.value) return 'detail';
  67. // 无任何权限时返回null
  68. return null;
  69. };
  70. // 监听路由变化更新标签状态(增加权限校验)
  71. watch(() => route.name, (newName) => {
  72. if (newName === routeMap.add && hasAddPermission.value) {
  73. activeTab.value = 'add';
  74. } else if (newName === routeMap.detail && hasDetailPermission.value) {
  75. activeTab.value = 'detail';
  76. }
  77. });
  78. // 监听路径变化,处理直接访问父路由的情况
  79. watch(() => route.path, (newPath) => {
  80. if (newPath === '/coinConsume') { // 假设父路由路径为/coinConsume
  81. const defaultRoute = getDefaultConsumeRoute();
  82. if (defaultRoute) {
  83. navigateTo(defaultRoute);
  84. } else {
  85. console.warn('用户没有新增消耗和金币消耗明细的权限');
  86. // router.push({ name: 'noPermission' }); // 可根据实际需求启用
  87. }
  88. }
  89. });
  90. // 初始化逻辑(完善权限校验和状态同步)
  91. onMounted(() => {
  92. // 父路由默认跳转
  93. if (route.path === '/coinConsume') { // 假设父路由路径为/coinConsume
  94. const defaultRoute = getDefaultConsumeRoute();
  95. if (defaultRoute) {
  96. navigateTo(defaultRoute);
  97. } else {
  98. // console.warn('用户没有新增消耗和金币消耗明细的权限');
  99. router.push({ name: 'noPermission' }); // 可根据实际需求启用
  100. }
  101. } else {
  102. // 子路由直接进入时同步状态(带权限校验)
  103. if (route.name === routeMap.add && hasAddPermission.value) {
  104. activeTab.value = 'add';
  105. } else if (route.name === routeMap.detail && hasDetailPermission.value) {
  106. activeTab.value = 'detail';
  107. }
  108. }
  109. });
  110. </script>