20260913231607

This commit is contained in:
oneao committed 2026-09-13 23:16:08 +08:00
1 parent f3ad727f1c
commit c31329d387
179 files changed
+10846 -2684

No files matched your search

+18 -29
View File
@@ -4,14 +4,29 @@ import { loadDataApi } from '@/services/api'
import { useAuthStore } from './auth'
import { buildTree, sortTree } from '@/utils/tree'
/** 递归裁剪菜单树:目录仅当存在可见子菜单时渲染(空目录不显示) */
function pruneByAccess(nodes) {
const result = []
for (const node of nodes) {
const children = node.children?.length ? pruneByAccess(node.children) : []
// 目录:没有可访问子菜单时不渲染
if (node.b_menu_type === 'directory') {
if (children.length) result.push({ ...node, children })
continue
}
result.push(children.length ? { ...node, children } : { ...node })
}
return result
}
/**
* 动态导航菜单 store(侧栏菜单数据源)。
*
* 菜单树由「菜单管理」维护在 s_menu 表,含目录 / 页面 / 外链三类节点。
* 可见性规则由前端执行(不改后端):
* - g3soft(管理员)可见全部启用菜单;
* - 其他账号隐藏编码为 module 的菜单(模块管理入口)及其整棵子树;
* - 目录仅当存在可见子菜单时渲染(空目录不显示)。
* - 全部启用菜单按登录主体加载,目录仅当存在可见子菜单时渲染(空目录不显示);
* - 模块中心等系统管理员专用页面不进 s_menu:入口固定写在 AppSidebar(仅 g3soft 渲染),
* 路由层由 meta.adminOnly 守卫拦截非 g3soft,菜单管理也配不出这些路由。
* 与权限 store 一致:同一登录主体加载去重、并发请求复用、登录主体切换清空缓存。
*/
export const useMenuStore = defineStore('menus', () => {
@@ -23,14 +38,6 @@ export const useMenuStore = defineStore('menus', () => {
let loadingPrincipalKey = ''
let loadVersion = 0
const isG3soft = computed(() => {
return (
String(authStore.loginInfo.user?.account || '')
.trim()
.toLowerCase() === 'g3soft'
)
})
/**
* 加载菜单数据;同一主体重复调用去重,并发调用共享同一请求。
*/
@@ -68,23 +75,6 @@ export const useMenuStore = defineStore('menus', () => {
return pruneByAccess(tree)
})
/** 递归按可见性裁剪菜单树:非 g3soft 隐藏 module 菜单(含其整棵子树),并剪掉空目录 */
function pruneByAccess(nodes) {
const result = []
for (const node of nodes) {
// 模块管理(菜单主键/编码 module)仅 g3soft 可见
if (!isG3soft.value && String(node.b_id || '').toLowerCase() === 'module') continue
const children = node.children?.length ? pruneByAccess(node.children) : []
// 目录:没有可访问子菜单时不渲染
if (node.b_menu_type === 'directory') {
if (children.length) result.push({ ...node, children })
continue
}
result.push(children.length ? { ...node, children } : { ...node })
}
return result
}
function clear() {
// 仅当“正在进行中的请求属于别的主体”时才作废它(如切换账号),
// 否则保留进行中请求、只清空已加载数据,交由后续 load 结果填充。
@@ -113,7 +103,6 @@ export const useMenuStore = defineStore('menus', () => {
return {
load,
clear,
isG3soft,
rawMenus,
visibleMenus,
}