黑马瑞吉外卖之套餐信息的分页查询
表和实体类环境以及前端页面分析
首先这里是套餐的功能开发,我们在设置数据库表以及之后的实体类的时候我们需要关注的就是套餐本身的分类以及套餐下关联的菜品。
所以首先是数据库表。
来看数据库当中的一个套餐的表以以及其设置的字段。这里我们需要注意到之前的分类管理中的id,我们套餐是分类的一种,所以这里需要有分类id。
于是我么设计出这样的表结构,然后就是实体类。
package com.jgdabc.entity;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;
/**
* 套餐
*/
@Data
public class Setmeal implements Serializable {
private static final long serialVersionUID = 1L;
private Long id;
//分类id
private Long categoryId;
//套餐名称
private String name;
//套餐价格
private BigDecimal price;
//状态 0:停用 1:启用
private Integer status;
//编码
private String code;
//描述信息
private String description;
//图片
private String image;
@TableField(fill = FieldFill.INSERT)
private LocalDateTime createTime;
@TableField(fill = FieldFill.INSERT_UPDATE)
private LocalDateTime updateTime;
@TableField(fill = FieldFill.INSERT)
private Long createUser;
@TableField(fill = FieldFill.INSERT_UPDATE)
private Long updateUser;
//是否删除
private Integer isDeleted;
}
然后我们需要准备的就是套餐和菜品管理的表以及实体类。那自然这个套餐关联菜品的表首先要有套餐的id,然后对应每个i套餐id下详细的彩屏信息。
于是我们涉及出来这样的数据库。
然后就是实体类。
package com.jgdabc.entity;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField;
import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;
/**
* 套餐菜品关系
*/
@Data
public class SetmealDish implements Serializable {
private static final long serialVersionUID = 1L;
private Long id;
//套餐id
private Long setmealId;
//菜品id
private Long dishId;
//菜品名称 (冗余字段)
private String name;
//菜品原价
private BigDecimal price;
//份数
private Integer copies;
//排序
private Integer sort;
@TableField(fill = FieldFill.INSERT)
private LocalDateTime createTime;
@TableField(fill = FieldFill.INSERT_UPDATE)
private LocalDateTime updateTime;
@TableField(fill = FieldFill.INSERT)
private Long createUser;
@TableField(fill = FieldFill.INSERT_UPDATE)
private Long updateUser;
//是否删除
private Integer isDeleted;
}
package com.jgdabc.entity;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField;
import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;
/**
* 套餐菜品关系
*/
@Data
public class SetmealDish implements Serializable {
private static final long serialVersionUID = 1L;
private Long id;
//套餐id
private Long setmealId;
//菜品id
private Long dishId;
//菜品名称 (冗余字段)
private String name;
//菜品原价
private BigDecimal price;
//份数
private Integer copies;
//排序
private Integer sort;
@TableField(fill = FieldFill.INSERT)
private LocalDateTime createTime;
@TableField(fill = FieldFill.INSERT_UPDATE)
private LocalDateTime updateTime;
@TableField(fill = FieldFill.INSERT)
private Long createUser;
@TableField(fill = FieldFill.INSERT_UPDATE)
private Long updateUser;
//是否删除
private Integer isDeleted;
}
然后我们还是需要去扩展实体类属性,于是我们拓展出来dto。我们需要给套餐的实体类添加两个属性,一个是菜品的字段列表属性,一个是分类的名称。这两个属性我们后面需要用到。
在分页查询这里。
有关数据的展示的问题,我们会发现,在setmeal这里其实并没有这个套餐分类,而在前端页面,要展示的话是需要这个字段的,所以我们需要拓展道这个属性,然后菜品数据这里也是一样的道理,我么之后再添加套餐的时候,需要添加菜品的一些信息,以及其它的操作,都需要这个属性。所以我们页扩展了出来。
然后数据展示的话,主要其实就是做一个分页的查询展示。
这样的分页查询我们还是按照之前的逻辑,当我们打开这个前端页面的时候,这里的方法这里其实还是进行了挂载的自动加载。
那就是这样的一个方法。
然后我们点进去去查看这个方法。下面这个就是分页查询的请求方法和路径。
其实在浏览器这里我们也可以去调试路径。
由于我的后端代码已经写好了,所以这里返回200。
后端代码的逻辑开发
在这之前我们还需要进行三层架构的开发,就是dao,service,impl这几层的开发。
首先就是mapper层,我们只需要去在setmeal的基础上去开发,因为只是分页。
然后具体我们直接看到controller,
@GetMapping("/page")
public R_<Page> page(int page,int pageSize,String name)
{
//构造setmeal的分页·构造器
Page<Setmeal> pageInfo = new Page<>(page, pageSize);
// 拓展的dto的分页构造器
Page<SetmealDto> DtoPage = new Page<>();
// setmeal条件的添加
LambdaQueryWrapper<Setmeal> queryWrapper = new LambdaQueryWrapper<>();
// 根据添加name是否查询,如果name为空就不会作为查询条件1,如果不为空就作为查询条件
queryWrapper.like(name!=null,Setmeal::getName,name);
// 添加一个排序条件,根据更新时间来进行降序排列
queryWrapper.orderByDesc(Setmeal::getUpdateTime);
// setmeal里面属性的值的查询,查询的结果会被处理给到pageInfo
setMealService.page(pageInfo,queryWrapper);
// 拷贝属性
// 这里是拷贝属性,但是这个records需要单独处理,因为page里面的这个record是一个泛型修饰的属性,我们拷贝的话,需要
// 注意setmeal做泛型修饰里面的records要转变一下,然后才能给到records,另外我们需要将categoryName
// 加上去
BeanUtils.copyProperties(pageInfo,DtoPage,"records");
// 下面单独处理了records
List<Setmeal> records = pageInfo.getRecords();
List<SetmealDto> list = records.stream().map((item)->
{
SetmealDto setmealDto = new SetmealDto();
BeanUtils.copyProperties(item,setmealDto);
Long categoryId = item.getCategoryId();
//根据分类的id来查询分类的对象
Category category = categoryService.getById(categoryId);
if(category!=null)
{
String categoryName = category.getName();
setmealDto.setCategoryName(categoryName);
}
return setmealDto;
}).collect(Collectors.toList());
DtoPage.setRecords(list);
return R_.success(DtoPage);
}
还是比较容易理解的。整体的代码思路理解了,剩下的就只是单单的记忆了。