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 package com.ruoyi.web.controller.system; 1 package com.ruoyi.web.controller.system;
2 2
3 import java.util.List; 3 import java.util.List;
  4 +
4 import org.springframework.beans.factory.annotation.Autowired; 5 import org.springframework.beans.factory.annotation.Autowired;
5 import org.springframework.security.access.prepost.PreAuthorize; 6 import org.springframework.security.access.prepost.PreAuthorize;
6 import org.springframework.validation.annotation.Validated; 7 import org.springframework.validation.annotation.Validated;
@@ -28,13 +29,12 @@ import com.ruoyi.system.service.ISysMenuService; @@ -28,13 +29,12 @@ import com.ruoyi.system.service.ISysMenuService;
28 29
29 /** 30 /**
30 * 菜单信息 31 * 菜单信息
31 - * 32 + *
32 * @author ruoyi 33 * @author ruoyi
33 */ 34 */
34 @RestController 35 @RestController
35 @RequestMapping("/system/menu") 36 @RequestMapping("/system/menu")
36 -public class SysMenuController extends BaseController  
37 -{ 37 +public class SysMenuController extends BaseController {
38 @Autowired 38 @Autowired
39 private ISysMenuService menuService; 39 private ISysMenuService menuService;
40 40
@@ -46,8 +46,7 @@ public class SysMenuController extends BaseController @@ -46,8 +46,7 @@ public class SysMenuController extends BaseController
46 */ 46 */
47 @PreAuthorize("@ss.hasPermi('system:menu:list')") 47 @PreAuthorize("@ss.hasPermi('system:menu:list')")
48 @GetMapping("/list") 48 @GetMapping("/list")
49 - public AjaxResult list(SysMenu menu)  
50 - { 49 + public AjaxResult list(SysMenu menu) {
51 LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest()); 50 LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
52 Long userId = loginUser.getUser().getUserId(); 51 Long userId = loginUser.getUser().getUserId();
53 List<SysMenu> menus = menuService.selectMenuList(menu, userId); 52 List<SysMenu> menus = menuService.selectMenuList(menu, userId);
@@ -59,8 +58,7 @@ public class SysMenuController extends BaseController @@ -59,8 +58,7 @@ public class SysMenuController extends BaseController
59 */ 58 */
60 @PreAuthorize("@ss.hasPermi('system:menu:query')") 59 @PreAuthorize("@ss.hasPermi('system:menu:query')")
61 @GetMapping(value = "/{menuId}") 60 @GetMapping(value = "/{menuId}")
62 - public AjaxResult getInfo(@PathVariable Long menuId)  
63 - { 61 + public AjaxResult getInfo(@PathVariable Long menuId) {
64 return AjaxResult.success(menuService.selectMenuById(menuId)); 62 return AjaxResult.success(menuService.selectMenuById(menuId));
65 } 63 }
66 64
@@ -68,8 +66,7 @@ public class SysMenuController extends BaseController @@ -68,8 +66,7 @@ public class SysMenuController extends BaseController
68 * 获取菜单下拉树列表 66 * 获取菜单下拉树列表
69 */ 67 */
70 @GetMapping("/treeselect") 68 @GetMapping("/treeselect")
71 - public AjaxResult treeselect(SysMenu menu)  
72 - { 69 + public AjaxResult treeselect(SysMenu menu) {
73 LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest()); 70 LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
74 Long userId = loginUser.getUser().getUserId(); 71 Long userId = loginUser.getUser().getUserId();
75 List<SysMenu> menus = menuService.selectMenuList(menu, userId); 72 List<SysMenu> menus = menuService.selectMenuList(menu, userId);
@@ -80,8 +77,7 @@ public class SysMenuController extends BaseController @@ -80,8 +77,7 @@ public class SysMenuController extends BaseController
80 * 加载对应角色菜单列表树 77 * 加载对应角色菜单列表树
81 */ 78 */
82 @GetMapping(value = "/roleMenuTreeselect/{roleId}") 79 @GetMapping(value = "/roleMenuTreeselect/{roleId}")
83 - public AjaxResult roleMenuTreeselect(@PathVariable("roleId") Long roleId)  
84 - { 80 + public AjaxResult roleMenuTreeselect(@PathVariable("roleId") Long roleId) {
85 LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest()); 81 LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
86 List<SysMenu> menus = menuService.selectMenuList(loginUser.getUser().getUserId()); 82 List<SysMenu> menus = menuService.selectMenuList(loginUser.getUser().getUserId());
87 AjaxResult ajax = AjaxResult.success(); 83 AjaxResult ajax = AjaxResult.success();
@@ -96,15 +92,11 @@ public class SysMenuController extends BaseController @@ -96,15 +92,11 @@ public class SysMenuController extends BaseController
96 @PreAuthorize("@ss.hasPermi('system:menu:add')") 92 @PreAuthorize("@ss.hasPermi('system:menu:add')")
97 @Log(title = "菜单管理", businessType = BusinessType.INSERT) 93 @Log(title = "菜单管理", businessType = BusinessType.INSERT)
98 @PostMapping 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 return AjaxResult.error("新增菜单'" + menu.getMenuName() + "'失败,菜单名称已存在"); 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 return AjaxResult.error("新增菜单'" + menu.getMenuName() + "'失败,地址必须以http(s)://开头"); 100 return AjaxResult.error("新增菜单'" + menu.getMenuName() + "'失败,地址必须以http(s)://开头");
109 } 101 }
110 menu.setCreateBy(SecurityUtils.getUsername()); 102 menu.setCreateBy(SecurityUtils.getUsername());
@@ -117,19 +109,13 @@ public class SysMenuController extends BaseController @@ -117,19 +109,13 @@ public class SysMenuController extends BaseController
117 @PreAuthorize("@ss.hasPermi('system:menu:edit')") 109 @PreAuthorize("@ss.hasPermi('system:menu:edit')")
118 @Log(title = "菜单管理", businessType = BusinessType.UPDATE) 110 @Log(title = "菜单管理", businessType = BusinessType.UPDATE)
119 @PutMapping 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 return AjaxResult.error("修改菜单'" + menu.getMenuName() + "'失败,菜单名称已存在"); 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 return AjaxResult.error("修改菜单'" + menu.getMenuName() + "'失败,地址必须以http(s)://开头"); 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 return AjaxResult.error("修改菜单'" + menu.getMenuName() + "'失败,上级菜单不能选择自己"); 119 return AjaxResult.error("修改菜单'" + menu.getMenuName() + "'失败,上级菜单不能选择自己");
134 } 120 }
135 menu.setUpdateBy(SecurityUtils.getUsername()); 121 menu.setUpdateBy(SecurityUtils.getUsername());
@@ -142,16 +128,13 @@ public class SysMenuController extends BaseController @@ -142,16 +128,13 @@ public class SysMenuController extends BaseController
142 @PreAuthorize("@ss.hasPermi('system:menu:remove')") 128 @PreAuthorize("@ss.hasPermi('system:menu:remove')")
143 @Log(title = "菜单管理", businessType = BusinessType.DELETE) 129 @Log(title = "菜单管理", businessType = BusinessType.DELETE)
144 @DeleteMapping("/{menuId}") 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 return AjaxResult.error("存在子菜单,不允许删除"); 133 return AjaxResult.error("存在子菜单,不允许删除");
150 } 134 }
151 - if (menuService.checkMenuExistRole(menuId))  
152 - { 135 + if (menuService.checkMenuExistRole(menuId)) {
153 return AjaxResult.error("菜单已分配,不允许删除"); 136 return AjaxResult.error("菜单已分配,不允许删除");
154 } 137 }
155 return toAjax(menuService.deleteMenuById(menuId)); 138 return toAjax(menuService.deleteMenuById(menuId));
156 } 139 }
157 -}  
158 \ No newline at end of file 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,7 +18,7 @@ export function login(username, password, code, uuid) {
18 // 获取用户详细信息 18 // 获取用户详细信息
19 export function getInfo() { 19 export function getInfo() {
20 return request({ 20 return request({
21 - url: '/get-info', 21 + url: '/get-permission-info',
22 method: 'get' 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,7 +3,7 @@ import request from &#39;@/utils/request&#39;
3 // 获取路由 3 // 获取路由
4 export const getRouters = () => { 4 export const getRouters = () => {
5 return request({ 5 return request({
6 - url: '/get-routers', 6 + url: '/list-menus',
7 method: 'get' 7 method: 'get'
8 }) 8 })
9 } 9 }
ruoyi-ui/src/store/modules/permission.js
@@ -43,18 +43,27 @@ const permission = { @@ -43,18 +43,27 @@ const permission = {
43 // 遍历后台传来的路由字符串,转换为组件对象 43 // 遍历后台传来的路由字符串,转换为组件对象
44 function filterAsyncRouter(asyncRouterMap, isRewrite = false) { 44 function filterAsyncRouter(asyncRouterMap, isRewrite = false) {
45 return asyncRouterMap.filter(route => { 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 route.component = Layout 56 route.component = Layout
53 - } else if (route.component === 'ParentView') {  
54 - route.component = ParentView  
55 } else { 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 if (route.children != null && route.children && route.children.length) { 68 if (route.children != null && route.children && route.children.length) {
60 route.children = filterAsyncRouter(route.children, route, isRewrite) 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,12 +9,12 @@ Content-Type: application/json
9 "code": "1024" 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 Authorization: Bearer {{token}} 14 Authorization: Bearer {{token}}
15 15
16 -### 请求 /get-routers 接口 => 成功  
17 -GET {{baseUrl}}/get-routers 16 +### 请求 /list-menus 接口 => 成功
  17 +GET {{baseUrl}}/list-menus
18 Authorization: Bearer {{token}} 18 Authorization: Bearer {{token}}
19 19
20 ### 请求 /druid/xxx 接口 => 失败 TODO 临时测试 20 ### 请求 /druid/xxx 接口 => 失败 TODO 临时测试
src/main/java/cn/iocoder/dashboard/modules/system/controller/auth/SysAuthController.java
1 package cn.iocoder.dashboard.modules.system.controller.auth; 1 package cn.iocoder.dashboard.modules.system.controller.auth;
2 2
3 import cn.iocoder.dashboard.common.pojo.CommonResult; 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 import cn.iocoder.dashboard.modules.system.controller.auth.vo.SysAuthLoginReqVO; 6 import cn.iocoder.dashboard.modules.system.controller.auth.vo.SysAuthLoginReqVO;
7 import cn.iocoder.dashboard.modules.system.controller.auth.vo.SysAuthLoginRespVO; 7 import cn.iocoder.dashboard.modules.system.controller.auth.vo.SysAuthLoginRespVO;
8 import cn.iocoder.dashboard.modules.system.service.auth.SysAuthService; 8 import cn.iocoder.dashboard.modules.system.service.auth.SysAuthService;
@@ -35,17 +35,17 @@ public class SysAuthController { @@ -35,17 +35,17 @@ public class SysAuthController {
35 return success(SysAuthLoginRespVO.builder().token(token).build()); 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 return success(respVO); 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 return success(respVOList); 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 package cn.iocoder.dashboard.modules.system.controller.auth.vo; 1 package cn.iocoder.dashboard.modules.system.controller.auth.vo;
2 2
  3 +import io.swagger.annotations.ApiModel;
3 import lombok.AllArgsConstructor; 4 import lombok.AllArgsConstructor;
4 import lombok.Builder; 5 import lombok.Builder;
5 import lombok.Data; 6 import lombok.Data;
@@ -7,16 +8,12 @@ import lombok.NoArgsConstructor; @@ -7,16 +8,12 @@ import lombok.NoArgsConstructor;
7 8
8 import java.util.List; 9 import java.util.List;
9 10
10 -/**  
11 - * 路由配置信息  
12 - *  
13 - * @author ruoyi  
14 - */ 11 +@ApiModel("登陆用户的菜单信息 Response VO")
15 @Data 12 @Data
16 @NoArgsConstructor 13 @NoArgsConstructor
17 @AllArgsConstructor 14 @AllArgsConstructor
18 @Builder 15 @Builder
19 -public class SysAuthGetRouterRespVO { 16 +public class SysAuthMenuRespVO {
20 17
21 /** 18 /**
22 * 菜单编号 19 * 菜单编号
@@ -28,66 +25,27 @@ public class SysAuthGetRouterRespVO { @@ -28,66 +25,27 @@ public class SysAuthGetRouterRespVO {
28 private Long parentId; 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 private String path; 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 private String component; 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,20 +9,20 @@ import lombok.NoArgsConstructor;
9 9
10 import java.util.Set; 10 import java.util.Set;
11 11
12 -@ApiModel("获得用户信息 Resp VO") 12 +@ApiModel(value = "登陆用户的权限信息 Response VO", description = "额外包括用户信息和角色列表")
13 @Data 13 @Data
14 @NoArgsConstructor 14 @NoArgsConstructor
15 @AllArgsConstructor 15 @AllArgsConstructor
16 @Builder 16 @Builder
17 -public class SysAuthGetInfoRespVO { 17 +public class SysAuthPermissionInfoRespVO {
18 18
19 @ApiModelProperty(value = "用户信息", required = true) 19 @ApiModelProperty(value = "用户信息", required = true)
20 private UserVO user; 20 private UserVO user;
21 21
22 - @ApiModelProperty(value = "角色权限数组", required = true) 22 + @ApiModelProperty(value = "角色标识数组", required = true)
23 private Set<String> roles; 23 private Set<String> roles;
24 24
25 - @ApiModelProperty(value = "菜单权限数组", required = true) 25 + @ApiModelProperty(value = "操作权限数组", required = true)
26 private Set<String> permissions; 26 private Set<String> permissions;
27 27
28 @ApiModel("用户信息 VO") 28 @ApiModel("用户信息 VO")
src/main/java/cn/iocoder/dashboard/modules/system/convert/auth/SysAuthConvert.java
1 package cn.iocoder.dashboard.modules.system.convert.auth; 1 package cn.iocoder.dashboard.modules.system.convert.auth;
2 2
3 -import cn.iocoder.dashboard.common.enums.CommonStatusEnum;  
4 import cn.iocoder.dashboard.framework.security.core.LoginUser; 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 import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.permission.SysMenuDO; 6 import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.permission.SysMenuDO;
8 import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.permission.SysRoleDO; 7 import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.permission.SysRoleDO;
9 import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.user.SysUserDO; 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 import cn.iocoder.dashboard.util.collection.CollectionUtils; 9 import cn.iocoder.dashboard.util.collection.CollectionUtils;
13 -import jodd.util.StringUtil;  
14 -import org.apache.commons.lang3.StringUtils;  
15 import org.mapstruct.Mapper; 10 import org.mapstruct.Mapper;
16 import org.mapstruct.Mapping; 11 import org.mapstruct.Mapping;
17 import org.mapstruct.factory.Mappers; 12 import org.mapstruct.factory.Mappers;
@@ -21,107 +16,19 @@ import java.util.List; @@ -21,107 +16,19 @@ import java.util.List;
21 @Mapper 16 @Mapper
22 public interface SysAuthConvert { 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 SysAuthConvert INSTANCE = Mappers.getMapper(SysAuthConvert.class); 19 SysAuthConvert INSTANCE = Mappers.getMapper(SysAuthConvert.class);
31 20
32 @Mapping(source = "updateTime", target = "updateTime", ignore = true) // 字段相同,但是含义不同,忽略 21 @Mapping(source = "updateTime", target = "updateTime", ignore = true) // 字段相同,但是含义不同,忽略
33 LoginUser convert(SysUserDO bean); 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 .roles(CollectionUtils.convertSet(roleList, SysRoleDO::getRoleKey)) 27 .roles(CollectionUtils.convertSet(roleList, SysRoleDO::getRoleKey))
39 - .permissions(CollectionUtils.convertSet(menuList, SysMenuDO::getPerms)) 28 + .permissions(CollectionUtils.convertSet(menuList, SysMenuDO::getPermission))
40 .build(); 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,27 +56,12 @@ public class SysMenuDO extends BaseDO {
56 private String component; 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 * 类型(M目录 C菜单 F按钮) 59 * 类型(M目录 C菜单 F按钮)
70 */ 60 */
71 @NotBlank(message = "菜单类型不能为空") 61 @NotBlank(message = "菜单类型不能为空")
72 private String menuType; 62 private String menuType;
73 63
74 /** 64 /**
75 - * 显示状态(0显示 1隐藏)  
76 - */  
77 - private String visible;  
78 -  
79 - /**  
80 * 菜单状态(0显示 1隐藏) 65 * 菜单状态(0显示 1隐藏)
81 */ 66 */
82 private String status; 67 private String status;
@@ -85,7 +70,7 @@ public class SysMenuDO extends BaseDO { @@ -85,7 +70,7 @@ public class SysMenuDO extends BaseDO {
85 * 权限字符串 70 * 权限字符串
86 */ 71 */
87 @Size(max = 100, message = "权限标识长度不能超过100个字符") 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 package cn.iocoder.dashboard.modules.system.service.auth; 1 package cn.iocoder.dashboard.modules.system.service.auth;
2 2
3 import cn.iocoder.dashboard.framework.security.core.service.SecurityFrameworkService; 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 import java.util.List; 7 import java.util.List;
8 import java.util.Set; 8 import java.util.Set;
@@ -28,7 +28,7 @@ public interface SysAuthService extends SecurityFrameworkService { @@ -28,7 +28,7 @@ public interface SysAuthService extends SecurityFrameworkService {
28 * @param roleIds 用户拥有的角色编号数组 28 * @param roleIds 用户拥有的角色编号数组
29 * @return 用户的信息,包括角色权限和菜单权限 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 * 获得用户的菜单 Vue 路由 34 * 获得用户的菜单 Vue 路由
@@ -40,6 +40,6 @@ public interface SysAuthService extends SecurityFrameworkService { @@ -40,6 +40,6 @@ public interface SysAuthService extends SecurityFrameworkService {
40 * @param roleIds 用户拥有的角色编号数组 40 * @param roleIds 用户拥有的角色编号数组
41 * @return 菜单 Vue 路由 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,8 +5,8 @@ import cn.hutool.core.util.StrUtil;
5 import cn.iocoder.dashboard.common.enums.CommonStatusEnum; 5 import cn.iocoder.dashboard.common.enums.CommonStatusEnum;
6 import cn.iocoder.dashboard.framework.security.config.SecurityProperties; 6 import cn.iocoder.dashboard.framework.security.config.SecurityProperties;
7 import cn.iocoder.dashboard.framework.security.core.LoginUser; 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 import cn.iocoder.dashboard.modules.system.convert.auth.SysAuthConvert; 10 import cn.iocoder.dashboard.modules.system.convert.auth.SysAuthConvert;
11 import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.permission.SysMenuDO; 11 import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.permission.SysMenuDO;
12 import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.permission.SysRoleDO; 12 import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.permission.SysRoleDO;
@@ -225,7 +225,7 @@ public class SysAuthServiceImpl implements SysAuthService { @@ -225,7 +225,7 @@ public class SysAuthServiceImpl implements SysAuthService {
225 } 225 }
226 226
227 @Override 227 @Override
228 - public SysAuthGetInfoRespVO getInfo(Long userId, Set<Long> roleIds) { 228 + public SysAuthPermissionInfoRespVO getPermissionInfo(Long userId, Set<Long> roleIds) {
229 // 获得用户信息 229 // 获得用户信息
230 SysUserDO user = userService.getUser(userId); 230 SysUserDO user = userService.getUser(userId);
231 if (user == null) { 231 if (user == null) {
@@ -242,7 +242,7 @@ public class SysAuthServiceImpl implements SysAuthService { @@ -242,7 +242,7 @@ public class SysAuthServiceImpl implements SysAuthService {
242 } 242 }
243 243
244 @Override 244 @Override
245 - public List<SysAuthGetRouterRespVO> getRouters(Long userId, Set<Long> roleIds) { 245 + public List<SysAuthMenuRespVO> listMenus(Long userId, Set<Long> roleIds) {
246 List<SysMenuDO> menuList = permissionService.listRoleMenusFromCache(roleIds, 246 List<SysMenuDO> menuList = permissionService.listRoleMenusFromCache(roleIds,
247 SetUtils.asSet(MenuTypeEnum.DIR.getType(), MenuTypeEnum.MENU.getType()), 247 SetUtils.asSet(MenuTypeEnum.DIR.getType(), MenuTypeEnum.MENU.getType()),
248 SetUtils.asSet(CommonStatusEnum.ENABLE.getStatus())); 248 SetUtils.asSet(CommonStatusEnum.ENABLE.getStatus()));
@@ -250,17 +250,17 @@ public class SysAuthServiceImpl implements SysAuthService { @@ -250,17 +250,17 @@ public class SysAuthServiceImpl implements SysAuthService {
250 return buildRouterTree(menuList); 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 menuList.sort(Comparator.comparing(SysMenuDO::getOrderNum)); 255 menuList.sort(Comparator.comparing(SysMenuDO::getOrderNum));
256 // 构建菜单树 256 // 构建菜单树
257 // 使用 LinkedHashMap 的原因,是为了排序 。实际也可以用 Stream API ,就是太丑了。 257 // 使用 LinkedHashMap 的原因,是为了排序 。实际也可以用 Stream API ,就是太丑了。
258 - Map<Long, SysAuthGetRouterRespVO> treeNodeMap = new LinkedHashMap<>(); 258 + Map<Long, SysAuthMenuRespVO> treeNodeMap = new LinkedHashMap<>();
259 menuList.forEach(menu -> treeNodeMap.put(menu.getMenuId(), SysAuthConvert.INSTANCE.convertTreeNode(menu))); 259 menuList.forEach(menu -> treeNodeMap.put(menu.getMenuId(), SysAuthConvert.INSTANCE.convertTreeNode(menu)));
260 // 处理父子关系 260 // 处理父子关系
261 treeNodeMap.values().stream().filter(node -> !node.getParentId().equals(MenuIdEnum.ROOT.getId())).forEach((childNode) -> { 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 if (parentNode == null) { 264 if (parentNode == null) {
265 log.error("[buildRouterTree][resource({}) 找不到父资源({})]", childNode.getMenuId(), childNode.getParentId()); 265 log.error("[buildRouterTree][resource({}) 找不到父资源({})]", childNode.getMenuId(), childNode.getParentId());
266 return; 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,7 +34,7 @@ public class SysMenuServiceImpl implements SysMenuService {
34 private volatile Map<Long, SysMenuDO> menuCache; 34 private volatile Map<Long, SysMenuDO> menuCache;
35 /** 35 /**
36 * 权限与菜单缓存 36 * 权限与菜单缓存
37 - * key:权限 {@link SysMenuDO#getPerms()} 37 + * key:权限 {@link SysMenuDO#getPermission()}
38 * value:SysMenuDO 数组,因为一个权限可能对应多个 SysMenuDO 对象 38 * value:SysMenuDO 数组,因为一个权限可能对应多个 SysMenuDO 对象
39 * 39 *
40 * 这里声明 volatile 修饰的原因是,每次刷新时,直接修改指向 40 * 这里声明 volatile 修饰的原因是,每次刷新时,直接修改指向
@@ -55,7 +55,7 @@ public class SysMenuServiceImpl implements SysMenuService { @@ -55,7 +55,7 @@ public class SysMenuServiceImpl implements SysMenuService {
55 ImmutableMultimap.Builder<String, SysMenuDO> permMenuCacheBuilder = ImmutableMultimap.builder(); 55 ImmutableMultimap.Builder<String, SysMenuDO> permMenuCacheBuilder = ImmutableMultimap.builder();
56 menuList.forEach(menuDO -> { 56 menuList.forEach(menuDO -> {
57 menuCacheBuilder.put(menuDO.getMenuId(), menuDO); 57 menuCacheBuilder.put(menuDO.getMenuId(), menuDO);
58 - permMenuCacheBuilder.put(menuDO.getPerms(), menuDO); 58 + permMenuCacheBuilder.put(menuDO.getPermission(), menuDO);
59 }); 59 });
60 menuCache = menuCacheBuilder.build(); 60 menuCache = menuCacheBuilder.build();
61 permMenuCache = permMenuCacheBuilder.build(); 61 permMenuCache = permMenuCacheBuilder.build();