auth.ts 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  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"];
  39. // 获取用户信息和 businessSection(经营板块)、mealsFlag(是否提供餐食)
  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. // 递归处理菜单的显示/隐藏状态
  44. const processMenus = (menuList: any[]) => {
  45. menuList.forEach(menu => {
  46. // 根据菜单名称判断是否需要处理
  47. if (menu.name && hideMenuNames.includes(menu.name)) {
  48. if (!hasPermission) {
  49. // 如果没有权限,隐藏菜单
  50. menu.meta.isHide = true;
  51. } else {
  52. // 如果有权限,确保菜单显示(移除 isHide 或设置为 false)
  53. if (menu.meta) {
  54. menu.meta.isHide = false;
  55. } else {
  56. menu.meta = { isHide: false };
  57. }
  58. }
  59. }
  60. // 根据 businessSection 判断菜单显示
  61. if (menu.meta && menu.meta.title) {
  62. switch (menu.meta.title) {
  63. case "菜单管理":
  64. // 只在特色美食(1) 时显示菜单管理
  65. menu.meta.isHide = businessSection !== 1;
  66. break;
  67. case "酒单管理":
  68. // 只在酒吧(2) 时显示酒单管理
  69. menu.meta.isHide = businessSection !== 2;
  70. break;
  71. case "设施与服务":
  72. // 只在洗浴汗蒸(4) 和 运动健身(7) 时显示设施与服务
  73. menu.meta.isHide = ![4, 7].includes(businessSection);
  74. break;
  75. case "门店基础信息":
  76. case "门店头图":
  77. case "官方相册":
  78. // 所有业务类型都显示
  79. menu.meta.isHide = false;
  80. break;
  81. case "人员配置":
  82. // 美食(1)和KTV(3)不显示人员配置,其他业务类型都显示
  83. menu.meta.isHide = [1, 3].includes(businessSection);
  84. break;
  85. case "食品经营许可证":
  86. // 特色美食(1) 和 酒吧(2):正常显示
  87. // KTV(3)、洗浴汗蒸(4)、按摩足疗(5)、丽人美发(6)、运动健身(7):仅提供餐食时显示
  88. if ([1, 2].includes(businessSection)) {
  89. // 酒吧和特色美食无条件显示
  90. menu.meta.isHide = false;
  91. } else if ([3, 4, 5, 6, 7].includes(businessSection)) {
  92. // KTV等业态需要提供餐食才显示
  93. menu.meta.isHide = mealsFlag !== 1;
  94. }
  95. break;
  96. case "娱乐经营许可证":
  97. // 只有酒吧(businessSection=2) 和 KTV(businessSection=3) 显示娱乐经营许可证
  98. menu.meta.isHide = ![2, 3].includes(businessSection);
  99. break;
  100. }
  101. }
  102. // 处理子菜单
  103. // if (menu.children && menu.children.length > 0) {
  104. // // 检查子菜单中是否有需要显示的菜单项
  105. // let hasVisibleChild = false;
  106. // menu.children.forEach((child: any) => {
  107. // if (!child.meta?.isHide) {
  108. // hasVisibleChild = true;
  109. // }
  110. // });
  111. // // 如果父菜单基础信息、头图、相册本身被隐藏,但有可见子菜单,则显示父菜单
  112. // if (menu.meta?.isHide && hasVisibleChild) {
  113. // menu.meta.isHide = false;
  114. // }
  115. // // 递归处理子菜单
  116. // processMenus(menu.children);
  117. // }
  118. });
  119. };
  120. processMenus(data);
  121. this.authMenuList = data;
  122. },
  123. // Set RouteName
  124. async setRouteName(name: string) {
  125. this.routeName = name;
  126. }
  127. }
  128. });