Commit 3bf173d744d68c8e447c8018c575f098434ab975

Authored by YunaiV
1 parent c9372b0a

1. 简化 ruoyi 获取菜单列表时,和前端耦合性比较重的情况

2. 删除 MenuDO 表非关键性字段,进一步简化模型
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java deleted
1   -package com.ruoyi.web.controller.system;
2   -
3   -import java.util.List;
4   -import java.util.Set;
5   -import org.springframework.beans.factory.annotation.Autowired;
6   -import org.springframework.web.bind.annotation.GetMapping;
7   -import org.springframework.web.bind.annotation.PostMapping;
8   -import org.springframework.web.bind.annotation.RequestBody;
9   -import org.springframework.web.bind.annotation.RestController;
10   -import com.ruoyi.common.constant.Constants;
11   -import com.ruoyi.common.core.domain.AjaxResult;
12   -import com.ruoyi.common.core.domain.entity.SysMenu;
13   -import com.ruoyi.common.core.domain.entity.SysUser;
14   -import com.ruoyi.common.core.domain.model.LoginBody;
15   -import com.ruoyi.common.core.domain.model.LoginUser;
16   -import com.ruoyi.common.utils.ServletUtils;
17   -import com.ruoyi.framework.web.service.SysLoginService;
18   -import com.ruoyi.framework.web.service.SysPermissionService;
19   -import com.ruoyi.framework.web.service.TokenService;
20   -import com.ruoyi.system.service.ISysMenuService;
21   -
22   -
23   -public class SysLoginController {
24   -
25   - /**
26   - * 获取路由信息
27   - *
28   - * @return 路由信息
29   - */
30   - @GetMapping("getRouters")
31   - public AjaxResult getRouters()
32   - {
33   - LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
34   - // 用户信息
35   - SysUser user = loginUser.getUser();
36   - List<SysMenu> menus = menuService.selectMenuTreeByUserId(user.getUserId());
37   - return AjaxResult.success(menuService.buildMenus(menus));
38   - }
39   -
40   -}
ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysMenuController.java
1 1 package com.ruoyi.web.controller.system;
2 2  
3 3 import java.util.List;
  4 +
4 5 import org.springframework.beans.factory.annotation.Autowired;
5 6 import org.springframework.security.access.prepost.PreAuthorize;
6 7 import org.springframework.validation.annotation.Validated;
... ... @@ -28,13 +29,12 @@ import com.ruoyi.system.service.ISysMenuService;
28 29  
29 30 /**
30 31 * 菜单信息
31   - *
  32 + *
32 33 * @author ruoyi
33 34 */
34 35 @RestController
35 36 @RequestMapping("/system/menu")
36   -public class SysMenuController extends BaseController
37   -{
  37 +public class SysMenuController extends BaseController {
38 38 @Autowired
39 39 private ISysMenuService menuService;
40 40  
... ... @@ -46,8 +46,7 @@ public class SysMenuController extends BaseController
46 46 */
47 47 @PreAuthorize("@ss.hasPermi('system:menu:list')")
48 48 @GetMapping("/list")
49   - public AjaxResult list(SysMenu menu)
50   - {
  49 + public AjaxResult list(SysMenu menu) {
51 50 LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
52 51 Long userId = loginUser.getUser().getUserId();
53 52 List<SysMenu> menus = menuService.selectMenuList(menu, userId);
... ... @@ -59,8 +58,7 @@ public class SysMenuController extends BaseController
59 58 */
60 59 @PreAuthorize("@ss.hasPermi('system:menu:query')")
61 60 @GetMapping(value = "/{menuId}")
62   - public AjaxResult getInfo(@PathVariable Long menuId)
63   - {
  61 + public AjaxResult getInfo(@PathVariable Long menuId) {
64 62 return AjaxResult.success(menuService.selectMenuById(menuId));
65 63 }
66 64  
... ... @@ -68,8 +66,7 @@ public class SysMenuController extends BaseController
68 66 * 获取菜单下拉树列表
69 67 */
70 68 @GetMapping("/treeselect")
71   - public AjaxResult treeselect(SysMenu menu)
72   - {
  69 + public AjaxResult treeselect(SysMenu menu) {
73 70 LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
74 71 Long userId = loginUser.getUser().getUserId();
75 72 List<SysMenu> menus = menuService.selectMenuList(menu, userId);
... ... @@ -80,8 +77,7 @@ public class SysMenuController extends BaseController
80 77 * 加载对应角色菜单列表树
81 78 */
82 79 @GetMapping(value = "/roleMenuTreeselect/{roleId}")
83   - public AjaxResult roleMenuTreeselect(@PathVariable("roleId") Long roleId)
84   - {
  80 + public AjaxResult roleMenuTreeselect(@PathVariable("roleId") Long roleId) {
85 81 LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
86 82 List<SysMenu> menus = menuService.selectMenuList(loginUser.getUser().getUserId());
87 83 AjaxResult ajax = AjaxResult.success();
... ... @@ -96,15 +92,11 @@ public class SysMenuController extends BaseController
96 92 @PreAuthorize("@ss.hasPermi('system:menu:add')")
97 93 @Log(title = "菜单管理", businessType = BusinessType.INSERT)
98 94 @PostMapping
99   - public AjaxResult add(@Validated @RequestBody SysMenu menu)
100   - {
101   - if (UserConstants.NOT_UNIQUE.equals(menuService.checkMenuNameUnique(menu)))
102   - {
  95 + public AjaxResult add(@Validated @RequestBody SysMenu menu) {
  96 + if (UserConstants.NOT_UNIQUE.equals(menuService.checkMenuNameUnique(menu))) {
103 97 return AjaxResult.error("新增菜单'" + menu.getMenuName() + "'失败,菜单名称已存在");
104   - }
105   - else if (UserConstants.YES_FRAME.equals(menu.getIsFrame())
106   - && !StringUtils.startsWithAny(menu.getPath(), Constants.HTTP, Constants.HTTPS))
107   - {
  98 + } else if (UserConstants.YES_FRAME.equals(menu.getIsFrame())
  99 + && !StringUtils.startsWithAny(menu.getPath(), Constants.HTTP, Constants.HTTPS)) {
108 100 return AjaxResult.error("新增菜单'" + menu.getMenuName() + "'失败,地址必须以http(s)://开头");
109 101 }
110 102 menu.setCreateBy(SecurityUtils.getUsername());
... ... @@ -117,19 +109,13 @@ public class SysMenuController extends BaseController
117 109 @PreAuthorize("@ss.hasPermi('system:menu:edit')")
118 110 @Log(title = "菜单管理", businessType = BusinessType.UPDATE)
119 111 @PutMapping
120   - public AjaxResult edit(@Validated @RequestBody SysMenu menu)
121   - {
122   - if (UserConstants.NOT_UNIQUE.equals(menuService.checkMenuNameUnique(menu)))
123   - {
  112 + public AjaxResult edit(@Validated @RequestBody SysMenu menu) {
  113 + if (UserConstants.NOT_UNIQUE.equals(menuService.checkMenuNameUnique(menu))) {
124 114 return AjaxResult.error("修改菜单'" + menu.getMenuName() + "'失败,菜单名称已存在");
125   - }
126   - else if (UserConstants.YES_FRAME.equals(menu.getIsFrame())
127   - && !StringUtils.startsWithAny(menu.getPath(), Constants.HTTP, Constants.HTTPS))
128   - {
  115 + } else if (UserConstants.YES_FRAME.equals(menu.getIsFrame())
  116 + && !StringUtils.startsWithAny(menu.getPath(), Constants.HTTP, Constants.HTTPS)) {
129 117 return AjaxResult.error("修改菜单'" + menu.getMenuName() + "'失败,地址必须以http(s)://开头");
130   - }
131   - else if (menu.getMenuId().equals(menu.getParentId()))
132   - {
  118 + } else if (menu.getMenuId().equals(menu.getParentId())) {
133 119 return AjaxResult.error("修改菜单'" + menu.getMenuName() + "'失败,上级菜单不能选择自己");
134 120 }
135 121 menu.setUpdateBy(SecurityUtils.getUsername());
... ... @@ -142,16 +128,13 @@ public class SysMenuController extends BaseController
142 128 @PreAuthorize("@ss.hasPermi('system:menu:remove')")
143 129 @Log(title = "菜单管理", businessType = BusinessType.DELETE)
144 130 @DeleteMapping("/{menuId}")
145   - public AjaxResult remove(@PathVariable("menuId") Long menuId)
146   - {
147   - if (menuService.hasChildByMenuId(menuId))
148   - {
  131 + public AjaxResult remove(@PathVariable("menuId") Long menuId) {
  132 + if (menuService.hasChildByMenuId(menuId)) {
149 133 return AjaxResult.error("存在子菜单,不允许删除");
150 134 }
151   - if (menuService.checkMenuExistRole(menuId))
152   - {
  135 + if (menuService.checkMenuExistRole(menuId)) {
153 136 return AjaxResult.error("菜单已分配,不允许删除");
154 137 }
155 138 return toAjax(menuService.deleteMenuById(menuId));
156 139 }
157   -}
158 140 \ No newline at end of file
  141 +}
... ...
ruoyi-ui/src/api/login.js
... ... @@ -18,7 +18,7 @@ export function login(username, password, code, uuid) {
18 18 // 获取用户详细信息
19 19 export function getInfo() {
20 20 return request({
21   - url: '/get-info',
  21 + url: '/get-permission-info',
22 22 method: 'get'
23 23 })
24 24 }
... ...
ruoyi-ui/src/api/menu.js
... ... @@ -3,7 +3,7 @@ import request from &#39;@/utils/request&#39;
3 3 // 获取路由
4 4 export const getRouters = () => {
5 5 return request({
6   - url: '/get-routers',
  6 + url: '/list-menus',
7 7 method: 'get'
8 8 })
9 9 }
... ...
ruoyi-ui/src/store/modules/permission.js
... ... @@ -43,18 +43,27 @@ const permission = {
43 43 // 遍历后台传来的路由字符串,转换为组件对象
44 44 function filterAsyncRouter(asyncRouterMap, isRewrite = false) {
45 45 return asyncRouterMap.filter(route => {
46   - if (isRewrite && route.children) {
47   - route.children = filterChildren(route.children)
  46 + // 将 ruoyi 后端原有耦合前端的逻辑,迁移到此处
  47 + // 处理 meta 属性
  48 + route.meta = {
  49 + title: route.menuName,
  50 + icon: route.icon
48 51 }
49   - if (route.component) {
50   - // Layout ParentView 组件特殊处理
51   - if (route.component === 'Layout') {
  52 + // 处理 component 属性
  53 + if (route.children) { // 父节点
  54 + // debugger
  55 + if (route.parentId === 0) {
52 56 route.component = Layout
53   - } else if (route.component === 'ParentView') {
54   - route.component = ParentView
55 57 } else {
56   - route.component = loadView(route.component)
  58 + route.component = ParentView
57 59 }
  60 + } else { // 根节点
  61 + route.component = loadView(route.component)
  62 + }
  63 +
  64 + // filterChildren
  65 + if (isRewrite && route.children) {
  66 + route.children = filterChildren(route.children)
58 67 }
59 68 if (route.children != null && route.children && route.children.length) {
60 69 route.children = filterAsyncRouter(route.children, route, isRewrite)
... ...
src/main/java/cn/iocoder/dashboard/modules/system/controller/auth/SysAuthController.http
... ... @@ -9,12 +9,12 @@ Content-Type: application/json
9 9 "code": "1024"
10 10 }
11 11  
12   -### 请求 /get-info 接口 => 成功
13   -GET {{baseUrl}}/get-info
  12 +### 请求 /get-permission-info 接口 => 成功
  13 +GET {{baseUrl}}/get-permission-info
14 14 Authorization: Bearer {{token}}
15 15  
16   -### 请求 /get-routers 接口 => 成功
17   -GET {{baseUrl}}/get-routers
  16 +### 请求 /list-menus 接口 => 成功
  17 +GET {{baseUrl}}/list-menus
18 18 Authorization: Bearer {{token}}
19 19  
20 20 ### 请求 /druid/xxx 接口 => 失败 TODO 临时测试
... ...
src/main/java/cn/iocoder/dashboard/modules/system/controller/auth/SysAuthController.java
1 1 package cn.iocoder.dashboard.modules.system.controller.auth;
2 2  
3 3 import cn.iocoder.dashboard.common.pojo.CommonResult;
4   -import cn.iocoder.dashboard.modules.system.controller.auth.vo.SysAuthGetInfoRespVO;
5   -import cn.iocoder.dashboard.modules.system.controller.auth.vo.SysAuthGetRouterRespVO;
  4 +import cn.iocoder.dashboard.modules.system.controller.auth.vo.SysAuthMenuRespVO;
  5 +import cn.iocoder.dashboard.modules.system.controller.auth.vo.SysAuthPermissionInfoRespVO;
6 6 import cn.iocoder.dashboard.modules.system.controller.auth.vo.SysAuthLoginReqVO;
7 7 import cn.iocoder.dashboard.modules.system.controller.auth.vo.SysAuthLoginRespVO;
8 8 import cn.iocoder.dashboard.modules.system.service.auth.SysAuthService;
... ... @@ -35,17 +35,17 @@ public class SysAuthController {
35 35 return success(SysAuthLoginRespVO.builder().token(token).build());
36 36 }
37 37  
38   - @ApiOperation("获取登陆用户的信息")
39   - @GetMapping("/get-info")
40   - public CommonResult<SysAuthGetInfoRespVO> getInfo() {
41   - SysAuthGetInfoRespVO respVO = authService.getInfo(getLoginUserId(), getLoginUserRoleIds());
  38 + @ApiOperation("获取登陆用户的权限信息")
  39 + @GetMapping("/get-permission-info")
  40 + public CommonResult<SysAuthPermissionInfoRespVO> getPermissionInfo() {
  41 + SysAuthPermissionInfoRespVO respVO = authService.getPermissionInfo(getLoginUserId(), getLoginUserRoleIds());
42 42 return success(respVO);
43 43 }
44 44  
45   - @ApiOperation("获得菜单 Vue 路由")
46   - @GetMapping("get-routers")
47   - public CommonResult<List<SysAuthGetRouterRespVO>> getRouters() {
48   - List<SysAuthGetRouterRespVO> respVOList = authService.getRouters(getLoginUserId(), getLoginUserRoleIds());
  45 + @ApiOperation("获得登陆用户的菜单列表")
  46 + @GetMapping("list-menus")
  47 + public CommonResult<List<SysAuthMenuRespVO>> listMenus() {
  48 + List<SysAuthMenuRespVO> respVOList = authService.listMenus(getLoginUserId(), getLoginUserRoleIds());
49 49 return success(respVOList);
50 50 }
51 51  
... ...
src/main/java/cn/iocoder/dashboard/modules/system/controller/auth/vo/SysAuthGetRouterRespVO.java renamed to src/main/java/cn/iocoder/dashboard/modules/system/controller/auth/vo/SysAuthMenuRespVO.java
1 1 package cn.iocoder.dashboard.modules.system.controller.auth.vo;
2 2  
  3 +import io.swagger.annotations.ApiModel;
3 4 import lombok.AllArgsConstructor;
4 5 import lombok.Builder;
5 6 import lombok.Data;
... ... @@ -7,16 +8,12 @@ import lombok.NoArgsConstructor;
7 8  
8 9 import java.util.List;
9 10  
10   -/**
11   - * 路由配置信息
12   - *
13   - * @author ruoyi
14   - */
  11 +@ApiModel("登陆用户的菜单信息 Response VO")
15 12 @Data
16 13 @NoArgsConstructor
17 14 @AllArgsConstructor
18 15 @Builder
19   -public class SysAuthGetRouterRespVO {
  16 +public class SysAuthMenuRespVO {
20 17  
21 18 /**
22 19 * 菜单编号
... ... @@ -28,66 +25,27 @@ public class SysAuthGetRouterRespVO {
28 25 private Long parentId;
29 26  
30 27 /**
31   - * 路由名字
  28 + * 菜单名称
32 29 */
33   - private String name;
  30 + private String menuName;
34 31  
35 32 /**
36 33 * 路由地址
37 34 */
38 35 private String path;
39   -
40   - /**
41   - * 是否隐藏路由,当设置 true 的时候该路由不会再侧边栏出现
42   - */
43   - private boolean hidden;
44   -
45   - /**
46   - * 重定向地址,当设置 noRedirect 的时候该路由在面包屑导航中不可被点击
47   - */
48   - private String redirect;
49   -
50 36 /**
51 37 * 组件地址
52 38 */
53 39 private String component;
54 40  
55 41 /**
56   - * 当你一个路由下面的 children 声明的路由大于1个时,自动会变成嵌套的模式--如组件页面
  42 + * 菜单图标
57 43 */
58   - private Boolean alwaysShow;
59   -
60   - /**
61   - * 其他元素
62   - */
63   - private MetaVO meta;
  44 + private String icon;
64 45  
65 46 /**
66 47 * 子路由
67 48 */
68   - private List<SysAuthGetRouterRespVO> children;
69   -
70   - @Data
71   - @NoArgsConstructor
72   - @AllArgsConstructor
73   - @Builder
74   - public static class MetaVO {
75   -
76   - /**
77   - * 设置该路由在侧边栏和面包屑中展示的名字
78   - */
79   - private String title;
80   -
81   - /**
82   - * 设置该路由的图标,对应路径src/assets/icons/svg
83   - */
84   - private String icon;
85   -
86   - /**
87   - * 设置为true,则不会被 <keep-alive>缓存
88   - */
89   - private boolean noCache;
90   -
91   - }
  49 + private List<SysAuthMenuRespVO> children;
92 50  
93 51 }
... ...
src/main/java/cn/iocoder/dashboard/modules/system/controller/auth/vo/SysAuthGetInfoRespVO.java renamed to src/main/java/cn/iocoder/dashboard/modules/system/controller/auth/vo/SysAuthPermissionInfoRespVO.java
... ... @@ -9,20 +9,20 @@ import lombok.NoArgsConstructor;
9 9  
10 10 import java.util.Set;
11 11  
12   -@ApiModel("获得用户信息 Resp VO")
  12 +@ApiModel(value = "登陆用户的权限信息 Response VO", description = "额外包括用户信息和角色列表")
13 13 @Data
14 14 @NoArgsConstructor
15 15 @AllArgsConstructor
16 16 @Builder
17   -public class SysAuthGetInfoRespVO {
  17 +public class SysAuthPermissionInfoRespVO {
18 18  
19 19 @ApiModelProperty(value = "用户信息", required = true)
20 20 private UserVO user;
21 21  
22   - @ApiModelProperty(value = "角色权限数组", required = true)
  22 + @ApiModelProperty(value = "角色标识数组", required = true)
23 23 private Set<String> roles;
24 24  
25   - @ApiModelProperty(value = "菜单权限数组", required = true)
  25 + @ApiModelProperty(value = "操作权限数组", required = true)
26 26 private Set<String> permissions;
27 27  
28 28 @ApiModel("用户信息 VO")
... ...
src/main/java/cn/iocoder/dashboard/modules/system/convert/auth/SysAuthConvert.java
1 1 package cn.iocoder.dashboard.modules.system.convert.auth;
2 2  
3   -import cn.iocoder.dashboard.common.enums.CommonStatusEnum;
4 3 import cn.iocoder.dashboard.framework.security.core.LoginUser;
5   -import cn.iocoder.dashboard.modules.system.controller.auth.vo.SysAuthGetInfoRespVO;
6   -import cn.iocoder.dashboard.modules.system.controller.auth.vo.SysAuthGetRouterRespVO;
  4 +import cn.iocoder.dashboard.modules.system.controller.auth.vo.SysAuthPermissionInfoRespVO;
  5 +import cn.iocoder.dashboard.modules.system.controller.auth.vo.SysAuthMenuRespVO;
7 6 import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.permission.SysMenuDO;
8 7 import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.permission.SysRoleDO;
9 8 import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.user.SysUserDO;
10   -import cn.iocoder.dashboard.modules.system.enums.permission.MenuIdEnum;
11   -import cn.iocoder.dashboard.modules.system.enums.permission.MenuTypeEnum;
12 9 import cn.iocoder.dashboard.util.collection.CollectionUtils;
13   -import jodd.util.StringUtil;
14   -import org.apache.commons.lang3.StringUtils;
15 10 import org.mapstruct.Mapper;
16 11 import org.mapstruct.Mapping;
17 12 import org.mapstruct.factory.Mappers;
... ... @@ -21,107 +16,19 @@ import java.util.List;
21 16 @Mapper
22 17 public interface SysAuthConvert {
23 18  
24   - /** Layout组件标识 */
25   - public final static String LAYOUT = "Layout";
26   -
27   - /** ParentView组件标识 */
28   - public final static String PARENT_VIEW = "ParentView";
29   -
30 19 SysAuthConvert INSTANCE = Mappers.getMapper(SysAuthConvert.class);
31 20  
32 21 @Mapping(source = "updateTime", target = "updateTime", ignore = true) // 字段相同,但是含义不同,忽略
33 22 LoginUser convert(SysUserDO bean);
34 23  
35   - default SysAuthGetInfoRespVO convert(SysUserDO user, List<SysRoleDO> roleList, List<SysMenuDO> menuList) {
36   - return SysAuthGetInfoRespVO.builder()
37   - .user(SysAuthGetInfoRespVO.UserVO.builder().nickname(user.getNickname()).avatar(user.getAvatar()).build())
  24 + default SysAuthPermissionInfoRespVO convert(SysUserDO user, List<SysRoleDO> roleList, List<SysMenuDO> menuList) {
  25 + return SysAuthPermissionInfoRespVO.builder()
  26 + .user(SysAuthPermissionInfoRespVO.UserVO.builder().nickname(user.getNickname()).avatar(user.getAvatar()).build())
38 27 .roles(CollectionUtils.convertSet(roleList, SysRoleDO::getRoleKey))
39   - .permissions(CollectionUtils.convertSet(menuList, SysMenuDO::getPerms))
  28 + .permissions(CollectionUtils.convertSet(menuList, SysMenuDO::getPermission))
40 29 .build();
41 30 }
42 31  
43   - default SysAuthGetRouterRespVO convertTreeNode(SysMenuDO menu) {
44   - SysAuthGetRouterRespVO.SysAuthGetRouterRespVOBuilder respVOBuilder = SysAuthGetRouterRespVO.builder();
45   - respVOBuilder.menuId(menu.getMenuId()).parentId(menu.getParentId())
46   - .hidden("1".equals(menu.getVisible())) // TODO 芋艿:需要处理
47   - .name(getRouteName(menu)).path(menu.getPath()).component(getComponent(menu))
48   - .meta(SysAuthGetRouterRespVO.MetaVO.builder().title(menu.getMenuName()).icon(menu.getIcon())
49   - .noCache("1".equals(menu.getIsCache())).build())
50   - ;
51   - return respVOBuilder.build();
52   - }
53   -
54   -
55   -
56   - // TODO 芋艿:需要预处理。存储的时候
57   - default String getRouteName(SysMenuDO menu) {
58   - String routerName = StringUtil.capitalize(menu.getPath()); // TODO 芋艿:看看怎么去除掉
59   - // 非外链并且是一级目录(类型为目录)
60   - if (isMenuFrame(menu)) {
61   - routerName = StringUtils.EMPTY;
62   - }
63   - return routerName;
64   - }
65   -
66   - /**
67   - * 是否为菜单内部跳转
68   - *
69   - * @param menu 菜单信息
70   - * @return 是否
71   - */
72   - // TODO 芋艿:思考下是不是可以重构下
73   - default boolean isMenuFrame(SysMenuDO menu) {
74   - return MenuIdEnum.ROOT.getId().equals(menu.getParentId())
75   - && MenuTypeEnum.MENU.getType().equals(menu.getMenuType())
76   - && CommonStatusEnum.ENABLE.getStatus().equals(menu.getIsFrame()); // TODO 芋艿:思考是不是用这个好
77   - }
78   -
79   -// /** // TODO 芋艿:后面重构下
80   -// * 获取路由地址
81   -// *
82   -// * @param menu 菜单信息
83   -// * @return 路由地址
84   -// */
85   -// default String getRouterPath(SysMenuDO menu) {
86   -// String routerPath = menu.getPath();
87   -// // 非外链并且是一级目录(类型为目录)
88   -// if (MenuIdEnum.ROOT.getId().equals(menu.getParentId())
89   -// && MenuTypeEnum.MENU.getType().equals(menu.getMenuType())
90   -// && CommonStatusEnum.DISABLE.getStatus().equals(menu.getIsFrame())) {
91   -// routerPath = "/" + menu.getPath();
92   -// }
93   -// // 非外链并且是一级目录(类型为菜单)
94   -// else if (isMenuFrame(menu)) {
95   -// routerPath = "/";
96   -// }
97   -// return routerPath;
98   -// }
99   -
100   - /**
101   - * 获取组件信息
102   - *
103   - * @param menu 菜单信息
104   - * @return 组件信息
105   - */
106   - default String getComponent(SysMenuDO menu) {
107   - String component = LAYOUT;
108   - if (StringUtils.isNotEmpty(menu.getComponent()) && !isMenuFrame(menu)) {
109   - component = menu.getComponent();
110   - } else if (StringUtils.isEmpty(menu.getComponent()) && isParentView(menu)) {
111   - component = PARENT_VIEW;
112   - }
113   - return component;
114   - }
115   -
116   - /**
117   - * 是否为parent_view组件
118   - *
119   - * @param menu 菜单信息
120   - * @return 结果
121   - */
122   - default boolean isParentView(SysMenuDO menu) {
123   - return !MenuIdEnum.ROOT.getId().equals(menu.getParentId())
124   - && MenuTypeEnum.DIR.getType().equals(menu.getMenuType());
125   - }
  32 + SysAuthMenuRespVO convertTreeNode(SysMenuDO menu);
126 33  
127 34 }
... ...
src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dataobject/permission/SysMenuDO.java
... ... @@ -56,27 +56,12 @@ public class SysMenuDO extends BaseDO {
56 56 private String component;
57 57  
58 58 /**
59   - * 是否为外链(0是 1否)
60   - */
61   - private String isFrame;
62   -
63   - /**
64   - * 是否缓存(0缓存 1不缓存)
65   - */
66   - private String isCache;
67   -
68   - /**
69 59 * 类型(M目录 C菜单 F按钮)
70 60 */
71 61 @NotBlank(message = "菜单类型不能为空")
72 62 private String menuType;
73 63  
74 64 /**
75   - * 显示状态(0显示 1隐藏)
76   - */
77   - private String visible;
78   -
79   - /**
80 65 * 菜单状态(0显示 1隐藏)
81 66 */
82 67 private String status;
... ... @@ -85,7 +70,7 @@ public class SysMenuDO extends BaseDO {
85 70 * 权限字符串
86 71 */
87 72 @Size(max = 100, message = "权限标识长度不能超过100个字符")
88   - private String perms;
  73 + private String permission;
89 74  
90 75 /**
91 76 * 菜单图标
... ...
src/main/java/cn/iocoder/dashboard/modules/system/service/auth/SysAuthService.java
1 1 package cn.iocoder.dashboard.modules.system.service.auth;
2 2  
3 3 import cn.iocoder.dashboard.framework.security.core.service.SecurityFrameworkService;
4   -import cn.iocoder.dashboard.modules.system.controller.auth.vo.SysAuthGetInfoRespVO;
5   -import cn.iocoder.dashboard.modules.system.controller.auth.vo.SysAuthGetRouterRespVO;
  4 +import cn.iocoder.dashboard.modules.system.controller.auth.vo.SysAuthPermissionInfoRespVO;
  5 +import cn.iocoder.dashboard.modules.system.controller.auth.vo.SysAuthMenuRespVO;
6 6  
7 7 import java.util.List;
8 8 import java.util.Set;
... ... @@ -28,7 +28,7 @@ public interface SysAuthService extends SecurityFrameworkService {
28 28 * @param roleIds 用户拥有的角色编号数组
29 29 * @return 用户的信息,包括角色权限和菜单权限
30 30 */
31   - SysAuthGetInfoRespVO getInfo(Long userId, Set<Long> roleIds);
  31 + SysAuthPermissionInfoRespVO getPermissionInfo(Long userId, Set<Long> roleIds);
32 32  
33 33 /**
34 34 * 获得用户的菜单 Vue 路由
... ... @@ -40,6 +40,6 @@ public interface SysAuthService extends SecurityFrameworkService {
40 40 * @param roleIds 用户拥有的角色编号数组
41 41 * @return 菜单 Vue 路由
42 42 */
43   - List<SysAuthGetRouterRespVO> getRouters(Long userId, Set<Long> roleIds);
  43 + List<SysAuthMenuRespVO> listMenus(Long userId, Set<Long> roleIds);
44 44  
45 45 }
... ...
src/main/java/cn/iocoder/dashboard/modules/system/service/auth/impl/SysAuthServiceImpl.java
... ... @@ -5,8 +5,8 @@ import cn.hutool.core.util.StrUtil;
5 5 import cn.iocoder.dashboard.common.enums.CommonStatusEnum;
6 6 import cn.iocoder.dashboard.framework.security.config.SecurityProperties;
7 7 import cn.iocoder.dashboard.framework.security.core.LoginUser;
8   -import cn.iocoder.dashboard.modules.system.controller.auth.vo.SysAuthGetInfoRespVO;
9   -import cn.iocoder.dashboard.modules.system.controller.auth.vo.SysAuthGetRouterRespVO;
  8 +import cn.iocoder.dashboard.modules.system.controller.auth.vo.SysAuthPermissionInfoRespVO;
  9 +import cn.iocoder.dashboard.modules.system.controller.auth.vo.SysAuthMenuRespVO;
10 10 import cn.iocoder.dashboard.modules.system.convert.auth.SysAuthConvert;
11 11 import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.permission.SysMenuDO;
12 12 import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.permission.SysRoleDO;
... ... @@ -225,7 +225,7 @@ public class SysAuthServiceImpl implements SysAuthService {
225 225 }
226 226  
227 227 @Override
228   - public SysAuthGetInfoRespVO getInfo(Long userId, Set<Long> roleIds) {
  228 + public SysAuthPermissionInfoRespVO getPermissionInfo(Long userId, Set<Long> roleIds) {
229 229 // 获得用户信息
230 230 SysUserDO user = userService.getUser(userId);
231 231 if (user == null) {
... ... @@ -242,7 +242,7 @@ public class SysAuthServiceImpl implements SysAuthService {
242 242 }
243 243  
244 244 @Override
245   - public List<SysAuthGetRouterRespVO> getRouters(Long userId, Set<Long> roleIds) {
  245 + public List<SysAuthMenuRespVO> listMenus(Long userId, Set<Long> roleIds) {
246 246 List<SysMenuDO> menuList = permissionService.listRoleMenusFromCache(roleIds,
247 247 SetUtils.asSet(MenuTypeEnum.DIR.getType(), MenuTypeEnum.MENU.getType()),
248 248 SetUtils.asSet(CommonStatusEnum.ENABLE.getStatus()));
... ... @@ -250,17 +250,17 @@ public class SysAuthServiceImpl implements SysAuthService {
250 250 return buildRouterTree(menuList);
251 251 }
252 252  
253   - private static List<SysAuthGetRouterRespVO> buildRouterTree(List<SysMenuDO> menuList) {
  253 + private static List<SysAuthMenuRespVO> buildRouterTree(List<SysMenuDO> menuList) {
254 254 // 排序,保证菜单的有序性
255 255 menuList.sort(Comparator.comparing(SysMenuDO::getOrderNum));
256 256 // 构建菜单树
257 257 // 使用 LinkedHashMap 的原因,是为了排序 。实际也可以用 Stream API ,就是太丑了。
258   - Map<Long, SysAuthGetRouterRespVO> treeNodeMap = new LinkedHashMap<>();
  258 + Map<Long, SysAuthMenuRespVO> treeNodeMap = new LinkedHashMap<>();
259 259 menuList.forEach(menu -> treeNodeMap.put(menu.getMenuId(), SysAuthConvert.INSTANCE.convertTreeNode(menu)));
260 260 // 处理父子关系
261 261 treeNodeMap.values().stream().filter(node -> !node.getParentId().equals(MenuIdEnum.ROOT.getId())).forEach((childNode) -> {
262 262 // 获得父节点
263   - SysAuthGetRouterRespVO parentNode = treeNodeMap.get(childNode.getParentId());
  263 + SysAuthMenuRespVO parentNode = treeNodeMap.get(childNode.getParentId());
264 264 if (parentNode == null) {
265 265 log.error("[buildRouterTree][resource({}) 找不到父资源({})]", childNode.getMenuId(), childNode.getParentId());
266 266 return;
... ...
src/main/java/cn/iocoder/dashboard/modules/system/service/permission/impl/SysMenuServiceImpl.java
... ... @@ -34,7 +34,7 @@ public class SysMenuServiceImpl implements SysMenuService {
34 34 private volatile Map<Long, SysMenuDO> menuCache;
35 35 /**
36 36 * 权限与菜单缓存
37   - * key:权限 {@link SysMenuDO#getPerms()}
  37 + * key:权限 {@link SysMenuDO#getPermission()}
38 38 * value:SysMenuDO 数组,因为一个权限可能对应多个 SysMenuDO 对象
39 39 *
40 40 * 这里声明 volatile 修饰的原因是,每次刷新时,直接修改指向
... ... @@ -55,7 +55,7 @@ public class SysMenuServiceImpl implements SysMenuService {
55 55 ImmutableMultimap.Builder<String, SysMenuDO> permMenuCacheBuilder = ImmutableMultimap.builder();
56 56 menuList.forEach(menuDO -> {
57 57 menuCacheBuilder.put(menuDO.getMenuId(), menuDO);
58   - permMenuCacheBuilder.put(menuDO.getPerms(), menuDO);
  58 + permMenuCacheBuilder.put(menuDO.getPermission(), menuDO);
59 59 });
60 60 menuCache = menuCacheBuilder.build();
61 61 permMenuCache = permMenuCacheBuilder.build();
... ...