49 lines
1.8 KiB
TypeScript
49 lines
1.8 KiB
TypeScript
import { defineStore } from 'pinia'
|
||
import { ref } from 'vue'
|
||
import request from '@/utils/request'
|
||
|
||
export const usePermissionStore = defineStore('permission', () => {
|
||
// 存储我能看到的页面代码 (如 ['inbound_buy', ...])
|
||
const menuPermissions = ref<string[]>([])
|
||
|
||
// 存储我能看到的列代码 (如 ['unit_price', 'sale_price'])
|
||
const elementPermissions = ref<string[]>([])
|
||
|
||
// 初始化加载权限 (登录后调用)
|
||
const loadPermissions = async () => {
|
||
try {
|
||
const res: any = await request({
|
||
url: '/v1/auth/my-permissions',
|
||
method: 'get'
|
||
})
|
||
if (res.code === 200 && res.data) {
|
||
menuPermissions.value = res.data.menus || []
|
||
elementPermissions.value = res.data.elements || []
|
||
console.log('权限字典加载完成:', elementPermissions.value.length, '个列权限')
|
||
}
|
||
} catch (e) {
|
||
console.error('加载权限失败', e)
|
||
// 失败时清空,防止残留
|
||
menuPermissions.value = []
|
||
elementPermissions.value = []
|
||
}
|
||
}
|
||
|
||
// ★ 核心判断函数:判断当前用户是否拥有某个列/按钮的权限
|
||
// page: 页面代码 (预留字段,目前全局唯一code,暂不使用page隔离)
|
||
// code: 权限标识 (如 'unit_price')
|
||
const hasColumnPermission = (page: string, code: string) => {
|
||
// 1. 如果列没有配置 permissionKey,说明是公开列,直接放行
|
||
if (!code) return true
|
||
|
||
// 2. 检查权限池里是否有这个 code
|
||
return elementPermissions.value.includes(code)
|
||
}
|
||
|
||
return {
|
||
menuPermissions,
|
||
elementPermissions,
|
||
loadPermissions,
|
||
hasColumnPermission
|
||
}
|
||
}) |