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.
121 lines
3.7 KiB
121 lines
3.7 KiB
<template>
|
|
<div>
|
|
<el-button-group>
|
|
<el-button
|
|
:type="activeTab === 'add' ? 'primary' : 'default'"
|
|
@click="navigateTo('add')"
|
|
:disabled="!hasAddPermission"
|
|
>
|
|
新增消耗
|
|
</el-button>
|
|
<el-button
|
|
:type="activeTab === 'detail' ? 'primary' : 'default'"
|
|
@click="navigateTo('detail')"
|
|
:disabled="!hasDetailPermission"
|
|
>
|
|
金币消耗明细
|
|
</el-button>
|
|
</el-button-group>
|
|
<router-view></router-view>
|
|
</div>
|
|
</template>
|
|
|
|
<script setup>
|
|
import {ref, watch, onMounted, computed} from 'vue'; // 新增computed导入
|
|
import {useRouter, useRoute} from 'vue-router';
|
|
import {storeToRefs} from 'pinia';
|
|
import {useAdminStore} from '@/store/index.js';
|
|
|
|
const router = useRouter();
|
|
const route = useRoute();
|
|
const adminStore = useAdminStore();
|
|
const {menuTree} = storeToRefs(adminStore);
|
|
|
|
const activeTab = ref('');
|
|
|
|
// 路由名称映射
|
|
const routeMap = {
|
|
add: 'addCoinConsume',
|
|
detail: 'coinConsumeDetail'
|
|
};
|
|
|
|
// 新增消耗权限判断(与其他页面保持一致的computed写法)
|
|
const hasAddPermission = computed(() => {
|
|
if (!menuTree.value) return false;
|
|
return menuTree.value.some(menu =>
|
|
menu.menuName === '新增消耗' || menu.menuName === '消耗管理'
|
|
);
|
|
});
|
|
|
|
// 金币消耗明细权限判断(补充明细权限逻辑)
|
|
const hasDetailPermission = computed(() => {
|
|
if (!menuTree.value) return false;
|
|
return menuTree.value.some(menu =>
|
|
menu.menuName === '金币消耗明细' || menu.menuName === '消耗管理'
|
|
);
|
|
});
|
|
|
|
// 导航方法(补充权限校验)
|
|
const navigateTo = (tab) => {
|
|
// 检查对应权限,无权限则不执行跳转
|
|
if ((tab === 'add' && !hasAddPermission.value) ||
|
|
(tab === 'detail' && !hasDetailPermission.value)) {
|
|
return;
|
|
}
|
|
activeTab.value = tab;
|
|
router.push({name: routeMap[tab]});
|
|
};
|
|
|
|
// 检查权限并返回默认路由(优化权限判断逻辑)
|
|
const getDefaultConsumeRoute = () => {
|
|
// 优先检查新增消耗权限
|
|
if (hasAddPermission.value) return 'add';
|
|
// 其次检查明细权限
|
|
if (hasDetailPermission.value) return 'detail';
|
|
// 无任何权限时返回null
|
|
return null;
|
|
};
|
|
|
|
// 监听路由变化更新标签状态(增加权限校验)
|
|
watch(() => route.name, (newName) => {
|
|
if (newName === routeMap.add && hasAddPermission.value) {
|
|
activeTab.value = 'add';
|
|
} else if (newName === routeMap.detail && hasDetailPermission.value) {
|
|
activeTab.value = 'detail';
|
|
}
|
|
});
|
|
|
|
// 监听路径变化,处理直接访问父路由的情况
|
|
watch(() => route.path, (newPath) => {
|
|
if (newPath === '/coinConsume') { // 假设父路由路径为/coinConsume
|
|
const defaultRoute = getDefaultConsumeRoute();
|
|
if (defaultRoute) {
|
|
navigateTo(defaultRoute);
|
|
} else {
|
|
console.warn('用户没有新增消耗和金币消耗明细的权限');
|
|
// router.push({ name: 'noPermission' }); // 可根据实际需求启用
|
|
}
|
|
}
|
|
});
|
|
|
|
// 初始化逻辑(完善权限校验和状态同步)
|
|
onMounted(() => {
|
|
// 父路由默认跳转
|
|
if (route.path === '/coinConsume') { // 假设父路由路径为/coinConsume
|
|
const defaultRoute = getDefaultConsumeRoute();
|
|
if (defaultRoute) {
|
|
navigateTo(defaultRoute);
|
|
} else {
|
|
// console.warn('用户没有新增消耗和金币消耗明细的权限');
|
|
router.push({ name: 'noPermission' }); // 可根据实际需求启用
|
|
}
|
|
} else {
|
|
// 子路由直接进入时同步状态(带权限校验)
|
|
if (route.name === routeMap.add && hasAddPermission.value) {
|
|
activeTab.value = 'add';
|
|
} else if (route.name === routeMap.detail && hasDetailPermission.value) {
|
|
activeTab.value = 'detail';
|
|
}
|
|
}
|
|
});
|
|
</script>
|