1. 迁移 Role 相关的逻辑

This commit is contained in:
YunaiV 2021-01-09 11:27:11 +08:00
parent 4c3e2bd815
commit 9e59a6c1ae
23 changed files with 546 additions and 410 deletions

View File

@ -3,6 +3,7 @@ package com.ruoyi.generator.util;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashSet; import java.util.HashSet;
import java.util.List; import java.util.List;
import org.apache.velocity.VelocityContext; import org.apache.velocity.VelocityContext;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import com.ruoyi.common.constant.GenConstants; import com.ruoyi.common.constant.GenConstants;
@ -16,15 +17,20 @@ import com.ruoyi.generator.domain.GenTableColumn;
* *
* @author ruoyi * @author ruoyi
*/ */
public class VelocityUtils public class VelocityUtils {
{ /**
/** 项目空间路径 */ * 项目空间路径
*/
private static final String PROJECT_PATH = "main/java"; private static final String PROJECT_PATH = "main/java";
/** mybatis空间路径 */ /**
* mybatis空间路径
*/
private static final String MYBATIS_PATH = "main/resources/mapper"; private static final String MYBATIS_PATH = "main/resources/mapper";
/** 默认上级菜单,系统工具 */ /**
* 默认上级菜单系统工具
*/
private static final String DEFAULT_PARENT_MENU_ID = "3"; private static final String DEFAULT_PARENT_MENU_ID = "3";
/** /**
@ -32,8 +38,7 @@ public class VelocityUtils
* *
* @return 模板列表 * @return 模板列表
*/ */
public static VelocityContext prepareContext(GenTable genTable) public static VelocityContext prepareContext(GenTable genTable) {
{
String moduleName = genTable.getModuleName(); String moduleName = genTable.getModuleName();
String businessName = genTable.getBusinessName(); String businessName = genTable.getBusinessName();
String packageName = genTable.getPackageName(); String packageName = genTable.getPackageName();
@ -59,23 +64,20 @@ public class VelocityUtils
velocityContext.put("columns", genTable.getColumns()); velocityContext.put("columns", genTable.getColumns());
velocityContext.put("table", genTable); velocityContext.put("table", genTable);
setMenuVelocityContext(velocityContext, genTable); setMenuVelocityContext(velocityContext, genTable);
if (GenConstants.TPL_TREE.equals(tplCategory)) if (GenConstants.TPL_TREE.equals(tplCategory)) {
{
setTreeVelocityContext(velocityContext, genTable); setTreeVelocityContext(velocityContext, genTable);
} }
return velocityContext; return velocityContext;
} }
public static void setMenuVelocityContext(VelocityContext context, GenTable genTable) public static void setMenuVelocityContext(VelocityContext context, GenTable genTable) {
{
String options = genTable.getOptions(); String options = genTable.getOptions();
JSONObject paramsObj = JSONObject.parseObject(options); JSONObject paramsObj = JSONObject.parseObject(options);
String parentMenuId = getParentMenuId(paramsObj); String parentMenuId = getParentMenuId(paramsObj);
context.put("parentMenuId", parentMenuId); context.put("parentMenuId", parentMenuId);
} }
public static void setTreeVelocityContext(VelocityContext context, GenTable genTable) public static void setTreeVelocityContext(VelocityContext context, GenTable genTable) {
{
String options = genTable.getOptions(); String options = genTable.getOptions();
JSONObject paramsObj = JSONObject.parseObject(options); JSONObject paramsObj = JSONObject.parseObject(options);
String treeCode = getTreecode(paramsObj); String treeCode = getTreecode(paramsObj);
@ -86,12 +88,10 @@ public class VelocityUtils
context.put("treeParentCode", treeParentCode); context.put("treeParentCode", treeParentCode);
context.put("treeName", treeName); context.put("treeName", treeName);
context.put("expandColumn", getExpandColumn(genTable)); context.put("expandColumn", getExpandColumn(genTable));
if (paramsObj.containsKey(GenConstants.TREE_PARENT_CODE)) if (paramsObj.containsKey(GenConstants.TREE_PARENT_CODE)) {
{
context.put("tree_parent_code", paramsObj.getString(GenConstants.TREE_PARENT_CODE)); context.put("tree_parent_code", paramsObj.getString(GenConstants.TREE_PARENT_CODE));
} }
if (paramsObj.containsKey(GenConstants.TREE_NAME)) if (paramsObj.containsKey(GenConstants.TREE_NAME)) {
{
context.put("tree_name", paramsObj.getString(GenConstants.TREE_NAME)); context.put("tree_name", paramsObj.getString(GenConstants.TREE_NAME));
} }
} }
@ -101,8 +101,7 @@ public class VelocityUtils
* *
* @return 模板列表 * @return 模板列表
*/ */
public static List<String> getTemplateList(String tplCategory) public static List<String> getTemplateList(String tplCategory) {
{
List<String> templates = new ArrayList<String>(); List<String> templates = new ArrayList<String>();
templates.add("vm/java/domain.java.vm"); templates.add("vm/java/domain.java.vm");
templates.add("vm/java/mapper.java.vm"); templates.add("vm/java/mapper.java.vm");
@ -112,12 +111,9 @@ public class VelocityUtils
templates.add("vm/xml/mapper.xml.vm"); templates.add("vm/xml/mapper.xml.vm");
templates.add("vm/sql/sql.vm"); templates.add("vm/sql/sql.vm");
templates.add("vm/js/api.js.vm"); templates.add("vm/js/api.js.vm");
if (GenConstants.TPL_CRUD.equals(tplCategory)) if (GenConstants.TPL_CRUD.equals(tplCategory)) {
{
templates.add("vm/vue/index.vue.vm"); templates.add("vm/vue/index.vue.vm");
} } else if (GenConstants.TPL_TREE.equals(tplCategory)) {
else if (GenConstants.TPL_TREE.equals(tplCategory))
{
templates.add("vm/vue/index-tree.vue.vm"); templates.add("vm/vue/index-tree.vue.vm");
} }
return templates; return templates;
@ -126,8 +122,7 @@ public class VelocityUtils
/** /**
* 获取文件名 * 获取文件名
*/ */
public static String getFileName(String template, GenTable genTable) public static String getFileName(String template, GenTable genTable) {
{
// 文件名称 // 文件名称
String fileName = ""; String fileName = "";
// 包路径 // 包路径
@ -143,44 +138,25 @@ public class VelocityUtils
String mybatisPath = MYBATIS_PATH + "/" + moduleName; String mybatisPath = MYBATIS_PATH + "/" + moduleName;
String vuePath = "vue"; String vuePath = "vue";
if (template.contains("domain.java.vm")) if (template.contains("domain.java.vm")) {
{
fileName = StringUtils.format("{}/domain/{}.java", javaPath, className); fileName = StringUtils.format("{}/domain/{}.java", javaPath, className);
} } else if (template.contains("mapper.java.vm")) {
else if (template.contains("mapper.java.vm"))
{
fileName = StringUtils.format("{}/mapper/{}Mapper.java", javaPath, className); fileName = StringUtils.format("{}/mapper/{}Mapper.java", javaPath, className);
} } else if (template.contains("service.java.vm")) {
else if (template.contains("service.java.vm"))
{
fileName = StringUtils.format("{}/service/I{}Service.java", javaPath, className); fileName = StringUtils.format("{}/service/I{}Service.java", javaPath, className);
} } else if (template.contains("serviceImpl.java.vm")) {
else if (template.contains("serviceImpl.java.vm"))
{
fileName = StringUtils.format("{}/service/impl/{}ServiceImpl.java", javaPath, className); fileName = StringUtils.format("{}/service/impl/{}ServiceImpl.java", javaPath, className);
} } else if (template.contains("controller.java.vm")) {
else if (template.contains("controller.java.vm"))
{
fileName = StringUtils.format("{}/controller/{}Controller.java", javaPath, className); fileName = StringUtils.format("{}/controller/{}Controller.java", javaPath, className);
} } else if (template.contains("mapper.xml.vm")) {
else if (template.contains("mapper.xml.vm"))
{
fileName = StringUtils.format("{}/{}Mapper.xml", mybatisPath, className); fileName = StringUtils.format("{}/{}Mapper.xml", mybatisPath, className);
} } else if (template.contains("sql.vm")) {
else if (template.contains("sql.vm"))
{
fileName = businessName + "Menu.sql"; fileName = businessName + "Menu.sql";
} } else if (template.contains("api.js.vm")) {
else if (template.contains("api.js.vm"))
{
fileName = StringUtils.format("{}/api/{}/{}.js", vuePath, moduleName, businessName); fileName = StringUtils.format("{}/api/{}/{}.js", vuePath, moduleName, businessName);
} } else if (template.contains("index.vue.vm")) {
else if (template.contains("index.vue.vm"))
{
fileName = StringUtils.format("{}/views/{}/{}/index.vue", vuePath, moduleName, businessName); fileName = StringUtils.format("{}/views/{}/{}/index.vue", vuePath, moduleName, businessName);
} } else if (template.contains("index-tree.vue.vm")) {
else if (template.contains("index-tree.vue.vm"))
{
fileName = StringUtils.format("{}/views/{}/{}/index.vue", vuePath, moduleName, businessName); fileName = StringUtils.format("{}/views/{}/{}/index.vue", vuePath, moduleName, businessName);
} }
return fileName; return fileName;
@ -192,8 +168,7 @@ public class VelocityUtils
* @param packageName 包名称 * @param packageName 包名称
* @return 包前缀名称 * @return 包前缀名称
*/ */
public static String getPackagePrefix(String packageName) public static String getPackagePrefix(String packageName) {
{
int lastIndex = packageName.lastIndexOf("."); int lastIndex = packageName.lastIndexOf(".");
String basePackage = StringUtils.substring(packageName, 0, lastIndex); String basePackage = StringUtils.substring(packageName, 0, lastIndex);
return basePackage; return basePackage;
@ -205,18 +180,13 @@ public class VelocityUtils
* @param columns 列集合 * @param columns 列集合
* @return 返回需要导入的包列表 * @return 返回需要导入的包列表
*/ */
public static HashSet<String> getImportList(List<GenTableColumn> columns) public static HashSet<String> getImportList(List<GenTableColumn> columns) {
{
HashSet<String> importList = new HashSet<String>(); HashSet<String> importList = new HashSet<String>();
for (GenTableColumn column : columns) for (GenTableColumn column : columns) {
{ if (!column.isSuperColumn() && GenConstants.TYPE_DATE.equals(column.getJavaType())) {
if (!column.isSuperColumn() && GenConstants.TYPE_DATE.equals(column.getJavaType()))
{
importList.add("java.util.Date"); importList.add("java.util.Date");
importList.add("com.fasterxml.jackson.annotation.JsonFormat"); importList.add("com.fasterxml.jackson.annotation.JsonFormat");
} } else if (!column.isSuperColumn() && GenConstants.TYPE_BIGDECIMAL.equals(column.getJavaType())) {
else if (!column.isSuperColumn() && GenConstants.TYPE_BIGDECIMAL.equals(column.getJavaType()))
{
importList.add("java.math.BigDecimal"); importList.add("java.math.BigDecimal");
} }
} }
@ -226,12 +196,11 @@ public class VelocityUtils
/** /**
* 获取权限前缀 * 获取权限前缀
* *
* @param moduleName 模块名称 * @param moduleName 模块名称
* @param businessName 业务名称 * @param businessName 业务名称
* @return 返回权限前缀 * @return 返回权限前缀
*/ */
public static String getPermissionPrefix(String moduleName, String businessName) public static String getPermissionPrefix(String moduleName, String businessName) {
{
return StringUtils.format("{}:{}", moduleName, businessName); return StringUtils.format("{}:{}", moduleName, businessName);
} }
@ -241,10 +210,8 @@ public class VelocityUtils
* @param paramsObj 生成其他选项 * @param paramsObj 生成其他选项
* @return 上级菜单ID字段 * @return 上级菜单ID字段
*/ */
public static String getParentMenuId(JSONObject paramsObj) public static String getParentMenuId(JSONObject paramsObj) {
{ if (StringUtils.isNotEmpty(paramsObj) && paramsObj.containsKey(GenConstants.PARENT_MENU_ID)) {
if (StringUtils.isNotEmpty(paramsObj) && paramsObj.containsKey(GenConstants.PARENT_MENU_ID))
{
return paramsObj.getString(GenConstants.PARENT_MENU_ID); return paramsObj.getString(GenConstants.PARENT_MENU_ID);
} }
return DEFAULT_PARENT_MENU_ID; return DEFAULT_PARENT_MENU_ID;
@ -256,10 +223,8 @@ public class VelocityUtils
* @param paramsObj 生成其他选项 * @param paramsObj 生成其他选项
* @return 树编码 * @return 树编码
*/ */
public static String getTreecode(JSONObject paramsObj) public static String getTreecode(JSONObject paramsObj) {
{ if (paramsObj.containsKey(GenConstants.TREE_CODE)) {
if (paramsObj.containsKey(GenConstants.TREE_CODE))
{
return StringUtils.toCamelCase(paramsObj.getString(GenConstants.TREE_CODE)); return StringUtils.toCamelCase(paramsObj.getString(GenConstants.TREE_CODE));
} }
return StringUtils.EMPTY; return StringUtils.EMPTY;
@ -271,10 +236,8 @@ public class VelocityUtils
* @param paramsObj 生成其他选项 * @param paramsObj 生成其他选项
* @return 树父编码 * @return 树父编码
*/ */
public static String getTreeParentCode(JSONObject paramsObj) public static String getTreeParentCode(JSONObject paramsObj) {
{ if (paramsObj.containsKey(GenConstants.TREE_PARENT_CODE)) {
if (paramsObj.containsKey(GenConstants.TREE_PARENT_CODE))
{
return StringUtils.toCamelCase(paramsObj.getString(GenConstants.TREE_PARENT_CODE)); return StringUtils.toCamelCase(paramsObj.getString(GenConstants.TREE_PARENT_CODE));
} }
return StringUtils.EMPTY; return StringUtils.EMPTY;
@ -286,10 +249,8 @@ public class VelocityUtils
* @param paramsObj 生成其他选项 * @param paramsObj 生成其他选项
* @return 树名称 * @return 树名称
*/ */
public static String getTreeName(JSONObject paramsObj) public static String getTreeName(JSONObject paramsObj) {
{ if (paramsObj.containsKey(GenConstants.TREE_NAME)) {
if (paramsObj.containsKey(GenConstants.TREE_NAME))
{
return StringUtils.toCamelCase(paramsObj.getString(GenConstants.TREE_NAME)); return StringUtils.toCamelCase(paramsObj.getString(GenConstants.TREE_NAME));
} }
return StringUtils.EMPTY; return StringUtils.EMPTY;
@ -301,20 +262,16 @@ public class VelocityUtils
* @param genTable 业务表对象 * @param genTable 业务表对象
* @return 展开按钮列序号 * @return 展开按钮列序号
*/ */
public static int getExpandColumn(GenTable genTable) public static int getExpandColumn(GenTable genTable) {
{
String options = genTable.getOptions(); String options = genTable.getOptions();
JSONObject paramsObj = JSONObject.parseObject(options); JSONObject paramsObj = JSONObject.parseObject(options);
String treeName = paramsObj.getString(GenConstants.TREE_NAME); String treeName = paramsObj.getString(GenConstants.TREE_NAME);
int num = 0; int num = 0;
for (GenTableColumn column : genTable.getColumns()) for (GenTableColumn column : genTable.getColumns()) {
{ if (column.isList()) {
if (column.isList())
{
num++; num++;
String columnName = column.getColumnName(); String columnName = column.getColumnName();
if (columnName.equals(treeName)) if (columnName.equals(treeName)) {
{
break; break;
} }
} }

View File

@ -129,94 +129,6 @@ public class SysRoleServiceImpl implements ISysRoleService
return UserConstants.UNIQUE; return UserConstants.UNIQUE;
} }
/**
* 校验角色权限是否唯一
*
* @param role 角色信息
* @return 结果
*/
@Override
public String checkRoleKeyUnique(SysRole role)
{
Long roleId = StringUtils.isNull(role.getRoleId()) ? -1L : role.getRoleId();
SysRole info = roleMapper.checkRoleKeyUnique(role.getRoleKey());
if (StringUtils.isNotNull(info) && info.getRoleId().longValue() != roleId.longValue())
{
return UserConstants.NOT_UNIQUE;
}
return UserConstants.UNIQUE;
}
/**
* 校验角色是否允许操作
*
* @param role 角色信息
*/
@Override
public void checkRoleAllowed(SysRole role)
{
if (StringUtils.isNotNull(role.getRoleId()) && role.isAdmin())
{
throw new CustomException("不允许操作超级管理员角色");
}
}
/**
* 通过角色ID查询角色使用数量
*
* @param roleId 角色ID
* @return 结果
*/
@Override
public int countUserRoleByRoleId(Long roleId)
{
return userRoleMapper.countUserRoleByRoleId(roleId);
}
/**
* 新增保存角色信息
*
* @param role 角色信息
* @return 结果
*/
@Override
@Transactional
public int insertRole(SysRole role)
{
// 新增角色信息
roleMapper.insertRole(role);
return insertRoleMenu(role);
}
/**
* 修改保存角色信息
*
* @param role 角色信息
* @return 结果
*/
@Override
@Transactional
public int updateRole(SysRole role)
{
// 修改角色信息
roleMapper.updateRole(role);
// 删除角色与菜单关联
roleMenuMapper.deleteRoleMenuByRoleId(role.getRoleId());
return insertRoleMenu(role);
}
/**
* 修改角色状态
*
* @param role 角色信息
* @return 结果
*/
@Override
public int updateRoleStatus(SysRole role)
{
return roleMapper.updateRole(role);
}
/** /**
* 修改数据权限信息 * 修改数据权限信息
* *

View File

@ -1,7 +1,10 @@
package cn.iocoder.dashboard.framework.mybatis.config; package cn.iocoder.dashboard.framework.mybatis.config;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Mapper;
import org.mybatis.spring.annotation.MapperScan; import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
/** /**
@ -12,4 +15,12 @@ import org.springframework.context.annotation.Configuration;
@Configuration @Configuration
@MapperScan(value = "cn.iocoder.dashboard", annotationClass = Mapper.class) @MapperScan(value = "cn.iocoder.dashboard", annotationClass = Mapper.class)
public class MybatisConfiguration { public class MybatisConfiguration {
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();
mybatisPlusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor()); // 分页插件
return mybatisPlusInterceptor;
}
} }

View File

@ -0,0 +1,33 @@
package cn.iocoder.dashboard.framework.mybatis.core.util;
import cn.hutool.core.collection.CollectionUtil;
import cn.iocoder.dashboard.common.pojo.PageParam;
import cn.iocoder.dashboard.common.pojo.SortingField;
import com.baomidou.mybatisplus.core.metadata.OrderItem;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import java.util.Collection;
import java.util.stream.Collectors;
/**
* MyBatis 工具类
*/
public class MyBatisUtils {
public static <T> Page<T> buildPage(PageParam pageParam) {
return buildPage(pageParam, null);
}
public static <T> Page<T> buildPage(PageParam pageParam, Collection<SortingField> sortingFields) {
// 页码 + 数量
Page<T> page = new Page<>(pageParam.getPageNo(), pageParam.getPageSize());
// 排序字段
if (!CollectionUtil.isEmpty(sortingFields)) {
page.addOrder(sortingFields.stream().map(sortingField -> SortingField.ORDER_ASC.equals(sortingField.getOrder()) ?
OrderItem.asc(sortingField.getField()) : OrderItem.desc(sortingField.getField()))
.collect(Collectors.toList()));
}
return page;
}
}

View File

@ -15,10 +15,10 @@ import lombok.Getter;
public enum DataScopeEnum { public enum DataScopeEnum {
ALL(1), // 全部数据权限 ALL(1), // 全部数据权限
CUSTOM(2), // 自定数据权限 DEPT_CUSTOM(2), // 指定部门数据权限
DEPT(3), // 部门数据权限 DEPT_ONLY(3), // 部门数据权限
DEPT_AND_CHILD(4), // 部门及以下数据权限 DEPT_AND_CHILD(4), // 部门及以下数据权限
SELF(5); // 仅本人数据权限 DEPT_SELF(5); // 仅本人数据权限
/** /**
* 范围 * 范围

View File

@ -9,6 +9,7 @@ import cn.iocoder.dashboard.modules.system.convert.permission.SysMenuConvert;
import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.permission.SysMenuDO; import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.permission.SysMenuDO;
import cn.iocoder.dashboard.modules.system.service.permission.SysMenuService; import cn.iocoder.dashboard.modules.system.service.permission.SysMenuService;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiOperation;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
@ -65,7 +66,7 @@ public class SysMenuController {
// return ajax; // return ajax;
// } // }
@ApiOperation("新增菜单") @ApiOperation("创建菜单")
// @PreAuthorize("@ss.hasPermi('system:menu:add')") // @PreAuthorize("@ss.hasPermi('system:menu:add')")
// @Log(title = "菜单管理", businessType = BusinessType.INSERT) // @Log(title = "菜单管理", businessType = BusinessType.INSERT)
@PostMapping("/create") @PostMapping("/create")
@ -85,6 +86,7 @@ public class SysMenuController {
@ApiOperation("删除菜单") @ApiOperation("删除菜单")
@PostMapping("/delete") @PostMapping("/delete")
@ApiImplicitParam(name = "id", value = "角色编号", required= true, example = "1024")
// @Log(title = "菜单管理", businessType = BusinessType.DELETE) // @Log(title = "菜单管理", businessType = BusinessType.DELETE)
public CommonResult<Boolean> deleteMenu(@RequestParam("id") Long id) { public CommonResult<Boolean> deleteMenu(@RequestParam("id") Long id) {
menuService.deleteMenu(id); menuService.deleteMenu(id);

View File

@ -0,0 +1,41 @@
### /role/create 成功
POST {{baseUrl}}/system/role/create
Authorization: Bearer {{token}}
Content-Type: application/json
{
"name": "测试角色",
"code": "test",
"sort": 0
}
### /role/update 成功
POST {{baseUrl}}/system/role/update
Authorization: Bearer {{token}}
Content-Type: application/json
{
"id": 100,
"name": "测试角色",
"code": "test",
"sort": 10
}
### /resource/delete 成功
POST {{baseUrl}}/system/role/delete
Content-Type: application/x-www-form-urlencoded
Authorization: Bearer {{token}}
roleId=14
### /role/get 成功
GET {{baseUrl}}/system/role/get?id=100
Content-Type: application/x-www-form-urlencoded
Authorization: Bearer {{token}}
### /role/page 成功
GET {{baseUrl}}/system/role/page?pageNo=1&pageSize=10
Authorization: Bearer {{token}}
###

View File

@ -1,23 +1,75 @@
package cn.iocoder.dashboard.modules.system.controller.permission; package cn.iocoder.dashboard.modules.system.controller.permission;
import cn.iocoder.dashboard.common.pojo.CommonResult;
import cn.iocoder.dashboard.common.pojo.PageResult;
import cn.iocoder.dashboard.modules.system.controller.permission.vo.role.SysRoleCreateReqVO;
import cn.iocoder.dashboard.modules.system.controller.permission.vo.role.SysRolePageReqVO;
import cn.iocoder.dashboard.modules.system.controller.permission.vo.role.SysRoleRespVO;
import cn.iocoder.dashboard.modules.system.controller.permission.vo.role.SysRoleUpdateReqVO;
import cn.iocoder.dashboard.modules.system.convert.permission.SysRoleConvert;
import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.permission.SysRoleDO;
import cn.iocoder.dashboard.modules.system.service.permission.SysRoleService;
import io.swagger.annotations.Api; import io.swagger.annotations.Api;
import org.springframework.web.bind.annotation.RequestMapping; import io.swagger.annotations.ApiImplicitParam;
import org.springframework.web.bind.annotation.RestController; import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import static cn.iocoder.dashboard.common.pojo.CommonResult.success;
@Api(tags = "角色 API") @Api(tags = "角色 API")
@RestController @RestController
@RequestMapping("/system/role") @RequestMapping("/system/role")
public class SysRoleController { public class SysRoleController {
@Resource
private SysRoleService roleService;
@ApiOperation("获得角色分页")
@GetMapping("/page")
// @PreAuthorize("@ss.hasPermi('system:role:list')") // @PreAuthorize("@ss.hasPermi('system:role:list')")
// @GetMapping("/list") public CommonResult<PageResult<SysRoleDO>> list(SysRolePageReqVO reqVO) {
// public TableDataInfo list(SysRole role) return success(roleService.pageRole(reqVO));
// { }
// startPage();
// List<SysRole> list = roleService.selectRoleList(role); @ApiOperation("创建角色")
// return getDataTable(list); @PostMapping("/create")
// } // @PreAuthorize("@ss.hasPermi('system:role:add')")
// // @Log(title = "角色管理", businessType = BusinessType.INSERT)
public CommonResult<Long> add(@Validated @RequestBody SysRoleCreateReqVO reqVO) {
return success(roleService.createRole(reqVO));
}
@ApiOperation("修改角色")
// @PreAuthorize("@ss.hasPermi('system:role:edit')")
// @Log(title = "角色管理", businessType = BusinessType.UPDATE)
@PostMapping("/update")
public CommonResult<Boolean> update(@Validated @RequestBody SysRoleUpdateReqVO reqVO) {
roleService.updateRole(reqVO);
return success(true);
}
@ApiOperation("删除角色")
@PostMapping("/delete")
@ApiImplicitParam(name = "id", value = "角色编号", required = true, example = "1024")
// @PreAuthorize("@ss.hasPermi('system:role:remove')")
// @Log(title = "角色管理", businessType = BusinessType.DELETE)
public CommonResult<Boolean> remove(@RequestParam("id") Long id) {
roleService.deleteRole(id);
return success(true);
}
@ApiOperation("获得角色信息")
@GetMapping("/get")
// @PreAuthorize("@ss.hasPermi('system:role:query')")
public CommonResult<SysRoleRespVO> getRole(@RequestParam("id") Long id) {
SysRoleDO role = roleService.getRole(id);
return success(SysRoleConvert.INSTANCE.convert(role));
}
// @Log(title = "角色管理", businessType = BusinessType.EXPORT) // @Log(title = "角色管理", businessType = BusinessType.EXPORT)
// @PreAuthorize("@ss.hasPermi('system:role:export')") // @PreAuthorize("@ss.hasPermi('system:role:export')")
// @GetMapping("/export") // @GetMapping("/export")
@ -27,71 +79,20 @@ public class SysRoleController {
// ExcelUtil<SysRole> util = new ExcelUtil<SysRole>(SysRole.class); // ExcelUtil<SysRole> util = new ExcelUtil<SysRole>(SysRole.class);
// return util.exportExcel(list, "角色数据"); // return util.exportExcel(list, "角色数据");
// } // }
//
// /** @ApiOperation("修改角色状态")
// * 根据角色编号获取详细信息 @PostMapping("/update-status")
// */ @ApiImplicitParams(value = {
// @PreAuthorize("@ss.hasPermi('system:role:query')") @ApiImplicitParam(name = "id", value = "角色编号", required = true, example = "1024"),
// @GetMapping(value = "/{roleId}") @ApiImplicitParam(name = "status", value = "状态", required = true, example = "1")
// public AjaxResult getInfo(@PathVariable Long roleId) })
// {
// return AjaxResult.success(roleService.selectRoleById(roleId));
// }
//
// /**
// * 新增角色
// */
// @PreAuthorize("@ss.hasPermi('system:role:add')")
// @Log(title = "角色管理", businessType = BusinessType.INSERT)
// @PostMapping
// public AjaxResult add(@Validated @RequestBody SysRole role)
// {
// if (UserConstants.NOT_UNIQUE.equals(roleService.checkRoleNameUnique(role)))
// {
// return AjaxResult.error("新增角色'" + role.getRoleName() + "'失败,角色名称已存在");
// }
// else if (UserConstants.NOT_UNIQUE.equals(roleService.checkRoleKeyUnique(role)))
// {
// return AjaxResult.error("新增角色'" + role.getRoleName() + "'失败,角色权限已存在");
// }
// role.setCreateBy(SecurityUtils.getUsername());
// return toAjax(roleService.insertRole(role));
//
// }
//
// /**
// * 修改保存角色
// */
// @PreAuthorize("@ss.hasPermi('system:role:edit')") // @PreAuthorize("@ss.hasPermi('system:role:edit')")
// @Log(title = "角色管理", businessType = BusinessType.UPDATE) // @Log(title = "角色管理", businessType = BusinessType.UPDATE)
// @PutMapping public CommonResult<Boolean> updateRoleStatus(@RequestParam("id") Long id, @RequestParam("status") Integer status) {
// public AjaxResult edit(@Validated @RequestBody SysRole role) roleService.updateRoleStatus(id, status);
// { return success(true);
// roleService.checkRoleAllowed(role); }
// if (UserConstants.NOT_UNIQUE.equals(roleService.checkRoleNameUnique(role)))
// {
// return AjaxResult.error("修改角色'" + role.getRoleName() + "'失败,角色名称已存在");
// }
// else if (UserConstants.NOT_UNIQUE.equals(roleService.checkRoleKeyUnique(role)))
// {
// return AjaxResult.error("修改角色'" + role.getRoleName() + "'失败,角色权限已存在");
// }
// role.setUpdateBy(SecurityUtils.getUsername());
//
// if (roleService.updateRole(role) > 0)
// {
// // 更新缓存用户权限
// LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
// if (StringUtils.isNotNull(loginUser.getUser()) && !loginUser.getUser().isAdmin())
// {
// loginUser.setPermissions(permissionService.getMenuPermission(loginUser.getUser()));
// loginUser.setUser(userService.selectUserByUserName(loginUser.getUser().getUserName()));
// tokenService.setLoginUser(loginUser);
// }
// return AjaxResult.success();
// }
// return AjaxResult.error("修改角色'" + role.getRoleName() + "'失败,请联系管理员");
// }
// //
// /** // /**
// * 修改保存数据权限 // * 修改保存数据权限
@ -104,30 +105,8 @@ public class SysRoleController {
// roleService.checkRoleAllowed(role); // roleService.checkRoleAllowed(role);
// return toAjax(roleService.authDataScope(role)); // return toAjax(roleService.authDataScope(role));
// } // }
//
// /**
// * 状态修改
// */
// @PreAuthorize("@ss.hasPermi('system:role:edit')")
// @Log(title = "角色管理", businessType = BusinessType.UPDATE)
// @PutMapping("/changeStatus")
// public AjaxResult changeStatus(@RequestBody SysRole role)
// {
// roleService.checkRoleAllowed(role);
// role.setUpdateBy(SecurityUtils.getUsername());
// return toAjax(roleService.updateRoleStatus(role));
// }
//
// /**
// * 删除角色
// */
// @PreAuthorize("@ss.hasPermi('system:role:remove')")
// @Log(title = "角色管理", businessType = BusinessType.DELETE)
// @DeleteMapping("/{roleIds}")
// public AjaxResult remove(@PathVariable Long[] roleIds)
// {
// return toAjax(roleService.deleteRoleByIds(roleIds));
// }
// //
// /** // /**
// * 获取角色选择框列表 // * 获取角色选择框列表

View File

@ -1,13 +0,0 @@
package cn.iocoder.dashboard.modules.system.controller.permission.vo.role;
import cn.iocoder.dashboard.common.pojo.PageParam;
import io.swagger.annotations.ApiModel;
import lombok.Data;
import lombok.EqualsAndHashCode;
@ApiModel("角色分页 Request VO")
@Data
@EqualsAndHashCode(callSuper = true)
public class SysMenuPageReqVO extends PageParam {
}

View File

@ -0,0 +1,20 @@
package cn.iocoder.dashboard.modules.system.controller.permission.vo.role;
import cn.iocoder.dashboard.common.pojo.PageParam;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
@ApiModel("角色分页 Request VO")
@Data
@EqualsAndHashCode(callSuper = true)
public class SysRolePageReqVO extends PageParam {
@ApiModelProperty(value = "角色名称", example = "芋道", notes = "模糊匹配")
private String name;
@ApiModelProperty(value = "展示状态", example = "1", notes = "参见 SysCommonStatusEnum 枚举类")
private Integer status;
}

View File

@ -0,0 +1,27 @@
package cn.iocoder.dashboard.modules.system.convert.permission;
import cn.iocoder.dashboard.common.pojo.PageResult;
import cn.iocoder.dashboard.modules.system.controller.permission.vo.role.SysRoleCreateReqVO;
import cn.iocoder.dashboard.modules.system.controller.permission.vo.role.SysRoleRespVO;
import cn.iocoder.dashboard.modules.system.controller.permission.vo.role.SysRoleUpdateReqVO;
import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.permission.SysRoleDO;
import com.baomidou.mybatisplus.core.metadata.IPage;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.factory.Mappers;
@Mapper
public interface SysRoleConvert {
SysRoleConvert INSTANCE = Mappers.getMapper(SysRoleConvert.class);
SysRoleDO convert(SysRoleUpdateReqVO bean);
SysRoleRespVO convert(SysRoleDO bean);
@Mapping(source = "records", target = "list")
PageResult<SysRoleDO> convertPage(IPage<SysRoleDO> page);
SysRoleDO convert(SysRoleCreateReqVO bean);
}

View File

@ -1,9 +0,0 @@
package cn.iocoder.dashboard.modules.system.dal.mysql.dao.permission;
import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.permission.SysRoleDeptDO;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface SysRoleDeptMapper extends BaseMapper<SysRoleDeptDO> {
}

View File

@ -1,9 +1,29 @@
package cn.iocoder.dashboard.modules.system.dal.mysql.dao.permission; package cn.iocoder.dashboard.modules.system.dal.mysql.dao.permission;
import cn.iocoder.dashboard.framework.mybatis.core.query.QueryWrapperX;
import cn.iocoder.dashboard.framework.mybatis.core.util.MyBatisUtils;
import cn.iocoder.dashboard.modules.system.controller.permission.vo.role.SysRolePageReqVO;
import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.permission.SysRoleDO; import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.permission.SysRoleDO;
import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Mapper;
@Mapper @Mapper
public interface SysRoleMapper extends BaseMapper<SysRoleDO> { public interface SysRoleMapper extends BaseMapper<SysRoleDO> {
default IPage<SysRoleDO> selectPage(SysRolePageReqVO reqVO) {
return selectPage(MyBatisUtils.buildPage(reqVO),
new QueryWrapperX<SysRoleDO>().likeIfPresent("name", reqVO.getName())
.eqIfPresent("status", reqVO.getStatus()));
}
default SysRoleDO selectByName(String name) {
return selectOne(new QueryWrapperX<SysRoleDO>().eq("name", name));
}
default SysRoleDO selectByCode(String code) {
return selectOne(new QueryWrapperX<SysRoleDO>().eq("code", code));
}
} }

View File

@ -5,17 +5,21 @@ import cn.iocoder.dashboard.framework.mybatis.core.dataobject.BaseDO;
import cn.iocoder.dashboard.framework.security.core.enums.DataScopeEnum; import cn.iocoder.dashboard.framework.security.core.enums.DataScopeEnum;
import cn.iocoder.dashboard.modules.system.enums.permission.RoleCodeEnum; import cn.iocoder.dashboard.modules.system.enums.permission.RoleCodeEnum;
import cn.iocoder.dashboard.modules.system.enums.permission.RoleTypeEnum; import cn.iocoder.dashboard.modules.system.enums.permission.RoleTypeEnum;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName; import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.extension.handlers.FastjsonTypeHandler;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
import java.util.List;
/** /**
* 角色 DO * 角色 DO
* *
* @author ruoyi * @author ruoyi
*/ */
@TableName("sys_role") @TableName(value = "sys_role", autoResultMap = true)
@Data @Data
@EqualsAndHashCode(callSuper = true) @EqualsAndHashCode(callSuper = true)
public class SysRoleDO extends BaseDO { public class SysRoleDO extends BaseDO {
@ -39,18 +43,12 @@ public class SysRoleDO extends BaseDO {
* 角色排序 * 角色排序
*/ */
private Integer sort; private Integer sort;
/**
* 数据范围
*
* 枚举类 {@link DataScopeEnum}
*/
private Integer dataScope;
/** /**
* 角色状态 * 角色状态
* *
* 枚举 {@link CommonStatusEnum} * 枚举 {@link CommonStatusEnum}
*/ */
private String status; private Integer status;
/** /**
* 角色类型 * 角色类型
* *
@ -63,13 +61,17 @@ public class SysRoleDO extends BaseDO {
private String remark; private String remark;
/** /**
* 菜单树选择项是否关联显示 0父子不互相关联显示 1父子互相关联显示 * 数据范围
*
* 枚举 {@link DataScopeEnum}
*/ */
private boolean menuCheckStrictly; private Integer dataScope;
/** /**
* 部门树选择项是否关联显示0父子不互相关联显示 1父子互相关联显示 * 数据范围(指定部门数组)
*
* 适用于 {@link #dataScope} 的值为 {@link DataScopeEnum#DEPT_CUSTOM}
*/ */
private boolean deptCheckStrictly; @TableField(typeHandler = FastjsonTypeHandler.class)
private List<Long> dataScopeDeptIds;
} }

View File

@ -1,33 +0,0 @@
package cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.permission;
import cn.iocoder.dashboard.framework.mybatis.core.dataobject.BaseDO;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* 部门和角色关联 DO
*
* @author ruoyi
*/
@TableName("sys_role_dept")
@Data
@EqualsAndHashCode(callSuper = true)
public class SysRoleDeptDO extends BaseDO {
/**
* 自增主键
*/
@TableId
private Long id;
/**
* 部门 ID
*/
private Long deptId;
/**
* 角色 ID
*/
private Long roleId;
}

View File

@ -26,4 +26,11 @@ public interface SysErrorCodeConstants {
ErrorCode MENU_EXISTS_CHILDREN = new ErrorCode(1002002004, "存在子菜单,无法删除"); ErrorCode MENU_EXISTS_CHILDREN = new ErrorCode(1002002004, "存在子菜单,无法删除");
ErrorCode MENU_PARENT_NOT_DIR_OR_MENU = new ErrorCode(1002002005, "父菜单的类型必须是目录或者菜单"); ErrorCode MENU_PARENT_NOT_DIR_OR_MENU = new ErrorCode(1002002005, "父菜单的类型必须是目录或者菜单");
// ========== 角色模块 1002003000 ==========
ErrorCode ROLE_NOT_EXISTS = new ErrorCode(1002003000, "角色不存在");
ErrorCode ROLE_NAME_DUPLICATE = new ErrorCode(1002003001, "已经存在名为【{}}】的角色");
ErrorCode ROLE_CODE_DUPLICATE = new ErrorCode(1002003002, "已经存在编码为【{}}】的角色");
ErrorCode ROLE_CAN_NOT_UPDATE_SYSTEM_TYPE_ROLE = new ErrorCode(1002003004, "不能修改类型为系统内置的角色");
ErrorCode ROLE_CAN_NOT_DELETE_SYSTEM_TYPE_ROLE = new ErrorCode(1002003005, "不能删除类型为系统内置的角色");
} }

View File

@ -5,22 +5,14 @@ import cn.hutool.core.util.StrUtil;
import cn.iocoder.dashboard.common.enums.CommonStatusEnum; import cn.iocoder.dashboard.common.enums.CommonStatusEnum;
import cn.iocoder.dashboard.framework.security.config.SecurityProperties; import cn.iocoder.dashboard.framework.security.config.SecurityProperties;
import cn.iocoder.dashboard.framework.security.core.LoginUser; import cn.iocoder.dashboard.framework.security.core.LoginUser;
import cn.iocoder.dashboard.modules.system.controller.auth.vo.SysAuthMenuRespVO;
import cn.iocoder.dashboard.modules.system.controller.auth.vo.SysAuthPermissionInfoRespVO;
import cn.iocoder.dashboard.modules.system.convert.auth.SysAuthConvert; import cn.iocoder.dashboard.modules.system.convert.auth.SysAuthConvert;
import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.permission.SysMenuDO;
import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.permission.SysRoleDO;
import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.user.SysUserDO; import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.user.SysUserDO;
import cn.iocoder.dashboard.modules.system.dal.redis.dao.auth.SysLoginUserRedisDAO; import cn.iocoder.dashboard.modules.system.dal.redis.dao.auth.SysLoginUserRedisDAO;
import cn.iocoder.dashboard.modules.system.enums.permission.MenuTypeEnum;
import cn.iocoder.dashboard.modules.system.enums.user.UserStatus; import cn.iocoder.dashboard.modules.system.enums.user.UserStatus;
import cn.iocoder.dashboard.modules.system.service.auth.SysAuthService; import cn.iocoder.dashboard.modules.system.service.auth.SysAuthService;
import cn.iocoder.dashboard.modules.system.service.auth.SysTokenService; import cn.iocoder.dashboard.modules.system.service.auth.SysTokenService;
import cn.iocoder.dashboard.modules.system.service.permission.SysPermissionService; import cn.iocoder.dashboard.modules.system.service.permission.SysPermissionService;
import cn.iocoder.dashboard.modules.system.service.permission.SysRoleService;
import cn.iocoder.dashboard.modules.system.service.user.SysUserService; import cn.iocoder.dashboard.modules.system.service.user.SysUserService;
import cn.iocoder.dashboard.util.collection.CollectionUtils;
import cn.iocoder.dashboard.util.collection.SetUtils;
import cn.iocoder.dashboard.util.date.DateUtils; import cn.iocoder.dashboard.util.date.DateUtils;
import io.jsonwebtoken.Claims; import io.jsonwebtoken.Claims;
import io.jsonwebtoken.JwtException; import io.jsonwebtoken.JwtException;
@ -37,9 +29,8 @@ import org.springframework.stereotype.Service;
import org.springframework.util.Assert; import org.springframework.util.Assert;
import javax.annotation.Resource; import javax.annotation.Resource;
import java.util.Collections;
import java.util.Date; import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Set; import java.util.Set;
import static cn.iocoder.dashboard.common.exception.util.ServiceExceptionUtil.exception; import static cn.iocoder.dashboard.common.exception.util.ServiceExceptionUtil.exception;
@ -64,8 +55,6 @@ public class SysAuthServiceImpl implements SysAuthService {
@Resource @Resource
private SysUserService userService; private SysUserService userService;
@Resource @Resource
private SysRoleService roleService;
@Resource
private SysPermissionService permissionService; private SysPermissionService permissionService;
@Resource @Resource
@ -92,7 +81,7 @@ public class SysAuthServiceImpl implements SysAuthService {
// 创建 LoginUser 对象 // 创建 LoginUser 对象
LoginUser loginUser = SysAuthConvert.INSTANCE.convert(user); LoginUser loginUser = SysAuthConvert.INSTANCE.convert(user);
loginUser.setUpdateTime(new Date()); loginUser.setUpdateTime(new Date());
loginUser.setRoleIds(this.getUserRoleIds(loginUser.getUserId(), loginUser.getDeptId())); loginUser.setRoleIds(this.getUserRoleIds(loginUser.getUserId()));
return loginUser; return loginUser;
} }
@ -106,7 +95,7 @@ public class SysAuthServiceImpl implements SysAuthService {
// 缓存登陆用户到 Redis // 缓存登陆用户到 Redis
String sessionId = IdUtil.fastSimpleUUID(); String sessionId = IdUtil.fastSimpleUUID();
loginUser.setUpdateTime(new Date()); loginUser.setUpdateTime(new Date());
loginUser.setRoleIds(this.getUserRoleIds(loginUser.getUserId(), loginUser.getDeptId())); loginUser.setRoleIds(this.getUserRoleIds(loginUser.getUserId()));
loginUserRedisDAO.set(sessionId, loginUser); loginUserRedisDAO.set(sessionId, loginUser);
// 创建 Token // 创建 Token
@ -156,15 +145,10 @@ public class SysAuthServiceImpl implements SysAuthService {
* 获得 User 拥有的角色编号数组 * 获得 User 拥有的角色编号数组
* *
* @param userId 用户编号 * @param userId 用户编号
* @param deptId 科室编号
* @return 角色编号数组 * @return 角色编号数组
*/ */
private Set<Long> getUserRoleIds(Long userId, Long deptId) { private Set<Long> getUserRoleIds(Long userId) {
// 用户拥有的角色 return permissionService.listUserRoleIds(userId, Collections.singleton(CommonStatusEnum.ENABLE.getStatus()));
Set<Long> roleIds = new HashSet<>(permissionService.listUserRoleIds(userId));
// 部门拥有的角色
CollectionUtils.addIfNotNull(roleIds, permissionService.getDeptRoleId(deptId));
return roleIds;
} }
@Override @Override
@ -222,7 +206,7 @@ public class SysAuthServiceImpl implements SysAuthService {
// 刷新 LoginUser 缓存 // 刷新 LoginUser 缓存
loginUser.setDeptId(user.getDeptId()); loginUser.setDeptId(user.getDeptId());
loginUser.setUpdateTime(new Date()); loginUser.setUpdateTime(new Date());
loginUser.setRoleIds(this.getUserRoleIds(loginUser.getUserId(), loginUser.getDeptId())); loginUser.setRoleIds(this.getUserRoleIds(loginUser.getUserId()));
loginUserRedisDAO.set(sessionId, loginUser); loginUserRedisDAO.set(sessionId, loginUser);
} }

View File

@ -2,8 +2,10 @@ package cn.iocoder.dashboard.modules.system.service.permission;
import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.permission.SysMenuDO; import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.permission.SysMenuDO;
import javax.annotation.Nullable;
import java.util.Collection; import java.util.Collection;
import java.util.List; import java.util.List;
import java.util.Set;
/** /**
* 权限 Service 接口 * 权限 Service 接口
@ -33,26 +35,26 @@ public interface SysPermissionService {
Collection<Integer> menusStatuses); Collection<Integer> menusStatuses);
/** /**
* 获得用户拥有的角色编号数组 * 获得用户拥有的角色编号集合
* *
* @param userId 用户编号 * @param userId 用户编号
* @return 角色编号数组 * @param roleStatuses 角色状态集合. 允许为空为空时不过滤
* @return 角色编号集合
*/ */
List<Long> listUserRoleIds(Long userId); Set<Long> listUserRoleIds(Long userId, @Nullable Collection<Integer> roleStatuses);
/** /**
* 获得部门拥有的角色编号 * 处理角色删除时删除关联授权角色
* *
* @param deptId 部门编号 * @param roleId 角色编号
* @return 角色编号
*/ */
Long getDeptRoleId(Long deptId); void processRoleDeleted(Long roleId);
/** /**
* 删除授予给角色的菜单们 * 处理菜单删除时删除关联授权数据
* *
* @param menuId 菜单编号 * @param menuId 菜单编号
*/ */
void deleteRolesMenuByMenuId(Long menuId); void processMenuDeleted(Long menuId);
} }

View File

@ -1,5 +1,9 @@
package cn.iocoder.dashboard.modules.system.service.permission; package cn.iocoder.dashboard.modules.system.service.permission;
import cn.iocoder.dashboard.common.pojo.PageResult;
import cn.iocoder.dashboard.modules.system.controller.permission.vo.role.SysRoleCreateReqVO;
import cn.iocoder.dashboard.modules.system.controller.permission.vo.role.SysRolePageReqVO;
import cn.iocoder.dashboard.modules.system.controller.permission.vo.role.SysRoleUpdateReqVO;
import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.permission.SysRoleDO; import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.permission.SysRoleDO;
import java.util.Collection; import java.util.Collection;
@ -17,13 +21,21 @@ public interface SysRoleService {
*/ */
void init(); void init();
/**
* 获得角色从缓存中
*
* @param id 角色编号
* @return 角色
*/
SysRoleDO getRoleFromCache(Long id);
/** /**
* 获得角色数组从缓存中 * 获得角色数组从缓存中
* *
* @param roleIds 角色编号数组 * @param ids 角色编号数组
* @return 角色数组 * @return 角色数组
*/ */
List<SysRoleDO> listRolesFromCache(Collection<Long> roleIds); List<SysRoleDO> listRolesFromCache(Collection<Long> ids);
/** /**
* 判断角色数组中是否有管理员 * 判断角色数组中是否有管理员
@ -33,4 +45,50 @@ public interface SysRoleService {
*/ */
boolean hasAnyAdmin(Collection<SysRoleDO> roleList); boolean hasAnyAdmin(Collection<SysRoleDO> roleList);
/**
* 创建角色
*
* @param reqVO 创建角色信息
* @return 角色编号
*/
Long createRole(SysRoleCreateReqVO reqVO);
/**
* 更新角色
*
* @param reqVO 更新角色信息
*/
void updateRole(SysRoleUpdateReqVO reqVO);
/**
* 删除角色
*
* @param id 角色编号
*/
void deleteRole(Long id);
/**
* 获得角色
*
* @param id 角色编号
* @return 角色
*/
SysRoleDO getRole(Long id);
/**
* 获得角色分页
*
* @param reqVO 角色分页查询
* @return 角色分页结果
*/
PageResult<SysRoleDO> pageRole(SysRolePageReqVO reqVO);
/**
* 更新角色状态
*
* @param id 角色编号
* @param status 状态
*/
void updateRoleStatus(Long id, Integer status);
} }

View File

@ -160,7 +160,7 @@ public class SysMenuServiceImpl implements SysMenuService {
// 标记删除 // 标记删除
menuMapper.deleteById(menuId); menuMapper.deleteById(menuId);
// 删除授予给角色的权限 // 删除授予给角色的权限
permissionService.deleteRolesMenuByMenuId(menuId); permissionService.processMenuDeleted(menuId);
} }
@Override @Override

View File

@ -1,9 +1,12 @@
package cn.iocoder.dashboard.modules.system.service.permission.impl; package cn.iocoder.dashboard.modules.system.service.permission.impl;
import cn.iocoder.dashboard.modules.system.dal.mysql.dao.permission.SysRoleDeptMapper; import cn.hutool.core.collection.CollectionUtil;
import cn.iocoder.dashboard.modules.system.dal.mysql.dao.permission.SysRoleMenuMapper; import cn.iocoder.dashboard.modules.system.dal.mysql.dao.permission.SysRoleMenuMapper;
import cn.iocoder.dashboard.modules.system.dal.mysql.dao.permission.SysUserRoleMapper; import cn.iocoder.dashboard.modules.system.dal.mysql.dao.permission.SysUserRoleMapper;
import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.permission.*; import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.permission.SysMenuDO;
import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.permission.SysRoleDO;
import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.permission.SysRoleMenuDO;
import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.permission.SysUserRoleDO;
import cn.iocoder.dashboard.modules.system.service.permission.SysMenuService; import cn.iocoder.dashboard.modules.system.service.permission.SysMenuService;
import cn.iocoder.dashboard.modules.system.service.permission.SysPermissionService; import cn.iocoder.dashboard.modules.system.service.permission.SysPermissionService;
import cn.iocoder.dashboard.modules.system.service.permission.SysRoleService; import cn.iocoder.dashboard.modules.system.service.permission.SysRoleService;
@ -19,11 +22,12 @@ import javax.annotation.Resource;
import java.util.Collection; import java.util.Collection;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
import java.util.Set;
/** /**
* 权限 Service 实现类 * 权限 Service 实现类
* *
* @author 初始化 * @author 芋道源码
*/ */
@Service @Service
@Slf4j @Slf4j
@ -50,8 +54,6 @@ public class SysPermissionServiceImpl implements SysPermissionService {
private SysRoleMenuMapper roleMenuMapper; private SysRoleMenuMapper roleMenuMapper;
@Resource @Resource
private SysUserRoleMapper userRoleMapper; private SysUserRoleMapper userRoleMapper;
@Resource
private SysRoleDeptMapper roleDeptMapper;
@Resource @Resource
private SysRoleService roleService; private SysRoleService roleService;
@ -96,19 +98,29 @@ public class SysPermissionServiceImpl implements SysPermissionService {
} }
@Override @Override
public List<Long> listUserRoleIds(Long userId) { public Set<Long> listUserRoleIds(Long userId, Collection<Integer> roleStatuses) {
List<SysUserRoleDO> userRoleList = userRoleMapper.selectListByUserId(userId); List<SysUserRoleDO> userRoleList = userRoleMapper.selectListByUserId(userId);
return CollectionUtils.convertList(userRoleList, SysUserRoleDO::getRoleId); // 过滤角色状态
if (CollectionUtil.isNotEmpty(roleStatuses)) {
userRoleList.removeIf(userRoleDO -> {
SysRoleDO role = roleService.getRoleFromCache(userRoleDO.getRoleId());
return role == null || !roleStatuses.contains(role.getStatus());
});
}
return CollectionUtils.convertSet(userRoleList, SysUserRoleDO::getRoleId);
} }
@Override @Override
public Long getDeptRoleId(Long deptId) { public void processRoleDeleted(Long roleId) {
SysRoleDeptDO roleDept = roleDeptMapper.selectById(deptId); // TODO 实现我
return roleDept != null ? roleDept.getRoleId() : null; // // 标记删除 RoleResource
// roleResourceMapper.deleteByRoleId(roleId);
// // 标记删除 AdminRole
// adminRoleMapper.deleteByRoleId(roleId);
} }
@Override @Override
public void deleteRolesMenuByMenuId(Long menuId) { public void processMenuDeleted(Long menuId) {
// TODO 实现我 // TODO 实现我
} }

View File

@ -1,13 +1,24 @@
package cn.iocoder.dashboard.modules.system.service.permission.impl; package cn.iocoder.dashboard.modules.system.service.permission.impl;
import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.collection.CollectionUtil;
import cn.iocoder.dashboard.common.enums.CommonStatusEnum;
import cn.iocoder.dashboard.common.exception.util.ServiceExceptionUtil;
import cn.iocoder.dashboard.common.pojo.PageResult;
import cn.iocoder.dashboard.modules.system.controller.permission.vo.role.SysRoleCreateReqVO;
import cn.iocoder.dashboard.modules.system.controller.permission.vo.role.SysRolePageReqVO;
import cn.iocoder.dashboard.modules.system.controller.permission.vo.role.SysRoleUpdateReqVO;
import cn.iocoder.dashboard.modules.system.convert.permission.SysRoleConvert;
import cn.iocoder.dashboard.modules.system.dal.mysql.dao.permission.SysRoleMapper; import cn.iocoder.dashboard.modules.system.dal.mysql.dao.permission.SysRoleMapper;
import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.permission.SysRoleDO; import cn.iocoder.dashboard.modules.system.dal.mysql.dataobject.permission.SysRoleDO;
import cn.iocoder.dashboard.modules.system.enums.permission.RoleCodeEnum; import cn.iocoder.dashboard.modules.system.enums.permission.RoleCodeEnum;
import cn.iocoder.dashboard.modules.system.enums.permission.RoleTypeEnum;
import cn.iocoder.dashboard.modules.system.service.permission.SysPermissionService;
import cn.iocoder.dashboard.modules.system.service.permission.SysRoleService; import cn.iocoder.dashboard.modules.system.service.permission.SysRoleService;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableMap;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import javax.annotation.PostConstruct; import javax.annotation.PostConstruct;
import javax.annotation.Resource; import javax.annotation.Resource;
@ -17,13 +28,20 @@ import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import static cn.iocoder.dashboard.modules.system.enums.SysErrorCodeConstants.*;
/** /**
* 角色 Service 实现类 * 角色 Service 实现类
*
* @author 芋道源码
*/ */
@Service @Service
@Slf4j @Slf4j
public class SysRoleServiceImpl implements SysRoleService { public class SysRoleServiceImpl implements SysRoleService {
@Resource
private SysPermissionService permissionService;
@Resource @Resource
private SysRoleMapper roleMapper; private SysRoleMapper roleMapper;
@ -51,11 +69,16 @@ public class SysRoleServiceImpl implements SysRoleService {
} }
@Override @Override
public List<SysRoleDO> listRolesFromCache(Collection<Long> roleIds) { public SysRoleDO getRoleFromCache(Long id) {
if (CollectionUtil.isEmpty(roleIds)) { return roleCache.get(id);
}
@Override
public List<SysRoleDO> listRolesFromCache(Collection<Long> ids) {
if (CollectionUtil.isEmpty(ids)) {
return Collections.emptyList(); return Collections.emptyList();
} }
return roleCache.values().stream().filter(roleDO -> roleIds.contains(roleDO.getId())) return roleCache.values().stream().filter(roleDO -> ids.contains(roleDO.getId()))
.collect(Collectors.toList()); .collect(Collectors.toList());
} }
@ -67,4 +90,104 @@ public class SysRoleServiceImpl implements SysRoleService {
return roleList.stream().anyMatch(roleDO -> RoleCodeEnum.ADMIN.getKey().equals(roleDO.getCode())); return roleList.stream().anyMatch(roleDO -> RoleCodeEnum.ADMIN.getKey().equals(roleDO.getCode()));
} }
@Override
public Long createRole(SysRoleCreateReqVO reqVO) {
// 校验角色
checkDuplicateRole(reqVO.getName(), reqVO.getCode(), null);
// 插入到数据库
SysRoleDO role = SysRoleConvert.INSTANCE.convert(reqVO);
role.setType(RoleTypeEnum.CUSTOM.getType());
role.setStatus(CommonStatusEnum.ENABLE.getStatus());
roleMapper.insert(role);
// 返回
return role.getId();
}
@Override
public void updateRole(SysRoleUpdateReqVO reqVO) {
// 校验更新的角色是否存在
SysRoleDO role = roleMapper.selectById(reqVO.getId());
if (roleMapper.selectById(reqVO.getId()) == null) {
throw ServiceExceptionUtil.exception(ROLE_NOT_EXISTS);
}
// 内置角色不允许修改
if (RoleTypeEnum.SYSTEM.getType().equals(role.getType())) {
throw ServiceExceptionUtil.exception(ROLE_CAN_NOT_UPDATE_SYSTEM_TYPE_ROLE);
}
// 校验角色的唯一字段是否重复
checkDuplicateRole(reqVO.getName(), reqVO.getCode(), reqVO.getId());
// 更新到数据库
SysRoleDO updateObject = SysRoleConvert.INSTANCE.convert(reqVO);
roleMapper.updateById(updateObject);
}
@Override
public void deleteRole(Long id) {
// 校验删除的角色是否存在
SysRoleDO roleDO = roleMapper.selectById(id);
if (roleMapper.selectById(id) == null) {
throw ServiceExceptionUtil.exception(ROLE_NOT_EXISTS);
}
// 内置角色不允许删除
if (RoleTypeEnum.SYSTEM.getType().equals(roleDO.getType())) {
throw ServiceExceptionUtil.exception(ROLE_CAN_NOT_DELETE_SYSTEM_TYPE_ROLE);
}
// 标记删除
roleMapper.deleteById(id);
// 删除相关数据
permissionService.processRoleDeleted(id);
}
@Override
public SysRoleDO getRole(Long id) {
return roleMapper.selectById(id);
}
@Override
public PageResult<SysRoleDO> pageRole(SysRolePageReqVO reqVO) {
IPage<SysRoleDO> roleDOPage = roleMapper.selectPage(reqVO);
return SysRoleConvert.INSTANCE.convertPage(roleDOPage);
}
@Override
public void updateRoleStatus(Long id, Integer status) {
// 校验修改的角色是否存在
SysRoleDO roleDO = roleMapper.selectById(id);
if (roleMapper.selectById(id) == null) {
throw ServiceExceptionUtil.exception(ROLE_NOT_EXISTS);
}
SysRoleDO updateObject = new SysRoleDO();
updateObject.setId(id);
updateObject.setStatus(status);
roleMapper.updateById(updateObject);
}
/**
* 校验角色的唯一字段是否重复
*
* 1. 是否存在相同名字的角色
* 2. 是否存在相同编码的角色
*
* @param name 角色名字
* @param code 角色额编码
* @param id 角色编号
*/
private void checkDuplicateRole(String name, String code, Long id) {
// 1. name 名字被其它角色所使用
SysRoleDO role = roleMapper.selectByName(name);
if (role != null && !role.getId().equals(id)) {
throw ServiceExceptionUtil.exception(ROLE_NAME_DUPLICATE, name);
}
// 2. 是否存在相同编码的角色
if (!StringUtils.hasText(code)) {
return;
}
// code 编码被其它角色所使用
role = roleMapper.selectByCode(code);
if (role != null && !role.getId().equals(id)) {
throw ServiceExceptionUtil.exception(ROLE_CODE_DUPLICATE, name);
}
}
} }

View File

@ -43,6 +43,7 @@ yudao:
mybatis-plus: mybatis-plus:
configuration: configuration:
map-underscore-to-camel-case: true # 虽然默认为 true ,但是还是显示去指定下。 map-underscore-to-camel-case: true # 虽然默认为 true ,但是还是显示去指定下。
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # 打印日志
global-config: global-config:
db-config: db-config:
id-type: auto # 自增 ID id-type: auto # 自增 ID