新增解绑用户角色关联关系的功能

This commit is contained in:
b2baccline
2021-03-15 19:13:24 +08:00
parent 865d4c7a2c
commit e339103998
8 changed files with 306 additions and 41 deletions

View File

@@ -4,12 +4,15 @@ import com.hccake.ballcat.admin.constants.SysRoleConst;
import com.hccake.ballcat.admin.modules.sys.model.converter.SysRoleConverter;
import com.hccake.ballcat.admin.modules.sys.model.dto.SysRoleUpdateDTO;
import com.hccake.ballcat.admin.modules.sys.model.entity.SysRole;
import com.hccake.ballcat.admin.modules.sys.model.qo.RoleBindUserQO;
import com.hccake.ballcat.admin.modules.sys.model.qo.SysRoleQO;
import com.hccake.ballcat.admin.modules.sys.model.vo.PermissionVO;
import com.hccake.ballcat.admin.modules.sys.model.vo.RoleBindUserVO;
import com.hccake.ballcat.admin.modules.sys.model.vo.SysRoleVO;
import com.hccake.ballcat.admin.modules.sys.service.SysPermissionService;
import com.hccake.ballcat.admin.modules.sys.service.SysRolePermissionService;
import com.hccake.ballcat.admin.modules.sys.service.SysRoleService;
import com.hccake.ballcat.admin.modules.sys.service.SysUserRoleService;
import com.hccake.ballcat.commom.log.operation.annotation.CreateOperationLogging;
import com.hccake.ballcat.commom.log.operation.annotation.DeleteOperationLogging;
import com.hccake.ballcat.commom.log.operation.annotation.UpdateOperationLogging;
@@ -39,10 +42,12 @@ public class SysRoleController {
private final SysRoleService sysRoleService;
private final SysRolePermissionService sysRolePermissionService;
private final SysPermissionService sysPermissionService;
private final SysUserRoleService sysUserRoleService;
private final SysRolePermissionService sysRolePermissionService;
/**
* 分页查询角色信息
* @param pageParam 分页参数
@@ -152,4 +157,28 @@ public class SysRoleController {
return R.ok(sysRoleService.listSelectData());
}
/**
* 分页查询已授权指定角色的用户列表
* @param roleBindUserQO 角色绑定用户的查询条件
* @return R
*/
@GetMapping("/user/page")
@ApiOperation(value = "查看已授权指定角色的用户列表", notes = "查看已授权指定角色的用户列表")
@PreAuthorize("@per.hasPermission('sys:sysrole:grant')")
public R<PageResult<RoleBindUserVO>> queryUserPageByRoleCode(PageParam pageParam,
@Valid RoleBindUserQO roleBindUserQO) {
return R.ok(sysUserRoleService.queryUserPageByRoleCode(pageParam, roleBindUserQO));
}
/**
* 解绑与用户绑定关系
* @return R
*/
@DeleteMapping("/user")
@ApiOperation(value = "解绑与用户绑定关系", notes = "解绑与用户绑定关系")
@PreAuthorize("@per.hasPermission('sys:sysrole:grant')")
public R<Boolean> unbindRoleUser(@RequestParam Integer userId, @RequestParam String roleCode) {
return R.ok(sysUserRoleService.unbindRoleUser(userId, roleCode));
}
}

View File

@@ -1,10 +1,19 @@
package com.hccake.ballcat.admin.modules.sys.mapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.toolkit.SqlHelper;
import com.hccake.ballcat.admin.modules.sys.model.entity.SysRole;
import com.hccake.ballcat.admin.modules.sys.model.entity.SysUserRole;
import com.hccake.ballcat.admin.modules.sys.model.qo.RoleBindUserQO;
import com.hccake.ballcat.admin.modules.sys.model.vo.RoleBindUserVO;
import com.hccake.ballcat.common.model.domain.PageParam;
import com.hccake.ballcat.common.model.domain.PageResult;
import com.hccake.extend.mybatis.plus.mapper.ExtendMapper;
import com.hccake.extend.mybatis.plus.toolkit.WrappersX;
import org.apache.ibatis.annotations.Param;
import java.util.ArrayList;
import java.util.List;
/**
@@ -17,26 +26,76 @@ import java.util.List;
*/
public interface SysUserRoleMapper extends ExtendMapper<SysUserRole> {
/**
* 通过用户ID查询角色
* @param userId 用户ID
* @return 用户拥有的角色集合
*/
List<SysRole> listRoles(Integer userId);
/**
* 删除用户关联关系
* @param userId 用户ID
* @return boolean 删除是否成功
*/
Boolean deleteByUserId(@Param("userId") Integer userId);
default boolean deleteByUserId(Integer userId) {
int i = this.delete(Wrappers.lambdaQuery(SysUserRole.class).eq(SysUserRole::getUserId, userId));
return SqlHelper.retBool(i);
}
/**
* 插入用户关联关系
* @param userId 用户ID
* @param roleCodes 角色标识集合
* 插入用户角色关联关系
* @param list 用户角色关联集合
* @return boolean 插入是否成功
*/
Boolean insertUserRoles(@Param("userId") Integer userId, @Param("roleCodes") List<String> roleCodes);
default boolean insertUserRoles(List<SysUserRole> list) {
int i = this.insertBatchSomeColumn(list);
return SqlHelper.retBool(i);
}
/**
* 用户是否存在角色绑定关系
* @param userId 用户ID
* @param roleCode 角色标识,可为空
* @return 存在true
*/
default boolean existsRoleBind(Integer userId, String roleCode) {
Integer num = this.selectCount(WrappersX.lambdaQueryX(SysUserRole.class).eq(SysUserRole::getUserId, userId)
.eqIfPresent(SysUserRole::getRoleCode, roleCode));
return SqlHelper.retBool(num);
}
/**
* 通过角色标识,查询用户列表
* @param pageParam 分页参数
* @param roleBindUserQO 角色标识
* @return List<SysUser> 角色授权的用户列表
*/
default PageResult<RoleBindUserVO> queryUserPageByRoleCode(PageParam pageParam, RoleBindUserQO roleBindUserQO) {
// TODO 连表查询排序,这里暂时禁用
pageParam.setSorts(new ArrayList<>());
IPage<RoleBindUserVO> page = this.prodPage(pageParam);
this.queryUserPageByRoleCode(page, roleBindUserQO);
return new PageResult<>(page.getRecords(), page.getTotal());
}
/**
* 删除角色和用户关系
* @param userId 用户ID
* @param roleCode 角色标识
* @return 删除成功true
*/
default boolean deleteUserRole(Integer userId, String roleCode) {
int i = this.delete(Wrappers.lambdaQuery(SysUserRole.class).eq(SysUserRole::getUserId, userId)
.eq(SysUserRole::getRoleCode, roleCode));
return SqlHelper.retBool(i);
}
/**
* 通过用户ID查询角色
* @param userId 用户ID
* @return 用户拥有的角色集合
*/
List<SysRole> listRoleByUserId(Integer userId);
/**
* 通过角色标识,查询用户列表
* @param roleCode 角色标识
* @return List<SysUser> 角色授权的用户列表
*/
IPage<RoleBindUserVO> queryUserPageByRoleCode(IPage<RoleBindUserVO> page, @Param("qo") RoleBindUserQO roleCode);
}

View File

@@ -3,6 +3,7 @@ package com.hccake.ballcat.admin.modules.sys.model.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.hccake.extend.mybatis.plus.alias.TableAlias;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@@ -14,6 +15,7 @@ import lombok.Data;
* @date 2019-10-14 17:42:23
*/
@Data
@TableAlias("ur")
@TableName("sys_user_role")
@ApiModel(value = "用户角色")
public class SysUserRole {

View File

@@ -0,0 +1,31 @@
package com.hccake.ballcat.admin.modules.sys.model.qo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotNull;
/**
* 角色绑定用户查询对象
*
* @author Hccake
*/
@Data
@ApiModel(value = "角色绑定用户查询对象")
public class RoleBindUserQO {
@NotNull(message = "角色标识不能为空!")
@ApiModelProperty(value = "角色标识")
private String roleCode;
@ApiModelProperty(value = "用户ID")
private Integer userId;
@ApiModelProperty(value = "用户名")
private Integer username;
@ApiModelProperty(value = "组织ID")
private Integer organizationId;
}

View File

@@ -0,0 +1,39 @@
package com.hccake.ballcat.admin.modules.sys.model.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
/**
* 角色绑定的用户
*
* @author ballcat code generator
* @date 2019-09-12 20:39:31
*/
@Data
@ApiModel(value = "角色绑定的用户VO")
public class RoleBindUserVO implements Serializable {
private static final long serialVersionUID = 1L;
@ApiModelProperty(value = "用户ID")
private Integer userId;
@ApiModelProperty(value = "登录账号")
private String username;
@ApiModelProperty(value = "昵称")
private String nickname;
@ApiModelProperty(value = "1:系统用户, 2客户用户")
private Integer type;
@ApiModelProperty(value = "组织机构ID")
private Integer organizationId;
@ApiModelProperty(value = "组织机构名称")
private String organizationName;
}

View File

@@ -2,6 +2,10 @@ package com.hccake.ballcat.admin.modules.sys.service;
import com.hccake.ballcat.admin.modules.sys.model.entity.SysRole;
import com.hccake.ballcat.admin.modules.sys.model.entity.SysUserRole;
import com.hccake.ballcat.admin.modules.sys.model.qo.RoleBindUserQO;
import com.hccake.ballcat.admin.modules.sys.model.vo.RoleBindUserVO;
import com.hccake.ballcat.common.model.domain.PageParam;
import com.hccake.ballcat.common.model.domain.PageResult;
import com.hccake.extend.mybatis.plus.service.ExtendService;
import java.util.List;
@@ -18,7 +22,7 @@ public interface SysUserRoleService extends ExtendService<SysUserRole> {
* @param userId 用户ID
* @return 删除是否程
*/
Boolean deleteByUserId(Integer userId);
boolean deleteByUserId(Integer userId);
/**
* 插入用户角色关联关系
@@ -26,7 +30,7 @@ public interface SysUserRoleService extends ExtendService<SysUserRole> {
* @param roleCodes 角色标识集合
* @return 插入是否成功
*/
Boolean insertUserRoles(Integer userId, List<String> roleCodes);
boolean insertUserRoles(Integer userId, List<String> roleCodes);
/**
* 更新用户关联关系
@@ -43,4 +47,20 @@ public interface SysUserRoleService extends ExtendService<SysUserRole> {
*/
List<SysRole> listRoles(Integer userId);
/**
* 通过角色标识,查询用户列表
* @param pageParam 分页参数
* @param roleCode 角色标识
* @return PageResult<RoleBindUserVO> 角色授权的用户列表
*/
PageResult<RoleBindUserVO> queryUserPageByRoleCode(PageParam pageParam, RoleBindUserQO roleCode);
/**
* 解绑角色和用户关系
* @param userId 用户ID
* @param roleCode 角色标识
* @return 解绑成功true
*/
boolean unbindRoleUser(Integer userId, String roleCode);
}

View File

@@ -1,14 +1,25 @@
package com.hccake.ballcat.admin.modules.sys.service.impl;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.lang.Assert;
import com.baomidou.mybatisplus.extension.toolkit.SqlHelper;
import com.hccake.ballcat.admin.modules.sys.mapper.SysUserRoleMapper;
import com.hccake.ballcat.admin.modules.sys.model.entity.SysRole;
import com.hccake.ballcat.admin.modules.sys.model.entity.SysUserRole;
import com.hccake.ballcat.admin.modules.sys.model.qo.RoleBindUserQO;
import com.hccake.ballcat.admin.modules.sys.model.vo.RoleBindUserVO;
import com.hccake.ballcat.admin.modules.sys.service.SysUserRoleService;
import com.hccake.ballcat.common.core.exception.BusinessException;
import com.hccake.ballcat.common.model.domain.PageParam;
import com.hccake.ballcat.common.model.domain.PageResult;
import com.hccake.ballcat.common.model.result.BaseResultCode;
import com.hccake.extend.mybatis.plus.service.impl.ExtendServiceImpl;
import lombok.extern.slf4j.Slf4j;
import org.springframework.lang.NonNull;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.ArrayList;
import java.util.List;
/**
@@ -16,6 +27,7 @@ import java.util.List;
*
* @author Hccake
*/
@Slf4j
@Service
public class SysUserRoleServiceImpl extends ExtendServiceImpl<SysUserRoleMapper, SysUserRole>
implements SysUserRoleService {
@@ -26,7 +38,7 @@ public class SysUserRoleServiceImpl extends ExtendServiceImpl<SysUserRoleMapper,
* @return boolean
*/
@Override
public Boolean deleteByUserId(Integer userId) {
public boolean deleteByUserId(Integer userId) {
return baseMapper.deleteByUserId(userId);
}
@@ -37,8 +49,33 @@ public class SysUserRoleServiceImpl extends ExtendServiceImpl<SysUserRoleMapper,
* @return boolean
*/
@Override
public Boolean insertUserRoles(Integer userId, List<String> roleCodes) {
return baseMapper.insertUserRoles(userId, roleCodes);
public boolean insertUserRoles(@NonNull Integer userId, @NonNull List<String> roleCodes) {
List<SysUserRole> list = prodSysUserRoles(userId, roleCodes);
// 批量插入
boolean insertSuccess = SqlHelper.retBool(baseMapper.insertBatchSomeColumn(list));
Assert.isTrue(insertSuccess, () -> {
log.error("[insertUserRoles] 插入用户角色关联关系失败userId{}roleCodes{}", userId, roleCodes);
return new BusinessException(BaseResultCode.UPDATE_DATABASE_ERROR.getCode(), "插入用户角色关联关系失败");
});
return insertSuccess;
}
/**
* 根据用户ID 和 角色Code 生成SysUserRole实体集合
* @param userId 用户ID
* @param roleCodes 角色标识集合
* @return List<SysUserRole>
*/
private List<SysUserRole> prodSysUserRoles(Integer userId, List<String> roleCodes) {
// 转换为 SysUserRole 实体集合
List<SysUserRole> list = new ArrayList<>();
for (String roleCode : roleCodes) {
SysUserRole sysUserRole = new SysUserRole();
sysUserRole.setUserId(userId);
sysUserRole.setRoleCode(roleCode);
list.add(sysUserRole);
}
return list;
}
/**
@@ -48,13 +85,30 @@ public class SysUserRoleServiceImpl extends ExtendServiceImpl<SysUserRoleMapper,
*/
@Override
@Transactional(rollbackFor = Exception.class)
public boolean updateUserRoles(Integer userId, List<String> roleCodes) {
// 先清空,后插入
baseMapper.deleteByUserId(userId);
if (CollectionUtil.isNotEmpty(roleCodes)) {
baseMapper.insertUserRoles(userId, roleCodes);
public boolean updateUserRoles(@NonNull Integer userId, @NonNull List<String> roleCodes) {
// 是否存在用户角色绑定关系,存在则先清空
boolean existsRoleBind = baseMapper.existsRoleBind(userId, null);
if (existsRoleBind) {
boolean deleteSuccess = baseMapper.deleteByUserId(userId);
Assert.isTrue(deleteSuccess, () -> {
log.error("[updateUserRoles] 删除用户角色关联关系失败userId{}roleCodes{}", userId, roleCodes);
return new BusinessException(BaseResultCode.UPDATE_DATABASE_ERROR.getCode(), "删除用户角色关联关系失败");
});
}
return true;
// 没有的新授权的角色直接返回
if (CollectionUtil.isEmpty(roleCodes)) {
return true;
}
// 转换为 SysUserRole 实体集合
List<SysUserRole> list = prodSysUserRoles(userId, roleCodes);
// 批量插入
boolean insertSuccess = SqlHelper.retBool(baseMapper.insertBatchSomeColumn(list));
Assert.isTrue(insertSuccess, () -> {
log.error("[updateUserRoles] 插入用户角色关联关系失败userId{}roleCodes{}", userId, roleCodes);
return new BusinessException(BaseResultCode.UPDATE_DATABASE_ERROR.getCode(), "插入用户角色关联关系失败");
});
return insertSuccess;
}
/**
@@ -64,7 +118,30 @@ public class SysUserRoleServiceImpl extends ExtendServiceImpl<SysUserRoleMapper,
*/
@Override
public List<SysRole> listRoles(Integer userId) {
return baseMapper.listRoles(userId);
return baseMapper.listRoleByUserId(userId);
}
/**
* 通过角色标识,查询用户列表
* @param pageParam 分页参数
* @param roleBindUserQO 查询条件
* @return PageResult<RoleBindUserVO> 角色授权的用户列表
*/
@Override
public PageResult<RoleBindUserVO> queryUserPageByRoleCode(PageParam pageParam, RoleBindUserQO roleBindUserQO) {
return baseMapper.queryUserPageByRoleCode(pageParam, roleBindUserQO);
}
/**
* 解绑角色和用户关系
* @param userId 用户ID
* @param roleCode 角色标识
* @return 解绑成功true
*/
@Override
public boolean unbindRoleUser(Integer userId, String roleCode) {
// 不存在则不需要进行删除直接返回true
return !baseMapper.existsRoleBind(userId, roleCode) || baseMapper.deleteUserRole(userId, roleCode);
}
}

View File

@@ -2,7 +2,7 @@
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.hccake.ballcat.admin.modules.sys.mapper.SysUserRoleMapper">
<!-- 通过用户ID查询其关联的角色ID-->
<select id="listRoles" resultType="com.hccake.ballcat.admin.modules.sys.model.entity.SysRole">
<select id="listRoleByUserId" resultType="com.hccake.ballcat.admin.modules.sys.model.entity.SysRole">
SELECT
r.id, r.name, r.code
FROM
@@ -14,20 +14,28 @@
and r.deleted = 0
</select>
<!--新建用户角色关联关系-->
<insert id="insertUserRoles">
insert into
sys_user_role (user_id, role_code)
values
<foreach collection="roleCodes" item="roleCode" separator=",">
( #{userId}, #{roleCode} )
</foreach>
</insert>
<!--根据UserId删除用户角色关联关系-->
<delete id="deleteByUserId">
DELETE FROM sys_user_role WHERE user_id = #{userId}
</delete>
<!-- 通过角色Code查询其关联的用户列表-->
<select id="queryUserPageByRoleCode" resultType="com.hccake.ballcat.admin.modules.sys.model.vo.RoleBindUserVO">
SELECT
su.user_id, su.username, su.nickname, so.name as organization_name
FROM
sys_user_role ur
LEFT JOIN
sys_user su ON su.user_id = ur.user_id
LEFT JOIN
sys_organization so ON su.organization_id = so.id
WHERE ur.role_code = #{qo.roleCode}
and su.deleted = 0
<if test="qo.userId != null">
su.user_id = #{qo.userId}
</if>
<if test="qo.username != null">
su.qo.username = #{qo.username}
</if>
<if test="qo.organizationId != null">
so.id = #{organizationId}
</if>
</select>
</mapper>