1. 保存和更新公寓信息
請求數據的結構?
@Schema(description = "公寓信息")
@Data
public class ApartmentSubmitVo extends ApartmentInfo {@Schema(description="公寓配套id")private List<Long> facilityInfoIds;@Schema(description="公寓標簽id")private List<Long> labelIds;@Schema(description="公寓雜費值id")private List<Long> feeValueIds;@Schema(description="公寓圖片id")private List<GraphVo> graphVoList;}
Controller層
@Operation(summary = "保存或更新公寓信息")@PostMapping("saveOrUpdate")public Result saveOrUpdate(@RequestBody ApartmentSubmitVo apartmentSubmitVo) {apartmentInfoService.saveOrUpdateApartment(apartmentSubmitVo);return Result.ok();}
Service層
void saveOrUpdateApartment(ApartmentSubmitVo apartmentSubmitVo);
/*** 保存或更新公寓信息** @param apartmentSubmitVo 公寓信息提交對象* 若傳入公寓ID為空,則執行插入操作;若不為空,則執行更新操作* 更新操作時會先刪除原有配套、雜費、標簽和圖片信息,再插入新的信息*/@Overridepublic void saveOrUpdateApartment(ApartmentSubmitVo apartmentSubmitVo) {//保存或修改公寓信息://1.判斷該參數id是否為空,為空:插入的新數據 不為空:修改數據boolean isUpdate = apartmentSubmitVo.getId() != null;//2.調用父類保存或修改方法,將公寓基本信息進行保存super.saveOrUpdate(apartmentSubmitVo);if (isUpdate) {//修改數據:直接將所有原數據刪除后重新插入//1.刪除配套LambdaQueryWrapper<ApartmentFacility> facilityLambdaQueryWrapper = new LambdaQueryWrapper<>();facilityLambdaQueryWrapper.eq(ApartmentFacility::getApartmentId, apartmentSubmitVo.getId());facilityService.remove(facilityLambdaQueryWrapper);//2.刪除雜費LambdaQueryWrapper<ApartmentFeeValue> feeValueLambdaQueryWrapper = new LambdaQueryWrapper<>();feeValueLambdaQueryWrapper.eq(ApartmentFeeValue::getFeeValueId, apartmentSubmitVo.getId());feeValueService.remove(feeValueLambdaQueryWrapper);//3.刪除標簽LambdaQueryWrapper<ApartmentLabel> labelLambdaQueryWrapper = new LambdaQueryWrapper<>();labelLambdaQueryWrapper.eq(ApartmentLabel::getLabelId, apartmentSubmitVo.getId());labelService.remove(labelLambdaQueryWrapper);//4.刪除圖片LambdaQueryWrapper<GraphInfo> graphInfoLambdaQueryWrapper = new LambdaQueryWrapper<>();graphInfoLambdaQueryWrapper.eq(GraphInfo::getId, apartmentSubmitVo.getId());graphInfoService.remove(graphInfoLambdaQueryWrapper);}//1.插入配套List<Long> facilityInfoIdsList = apartmentSubmitVo.getFacilityInfoIds();if (!CollectionUtils.isEmpty(facilityInfoIdsList)) {ArrayList<ApartmentFacility> facilityArrayList = new ArrayList<>();for (Long facilityId : facilityInfoIdsList) {ApartmentFacility apartmentFacility = ApartmentFacility.builder().build();apartmentFacility.setFacilityId(facilityId);apartmentFacility.setApartmentId(apartmentSubmitVo.getId());facilityArrayList.add(apartmentFacility);}facilityService.saveBatch(facilityArrayList);}//2.插入雜費List<Long> feeValueIds = apartmentSubmitVo.getFeeValueIds();if (!CollectionUtils.isEmpty(feeValueIds)) {ArrayList<ApartmentFeeValue> apartmentFeeValueList = new ArrayList<>();for (Long feeValueId : feeValueIds) {ApartmentFeeValue apartmentFeeValue = ApartmentFeeValue.builder().build();apartmentFeeValue.setApartmentId(apartmentSubmitVo.getId());apartmentFeeValue.setFeeValueId(feeValueId);apartmentFeeValueList.add(apartmentFeeValue);}feeValueService.saveBatch(apartmentFeeValueList);}//3.插入標簽List<Long> labelIds = apartmentSubmitVo.getLabelIds();if (!CollectionUtils.isEmpty(labelIds)) {ArrayList<ApartmentLabel> apartmentLabelArrayList = new ArrayList<>();for (Long labelId : labelIds) {ApartmentLabel apartmentLabel = ApartmentLabel.builder().build();apartmentLabel.setApartmentId(apartmentSubmitVo.getId());apartmentLabel.setLabelId(labelId);apartmentLabelArrayList.add(apartmentLabel);}labelService.saveBatch(apartmentLabelArrayList);}//4.插入圖片List<GraphVo> graphVoList = apartmentSubmitVo.getGraphVoList();if (!CollectionUtils.isEmpty(graphVoList)) {ArrayList<GraphInfo> graphInfos = new ArrayList<>();for (GraphVo graphVo : graphVoList) {GraphInfo graphInfo = new GraphInfo();graphInfo.setItemType(ItemType.APARTMENT);graphInfo.setItemId(apartmentSubmitVo.getId());graphInfo.setName(graphVo.getName());graphInfo.setUrl(graphVo.getUrl());graphInfos.add(graphInfo);}graphInfoService.saveBatch(graphInfos);}}
2. 根據條件分頁查詢
請求數據結構
@Data
@Schema(description = "公寓查詢實體")
public class ApartmentQueryVo {@Schema(description = "省份id")private Long provinceId;@Schema(description = "城市id")private Long cityId;@Schema(description = "區域id")private Long districtId;
}
?響應數據結構
@Data
@Schema(description = "后臺管理系統公寓列表實體")
public class ApartmentItemVo extends ApartmentInfo {@Schema(description = "房間總數")private Long totalRoomCount;@Schema(description = "空閑房間數")private Long freeRoomCount;}
Controller層
@Operation(summary = "根據條件分頁查詢公寓列表")@GetMapping("pageItem")public Result<IPage<ApartmentItemVo>> pageItem(@RequestParam long current, @RequestParam long size, ApartmentQueryVo queryVo) {Page<ApartmentItemVo> page = new Page<>(current, size);IPage<ApartmentItemVo> result = apartmentInfoService.pageItem(page, queryVo);return Result.ok(result);}
Service層
IPage<ApartmentItemVo> pageItem(Page<ApartmentItemVo> page, ApartmentQueryVo queryVo);
@Overridepublic IPage<ApartmentItemVo> pageItem(Page<ApartmentItemVo> page, ApartmentQueryVo queryVo) {return apartmentInfoMapper.pageItem(page, queryVo);}
Mapper層
IPage<ApartmentItemVo> pageApartmentItemByQuery(IPage<ApartmentItemVo> page, ApartmentQueryVo queryVo);
多表聯查大sql
<select id="pageItem" resultType="com.atguigu.lease.web.admin.vo.apartment.ApartmentItemVo">select ai.id,ai.name,ai.introduction,ai.district_id,ai.district_name,ai.city_id,ai.city_name,ai.province_id,ai.province_name,ai.address_detail,ai.latitude,ai.longitude,ai.phone,ai.is_release,ifnull(tc.cnt, 0) total_room_count,ifnull(tc.cnt, 0) - ifnull(cc.cnt, 0) free_room_countfrom (select id,name,introduction,district_id,district_name,city_id,city_name,province_id,province_name,address_detail,latitude,longitude,phone,is_releasefrom apartment_info<where>is_deleted=0<if test="queryVo.provinceId != null">and province_id=#{queryVo.provinceId}</if><if test="queryVo.cityId != null">and city_id=#{queryVo.cityId}</if><if test="queryVo.districtId != null">and district_id=#{queryVo.districtId}</if></where>) aileft join(select apartment_id,count(*) cntfrom room_infowhere is_deleted = 0and is_release = 1group by apartment_id) tcon ai.id = tc.apartment_idleft join(select apartment_id,count(*) cntfrom lease_agreementwhere is_deleted = 0and status in (2, 5)group by apartment_id) ccon ai.id = cc.apartment_id</select>
knife4j調整傳遞參數
默認情況下Knife4j為該接口生成的接口文檔如下圖所示,其中的queryVo參數不方便調試?
可在application.yml文件中增加如下配置,將queryVo做打平處理
springdoc:default-flat-param-object: true
?
?3.?根據ID獲取公寓詳細信息
響應數據
@Schema(description = "公寓信息")
@Data
public class ApartmentDetailVo extends ApartmentInfo {@Schema(description = "圖片列表")private List<GraphVo> graphVoList;@Schema(description = "標簽列表")private List<LabelInfo> labelInfoList;@Schema(description = "配套列表")private List<FacilityInfo> facilityInfoList;@Schema(description = "雜費列表")private List<FeeValueVo> feeValueVoList;
}
?Controller層
@Operation(summary = "根據ID獲取公寓詳細信息")@GetMapping("getDetailById")public Result<ApartmentDetailVo> getDetailById(@RequestParam Long id) {ApartmentDetailVo apartmentDetailVo = apartmentInfoService.getDetailById(id);return Result.ok(apartmentDetailVo);}
Service層
ApartmentDetailVo getDetailById(Long id);
@Overridepublic ApartmentDetailVo getDetailById(Long id) {//1.查詢公寓基本信息ApartmentInfo apartmentInfo = apartmentInfoMapper.selectById(id);//2.查詢圖片列表List<GraphVo> graphVoList = graphInfoMapper.selectGraphVoList(id, ItemType.APARTMENT);//3.查詢標簽列表List<LabelInfo> labelInfoList = labelInfoMapper.selectLabelInfoList(id); //通過公寓id查詢出所有標簽id,在通過標簽id查出所有標簽信息//4.查詢配套列表List<FacilityInfo> facilityInfoList = facilityInfoMapper.selectFacilityInfoList(id); //通過公寓id查詢出所有配套id,在通過配套id查出所有配套信息//5.查詢雜費列表List<FeeValueVo> feeValueList = feeValueMapper.selectFeeValueList(id); //通過公寓id查詢出所有雜費值id,在通過雜費值id查出所有雜費以及雜費名稱id,再通過雜費名稱id查出雜費名//6.組裝結果ApartmentDetailVo apartmentDetailVo = new ApartmentDetailVo();BeanUtils.copyProperties(apartmentInfo, apartmentDetailVo);apartmentDetailVo.setGraphVoList(graphVoList);apartmentDetailVo.setLabelInfoList(labelInfoList);apartmentDetailVo.setFacilityInfoList(facilityInfoList);apartmentDetailVo.setFeeValueVoList(feeValueList);return apartmentDetailVo;}
Mapper。。。
4. 根據ID刪除公寓信息
@Operation(summary = "根據id刪除公寓信息")@DeleteMapping("removeById")public Result removeById(@RequestParam Long id) {apartmentInfoService.removeApartmentById(id);return Result.ok();}