收藏功能的后端实现:
大致要求:收藏功能只对已登录的用户才能使用,点击已查询到的航班的右边收藏按键,可进行航班收藏,当点开收藏页面需要把该用户已收藏的航班显示出来,并可对它的收藏进行删除。
1.点击收藏航班
先考虑它是否是简单的插入操作,由于同一用户对同一个航班不能重复收藏,所以要对它创建service服务。并且要用到新的收藏数据库表要对它进行连接操作
(1)对数据库表进行连接实例化
数据库表的创建在前面部署中已完成
在entity层下创建FlightCollectionTable来存放与数据库表flightcollectiontable相对应的实体类
对应的值要与数据库表的属性值相同
package com.zlw.hangkong.model.entity;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
import javax.persistence.Entity;
import java.io.Serializable;
@Entity
@Data
@Builder
@TableName("flightcollectiontable")
@NoArgsConstructor
@AllArgsConstructor
@Accessors(chain = true)
public class FlightCollectionTable implements Serializable {
@TableField("AirlineCompany")
private String AirlineCompany;
@TableField("email")
private String email;
@TableField("flightplane")
private String flightplane;
@TableField("startTime")
private String startTime;
@TableField("startPalce")
private String startPalce;
@TableField("startDate")
private String startDate;
@TableField("time")
private String time;
@TableField("endTime")
private String endTime;
@TableField("endPalce")
private String endPalce;
@TableField("endDate")
private String endDate;
@TableField("BusinessPrice")
private String BusinessPrice;
@TableField("superEconPrice")
private String superEconPrice;
@TableField("EconPrice")
private String EconPrice;
}
(2)创建basemapper文件,就可以方便的调用basemapper里面的增删改查方法
(3)创建dto文件接受前端请求
package com.zlw.hangkong.model.dto;
import lombok.Data;
@Data
public class CollectDto {
private String airlineCompany;
private String email;
private String flightplane;
private String startTime;
private String startPalce;
private String startDate;
private String time;
private String endTime;
private String endPalce;
private String endDate;
private String businessPrice;
private String superEconPrice;
private String econPrice;
}
(4)创建收藏的service层并创建收藏方法executeCollect(CollectDto dto)
package com.zlw.hangkong.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.zlw.hangkong.model.dto.CollectDto;
import com.zlw.hangkong.model.entity.FlightCollectionTable;
public interface FlightCollectionTableService extends IService<FlightCollectionTable> {
FlightCollectionTable executeCollect(CollectDto dto);
}
(5)创建收藏方法实体类executeCollect(CollectDto dto)
代码注释很详细
大致就是但接受到前端的请求数据,并通过其中一些数据进行判断与数据库表是否存在相同记录数据,有则抛出失败,没有则返回值
@Override
public FlightCollectionTable executeCollect(CollectDto dto){
LambdaQueryWrapper<FlightCollectionTable> wrapper = new LambdaQueryWrapper<>();
//wrapper.eq(FlightCollectionTable::getAirlineCompany, dto.getAirlineCompany()).and(qw -> qw.eq(FlightCollectionTable::getEmail, dto.getEmail())).and(qw -> qw.eq(FlightCollectionTable::getStartTime, dto.getStartTime())).and(qw -> qw.eq(FlightCollectionTable::getStartDate, dto.getStartDate()));
//做一个判断函数,判断前端发送过来的的航空公司、email、飞机的起飞日期和时间和飞机的编号是否与数据库中有对应相同的记录
wrapper.eq(FlightCollectionTable::getAirlineCompany, dto.getAirlineCompany()).eq(FlightCollectionTable::getEmail, dto.getEmail()).eq(FlightCollectionTable::getStartTime, dto.getStartTime()).eq(FlightCollectionTable::getStartDate, dto.getStartDate()).eq(FlightCollectionTable::getFlightplane, dto.getFlightplane());
//把判断放入selecton函数的参数中,相当于查询数据库中是否有一条相同的收藏记录,并放于对象用于判断
FlightCollectionTable flightCollectionTable = baseMapper.selectOne(wrapper);
//如果对象不为空,则表示重复收藏,抛出错误
if (!ObjectUtils.isEmpty(flightCollectionTable)) {
ApiAsserts.fail("请不要重复收藏!!");
}
//如果对象为空,则表示没有重复收藏,则用builder构造,把该dto的数据对应写入数据库表中
FlightCollectionTable addUser = FlightCollectionTable.builder()
.AirlineCompany(dto.getAirlineCompany())
.email(dto.getEmail())
.flightplane(dto.getFlightplane())
.startTime(dto.getStartTime())
.startPalce(dto.getStartPalce())
.startDate(dto.getStartDate())
.time(dto.getTime())
.endTime(dto.getEndTime())
.endPalce(dto.getEndPalce())
.endDate(dto.getEndDate())
.BusinessPrice(dto.getBusinessPrice())
.superEconPrice(dto.getSuperEconPrice())
.EconPrice(dto.getEconPrice())
.build();
baseMapper.insert(addUser);
return addUser;
}
(6)在controller层创建收藏的controller
写入收藏接口
大致意思就是调用service层中的executeCollect(dto)方法,对前端传过来的的数据进行判断,如果返回为空,则表示重复收藏,返回给前端失败。如果不为空,则表示收藏成功,并返回给前端user对象值,表示成功.
@Resource
private FlightCollectionTableService flightCollectionTableService;
@Resource
private FlightCollectionTableMapper flightCollectionTableMapper;
@RequestMapping(value = "/collect", method = RequestMethod.POST) //自动接受register请求,并执行以下
public ApiResult<Map<String, Object>> collect(@Valid @RequestBody CollectDto dto) {
//调用service层中的executeCollect(dto)方法,对传过来的数据进行方法运行,如果没有重复收藏则会返回值,如果重复收藏则没有值
FlightCollectionTable user = flightCollectionTableService.executeCollect(dto);
//如果user对象为空则返回失败
if (ObjectUtils.isEmpty(user)) {
return ApiResult.failed("flase");
}
//如果不为空,则把user对象的数据放入map中,传回给前端,则表示收藏成功
Map<String, Object> map = new HashMap<>(16);//返回一个map容量为16
map.put("user", user);
return ApiResult.success(map);
}
2.显示登录用户的全部收藏航班信息
因为数据库表与前面用的是同一张表,所以不需要再次创建数据库表、实体类和basemapper了
而且该功能是一个简单的查询功能,所以不需要添加对应的服务方法,直接调用basemapper中的查询封装方法即可(mybatis puls对于项目是真的方便!!)
(1)创建dto文件,这边只需要一个email值,来进行查询数据库
(2)写入对应的controller文件中
看代码注释
大致就行接受前端请求给我们的email,通过它进行查询对应数据库表中所以email与它相同的数据返回给前端
@RequestMapping(value = "/allcollect", method = RequestMethod.POST)//自动接受register请求,并执行以下
public ApiResult<List<FlightCollectionTable>> allcollect(@Valid @RequestBody AllcollectDTO dto) {
//创建一个map
HashMap<String, Object> map = new HashMap<>();
//把dto得到的email放入map
map.put("email", dto.getEmail());
//把map放入basemapper的查询方法中.执行,这边不需要对对象判断是否为空,没用意义
List<FlightCollectionTable> flightCollectionTables = flightCollectionTableMapper.selectByMap(map);
//返回查询对象值
return ApiResult.success(flightCollectionTables);
}
3.收藏航班删除功能
这与查询类似,不需要再次创建数据库表、实体类和basemapper
(1)创建dto文件,要用到这些值来找到数据库对应的删除记录
(2)写入对应的controller文件中,
看代码注释
大致就是接受到前端请求的数据,并把他们都放入map中(这些数据用于查找数据库中对应要删除的记录),再使用basemapper里的map删除方法,进行对对应记录的删除,返回给前端成功和数据
@RequestMapping(value = "/delete", method = RequestMethod.POST) //自动接受register请求,并执行以下
public ApiResult<Map<String, Object>> delete(@Valid @RequestBody DeleteDTO dto) {
//创建一个map
HashMap<String, Object> map = new HashMap<>();
//再map中放入各前端发送过来的值,用来查找数据库中对应的记录,这样写,相当于同时具备多条件的判断
map.put("email", dto.getEmail());
map.put("AirlineCompany", dto.getAirlineCompany());
map.put("flightplane", dto.getFlightplane());
map.put("startTime", dto.getStartTime());
map.put("startDate", dto.getStartDate());
//使用basemapper中的map删除方法,进行删除操作
flightCollectionTableMapper.deleteByMap(map);
//返回成功及数据
return ApiResult.success(map);
}