20260727173703

This commit is contained in:
oneao committed 2026-07-27 17:37:03 +08:00
1 parent a8478d60ed
commit 9dbaef7787
114 files changed
+959 -2588

No files matched your search

+53 -15
View File
@@ -6,13 +6,18 @@ import { useAuthStore } from "./auth";
export const usePermissionStore = defineStore("permissions", () => {
const authStore = useAuthStore();
const loadedPrincipalKey = ref("");
const modules = ref([]);
const grantedPageIds = ref([]);
const moduleCodes = ref([]);
const powerCodes = ref([]);
let loadingPromise = null;
let loadingPrincipalKey = "";
let loadVersion = 0;
const moduleSet = computed(() => new Set(moduleCodes.value));
const moduleByCode = computed(
() => new Map(modules.value.map((module) => [String(module.b_code || ""), module])),
);
const grantedPageSet = computed(() => new Set(grantedPageIds.value));
const powerSet = computed(() => new Set(powerCodes.value));
const isG3soft = computed(() => {
return (
@@ -32,6 +37,8 @@ export const usePermissionStore = defineStore("permissions", () => {
loadingPromise = null;
loadingPrincipalKey = "";
loadedPrincipalKey.value = elevatedKey;
modules.value = [];
grantedPageIds.value = [];
moduleCodes.value = [];
powerCodes.value = [];
return;
@@ -48,22 +55,23 @@ export const usePermissionStore = defineStore("permissions", () => {
loadDataApi("b_user_power", `b_user_id = ${userId}`, "b_id ASC"),
loadDataApi("s_module_power", "b_canuse = 1", "b_id ASC"),
])
.then(([modules, userModules, userPowers, powers]) => {
.then(([moduleResponse, userModules, userPowers, powers]) => {
if (requestVersion !== loadVersion) return;
const moduleCodeById = new Map(
modules.data.map((module) => [String(module.b_id), module.b_code]),
);
const activeModules = moduleResponse.data || [];
const moduleById = new Map(activeModules.map((module) => [String(module.b_id), module]));
const powerById = new Map(powers.data.map((power) => [String(power.b_id), power]));
const pageIds = userModules.data
.map((item) => String(item.b_module_id || ""))
.filter(Boolean);
modules.value = activeModules;
grantedPageIds.value = pageIds;
moduleCodes.value = userModules.data
.map((item) => moduleCodeById.get(String(item.b_module_id)))
.map((item) => moduleById.get(String(item.b_module_id))?.b_code)
.filter(Boolean);
powerCodes.value = userPowers.data
.map((item) => powerById.get(String(item.b_power_id)))
.filter(Boolean)
.map((power) => {
const moduleCode = moduleCodeById.get(String(power.b_module_id));
return moduleCode ? `${moduleCode}.${power.b_code}` : "";
})
.map((power) => `${String(power.b_module_id)}.${power.b_code}`)
.filter(Boolean);
loadedPrincipalKey.value = principalKey;
})
@@ -76,13 +84,31 @@ export const usePermissionStore = defineStore("permissions", () => {
return request;
}
function canModule(moduleCode) {
return isG3soft.value || !moduleCode || moduleSet.value.has(moduleCode);
function resolvePageId(code, expectedType) {
const module = moduleByCode.value.get(String(code || ""));
if (!module || (expectedType && module.b_module_type !== expectedType)) return "";
if (module.b_module_type === "page") return String(module.b_id || "");
if (module.b_module_type === "data") return String(module.b_parent_id || "");
return "";
}
function canPower(moduleCode, powerCode) {
function canModule(moduleCode) {
if (isG3soft.value || !moduleCode) return true;
const pageId = resolvePageId(moduleCode);
return !!pageId && grantedPageSet.value.has(pageId);
}
function canData(dataCode) {
if (isG3soft.value || !dataCode) return true;
const pageId = resolvePageId(dataCode, "data");
return !!pageId && grantedPageSet.value.has(pageId);
}
function canPower(scopeCode, powerCode) {
if (isG3soft.value) return true;
const pageId = resolvePageId(scopeCode);
return (
isG3soft.value || (canModule(moduleCode) && powerSet.value.has(`${moduleCode}.${powerCode}`))
!!pageId && grantedPageSet.value.has(pageId) && powerSet.value.has(`${pageId}.${powerCode}`)
);
}
@@ -91,6 +117,8 @@ export const usePermissionStore = defineStore("permissions", () => {
loadingPromise = null;
loadingPrincipalKey = "";
loadedPrincipalKey.value = "";
modules.value = [];
grantedPageIds.value = [];
moduleCodes.value = [];
powerCodes.value = [];
}
@@ -100,5 +128,15 @@ export const usePermissionStore = defineStore("permissions", () => {
clear,
);
return { load, canModule, canPower, clear, moduleCodes, powerCodes, isG3soft };
return {
load,
canModule,
canData,
canPower,
clear,
grantedPageIds,
moduleCodes,
powerCodes,
isG3soft,
};
});