这一章我们要完成角色管理模块的开发,角色管理栏目的截图如下。大家看到了,在Emos系统里面存在内置的角色,这些角色是不能删除的,甚至选中删除也不行。超级管理员帐户就更加严格了,既不能删除也不能修改。这是因为超级管理员角色已经拥有最高权限了,没有必要再为它设置权限。
总体上看,角色管理栏目的功能跟用户管理差不多,主要的功能都是CRUD操作。甚至说,角色管理页面表格里面的列更少,看似很容易实现增删改查,实则不然,SQL语句依然不好写。
一、编写持久层代码
在TbRoleDao.xml
文件中,定义SQL用于查询角色分页数据。看上面的截图可知,在角色管理页面上,只有按照角色名字模糊查询。所以在SQL语句中,WHERE子句里面只有一个查询条件。由于在页面表格中要显示每个角色拥有的权限数量,而且tb_role
表的permissions
字段是JSON数组格式,所以我们统计数组的元素数量,就是该角色拥有的权限数量。恰好JSON_LENGTH()
函数能获取JSON数组的长度,所以我就用在SQL语句中了。
<select id="searchRoleByPage" parameterType="HashMap" resultType="HashMap">
SELECT
r.id,
r.role_name AS roleName,
COUNT( u.id ) AS users,
JSON_LENGTH ( r.permissions ) AS permissions,
r.`desc`,
r.systemic
FROM tb_role r
LEFT JOIN tb_user u ON JSON_CONTAINS ( u.role, CONVERT ( r.id, CHAR ) )
WHERE 1=1
<if test="roleName!=null">
AND r.role_name LIKE '%${roleName}%'
</if>
GROUP BY r.id
ORDER BY r.id
LIMIT #{start}, #{length}
</select>
<select id="searchRoleCount" parameterType="HashMap" resultType="long">
SELECT COUNT(*) FROM (
SELECT r.id
FROM tb_role r
LEFT JOIN tb_user u ON JSON_CONTAINS ( u.role, CONVERT ( r.id, CHAR ) )
WHERE 1=1
<if test="roleName!=null">
AND r.role_name LIKE '%${roleName}%'
</if>
GROUP BY r.id
) AS temp
</select>
在TbRoleDao.java
接口中,定义DAO方法。
public interface TbRoleDao {
……
public ArrayList<HashMap> searchRoleByPage(HashMap param);
public long searchRoleCount(HashMap param);
}
二、编写业务层代码
在RoleService.java
接口中,定义抽象方法。
public interface RoleService {
……
public PageUtils searchRoleByPage(HashMap param);
}
在RoleServiceImpl.java
类中,实现抽象方法。
public class RoleServiceImpl implements RoleService {
……
@Override
public PageUtils searchRoleByPage(HashMap param) {
ArrayList<HashMap> list = roleDao.searchRoleByPage(param);
long count = roleDao.searchRoleCount(param);
int start = (Integer) param.get("start");
int length = (Integer) param.get("length");
PageUtils pageUtils = new PageUtils(list, count, start, length);
return pageUtils;
}
}
三、编写Web层代码
创建SearchRoleByPageForm.java
类,用于封装Ajax提交的数据。
@Data
@Schema(description = "查询角色分页表单")
public class SearchRoleByPageForm {
@Pattern(regexp = "^[0-9a-zA-Z\\u4e00-\\u9fa5]{1,10}$", message = "roleName内容不正确")
@Schema(description = "角色名称")
private String roleName;
@NotNull(message = "page不能为空")
@Min(value = 1, message = "page不能小于1")
@Schema(description = "页数")
private Integer page;
@NotNull(message = "length不能为空")
@Range(min = 10, max = 50, message = "length必须在10~50之间")
@Schema(description = "每页记录数")
private Integer length;
}
在RoleController.java
类中,定义Web方法。
public class RoleController {
……
@PostMapping("/searchRoleByPage")
@Operation(summary = "查询角色分页数据")
@SaCheckPermission(value = {"ROOT", "ROLE:SELECT"}, mode = SaMode.OR)
public R searchRoleByPage(@Valid @RequestBody SearchRoleByPageForm form) {
int page = form.getPage();
int length = form.getLength();
int start = (page - 1) * length;
HashMap param = JSONUtil.parse(form).toBean(HashMap.class);
param.put("start", start);
PageUtils pageUtils = roleService.searchRoleByPage(param);
return R.ok().put("page", pageUtils);
}
}