Explorar o código

feat(auth): 完善经营板块和餐食标识权限控制逻辑

- 新增 mealsFlag(是否提供餐食)标识用于权限判断
- 优化 businessSection 类型转换,确保为数字类型
- 酒单管理、菜单管理、人员配置模块仅对“酒吧”显示
- 设施与服务模块仅对“洗浴汗蒸”和“运动健身”显示
- 食品经营许可证根据经营板块及餐食标识动态显示
- 娱乐经营许可证仅对“酒吧”和“KTV”显示
- 登录时同步 mealsFlag 至本地存储用于后续权限校验
congxuesong hai 1 semana
pai
achega
eeab680033
Modificáronse 3 ficheiros con 52 adicións e 12 borrados
  1. 27 11
      src/stores/modules/auth.ts
  2. 20 0
      src/utils/permission.ts
  3. 5 1
      src/views/login/index.vue

+ 27 - 11
src/stores/modules/auth.ts

@@ -38,9 +38,10 @@ export const useAuthStore = defineStore({
       const hasPermission = await usePermission();
       const hideMenuNames = ["storeDecoration", "financialManagement", "licenseManagement"];
 
-      // 获取用户信息和businessSection
+      // 获取用户信息和 businessSection(经营板块)、mealsFlag(是否提供餐食)
       const userInfo = localGet("geeker-user")?.userInfo || {};
-      const businessSection = userInfo.businessSection || localGet("businessSection") || 0;
+      const businessSection = Number(userInfo.businessSection || localGet("businessSection") || 0);
+      const mealsFlag = Number(userInfo.mealsFlag || localGet("mealsFlag") || 0);
 
       // 递归处理菜单的显示/隐藏状态
       const processMenus = (menuList: any[]) => {
@@ -60,24 +61,39 @@ export const useAuthStore = defineStore({
             }
           }
 
-          // 根据businessSection判断菜单显示
+          // 根据 businessSection 判断菜单显示
           if (menu.meta && menu.meta.title) {
             switch (menu.meta.title) {
               case "酒单管理":
-                // 为11时显示酒单管理
-                menu.meta.isHide = businessSection !== 12;
+                // 为“酒吧”(2) 时显示酒单管理
+                menu.meta.isHide = businessSection !== 2;
                 break;
               case "菜单管理":
-                // 为11时不显示菜单管理
-                menu.meta.isHide = businessSection === 12;
+                // 为“酒吧”(2) 时不显示菜单管理
+                menu.meta.isHide = businessSection === 2;
                 break;
               case "人员配置":
-                // 为11时显示人员配置(即人员管理),否则不显示
-                menu.meta.isHide = businessSection !== 12;
+                // 为“酒吧”(2) 时显示人员配置(即人员管理),否则不显示
+                menu.meta.isHide = businessSection !== 2;
                 break;
               case "设施与服务":
-                // 为4和7时显示设施与服务,否则不显示
-                menu.meta.isHide = ![15, 17].includes(businessSection);
+                // 为4(洗浴汗蒸) 和 7(运动健身) 时显示设施与服务,否则不显示
+                menu.meta.isHide = ![4, 7].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;
             }
           }

+ 20 - 0
src/utils/permission.ts

@@ -87,6 +87,26 @@ export async function checkMenuAccessPermission(): Promise<{
         entertainmentPermission = value == "0";
       }
 
+      const userInfo = localGet("geeker-user")?.userInfo || {};
+      const businessSection = Number(userInfo.businessSection || localGet("businessSection") || 0);
+      const mealsFlag = Number(userInfo.mealsFlag || localGet("mealsFlag") || 0);
+
+      // 食品经营许可证逻辑:
+      // - 特色美食(1) 和 酒吧(2):正常显示
+      // - KTV(3)、洗浴汗蒸(4)、按摩足疗(5)、丽人美发(6)、运动健身(7):仅提供餐食时显示
+      if ([1, 2].includes(businessSection)) {
+        // 酒吧和特色美食无条件参与食品经营许可证逻辑
+      } else if ([3, 4, 5, 6, 7].includes(businessSection)) {
+        // KTV等业态需要提供餐食才参与
+        if (mealsFlag !== 1) {
+          foodPermission = false;
+        }
+      }
+      // 只有酒吧(businessSection=2) 和 KTV(businessSection=3) 才需要展示娱乐经营许可证相关逻辑
+      if (![2, 3].includes(businessSection)) {
+        entertainmentPermission = false;
+      }
+
       return {
         contractManagement: contractPermission,
         foodBusinessLicense: foodPermission,

+ 5 - 1
src/views/login/index.vue

@@ -930,7 +930,11 @@ const handleLogin = async () => {
         } else {
           localRemove("businessSection");
         }
-
+        if (localGet("geeker-user").userInfo.mealsFlag) {
+          localSet("mealsFlag", localGet("geeker-user").userInfo.mealsFlag);
+        } else {
+          localRemove("mealsFlag");
+        }
         // 登录成功后,立即获取完整的用户信息(包括头像)
         if (res.data.phone) {
           try {