效果和分析图
效果图
- 实现这3个部分的带条件查询数据的需求
- 出发时间范围条件查询
- 人均消费范围条件查询
- 出行天数范围条件查询
分析图
- 此演示的是对游记数据的条件查询
准备工作
表结构设计
- 游记表结构,画红线即本次演示重点内容
qo类
- 红圈为此文章演示重点
- 前端会对应的传 出行天数,人均消费,出行天数所对应的一个值,后端通过这一个值的判断,即可通过map映射得出对应的最小值和最大值的范围区间
条件类设计(重点)
- 因为求的是范围,所以设2个属性值,min和max
- 因为前端页面有3个条件范围,1.出发时间,2.人均消费,3.出行天数,所以要设3个map集合去封装所对应的值
- 通过static静态代码块,初始化加载的时候,就将此3个map内的值给设定好
- 看前端传过来的是什么key值,则对应返回所需的min和max值,即给后端sql语句查询出过滤后的数据
@Getter
public class TravelCondition {
private int min;
private int max;
public TravelCondition(int min, int max) {
this.min = min;
this.max = max;
}
public static final Map<Integer, TravelCondition> DAY_MAP = new HashMap<>();
public static final Map<Integer, TravelCondition> AVG_MAP = new HashMap<>();
public static final Map<Integer, TravelCondition> TIME_MAP = new HashMap<>();
static {
DAY_MAP.put(1,new TravelCondition(0,3));
DAY_MAP.put(2,new TravelCondition(4,7));
DAY_MAP.put(3,new TravelCondition(8,14));
DAY_MAP.put(4,new TravelCondition(15,Integer.MAX_VALUE));
AVG_MAP.put(1,new TravelCondition(1,999));
AVG_MAP.put(2,new TravelCondition(1000,6000));
AVG_MAP.put(3,new TravelCondition(6001,20000));
AVG_MAP.put(4,new TravelCondition(20001,Integer.MAX_VALUE));
TIME_MAP.put(1,new TravelCondition(1,2));
TIME_MAP.put(2,new TravelCondition(3,4));
TIME_MAP.put(3,new TravelCondition(5,6));
TIME_MAP.put(4,new TravelCondition(7,8));
TIME_MAP.put(5,new TravelCondition(9,10));
TIME_MAP.put(6,new TravelCondition(11,12));
}
}
查询流程代码
前端访问路径
- 下面3个下拉框,每个下拉框的每个范围都是分别传递一个值给后端(总计3个值),后端通过这个值作为key,则查找对应map查出对应的value(条件类),此条件类则含有对应的min值和max值,即可进行过滤查询
- travelTimeType为出行天数下拉框的参数
- consumeType为人均消费下拉框的参数
- dayType为出发时间下拉框的参数
- 以上3个参数值,则是作为qo类的属性值传给后端
后端接口
- 这里使用了分页查询
业务实现方法
- 将qo中的过滤参数值作为key,通过查找条件类内的map数据,即可返回一个有min和max值的条件类
- wrapper 通过ge(大于等于)和le(小于等于)的方法,拼接min和max值,即可完成sql语句对数据的条件过滤操作
- 使用 super.page(page, wrapper); 即可完成数据的过滤(可以直接返回给前端了)
- 拓展部分:遍历page.getRecords() 可获得每一条游记数据,通过里面的getAuthorId()获取对应的用户所有信息,将用户的所有信息再封装进每一个游记对象内,再返回即可(此部分与本文演示重点无关,属于是拓展,可忽略不计)
@Autowired
private TravelContentMapper travelContentMapper;
@Autowired
private IUserInfoService userInfoService;
@Override
public IPage<Travel> queryPage(TravelQuery qo) {
IPage<Travel> page = new Page<>(qo.getCurrentPage(), qo.getPageSize());
QueryWrapper<Travel> wrapper = Wrappers.<Travel>query();
wrapper.eq(qo.getDestId() != null, "dest_id", qo.getDestId());
TravelCondition day = TravelCondition.DAY_MAP.get(qo.getDayType());
if (day != null) {
wrapper.ge("day", day.getMin()).le("day", day.getMax());
}
TravelCondition avg = TravelCondition.AVG_MAP.get(qo.getConsumeType());
if (avg != null) {
wrapper.ge("avg_consume", avg.getMin()).le("avg_consume", avg.getMax());
}
TravelCondition time = TravelCondition.TIME_MAP.get(qo.getTravelTimeType());
if (time != null) {
wrapper.ge("DATE_FORMAT(travel_time,'%m')", time.getMin())
.le("DATE_FORMAT(travel_time,'%m')", time.getMax());
}
wrapper.orderByDesc(StringUtils.hasLength(qo.getOrderBy()), qo.getOrderBy());
super.page(page, wrapper);
for (Travel record : page.getRecords()) {
UserInfo user = userInfoService.getById(record.getAuthorId());
record.setAuthor(user);
}
return page;
}