Commit 3bf173d744d68c8e447c8018c575f098434ab975
1 parent
c9372b0a
1. 简化 ruoyi 获取菜单列表时,和前端耦合性比较重的情况
2. 删除 MenuDO 表非关键性字段,进一步简化模型
Showing
14 changed files
with
86 additions
and
284 deletions
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
ruoyi-ui/src/api/menu.js
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(); | ... | ... |