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.

90 lines
2.6 KiB

4 months ago
2 months ago
4 weeks ago
4 weeks ago
2 months ago
2 months ago
4 months ago
3 weeks ago
4 weeks ago
3 weeks ago
3 weeks ago
2 months ago
  1. <template>
  2. <div class="father">
  3. <!-- 这里放置标签切换的按钮 -->
  4. <el-button-group>
  5. <el-button :type="activeTab === 'coinRefundDetail' ? 'primary' : 'default'"
  6. @click="navigateTo('coinRefundDetail')" :disabled="!hasDetail" v-if="hasDetail">
  7. 金币退款明细
  8. </el-button>
  9. <!-- 切换后状态显示 primary 样式否则是默认样式 -->
  10. <el-button :type="activeTab === 'addCoinRefund' ? 'primary' : 'default'" @click="navigateTo('addCoinRefund')"
  11. :disabled="!hasAdd" v-if="hasAdd">
  12. 新增退款
  13. </el-button>
  14. </el-button-group>
  15. <!-- 渲染子路由组件 -->
  16. </div>
  17. <div>
  18. <router-view></router-view>
  19. </div>
  20. </template>
  21. <script setup>
  22. import {onMounted, ref, watch} from 'vue';
  23. import {useRoute, useRouter} from 'vue-router';
  24. import {storeToRefs} from "pinia";
  25. import {useAdminStore} from "@/store/index.js";
  26. import {hasMenuPermission, permissionMapping} from "@/utils/menuTreePermission.js";
  27. const router = useRouter();
  28. const route = useRoute();
  29. const adminStore = useAdminStore();
  30. const {menuTree} = storeToRefs(adminStore);
  31. const activeTab = ref('');
  32. const hasAdd = ref(false);
  33. const hasDetail = 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.addCoinRefund);
  43. hasDetail.value = hasMenuPermission(menuTree.value, permissionMapping.coinRefundDetail);
  44. };
  45. // 默认跳转逻辑
  46. const getDefaultAuditRoute = () => {
  47. initPermissions();
  48. if (hasDetail.value) return 'coinRefundDetail';
  49. if (hasAdd.value) return 'addCoinRefund';
  50. return 'coinRefundDetail';
  51. };
  52. // 监听路由变化更新标签状态
  53. watch(() => route.name, (newName) => {
  54. initPermissions()
  55. if (newName === 'addCoinRefund' || newName === 'coinRefundDetail') {
  56. activeTab.value = newName;
  57. } else if (newName === 'coinRefund') {
  58. // 每次访问 /coinConsume 都进行默认跳转
  59. const defaultRoute = getDefaultAuditRoute();
  60. navigateTo(defaultRoute);
  61. }
  62. });
  63. // 初始化逻辑
  64. onMounted(() => {
  65. initPermissions()
  66. if (route.name === 'coinRefund') {
  67. const defaultRoute = getDefaultAuditRoute();
  68. navigateTo(defaultRoute);
  69. } else {
  70. // 非父路由初始化当前标签状态
  71. if (route.name === 'coinRefundDetail' || route.name === 'addCoinRefund') {
  72. activeTab.value = route.name;
  73. }
  74. }
  75. });
  76. </script>
  77. <style lang="css">
  78. .father {
  79. width: 82vw;
  80. height: 4vh;
  81. }
  82. </style>