【尚庭公寓SpringBoot + Vue 项目实战】看房预约管理(十三)

【尚庭公寓SpringBoot + Vue 项目实战】看房预约管理(十三)


1、业务说明

看房预约包括两个接口

  • 根据条件分页查询预约信息
  • 根据ID更新预约状态
2、代码开发
2.1、根据条件分页查询预约信息

查看接口

image-20240616220956744

代码开发

  • 查看请求和响应的数据结构

    • 请求数据结构

      • currentsize为分页相关参数,分别表示当前所处页面每个页面的记录数

      • AppointmentQueryVo为看房预约的查询条件,详细结构如下:

        @Data
        @Schema(description = "预约看房查询实体")
        public class AppointmentQueryVo {
        
            @Schema(description="预约公寓所在省份")
            private Long provinceId;
        
            @Schema(description="预约公寓所在城市")
            private Long cityId;
        
            @Schema(description="预约公寓所在区")
            private Long districtId;
        
            @Schema(description="预约公寓所在公寓")
            private Long apartmentId;
        
            @Schema(description="预约用户姓名")
            private String name;
        
            @Schema(description="预约用户手机号码")
            private String phone;
        }
        
    • 响应数据结构

      单个看房预约信息的结构可查看web-admin模块下的com.atguigu.lease.web.admin.vo.appointment.AppointmentVo,内容如下:

      @Data
      @Schema(description = "预约看房信息")
      public class AppointmentVo extends ViewAppointment {
      
          @Schema(description = "预约公寓信息")
          private ApartmentInfo apartmentInfo;
      }
      
  • 编写Controller层逻辑

    ViewAppointmentController中增加如下内容

    @Operation(summary = "分页查询预约信息")
    @GetMapping("page")
    public Result<IPage<AppointmentVo>> page(@RequestParam long current, @RequestParam long size, AppointmentQueryVo queryVo) {
        IPage<AppointmentVo> page = new Page<>(current, size);
        IPage<AppointmentVo> list = service.pageAppointmentByQuery(page, queryVo);
        return Result.ok(list);
    }
    
  • 编写Service层逻辑

    • ViewAppointmentService中增加如下内容

      IPage<AppointmentVo> pageAppointmentByQuery(IPage<AppointmentVo> page, AppointmentQueryVo queryVo);
      
    • ViewAppointmentServiceImpl中增加如下内容

      @Override
      public IPage<AppointmentVo> pageAppointmentByQuery(IPage<AppointmentVo> page, AppointmentQueryVo queryVo) {
          return viewAppointmentMapper.pageAppointmentByQuery(page, queryVo);
      }
      
  • 编写Mapper层逻辑

    • ViewAppointmentMapper中增加如下内容

      IPage<AppointmentVo> pageAppointmentByQuery(IPage<AppointmentVo> page, AppointmentQueryVo queryVo);
      
    • ViewAppointmentMapper.xml中增加如下内容

      <resultMap id="AppointmentVoMap" type="com.atguigu.lease.web.admin.vo.appointment.AppointmentVo" autoMapping="true">
          <id property="id" column="id"/>
          <association property="apartmentInfo" javaType="com.atguigu.lease.model.entity.ApartmentInfo" autoMapping="true">
              <id property="id" column="apartment_id"/>
              <result property="name" column="apartment_name"/>
          </association>
      </resultMap>
      
      <select id="pageAppointmentByQuery" resultMap="AppointmentVoMap">
          select va.id,
                 va.user_id,
                 va.name,
                 va.phone,
                 va.appointment_time,
                 va.additional_info,
                 va.appointment_status,
                 ai.id   apartment_id,
                 ai.name apartment_name,
                 ai.district_id,
                 ai.district_name,
                 ai.city_id,
                 ai.city_name,
                 ai.province_id,
                 ai.province_name
          from view_appointment va
                   left join
               apartment_info ai
               on va.apartment_id = ai.id and ai.is_deleted=0
          <where>
              va.is_deleted = 0
              <if test="queryVo.provinceId != null">
                  and ai.province_id = #{queryVo.provinceId}
              </if>
              <if test="queryVo.cityId != null">
                  and ai.city_id = #{queryVo.cityId}
              </if>
              <if test="queryVo.districtId != null">
                  and ai.district_id = #{queryVo.districtId}
              </if>
              <if test="queryVo.apartmentId != null">
                  and va.apartment_id = #{queryVo.apartmentId}
              </if>
              <if test="queryVo.name != null and queryVo.name != ''">
                  and va.name like concat('%',#{queryVo.name},'%')
              </if>
              <if test="queryVo.phone != null and queryVo.phone != ''">
                  and va.phone like concat('%',#{queryVo.phone},'%')
              </if>
          </where>
      </select>
      

    知识点

    ViewAppointment实体类中的appointmentTime字段为Date类型,Date类型的字段在序列化成JSON字符串时,需要考虑两个点,分别是格式时区。本项目使用JSON序列化框架为Jackson,具体配置如下

    • 格式

      格式可按照字段单独配置,也可全局配置,下面分别介绍

      • 单独配置

        在指定字段增加@JsonFormat注解,如下

        @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
        private Date appointmentTime;
        
      • 全局配置

        application.yml中增加如下内容

        spring:
          jackson:
            date-format: yyyy-MM-dd HH:mm:ss
        
    • 时区

      时区同样可按照字段单独配置,也可全局配置,下面分别介绍

      • 单独配置

        在指定字段增加@JsonFormat注解,如下

        @JsonFormat(timezone = "GMT+8")
        private Date appointmentTime;
        
      • 全局配置

        spring:
          jackson:
            time-zone: GMT+8
        

    推荐格式按照字段单独配置,时区全局配置。

2.2、根据ID更新预约状态

查看接口

image-20240616221101178

代码开发

ViewAppointmentController中增加如下内容

@Operation(summary = "根据id更新预约状态")
@PostMapping("updateStatusById")
public Result updateStatusById(@RequestParam Long id, @RequestParam AppointmentStatus status) {

    LambdaUpdateWrapper<ViewAppointment> updateWrapper = new LambdaUpdateWrapper<>();
    updateWrapper.eq(ViewAppointment::getId, id);
    updateWrapper.set(ViewAppointment::getAppointmentStatus, status);
    service.update(updateWrapper);
    return Result.ok();
}

最近更新

  1. TCP协议是安全的吗?

    2024-06-17 08:48:04       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-06-17 08:48:04       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-06-17 08:48:04       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-06-17 08:48:04       18 阅读

热门阅读

  1. C++ 二分查找法【面试】

    2024-06-17 08:48:04       6 阅读
  2. 1、C++编程中的基本运算 - 课件

    2024-06-17 08:48:04       7 阅读
  3. SpringSecurity(JWT、SecurityConfig、Redis)

    2024-06-17 08:48:04       6 阅读
  4. API 类别 - 特效核心

    2024-06-17 08:48:04       5 阅读
  5. Linux 基础IO 三

    2024-06-17 08:48:04       6 阅读
  6. 你应该知道的口语连读技巧

    2024-06-17 08:48:04       6 阅读
  7. Rust创建基准测试bench

    2024-06-17 08:48:04       6 阅读
  8. AWS无服务器 应用程序开发—第十三章 小结2

    2024-06-17 08:48:04       5 阅读
  9. 迁移学习和从头训练(from scratch)的区别

    2024-06-17 08:48:04       6 阅读
  10. Conda编译

    2024-06-17 08:48:04       8 阅读
  11. Linux 常用命令 - userdel 【删除用户】

    2024-06-17 08:48:04       7 阅读