全部开发者教程

企业级在线办公系统

这一章我们要完成角色管理模块的开发,角色管理栏目的截图如下。大家看到了,在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);
    }
}