全部开发者教程

企业级在线办公系统

会议室模块界面布局并不复杂,也是以表格展示数据,而且列并不多,所以后端代码写起来挺简单的,但是需要注意,关联了线下会议的会议室是不能删除的。所以一会儿我们查询分页数据的时候,就要额外查询哪个会议室能删除,哪个会议室不能删除,然后前端页面的删除按钮该禁用的就禁用。

图片描述

一、编写持久层代码

tb_meeting_room数据表的结构很简答,相信大家都能看明白每个字段是什么意思。

`tb_meeting`数据表的结构也不复杂,其中`place`字段是开会地点,它可以是线上会议室RoomId,也可以是线下会议室的名字。所以我们做表连接的时候要用`place`字段和`tb_meeting_room`数据表的`name`字段连接。

图片描述
还有一个注意事项,要跟大家讲一下,那就是会议室管理页面上的下拉列表查询条件。为了能查询哪些会议室可以删除,哪些不能删除,所以我们要把查询条件写到SQL语句中。利用Having子句中的汇总函数判断会议室有没有关联的会议申请。

图片描述

那么接下来我们去TbMeetingRoomDao.xml文件中,定义SQL语句。

<select id="searchMeetingRoomByPage" parameterType="HashMap" resultType="HashMap">
    SELECT mr.id,
           mr.`name`,
           mr.max,
           mr.`desc`,
           mr.`status`
    FROM tb_meeting_room mr
    LEFT JOIN tb_meeting m ON m.type=2 AND mr.`name`=m.place
    <if test="name!=null">
        WHERE mr.name LIKE '%${name}%'
    </if>
    GROUP BY mr.id
    <if test="canDelete==false">
        HAVING COUNT(m.id) > 0
    </if>
    <if test="canDelete==true">
        HAVING COUNT(m.id) = 0
    </if>
    LIMIT #{start}, #{length}
</select>
<select id="searchMeetingRoomCount" parameterType="HashMap" resultType="long">
    SELECT COUNT(*) FROM (
        SELECT mr.id
        FROM tb_meeting_room mr
        LEFT JOIN tb_meeting m ON m.type=2 AND mr.`name`=m.place
        <if test="name!=null">
            WHERE mr.name LIKE '%${name}%'
        </if>
        GROUP BY mr.id
        <if test="canDelete==false">
            HAVING COUNT(m.id) > 0
        </if>
        <if test="canDelete==true">
            HAVING COUNT(m.id) = 0
        </if>
    ) AS temp
</select>

TbMeetingRooDao.java中,声明DAO方法。

public interface TbMeetingRoomDao {
    ……
    public ArrayList<HashMap> searchMeetingRoomByPage(HashMap param);
    public long searchMeetingRoomCount(HashMap param);
}

二、编写业务层代码

MeetingRoomService.java接口中,声明抽象方法。

public interface MeetingRoomService {
    ……
    public PageUtils searchMeetingRoomByPage(HashMap param);
}

DeptServiceImpl.java类中,实现抽象方法。

public class MeetingRoomServiceImpl implements MeetingRoomService {
    ……
    @Override
    public PageUtils searchMeetingRoomByPage(HashMap param) {
        ArrayList<HashMap> list = meetingRoomDao.searchMeetingRoomByPage(param);
        long count = meetingRoomDao.searchMeetingRoomCount(param);
        int start = (Integer) param.get("start");
        int length = (Integer) param.get("length");
        PageUtils pageUtils = new PageUtils(list, count, start, length);
        return pageUtils;
    }
}

三、编写Web层代码

创建SearchMeetingRoomByPageForm.java类,保存Ajax提交的数据。

@Data
@Schema(description = "查询会议室分页表单")
public class SearchMeetingRoomByPageForm {
    @Pattern(regexp = "^[0-9a-zA-Z\\u4e00-\\u9fa5]{1,20}$", message = "name内容不正确")
    @Schema(description = "会议室名称")
    private String name;

    @Schema(description = "是否可以删除")
    private Boolean canDelete;

    @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;
}

MeetingRoomController.java类中,定义Web方法,然后大家就可以在Swagger页面测试Web方法了。

public class MeetingRoomController {
    ……
    @PostMapping("/searchMeetingRoomByPage")
    @Operation(summary = "查询会议室分页数据")
    @SaCheckLogin
    public R searchMeetingRoomByPage(@Valid @RequestBody SearchMeetingRoomByPageForm 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 = meetingRoomService.searchMeetingRoomByPage(param);
        return R.ok().put("page", pageUtils);
    }
}