CREATETABLE`t_role_permission`( `id`bigint(20)NOTNULLAUTO_INCREMENTCOMMENT'ID', `permission_id`bigint(20)DEFAULTNULLCOMMENT'分配的权限ID', `role_id`bigint(20)DEFAULTNULLCOMMENT'角色ID', PRIMARYKEY(`id`) )ENGINE=InnoDBAUTO_INCREMENT=1637636321210011663DEFAULTCHARSET=utf8mb4; @Data publicclassRolePermissionVoimplementsSerializable{ /** *roleId */ privateLongid; /** *角色名称 */ privateStringname; /** *角色简介 */ privateStringremark; /** *权限列表 */ privateList<PermissionVo>permissions; } 这是我的角色权限表和角色权限Vo。 CREATETABLE`t_role`( `id`bigint(20)NOTNULLAUTO_INCREMENTCOMMENT'ID', `name`varchar(255)DEFAULTNULLCOMMENT'角色名称', `remark`varchar(255)DEFAULTNULLCOMMENT'备注说明', `create_time`datetimeDEFAULTNULLCOMMENT'添加时间', `update_time`datetimeDEFAULTNULLCOMMENT'修改时间', PRIMARYKEY(`id`) )ENGINE=InnoDBAUTO_INCREMENT=1647617737959841794DEFAULTCHARSET=utf8mb4; /** *角色Vo */ @Data publicclassRoleVoimplementsSerializable{ /** *id */ privateLongid; /** *角色名称 */ privateStringname; /** *备注 */ privateStringremark; /** *创建时间 */ privateDatecreateTime; /** *修改时间 */ privateDateupdateTime; } 这是我的角色表和角色Vo。 CREATETABLE`t_permission`( `id`bigint(20)NOTNULLAUTO_INCREMENTCOMMENT'ID', `pid`bigint(20)DEFAULT'0'COMMENT'父级ID', `disabled`tinyint(1)DEFAULT'0'COMMENT'1-禁止:0-不是禁止', `path`varchar(255)DEFAULTNULLCOMMENT'权限标识', `name`varchar(255)DEFAULTNULLCOMMENT'权限名称', `type`int(2)DEFAULTNULLCOMMENT'类型1-目录,2-接口', `create_time`datetimeDEFAULTNULLCOMMENT'创建时间', `update_time`datetimeDEFAULTNULLCOMMENT'修改时间', 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

2023-04-18by@547241650-qAQ7A&@ChatGPT.Model: gpt-3.5
547241650-qAQ7A

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

Avatar
Avatar

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查询角色权限和更新角色权限的功能,但是需要注意的是,更新角色权限时需要先删除原有的角色权限再插入新的角色权限,因此需要谨慎操作。

547241650-qAQ7A

写好完整的xml、PermissionMapper、RolePermissionServiceImpl,只需要一个获取全部角色权限的列表,

Avatar
Avatar

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();
}

}

注意,查询所有角色权限列表时,需要同时查询出角色和权限的信息,因此需要使用多表查询。

547241650-qAQ7A

生成一下resultMap,返回的数据格式是{
id:""//角色ID
name:""//角色名称
permissions:[]//角色所拥有的权限列表
remark:""//角色说明
}permissions:[]是权限集合

Avatar
Avatar

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代码中去重的麻烦。

547241650-qAQ7A

groupBy="permission_id"报错Attribute groupBy is not allowed here

Avatar
Avatar

Usage limit reached 🤕
Each user can chat for free 10 times a day
Please [Upgrade to PRO] to expand the limit

Avatar

Usage limit reached 🤕
Each user can chat for free 10 times a day
Please [Upgrade to PRO] to expand the limit