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