Quellcode durchsuchen

新动态路由

xiaochan vor 1 Jahr
Ursprung
Commit
bd708796f0

+ 5 - 0
src/main/java/thyyxxk/webserver/controller/settings/MenuSettingsController.java

@@ -26,5 +26,10 @@ public class MenuSettingsController {
         return ResultVoUtil.success(service.getMenuSettings());
     }
 
+    @GetMapping("/getUserMenu")
+    public ResultVo<List<IntergrationMenu>> getUserMenu() {
+        return ResultVoUtil.success(service.getUserMenu());
+    }
+
 
 }

+ 10 - 0
src/main/java/thyyxxk/webserver/dao/his/redislike/RedisLikeDao.java

@@ -63,6 +63,15 @@ public interface RedisLikeDao {
     @Select("select role_id from dj_user_role where user_code=#{code}")
     List<Integer> selectUserRoles(@Param("code") String code);
 
+
+    @Select("select b.id\n" +
+            "from t_intergration_platform_role_menu a,\n" +
+            "     t_intergration_platform_menu b\n" +
+            "where role_id in\n" +
+            "      (select dj_user_role.role_id from dj_user_role where user_code = #{code})\n" +
+            "  and a.menu_id = b.id")
+    List<Integer> selectUserMenu(String code);
+
     @Select("select dept_code from zy_part_time_dept where code=#{code}")
     List<String> selectUserPartTimeDept(@Param("code") String code);
 
@@ -75,6 +84,7 @@ public interface RedisLikeDao {
             "                          from zd_unit_code " +
             "                          where code = #{code}")
     String selecYbDept(String code);
+
     @Delete(" delete   from dj_user_base  where code =#{code} ")
     void delNewUserToDjUserBase(String code);
 

+ 5 - 0
src/main/java/thyyxxk/webserver/entity/login/UserInfo.java

@@ -134,6 +134,11 @@ public class UserInfo {
 
     private List<Integer> roles;
 
+    /**
+     * 有权限的路由id
+     */
+    private List<Integer> menuId;
+
     /**
      * 医生用药等级
      */

+ 24 - 0
src/main/java/thyyxxk/webserver/entity/settings/IntergrationMenu.java

@@ -91,6 +91,30 @@ public class IntergrationMenu implements Serializable {
     @TableField(value = "path_params")
     private String pathParams;
 
+    /**
+     * 需要登录
+     */
+    @TableField(value = "meta_need_token")
+    private Boolean metaNeedToken;
+
+    /**
+     * 需要使用卡片main
+     */
+    @TableField(value = "main_card")
+    private Boolean mainCard;
+
+    /**
+     * 页面超出滚动
+     */
+    @TableField(value = "main_overflow_auto")
+    private Boolean mainOverflowAuto;
+
+    /**
+     * 前端专用完整路径
+     */
+    @TableField(exist = false)
+    private String completePath;
+
     @TableField(exist = false)
     private List<TIntergrationPlatformMenu> children;
 

+ 20 - 0
src/main/java/thyyxxk/webserver/service/RedisServer.java

@@ -1,10 +1,13 @@
 package thyyxxk.webserver.service;
 
 
+import com.google.errorprone.annotations.concurrent.UnlockMethod;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.stereotype.Component;
 
+import java.util.function.Function;
+
 @Slf4j
 @Component
 public class RedisServer {
@@ -20,6 +23,8 @@ public class RedisServer {
         redisTemplate.opsForValue().set(key, value);
     }
 
+
+    @SuppressWarnings("unchecked")
     public <T> T getData(String key) {
         Object o = redisTemplate.opsForValue().get(key);
         if (o == null) {
@@ -28,6 +33,21 @@ public class RedisServer {
         return (T) o;
     }
 
+    @SuppressWarnings("unchecked")
+    public <T> T getData(String key, Function<String, T> function) {
+        Object o = redisTemplate.opsForValue().get(key);
+        if (o == null) {
+            if (function == null) {
+                throw new RuntimeException("function should not be null");
+            }
+            T data = function.apply(key);
+            setData(key, data);
+            return data;
+        }
+        return (T) o;
+    }
+
+
     public Boolean delData(String key) {
         return redisTemplate.delete(key);
     }

+ 1 - 0
src/main/java/thyyxxk/webserver/service/redislike/RedisLikeService.java

@@ -249,6 +249,7 @@ public class RedisLikeService {
         }
         userInfo.setDeptName(getDeptName(userInfo.getDeptCode()));
         userInfo.setRoles(dao.selectUserRoles(code));
+        userInfo.setMenuId(dao.selectUserMenu(code));
         userInfo.setPartTimeDept(dao.selectUserPartTimeDept(userInfo.getCode()));
         Set<String> deptList = getDept(true, userInfo);
         if (!deptList.isEmpty()) {

+ 61 - 4
src/main/java/thyyxxk/webserver/service/settings/MenuSettingsService.java

@@ -1,15 +1,20 @@
 package thyyxxk.webserver.service.settings;
 
+import cn.hutool.json.JSONUtil;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
 import thyyxxk.webserver.dao.his.settings.MenuSettingsDao;
+import thyyxxk.webserver.entity.login.UserInfo;
 import thyyxxk.webserver.entity.settings.IntergrationMenu;
 import thyyxxk.webserver.service.RedisServer;
+import thyyxxk.webserver.service.redislike.RedisLikeService;
+import thyyxxk.webserver.utils.TokenUtil;
 import thyyxxk.webserver.utils.TreeUtil;
 
 import javax.annotation.PostConstruct;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.stream.Collectors;
 
 @Service
 @Slf4j
@@ -17,10 +22,12 @@ public class MenuSettingsService {
 
     private final MenuSettingsDao dao;
     private final RedisServer redisServer;
+    private final RedisLikeService redisLikeService;
 
-    public MenuSettingsService(MenuSettingsDao dao, RedisServer redisServer) {
+    public MenuSettingsService(MenuSettingsDao dao, RedisServer redisServer, RedisLikeService redisLikeService) {
         this.dao = dao;
         this.redisServer = redisServer;
+        this.redisLikeService = redisLikeService;
     }
 
     @PostConstruct
@@ -29,11 +36,61 @@ public class MenuSettingsService {
     }
 
     public List<IntergrationMenu> getMenuSettings() {
-        return TreeUtil.ObjectTree(dao.getAll(), "id", "parentId");
+        return dao.getAll();
     }
 
-    public List<IntergrationMenu> getRedisMenuByCode(String code) {
-        return new ArrayList<>();
+    public List<IntergrationMenu> getUserMenu() {
+        return getRedisMenuByCode(TokenUtil.getInstance().getTokenUserId());
+    }
+
+    private List<IntergrationMenu> menuListByTree(List<IntergrationMenu> list) {
+        return TreeUtil.ObjectTree(list, (parent, child) -> {
+            if (parent == null) {
+                child.setCompletePath(child.getPath());
+            } else {
+                child.setCompletePath(parent.getCompletePath() + "/" + child.getPath());
+            }
+        });
+    }
+
+    private List<IntergrationMenu> findParentMenus(List<IntergrationMenu> list, IntergrationMenu item) {
+        List<IntergrationMenu> result = new ArrayList<>();
+        for (IntergrationMenu menu : list) {
+            if (menu.getId().equals(item.getParentId())) {
+                result.add(menu);
+                if (menu.getParentId() != null) {
+                    result.addAll(findParentMenus(list, menu));
+                }
+                return result;
+            }
+        }
+        return result;
+    }
+
+    private List<IntergrationMenu> getRedisMenuByCode(String code) {
+        UserInfo userInfo = redisLikeService.getUserInfoByCode(code);
+        List<IntergrationMenu> menuList = redisServer.getData("IntergrationPlatformMenu", (key) -> getMenuSettings());
+        if (userInfo.getRoles().contains(1)) {
+            return menuListByTree(menuList);
+        }
+
+        List<IntergrationMenu> passRule = new ArrayList<>();
+        for (IntergrationMenu item : menuList) {
+            if (item.getMetaPassRule()) {
+                passRule.add(item);
+                passRule.addAll(findParentMenus(menuList, item));
+            }
+        }
+
+        for (IntergrationMenu item : menuList) {
+            if (userInfo.getMenuId().contains(item.getId())) {
+                passRule.add(item);
+            }
+        }
+
+        passRule = passRule.stream().distinct().collect(Collectors.toList());
+
+        return menuListByTree(passRule);
     }
 
 }

+ 26 - 4
src/main/java/thyyxxk/webserver/utils/TreeUtil.java

@@ -1,12 +1,16 @@
 package thyyxxk.webserver.utils;
 
 import cn.hutool.core.util.ReflectUtil;
+import cn.hutool.json.JSONUtil;
 import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.extension.api.R;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.poi.ss.formula.functions.T;
 import thyyxxk.webserver.entity.login.VueMenu;
 
 import java.util.*;
+import java.util.function.Consumer;
+import java.util.function.Function;
 
 /**
  * @description: 层级菜单工具
@@ -15,6 +19,9 @@ import java.util.*;
  */
 @Slf4j
 public class TreeUtil {
+    public interface TowFunction<T, T1> {
+        void apply(T t, T1 t1);
+    }
 
     public static List<VueMenu> getVueMenuTree(List<VueMenu> tempList) {
         List<VueMenu> resultList = new ArrayList<>();
@@ -46,8 +53,15 @@ public class TreeUtil {
         return resultList;
     }
 
+    public static <T> List<T> ObjectTree(List<T> tempList, TowFunction<T, T> addCallback) {
+        return ObjectTree(tempList, "id", "parentId", addCallback);
+    }
 
-    public static <T> List<T> ObjectTree(List<T> tempList, String id, String parentId) {
+    public static <T> List<T> ObjectTree(List<T> tempList) {
+        return ObjectTree(tempList, "id", "parentId", null);
+    }
+
+    public static <T> List<T> ObjectTree(List<T> tempList, String id, String parentId, TowFunction<T, T> addCallback) {
         id = "get" + StringUtil.getMethodName(id);
         parentId = "get" + StringUtil.getMethodName(parentId);
 
@@ -56,9 +70,14 @@ public class TreeUtil {
 
         for (T item : tempList) {
             Object key = ReflectUtil.invoke(item, id);
-            treeMap.put(key, item);
             Object parent = ReflectUtil.invoke(item, parentId);
+
+            treeMap.put(key, item);
+
             if (parent == null) {
+                if (addCallback != null) {
+                    addCallback.apply(null, item);
+                }
                 resultList.add(item);
             }
         }
@@ -70,9 +89,12 @@ public class TreeUtil {
                 List<T> child = ReflectUtil.invoke(tree, "getChildren");
                 if (null == child) {
                     ReflectUtil.invoke(tree, "setChildren", new ArrayList<>());
-                } else {
-                    child.add(item);
+                    child = ReflectUtil.invoke(tree, "getChildren");
+                }
+                if (addCallback != null) {
+                    addCallback.apply(tree, item);
                 }
+                child.add(item);
             }
 
         }