CREATETABLEt_role_permission(
idbigint(20)NOTNULLAUTO_INCREMENTCOMMENT'ID',
permission_idbigint(20)DEFAULTNULLCOMMENT'分配的权限ID',
role_idbigint(20)DEFAULTNULLCOMMENT'角色ID',
PRIMARYKEY(id)
)ENGINE=InnoDBAUTO_INCREMENT=1637636321210011663DEFAULTCHARSET=utf8mb4;
@Data
publicclassRolePermissionVoimplementsSerializable{
/**
roleId
/
privateLongid;
/
角色名称
/
privateStringname;
/
角色简介
/
privateStringremark;
/
权限列表
/
privateList<PermissionVo>permissions;
}
这是我的角色权限表和角色权限Vo。
CREATETABLEt_role(
idbigint(20)NOTNULLAUTO_INCREMENTCOMMENT'ID',
namevarchar(255)DEFAULTNULLCOMMENT'角色名称',
remarkvarchar(255)DEFAULTNULLCOMMENT'备注说明',
create_timedatetimeDEFAULTNULLCOMMENT'添加时间',
update_timedatetimeDEFAULTNULLCOMMENT'修改时间',
PRIMARYKEY(id)
)ENGINE=InnoDBAUTO_INCREMENT=1647617737959841794DEFAULTCHARSET=utf8mb4;
/
角色Vo
/
@Data
publicclassRoleVoimplementsSerializable{
/
id
/
privateLongid;
/
角色名称
/
privateStringname;
/
备注
/
privateStringremark;
/
创建时间
/
privateDatecreateTime;
/
修改时间
/
privateDateupdateTime;
}
这是我的角色表和角色Vo。
CREATETABLEt_permission(
idbigint(20)NOTNULLAUTO_INCREMENTCOMMENT'ID',
pidbigint(20)DEFAULT'0'COMMENT'父级ID',
disabledtinyint(1)DEFAULT'0'COMMENT'1-禁止:0-不是禁止',
pathvarchar(255)DEFAULTNULLCOMMENT'权限标识',
namevarchar(255)DEFAULTNULLCOMMENT'权限名称',
typeint(2)DEFAULTNULLCOMMENT'类型1-目录,2-接口',
create_timedatetimeDEFAULTNULLCOMMENT'创建时间',
update_timedatetimeDEFAULTNULLCOMMENT'修改时间',
PRIMARYKEY(id)
)ENGINE=InnoDBAUTO_INCREMENT=1647481083349594117DEFAULTCHARSET=utf8mb4;
/
权限列表Vo
/
@Data
publicclassPermissionVoimplementsSerializable{
/
id
/
privateLongid;
/
父级ID
/
privateLongpid;
/
权限标识
/
privateStringpath;
/
是否禁止:1-是0-否
/
privateBooleandisabled;
/
权限名称
/
privateStringname;
/
类型1-目录,2-接口
/
privateIntegertype;
/
创建时间
/
privateDatecreateTime;
/
修改时间
/
privateDateupdateTime;
/
*子节点
*/
privateList<PermissionVo>children;
}
这是我的权限表和权限列表Vo。
我需要实现:
返回数据
{
id:""//角色ID
name:""//角色名称
permissions:[]//角色所拥有的权限列表
remark:""//角色说明
}
写好完整的xml、PermissionMapper、RolePermissionServiceImpl
XML文件:
<!-- 根据角色ID查询角色权限 -->
<select id="getRolePermissionById" resultMap="rolePermissionResultMap">
SELECT
trp.role_id AS id,
tr.name AS name,
trp.permission_id AS permission_id,
tp.pid AS pid,
tp.disabled AS disabled,
tp.path AS path,
tp.name AS permission_name,
tp.type AS type
FROM
t_role_permission trp
LEFT JOIN t_role tr ON trp.role_id = tr.id
LEFT JOIN t_permission tp ON trp.permission_id = tp.id
WHERE
tr.id = #{id}
</select>
<!-- 根据角色ID删除角色权限 -->
<delete id="deleteRolePermissionByRoleId">
DELETE FROM t_role_permission WHERE role_id = #{roleId}
</delete>
<!-- 批量插入角色权限 -->
<insert id="batchInsertRolePermission">
INSERT INTO t_role_permission(role_id, permission_id) VALUES
<foreach collection="list" item="item" separator=",">
(#{item.roleId}, #{item.permissionId})
</foreach>
</insert>
RolePermissionServiceImpl实现:
@Service
public class RolePermissionServiceImpl implements RolePermissionService {
@Autowired
private RolePermissionMapper rolePermissionMapper;
@Override
public List<RolePermissionVo> getRolePermissionById(Long id) {
return rolePermissionMapper.getRolePermissionById(id);
}
@Override
public void updateRolePermission(Long roleId, List<Long> permissionIds) {
// 先删除原有角色权限
rolePermissionMapper.deleteRolePermissionByRoleId(roleId);
// 批量插入新的角色权限
List<RolePermission> rolePermissionList = new ArrayList<>();
for (Long permissionId : permissionIds) {
RolePermission rolePermission = new RolePermission();
rolePermission.setRoleId(roleId);
rolePermission.setPermissionId(permissionId);
rolePermissionList.add(rolePermission);
}
if (!rolePermissionList.isEmpty()) {
rolePermissionMapper.batchInsertRolePermission(rolePermissionList);
}
}
}
PermissionMapper接口:
public interface PermissionMapper {
// 查询所有权限列表
List<PermissionVo> getAllPermissionList();
// 根据角色ID查询角色权限
List<RolePermissionVo> getRolePermissionById(Long id);
}
RolePermissionMapper接口:
public interface RolePermissionMapper {
// 根据角色ID查询角色权限
List<RolePermissionVo> getRolePermissionById(Long id);
// 根据角色ID删除角色权限
void deleteRolePermissionByRoleId(Long roleId);
// 批量插入角色权限
void batchInsertRolePermission(@Param("list") List<RolePermission> rolePermissionList);
}
RolePermissionVo类:
@Data
public class RolePermissionVo implements Serializable {
/**
* 角色ID
*/
private Long id;
/**
* 角色名称
*/
private String name;
/**
* 角色所拥有的权限列表
*/
private List<PermissionVo> permissions;
/**
* 角色说明
*/
private String remark;
}
完整的代码实现了根据角色ID查询角色权限和更新角色权限的功能,但是需要注意的是,更新角色权限时需要先删除原有的角色权限再插入新的角色权限,因此需要谨慎操作。
写好完整的xml、PermissionMapper、RolePermissionServiceImpl,只需要一个获取全部角色权限的列表,
XML文件:
<!-- 查询所有角色权限列表 -->
<select id="getAllRolePermissionList" resultMap="rolePermissionResultMap">
SELECT
trp.role_id AS id,
tr.name AS name,
trp.permission_id AS permission_id,
tp.pid AS pid,
tp.disabled AS disabled,
tp.path AS path,
tp.name AS permission_name,
tp.type AS type
FROM
t_role_permission trp
LEFT JOIN t_role tr ON trp.role_id = tr.id
LEFT JOIN t_permission tp ON trp.permission_id = tp.id
</select>
PermissionMapper接口:
public interface PermissionMapper {
// 查询所有权限列表
List<PermissionVo> getAllPermissionList();
// 根据角色ID查询角色权限
List<RolePermissionVo> getRolePermissionById(Long id);
// 查询所有角色权限列表
List<RolePermissionVo> getAllRolePermissionList();
}
RolePermissionMapper接口:
public interface RolePermissionMapper {
// 根据角色ID查询角色权限
List<RolePermissionVo> getRolePermissionById(Long id);
}
RolePermissionServiceImpl实现:
@Service
public class RolePermissionServiceImpl implements RolePermissionService {
@Autowired
private RolePermissionMapper rolePermissionMapper;
@Override
public List<RolePermissionVo> getRolePermissionById(Long id) {
return rolePermissionMapper.getRolePermissionById(id);
}
@Override
public List<RolePermissionVo> getAllRolePermissionList() {
return rolePermissionMapper.getAllRolePermissionList();
}
}
注意,查询所有角色权限列表时,需要同时查询出角色和权限的信息,因此需要使用多表查询。
生成一下resultMap,返回的数据格式是{
id:""//角色ID
name:""//角色名称
permissions:[]//角色所拥有的权限列表
remark:""//角色说明
}permissions:[]是权限集合
XML文件:
<!-- 查询所有角色权限列表 -->
<select id="getAllRolePermissionList" resultMap="rolePermissionResultMap">
SELECT
trp.role_id AS id,
tr.name AS name,
tr.remark AS remark,
tp.id AS permission_id,
tp.pid AS pid,
tp.disabled AS disabled,
tp.path AS path,
tp.name AS permission_name,
tp.type AS type
FROM
t_role_permission trp
LEFT JOIN t_role tr ON trp.role_id = tr.id
LEFT JOIN t_permission tp ON trp.permission_id = tp.id
ORDER BY tr.id, tp.path
</select>
<resultMap id="rolePermissionResultMap" type="RolePermissionVo">
<id column="id" property="id"/>
<result column="name" property="name"/>
<result column="remark" property="remark"/>
<collection property="permissions" ofType="PermissionVo" groupBy="permission_id">
<result column="permission_id" property="id"/>
<result column="pid" property="pid"/>
<result column="disabled" property="disabled"/>
<result column="path" property="path"/>
<result column="permission_name" property="name"/>
<result column="type" property="type"/>
</collection>
</resultMap>
PermissionMapper接口:
public interface PermissionMapper {
// 查询所有权限列表
List<PermissionVo> getAllPermissionList();
// 根据角色ID查询角色权限
List<RolePermissionVo> getRolePermissionById(Long id);
// 查询所有角色权限列表
List<RolePermissionVo> getAllRolePermissionList();
}
RolePermissionMapper接口:
public interface RolePermissionMapper {
// 根据角色ID查询角色权限
List<RolePermissionVo> getRolePermissionById(Long id);
// 查询所有角色权限列表
List<RolePermissionVo> getAllRolePermissionList();
}
RolePermissionServiceImpl实现:
@Service
public class RolePermissionServiceImpl implements RolePermissionService {
@Autowired
private RolePermissionMapper rolePermissionMapper;
@Override
public List<RolePermissionVo> getAllRolePermissionList() {
return rolePermissionMapper.getAllRolePermissionList();
}
}
RolePermissionVo类:
@Data
public class RolePermissionVo implements Serializable {
/**
* 角色ID
*/
private Long id;
/**
* 角色名称
*/
private String name;
/**
* 角色说明
*/
private String remark;
/**
* 角色所拥有的权限列表
*/
private List<PermissionVo> permissions;
}
注意,resultMap中使用了group by语句来将权限按照ID进行分组,避免了在Java代码中去重的麻烦。
groupBy="permission_id"报错Attribute groupBy is not allowed here
Usage limit reached 🤕
Each user can chat for free 10 times a day
Please [Upgrade to PRO] to expand the limit
Usage limit reached 🤕
Each user can chat for free 10 times a day
Please [Upgrade to PRO] to expand the limit