Commit 3e5bd019626f9fca82ff97b75b729f02fc548ed3

Authored by YunaiV
1 parent ea4c9e49

1. 完成 menu 模块的迁移

2. 增加 mybatis plus 的 QueryWrapperX 封装,方便拼接 SQL
Showing 25 changed files with 209 additions and 269 deletions
ruoyi-system/src/main/java/com/ruoyi/system/mapper/SysMenuMapper.java
... ... @@ -59,59 +59,11 @@ public interface SysMenuMapper
59 59  
60 60 /**
61 61 * 根据角色ID查询菜单树信息
62   - *
  62 + *
63 63 * @param roleId 角色ID
64 64 * @param menuCheckStrictly 菜单树选择项是否关联显示
65 65 * @return 选中菜单列表
66 66 */
67 67 public List<Integer> selectMenuListByRoleId(@Param("roleId") Long roleId, @Param("menuCheckStrictly") boolean menuCheckStrictly);
68 68  
69   - /**
70   - * 根据菜单ID查询信息
71   - *
72   - * @param menuId 菜单ID
73   - * @return 菜单信息
74   - */
75   - public SysMenu selectMenuById(Long menuId);
76   -
77   - /**
78   - * 是否存在菜单子节点
79   - *
80   - * @param menuId 菜单ID
81   - * @return 结果
82   - */
83   - public int hasChildByMenuId(Long menuId);
84   -
85   - /**
86   - * 新增菜单信息
87   - *
88   - * @param menu 菜单信息
89   - * @return 结果
90   - */
91   - public int insertMenu(SysMenu menu);
92   -
93   - /**
94   - * 修改菜单信息
95   - *
96   - * @param menu 菜单信息
97   - * @return 结果
98   - */
99   - public int updateMenu(SysMenu menu);
100   -
101   - /**
102   - * 删除菜单管理信息
103   - *
104   - * @param menuId 菜单ID
105   - * @return 结果
106   - */
107   - public int deleteMenuById(Long menuId);
108   -
109   - /**
110   - * 校验菜单名称是否唯一
111   - *
112   - * @param menuName 菜单名称
113   - * @param parentId 父菜单ID
114   - * @return 结果
115   - */
116   - public SysMenu checkMenuNameUnique(@Param("menuName") String menuName, @Param("parentId") Long parentId);
117 69 }
... ...
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysMenuServiceImpl.java
... ... @@ -8,6 +8,7 @@ import java.util.LinkedList;
8 8 import java.util.List;
9 9 import java.util.Set;
10 10 import java.util.stream.Collectors;
  11 +
11 12 import org.springframework.beans.factory.annotation.Autowired;
12 13 import org.springframework.stereotype.Service;
13 14 import com.ruoyi.common.constant.UserConstants;
... ... @@ -30,19 +31,9 @@ import com.ruoyi.system.service.ISysMenuService;
30 31 * @author ruoyi
31 32 */
32 33 @Service
33   -public class SysMenuServiceImpl implements ISysMenuService
34   -{
  34 +public class SysMenuServiceImpl implements ISysMenuService {
35 35 public static final String PREMISSION_STRING = "perms[\"{0}\"]";
36 36  
37   - @Autowired
38   - private SysMenuMapper menuMapper;
39   -
40   - @Autowired
41   - private SysRoleMapper roleMapper;
42   -
43   - @Autowired
44   - private SysRoleMenuMapper roleMenuMapper;
45   -
46 37 /**
47 38 * 根据用户查询系统菜单列表
48 39 *
... ... @@ -50,8 +41,7 @@ public class SysMenuServiceImpl implements ISysMenuService
50 41 * @return 菜单列表
51 42 */
52 43 @Override
53   - public List<SysMenu> selectMenuList(Long userId)
54   - {
  44 + public List<SysMenu> selectMenuList(Long userId) {
55 45 return selectMenuList(new SysMenu(), userId);
56 46 }
57 47  
... ... @@ -62,16 +52,12 @@ public class SysMenuServiceImpl implements ISysMenuService
62 52 * @return 菜单列表
63 53 */
64 54 @Override
65   - public List<SysMenu> selectMenuList(SysMenu menu, Long userId)
66   - {
  55 + public List<SysMenu> selectMenuList(SysMenu menu, Long userId) {
67 56 List<SysMenu> menuList = null;
68 57 // 管理员显示所有菜单信息
69   - if (SysUser.isAdmin(userId))
70   - {
  58 + if (SysUser.isAdmin(userId)) {
71 59 menuList = menuMapper.selectMenuList(menu);
72   - }
73   - else
74   - {
  60 + } else {
75 61 menu.getParams().put("userId", userId);
76 62 menuList = menuMapper.selectMenuListByUserId(menu);
77 63 }
... ... @@ -85,14 +71,11 @@ public class SysMenuServiceImpl implements ISysMenuService
85 71 * @return 权限列表
86 72 */
87 73 @Override
88   - public Set<String> selectMenuPermsByUserId(Long userId)
89   - {
  74 + public Set<String> selectMenuPermsByUserId(Long userId) {
90 75 List<String> perms = menuMapper.selectMenuPermsByUserId(userId);
91 76 Set<String> permsSet = new HashSet<>();
92   - for (String perm : perms)
93   - {
94   - if (StringUtils.isNotEmpty(perm))
95   - {
  77 + for (String perm : perms) {
  78 + if (StringUtils.isNotEmpty(perm)) {
96 79 permsSet.addAll(Arrays.asList(perm.trim().split(",")));
97 80 }
98 81 }
... ... @@ -106,15 +89,11 @@ public class SysMenuServiceImpl implements ISysMenuService
106 89 * @return 菜单列表
107 90 */
108 91 @Override
109   - public List<SysMenu> selectMenuTreeByUserId(Long userId)
110   - {
  92 + public List<SysMenu> selectMenuTreeByUserId(Long userId) {
111 93 List<SysMenu> menus = null;
112   - if (SecurityUtils.isAdmin(userId))
113   - {
  94 + if (SecurityUtils.isAdmin(userId)) {
114 95 menus = menuMapper.selectMenuTreeAll();
115   - }
116   - else
117   - {
  96 + } else {
118 97 menus = menuMapper.selectMenuTreeByUserId(userId);
119 98 }
120 99 return getChildPerms(menus, 0);
... ... @@ -127,8 +106,7 @@ public class SysMenuServiceImpl implements ISysMenuService
127 106 * @return 选中菜单列表
128 107 */
129 108 @Override
130   - public List<Integer> selectMenuListByRoleId(Long roleId)
131   - {
  109 + public List<Integer> selectMenuListByRoleId(Long roleId) {
132 110 SysRole role = roleMapper.selectRoleById(roleId);
133 111 return menuMapper.selectMenuListByRoleId(roleId, role.isMenuCheckStrictly());
134 112 }
... ... @@ -140,102 +118,22 @@ public class SysMenuServiceImpl implements ISysMenuService
140 118 * @return 下拉树结构列表
141 119 */
142 120 @Override
143   - public List<TreeSelect> buildMenuTreeSelect(List<SysMenu> menus)
144   - {
  121 + public List<TreeSelect> buildMenuTreeSelect(List<SysMenu> menus) {
145 122 List<SysMenu> menuTrees = buildMenuTree(menus);
146 123 return menuTrees.stream().map(TreeSelect::new).collect(Collectors.toList());
147 124 }
148 125  
149 126 /**
150   - * 根据菜单ID查询信息
151   - *
152   - * @param menuId 菜单ID
153   - * @return 菜单信息
154   - */
155   - @Override
156   - public SysMenu selectMenuById(Long menuId)
157   - {
158   - return menuMapper.selectMenuById(menuId);
159   - }
160   -
161   - /**
162   - * 是否存在菜单子节点
163   - *
164   - * @param menuId 菜单ID
165   - * @return 结果
166   - */
167   - @Override
168   - public boolean hasChildByMenuId(Long menuId)
169   - {
170   - int result = menuMapper.hasChildByMenuId(menuId);
171   - return result > 0 ? true : false;
172   - }
173   -
174   - /**
175 127 * 查询菜单使用数量
176 128 *
177 129 * @param menuId 菜单ID
178 130 * @return 结果
179 131 */
180 132 @Override
181   - public boolean checkMenuExistRole(Long menuId)
182   - {
  133 + public boolean checkMenuExistRole(Long menuId) {
183 134 int result = roleMenuMapper.checkMenuExistRole(menuId);
184 135 return result > 0 ? true : false;
185 136 }
186 137  
187   - /**
188   - * 新增保存菜单信息
189   - *
190   - * @param menu 菜单信息
191   - * @return 结果
192   - */
193   - @Override
194   - public int insertMenu(SysMenu menu)
195   - {
196   - return menuMapper.insertMenu(menu);
197   - }
198   -
199   - /**
200   - * 修改保存菜单信息
201   - *
202   - * @param menu 菜单信息
203   - * @return 结果
204   - */
205   - @Override
206   - public int updateMenu(SysMenu menu)
207   - {
208   - return menuMapper.updateMenu(menu);
209   - }
210   -
211   - /**
212   - * 删除菜单管理信息
213   - *
214   - * @param menuId 菜单ID
215   - * @return 结果
216   - */
217   - @Override
218   - public int deleteMenuById(Long menuId)
219   - {
220   - return menuMapper.deleteMenuById(menuId);
221   - }
222   -
223   - /**
224   - * 校验菜单名称是否唯一
225   - *
226   - * @param menu 菜单信息
227   - * @return 结果
228   - */
229   - @Override
230   - public String checkMenuNameUnique(SysMenu menu)
231   - {
232   - Long menuId = StringUtils.isNull(menu.getMenuId()) ? -1L : menu.getMenuId();
233   - SysMenu info = menuMapper.checkMenuNameUnique(menu.getMenuName(), menu.getParentId());
234   - if (StringUtils.isNotNull(info) && info.getMenuId().longValue() != menuId.longValue())
235   - {
236   - return UserConstants.NOT_UNIQUE;
237   - }
238   - return UserConstants.UNIQUE;
239   - }
240 138  
241 139 }
... ...
ruoyi-ui/src/utils/dict.js
... ... @@ -7,7 +7,7 @@ import store from &#39;@/store&#39;
7 7  
8 8 export const DICT_TYPE = {
9 9 SYS_COMMON_STATUS: 'sys_common_status',
10   - SYS_MENU_TYPE: 'menu_type'
  10 + SYS_MENU_TYPE: 'sys_menu_type'
11 11 }
12 12  
13 13 /**
... ...
ruoyi-ui/src/views/system/menu/index.vue
... ... @@ -13,10 +13,10 @@
13 13 <el-form-item label="状态" prop="status">
14 14 <el-select v-model="queryParams.status" placeholder="菜单状态" clearable size="small">
15 15 <el-option
16   - v-for="dict in statusOptions"
17   - :key="dict.dictValue"
18   - :label="dict.dictLabel"
19   - :value="dict.dictValue"
  16 + v-for="dict in statusDictDatas"
  17 + :key="dict.value"
  18 + :label="dict.label"
  19 + :value="dict.value"
20 20 />
21 21 </el-select>
22 22 </el-form-item>
... ... @@ -106,8 +106,8 @@
106 106 <el-radio-group v-model="form.type">
107 107 <el-radio
108 108 v-for="dict in menuTypeDictDatas"
109   - :key="dict.value"
110   - :label="dict.value"
  109 + :key="parseInt(dict.value)"
  110 + :label="parseInt(dict.value)"
111 111 >{{dict.label}}</el-radio>
112 112 </el-radio-group>
113 113 </el-form-item>
... ... @@ -165,7 +165,7 @@
165 165 <el-radio
166 166 v-for="dict in statusDictDatas"
167 167 :key="dict.value"
168   - :label="dict.value"
  168 + :label="parseInt(dict.value)"
169 169 >{{dict.label}}</el-radio>
170 170 </el-radio-group>
171 171 </el-form-item>
... ... @@ -206,8 +206,6 @@ export default {
206 206 title: "",
207 207 // 是否显示弹出层
208 208 open: false,
209   - // 菜单状态数据字典
210   - statusOptions: [],
211 209 // 查询参数
212 210 queryParams: {
213 211 name: undefined,
... ... @@ -288,9 +286,9 @@ export default {
288 286 parentId: 0,
289 287 name: undefined,
290 288 icon: undefined,
291   - type: "1",
  289 + type: SysMenuTypeEnum.DIR,
292 290 sort: undefined,
293   - status: "0"
  291 + status: SysCommonStatusEnum.ENABLE
294 292 };
295 293 this.resetForm("form");
296 294 },
... ... @@ -329,17 +327,18 @@ export default {
329 327 submitForm: function() {
330 328 this.$refs["form"].validate(valid => {
331 329 if (valid) {
332   - // 若权限类型为菜单时,进行 route 的校验,避免后续拼接出来的路由无法跳转
333   - if (this.form.type === ResourceTypeEnum.MENU) {
  330 + // 若权限类型为目录或者菜单时,进行 path 的校验,避免后续拼接出来的路由无法跳转
  331 + if (this.form.type === SysMenuTypeEnum.DIR
  332 + || this.form.type === SysMenuTypeEnum.MENU) {
334 333 // 如果是外链,则不进行校验
335   - const route = this.resourceForm.route
336   - if (route.indexOf('http://') === -1 || route.indexOf('https://') === -1) {
337   - // 父权限为根节点,route 必须以 / 开头
338   - if (this.resourceForm.pid === 0 && route.charAt(0) !== '/') {
339   - this.messageSuccess('前端必须以 / 开头')
  334 + const path = this.form.path
  335 + if (path.indexOf('http://') === -1 || path.indexOf('https://') === -1) {
  336 + // 父权限为根节点,path 必须以 / 开头
  337 + if (this.form.parentId === 0 && path.charAt(0) !== '/') {
  338 + this.msgSuccess('前端必须以 / 开头')
340 339 return
341   - } else if (this.resourceForm.pid !== 0 && route.charAt(0) === '/') {
342   - this.messageSuccess('前端不能以 / 开头')
  340 + } else if (this.form.parentId !== 0 && path.charAt(0) === '/') {
  341 + this.msgSuccess('前端不能以 / 开头')
343 342 return
344 343 }
345 344 }
... ...
src/main/java/cn/iocoder/dashboard/framework/mybatis/core/BaseDO.java renamed to src/main/java/cn/iocoder/dashboard/framework/mybatis/core/dataobject/BaseDO.java
1   -package cn.iocoder.dashboard.framework.mybatis.core;
  1 +package cn.iocoder.dashboard.framework.mybatis.core.dataobject;
2 2  
3 3 import com.baomidou.mybatisplus.annotation.TableLogic;
4 4 import lombok.Data;
... ...
src/main/java/cn/iocoder/dashboard/framework/mybatis/core/query/QueryWrapperX.java 0 → 100644
  1 +package cn.iocoder.dashboard.framework.mybatis.core.query;
  2 +
  3 +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  4 +import com.baomidou.mybatisplus.core.toolkit.ArrayUtils;
  5 +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
  6 +import org.springframework.util.StringUtils;
  7 +
  8 +import java.util.Collection;
  9 +
  10 +/**
  11 + * 拓展 MyBatis Plus QueryWrapper 类,主要增加如下功能:
  12 + *
  13 + * 1. 拼接条件的方法,增加 xxxIfPresent 方法,用于判断值不存在的时候,不要拼接到条件中。
  14 + *
  15 + * @param <T> 数据类型
  16 + */
  17 +public class QueryWrapperX<T> extends QueryWrapper<T> {
  18 +
  19 + public QueryWrapperX<T> likeIfPresent(String column, String val) {
  20 + if (StringUtils.hasText(val)) {
  21 + return (QueryWrapperX<T>) super.like(column, val);
  22 + }
  23 + return this;
  24 + }
  25 +
  26 + public QueryWrapperX<T> inIfPresent(String column, Collection<?> values) {
  27 + if (!CollectionUtils.isEmpty(values)) {
  28 + return (QueryWrapperX<T>) super.in(column, values);
  29 + }
  30 + return this;
  31 + }
  32 +
  33 + public QueryWrapperX<T> inIfPresent(String column, Object... values) {
  34 + if (!ArrayUtils.isEmpty(values)) {
  35 + return (QueryWrapperX<T>) super.in(column, values);
  36 + }
  37 + return this;
  38 + }
  39 +
  40 + public QueryWrapperX<T> eqIfPresent(String column, Object val) {
  41 + if (val != null) {
  42 + return (QueryWrapperX<T>) super.eq(column, val);
  43 + }
  44 + return this;
  45 + }
  46 +
  47 + public QueryWrapperX<T> gtIfPresent(String column, Object val) {
  48 + if (val != null) {
  49 + return (QueryWrapperX<T>) super.gt(column, val);
  50 + }
  51 + return this;
  52 + }
  53 +
  54 + public QueryWrapperX<T> betweenIfPresent(String column, Object val1, Object val2) {
  55 + if (val1 != null && val2 != null) {
  56 + return (QueryWrapperX<T>) super.between(column, val1, val2);
  57 + }
  58 + if (val1 != null) {
  59 + return (QueryWrapperX<T>) ge(column, val1);
  60 + }
  61 + if (val2 != null) {
  62 + return (QueryWrapperX<T>) le(column, val2);
  63 + }
  64 + return this;
  65 + }
  66 +
  67 + // ========== 重写父类方法,方便链式调用 ==========
  68 +
  69 + @Override
  70 + public QueryWrapperX<T> eq(boolean condition, String column, Object val) {
  71 + super.eq(condition, column, val);
  72 + return this;
  73 + }
  74 +
  75 + @Override
  76 + public QueryWrapperX<T> eq(String column, Object val) {
  77 + super.eq(column, val);
  78 + return this;
  79 + }
  80 +
  81 + @Override
  82 + public QueryWrapperX<T> orderByDesc(String column) {
  83 + super.orderByDesc(true, column);
  84 + return this;
  85 + }
  86 +
  87 + @Override
  88 + public QueryWrapperX<T> last(String lastSql) {
  89 + super.last(lastSql);
  90 + return this;
  91 + }
  92 +
  93 +}
... ...
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 +import cn.iocoder.dashboard.common.enums.CommonStatusEnum;
3 4 import cn.iocoder.dashboard.common.pojo.CommonResult;
4 5 import cn.iocoder.dashboard.modules.system.controller.auth.vo.SysAuthMenuRespVO;
5 6 import cn.iocoder.dashboard.modules.system.controller.auth.vo.SysAuthPermissionInfoRespVO;
6 7 import cn.iocoder.dashboard.modules.system.controller.auth.vo.SysAuthLoginReqVO;
7 8 import cn.iocoder.dashboard.modules.system.controller.auth.vo.SysAuthLoginRespVO;
  9 +import cn.iocoder.dashboard.modules.system.convert.auth.SysAuthConvert;
  10 +import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.permission.SysMenuDO;
  11 +import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.permission.SysRoleDO;
  12 +import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.user.SysUserDO;
  13 +import cn.iocoder.dashboard.modules.system.enums.permission.MenuTypeEnum;
8 14 import cn.iocoder.dashboard.modules.system.service.auth.SysAuthService;
  15 +import cn.iocoder.dashboard.modules.system.service.permission.SysPermissionService;
  16 +import cn.iocoder.dashboard.modules.system.service.permission.SysRoleService;
  17 +import cn.iocoder.dashboard.modules.system.service.user.SysUserService;
  18 +import cn.iocoder.dashboard.util.collection.SetUtils;
9 19 import io.swagger.annotations.Api;
10 20 import io.swagger.annotations.ApiOperation;
11 21 import org.springframework.web.bind.annotation.*;
... ... @@ -26,6 +36,12 @@ public class SysAuthController {
26 36  
27 37 @Resource
28 38 private SysAuthService authService;
  39 + @Resource
  40 + private SysUserService userService;
  41 + @Resource
  42 + private SysRoleService roleService;
  43 + @Resource
  44 + private SysPermissionService permissionService;
29 45  
30 46 @ApiOperation("使用账号密码登录")
31 47 @PostMapping("/login")
... ... @@ -38,15 +54,30 @@ public class SysAuthController {
38 54 @ApiOperation("获取登陆用户的权限信息")
39 55 @GetMapping("/get-permission-info")
40 56 public CommonResult<SysAuthPermissionInfoRespVO> getPermissionInfo() {
41   - SysAuthPermissionInfoRespVO respVO = authService.getPermissionInfo(getLoginUserId(), getLoginUserRoleIds());
42   - return success(respVO);
  57 + // 获得用户信息
  58 + SysUserDO user = userService.getUser(getLoginUserId());
  59 + if (user == null) {
  60 + return null;
  61 + }
  62 + // 获得角色列表
  63 + List<SysRoleDO> roleList = roleService.listRolesFromCache(getLoginUserRoleIds());
  64 + // 获得菜单列表
  65 + List<SysMenuDO> menuList = permissionService.listRoleMenusFromCache(getLoginUserRoleIds(),
  66 + SetUtils.asSet(MenuTypeEnum.DIR.getType(), MenuTypeEnum.MENU.getType(), MenuTypeEnum.BUTTON.getType()),
  67 + SetUtils.asSet(CommonStatusEnum.ENABLE.getStatus()));
  68 + // 拼接结果返回
  69 + return success(SysAuthConvert.INSTANCE.convert(user, roleList, menuList));
43 70 }
44 71  
45 72 @ApiOperation("获得登陆用户的菜单列表")
46 73 @GetMapping("list-menus")
47 74 public CommonResult<List<SysAuthMenuRespVO>> listMenus() {
48   - List<SysAuthMenuRespVO> respVOList = authService.listMenus(getLoginUserId(), getLoginUserRoleIds());
49   - return success(respVOList);
  75 + // 获得用户拥有的菜单列表
  76 + List<SysMenuDO> menuList = permissionService.listRoleMenusFromCache(getLoginUserRoleIds(),
  77 + SetUtils.asSet(MenuTypeEnum.DIR.getType(), MenuTypeEnum.MENU.getType()), // 只要目录和菜单类型
  78 + SetUtils.asSet(CommonStatusEnum.ENABLE.getStatus())); // 只要开启的
  79 + // 转换成 Tree 结构返回
  80 + return success(SysAuthConvert.INSTANCE.buildMenuTree(menuList));
50 81 }
51 82  
52 83 }
... ...
src/main/java/cn/iocoder/dashboard/modules/system/controller/permission/SysMenuController.java
... ... @@ -84,8 +84,8 @@ public class SysMenuController {
84 84 }
85 85  
86 86 @ApiOperation("删除菜单")
  87 + @PostMapping("/delete")
87 88 // @Log(title = "菜单管理", businessType = BusinessType.DELETE)
88   -// @DeleteMapping("/{menuId}")
89 89 public CommonResult<Boolean> deleteMenu(@RequestParam("id") Long id) {
90 90 menuService.deleteMenu(id);
91 91 return success(true);
... ...
src/main/java/cn/iocoder/dashboard/modules/system/controller/permission/vo/SysMenuBaseVO.java
... ... @@ -24,7 +24,7 @@ public class SysMenuBaseVO {
24 24 private String permission;
25 25  
26 26 @ApiModelProperty(value = "类型", required = true, example = "1", notes = "参见 SysMenuTypeEnum 枚举类")
27   - @NotBlank(message = "菜单类型不能为空")
  27 + @NotNull(message = "菜单类型不能为空")
28 28 private Integer type;
29 29  
30 30 @ApiModelProperty(value = "显示顺序不能为空", required = true, example = "1024")
... ...
src/main/java/cn/iocoder/dashboard/modules/system/controller/permission/vo/SysMenuListReqVO.java
... ... @@ -2,17 +2,14 @@ package cn.iocoder.dashboard.modules.system.controller.permission.vo;
2 2  
3 3 import io.swagger.annotations.ApiModel;
4 4 import io.swagger.annotations.ApiModelProperty;
5   -import lombok.AllArgsConstructor;
6   -import lombok.Builder;
7 5 import lombok.Data;
8   -import lombok.NoArgsConstructor;
9 6  
10 7 @ApiModel("菜单列表 Request VO")
11 8 @Data
12 9 public class SysMenuListReqVO {
13 10  
14 11 @ApiModelProperty(value = "菜单名称", example = "芋道", notes = "模糊匹配")
15   - private String menuName;
  12 + private String name;
16 13  
17 14 @ApiModelProperty(value = "展示状态", example = "1", notes = "参见 SysCommonStatusEnum 枚举类")
18 15 private Integer status;
... ...
src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dao/permission/SysMenuMapper.java
1 1 package cn.iocoder.dashboard.modules.system.dal.mysql.dao.permission;
2 2  
  3 +import cn.iocoder.dashboard.framework.mybatis.core.query.QueryWrapperX;
  4 +import cn.iocoder.dashboard.modules.system.controller.permission.vo.SysMenuListReqVO;
3 5 import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.permission.SysMenuDO;
4 6 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
5 7 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
6 8 import org.apache.ibatis.annotations.Mapper;
7 9  
  10 +import java.util.List;
  11 +
8 12 @Mapper
9 13 public interface SysMenuMapper extends BaseMapper<SysMenuDO> {
10 14  
... ... @@ -17,4 +21,13 @@ public interface SysMenuMapper extends BaseMapper&lt;SysMenuDO&gt; {
17 21 return selectCount(new QueryWrapper<SysMenuDO>().eq("parent_id", parentId));
18 22 }
19 23  
  24 + default List<SysMenuDO> selectList(SysMenuListReqVO reqVO) {
  25 + return selectList(new QueryWrapperX<SysMenuDO>().likeIfPresent("name", reqVO.getName())
  26 + .eqIfPresent("status", reqVO.getStatus()));
  27 + }
  28 +
  29 + default List<SysMenuDO> selectList() {
  30 + return selectList(new QueryWrapper<>());
  31 + }
  32 +
20 33 }
... ...
src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dataobject/dept/SysDept.java
1 1 package cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.dept;
2 2  
3   -import cn.iocoder.dashboard.framework.mybatis.core.BaseDO;
  3 +import cn.iocoder.dashboard.framework.mybatis.core.dataobject.BaseDO;
4 4  
5 5 import javax.validation.constraints.Email;
6 6 import javax.validation.constraints.NotBlank;
... ...
src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dataobject/dict/SysDictDataDO.java
... ... @@ -2,7 +2,7 @@ package cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.dict;
2 2  
3 3 import cn.iocoder.dashboard.common.enums.CommonStatusEnum;
4 4 import cn.iocoder.dashboard.framework.excel.Excel;
5   -import cn.iocoder.dashboard.framework.mybatis.core.BaseDO;
  5 +import cn.iocoder.dashboard.framework.mybatis.core.dataobject.BaseDO;
6 6 import com.baomidou.mybatisplus.annotation.TableId;
7 7 import com.baomidou.mybatisplus.annotation.TableName;
8 8 import lombok.Data;
... ...
src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dataobject/dict/SysDictTypeDO.java
... ... @@ -2,7 +2,7 @@ package cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.dict;
2 2  
3 3 import cn.iocoder.dashboard.common.enums.CommonStatusEnum;
4 4 import cn.iocoder.dashboard.framework.excel.Excel;
5   -import cn.iocoder.dashboard.framework.mybatis.core.BaseDO;
  5 +import cn.iocoder.dashboard.framework.mybatis.core.dataobject.BaseDO;
6 6 import com.baomidou.mybatisplus.annotation.TableField;
7 7 import com.baomidou.mybatisplus.annotation.TableId;
8 8 import com.baomidou.mybatisplus.annotation.TableName;
... ...
src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dataobject/permission/SysMenuDO.java
1 1 package cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.permission;
2 2  
3 3 import cn.iocoder.dashboard.common.enums.CommonStatusEnum;
4   -import cn.iocoder.dashboard.framework.mybatis.core.BaseDO;
  4 +import cn.iocoder.dashboard.framework.mybatis.core.dataobject.BaseDO;
5 5 import cn.iocoder.dashboard.modules.system.enums.permission.MenuTypeEnum;
6 6 import com.baomidou.mybatisplus.annotation.TableField;
7 7 import com.baomidou.mybatisplus.annotation.TableId;
... ...
src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dataobject/permission/SysRoleDO.java
1 1 package cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.permission;
2 2  
3 3 import cn.iocoder.dashboard.framework.excel.Excel;
4   -import cn.iocoder.dashboard.framework.mybatis.core.BaseDO;
  4 +import cn.iocoder.dashboard.framework.mybatis.core.dataobject.BaseDO;
5 5 import com.baomidou.mybatisplus.annotation.TableField;
6 6 import com.baomidou.mybatisplus.annotation.TableId;
7 7 import com.baomidou.mybatisplus.annotation.TableName;
... ...
src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dataobject/permission/SysRoleDeptDO.java
1 1 package cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.permission;
2 2  
3   -import cn.iocoder.dashboard.framework.mybatis.core.BaseDO;
  3 +import cn.iocoder.dashboard.framework.mybatis.core.dataobject.BaseDO;
4 4 import com.baomidou.mybatisplus.annotation.TableId;
5 5 import com.baomidou.mybatisplus.annotation.TableName;
6 6 import lombok.Data;
... ...
src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dataobject/permission/SysRoleMenuDO.java
1 1 package cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.permission;
2 2  
3   -import cn.iocoder.dashboard.framework.mybatis.core.BaseDO;
  3 +import cn.iocoder.dashboard.framework.mybatis.core.dataobject.BaseDO;
4 4 import com.baomidou.mybatisplus.annotation.TableId;
5 5 import com.baomidou.mybatisplus.annotation.TableName;
6 6 import lombok.Data;
... ...
src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dataobject/permission/SysUserRoleDO.java
1 1 package cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.permission;
2 2  
3   -import cn.iocoder.dashboard.framework.mybatis.core.BaseDO;
  3 +import cn.iocoder.dashboard.framework.mybatis.core.dataobject.BaseDO;
4 4 import com.baomidou.mybatisplus.annotation.TableId;
5 5 import com.baomidou.mybatisplus.annotation.TableName;
6 6 import lombok.Data;
... ...
src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dataobject/user/SysUserDO.java
... ... @@ -2,7 +2,7 @@ package cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.user;
2 2  
3 3 import cn.iocoder.dashboard.framework.excel.Excel;
4 4 import cn.iocoder.dashboard.framework.excel.Excels;
5   -import cn.iocoder.dashboard.framework.mybatis.core.BaseDO;
  5 +import cn.iocoder.dashboard.framework.mybatis.core.dataobject.BaseDO;
6 6 import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.dept.SysDept;
7 7 import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.permission.SysRoleDO;
8 8 import com.baomidou.mybatisplus.annotation.TableField;
... ...
src/main/java/cn/iocoder/dashboard/modules/system/enums/SysErrorCodeConstants.java
... ... @@ -24,6 +24,6 @@ public interface SysErrorCodeConstants {
24 24 ErrorCode MENU_PARENT_ERROR = new ErrorCode(1002002002, "不能设置自己为父菜单");
25 25 ErrorCode MENU_NOT_EXISTS = new ErrorCode(1002002003, "菜单不存在");
26 26 ErrorCode MENU_EXISTS_CHILDREN = new ErrorCode(1002002004, "存在子菜单,无法删除");
27   - ErrorCode MENU_PARENT_NOT_MENU = new ErrorCode(1002002005, "父菜单的类型必须是菜单");
  27 + ErrorCode MENU_PARENT_NOT_DIR_OR_MENU = new ErrorCode(1002002005, "父菜单的类型必须是目录或者菜单");
28 28  
29 29 }
... ...
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.SysAuthPermissionInfoRespVO;
5   -import cn.iocoder.dashboard.modules.system.controller.auth.vo.SysAuthMenuRespVO;
6   -
7   -import java.util.List;
8   -import java.util.Set;
9 4  
10 5 /**
11 6 * 认证 Service 接口
... ... @@ -18,28 +13,4 @@ public interface SysAuthService extends SecurityFrameworkService {
18 13  
19 14 String login(String username, String password, String captchaUUID, String captchaCode);
20 15  
21   - /**
22   - * 获得用户的基本信息
23   - *
24   - * 这里传输 roleIds 参数的原因,是该参数是从 LoginUser 缓存中获取到的,而我们校验权限时也是从 LoginUser 缓存中获取 roleIds
25   - * 通过这样的方式,保持一致
26   - *
27   - * @param userId 用户编号
28   - * @param roleIds 用户拥有的角色编号数组
29   - * @return 用户的信息,包括角色权限和菜单权限
30   - */
31   - SysAuthPermissionInfoRespVO getPermissionInfo(Long userId, Set<Long> roleIds);
32   -
33   - /**
34   - * 获得用户的菜单 Vue 路由
35   - *
36   - * 这里传输 roleIds 参数的原因,是该参数是从 LoginUser 缓存中获取到的,而我们校验权限时也是从 LoginUser 缓存中获取 roleIds
37   - * 通过这样的方式,保持一致
38   - *
39   - * @param userId 用户编号
40   - * @param roleIds 用户拥有的角色编号数组
41   - * @return 菜单 Vue 路由
42   - */
43   - List<SysAuthMenuRespVO> listMenus(Long userId, Set<Long> roleIds);
44   -
45 16 }
... ...
src/main/java/cn/iocoder/dashboard/modules/system/service/auth/impl/SysAuthServiceImpl.java
... ... @@ -226,31 +226,4 @@ public class SysAuthServiceImpl implements SysAuthService {
226 226 loginUserRedisDAO.set(sessionId, loginUser);
227 227 }
228 228  
229   - @Override
230   - public SysAuthPermissionInfoRespVO getPermissionInfo(Long userId, Set<Long> roleIds) {
231   - // 获得用户信息
232   - SysUserDO user = userService.getUser(userId);
233   - if (user == null) {
234   - return null;
235   - }
236   - // 获得角色列表
237   - List<SysRoleDO> roleList = roleService.listRolesFromCache(roleIds);
238   - // 获得菜单列表
239   - List<SysMenuDO> menuList = permissionService.listRoleMenusFromCache(roleIds,
240   - SetUtils.asSet(MenuTypeEnum.DIR.getType(), MenuTypeEnum.MENU.getType(), MenuTypeEnum.BUTTON.getType()),
241   - SetUtils.asSet(CommonStatusEnum.ENABLE.getStatus()));
242   - // 拼接结果返回
243   - return SysAuthConvert.INSTANCE.convert(user, roleList, menuList);
244   - }
245   -
246   - @Override
247   - public List<SysAuthMenuRespVO> listMenus(Long userId, Set<Long> roleIds) {
248   - // 获得用户拥有的菜单列表
249   - List<SysMenuDO> menuList = permissionService.listRoleMenusFromCache(roleIds,
250   - SetUtils.asSet(MenuTypeEnum.DIR.getType(), MenuTypeEnum.MENU.getType()), // 只要目录和菜单类型
251   - SetUtils.asSet(CommonStatusEnum.ENABLE.getStatus())); // 只要开启的
252   - // 转换成 Tree 结构返回
253   - return SysAuthConvert.INSTANCE.buildMenuTree(menuList);
254   - }
255   -
256 229 }
... ...
src/main/java/cn/iocoder/dashboard/modules/system/service/permission/impl/SysMenuServiceImpl.java
... ... @@ -65,7 +65,7 @@ public class SysMenuServiceImpl implements SysMenuService {
65 65 @Override
66 66 @PostConstruct
67 67 public void init() {
68   - List<SysMenuDO> menuList = menuMapper.selectList(null);
  68 + List<SysMenuDO> menuList = menuMapper.selectList();
69 69 ImmutableMap.Builder<Long, SysMenuDO> menuCacheBuilder = ImmutableMap.builder();
70 70 ImmutableMultimap.Builder<String, SysMenuDO> permMenuCacheBuilder = ImmutableMultimap.builder();
71 71 menuList.forEach(menuDO -> {
... ... @@ -79,7 +79,7 @@ public class SysMenuServiceImpl implements SysMenuService {
79 79  
80 80 @Override
81 81 public List<SysMenuRespVO> listMenus(SysMenuListReqVO reqVO) {
82   - List<SysMenuDO> list = menuMapper.selectList(null);
  82 + List<SysMenuDO> list = menuMapper.selectList(reqVO);
83 83 // TODO 排序
84 84 return SysMenuConvert.INSTANCE.convertList(list);
85 85 }
... ... @@ -240,9 +240,10 @@ public class SysMenuServiceImpl implements SysMenuService {
240 240 if (menu == null) {
241 241 throw ServiceExceptionUtil.exception(MENU_PARENT_NOT_EXISTS);
242 242 }
243   - // 父菜单必须是目录类型
244   - if (!MenuTypeEnum.DIR.getType().equals(menu.getType())) {
245   - throw ServiceExceptionUtil.exception(MENU_PARENT_NOT_MENU);
  243 + // 父菜单必须是目录或者菜单类型
  244 + if (!MenuTypeEnum.DIR.getType().equals(menu.getType())
  245 + && !MenuTypeEnum.MENU.getType().equals(menu.getType())) {
  246 + throw ServiceExceptionUtil.exception(MENU_PARENT_NOT_DIR_OR_MENU);
246 247 }
247 248 }
248 249  
... ...
src/main/resources/application.yaml
... ... @@ -38,3 +38,15 @@ yudao:
38 38 timeout: 5m
39 39 width: 160
40 40 height: 60
  41 +
  42 +# MyBatis Plus 的配置项
  43 +mybatis-plus:
  44 + configuration:
  45 + map-underscore-to-camel-case: true # 虽然默认为 true ,但是还是显示去指定下。
  46 + global-config:
  47 + db-config:
  48 + id-type: auto # 自增 ID
  49 + logic-delete-value: 1 # 逻辑已删除值(默认为 1)
  50 + logic-not-delete-value: 0 # 逻辑未删除值(默认为 0)
  51 + mapper-locations: classpath*:mapper/*.xml
  52 + type-aliases-package: cn.iocoder.dashboard.modules.*.dal.mysql.dataobject
... ...