Browse Source

Merge remote-tracking branch 'origin/lihui/feature-20250711103624-金币二期' into lihui/feature-20250711103624-金币二期

# Conflicts:
#	src/utils/menuUtils.js
#	src/views/usergold/clientCount.vue
zhangrenyuan/feature-20250714163943-金币前端二期
lihui 3 weeks ago
parent
commit
0f3c0ae813
  1. 152
      src/router/index.js
  2. 125
      src/views/audit/audit.vue
  3. 124
      src/views/consume/coinConsume.vue
  4. 118
      src/views/recharge/coinRecharge.vue
  5. 118
      src/views/refund/coinRefund.vue

152
src/router/index.js

@ -1,17 +1,11 @@
import { createRouter, createWebHashHistory } from 'vue-router';
import {createRouter, createWebHashHistory} from 'vue-router';
import axios from "axios"; import axios from "axios";
import request from "@/util/http.js";
import {ref} from "vue";
import {storeToRefs} from "pinia";
import {useAdminStore} from "@/store/index.js";
// 路由定义(包含权限映射 meta.permissionId) // 路由定义(包含权限映射 meta.permissionId)
const routes = [ const routes = [
// {
// path: '/workspace',
// name: "workspace",
// component: () => import("../views/workspace/audit.vue"),
// meta: { permissionId: 10 } // 对应"工作台展示"id=10
// },
{ {
path: '/', path: '/',
redirect: "/login" redirect: "/login"
@ -21,17 +15,17 @@ const routes = [
name: "login", name: "login",
component: () => import("../views/login.vue"), component: () => import("../views/login.vue"),
}, },
{
meta: { requireAuth: true },
{
meta: {requireAuth: true},
path: '/', path: '/',
component: () => import("../views/home.vue"), component: () => import("../views/home.vue"),
children: [
// 工作台
children: [
// 工作台
{ {
path: '/workspace', path: '/workspace',
name: "workspace", name: "workspace",
component: () => import("../views/workspace/index.vue"), component: () => import("../views/workspace/index.vue"),
meta: { permissionId: 10 } // 对应"工作台展示"id=10
meta: {permissionId: 10} // 对应"工作台展示"id=10
}, },
@ -40,148 +34,147 @@ const routes = [
path: '/audit', path: '/audit',
name: "audit", name: "audit",
component: () => import("../views/audit/audit.vue"), component: () => import("../views/audit/audit.vue"),
meta: { permissionId: 40 },
meta: {permissionId: 40},
// redirect: '/index', // redirect: '/index',
children: [ children: [
// 充值审核========================================
// 充值审核
{ {
path: 'rechargeAudit', path: 'rechargeAudit',
name: "rechargeAudit", name: "rechargeAudit",
component: () => import("../views/audit/rechargeAudit.vue"), component: () => import("../views/audit/rechargeAudit.vue"),
meta: { permissionId: [11, 12] } // 对应"查看充值审核"id=11、"充值审批"id=12
meta: {permissionId: [11, 12]} // 对应"查看充值审核"id=11、"充值审批"id=12
}, },
// 退款审核
// 退款审核
{ {
path: 'refundAudit', path: 'refundAudit',
name: "refundAudit", name: "refundAudit",
component: () => import("../views/audit/refundAudit.vue"), component: () => import("../views/audit/refundAudit.vue"),
meta: { permissionId: [13, 14] } // 对应"查看退款审核"id=13、"退款审批"id=14
meta: {permissionId: [13, 14]} // 对应"查看退款审核"id=13、"退款审批"id=14
}, },
] ]
}, },
// 金币消耗
// 金币消耗
{ {
path: '/coinConsume', path: '/coinConsume',
name: "coinConsume", name: "coinConsume",
component: () => import("../views/consume/coinConsume.vue"), component: () => import("../views/consume/coinConsume.vue"),
// redirect: '/coinConsume/add', // redirect: '/coinConsume/add',
meta: { permissionId: 6 },
children: [
// 金币新增消耗
meta: {permissionId: 6},
children: [
// 金币新增消耗
{ {
path: 'add', path: 'add',
name: "addCoinConsume", name: "addCoinConsume",
component: () => import("../views/consume/addCoinConsume.vue"), component: () => import("../views/consume/addCoinConsume.vue"),
meta: { permissionId: 19 } // 对应"提交金币消耗"id=19
meta: {permissionId: 19} // 对应"提交金币消耗"id=19
}, },
// 金币消耗明细详情
// 金币消耗明细详情
{ {
path: 'detail', path: 'detail',
name: "coinConsumeDetail", name: "coinConsumeDetail",
component: () => import("../views/consume/coinConsumeDetail.vue"), component: () => import("../views/consume/coinConsumeDetail.vue"),
meta: { permissionId: 20 } // 对应"查看金币消耗明细"id=20
meta: {permissionId: 20} // 对应"查看金币消耗明细"id=20
} }
] ]
}, },
// 汇率管理
// 汇率管理
{ {
path: '/rate', path: '/rate',
name: "rate", name: "rate",
component: () => import("../views/managerecharge/rate.vue"), component: () => import("../views/managerecharge/rate.vue"),
meta: { permissionId: [15, 16] } // 对应"汇率查看"id=15、"汇率修改"id=16
meta: {permissionId: [15, 16]} // 对应"汇率查看"id=15、"汇率修改"id=16
}, },
// 金币充值
// 金币充值
{ {
path: '/coinRecharge', path: '/coinRecharge',
name: "coinRecharge", name: "coinRecharge",
component: () => import("../views/recharge/coinRecharge.vue"), component: () => import("../views/recharge/coinRecharge.vue"),
// redirect: '/coinRecharge/add', // redirect: '/coinRecharge/add',
children: [
// 金币新增充值
children: [
// 金币新增充值
{ {
path: 'add', path: 'add',
name: "addCoinRecharge", name: "addCoinRecharge",
component: () => import("../views/recharge/addCoinRecharge.vue"), component: () => import("../views/recharge/addCoinRecharge.vue"),
meta: { permissionId: 17 } // 对应"提交金币充值"id=17
meta: {permissionId: 17} // 对应"提交金币充值"id=17
}, },
// 金币充值明细详情
// 金币充值明细详情
{ {
path: 'detail', path: 'detail',
name: "coinRechargeDetail", name: "coinRechargeDetail",
component: () => import("../views/recharge/coinRechargeDetail.vue"), component: () => import("../views/recharge/coinRechargeDetail.vue"),
meta: { permissionId: 18 } // 对应"查看金币充值明细"id=18
meta: {permissionId: 18} // 对应"查看金币充值明细"id=18
} }
] ]
}, },
// 金币退款
// 金币退款
{ {
path: '/coinRefund', path: '/coinRefund',
name: "coinRefund", name: "coinRefund",
component: () => import("../views/refund/coinRefund.vue"), component: () => import("../views/refund/coinRefund.vue"),
// redirect: '/coinRefund/add', // redirect: '/coinRefund/add',
meta: { permissionId: 7 },
children: [
meta: {permissionId: 7},
children: [
// 金币新增退款 // 金币新增退款
{ {
path: 'add', path: 'add',
name: "addCoinRefund", name: "addCoinRefund",
component: () => import("../views/refund/addCoinRefund.vue"), component: () => import("../views/refund/addCoinRefund.vue"),
meta: { permissionId: 21 } // 对应"提交金币退款"id=21
meta: {permissionId: 21} // 对应"提交金币退款"id=21
}, },
// 金币退款明细详情 // 金币退款明细详情
{ {
path: 'detail', path: 'detail',
name: "coinRefundDetail", name: "coinRefundDetail",
component: () => import("../views/refund/coinRefundDetail.vue"), component: () => import("../views/refund/coinRefundDetail.vue"),
meta: { permissionId: 22 } // 对应"查看金币退款明细"id=22
meta: {permissionId: 22} // 对应"查看金币退款明细"id=22
} }
] ]
}, },
// 客户账户明细
// 客户账户明细
{ {
path: '/usergold', path: '/usergold',
name: "usergold", name: "usergold",
component: () => import("../views/usergold/clientCount.vue"), component: () => import("../views/usergold/clientCount.vue"),
// redirect: '/usergold/detail', // redirect: '/usergold/detail',
meta: { permissionId: 8 },
children: [
// 金币明细
meta: {permissionId: 8},
children: [
// 金币明细
{ {
path: 'detail', path: 'detail',
name: "clientCountDetail", name: "clientCountDetail",
component: () => import("../views/usergold/clientCountDetail.vue"), component: () => import("../views/usergold/clientCountDetail.vue"),
meta: { permissionId: 23 } // 对应"查看金币明细"id=23
meta: {permissionId: 23} // 对应"查看金币明细"id=23
}, },
// 金币余额
// 金币余额
{ {
path: 'balance', path: 'balance',
name: "clientCountBalance", name: "clientCountBalance",
component: () => import("../views/usergold/clientCountBalance.vue"), component: () => import("../views/usergold/clientCountBalance.vue"),
meta: { permissionId: 24 } // 对应"查看金币余额"id=24
meta: {permissionId: 24} // 对应"查看金币余额"id=24
}, },
]
},
// 权限管理
]
},
// 权限管理
{ {
path: '/permissions', path: '/permissions',
name: "permissions", name: "permissions",
component: () => import("../views/permissions/permission.vue"), component: () => import("../views/permissions/permission.vue"),
meta: { permissionId: [25, 26, 27, 28, 29] } // 对应权限管理下的所有操作
meta: {permissionId: [25, 26, 27, 28, 29]} // 对应权限管理下的所有操作
}, },
// 没有权限
// 没有权限
{ {
path: '/noPermission', path: '/noPermission',
name: "noPermission", name: "noPermission",
component: () => import("../views/noPermissionPage.vue") component: () => import("../views/noPermissionPage.vue")
} }
]
},
]
},
// 跳转页面(无需权限) // 跳转页面(无需权限)
{ {
path: '/PasswordSuccess', path: '/PasswordSuccess',
@ -229,26 +222,14 @@ const getAllPermissionIds = (menuTree) => {
return permissionIds; return permissionIds;
}; };
// 存储管理员信息(全局可访问)
const adminData = ref(null);
// 获取管理员信息(返回Promise,方便路由守卫中使用)
export const getAdminData = async function () {
try {
const result = await request({
url: "/admin/userinfo",
});
adminData.value = result; // 存储管理员信息(包含roleId)
return result; // 返回结果,供路由守卫使用
} catch (error) {
console.log("获取管理员信息失败", error);
throw error; // 抛出错误,让路由守卫捕获
}
};
// 全局路由守卫 // 全局路由守卫
router.beforeEach(async (to, from, next) => { router.beforeEach(async (to, from, next) => {
const adminStore = useAdminStore()
const { adminData, menuTree } = storeToRefs(adminStore)
const token = localStorage.getItem("token"); const token = localStorage.getItem("token");
const machineId = localStorage.getItem("machineId"); const machineId = localStorage.getItem("machineId");
@ -265,40 +246,27 @@ router.beforeEach(async (to, from, next) => {
let roleId = null; let roleId = null;
console.log('adminData:', adminData) console.log('adminData:', adminData)
try { try {
await getAdminData(); // 等待管理员信息获取完成
roleId = adminData.value.roleId; roleId = adminData.value.roleId;
if (!roleId) { if (!roleId) {
throw new Error("未获取到roleId");
localStorage.removeItem('token'); // 清除token,强制重新登录
next(`/login?machineId=${machineId || ''}`);
return;
} }
} catch (error) { } catch (error) {
localStorage.removeItem('token'); // 清除token,强制重新登录 localStorage.removeItem('token'); // 清除token,强制重新登录
adminStore.clearState()
next(`/login?machineId=${machineId || ''}`); next(`/login?machineId=${machineId || ''}`);
return; return;
} }
let userPermissionIds = []; let userPermissionIds = [];
try {
const response = await request( {url: "/menu/tree",
data:{id: roleId}
});
console.log('roleId:', roleId)
console.log('response:', response)
console.log('userPermissionIds:', userPermissionIds)
if (response.code === 200 && response.data) {
userPermissionIds = getAllPermissionIds(response.data); // 提取权限id
console.log('userPermissionIds:', userPermissionIds)
}
} catch (error) {
console.error('获取菜单树失败:', error);
localStorage.removeItem('token');
next(`/login?machineId=${machineId || ''}`);
return;
}
// 2.4 权限验证(逻辑不变)
console.log('to.meta:',to.meta)
// 拿权限id
userPermissionIds = getAllPermissionIds(menuTree.value)
// 2.4 权限验证(逻辑不变)
console.log('to.meta:', to.meta)
const requiresPermission = to.meta && to.meta.permissionId; const requiresPermission = to.meta && to.meta.permissionId;
if (requiresPermission) { if (requiresPermission) {

125
src/views/audit/audit.vue

@ -1,66 +1,117 @@
<template> <template>
<div> <div>
<!-- 这里放置标签切换的按钮 -->
<el-button-group> <el-button-group>
<!-- 切换后状态显示 primary 样式否则是默认样式 -->
<el-button <el-button
:type="activeTab === 'rechargeAudit' ? 'primary' : 'default'" :type="activeTab === 'rechargeAudit' ? 'primary' : 'default'"
@click="goRechargeAudit"
@click="navigateTo('rechargeAudit')"
:disabled="!hasRechargePermission"
> >
充值审核 充值审核
</el-button> </el-button>
<el-button <el-button
:type="activeTab === 'refundAudit' ? 'primary' : 'default'" :type="activeTab === 'refundAudit' ? 'primary' : 'default'"
@click="goRefundAudit"
@click="navigateTo('refundAudit')"
:disabled="!hasRefundPermission"
> >
退款审核 退款审核
</el-button> </el-button>
</el-button-group> </el-button-group>
<!-- 渲染子路由组件 -->
<router-view></router-view> <router-view></router-view>
</div> </div>
</template> </template>
<script setup >
import {onMounted, ref, watch} from 'vue';
import { useRouter, useRoute } from 'vue-router';
<script setup>
import {ref, watch, onMounted, computed} from 'vue';
import {useRouter, useRoute} from 'vue-router';
import {storeToRefs} from 'pinia';
import {useAdminStore} from '@/store/index.js';
const router = useRouter();//
const route = useRoute();//
// activeTab
const activeTab = ref(route.name === 'rechargeAudit' ? 'rechargeAudit' : 'refundAudit');
//clientCountBalancebalancedetail
//clientCountDetaildetail
const router = useRouter();
const route = useRoute();
const adminStore = useAdminStore();
const {menuTree} = storeToRefs(adminStore);
const activeTab = ref('');
const goRechargeAudit = () => {
// activeTab detail
activeTab.value = 'rechargeAudit';
router.push({ name: 'rechargeAudit' });
};
//
const hasRechargePermission = computed(() => {
if (!menuTree.value) return false;
return menuTree.value.some(menu =>
menu.menuName === '充值审核' || menu.menuName === '财务审核'
);
});
const goRefundAudit = () => {
// activeTab balance
activeTab.value = 'refundAudit';
router.push({ name: 'refundAudit' });
};
// 退
const hasRefundPermission = computed(() => {
if (!menuTree.value) return false;
return menuTree.value.some(menu =>
menu.menuName === '退款审核' || menu.menuName === '财务审核'
);
});
// activeTab
watch(() => route.name, (newName) => {
if (newName === 'rechargeAudit') {
activeTab.value = 'rechargeAudit';
} else if (newName === 'refundAudit') {
activeTab.value = 'refundAudit';
}});
//
const navigateTo = (name) => {
//
if ((name === 'rechargeAudit' && !hasRechargePermission.value) ||
(name === 'refundAudit' && !hasRefundPermission.value)) {
return;
}
activeTab.value = name;
router.push({name});
};
//
// if (route.name === 'usergold') {
// router.push({ name: 'clientCountDetail' });
// }
//
const getDefaultAuditRoute = () => {
//
if (hasRechargePermission.value) return 'rechargeAudit';
// 退
if (hasRefundPermission.value) return 'refundAudit';
// null
return null;
};
//
watch(() => route.path, (newPath) => {
// /audit
if (newPath === '/audit') {
const defaultRoute = getDefaultAuditRoute();
if (defaultRoute) {
navigateTo(defaultRoute);
} else {
console.warn('用户没有充值审核和退款审核的权限');
// router.push({ name: 'noPermission' });
}
}
});
onMounted(async function () {
console.log("@@@@@@@@@@@@",route.name)
//
watch(() => route.name, (newName) => {
//
if (newName === 'rechargeAudit' && hasRechargePermission.value) {
activeTab.value = newName;
} else if (newName === 'refundAudit' && hasRefundPermission.value) {
activeTab.value = newName;
}
}); });
// -
onMounted(() => {
//
if (route.path === '/audit') {
const defaultRoute = getDefaultAuditRoute();
if (defaultRoute) {
navigateTo(defaultRoute);
} else {
// console.warn('退');
router.push({ name: 'noPermission' });
}
} else {
//
if (route.name === 'rechargeAudit' && hasRechargePermission.value) {
activeTab.value = route.name;
} else if (route.name === 'refundAudit' && hasRefundPermission.value) {
activeTab.value = route.name;
}
}
});
</script> </script>

124
src/views/consume/coinConsume.vue

@ -1,61 +1,121 @@
<template> <template>
<div> <div>
<!-- 这里放置标签切换的按钮 -->
<el-button-group> <el-button-group>
<!-- 切换后状态显示 primary 样式否则是默认样式 -->
<el-button <el-button
:type="activeTab === 'add' ? 'primary' : 'default'"
@click="goToAdd"
:type="activeTab === 'add' ? 'primary' : 'default'"
@click="navigateTo('add')"
:disabled="!hasAddPermission"
> >
新增消耗
新增消耗
</el-button> </el-button>
<el-button <el-button
:type="activeTab === 'detail' ? 'primary' : 'default'"
@click="goToDetail"
:type="activeTab === 'detail' ? 'primary' : 'default'"
@click="navigateTo('detail')"
:disabled="!hasDetailPermission"
> >
金币消耗明细
金币消耗明细
</el-button> </el-button>
</el-button-group> </el-button-group>
<!-- 渲染子路由组件 -->
<router-view></router-view> <router-view></router-view>
</div> </div>
</template> </template>
<script setup> <script setup>
import { ref, watch } from 'vue';
import { useRouter, useRoute } from 'vue-router';
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();//
// activeTab
const activeTab = ref(route.name === 'coinConsumeDetail' ? 'detail' : 'add');
//coinConsumeDetaildetailadd
//coinConsumeadd
const router = useRouter();
const route = useRoute();
const adminStore = useAdminStore();
const {menuTree} = storeToRefs(adminStore);
const activeTab = ref('');
const goToAdd = () => {
// activeTab add
activeTab.value = 'add';
router.push({ name: 'addCoinConsume' });
//
const routeMap = {
add: 'addCoinConsume',
detail: 'coinConsumeDetail'
}; };
const goToDetail = () => {
// activeTab detail
activeTab.value = 'detail';
router.push({ name: '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;
}; };
// activeTab
//
watch(() => route.name, (newName) => { watch(() => route.name, (newName) => {
if (newName === 'addCoinConsume') {
if (newName === routeMap.add && hasAddPermission.value) {
activeTab.value = 'add'; activeTab.value = 'add';
} else if (newName === 'coinConsumeDetail') {
} else if (newName === routeMap.detail && hasDetailPermission.value) {
activeTab.value = 'detail'; activeTab.value = 'detail';
} }
}); });
//
// if (route.name === 'coinConsume') {
// router.push({ name: 'addCoinConsume' });
// }
// 访
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> </script>

118
src/views/recharge/coinRecharge.vue

@ -1,61 +1,119 @@
<template> <template>
<div> <div>
<!-- 这里放置标签切换的按钮 -->
<el-button-group> <el-button-group>
<!-- 切换后状态显示 primary 样式否则是默认样式 -->
<el-button <el-button
:type="activeTab === 'add' ? 'primary' : 'default'"
@click="goToAdd"
:type="activeTab === 'add' ? 'primary' : 'default'"
@click="navigateTo('add')"
:disabled="!hasAddPermission"
> >
新增充值 新增充值
</el-button> </el-button>
<el-button <el-button
:type="activeTab === 'detail' ? 'primary' : 'default'"
@click="goToDetail"
:type="activeTab === 'detail' ? 'primary' : 'default'"
@click="navigateTo('detail')"
:disabled="!hasDetailPermission"
> >
金币充值明细 金币充值明细
</el-button> </el-button>
</el-button-group> </el-button-group>
<!-- 渲染子路由组件 -->
<router-view></router-view> <router-view></router-view>
</div> </div>
</template> </template>
<script setup> <script setup>
import { ref, watch } from 'vue';
import { useRouter, useRoute } from 'vue-router';
import {ref, watch, onMounted, computed} from 'vue';
import {useRouter, useRoute} from 'vue-router';
import {storeToRefs} from 'pinia';
import {useAdminStore} from '@/store/index.js';
const router = useRouter();//
const route = useRoute();//
const activeTab = ref(route.name === 'coinRechargeDetail' ? 'detail' : 'add');
//coinRechargeDetaildetailadd
//coinRechargeadd
//coinRechargeadd
const router = useRouter();
const route = useRoute();
const adminStore = useAdminStore();
const {menuTree} = storeToRefs(adminStore);
//
const routeMap = {
add: 'addCoinRecharge',
detail: 'coinRechargeDetail'
};
//
const activeTab = ref('');
//
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 goToAdd = () => {
// activeTab add
activeTab.value = 'add';
router.push({ name: 'addCoinRecharge' });
//
const navigateTo = (tab) => {
//
if ((tab === 'add' && !hasAddPermission.value) ||
(tab === 'detail' && !hasDetailPermission.value)) {
return;
}
activeTab.value = tab;
router.push({name: routeMap[tab]});
}; };
const goToDetail = () => {
// activeTab detail
activeTab.value = 'detail';
router.push({ name: 'coinRechargeDetail' });
//
const getDefaultRoute = () => {
if (hasAddPermission.value) return 'add';
if (hasDetailPermission.value) return 'detail';
return null;
}; };
// activeTab
//
watch(() => route.name, (newName) => { watch(() => route.name, (newName) => {
if (newName === 'addCoinRecharge') {
if (newName === routeMap.add && hasAddPermission.value) {
activeTab.value = 'add'; activeTab.value = 'add';
} else if (newName === 'coinRechargeDetail') {
} else if (newName === routeMap.detail && hasDetailPermission.value) {
activeTab.value = 'detail'; activeTab.value = 'detail';
} }
}); });
//
// if (route.name === 'coinRecharge') {
// router.push({ name: 'addCoinRecharge' });
// }
// 访
watch(() => route.path, (newPath) => {
if (newPath === '/coinRecharge') { // /coinRecharge
const defaultTab = getDefaultRoute();
if (defaultTab) {
navigateTo(defaultTab);
} else {
console.warn('用户没有新增充值和金币充值明细的权限');
// router.push({ name: 'noPermission' }); //
}
}
});
//
onMounted(() => {
//
if (route.name === 'coinRecharge' || route.path === '/coinRecharge') {
const defaultTab = getDefaultRoute();
if (defaultTab) {
navigateTo(defaultTab);
} 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> </script>

118
src/views/refund/coinRefund.vue

@ -1,61 +1,119 @@
<template> <template>
<div> <div>
<!-- 这里放置标签切换的按钮 -->
<el-button-group> <el-button-group>
<!-- 切换后状态显示 primary 样式否则是默认样式 -->
<el-button <el-button
:type="activeTab === 'add' ? 'primary' : 'default'"
@click="goToAdd"
:type="activeTab === 'add' ? 'primary' : 'default'"
@click="navigateTo('add')"
:disabled="!hasAddPermission"
> >
新增退款 新增退款
</el-button> </el-button>
<el-button <el-button
:type="activeTab === 'detail' ? 'primary' : 'default'"
@click="goToDetail"
:type="activeTab === 'detail' ? 'primary' : 'default'"
@click="navigateTo('detail')"
:disabled="!hasDetailPermission"
> >
金币退款明细 金币退款明细
</el-button> </el-button>
</el-button-group> </el-button-group>
<!-- 渲染子路由组件 -->
<router-view></router-view> <router-view></router-view>
</div> </div>
</template> </template>
<script setup> <script setup>
import { ref, watch } from 'vue';
import { useRouter, useRoute } from 'vue-router';
import {ref, watch, onMounted, computed} from 'vue';
import {useRouter, useRoute} from 'vue-router';
import {storeToRefs} from 'pinia';
import {useAdminStore} from '@/store/index.js';
const router = useRouter();//
const route = useRoute();//
// activeTab
const activeTab = ref(route.name === 'coinRefundDetail' ? 'detail' : 'add');
//coinRefundDetaildetailadd
//coinRefundadd
const router = useRouter();
const route = useRoute();
const adminStore = useAdminStore();
const {menuTree} = storeToRefs(adminStore);
//
const routeMap = {
add: 'addCoinRefund',
detail: 'coinRefundDetail'
};
//
const activeTab = ref('');
//
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 goToAdd = () => {
// activeTab add
activeTab.value = 'add';
router.push({ name: 'addCoinRefund' });
//
const navigateTo = (tab) => {
//
if ((tab === 'add' && !hasAddPermission.value) ||
(tab === 'detail' && !hasDetailPermission.value)) {
return;
}
activeTab.value = tab;
router.push({name: routeMap[tab]});
}; };
const goToDetail = () => {
// activeTab detail
activeTab.value = 'detail';
router.push({ name: 'coinRefundDetail' });
//
const getDefaultRoute = () => {
if (hasAddPermission.value) return 'add';
if (hasDetailPermission.value) return 'detail';
return null;
}; };
// activeTab
//
watch(() => route.name, (newName) => { watch(() => route.name, (newName) => {
if (newName === 'addCoinRefund') {
if (newName === routeMap.add && hasAddPermission.value) {
activeTab.value = 'add'; activeTab.value = 'add';
} else if (newName === 'coinRefundDetail') {
} else if (newName === routeMap.detail && hasDetailPermission.value) {
activeTab.value = 'detail'; activeTab.value = 'detail';
} }
}); });
//
// if (route.name === 'coinRefund') {
// router.push({ name: 'addCoinRefund' });
// }
// 访
watch(() => route.path, (newPath) => {
if (newPath === '/coinRefund') {
const defaultTab = getDefaultRoute();
if (defaultTab) {
navigateTo(defaultTab);
} else {
console.warn('用户没有新增退款和金币退款明细的权限');
// router.push({ name: 'noPermission' });
}
}
});
//
onMounted(() => {
//
if (route.path === '/coinRefund') {
const defaultTab = getDefaultRoute();
if (defaultTab) {
navigateTo(defaultTab);
} 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> </script>
Loading…
Cancel
Save