auth.ts 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. import { defineStore } from "pinia";
  2. import { AuthState } from "@/stores/interface";
  3. import { getAuthButtonListApi, getAuthMenuListApi } from "@/api/modules/login";
  4. import { getFlatMenuList, getShowMenuList, getAllBreadcrumbList, localGet } from "@/utils";
  5. import { usePermission } from "@/utils/permission";
  6. export const useAuthStore = defineStore({
  7. id: "geeker-auth",
  8. state: (): AuthState => ({
  9. // 按钮权限列表
  10. authButtonList: {},
  11. // 菜单权限列表
  12. authMenuList: [],
  13. // 当前页面的 router name,用来做按钮权限筛选
  14. routeName: ""
  15. }),
  16. getters: {
  17. // 按钮权限列表
  18. authButtonListGet: state => state.authButtonList,
  19. // 菜单权限列表 ==> 这里的菜单没有经过任何处理
  20. authMenuListGet: state => state.authMenuList,
  21. // 菜单权限列表 ==> 左侧菜单栏渲染,需要剔除 isHide == true
  22. showMenuListGet: state => getShowMenuList(state.authMenuList),
  23. // 菜单权限列表 ==> 扁平化之后的一维数组菜单,主要用来添加动态路由
  24. flatMenuListGet: state => getFlatMenuList(state.authMenuList),
  25. // 递归处理后的所有面包屑导航列表
  26. breadcrumbListGet: state => getAllBreadcrumbList(state.authMenuList)
  27. },
  28. actions: {
  29. // Get AuthButtonList
  30. async getAuthButtonList() {
  31. const { data } = await getAuthButtonListApi();
  32. this.authButtonList = data;
  33. },
  34. // Get AuthMenuList
  35. async getAuthMenuList() {
  36. const { data } = (await getAuthMenuListApi()) as any;
  37. const hasPermission = await usePermission();
  38. const hideMenuNames = ["storeDecoration", "financialManagement", "licenseManagement", "dynamicManagement"];
  39. // 获取用户信息和 businessSection(经营板块)、mealsFlag(是否提供餐食)、storeId
  40. const userInfo = localGet("geeker-user")?.userInfo || {};
  41. const businessSection = Number(userInfo.businessSection || localGet("businessSection") || 0);
  42. const mealsFlag = Number(userInfo.mealsFlag || localGet("mealsFlag") || 0);
  43. const storeId = userInfo.storeId ?? localGet("createdId");
  44. // 递归处理菜单的显示/隐藏状态
  45. const processMenus = (menuList: any[]) => {
  46. menuList.forEach(menu => {
  47. // 根据菜单名称判断是否需要处理
  48. if (menu.name && hideMenuNames.includes(menu.name)) {
  49. if (!hasPermission) {
  50. // 如果没有权限,隐藏菜单
  51. menu.meta.isHide = true;
  52. } else {
  53. // 如果有权限,确保菜单显示(移除 isHide 或设置为 false)
  54. if (menu.meta) {
  55. menu.meta.isHide = false;
  56. } else {
  57. menu.meta = { isHide: false };
  58. }
  59. }
  60. }
  61. // 根据 businessSection 判断菜单显示
  62. if (menu.meta && menu.meta.title) {
  63. switch (menu.meta.title) {
  64. case "菜单管理":
  65. // 只在特色美食(1) 时显示菜单管理
  66. menu.meta.isHide = businessSection !== 1;
  67. break;
  68. case "酒单管理":
  69. // 只在酒吧(2) 时显示酒单管理
  70. menu.meta.isHide = businessSection !== 2;
  71. break;
  72. case "设施与服务":
  73. // 只在洗浴汗蒸(4) 和 运动健身(7) 时显示设施与服务
  74. menu.meta.isHide = ![4, 7].includes(businessSection);
  75. break;
  76. case "门店基础信息":
  77. case "门店头图":
  78. case "官方相册":
  79. // 所有业务类型都显示
  80. menu.meta.isHide = false;
  81. break;
  82. case "人员配置":
  83. // 美食(1)和KTV(3)不显示人员配置,其他业务类型都显示
  84. menu.meta.isHide = [1, 3].includes(businessSection);
  85. break;
  86. case "食品经营许可证":
  87. // 特色美食(1) 和 酒吧(2):正常显示
  88. // KTV(3)、洗浴汗蒸(4)、按摩足疗(5)、丽人美发(6)、运动健身(7):仅提供餐食时显示
  89. if ([1, 2].includes(businessSection)) {
  90. // 酒吧和特色美食无条件显示
  91. menu.meta.isHide = false;
  92. } else if ([3, 4, 5, 6, 7].includes(businessSection)) {
  93. // KTV等业态需要提供餐食才显示
  94. menu.meta.isHide = mealsFlag !== 1;
  95. }
  96. break;
  97. case "其他资质证明":
  98. // 只有酒吧(businessSection=2) 和 KTV(businessSection=3) 显示其他资质证明
  99. menu.meta.isHide = ![2, 3].includes(businessSection);
  100. break;
  101. case "子账号与角色管理":
  102. // 有 storeId 时显示,无 storeId 时不显示
  103. menu.meta.isHide = !storeId;
  104. break;
  105. }
  106. }
  107. // 处理子菜单
  108. // if (menu.children && menu.children.length > 0) {
  109. // // 检查子菜单中是否有需要显示的菜单项
  110. // let hasVisibleChild = false;
  111. // menu.children.forEach((child: any) => {
  112. // if (!child.meta?.isHide) {
  113. // hasVisibleChild = true;
  114. // }
  115. // });
  116. // // 如果父菜单基础信息、头图、相册本身被隐藏,但有可见子菜单,则显示父菜单
  117. // if (menu.meta?.isHide && hasVisibleChild) {
  118. // menu.meta.isHide = false;
  119. // }
  120. // // 递归处理子菜单
  121. // processMenus(menu.children);
  122. // }
  123. });
  124. };
  125. processMenus(data);
  126. this.authMenuList = data;
  127. },
  128. // Set RouteName
  129. async setRouteName(name: string) {
  130. this.routeName = name;
  131. }
  132. }
  133. });