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.

93 lines
2.9 KiB

3 weeks ago
  1. <template>
  2. <div class="father">
  3. <el-button-group>
  4. <el-button :type="activeTab === 'addBeanRecharge' ? 'primary' : 'default'" @click="navigateTo('addBeanRecharge')"
  5. v-if="hasAdd" style="width: 6.5vw">
  6. 新增充值
  7. </el-button>
  8. <el-button :type="activeTab === 'beanSystemRecharge' ? 'primary' : 'default'"
  9. @click="navigateTo('beanSystemRecharge')" v-if="hasSystem" style="width: 6.5vw;">
  10. 系统充值
  11. </el-button>
  12. <el-button :type="activeTab === 'beanOnlineRecharge' ? 'primary' : 'default'"
  13. @click="navigateTo('beanOnlineRecharge')" v-if="hasOnline" style="width: 6.5vw;">
  14. 线上充值
  15. </el-button>
  16. </el-button-group>
  17. </div>
  18. <router-view></router-view>
  19. </template>
  20. <script setup>
  21. import { ref, watch, onMounted } from 'vue';
  22. import { useRouter, useRoute } from 'vue-router';
  23. import { storeToRefs } from 'pinia';
  24. import { useAdminStore } from '@/store/index.js';
  25. import { hasMenuPermission, permissionMapping } from "@/utils/menuTreePermission.js";
  26. const router = useRouter();
  27. const route = useRoute();
  28. const adminStore = useAdminStore();
  29. const { menuTree } = storeToRefs(adminStore);
  30. const activeTab = ref('');
  31. const hasAdd = ref(false);
  32. const hasSystem = ref(false);
  33. const hasOnline = ref(false);
  34. // 导航方法
  35. const navigateTo = (name) => {
  36. activeTab.value = name;
  37. router.push({ name });
  38. };
  39. // 初始化权限状态
  40. const initPermissions = () => {
  41. if (!menuTree.value || !menuTree.value.length) return;
  42. hasAdd.value = hasMenuPermission(menuTree.value, permissionMapping.addBeanRecharge);
  43. hasSystem.value = hasMenuPermission(menuTree.value, permissionMapping.beanSystemRecharge);
  44. hasOnline.value = hasMenuPermission(menuTree.value, permissionMapping.beanOnlineRecharge);
  45. };
  46. // 默认跳转逻辑
  47. const getDefaultAuditRoute = () => {
  48. initPermissions();
  49. if (hasAdd.value) return 'addBeanRecharge';
  50. if (hasSystem.value) return 'beanSystemRecharge';
  51. if (hasOnline.value) return 'beanOnlineRecharge';
  52. return 'addBeanRecharge';
  53. };
  54. // 监听路由变化更新标签状态
  55. watch(() => route.name, (newName) => {
  56. initPermissions()
  57. if (newName === 'addBeanRecharge' || newName === 'beanSystemRecharge' || newName === 'beanOnlineRecharge') {
  58. activeTab.value = newName;
  59. } else if (newName === 'beanRecharge') {
  60. // 每次访问 /beanConsume 都进行默认跳转
  61. const defaultRoute = getDefaultAuditRoute();
  62. navigateTo(defaultRoute);
  63. }
  64. });
  65. // 初始化逻辑
  66. onMounted(() => {
  67. initPermissions()
  68. if (route.name === 'beanRecharge') {
  69. const defaultRoute = getDefaultAuditRoute();
  70. navigateTo(defaultRoute);
  71. } else {
  72. // 非父路由初始化当前标签状态
  73. if (route.name === 'addBeanRecharge' || route.name === 'beanSystemRecharge' || route.name === 'beanOnlineRecharge') {
  74. activeTab.value = route.name;
  75. }
  76. }
  77. });
  78. </script>
  79. <style>
  80. .father {
  81. height: 2vw;
  82. }
  83. </style>