From c66f3ca48216decddb32a7ad3fdde6bdfe1c055c Mon Sep 17 00:00:00 2001
From: Jay <csj123456>
Date: 星期三, 16 十月 2024 15:31:09 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/master'

---
 iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/controller/admin/auth/AuthController.java |   88 ++++++++++++++++++++++++++++++++++++++-----
 1 files changed, 77 insertions(+), 11 deletions(-)

diff --git a/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/controller/admin/auth/AuthController.java b/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/controller/admin/auth/AuthController.java
index 1637ed5..ef22778 100644
--- a/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/controller/admin/auth/AuthController.java
+++ b/iailab-module-system/iailab-module-system-biz/src/main/java/com/iailab/module/system/controller/admin/auth/AuthController.java
@@ -5,16 +5,21 @@
 import com.iailab.framework.common.enums.CommonStatusEnum;
 import com.iailab.framework.common.enums.UserTypeEnum;
 import com.iailab.framework.common.pojo.CommonResult;
+import com.iailab.framework.common.util.object.BeanUtils;
 import com.iailab.framework.security.config.SecurityProperties;
 import com.iailab.framework.security.core.util.SecurityFrameworkUtils;
+import com.iailab.module.system.controller.admin.app.vo.AppMenuRespVO;
+import com.iailab.module.system.controller.admin.app.vo.AppRespVO;
 import com.iailab.module.system.controller.admin.auth.vo.*;
 import com.iailab.module.system.controller.admin.permission.vo.menu.MenuListReqVO;
+import com.iailab.module.system.controller.admin.permission.vo.menu.MenuRespVO;
 import com.iailab.module.system.convert.auth.AuthConvert;
 import com.iailab.module.system.dal.dataobject.app.AppDO;
 import com.iailab.module.system.dal.dataobject.permission.MenuDO;
 import com.iailab.module.system.dal.dataobject.permission.RoleDO;
 import com.iailab.module.system.dal.dataobject.user.AdminUserDO;
 import com.iailab.module.system.enums.logger.LoginLogTypeEnum;
+import com.iailab.module.system.enums.permission.MenuTypeEnum;
 import com.iailab.module.system.service.app.AppService;
 import com.iailab.module.system.service.auth.AdminAuthService;
 import com.iailab.module.system.service.permission.MenuService;
@@ -34,9 +39,8 @@
 import javax.annotation.security.PermitAll;
 import javax.servlet.http.HttpServletRequest;
 import javax.validation.Valid;
-import java.util.Collections;
-import java.util.List;
-import java.util.Set;
+import java.util.*;
+import java.util.stream.Collectors;
 
 import static com.iailab.framework.common.pojo.CommonResult.success;
 import static com.iailab.framework.common.util.collection.CollectionUtils.convertSet;
@@ -121,32 +125,94 @@
         return success(AuthConvert.INSTANCE.convert(user, roles, menuList));
     }
 
-    @GetMapping("/get-app-permission-info")
+    @GetMapping("/get-app-permission")
     @Operation(summary = "获取登录用户的app权限信息")
-    public CommonResult<AuthPermissionInfoRespVO> getAppPermissionInfo() {
+    public CommonResult<List<AppRespVO>> getAppPermission() {
+        List<AppRespVO> appList = new ArrayList<>();
         // 1.1 获得用户信息
         AdminUserDO user = userService.getUser(getLoginUserId());
         if (user == null) {
             return success(null);
         }
-
         // 1.2 获得角色列表
         Set<Long> roleIds = permissionService.getUserRoleIdListByUserId(getLoginUserId());
         if (CollUtil.isEmpty(roleIds)) {
-            return success(AuthConvert.INSTANCE.convert(user, Collections.emptyList(), Collections.emptyList()));
+            return success(appList);
         }
         List<RoleDO> roles = roleService.getRoleList(roleIds);
         roles.removeIf(role -> !CommonStatusEnum.ENABLE.getStatus().equals(role.getStatus())); // 移除禁用的角色
 
         // 1.3 获得应用菜单列表
-        MenuListReqVO reqVO = new MenuListReqVO();
-        List<MenuDO> appMenuList = menuService.getAppMenuList(reqVO);
         Set<Long> menuIds = permissionService.getRoleMenuListByRoleId(convertSet(roles, RoleDO::getId));
         List<MenuDO> menuList = menuService.getMenuList(menuIds);
-        menuList.retainAll(appMenuList);
+        //只要一级菜单,一级菜单即是应用
+        menuList = menuList.stream().filter(menu -> menu.getParentId() == 0l).collect(Collectors.toList());
         menuList = menuService.filterDisableMenus(menuList);
+        List<Long> ids = menuList.stream().map(MenuDO::getAppId).collect(Collectors.toList());
+        List<AppDO> appDOS = appService.selectBatchIds(ids);
+        //排序
+        Collections.sort(appDOS, Comparator.comparing(AppDO::getOrderNum));
         // 2. 拼接结果返回
-        return success(AuthConvert.INSTANCE.convertAppMenu(user, roles, menuList));
+        return success(BeanUtils.toBean(appDOS, AppRespVO.class));
+    }
+
+    @GetMapping("/get-app-menu-permission")
+    @Operation(summary = "获取登录用户的app权限信息")
+    public CommonResult<List<AuthPermissionInfoRespVO.MenuVO>> getAppMenuPermission(@RequestParam("id") Long id) {
+        List<AuthPermissionInfoRespVO.MenuVO> menuVOS = new ArrayList<>();
+        // 1.1 获得用户信息
+        AdminUserDO user = userService.getUser(getLoginUserId());
+        if (user == null) {
+            return success(null);
+        }
+        // 1.2 获得角色列表
+        Set<Long> roleIds = permissionService.getUserRoleIdListByUserId(getLoginUserId());
+        if (CollUtil.isEmpty(roleIds)) {
+            return success(menuVOS);
+        }
+        List<RoleDO> roles = roleService.getRoleList(roleIds);
+        roles.removeIf(role -> !CommonStatusEnum.ENABLE.getStatus().equals(role.getStatus())); // 移除禁用的角色
+
+        // 1.3 获得应用菜单列表
+        Set<Long> menuIds = permissionService.getRoleMenuListByRoleId(convertSet(roles, RoleDO::getId));
+        List<MenuDO> menuList = menuService.getMenuList(menuIds);
+        menuList = menuService.filterDisableMenus(menuList);
+        MenuDO menuDO = menuService.getMenuByAppId(id);
+        List<MenuDO> children = new LinkedList<>();
+        // 遍历每一层
+        Collection<Long> parentIds = Collections.singleton(menuDO.getId());
+        for (int i = 0; i < Short.MAX_VALUE; i++) { // 使用 Short.MAX_VALUE 避免 bug 场景下,存在死循环
+            // 查询当前层,所有的子应用菜单
+            List<MenuDO> menus = menuService.selectListByParentId(parentIds);
+            // 1. 如果没有子菜单,则结束遍历
+            if (CollUtil.isEmpty(menus)) {
+                break;
+            }
+            // 2. 如果有子应用菜单,继续遍历
+            children.addAll(menus);
+            parentIds = convertSet(menus, MenuDO::getId);
+        }
+        children.retainAll(menuList);
+        List<MenuDO> tempChildren = new LinkedList<>();
+        //为每一个二级菜单增加一个隐藏父级目录
+        children.stream().forEach(menu -> {
+            if (menu.getType().equals(MenuTypeEnum.MENU.getType()) && menu.getParentId().equals(menuDO.getId())) {
+                MenuDO parentMenu = BeanUtils.toBean(menu, MenuDO.class);
+                parentMenu.setId(System.currentTimeMillis() + (int) (Math.random() * (99999 - 10000 + 1)) + 10000);
+                parentMenu.setType(MenuTypeEnum.DIR.getType());
+                parentMenu.setVisible(true);
+                parentMenu.setAlwaysShow(false);
+                parentMenu.setParentId(menuDO.getId());
+                menu.setParentId(parentMenu.getId());
+                tempChildren.add(parentMenu);
+                tempChildren.add(menu);
+            } else {
+                tempChildren.add(menu);
+            }
+        });
+        menuVOS = AuthConvert.INSTANCE.buildMenuTree(tempChildren, menuDO.getId(), menuDO.getPath());
+        // 2. 拼接结果返回
+        return success(menuVOS);
     }
 
     // ========== 短信登录相关 ==========

--
Gitblit v1.9.3