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 +59,11 @@ public interface SysMenuMapper
59 59
60 /** 60 /**
61 * 根据角色ID查询菜单树信息 61 * 根据角色ID查询菜单树信息
62 - * 62 + *
63 * @param roleId 角色ID 63 * @param roleId 角色ID
64 * @param menuCheckStrictly 菜单树选择项是否关联显示 64 * @param menuCheckStrictly 菜单树选择项是否关联显示
65 * @return 选中菜单列表 65 * @return 选中菜单列表
66 */ 66 */
67 public List<Integer> selectMenuListByRoleId(@Param("roleId") Long roleId, @Param("menuCheckStrictly") boolean menuCheckStrictly); 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,6 +8,7 @@ import java.util.LinkedList;
8 import java.util.List; 8 import java.util.List;
9 import java.util.Set; 9 import java.util.Set;
10 import java.util.stream.Collectors; 10 import java.util.stream.Collectors;
  11 +
11 import org.springframework.beans.factory.annotation.Autowired; 12 import org.springframework.beans.factory.annotation.Autowired;
12 import org.springframework.stereotype.Service; 13 import org.springframework.stereotype.Service;
13 import com.ruoyi.common.constant.UserConstants; 14 import com.ruoyi.common.constant.UserConstants;
@@ -30,19 +31,9 @@ import com.ruoyi.system.service.ISysMenuService; @@ -30,19 +31,9 @@ import com.ruoyi.system.service.ISysMenuService;
30 * @author ruoyi 31 * @author ruoyi
31 */ 32 */
32 @Service 33 @Service
33 -public class SysMenuServiceImpl implements ISysMenuService  
34 -{ 34 +public class SysMenuServiceImpl implements ISysMenuService {
35 public static final String PREMISSION_STRING = "perms[\"{0}\"]"; 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,8 +41,7 @@ public class SysMenuServiceImpl implements ISysMenuService
50 * @return 菜单列表 41 * @return 菜单列表
51 */ 42 */
52 @Override 43 @Override
53 - public List<SysMenu> selectMenuList(Long userId)  
54 - { 44 + public List<SysMenu> selectMenuList(Long userId) {
55 return selectMenuList(new SysMenu(), userId); 45 return selectMenuList(new SysMenu(), userId);
56 } 46 }
57 47
@@ -62,16 +52,12 @@ public class SysMenuServiceImpl implements ISysMenuService @@ -62,16 +52,12 @@ public class SysMenuServiceImpl implements ISysMenuService
62 * @return 菜单列表 52 * @return 菜单列表
63 */ 53 */
64 @Override 54 @Override
65 - public List<SysMenu> selectMenuList(SysMenu menu, Long userId)  
66 - { 55 + public List<SysMenu> selectMenuList(SysMenu menu, Long userId) {
67 List<SysMenu> menuList = null; 56 List<SysMenu> menuList = null;
68 // 管理员显示所有菜单信息 57 // 管理员显示所有菜单信息
69 - if (SysUser.isAdmin(userId))  
70 - { 58 + if (SysUser.isAdmin(userId)) {
71 menuList = menuMapper.selectMenuList(menu); 59 menuList = menuMapper.selectMenuList(menu);
72 - }  
73 - else  
74 - { 60 + } else {
75 menu.getParams().put("userId", userId); 61 menu.getParams().put("userId", userId);
76 menuList = menuMapper.selectMenuListByUserId(menu); 62 menuList = menuMapper.selectMenuListByUserId(menu);
77 } 63 }
@@ -85,14 +71,11 @@ public class SysMenuServiceImpl implements ISysMenuService @@ -85,14 +71,11 @@ public class SysMenuServiceImpl implements ISysMenuService
85 * @return 权限列表 71 * @return 权限列表
86 */ 72 */
87 @Override 73 @Override
88 - public Set<String> selectMenuPermsByUserId(Long userId)  
89 - { 74 + public Set<String> selectMenuPermsByUserId(Long userId) {
90 List<String> perms = menuMapper.selectMenuPermsByUserId(userId); 75 List<String> perms = menuMapper.selectMenuPermsByUserId(userId);
91 Set<String> permsSet = new HashSet<>(); 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 permsSet.addAll(Arrays.asList(perm.trim().split(","))); 79 permsSet.addAll(Arrays.asList(perm.trim().split(",")));
97 } 80 }
98 } 81 }
@@ -106,15 +89,11 @@ public class SysMenuServiceImpl implements ISysMenuService @@ -106,15 +89,11 @@ public class SysMenuServiceImpl implements ISysMenuService
106 * @return 菜单列表 89 * @return 菜单列表
107 */ 90 */
108 @Override 91 @Override
109 - public List<SysMenu> selectMenuTreeByUserId(Long userId)  
110 - { 92 + public List<SysMenu> selectMenuTreeByUserId(Long userId) {
111 List<SysMenu> menus = null; 93 List<SysMenu> menus = null;
112 - if (SecurityUtils.isAdmin(userId))  
113 - { 94 + if (SecurityUtils.isAdmin(userId)) {
114 menus = menuMapper.selectMenuTreeAll(); 95 menus = menuMapper.selectMenuTreeAll();
115 - }  
116 - else  
117 - { 96 + } else {
118 menus = menuMapper.selectMenuTreeByUserId(userId); 97 menus = menuMapper.selectMenuTreeByUserId(userId);
119 } 98 }
120 return getChildPerms(menus, 0); 99 return getChildPerms(menus, 0);
@@ -127,8 +106,7 @@ public class SysMenuServiceImpl implements ISysMenuService @@ -127,8 +106,7 @@ public class SysMenuServiceImpl implements ISysMenuService
127 * @return 选中菜单列表 106 * @return 选中菜单列表
128 */ 107 */
129 @Override 108 @Override
130 - public List<Integer> selectMenuListByRoleId(Long roleId)  
131 - { 109 + public List<Integer> selectMenuListByRoleId(Long roleId) {
132 SysRole role = roleMapper.selectRoleById(roleId); 110 SysRole role = roleMapper.selectRoleById(roleId);
133 return menuMapper.selectMenuListByRoleId(roleId, role.isMenuCheckStrictly()); 111 return menuMapper.selectMenuListByRoleId(roleId, role.isMenuCheckStrictly());
134 } 112 }
@@ -140,102 +118,22 @@ public class SysMenuServiceImpl implements ISysMenuService @@ -140,102 +118,22 @@ public class SysMenuServiceImpl implements ISysMenuService
140 * @return 下拉树结构列表 118 * @return 下拉树结构列表
141 */ 119 */
142 @Override 120 @Override
143 - public List<TreeSelect> buildMenuTreeSelect(List<SysMenu> menus)  
144 - { 121 + public List<TreeSelect> buildMenuTreeSelect(List<SysMenu> menus) {
145 List<SysMenu> menuTrees = buildMenuTree(menus); 122 List<SysMenu> menuTrees = buildMenuTree(menus);
146 return menuTrees.stream().map(TreeSelect::new).collect(Collectors.toList()); 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 * @param menuId 菜单ID 129 * @param menuId 菜单ID
178 * @return 结果 130 * @return 结果
179 */ 131 */
180 @Override 132 @Override
181 - public boolean checkMenuExistRole(Long menuId)  
182 - { 133 + public boolean checkMenuExistRole(Long menuId) {
183 int result = roleMenuMapper.checkMenuExistRole(menuId); 134 int result = roleMenuMapper.checkMenuExistRole(menuId);
184 return result > 0 ? true : false; 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 +7,7 @@ import store from &#39;@/store&#39;
7 7
8 export const DICT_TYPE = { 8 export const DICT_TYPE = {
9 SYS_COMMON_STATUS: 'sys_common_status', 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,10 +13,10 @@
13 <el-form-item label="状态" prop="status"> 13 <el-form-item label="状态" prop="status">
14 <el-select v-model="queryParams.status" placeholder="菜单状态" clearable size="small"> 14 <el-select v-model="queryParams.status" placeholder="菜单状态" clearable size="small">
15 <el-option 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 </el-select> 21 </el-select>
22 </el-form-item> 22 </el-form-item>
@@ -106,8 +106,8 @@ @@ -106,8 +106,8 @@
106 <el-radio-group v-model="form.type"> 106 <el-radio-group v-model="form.type">
107 <el-radio 107 <el-radio
108 v-for="dict in menuTypeDictDatas" 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 >{{dict.label}}</el-radio> 111 >{{dict.label}}</el-radio>
112 </el-radio-group> 112 </el-radio-group>
113 </el-form-item> 113 </el-form-item>
@@ -165,7 +165,7 @@ @@ -165,7 +165,7 @@
165 <el-radio 165 <el-radio
166 v-for="dict in statusDictDatas" 166 v-for="dict in statusDictDatas"
167 :key="dict.value" 167 :key="dict.value"
168 - :label="dict.value" 168 + :label="parseInt(dict.value)"
169 >{{dict.label}}</el-radio> 169 >{{dict.label}}</el-radio>
170 </el-radio-group> 170 </el-radio-group>
171 </el-form-item> 171 </el-form-item>
@@ -206,8 +206,6 @@ export default { @@ -206,8 +206,6 @@ export default {
206 title: "", 206 title: "",
207 // 是否显示弹出层 207 // 是否显示弹出层
208 open: false, 208 open: false,
209 - // 菜单状态数据字典  
210 - statusOptions: [],  
211 // 查询参数 209 // 查询参数
212 queryParams: { 210 queryParams: {
213 name: undefined, 211 name: undefined,
@@ -288,9 +286,9 @@ export default { @@ -288,9 +286,9 @@ export default {
288 parentId: 0, 286 parentId: 0,
289 name: undefined, 287 name: undefined,
290 icon: undefined, 288 icon: undefined,
291 - type: "1", 289 + type: SysMenuTypeEnum.DIR,
292 sort: undefined, 290 sort: undefined,
293 - status: "0" 291 + status: SysCommonStatusEnum.ENABLE
294 }; 292 };
295 this.resetForm("form"); 293 this.resetForm("form");
296 }, 294 },
@@ -329,17 +327,18 @@ export default { @@ -329,17 +327,18 @@ export default {
329 submitForm: function() { 327 submitForm: function() {
330 this.$refs["form"].validate(valid => { 328 this.$refs["form"].validate(valid => {
331 if (valid) { 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 return 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 return 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 import com.baomidou.mybatisplus.annotation.TableLogic; 3 import com.baomidou.mybatisplus.annotation.TableLogic;
4 import lombok.Data; 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 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.enums.CommonStatusEnum;
3 import cn.iocoder.dashboard.common.pojo.CommonResult; 4 import cn.iocoder.dashboard.common.pojo.CommonResult;
4 import cn.iocoder.dashboard.modules.system.controller.auth.vo.SysAuthMenuRespVO; 5 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.SysAuthPermissionInfoRespVO;
6 import cn.iocoder.dashboard.modules.system.controller.auth.vo.SysAuthLoginReqVO; 7 import cn.iocoder.dashboard.modules.system.controller.auth.vo.SysAuthLoginReqVO;
7 import cn.iocoder.dashboard.modules.system.controller.auth.vo.SysAuthLoginRespVO; 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 import cn.iocoder.dashboard.modules.system.service.auth.SysAuthService; 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 import io.swagger.annotations.Api; 19 import io.swagger.annotations.Api;
10 import io.swagger.annotations.ApiOperation; 20 import io.swagger.annotations.ApiOperation;
11 import org.springframework.web.bind.annotation.*; 21 import org.springframework.web.bind.annotation.*;
@@ -26,6 +36,12 @@ public class SysAuthController { @@ -26,6 +36,12 @@ public class SysAuthController {
26 36
27 @Resource 37 @Resource
28 private SysAuthService authService; 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 @ApiOperation("使用账号密码登录") 46 @ApiOperation("使用账号密码登录")
31 @PostMapping("/login") 47 @PostMapping("/login")
@@ -38,15 +54,30 @@ public class SysAuthController { @@ -38,15 +54,30 @@ public class SysAuthController {
38 @ApiOperation("获取登陆用户的权限信息") 54 @ApiOperation("获取登陆用户的权限信息")
39 @GetMapping("/get-permission-info") 55 @GetMapping("/get-permission-info")
40 public CommonResult<SysAuthPermissionInfoRespVO> getPermissionInfo() { 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 @ApiOperation("获得登陆用户的菜单列表") 72 @ApiOperation("获得登陆用户的菜单列表")
46 @GetMapping("list-menus") 73 @GetMapping("list-menus")
47 public CommonResult<List<SysAuthMenuRespVO>> listMenus() { 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,8 +84,8 @@ public class SysMenuController {
84 } 84 }
85 85
86 @ApiOperation("删除菜单") 86 @ApiOperation("删除菜单")
  87 + @PostMapping("/delete")
87 // @Log(title = "菜单管理", businessType = BusinessType.DELETE) 88 // @Log(title = "菜单管理", businessType = BusinessType.DELETE)
88 -// @DeleteMapping("/{menuId}")  
89 public CommonResult<Boolean> deleteMenu(@RequestParam("id") Long id) { 89 public CommonResult<Boolean> deleteMenu(@RequestParam("id") Long id) {
90 menuService.deleteMenu(id); 90 menuService.deleteMenu(id);
91 return success(true); 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,7 +24,7 @@ public class SysMenuBaseVO {
24 private String permission; 24 private String permission;
25 25
26 @ApiModelProperty(value = "类型", required = true, example = "1", notes = "参见 SysMenuTypeEnum 枚举类") 26 @ApiModelProperty(value = "类型", required = true, example = "1", notes = "参见 SysMenuTypeEnum 枚举类")
27 - @NotBlank(message = "菜单类型不能为空") 27 + @NotNull(message = "菜单类型不能为空")
28 private Integer type; 28 private Integer type;
29 29
30 @ApiModelProperty(value = "显示顺序不能为空", required = true, example = "1024") 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,17 +2,14 @@ package cn.iocoder.dashboard.modules.system.controller.permission.vo;
2 2
3 import io.swagger.annotations.ApiModel; 3 import io.swagger.annotations.ApiModel;
4 import io.swagger.annotations.ApiModelProperty; 4 import io.swagger.annotations.ApiModelProperty;
5 -import lombok.AllArgsConstructor;  
6 -import lombok.Builder;  
7 import lombok.Data; 5 import lombok.Data;
8 -import lombok.NoArgsConstructor;  
9 6
10 @ApiModel("菜单列表 Request VO") 7 @ApiModel("菜单列表 Request VO")
11 @Data 8 @Data
12 public class SysMenuListReqVO { 9 public class SysMenuListReqVO {
13 10
14 @ApiModelProperty(value = "菜单名称", example = "芋道", notes = "模糊匹配") 11 @ApiModelProperty(value = "菜单名称", example = "芋道", notes = "模糊匹配")
15 - private String menuName; 12 + private String name;
16 13
17 @ApiModelProperty(value = "展示状态", example = "1", notes = "参见 SysCommonStatusEnum 枚举类") 14 @ApiModelProperty(value = "展示状态", example = "1", notes = "参见 SysCommonStatusEnum 枚举类")
18 private Integer status; 15 private Integer status;
src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dao/permission/SysMenuMapper.java
1 package cn.iocoder.dashboard.modules.system.dal.mysql.dao.permission; 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 import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.permission.SysMenuDO; 5 import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.permission.SysMenuDO;
4 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; 6 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
5 import com.baomidou.mybatisplus.core.mapper.BaseMapper; 7 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
6 import org.apache.ibatis.annotations.Mapper; 8 import org.apache.ibatis.annotations.Mapper;
7 9
  10 +import java.util.List;
  11 +
8 @Mapper 12 @Mapper
9 public interface SysMenuMapper extends BaseMapper<SysMenuDO> { 13 public interface SysMenuMapper extends BaseMapper<SysMenuDO> {
10 14
@@ -17,4 +21,13 @@ public interface SysMenuMapper extends BaseMapper&lt;SysMenuDO&gt; { @@ -17,4 +21,13 @@ public interface SysMenuMapper extends BaseMapper&lt;SysMenuDO&gt; {
17 return selectCount(new QueryWrapper<SysMenuDO>().eq("parent_id", parentId)); 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 package cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.dept; 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 import javax.validation.constraints.Email; 5 import javax.validation.constraints.Email;
6 import javax.validation.constraints.NotBlank; 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,7 +2,7 @@ package cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.dict;
2 2
3 import cn.iocoder.dashboard.common.enums.CommonStatusEnum; 3 import cn.iocoder.dashboard.common.enums.CommonStatusEnum;
4 import cn.iocoder.dashboard.framework.excel.Excel; 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 import com.baomidou.mybatisplus.annotation.TableId; 6 import com.baomidou.mybatisplus.annotation.TableId;
7 import com.baomidou.mybatisplus.annotation.TableName; 7 import com.baomidou.mybatisplus.annotation.TableName;
8 import lombok.Data; 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,7 +2,7 @@ package cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.dict;
2 2
3 import cn.iocoder.dashboard.common.enums.CommonStatusEnum; 3 import cn.iocoder.dashboard.common.enums.CommonStatusEnum;
4 import cn.iocoder.dashboard.framework.excel.Excel; 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 import com.baomidou.mybatisplus.annotation.TableField; 6 import com.baomidou.mybatisplus.annotation.TableField;
7 import com.baomidou.mybatisplus.annotation.TableId; 7 import com.baomidou.mybatisplus.annotation.TableId;
8 import com.baomidou.mybatisplus.annotation.TableName; 8 import com.baomidou.mybatisplus.annotation.TableName;
src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dataobject/permission/SysMenuDO.java
1 package cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.permission; 1 package cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.permission;
2 2
3 import cn.iocoder.dashboard.common.enums.CommonStatusEnum; 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 import cn.iocoder.dashboard.modules.system.enums.permission.MenuTypeEnum; 5 import cn.iocoder.dashboard.modules.system.enums.permission.MenuTypeEnum;
6 import com.baomidou.mybatisplus.annotation.TableField; 6 import com.baomidou.mybatisplus.annotation.TableField;
7 import com.baomidou.mybatisplus.annotation.TableId; 7 import com.baomidou.mybatisplus.annotation.TableId;
src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dataobject/permission/SysRoleDO.java
1 package cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.permission; 1 package cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.permission;
2 2
3 import cn.iocoder.dashboard.framework.excel.Excel; 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 import com.baomidou.mybatisplus.annotation.TableField; 5 import com.baomidou.mybatisplus.annotation.TableField;
6 import com.baomidou.mybatisplus.annotation.TableId; 6 import com.baomidou.mybatisplus.annotation.TableId;
7 import com.baomidou.mybatisplus.annotation.TableName; 7 import com.baomidou.mybatisplus.annotation.TableName;
src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dataobject/permission/SysRoleDeptDO.java
1 package cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.permission; 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 import com.baomidou.mybatisplus.annotation.TableId; 4 import com.baomidou.mybatisplus.annotation.TableId;
5 import com.baomidou.mybatisplus.annotation.TableName; 5 import com.baomidou.mybatisplus.annotation.TableName;
6 import lombok.Data; 6 import lombok.Data;
src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dataobject/permission/SysRoleMenuDO.java
1 package cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.permission; 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 import com.baomidou.mybatisplus.annotation.TableId; 4 import com.baomidou.mybatisplus.annotation.TableId;
5 import com.baomidou.mybatisplus.annotation.TableName; 5 import com.baomidou.mybatisplus.annotation.TableName;
6 import lombok.Data; 6 import lombok.Data;
src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dataobject/permission/SysUserRoleDO.java
1 package cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.permission; 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 import com.baomidou.mybatisplus.annotation.TableId; 4 import com.baomidou.mybatisplus.annotation.TableId;
5 import com.baomidou.mybatisplus.annotation.TableName; 5 import com.baomidou.mybatisplus.annotation.TableName;
6 import lombok.Data; 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,7 +2,7 @@ package cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.user;
2 2
3 import cn.iocoder.dashboard.framework.excel.Excel; 3 import cn.iocoder.dashboard.framework.excel.Excel;
4 import cn.iocoder.dashboard.framework.excel.Excels; 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 import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.dept.SysDept; 6 import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.dept.SysDept;
7 import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.permission.SysRoleDO; 7 import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.permission.SysRoleDO;
8 import com.baomidou.mybatisplus.annotation.TableField; 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,6 +24,6 @@ public interface SysErrorCodeConstants {
24 ErrorCode MENU_PARENT_ERROR = new ErrorCode(1002002002, "不能设置自己为父菜单"); 24 ErrorCode MENU_PARENT_ERROR = new ErrorCode(1002002002, "不能设置自己为父菜单");
25 ErrorCode MENU_NOT_EXISTS = new ErrorCode(1002002003, "菜单不存在"); 25 ErrorCode MENU_NOT_EXISTS = new ErrorCode(1002002003, "菜单不存在");
26 ErrorCode MENU_EXISTS_CHILDREN = new ErrorCode(1002002004, "存在子菜单,无法删除"); 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 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.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 * 认证 Service 接口 6 * 认证 Service 接口
@@ -18,28 +13,4 @@ public interface SysAuthService extends SecurityFrameworkService { @@ -18,28 +13,4 @@ public interface SysAuthService extends SecurityFrameworkService {
18 13
19 String login(String username, String password, String captchaUUID, String captchaCode); 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,31 +226,4 @@ public class SysAuthServiceImpl implements SysAuthService {
226 loginUserRedisDAO.set(sessionId, loginUser); 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,7 +65,7 @@ public class SysMenuServiceImpl implements SysMenuService {
65 @Override 65 @Override
66 @PostConstruct 66 @PostConstruct
67 public void init() { 67 public void init() {
68 - List<SysMenuDO> menuList = menuMapper.selectList(null); 68 + List<SysMenuDO> menuList = menuMapper.selectList();
69 ImmutableMap.Builder<Long, SysMenuDO> menuCacheBuilder = ImmutableMap.builder(); 69 ImmutableMap.Builder<Long, SysMenuDO> menuCacheBuilder = ImmutableMap.builder();
70 ImmutableMultimap.Builder<String, SysMenuDO> permMenuCacheBuilder = ImmutableMultimap.builder(); 70 ImmutableMultimap.Builder<String, SysMenuDO> permMenuCacheBuilder = ImmutableMultimap.builder();
71 menuList.forEach(menuDO -> { 71 menuList.forEach(menuDO -> {
@@ -79,7 +79,7 @@ public class SysMenuServiceImpl implements SysMenuService { @@ -79,7 +79,7 @@ public class SysMenuServiceImpl implements SysMenuService {
79 79
80 @Override 80 @Override
81 public List<SysMenuRespVO> listMenus(SysMenuListReqVO reqVO) { 81 public List<SysMenuRespVO> listMenus(SysMenuListReqVO reqVO) {
82 - List<SysMenuDO> list = menuMapper.selectList(null); 82 + List<SysMenuDO> list = menuMapper.selectList(reqVO);
83 // TODO 排序 83 // TODO 排序
84 return SysMenuConvert.INSTANCE.convertList(list); 84 return SysMenuConvert.INSTANCE.convertList(list);
85 } 85 }
@@ -240,9 +240,10 @@ public class SysMenuServiceImpl implements SysMenuService { @@ -240,9 +240,10 @@ public class SysMenuServiceImpl implements SysMenuService {
240 if (menu == null) { 240 if (menu == null) {
241 throw ServiceExceptionUtil.exception(MENU_PARENT_NOT_EXISTS); 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,3 +38,15 @@ yudao:
38 timeout: 5m 38 timeout: 5m
39 width: 160 39 width: 160
40 height: 60 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