| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137 |
- 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;
- }
- }
- });
|