import { defineStore } from "pinia"; import { AuthState } from "@/stores/interface"; import { getAuthButtonListApi, getAuthMenuListApi } from "@/api/modules/login"; import { getFlatMenuList, getShowMenuList, getAllBreadcrumbList, localGet } from "@/utils"; import { usePermission } from "@/utils/permission"; export const useAuthStore = defineStore({ id: "geeker-auth", state: (): AuthState => ({ // 按钮权限列表 authButtonList: {}, // 菜单权限列表 authMenuList: [], // 当前页面的 router name,用来做按钮权限筛选 routeName: "" }), getters: { // 按钮权限列表 authButtonListGet: state => state.authButtonList, // 菜单权限列表 ==> 这里的菜单没有经过任何处理 authMenuListGet: state => state.authMenuList, // 菜单权限列表 ==> 左侧菜单栏渲染,需要剔除 isHide == true showMenuListGet: state => getShowMenuList(state.authMenuList), // 菜单权限列表 ==> 扁平化之后的一维数组菜单,主要用来添加动态路由 flatMenuListGet: state => getFlatMenuList(state.authMenuList), // 递归处理后的所有面包屑导航列表 breadcrumbListGet: state => getAllBreadcrumbList(state.authMenuList) }, actions: { // Get AuthButtonList async getAuthButtonList() { const { data } = await getAuthButtonListApi(); this.authButtonList = data; }, // Get AuthMenuList async getAuthMenuList() { const { data } = (await getAuthMenuListApi()) as any; const hasPermission = await usePermission(); const hideMenuNames = ["storeDecoration", "financialManagement", "licenseManagement"]; // 获取用户信息和 businessSection(经营板块)、mealsFlag(是否提供餐食) const userInfo = localGet("geeker-user")?.userInfo || {}; const businessSection = Number(userInfo.businessSection || localGet("businessSection") || 0); const mealsFlag = Number(userInfo.mealsFlag || localGet("mealsFlag") || 0); // 递归处理菜单的显示/隐藏状态 const processMenus = (menuList: any[]) => { menuList.forEach(menu => { // 根据菜单名称判断是否需要处理 if (menu.name && hideMenuNames.includes(menu.name)) { if (!hasPermission) { // 如果没有权限,隐藏菜单 menu.meta.isHide = true; } else { // 如果有权限,确保菜单显示(移除 isHide 或设置为 false) if (menu.meta) { menu.meta.isHide = false; } else { menu.meta = { isHide: false }; } } } // 根据 businessSection 判断菜单显示 if (menu.meta && menu.meta.title) { switch (menu.meta.title) { case "菜单管理": // 只在特色美食(1) 时显示菜单管理 menu.meta.isHide = businessSection !== 1; break; case "酒单管理": // 只在酒吧(2) 时显示酒单管理 menu.meta.isHide = businessSection !== 2; break; case "设施与服务": // 只在洗浴汗蒸(4) 和 运动健身(7) 时显示设施与服务 menu.meta.isHide = ![4, 7].includes(businessSection); break; case "门店基础信息": case "门店头图": case "官方相册": // 所有业务类型都显示 menu.meta.isHide = false; break; case "人员配置": // 美食(1)和KTV(3)不显示人员配置,其他业务类型都显示 menu.meta.isHide = [1, 3].includes(businessSection); break; case "食品经营许可证": // 特色美食(1) 和 酒吧(2):正常显示 // KTV(3)、洗浴汗蒸(4)、按摩足疗(5)、丽人美发(6)、运动健身(7):仅提供餐食时显示 if ([1, 2].includes(businessSection)) { // 酒吧和特色美食无条件显示 menu.meta.isHide = false; } else if ([3, 4, 5, 6, 7].includes(businessSection)) { // KTV等业态需要提供餐食才显示 menu.meta.isHide = mealsFlag !== 1; } break; case "娱乐经营许可证": // 只有酒吧(businessSection=2) 和 KTV(businessSection=3) 显示娱乐经营许可证 menu.meta.isHide = ![2, 3].includes(businessSection); break; } } // 处理子菜单 // if (menu.children && menu.children.length > 0) { // // 检查子菜单中是否有需要显示的菜单项 // let hasVisibleChild = false; // menu.children.forEach((child: any) => { // if (!child.meta?.isHide) { // hasVisibleChild = true; // } // }); // // 如果父菜单基础信息、头图、相册本身被隐藏,但有可见子菜单,则显示父菜单 // if (menu.meta?.isHide && hasVisibleChild) { // menu.meta.isHide = false; // } // // 递归处理子菜单 // processMenus(menu.children); // } }); }; processMenus(data); this.authMenuList = data; }, // Set RouteName async setRouteName(name: string) { this.routeName = name; } } });