Commit 9e59a6c1aec06a6e149ed135cd6a0cf1ebc02b37

Authored by YunaiV
1 parent 4c3e2bd8

1. 迁移 Role 相关的逻辑

Showing 22 changed files with 534 additions and 398 deletions
ruoyi-generator/src/main/java/com/ruoyi/generator/util/VelocityUtils.java
... ... @@ -3,6 +3,7 @@ package com.ruoyi.generator.util;
3 3 import java.util.ArrayList;
4 4 import java.util.HashSet;
5 5 import java.util.List;
  6 +
6 7 import org.apache.velocity.VelocityContext;
7 8 import com.alibaba.fastjson.JSONObject;
8 9 import com.ruoyi.common.constant.GenConstants;
... ... @@ -13,18 +14,23 @@ import com.ruoyi.generator.domain.GenTableColumn;
13 14  
14 15 /**
15 16 * 模板处理工具类
16   - *
  17 + *
17 18 * @author ruoyi
18 19 */
19   -public class VelocityUtils
20   -{
21   - /** 项目空间路径 */
  20 +public class VelocityUtils {
  21 + /**
  22 + * 项目空间路径
  23 + */
22 24 private static final String PROJECT_PATH = "main/java";
23 25  
24   - /** mybatis空间路径 */
  26 + /**
  27 + * mybatis空间路径
  28 + */
25 29 private static final String MYBATIS_PATH = "main/resources/mapper";
26 30  
27   - /** 默认上级菜单,系统工具 */
  31 + /**
  32 + * 默认上级菜单,系统工具
  33 + */
28 34 private static final String DEFAULT_PARENT_MENU_ID = "3";
29 35  
30 36 /**
... ... @@ -32,8 +38,7 @@ public class VelocityUtils
32 38 *
33 39 * @return 模板列表
34 40 */
35   - public static VelocityContext prepareContext(GenTable genTable)
36   - {
  41 + public static VelocityContext prepareContext(GenTable genTable) {
37 42 String moduleName = genTable.getModuleName();
38 43 String businessName = genTable.getBusinessName();
39 44 String packageName = genTable.getPackageName();
... ... @@ -59,23 +64,20 @@ public class VelocityUtils
59 64 velocityContext.put("columns", genTable.getColumns());
60 65 velocityContext.put("table", genTable);
61 66 setMenuVelocityContext(velocityContext, genTable);
62   - if (GenConstants.TPL_TREE.equals(tplCategory))
63   - {
  67 + if (GenConstants.TPL_TREE.equals(tplCategory)) {
64 68 setTreeVelocityContext(velocityContext, genTable);
65 69 }
66 70 return velocityContext;
67 71 }
68 72  
69   - public static void setMenuVelocityContext(VelocityContext context, GenTable genTable)
70   - {
  73 + public static void setMenuVelocityContext(VelocityContext context, GenTable genTable) {
71 74 String options = genTable.getOptions();
72 75 JSONObject paramsObj = JSONObject.parseObject(options);
73 76 String parentMenuId = getParentMenuId(paramsObj);
74 77 context.put("parentMenuId", parentMenuId);
75 78 }
76 79  
77   - public static void setTreeVelocityContext(VelocityContext context, GenTable genTable)
78   - {
  80 + public static void setTreeVelocityContext(VelocityContext context, GenTable genTable) {
79 81 String options = genTable.getOptions();
80 82 JSONObject paramsObj = JSONObject.parseObject(options);
81 83 String treeCode = getTreecode(paramsObj);
... ... @@ -86,12 +88,10 @@ public class VelocityUtils
86 88 context.put("treeParentCode", treeParentCode);
87 89 context.put("treeName", treeName);
88 90 context.put("expandColumn", getExpandColumn(genTable));
89   - if (paramsObj.containsKey(GenConstants.TREE_PARENT_CODE))
90   - {
  91 + if (paramsObj.containsKey(GenConstants.TREE_PARENT_CODE)) {
91 92 context.put("tree_parent_code", paramsObj.getString(GenConstants.TREE_PARENT_CODE));
92 93 }
93   - if (paramsObj.containsKey(GenConstants.TREE_NAME))
94   - {
  94 + if (paramsObj.containsKey(GenConstants.TREE_NAME)) {
95 95 context.put("tree_name", paramsObj.getString(GenConstants.TREE_NAME));
96 96 }
97 97 }
... ... @@ -101,8 +101,7 @@ public class VelocityUtils
101 101 *
102 102 * @return 模板列表
103 103 */
104   - public static List<String> getTemplateList(String tplCategory)
105   - {
  104 + public static List<String> getTemplateList(String tplCategory) {
106 105 List<String> templates = new ArrayList<String>();
107 106 templates.add("vm/java/domain.java.vm");
108 107 templates.add("vm/java/mapper.java.vm");
... ... @@ -112,12 +111,9 @@ public class VelocityUtils
112 111 templates.add("vm/xml/mapper.xml.vm");
113 112 templates.add("vm/sql/sql.vm");
114 113 templates.add("vm/js/api.js.vm");
115   - if (GenConstants.TPL_CRUD.equals(tplCategory))
116   - {
  114 + if (GenConstants.TPL_CRUD.equals(tplCategory)) {
117 115 templates.add("vm/vue/index.vue.vm");
118   - }
119   - else if (GenConstants.TPL_TREE.equals(tplCategory))
120   - {
  116 + } else if (GenConstants.TPL_TREE.equals(tplCategory)) {
121 117 templates.add("vm/vue/index-tree.vue.vm");
122 118 }
123 119 return templates;
... ... @@ -126,8 +122,7 @@ public class VelocityUtils
126 122 /**
127 123 * 获取文件名
128 124 */
129   - public static String getFileName(String template, GenTable genTable)
130   - {
  125 + public static String getFileName(String template, GenTable genTable) {
131 126 // 文件名称
132 127 String fileName = "";
133 128 // 包路径
... ... @@ -143,44 +138,25 @@ public class VelocityUtils
143 138 String mybatisPath = MYBATIS_PATH + "/" + moduleName;
144 139 String vuePath = "vue";
145 140  
146   - if (template.contains("domain.java.vm"))
147   - {
  141 + if (template.contains("domain.java.vm")) {
148 142 fileName = StringUtils.format("{}/domain/{}.java", javaPath, className);
149   - }
150   - else if (template.contains("mapper.java.vm"))
151   - {
  143 + } else if (template.contains("mapper.java.vm")) {
152 144 fileName = StringUtils.format("{}/mapper/{}Mapper.java", javaPath, className);
153   - }
154   - else if (template.contains("service.java.vm"))
155   - {
  145 + } else if (template.contains("service.java.vm")) {
156 146 fileName = StringUtils.format("{}/service/I{}Service.java", javaPath, className);
157   - }
158   - else if (template.contains("serviceImpl.java.vm"))
159   - {
  147 + } else if (template.contains("serviceImpl.java.vm")) {
160 148 fileName = StringUtils.format("{}/service/impl/{}ServiceImpl.java", javaPath, className);
161   - }
162   - else if (template.contains("controller.java.vm"))
163   - {
  149 + } else if (template.contains("controller.java.vm")) {
164 150 fileName = StringUtils.format("{}/controller/{}Controller.java", javaPath, className);
165   - }
166   - else if (template.contains("mapper.xml.vm"))
167   - {
  151 + } else if (template.contains("mapper.xml.vm")) {
168 152 fileName = StringUtils.format("{}/{}Mapper.xml", mybatisPath, className);
169   - }
170   - else if (template.contains("sql.vm"))
171   - {
  153 + } else if (template.contains("sql.vm")) {
172 154 fileName = businessName + "Menu.sql";
173   - }
174   - else if (template.contains("api.js.vm"))
175   - {
  155 + } else if (template.contains("api.js.vm")) {
176 156 fileName = StringUtils.format("{}/api/{}/{}.js", vuePath, moduleName, businessName);
177   - }
178   - else if (template.contains("index.vue.vm"))
179   - {
  157 + } else if (template.contains("index.vue.vm")) {
180 158 fileName = StringUtils.format("{}/views/{}/{}/index.vue", vuePath, moduleName, businessName);
181   - }
182   - else if (template.contains("index-tree.vue.vm"))
183   - {
  159 + } else if (template.contains("index-tree.vue.vm")) {
184 160 fileName = StringUtils.format("{}/views/{}/{}/index.vue", vuePath, moduleName, businessName);
185 161 }
186 162 return fileName;
... ... @@ -192,8 +168,7 @@ public class VelocityUtils
192 168 * @param packageName 包名称
193 169 * @return 包前缀名称
194 170 */
195   - public static String getPackagePrefix(String packageName)
196   - {
  171 + public static String getPackagePrefix(String packageName) {
197 172 int lastIndex = packageName.lastIndexOf(".");
198 173 String basePackage = StringUtils.substring(packageName, 0, lastIndex);
199 174 return basePackage;
... ... @@ -205,18 +180,13 @@ public class VelocityUtils
205 180 * @param columns 列集合
206 181 * @return 返回需要导入的包列表
207 182 */
208   - public static HashSet<String> getImportList(List<GenTableColumn> columns)
209   - {
  183 + public static HashSet<String> getImportList(List<GenTableColumn> columns) {
210 184 HashSet<String> importList = new HashSet<String>();
211   - for (GenTableColumn column : columns)
212   - {
213   - if (!column.isSuperColumn() && GenConstants.TYPE_DATE.equals(column.getJavaType()))
214   - {
  185 + for (GenTableColumn column : columns) {
  186 + if (!column.isSuperColumn() && GenConstants.TYPE_DATE.equals(column.getJavaType())) {
215 187 importList.add("java.util.Date");
216 188 importList.add("com.fasterxml.jackson.annotation.JsonFormat");
217   - }
218   - else if (!column.isSuperColumn() && GenConstants.TYPE_BIGDECIMAL.equals(column.getJavaType()))
219   - {
  189 + } else if (!column.isSuperColumn() && GenConstants.TYPE_BIGDECIMAL.equals(column.getJavaType())) {
220 190 importList.add("java.math.BigDecimal");
221 191 }
222 192 }
... ... @@ -226,12 +196,11 @@ public class VelocityUtils
226 196 /**
227 197 * 获取权限前缀
228 198 *
229   - * @param moduleName 模块名称
  199 + * @param moduleName 模块名称
230 200 * @param businessName 业务名称
231 201 * @return 返回权限前缀
232 202 */
233   - public static String getPermissionPrefix(String moduleName, String businessName)
234   - {
  203 + public static String getPermissionPrefix(String moduleName, String businessName) {
235 204 return StringUtils.format("{}:{}", moduleName, businessName);
236 205 }
237 206  
... ... @@ -241,10 +210,8 @@ public class VelocityUtils
241 210 * @param paramsObj 生成其他选项
242 211 * @return 上级菜单ID字段
243 212 */
244   - public static String getParentMenuId(JSONObject paramsObj)
245   - {
246   - if (StringUtils.isNotEmpty(paramsObj) && paramsObj.containsKey(GenConstants.PARENT_MENU_ID))
247   - {
  213 + public static String getParentMenuId(JSONObject paramsObj) {
  214 + if (StringUtils.isNotEmpty(paramsObj) && paramsObj.containsKey(GenConstants.PARENT_MENU_ID)) {
248 215 return paramsObj.getString(GenConstants.PARENT_MENU_ID);
249 216 }
250 217 return DEFAULT_PARENT_MENU_ID;
... ... @@ -256,10 +223,8 @@ public class VelocityUtils
256 223 * @param paramsObj 生成其他选项
257 224 * @return 树编码
258 225 */
259   - public static String getTreecode(JSONObject paramsObj)
260   - {
261   - if (paramsObj.containsKey(GenConstants.TREE_CODE))
262   - {
  226 + public static String getTreecode(JSONObject paramsObj) {
  227 + if (paramsObj.containsKey(GenConstants.TREE_CODE)) {
263 228 return StringUtils.toCamelCase(paramsObj.getString(GenConstants.TREE_CODE));
264 229 }
265 230 return StringUtils.EMPTY;
... ... @@ -271,10 +236,8 @@ public class VelocityUtils
271 236 * @param paramsObj 生成其他选项
272 237 * @return 树父编码
273 238 */
274   - public static String getTreeParentCode(JSONObject paramsObj)
275   - {
276   - if (paramsObj.containsKey(GenConstants.TREE_PARENT_CODE))
277   - {
  239 + public static String getTreeParentCode(JSONObject paramsObj) {
  240 + if (paramsObj.containsKey(GenConstants.TREE_PARENT_CODE)) {
278 241 return StringUtils.toCamelCase(paramsObj.getString(GenConstants.TREE_PARENT_CODE));
279 242 }
280 243 return StringUtils.EMPTY;
... ... @@ -286,10 +249,8 @@ public class VelocityUtils
286 249 * @param paramsObj 生成其他选项
287 250 * @return 树名称
288 251 */
289   - public static String getTreeName(JSONObject paramsObj)
290   - {
291   - if (paramsObj.containsKey(GenConstants.TREE_NAME))
292   - {
  252 + public static String getTreeName(JSONObject paramsObj) {
  253 + if (paramsObj.containsKey(GenConstants.TREE_NAME)) {
293 254 return StringUtils.toCamelCase(paramsObj.getString(GenConstants.TREE_NAME));
294 255 }
295 256 return StringUtils.EMPTY;
... ... @@ -301,20 +262,16 @@ public class VelocityUtils
301 262 * @param genTable 业务表对象
302 263 * @return 展开按钮列序号
303 264 */
304   - public static int getExpandColumn(GenTable genTable)
305   - {
  265 + public static int getExpandColumn(GenTable genTable) {
306 266 String options = genTable.getOptions();
307 267 JSONObject paramsObj = JSONObject.parseObject(options);
308 268 String treeName = paramsObj.getString(GenConstants.TREE_NAME);
309 269 int num = 0;
310   - for (GenTableColumn column : genTable.getColumns())
311   - {
312   - if (column.isList())
313   - {
  270 + for (GenTableColumn column : genTable.getColumns()) {
  271 + if (column.isList()) {
314 272 num++;
315 273 String columnName = column.getColumnName();
316   - if (columnName.equals(treeName))
317   - {
  274 + if (columnName.equals(treeName)) {
318 275 break;
319 276 }
320 277 }
... ...
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysRoleServiceImpl.java
... ... @@ -24,7 +24,7 @@ import com.ruoyi.system.service.ISysRoleService;
24 24  
25 25 /**
26 26 * 角色 业务层处理
27   - *
  27 + *
28 28 * @author ruoyi
29 29 */
30 30 @Service
... ... @@ -44,7 +44,7 @@ public class SysRoleServiceImpl implements ISysRoleService
44 44  
45 45 /**
46 46 * 根据条件分页查询角色数据
47   - *
  47 + *
48 48 * @param role 角色信息
49 49 * @return 角色数据集合信息
50 50 */
... ... @@ -57,7 +57,7 @@ public class SysRoleServiceImpl implements ISysRoleService
57 57  
58 58 /**
59 59 * 根据用户ID查询权限
60   - *
  60 + *
61 61 * @param userId 用户ID
62 62 * @return 权限列表
63 63 */
... ... @@ -78,7 +78,7 @@ public class SysRoleServiceImpl implements ISysRoleService
78 78  
79 79 /**
80 80 * 查询所有角色
81   - *
  81 + *
82 82 * @return 角色列表
83 83 */
84 84 @Override
... ... @@ -89,7 +89,7 @@ public class SysRoleServiceImpl implements ISysRoleService
89 89  
90 90 /**
91 91 * 根据用户ID获取角色选择框列表
92   - *
  92 + *
93 93 * @param userId 用户ID
94 94 * @return 选中角色ID列表
95 95 */
... ... @@ -101,7 +101,7 @@ public class SysRoleServiceImpl implements ISysRoleService
101 101  
102 102 /**
103 103 * 通过角色ID查询角色
104   - *
  104 + *
105 105 * @param roleId 角色ID
106 106 * @return 角色对象信息
107 107 */
... ... @@ -113,7 +113,7 @@ public class SysRoleServiceImpl implements ISysRoleService
113 113  
114 114 /**
115 115 * 校验角色名称是否唯一
116   - *
  116 + *
117 117 * @param role 角色信息
118 118 * @return 结果
119 119 */
... ... @@ -130,96 +130,8 @@ public class SysRoleServiceImpl implements ISysRoleService
130 130 }
131 131  
132 132 /**
133   - * 校验角色权限是否唯一
134   - *
135   - * @param role 角色信息
136   - * @return 结果
137   - */
138   - @Override
139   - public String checkRoleKeyUnique(SysRole role)
140   - {
141   - Long roleId = StringUtils.isNull(role.getRoleId()) ? -1L : role.getRoleId();
142   - SysRole info = roleMapper.checkRoleKeyUnique(role.getRoleKey());
143   - if (StringUtils.isNotNull(info) && info.getRoleId().longValue() != roleId.longValue())
144   - {
145   - return UserConstants.NOT_UNIQUE;
146   - }
147   - return UserConstants.UNIQUE;
148   - }
149   -
150   - /**
151   - * 校验角色是否允许操作
152   - *
153   - * @param role 角色信息
154   - */
155   - @Override
156   - public void checkRoleAllowed(SysRole role)
157   - {
158   - if (StringUtils.isNotNull(role.getRoleId()) && role.isAdmin())
159   - {
160   - throw new CustomException("不允许操作超级管理员角色");
161   - }
162   - }
163   -
164   - /**
165   - * 通过角色ID查询角色使用数量
166   - *
167   - * @param roleId 角色ID
168   - * @return 结果
169   - */
170   - @Override
171   - public int countUserRoleByRoleId(Long roleId)
172   - {
173   - return userRoleMapper.countUserRoleByRoleId(roleId);
174   - }
175   -
176   - /**
177   - * 新增保存角色信息
178   - *
179   - * @param role 角色信息
180   - * @return 结果
181   - */
182   - @Override
183   - @Transactional
184   - public int insertRole(SysRole role)
185   - {
186   - // 新增角色信息
187   - roleMapper.insertRole(role);
188   - return insertRoleMenu(role);
189   - }
190   -
191   - /**
192   - * 修改保存角色信息
193   - *
194   - * @param role 角色信息
195   - * @return 结果
196   - */
197   - @Override
198   - @Transactional
199   - public int updateRole(SysRole role)
200   - {
201   - // 修改角色信息
202   - roleMapper.updateRole(role);
203   - // 删除角色与菜单关联
204   - roleMenuMapper.deleteRoleMenuByRoleId(role.getRoleId());
205   - return insertRoleMenu(role);
206   - }
207   -
208   - /**
209   - * 修改角色状态
210   - *
211   - * @param role 角色信息
212   - * @return 结果
213   - */
214   - @Override
215   - public int updateRoleStatus(SysRole role)
216   - {
217   - return roleMapper.updateRole(role);
218   - }
219   -
220   - /**
221 133 * 修改数据权限信息
222   - *
  134 + *
223 135 * @param role 角色信息
224 136 * @return 结果
225 137 */
... ... @@ -237,7 +149,7 @@ public class SysRoleServiceImpl implements ISysRoleService
237 149  
238 150 /**
239 151 * 新增角色菜单信息
240   - *
  152 + *
241 153 * @param role 角色对象
242 154 */
243 155 public int insertRoleMenu(SysRole role)
... ... @@ -285,7 +197,7 @@ public class SysRoleServiceImpl implements ISysRoleService
285 197  
286 198 /**
287 199 * 通过角色ID删除角色
288   - *
  200 + *
289 201 * @param roleId 角色ID
290 202 * @return 结果
291 203 */
... ... @@ -302,7 +214,7 @@ public class SysRoleServiceImpl implements ISysRoleService
302 214  
303 215 /**
304 216 * 批量删除角色信息
305   - *
  217 + *
306 218 * @param roleIds 需要删除的角色ID
307 219 * @return 结果
308 220 */
... ...
src/main/java/cn/iocoder/dashboard/framework/mybatis/config/MybatisConfiguration.java
1 1 package cn.iocoder.dashboard.framework.mybatis.config;
2 2  
  3 +import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
  4 +import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
3 5 import org.apache.ibatis.annotations.Mapper;
4 6 import org.mybatis.spring.annotation.MapperScan;
  7 +import org.springframework.context.annotation.Bean;
5 8 import org.springframework.context.annotation.Configuration;
6 9  
7 10 /**
... ... @@ -12,4 +15,12 @@ import org.springframework.context.annotation.Configuration;
12 15 @Configuration
13 16 @MapperScan(value = "cn.iocoder.dashboard", annotationClass = Mapper.class)
14 17 public class MybatisConfiguration {
  18 +
  19 + @Bean
  20 + public MybatisPlusInterceptor mybatisPlusInterceptor() {
  21 + MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();
  22 + mybatisPlusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor()); // 分页插件
  23 + return mybatisPlusInterceptor;
  24 + }
  25 +
15 26 }
... ...
src/main/java/cn/iocoder/dashboard/framework/mybatis/core/util/MyBatisUtils.java 0 → 100644
  1 +package cn.iocoder.dashboard.framework.mybatis.core.util;
  2 +
  3 +import cn.hutool.core.collection.CollectionUtil;
  4 +import cn.iocoder.dashboard.common.pojo.PageParam;
  5 +import cn.iocoder.dashboard.common.pojo.SortingField;
  6 +import com.baomidou.mybatisplus.core.metadata.OrderItem;
  7 +import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
  8 +
  9 +import java.util.Collection;
  10 +import java.util.stream.Collectors;
  11 +
  12 +/**
  13 + * MyBatis 工具类
  14 + */
  15 +public class MyBatisUtils {
  16 +
  17 + public static <T> Page<T> buildPage(PageParam pageParam) {
  18 + return buildPage(pageParam, null);
  19 + }
  20 +
  21 + public static <T> Page<T> buildPage(PageParam pageParam, Collection<SortingField> sortingFields) {
  22 + // 页码 + 数量
  23 + Page<T> page = new Page<>(pageParam.getPageNo(), pageParam.getPageSize());
  24 + // 排序字段
  25 + if (!CollectionUtil.isEmpty(sortingFields)) {
  26 + page.addOrder(sortingFields.stream().map(sortingField -> SortingField.ORDER_ASC.equals(sortingField.getOrder()) ?
  27 + OrderItem.asc(sortingField.getField()) : OrderItem.desc(sortingField.getField()))
  28 + .collect(Collectors.toList()));
  29 + }
  30 + return page;
  31 + }
  32 +
  33 +}
... ...
src/main/java/cn/iocoder/dashboard/framework/security/core/enums/DataScopeEnum.java
... ... @@ -15,10 +15,10 @@ import lombok.Getter;
15 15 public enum DataScopeEnum {
16 16  
17 17 ALL(1), // 全部数据权限
18   - CUSTOM(2), // 自定数据权限
19   - DEPT(3), // 部门数据权限
  18 + DEPT_CUSTOM(2), // 指定部门数据权限
  19 + DEPT_ONLY(3), // 部门数据权限
20 20 DEPT_AND_CHILD(4), // 部门及以下数据权限
21   - SELF(5); // 仅本人数据权限
  21 + DEPT_SELF(5); // 仅本人数据权限
22 22  
23 23 /**
24 24 * 范围
... ...
src/main/java/cn/iocoder/dashboard/modules/system/controller/permission/SysMenuController.java
... ... @@ -9,6 +9,7 @@ import cn.iocoder.dashboard.modules.system.convert.permission.SysMenuConvert;
9 9 import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.permission.SysMenuDO;
10 10 import cn.iocoder.dashboard.modules.system.service.permission.SysMenuService;
11 11 import io.swagger.annotations.Api;
  12 +import io.swagger.annotations.ApiImplicitParam;
12 13 import io.swagger.annotations.ApiOperation;
13 14 import org.springframework.validation.annotation.Validated;
14 15 import org.springframework.web.bind.annotation.*;
... ... @@ -65,7 +66,7 @@ public class SysMenuController {
65 66 // return ajax;
66 67 // }
67 68  
68   - @ApiOperation("新增菜单")
  69 + @ApiOperation("创建菜单")
69 70 // @PreAuthorize("@ss.hasPermi('system:menu:add')")
70 71 // @Log(title = "菜单管理", businessType = BusinessType.INSERT)
71 72 @PostMapping("/create")
... ... @@ -85,6 +86,7 @@ public class SysMenuController {
85 86  
86 87 @ApiOperation("删除菜单")
87 88 @PostMapping("/delete")
  89 + @ApiImplicitParam(name = "id", value = "角色编号", required= true, example = "1024")
88 90 // @Log(title = "菜单管理", businessType = BusinessType.DELETE)
89 91 public CommonResult<Boolean> deleteMenu(@RequestParam("id") Long id) {
90 92 menuService.deleteMenu(id);
... ...
src/main/java/cn/iocoder/dashboard/modules/system/controller/permission/SysRoleController.http 0 → 100644
  1 +### /role/create 成功
  2 +POST {{baseUrl}}/system/role/create
  3 +Authorization: Bearer {{token}}
  4 +Content-Type: application/json
  5 +
  6 +{
  7 + "name": "测试角色",
  8 + "code": "test",
  9 + "sort": 0
  10 +}
  11 +
  12 +### /role/update 成功
  13 +POST {{baseUrl}}/system/role/update
  14 +Authorization: Bearer {{token}}
  15 +Content-Type: application/json
  16 +
  17 +
  18 +{
  19 + "id": 100,
  20 + "name": "测试角色",
  21 + "code": "test",
  22 + "sort": 10
  23 +}
  24 +### /resource/delete 成功
  25 +POST {{baseUrl}}/system/role/delete
  26 +Content-Type: application/x-www-form-urlencoded
  27 +Authorization: Bearer {{token}}
  28 +
  29 +roleId=14
  30 +
  31 +### /role/get 成功
  32 +GET {{baseUrl}}/system/role/get?id=100
  33 +Content-Type: application/x-www-form-urlencoded
  34 +Authorization: Bearer {{token}}
  35 +
  36 +### /role/page 成功
  37 +GET {{baseUrl}}/system/role/page?pageNo=1&pageSize=10
  38 +Authorization: Bearer {{token}}
  39 +
  40 +###
  41 +
... ...
src/main/java/cn/iocoder/dashboard/modules/system/controller/permission/SysRoleController.java
1 1 package cn.iocoder.dashboard.modules.system.controller.permission;
2 2  
  3 +import cn.iocoder.dashboard.common.pojo.CommonResult;
  4 +import cn.iocoder.dashboard.common.pojo.PageResult;
  5 +import cn.iocoder.dashboard.modules.system.controller.permission.vo.role.SysRoleCreateReqVO;
  6 +import cn.iocoder.dashboard.modules.system.controller.permission.vo.role.SysRolePageReqVO;
  7 +import cn.iocoder.dashboard.modules.system.controller.permission.vo.role.SysRoleRespVO;
  8 +import cn.iocoder.dashboard.modules.system.controller.permission.vo.role.SysRoleUpdateReqVO;
  9 +import cn.iocoder.dashboard.modules.system.convert.permission.SysRoleConvert;
  10 +import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.permission.SysRoleDO;
  11 +import cn.iocoder.dashboard.modules.system.service.permission.SysRoleService;
3 12 import io.swagger.annotations.Api;
4   -import org.springframework.web.bind.annotation.RequestMapping;
5   -import org.springframework.web.bind.annotation.RestController;
  13 +import io.swagger.annotations.ApiImplicitParam;
  14 +import io.swagger.annotations.ApiImplicitParams;
  15 +import io.swagger.annotations.ApiOperation;
  16 +import org.springframework.validation.annotation.Validated;
  17 +import org.springframework.web.bind.annotation.*;
  18 +
  19 +import javax.annotation.Resource;
  20 +
  21 +import static cn.iocoder.dashboard.common.pojo.CommonResult.success;
6 22  
7 23 @Api(tags = "角色 API")
8 24 @RestController
9 25 @RequestMapping("/system/role")
10 26 public class SysRoleController {
11 27  
  28 + @Resource
  29 + private SysRoleService roleService;
  30 +
  31 + @ApiOperation("获得角色分页")
  32 + @GetMapping("/page")
12 33 // @PreAuthorize("@ss.hasPermi('system:role:list')")
13   -// @GetMapping("/list")
14   -// public TableDataInfo list(SysRole role)
15   -// {
16   -// startPage();
17   -// List<SysRole> list = roleService.selectRoleList(role);
18   -// return getDataTable(list);
19   -// }
20   -//
  34 + public CommonResult<PageResult<SysRoleDO>> list(SysRolePageReqVO reqVO) {
  35 + return success(roleService.pageRole(reqVO));
  36 + }
  37 +
  38 + @ApiOperation("创建角色")
  39 + @PostMapping("/create")
  40 +// @PreAuthorize("@ss.hasPermi('system:role:add')")
  41 +// @Log(title = "角色管理", businessType = BusinessType.INSERT)
  42 + public CommonResult<Long> add(@Validated @RequestBody SysRoleCreateReqVO reqVO) {
  43 + return success(roleService.createRole(reqVO));
  44 + }
  45 +
  46 + @ApiOperation("修改角色")
  47 +// @PreAuthorize("@ss.hasPermi('system:role:edit')")
  48 +// @Log(title = "角色管理", businessType = BusinessType.UPDATE)
  49 + @PostMapping("/update")
  50 + public CommonResult<Boolean> update(@Validated @RequestBody SysRoleUpdateReqVO reqVO) {
  51 + roleService.updateRole(reqVO);
  52 + return success(true);
  53 + }
  54 +
  55 + @ApiOperation("删除角色")
  56 + @PostMapping("/delete")
  57 + @ApiImplicitParam(name = "id", value = "角色编号", required = true, example = "1024")
  58 +// @PreAuthorize("@ss.hasPermi('system:role:remove')")
  59 +// @Log(title = "角色管理", businessType = BusinessType.DELETE)
  60 + public CommonResult<Boolean> remove(@RequestParam("id") Long id) {
  61 + roleService.deleteRole(id);
  62 + return success(true);
  63 + }
  64 +
  65 + @ApiOperation("获得角色信息")
  66 + @GetMapping("/get")
  67 +// @PreAuthorize("@ss.hasPermi('system:role:query')")
  68 + public CommonResult<SysRoleRespVO> getRole(@RequestParam("id") Long id) {
  69 + SysRoleDO role = roleService.getRole(id);
  70 + return success(SysRoleConvert.INSTANCE.convert(role));
  71 + }
  72 +
21 73 // @Log(title = "角色管理", businessType = BusinessType.EXPORT)
22 74 // @PreAuthorize("@ss.hasPermi('system:role:export')")
23 75 // @GetMapping("/export")
... ... @@ -27,71 +79,20 @@ public class SysRoleController {
27 79 // ExcelUtil<SysRole> util = new ExcelUtil<SysRole>(SysRole.class);
28 80 // return util.exportExcel(list, "角色数据");
29 81 // }
30   -//
31   -// /**
32   -// * 根据角色编号获取详细信息
33   -// */
34   -// @PreAuthorize("@ss.hasPermi('system:role:query')")
35   -// @GetMapping(value = "/{roleId}")
36   -// public AjaxResult getInfo(@PathVariable Long roleId)
37   -// {
38   -// return AjaxResult.success(roleService.selectRoleById(roleId));
39   -// }
40   -//
41   -// /**
42   -// * 新增角色
43   -// */
44   -// @PreAuthorize("@ss.hasPermi('system:role:add')")
45   -// @Log(title = "角色管理", businessType = BusinessType.INSERT)
46   -// @PostMapping
47   -// public AjaxResult add(@Validated @RequestBody SysRole role)
48   -// {
49   -// if (UserConstants.NOT_UNIQUE.equals(roleService.checkRoleNameUnique(role)))
50   -// {
51   -// return AjaxResult.error("新增角色'" + role.getRoleName() + "'失败,角色名称已存在");
52   -// }
53   -// else if (UserConstants.NOT_UNIQUE.equals(roleService.checkRoleKeyUnique(role)))
54   -// {
55   -// return AjaxResult.error("新增角色'" + role.getRoleName() + "'失败,角色权限已存在");
56   -// }
57   -// role.setCreateBy(SecurityUtils.getUsername());
58   -// return toAjax(roleService.insertRole(role));
59   -//
60   -// }
61   -//
62   -// /**
63   -// * 修改保存角色
64   -// */
  82 +
  83 + @ApiOperation("修改角色状态")
  84 + @PostMapping("/update-status")
  85 + @ApiImplicitParams(value = {
  86 + @ApiImplicitParam(name = "id", value = "角色编号", required = true, example = "1024"),
  87 + @ApiImplicitParam(name = "status", value = "状态", required = true, example = "1")
  88 + })
65 89 // @PreAuthorize("@ss.hasPermi('system:role:edit')")
66 90 // @Log(title = "角色管理", businessType = BusinessType.UPDATE)
67   -// @PutMapping
68   -// public AjaxResult edit(@Validated @RequestBody SysRole role)
69   -// {
70   -// roleService.checkRoleAllowed(role);
71   -// if (UserConstants.NOT_UNIQUE.equals(roleService.checkRoleNameUnique(role)))
72   -// {
73   -// return AjaxResult.error("修改角色'" + role.getRoleName() + "'失败,角色名称已存在");
74   -// }
75   -// else if (UserConstants.NOT_UNIQUE.equals(roleService.checkRoleKeyUnique(role)))
76   -// {
77   -// return AjaxResult.error("修改角色'" + role.getRoleName() + "'失败,角色权限已存在");
78   -// }
79   -// role.setUpdateBy(SecurityUtils.getUsername());
80   -//
81   -// if (roleService.updateRole(role) > 0)
82   -// {
83   -// // 更新缓存用户权限
84   -// LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
85   -// if (StringUtils.isNotNull(loginUser.getUser()) && !loginUser.getUser().isAdmin())
86   -// {
87   -// loginUser.setPermissions(permissionService.getMenuPermission(loginUser.getUser()));
88   -// loginUser.setUser(userService.selectUserByUserName(loginUser.getUser().getUserName()));
89   -// tokenService.setLoginUser(loginUser);
90   -// }
91   -// return AjaxResult.success();
92   -// }
93   -// return AjaxResult.error("修改角色'" + role.getRoleName() + "'失败,请联系管理员");
94   -// }
  91 + public CommonResult<Boolean> updateRoleStatus(@RequestParam("id") Long id, @RequestParam("status") Integer status) {
  92 + roleService.updateRoleStatus(id, status);
  93 + return success(true);
  94 + }
  95 +
95 96 //
96 97 // /**
97 98 // * 修改保存数据权限
... ... @@ -104,30 +105,8 @@ public class SysRoleController {
104 105 // roleService.checkRoleAllowed(role);
105 106 // return toAjax(roleService.authDataScope(role));
106 107 // }
107   -//
108   -// /**
109   -// * 状态修改
110   -// */
111   -// @PreAuthorize("@ss.hasPermi('system:role:edit')")
112   -// @Log(title = "角色管理", businessType = BusinessType.UPDATE)
113   -// @PutMapping("/changeStatus")
114   -// public AjaxResult changeStatus(@RequestBody SysRole role)
115   -// {
116   -// roleService.checkRoleAllowed(role);
117   -// role.setUpdateBy(SecurityUtils.getUsername());
118   -// return toAjax(roleService.updateRoleStatus(role));
119   -// }
120   -//
121   -// /**
122   -// * 删除角色
123   -// */
124   -// @PreAuthorize("@ss.hasPermi('system:role:remove')")
125   -// @Log(title = "角色管理", businessType = BusinessType.DELETE)
126   -// @DeleteMapping("/{roleIds}")
127   -// public AjaxResult remove(@PathVariable Long[] roleIds)
128   -// {
129   -// return toAjax(roleService.deleteRoleByIds(roleIds));
130   -// }
  108 +
  109 +
131 110 //
132 111 // /**
133 112 // * 获取角色选择框列表
... ...
src/main/java/cn/iocoder/dashboard/modules/system/controller/permission/vo/role/SysMenuPageReqVO.java renamed to src/main/java/cn/iocoder/dashboard/modules/system/controller/permission/vo/role/SysRolePageReqVO.java
... ... @@ -2,12 +2,19 @@ package cn.iocoder.dashboard.modules.system.controller.permission.vo.role;
2 2  
3 3 import cn.iocoder.dashboard.common.pojo.PageParam;
4 4 import io.swagger.annotations.ApiModel;
  5 +import io.swagger.annotations.ApiModelProperty;
5 6 import lombok.Data;
6 7 import lombok.EqualsAndHashCode;
7 8  
8 9 @ApiModel("角色分页 Request VO")
9 10 @Data
10 11 @EqualsAndHashCode(callSuper = true)
11   -public class SysMenuPageReqVO extends PageParam {
  12 +public class SysRolePageReqVO extends PageParam {
  13 +
  14 + @ApiModelProperty(value = "角色名称", example = "芋道", notes = "模糊匹配")
  15 + private String name;
  16 +
  17 + @ApiModelProperty(value = "展示状态", example = "1", notes = "参见 SysCommonStatusEnum 枚举类")
  18 + private Integer status;
12 19  
13 20 }
... ...
src/main/java/cn/iocoder/dashboard/modules/system/convert/permission/SysRoleConvert.java 0 → 100644
  1 +package cn.iocoder.dashboard.modules.system.convert.permission;
  2 +
  3 +import cn.iocoder.dashboard.common.pojo.PageResult;
  4 +import cn.iocoder.dashboard.modules.system.controller.permission.vo.role.SysRoleCreateReqVO;
  5 +import cn.iocoder.dashboard.modules.system.controller.permission.vo.role.SysRoleRespVO;
  6 +import cn.iocoder.dashboard.modules.system.controller.permission.vo.role.SysRoleUpdateReqVO;
  7 +import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.permission.SysRoleDO;
  8 +import com.baomidou.mybatisplus.core.metadata.IPage;
  9 +import org.mapstruct.Mapper;
  10 +import org.mapstruct.Mapping;
  11 +import org.mapstruct.factory.Mappers;
  12 +
  13 +@Mapper
  14 +public interface SysRoleConvert {
  15 +
  16 + SysRoleConvert INSTANCE = Mappers.getMapper(SysRoleConvert.class);
  17 +
  18 + SysRoleDO convert(SysRoleUpdateReqVO bean);
  19 +
  20 + SysRoleRespVO convert(SysRoleDO bean);
  21 +
  22 + @Mapping(source = "records", target = "list")
  23 + PageResult<SysRoleDO> convertPage(IPage<SysRoleDO> page);
  24 +
  25 + SysRoleDO convert(SysRoleCreateReqVO bean);
  26 +
  27 +}
... ...
src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dao/permission/SysRoleDeptMapper.java deleted
1   -package cn.iocoder.dashboard.modules.system.dal.mysql.dao.permission;
2   -
3   -import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.permission.SysRoleDeptDO;
4   -import com.baomidou.mybatisplus.core.mapper.BaseMapper;
5   -import org.apache.ibatis.annotations.Mapper;
6   -
7   -@Mapper
8   -public interface SysRoleDeptMapper extends BaseMapper<SysRoleDeptDO> {
9   -}
src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dao/permission/SysRoleMapper.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.framework.mybatis.core.util.MyBatisUtils;
  5 +import cn.iocoder.dashboard.modules.system.controller.permission.vo.role.SysRolePageReqVO;
3 6 import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.permission.SysRoleDO;
4 7 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
  8 +import com.baomidou.mybatisplus.core.metadata.IPage;
5 9 import org.apache.ibatis.annotations.Mapper;
6 10  
7 11 @Mapper
8 12 public interface SysRoleMapper extends BaseMapper<SysRoleDO> {
  13 +
  14 + default IPage<SysRoleDO> selectPage(SysRolePageReqVO reqVO) {
  15 + return selectPage(MyBatisUtils.buildPage(reqVO),
  16 + new QueryWrapperX<SysRoleDO>().likeIfPresent("name", reqVO.getName())
  17 + .eqIfPresent("status", reqVO.getStatus()));
  18 + }
  19 +
  20 + default SysRoleDO selectByName(String name) {
  21 + return selectOne(new QueryWrapperX<SysRoleDO>().eq("name", name));
  22 + }
  23 +
  24 + default SysRoleDO selectByCode(String code) {
  25 + return selectOne(new QueryWrapperX<SysRoleDO>().eq("code", code));
  26 + }
  27 +
  28 +
9 29 }
... ...
src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dataobject/permission/SysRoleDO.java
... ... @@ -5,17 +5,21 @@ import cn.iocoder.dashboard.framework.mybatis.core.dataobject.BaseDO;
5 5 import cn.iocoder.dashboard.framework.security.core.enums.DataScopeEnum;
6 6 import cn.iocoder.dashboard.modules.system.enums.permission.RoleCodeEnum;
7 7 import cn.iocoder.dashboard.modules.system.enums.permission.RoleTypeEnum;
  8 +import com.baomidou.mybatisplus.annotation.TableField;
8 9 import com.baomidou.mybatisplus.annotation.TableId;
9 10 import com.baomidou.mybatisplus.annotation.TableName;
  11 +import com.baomidou.mybatisplus.extension.handlers.FastjsonTypeHandler;
10 12 import lombok.Data;
11 13 import lombok.EqualsAndHashCode;
12 14  
  15 +import java.util.List;
  16 +
13 17 /**
14 18 * 角色 DO
15 19 *
16 20 * @author ruoyi
17 21 */
18   -@TableName("sys_role")
  22 +@TableName(value = "sys_role", autoResultMap = true)
19 23 @Data
20 24 @EqualsAndHashCode(callSuper = true)
21 25 public class SysRoleDO extends BaseDO {
... ... @@ -40,17 +44,11 @@ public class SysRoleDO extends BaseDO {
40 44 */
41 45 private Integer sort;
42 46 /**
43   - * 数据范围
44   - *
45   - * 枚举类 {@link DataScopeEnum}
46   - */
47   - private Integer dataScope;
48   - /**
49 47 * 角色状态
50 48 *
51 49 * 枚举 {@link CommonStatusEnum}
52 50 */
53   - private String status;
  51 + private Integer status;
54 52 /**
55 53 * 角色类型
56 54 *
... ... @@ -63,13 +61,17 @@ public class SysRoleDO extends BaseDO {
63 61 private String remark;
64 62  
65 63 /**
66   - * 菜单树选择项是否关联显示( 0:父子不互相关联显示 1:父子互相关联显示)
  64 + * 数据范围
  65 + *
  66 + * 枚举 {@link DataScopeEnum}
67 67 */
68   - private boolean menuCheckStrictly;
69   -
  68 + private Integer dataScope;
70 69 /**
71   - * 部门树选择项是否关联显示(0:父子不互相关联显示 1:父子互相关联显示 )
  70 + * 数据范围(指定部门数组)
  71 + *
  72 + * 适用于 {@link #dataScope} 的值为 {@link DataScopeEnum#DEPT_CUSTOM} 时
72 73 */
73   - private boolean deptCheckStrictly;
  74 + @TableField(typeHandler = FastjsonTypeHandler.class)
  75 + private List<Long> dataScopeDeptIds;
74 76  
75 77 }
... ...
src/main/java/cn/iocoder/dashboard/modules/system/dal/mysql/dataobject/permission/SysRoleDeptDO.java deleted
1   -package cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.permission;
2   -
3   -import cn.iocoder.dashboard.framework.mybatis.core.dataobject.BaseDO;
4   -import com.baomidou.mybatisplus.annotation.TableId;
5   -import com.baomidou.mybatisplus.annotation.TableName;
6   -import lombok.Data;
7   -import lombok.EqualsAndHashCode;
8   -
9   -/**
10   - * 部门和角色关联 DO
11   - *
12   - * @author ruoyi
13   - */
14   -@TableName("sys_role_dept")
15   -@Data
16   -@EqualsAndHashCode(callSuper = true)
17   -public class SysRoleDeptDO extends BaseDO {
18   -
19   - /**
20   - * 自增主键
21   - */
22   - @TableId
23   - private Long id;
24   - /**
25   - * 部门 ID
26   - */
27   - private Long deptId;
28   - /**
29   - * 角色 ID
30   - */
31   - private Long roleId;
32   -
33   -}
src/main/java/cn/iocoder/dashboard/modules/system/enums/SysErrorCodeConstants.java
... ... @@ -26,4 +26,11 @@ public interface SysErrorCodeConstants {
26 26 ErrorCode MENU_EXISTS_CHILDREN = new ErrorCode(1002002004, "存在子菜单,无法删除");
27 27 ErrorCode MENU_PARENT_NOT_DIR_OR_MENU = new ErrorCode(1002002005, "父菜单的类型必须是目录或者菜单");
28 28  
  29 + // ========== 角色模块 1002003000 ==========
  30 + ErrorCode ROLE_NOT_EXISTS = new ErrorCode(1002003000, "角色不存在");
  31 + ErrorCode ROLE_NAME_DUPLICATE = new ErrorCode(1002003001, "已经存在名为【{}}】的角色");
  32 + ErrorCode ROLE_CODE_DUPLICATE = new ErrorCode(1002003002, "已经存在编码为【{}}】的角色");
  33 + ErrorCode ROLE_CAN_NOT_UPDATE_SYSTEM_TYPE_ROLE = new ErrorCode(1002003004, "不能修改类型为系统内置的角色");
  34 + ErrorCode ROLE_CAN_NOT_DELETE_SYSTEM_TYPE_ROLE = new ErrorCode(1002003005, "不能删除类型为系统内置的角色");
  35 +
29 36 }
... ...
src/main/java/cn/iocoder/dashboard/modules/system/service/auth/impl/SysAuthServiceImpl.java
... ... @@ -5,22 +5,14 @@ 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.SysAuthMenuRespVO;
9   -import cn.iocoder.dashboard.modules.system.controller.auth.vo.SysAuthPermissionInfoRespVO;
10 8 import cn.iocoder.dashboard.modules.system.convert.auth.SysAuthConvert;
11   -import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.permission.SysMenuDO;
12   -import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.permission.SysRoleDO;
13 9 import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.user.SysUserDO;
14 10 import cn.iocoder.dashboard.modules.system.dal.redis.dao.auth.SysLoginUserRedisDAO;
15   -import cn.iocoder.dashboard.modules.system.enums.permission.MenuTypeEnum;
16 11 import cn.iocoder.dashboard.modules.system.enums.user.UserStatus;
17 12 import cn.iocoder.dashboard.modules.system.service.auth.SysAuthService;
18 13 import cn.iocoder.dashboard.modules.system.service.auth.SysTokenService;
19 14 import cn.iocoder.dashboard.modules.system.service.permission.SysPermissionService;
20   -import cn.iocoder.dashboard.modules.system.service.permission.SysRoleService;
21 15 import cn.iocoder.dashboard.modules.system.service.user.SysUserService;
22   -import cn.iocoder.dashboard.util.collection.CollectionUtils;
23   -import cn.iocoder.dashboard.util.collection.SetUtils;
24 16 import cn.iocoder.dashboard.util.date.DateUtils;
25 17 import io.jsonwebtoken.Claims;
26 18 import io.jsonwebtoken.JwtException;
... ... @@ -37,9 +29,8 @@ import org.springframework.stereotype.Service;
37 29 import org.springframework.util.Assert;
38 30  
39 31 import javax.annotation.Resource;
  32 +import java.util.Collections;
40 33 import java.util.Date;
41   -import java.util.HashSet;
42   -import java.util.List;
43 34 import java.util.Set;
44 35  
45 36 import static cn.iocoder.dashboard.common.exception.util.ServiceExceptionUtil.exception;
... ... @@ -64,8 +55,6 @@ public class SysAuthServiceImpl implements SysAuthService {
64 55 @Resource
65 56 private SysUserService userService;
66 57 @Resource
67   - private SysRoleService roleService;
68   - @Resource
69 58 private SysPermissionService permissionService;
70 59  
71 60 @Resource
... ... @@ -92,7 +81,7 @@ public class SysAuthServiceImpl implements SysAuthService {
92 81 // 创建 LoginUser 对象
93 82 LoginUser loginUser = SysAuthConvert.INSTANCE.convert(user);
94 83 loginUser.setUpdateTime(new Date());
95   - loginUser.setRoleIds(this.getUserRoleIds(loginUser.getUserId(), loginUser.getDeptId()));
  84 + loginUser.setRoleIds(this.getUserRoleIds(loginUser.getUserId()));
96 85 return loginUser;
97 86 }
98 87  
... ... @@ -106,7 +95,7 @@ public class SysAuthServiceImpl implements SysAuthService {
106 95 // 缓存登陆用户到 Redis 中
107 96 String sessionId = IdUtil.fastSimpleUUID();
108 97 loginUser.setUpdateTime(new Date());
109   - loginUser.setRoleIds(this.getUserRoleIds(loginUser.getUserId(), loginUser.getDeptId()));
  98 + loginUser.setRoleIds(this.getUserRoleIds(loginUser.getUserId()));
110 99 loginUserRedisDAO.set(sessionId, loginUser);
111 100  
112 101 // 创建 Token
... ... @@ -156,15 +145,10 @@ public class SysAuthServiceImpl implements SysAuthService {
156 145 * 获得 User 拥有的角色编号数组
157 146 *
158 147 * @param userId 用户编号
159   - * @param deptId 科室编号
160 148 * @return 角色编号数组
161 149 */
162   - private Set<Long> getUserRoleIds(Long userId, Long deptId) {
163   - // 用户拥有的角色
164   - Set<Long> roleIds = new HashSet<>(permissionService.listUserRoleIds(userId));
165   - // 部门拥有的角色
166   - CollectionUtils.addIfNotNull(roleIds, permissionService.getDeptRoleId(deptId));
167   - return roleIds;
  150 + private Set<Long> getUserRoleIds(Long userId) {
  151 + return permissionService.listUserRoleIds(userId, Collections.singleton(CommonStatusEnum.ENABLE.getStatus()));
168 152 }
169 153  
170 154 @Override
... ... @@ -222,7 +206,7 @@ public class SysAuthServiceImpl implements SysAuthService {
222 206 // 刷新 LoginUser 缓存
223 207 loginUser.setDeptId(user.getDeptId());
224 208 loginUser.setUpdateTime(new Date());
225   - loginUser.setRoleIds(this.getUserRoleIds(loginUser.getUserId(), loginUser.getDeptId()));
  209 + loginUser.setRoleIds(this.getUserRoleIds(loginUser.getUserId()));
226 210 loginUserRedisDAO.set(sessionId, loginUser);
227 211 }
228 212  
... ...
src/main/java/cn/iocoder/dashboard/modules/system/service/permission/SysPermissionService.java
... ... @@ -2,8 +2,10 @@ package cn.iocoder.dashboard.modules.system.service.permission;
2 2  
3 3 import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.permission.SysMenuDO;
4 4  
  5 +import javax.annotation.Nullable;
5 6 import java.util.Collection;
6 7 import java.util.List;
  8 +import java.util.Set;
7 9  
8 10 /**
9 11 * 权限 Service 接口
... ... @@ -33,26 +35,26 @@ public interface SysPermissionService {
33 35 Collection<Integer> menusStatuses);
34 36  
35 37 /**
36   - * 获得用户拥有的角色编号数组
  38 + * 获得用户拥有的角色编号集合
37 39 *
38 40 * @param userId 用户编号
39   - * @return 角色编号数组
  41 + * @param roleStatuses 角色状态集合. 允许为空,为空时不过滤
  42 + * @return 角色编号集合
40 43 */
41   - List<Long> listUserRoleIds(Long userId);
  44 + Set<Long> listUserRoleIds(Long userId, @Nullable Collection<Integer> roleStatuses);
42 45  
43 46 /**
44   - * 获得部门拥有的角色编号
  47 + * 处理角色删除时,删除关联授权角色
45 48 *
46   - * @param deptId 部门编号
47   - * @return 角色编号
  49 + * @param roleId 角色编号
48 50 */
49   - Long getDeptRoleId(Long deptId);
  51 + void processRoleDeleted(Long roleId);
50 52  
51 53 /**
52   - * 删除授予给角色的菜单们
  54 + * 处理菜单删除时,删除关联授权数据
53 55 *
54 56 * @param menuId 菜单编号
55 57 */
56   - void deleteRolesMenuByMenuId(Long menuId);
  58 + void processMenuDeleted(Long menuId);
57 59  
58 60 }
... ...
src/main/java/cn/iocoder/dashboard/modules/system/service/permission/SysRoleService.java
1 1 package cn.iocoder.dashboard.modules.system.service.permission;
2 2  
  3 +import cn.iocoder.dashboard.common.pojo.PageResult;
  4 +import cn.iocoder.dashboard.modules.system.controller.permission.vo.role.SysRoleCreateReqVO;
  5 +import cn.iocoder.dashboard.modules.system.controller.permission.vo.role.SysRolePageReqVO;
  6 +import cn.iocoder.dashboard.modules.system.controller.permission.vo.role.SysRoleUpdateReqVO;
3 7 import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.permission.SysRoleDO;
4 8  
5 9 import java.util.Collection;
... ... @@ -18,12 +22,20 @@ public interface SysRoleService {
18 22 void init();
19 23  
20 24 /**
  25 + * 获得角色,从缓存中
  26 + *
  27 + * @param id 角色编号
  28 + * @return 角色
  29 + */
  30 + SysRoleDO getRoleFromCache(Long id);
  31 +
  32 + /**
21 33 * 获得角色数组,从缓存中
22 34 *
23   - * @param roleIds 角色编号数组
  35 + * @param ids 角色编号数组
24 36 * @return 角色数组
25 37 */
26   - List<SysRoleDO> listRolesFromCache(Collection<Long> roleIds);
  38 + List<SysRoleDO> listRolesFromCache(Collection<Long> ids);
27 39  
28 40 /**
29 41 * 判断角色数组中,是否有管理员
... ... @@ -33,4 +45,50 @@ public interface SysRoleService {
33 45 */
34 46 boolean hasAnyAdmin(Collection<SysRoleDO> roleList);
35 47  
  48 + /**
  49 + * 创建角色
  50 + *
  51 + * @param reqVO 创建角色信息
  52 + * @return 角色编号
  53 + */
  54 + Long createRole(SysRoleCreateReqVO reqVO);
  55 +
  56 + /**
  57 + * 更新角色
  58 + *
  59 + * @param reqVO 更新角色信息
  60 + */
  61 + void updateRole(SysRoleUpdateReqVO reqVO);
  62 +
  63 + /**
  64 + * 删除角色
  65 + *
  66 + * @param id 角色编号
  67 + */
  68 + void deleteRole(Long id);
  69 +
  70 + /**
  71 + * 获得角色
  72 + *
  73 + * @param id 角色编号
  74 + * @return 角色
  75 + */
  76 + SysRoleDO getRole(Long id);
  77 +
  78 + /**
  79 + * 获得角色分页
  80 + *
  81 + * @param reqVO 角色分页查询
  82 + * @return 角色分页结果
  83 + */
  84 + PageResult<SysRoleDO> pageRole(SysRolePageReqVO reqVO);
  85 +
  86 + /**
  87 + * 更新角色状态
  88 + *
  89 + * @param id 角色编号
  90 + * @param status 状态
  91 + */
  92 + void updateRoleStatus(Long id, Integer status);
  93 +
36 94 }
... ...
src/main/java/cn/iocoder/dashboard/modules/system/service/permission/impl/SysMenuServiceImpl.java
... ... @@ -160,7 +160,7 @@ public class SysMenuServiceImpl implements SysMenuService {
160 160 // 标记删除
161 161 menuMapper.deleteById(menuId);
162 162 // 删除授予给角色的权限
163   - permissionService.deleteRolesMenuByMenuId(menuId);
  163 + permissionService.processMenuDeleted(menuId);
164 164 }
165 165  
166 166 @Override
... ...
src/main/java/cn/iocoder/dashboard/modules/system/service/permission/impl/SysPermissionServiceImpl.java
1 1 package cn.iocoder.dashboard.modules.system.service.permission.impl;
2 2  
3   -import cn.iocoder.dashboard.modules.system.dal.mysql.dao.permission.SysRoleDeptMapper;
  3 +import cn.hutool.core.collection.CollectionUtil;
4 4 import cn.iocoder.dashboard.modules.system.dal.mysql.dao.permission.SysRoleMenuMapper;
5 5 import cn.iocoder.dashboard.modules.system.dal.mysql.dao.permission.SysUserRoleMapper;
6   -import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.permission.*;
  6 +import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.permission.SysMenuDO;
  7 +import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.permission.SysRoleDO;
  8 +import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.permission.SysRoleMenuDO;
  9 +import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.permission.SysUserRoleDO;
7 10 import cn.iocoder.dashboard.modules.system.service.permission.SysMenuService;
8 11 import cn.iocoder.dashboard.modules.system.service.permission.SysPermissionService;
9 12 import cn.iocoder.dashboard.modules.system.service.permission.SysRoleService;
... ... @@ -19,11 +22,12 @@ import javax.annotation.Resource;
19 22 import java.util.Collection;
20 23 import java.util.Collections;
21 24 import java.util.List;
  25 +import java.util.Set;
22 26  
23 27 /**
24 28 * 权限 Service 实现类
25 29 *
26   - * @author 初始化
  30 + * @author 芋道源码
27 31 */
28 32 @Service
29 33 @Slf4j
... ... @@ -50,8 +54,6 @@ public class SysPermissionServiceImpl implements SysPermissionService {
50 54 private SysRoleMenuMapper roleMenuMapper;
51 55 @Resource
52 56 private SysUserRoleMapper userRoleMapper;
53   - @Resource
54   - private SysRoleDeptMapper roleDeptMapper;
55 57  
56 58 @Resource
57 59 private SysRoleService roleService;
... ... @@ -96,19 +98,29 @@ public class SysPermissionServiceImpl implements SysPermissionService {
96 98 }
97 99  
98 100 @Override
99   - public List<Long> listUserRoleIds(Long userId) {
  101 + public Set<Long> listUserRoleIds(Long userId, Collection<Integer> roleStatuses) {
100 102 List<SysUserRoleDO> userRoleList = userRoleMapper.selectListByUserId(userId);
101   - return CollectionUtils.convertList(userRoleList, SysUserRoleDO::getRoleId);
  103 + // 过滤角色状态
  104 + if (CollectionUtil.isNotEmpty(roleStatuses)) {
  105 + userRoleList.removeIf(userRoleDO -> {
  106 + SysRoleDO role = roleService.getRoleFromCache(userRoleDO.getRoleId());
  107 + return role == null || !roleStatuses.contains(role.getStatus());
  108 + });
  109 + }
  110 + return CollectionUtils.convertSet(userRoleList, SysUserRoleDO::getRoleId);
102 111 }
103 112  
104 113 @Override
105   - public Long getDeptRoleId(Long deptId) {
106   - SysRoleDeptDO roleDept = roleDeptMapper.selectById(deptId);
107   - return roleDept != null ? roleDept.getRoleId() : null;
  114 + public void processRoleDeleted(Long roleId) {
  115 + // TODO 实现我
  116 +// // 标记删除 RoleResource
  117 +// roleResourceMapper.deleteByRoleId(roleId);
  118 +// // 标记删除 AdminRole
  119 +// adminRoleMapper.deleteByRoleId(roleId);
108 120 }
109 121  
110 122 @Override
111   - public void deleteRolesMenuByMenuId(Long menuId) {
  123 + public void processMenuDeleted(Long menuId) {
112 124 // TODO 实现我
113 125 }
114 126  
... ...
src/main/java/cn/iocoder/dashboard/modules/system/service/permission/impl/SysRoleServiceImpl.java
1 1 package cn.iocoder.dashboard.modules.system.service.permission.impl;
2 2  
3 3 import cn.hutool.core.collection.CollectionUtil;
  4 +import cn.iocoder.dashboard.common.enums.CommonStatusEnum;
  5 +import cn.iocoder.dashboard.common.exception.util.ServiceExceptionUtil;
  6 +import cn.iocoder.dashboard.common.pojo.PageResult;
  7 +import cn.iocoder.dashboard.modules.system.controller.permission.vo.role.SysRoleCreateReqVO;
  8 +import cn.iocoder.dashboard.modules.system.controller.permission.vo.role.SysRolePageReqVO;
  9 +import cn.iocoder.dashboard.modules.system.controller.permission.vo.role.SysRoleUpdateReqVO;
  10 +import cn.iocoder.dashboard.modules.system.convert.permission.SysRoleConvert;
4 11 import cn.iocoder.dashboard.modules.system.dal.mysql.dao.permission.SysRoleMapper;
5 12 import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.permission.SysRoleDO;
6 13 import cn.iocoder.dashboard.modules.system.enums.permission.RoleCodeEnum;
  14 +import cn.iocoder.dashboard.modules.system.enums.permission.RoleTypeEnum;
  15 +import cn.iocoder.dashboard.modules.system.service.permission.SysPermissionService;
7 16 import cn.iocoder.dashboard.modules.system.service.permission.SysRoleService;
  17 +import com.baomidou.mybatisplus.core.metadata.IPage;
8 18 import com.google.common.collect.ImmutableMap;
9 19 import lombok.extern.slf4j.Slf4j;
10 20 import org.springframework.stereotype.Service;
  21 +import org.springframework.util.StringUtils;
11 22  
12 23 import javax.annotation.PostConstruct;
13 24 import javax.annotation.Resource;
... ... @@ -17,14 +28,21 @@ import java.util.List;
17 28 import java.util.Map;
18 29 import java.util.stream.Collectors;
19 30  
  31 +import static cn.iocoder.dashboard.modules.system.enums.SysErrorCodeConstants.*;
  32 +
20 33 /**
21 34 * 角色 Service 实现类
  35 + *
  36 + * @author 芋道源码
22 37 */
23 38 @Service
24 39 @Slf4j
25 40 public class SysRoleServiceImpl implements SysRoleService {
26 41  
27 42 @Resource
  43 + private SysPermissionService permissionService;
  44 +
  45 + @Resource
28 46 private SysRoleMapper roleMapper;
29 47  
30 48 /**
... ... @@ -51,11 +69,16 @@ public class SysRoleServiceImpl implements SysRoleService {
51 69 }
52 70  
53 71 @Override
54   - public List<SysRoleDO> listRolesFromCache(Collection<Long> roleIds) {
55   - if (CollectionUtil.isEmpty(roleIds)) {
  72 + public SysRoleDO getRoleFromCache(Long id) {
  73 + return roleCache.get(id);
  74 + }
  75 +
  76 + @Override
  77 + public List<SysRoleDO> listRolesFromCache(Collection<Long> ids) {
  78 + if (CollectionUtil.isEmpty(ids)) {
56 79 return Collections.emptyList();
57 80 }
58   - return roleCache.values().stream().filter(roleDO -> roleIds.contains(roleDO.getId()))
  81 + return roleCache.values().stream().filter(roleDO -> ids.contains(roleDO.getId()))
59 82 .collect(Collectors.toList());
60 83 }
61 84  
... ... @@ -67,4 +90,104 @@ public class SysRoleServiceImpl implements SysRoleService {
67 90 return roleList.stream().anyMatch(roleDO -> RoleCodeEnum.ADMIN.getKey().equals(roleDO.getCode()));
68 91 }
69 92  
  93 + @Override
  94 + public Long createRole(SysRoleCreateReqVO reqVO) {
  95 + // 校验角色
  96 + checkDuplicateRole(reqVO.getName(), reqVO.getCode(), null);
  97 + // 插入到数据库
  98 + SysRoleDO role = SysRoleConvert.INSTANCE.convert(reqVO);
  99 + role.setType(RoleTypeEnum.CUSTOM.getType());
  100 + role.setStatus(CommonStatusEnum.ENABLE.getStatus());
  101 + roleMapper.insert(role);
  102 + // 返回
  103 + return role.getId();
  104 + }
  105 +
  106 + @Override
  107 + public void updateRole(SysRoleUpdateReqVO reqVO) {
  108 + // 校验更新的角色是否存在
  109 + SysRoleDO role = roleMapper.selectById(reqVO.getId());
  110 + if (roleMapper.selectById(reqVO.getId()) == null) {
  111 + throw ServiceExceptionUtil.exception(ROLE_NOT_EXISTS);
  112 + }
  113 + // 内置角色,不允许修改
  114 + if (RoleTypeEnum.SYSTEM.getType().equals(role.getType())) {
  115 + throw ServiceExceptionUtil.exception(ROLE_CAN_NOT_UPDATE_SYSTEM_TYPE_ROLE);
  116 + }
  117 + // 校验角色的唯一字段是否重复
  118 + checkDuplicateRole(reqVO.getName(), reqVO.getCode(), reqVO.getId());
  119 + // 更新到数据库
  120 + SysRoleDO updateObject = SysRoleConvert.INSTANCE.convert(reqVO);
  121 + roleMapper.updateById(updateObject);
  122 + }
  123 +
  124 + @Override
  125 + public void deleteRole(Long id) {
  126 + // 校验删除的角色是否存在
  127 + SysRoleDO roleDO = roleMapper.selectById(id);
  128 + if (roleMapper.selectById(id) == null) {
  129 + throw ServiceExceptionUtil.exception(ROLE_NOT_EXISTS);
  130 + }
  131 + // 内置角色,不允许删除
  132 + if (RoleTypeEnum.SYSTEM.getType().equals(roleDO.getType())) {
  133 + throw ServiceExceptionUtil.exception(ROLE_CAN_NOT_DELETE_SYSTEM_TYPE_ROLE);
  134 + }
  135 + // 标记删除
  136 + roleMapper.deleteById(id);
  137 + // 删除相关数据
  138 + permissionService.processRoleDeleted(id);
  139 + }
  140 +
  141 + @Override
  142 + public SysRoleDO getRole(Long id) {
  143 + return roleMapper.selectById(id);
  144 + }
  145 +
  146 +
  147 + @Override
  148 + public PageResult<SysRoleDO> pageRole(SysRolePageReqVO reqVO) {
  149 + IPage<SysRoleDO> roleDOPage = roleMapper.selectPage(reqVO);
  150 + return SysRoleConvert.INSTANCE.convertPage(roleDOPage);
  151 + }
  152 +
  153 + @Override
  154 + public void updateRoleStatus(Long id, Integer status) {
  155 + // 校验修改的角色是否存在
  156 + SysRoleDO roleDO = roleMapper.selectById(id);
  157 + if (roleMapper.selectById(id) == null) {
  158 + throw ServiceExceptionUtil.exception(ROLE_NOT_EXISTS);
  159 + }
  160 + SysRoleDO updateObject = new SysRoleDO();
  161 + updateObject.setId(id);
  162 + updateObject.setStatus(status);
  163 + roleMapper.updateById(updateObject);
  164 + }
  165 +
  166 + /**
  167 + * 校验角色的唯一字段是否重复
  168 + *
  169 + * 1. 是否存在相同名字的角色
  170 + * 2. 是否存在相同编码的角色
  171 + *
  172 + * @param name 角色名字
  173 + * @param code 角色额编码
  174 + * @param id 角色编号
  175 + */
  176 + private void checkDuplicateRole(String name, String code, Long id) {
  177 + // 1. 该 name 名字被其它角色所使用
  178 + SysRoleDO role = roleMapper.selectByName(name);
  179 + if (role != null && !role.getId().equals(id)) {
  180 + throw ServiceExceptionUtil.exception(ROLE_NAME_DUPLICATE, name);
  181 + }
  182 + // 2. 是否存在相同编码的角色
  183 + if (!StringUtils.hasText(code)) {
  184 + return;
  185 + }
  186 + // 该 code 编码被其它角色所使用
  187 + role = roleMapper.selectByCode(code);
  188 + if (role != null && !role.getId().equals(id)) {
  189 + throw ServiceExceptionUtil.exception(ROLE_CODE_DUPLICATE, name);
  190 + }
  191 + }
  192 +
70 193 }
... ...
src/main/resources/application.yaml
... ... @@ -43,6 +43,7 @@ yudao:
43 43 mybatis-plus:
44 44 configuration:
45 45 map-underscore-to-camel-case: true # 虽然默认为 true ,但是还是显示去指定下。
  46 + log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # 打印日志
46 47 global-config:
47 48 db-config:
48 49 id-type: auto # 自增 ID
... ...