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.

101 lines
2.7 KiB

  1. <template>
  2. <div>
  3. <!-- 这里放置标签切换的按钮 -->
  4. <el-button-group>
  5. <!-- 切换后状态显示 primary 样式否则是默认样式 -->
  6. <el-button
  7. :type="activeTab === 'detail' ? 'primary' : 'default'"
  8. @click="goToAdd"
  9. >
  10. 金币明细
  11. </el-button>
  12. <el-button
  13. :type="activeTab === 'balance' ? 'primary' : 'default'"
  14. @click="goToDetail"
  15. >
  16. 金币余额
  17. </el-button>
  18. </el-button-group>
  19. <!-- 渲染子路由组件 -->
  20. <router-view></router-view>
  21. </div>
  22. </template>
  23. <script setup>
  24. import {onMounted, ref, watch} from 'vue';
  25. import { useRouter, useRoute } from 'vue-router';
  26. import {useAdminStore} from "@/store/index.js";
  27. import {storeToRefs} from "pinia";
  28. const adminStore = useAdminStore();
  29. const {menuTree} = storeToRefs(adminStore);
  30. const router = useRouter();// 获取路由实例
  31. const route = useRoute();// 获取当前路由信息
  32. // 定义响应式变量 activeTab 来跟踪当前激活的标签
  33. const activeTab = ref(route.name === 'clientCountBalance' ? 'balance' : 'detail');
  34. const goToAdd = () => {
  35. // 点击按钮时更新 activeTab 为 add
  36. activeTab.value = 'detail';
  37. router.push({ name: 'clientCountDetail' });
  38. };
  39. const goToDetail = () => {
  40. // 点击按钮时更新 activeTab 为 detail
  41. activeTab.value = 'balance';
  42. router.push({ name: 'clientCountBalance' });
  43. };
  44. // 导航方法
  45. const navigateTo = (name) => {
  46. activeTab.value = name;
  47. if (name === 'detail') {
  48. router.push({name: 'clientCountDetail'});
  49. } else if (name === 'balance') {
  50. router.push({name: 'clientCountBalance'});
  51. }
  52. };
  53. // 递归判断某个 menuName 是否存在
  54. const hasMenuPermission = (tree, targetName) => {
  55. for (const node of tree) {
  56. if (node.menuName === targetName) return true;
  57. if (node.children && hasMenuPermission(node.children, targetName)) return true;
  58. }
  59. return false;
  60. };
  61. // 默认路由判断
  62. const getDefaultRoute = () => {
  63. if (!menuTree.value) return 'detail';
  64. const hasRecharge = hasMenuPermission(menuTree.value, '查看金币明细');
  65. return hasRecharge ? 'detail' : 'balance';
  66. };
  67. // 监听路由变化更新标签状态
  68. watch(() => route.name, (newName) => {
  69. if (newName === 'detail' || newName === 'balance') {
  70. activeTab.value = newName;
  71. } else if (newName === 'usergold') {
  72. const defaultRoute = getDefaultRoute();
  73. navigateTo(defaultRoute);
  74. }
  75. });
  76. // 初始化逻辑
  77. onMounted(() => {
  78. if (route.name === 'usergold') {
  79. const defaultRoute = getDefaultRoute();
  80. navigateTo(defaultRoute);
  81. } else {
  82. // 非父路由初始化当前标签状态
  83. if (route.name === 'detail' || route.name === 'balance') {
  84. activeTab.value = route.name;
  85. }
  86. }
  87. });
  88. </script>