Part06 中州养老AI+IOT项目实训
Part06 中州养老AI+IOT项目实训
1. 预约模块
1.1. 我的家人
我的家人
接下来完成我的家人列表接口,用于下拉列选择家人。

- 请求路径:
/customer/user/my
- 请求方式:
GET
- 请求参数:无
- 响应格式:
application/json;charset=UTF-8
- 响应数据:👇
{
"msg": "操作成功",
"code": 200,
"data": [
{
"id": 15,
"familyMemberId": 10,//家属id
"elderId": 1,//老人id
"createTime": null,
"updateTime": null,
"createBy": null,
"updateBy": null,
"remark": null,
"elderName": "刘备"//老人姓名
},
{
"id": 14,
"familyMemberId": 10,
"elderId": 6,
"createTime": null,
"updateTime": null,
"createBy": null,
"updateBy": null,
"remark": null,
"elderName": "刘爱国"
}
]
}
可以发现,只需要获取elderId和对应的名字即可。
1.FamilyMemberController代码如下:👇
@GetMapping("/my")
@ApiOperation(value = "我的家人列表")
public AjaxResult my(HttpServletRequest request) {
String token = request.getHeader("authorization");
Claims claims = JwtUtils.parseJWT(token);
Long userId = Long.valueOf(claims.get("userId").toString());
if (userId == 0){
return AjaxResult.error("请先登录");
}
List<FamilyMemberElderVo> memberElders = familyMemberElderMapper.selectByMemberId(Long.valueOf(userId));
return AjaxResult.success(memberElders);
}
2.FamilyMemberMapper接口代码如下:👇
@Mapper
public interface FamilyMemberElderMapper extends BaseMapper<FamilyMemberElder> {
List<FamilyMemberElderVo> selectByMemberId(Long userId);
}
3.FamilyMemberMapper.xml映射文件代码如下:👇

测试截图:
有多个地方会用到这个接口。
总结
1.2 查询取消预约数量
查询取消预约数量
查询某个用户取消预约数量接口,主要用来控制用户的预约次数,如果预约取消过多,则不能继续预约。


接下来查看接口信息:
- 请求路径:
/customer/reservation/cancelled-count
- 请求方式:
GET
- 请求参数:无
- 响应格式:
application/json;charset=UTF-8
- 响应数据:👇
{
"msg": "操作成功",
"code": 200,
"data": 1 //改用户的取消次数
}
代码如下:👇

总结
1.3 查询每个时间段剩余预约次数
查询每个时间段剩余预约次数
接下来,完成查询每个时间段剩余预约次数接口,用于控制用户的预约次数,避免某个时间段来访的太多,导致无法接待的情况。
接下来,查看接口信息:
- 请求路径:
/customer/reservation/countByTime
- 请求方式:
GET
- 请求参数:
time=1750521600000
- 响应格式:
application/json;charset=UTF-8
- 响应数据:👇
需要准备一个vo类,用于封装时间与次数
@Data
public class TimeCountVo {
/**
* 时间
*/
@ApiModelProperty(value = "时间")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")//get
private LocalDateTime time;
/**
* 次数
*/
@ApiModelProperty(value = "次数")
private Integer count;
}
@GetMapping("/countByTime")
@ApiOperation("查询每个时间段剩余预约次数")
public AjaxResult countReservationsForEachTimeWithinTimeRange(Long time) {
//2024-09-21
LocalDateTime localDateTime = LocalDateTimeUtil.of(time);
//2024-09-21 00:00:00
LocalDateTime startTime = localDateTime.toLocalDate().atStartOfDay();
//2024-09-22 00:00:00
LocalDateTime endTime = startTime.plusHours(24);
List<TimeCountVo> timeCountVoList = reservationMapper.countReservationsForTime(startTime, endTime);
return AjaxResult.success(timeCountVoList);
}
ReservationMapper接口中添加如下方法:
@Mapper
public interface ReservationMapper extends BaseMapper<Reservation> {
List<TimeCountVo> countReservationsForTime(@Param("startTime") LocalDateTime startTime, @Param("endTime") LocalDateTime endTime);
}
ReservationMapper.xml映射文件中添加如下代码:
<select id="countReservationsForTime" resultType="cn.yangeit.vo.TimeCountVo">
SELECT time, 6 - COUNT(*) AS count
FROM reservation
WHERE `time` BETWEEN #{startTime}
AND #{endTime}
and status != 2
GROUP BY time
</select>
测试: 👇
总结
课堂作业
- 接下来完成查询每个时间段剩余预约次数接口,用于控制用户的预约次数。
完成后,将练习代码截图提交到任务平台,直接作为实训分数!(http://taskshare.yangeit.cn:21016/)
1.4 新增预约 🎯
新增预约
接下来,完成新增预约接口,用于新增预约信息。这里的预约含预约
接口信息如下:
- 请求路径:
/customer/reservation
- 请求方式:
POST
- 请求参数:json格式,具体如下:👇
{
"mobile": "18687777444",
"name": "小王",
"time": "2025-06-23 09:30:00",
"type": 0,
"visitor": "老王"
}
如果是探访预约,数据如下:
{
"elderId": 3,
"mobile": "19877776565",
"name": "小张",
"time": "2025-06-23 11:30:00",
"type": 1,
"visitor": "张飞"
}
- 响应格式:
application/json;charset=UTF-8
- 响应数据:👇
{
"code": 200,
"msg": "预约成功"
}
从上述接口分析,这个接口实现了2种不同的预约,传递的参数也有点不一样,需要一个综合性的dto对象来接受数据
项目中已经自带的ReservationDto类,用于接收数据,如下:👇
@Data
@Builder
public class ReservationDto {
@ApiModelProperty("预约人")
private String name;
@ApiModelProperty("预约人手机号")
private String mobile;
@ApiModelProperty("时间")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime time;
@ApiModelProperty("探访人")
private String visitor;
@ApiModelProperty("预约类型,0:参观预约,1:探访预约")
private Integer type;
@ApiModelProperty("预约状态,0:待报道,1:已完成,2:取消,3:过期")
private Integer status;
@ApiModelProperty("老人id")
private Long elderId;
}
代码操作
开发流程:
- 编写Controller代码
- 编写Mapper接口和Mapper映射配置文件
- 微信小程序测试
1 在ReservationController中添加方法

注意: 可以通过@Autowired注解,从IOC容器中获取指定类型的对象并赋值给成员变量
微信小程序测试

总结
课堂作业
- 参考接口文档和上述步骤,完成新增分页查询🎤
1.5 预约列表分页查询 🎯
预约列表分页查询
接下来完成分页查询接口,用于查询预约列表信息。接口信息如下:
- 请求路径:
/customer/reservation/page
- 请求方式:
GET
- 请求参数:
pageSize=10&pageNum=1&status=0
- 响应格式:
application/json;charset=UTF-8
- 响应数据:👇
{
"msg": "操作成功",
"code": 200,
"data": {
"total": 2,
"rows": [
{
"id": 19,
"name": "小张",
"mobile": "19877776565",
"time": "2025-06-23T11:30:00",
"visitor": "张飞",
"type": 1,
"status": 0,
"createTime": "2025-06-22T20:42:33",
"updateTime": null,
"createBy": 10,
"updateBy": 10,
"remark": null
},
{
"id": 18,
"name": "小王",
"mobile": "18687777444",
"time": "2025-06-23T09:30:00",
"visitor": "老王",
"type": 0,
"status": 0,
"createTime": "2025-06-22T20:39:43",
"updateTime": null,
"createBy": 10,
"updateBy": 10,
"remark": null
}
],
"code": 200,
"msg": "请求成功"
}
}
- Controller层代码如下 👇

注意: 可以通过@Autowired注解,从IOC容器中获取指定类型的对象并赋值给成员变量
微信小程序测试

总结
1.6 取消预约 🎯
新增预约
阅读接口文档
接口信息如下:
- 请求路径:
/customer/reservation/18/cancel
- 请求方式:
PUT
- 请求参数:
id
, - 响应格式:
application/json
- 响应数据:👇
{
"code": 200,
"msg": "取消成功"
}
最终效果图:

核心代码:👇
微信小程序测试

总结
课堂作业
- 参考接口文档和上述步骤,完成取消订单🎤