【华夏OA项目实战】3-11 后端实现分页查询人员RESTful接口

本课程开发软件与项目初始代码可以通过云盘下载,答疑服务可以关注视频片头的二维码获取。
https://www.123912.com/s/A75eVv-27mod,提取码:yton

教学视频

在用户管理模块中,我们要把员工分页信息显示在页面里面。这节课我们的任务是编写后端代码,把员工分页记录查询出来。

大家认真观看视频,不要快进。有些操作只在视频中演示,只对着手册操作并不能完成案例,切记!

一、编写hxoa-oms子系统

1. 编写持久层

UserMapper.xml文件中编写SQL语句,查询分页数据。

<select id="searchByPage" parameterType="Map" resultType="HashMap">
    SELECT DISTINCT u.id,
           u.username,
           u.name,
           u.tel,
           j.name AS jobName,
           d.name AS deptName,
           u.photo,
           u.email,
           JSON_LENGTH(u.roles) AS associatedRoles,
           u.status
    FROM tb_user u
    JOIN tb_dept d ON u.dept_id = d.id
    JOIN tb_job j ON u.job_id = j.id
    JOIN tb_role r ON JSON_CONTAINS(u.roles, CONVERT(r.id, CHAR))
    WHERE r.systemic = FALSE
    <if test="name != null">
        AND u.name LIKE CONCAT("%", #{name}, "%")
    </if>
    <if test="deptId!= null">
        AND u.dept_id = #{deptId}
    </if>
    <if test="roleId != null">
        AND r.id = #{roleId}
    </if>
    <if test="status!= null">
        AND u.status = #{status}
    </if>
    ORDER BY u.id
    LIMIT #{start}, #{length}
</select>
<select id="searchCount" parameterType="Map" resultType="long">
    SELECT COUNT(*)
    FROM ( 
        SELECT DISTINCT u.id
        FROM tb_user u
        JOIN tb_role r ON JSON_CONTAINS(u.roles, CONVERT(r.id, CHAR))
        WHERE r.systemic = FALSE
        <if test="name != null">
            AND u.name LIKE CONCAT("%", #{name}, "%")
        </if>
        <if test="deptId!= null">
            AND u.dept_id = #{deptId}
        </if>
        <if test="roleId != null">
            AND r.id = #{roleId}
        </if>
        <if test="status!= null">
            AND u.status = #{status}
        </if>
    ) temp
</select>

com.example.hxoa.cloud.oms.db.daoUserMapper.java接口中,声明DAO方法。

public interface UserMapper {
    ……
    public ArrayList<HashMap> searchByPage(Map param);
    public long searchCount(Map param);
}

2. 编写Dubbo层

com.example.hxoa.cloud.dubboUserApi.java接口中,声明抽象方法。

public interface UserApi {
    ……
    public R searchByPage(Map param);
}

com.example.hxoa.cloud.oms.apiUserApiHandler.java类中,实现抽象方法。

@DubboService
@Slf4j
public class UserApiHandler implements UserApi {
    ……
    @Override
    @SentinelResource("UserApiHandler.searchByPage")
    public R searchByPage(Map param) {
        ArrayList list = new ArrayList();
        long count = userMapper.searchCount(param);
        if (count > 0) {
            list = userMapper.searchByPage(param);
        }
        int page = MapUtil.getInt(param, "page");
        int length = MapUtil.getInt(param, "length");
        PageUtils pageUtils = new PageUtils(list, count, page, length);

        return R.ok().setAttributeAll(
                new HashMap() {{
                    put("status", "SUCCESS");
                    put("page", pageUtils);
                }});
    }
}

二、编写hxoa-mis子系统

1. 编写Dubbo层

com.example.hxoa.cloud.dubboUserApi.java接口中,声明抽象方法。

public interface UserApi {
    ……
    public R searchByPage(Map param);
}

2. 编写业务层

com.example.hxoa.cloud.mis.serviceUserService.java接口中,声明抽象方法。

public interface UserService {
    ……
    public Map searchByPage(Map param);
}

com.example.hxoa.cloud.mis.service.implUserServiceImpl.java类中,实现抽象方法。

@Service
public class UserServiceImpl implements UserService {
    ……
    @Override
    public Map searchByPage(Map param) {
        R r = userApi.searchByPage(param);
        Map result = r.getAttributeAll();
        return result;
    }
}

3. 编写Web层

com.example.hxoa.cloud.mis.controller.form包中,创建SearchUserByPageForm.java类。

package com.example.hxoa.cloud.mis.controller.form;

import jakarta.validation.constraints.Min;
import jakarta.validation.constraints.NotNull;
import jakarta.validation.constraints.Pattern;
import lombok.Data;
import org.hibernate.validator.constraints.Range;

@Data
public class SearchUserByPageForm {
    @Pattern(regexp = "^[\\u4e00-\\u9fa5]{1,20}$", message = "姓名格式不正确")
    private String name;

    @Min(value = 1, message = "部门ID必须大于0")
    private Long deptId;

    @Min(value = 1, message = "角色ID必须大于0")
    private Long roleId;

    @Range(min = 1, max = 3, message = "状态只能是1~3之间的整数")
    private Byte status;

    @NotNull(message = "页码不能为空")
    @Min(value = 1, message = "页码必须大于0")
    private Integer page;

    @NotNull(message = "每页记录数不能为空")
    @Range(min = 1, max = 50, message = "每页记录数必须在1~50之间")
    private Integer length;

}

com.example.hxoa.cloud.mis.controllerUserController.java类中,声明Web方法。

@RestController
@RequestMapping("/user")
public class UserController {
    ……
    @PostMapping("/search-by-page")
    @SaCheckPermission(value = {"ROOT", "USER:SELECT"}, mode = SaMode.OR)
    @SentinelResource("UserController.searchUserByPage")
    public R searchByPage(@RequestBody @Valid SearchUserByPageForm form) {
        int page = form.getPage();
        int length = form.getLength();
        int start = (page - 1) * length;
        Map param = BeanUtil.beanToMap(form);
        param.put("start", start);
        Map result = userService.searchByPage(param);
        return R.ok().setAttributeAll(result);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值