八、顾客手机端页面展示
0、地址管理
需求分析:
一个用户可以有多个地址
一个用户只能设置一个默认地址
设置默认地址时,先将该用户下所有的地址都设置为不默认。再设置默认地址。
将AdressBook相关的domain、dao、service、serviceImpl编写好。
0.1、编写AdressBookController
- Controller的编写,与之前的编写大同小异。
/**
* 地址簿管理
*/
@Slf4j
@RestController
@RequestMapping("/addressBook")
public class AddressBookController {
@Autowired
private AddressBookService addressBookService;
/**
* 新增地址
*/
@PostMapping
public R<AddressBook> save(@RequestBody AddressBook addressBook) {
log.info("addressBook的id:{}",addressBook.getId());
addressBook.setUserId(BaseContext.getCurrentId());
log.info("addressBook:{}", addressBook);
addressBookService.save(addressBook);
return R.success(addressBook);
}
/**
* 设置默认地址
* 先将用户id下的所有地址的is_default都设为0,
* 再将需要设置的地址的is_default设为1。
*/
@PutMapping("default")
public R<AddressBook> setDefault(@RequestBody AddressBook addressBook) {
log.info("addressBook:{}", addressBook);
LambdaUpdateWrapper<AddressBook> wrapper = new LambdaUpdateWrapper<>();
wrapper.eq(AddressBook::getUserId, BaseContext.getCurrentId());
wrapper.set(AddressBook::getIsDefault, 0);
//SQL:update address_book set is_default = 0 where user_id = ?
addressBookService.update(wrapper);
addressBook.setIsDefault(1);
//SQL:update address_book set is_default = 1 where id = ?
addressBookService.updateById(addressBook);
return R.success(addressBook);
}
/**
* 根据id查询地址
*/
@GetMapping("/{id}")
public R get(@PathVariable Long id) {
AddressBook addressBook = addressBookService.getById(id);
if (addressBook != null) {
return R.success(addressBook);
} else {
return R.error("没有找到该对象");
}
}
/**
* 查询默认地址
*/
@GetMapping("default")
public R<AddressBook> getDefault() {
LambdaQueryWrapper<AddressBook> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(AddressBook::getUserId, BaseContext.getCurrentId());
queryWrapper.eq(AddressBook::getIsDefault, 1);
//SQL:select * from address_book where user_id = ? and is_default = 1
AddressBook addressBook = addressBookService.getOne(queryWrapper);
if (null == addressBook) {
return R.error("没有找到该对象");
} else {
return R.success(addressBook);
}
}
/**
* 查询指定用户的全部地址
*/
@GetMapping("/list")
public R<List<AddressBook>> list(AddressBook addressBook) {
addressBook.setUserId(BaseContext.getCurrentId());
log.info("addressBook:{}", addressBook);
//条件构造器
LambdaQueryWrapper<AddressBook> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(null != addressBook.getUserId(), AddressBook::getUserId, addressBook.getUserId());
queryWrapper.orderByDesc(AddressBook::getUpdateTime);
//SQL:select * from address_book where user_id = ? order by update_time desc
return R.success(addressBookService.list(queryWrapper));
}
}
1、菜品展示
-
用户登录成功之后,会自动发送获取菜品列表和套餐列表的请求。
/dish/list
此请求我们之前在DishController
中完成了,但是还不够,还需要完善。具体的就是后端管理菜品时不需要口味表,但是用户端请求时是需要口味表的,逻辑上是用户点菜需要勾选口味。/setmeal/list
这个请求我们需要在SetmealController
编辑,获取套餐下的各个套餐。/setmeal/dish/{id}
这个请求是我们点击套餐查看详情是发起的请求,可以看到套餐中的菜品。需要编辑。
-
我们将DishController中的list请求进行改进即可。将返回的参数改为
R<List<DishDto>>
,这样可以让返回的参数携带着Flavors
口味信息。如下:/** * 根据条件查询响应的菜品信息 * @param dish * @return */ @GetMapping("/list") public R<List<DishDto>> list(Dish dish){ //条件构造器 LambdaQueryWrapper<Dish> queryWrapper = new LambdaQueryWrapper<>(); queryWrapper.eq(dish.getCategoryId()!=null,Dish::getCategoryId,dish.getCategoryId()); queryWrapper.eq(Dish::getStatus,1); //只查询启售的 queryWrapper.orderByAsc(Dish::getSort).orderByDesc(Dish::getUpdateTime); List<Dish> list = dishService.list(queryWrapper); //将返回的Dish的list转为DishDto的list List<DishDto> dishDtoList = list.stream().map(item->{ //创建新的DishDto对象,将Dish的基本信息copy进dishDto DishDto dishDto = new DishDto(); BeanUtils.copyProperties(item,dishDto); //取出dishList中每个dish的id Long dishId = item.getId(); //构造一个dish_flavors表的条件构造器 LambdaQueryWrapper<DishFlavor> wrapper = new LambdaQueryWrapper<>(); //根据dishId来查出dish的口味信息 wrapper.eq(DishFlavor::getDishId,dishId); List<DishFlavor> flavorList = dishFlavorService.list(wrapper); //将口味信息设置进dishDto中,这样需要返回的参数就齐全了 dishDto.setFlavors(flavorList); return dishDto; }).collect(Collectors.toList()); return R.success(dishDtoList); }
-
套餐相关的请求编辑如下:
/** * 用户页面套餐展示 * * @param dish * @return */ @GetMapping("/list") public R<List<Setmeal>> list(Dish dish) { //构造套餐的查询条件 LambdaQueryWrapper<Setmeal> queryWrapper = new LambdaQueryWrapper<>(); //分类id queryWrapper.eq(Setmeal::getCategoryId, dish.getCategoryId()); //分类状态要是启售的 queryWrapper.eq(Setmeal::getStatus, dish.getStatus()); //根据更新时间降序排序 queryWrapper.orderByDesc(Setmeal::getUpdateTime); //查询套餐 List<Setmeal> list = setmealService.list(queryWrapper); return R.success(list); }
/** * 用户页面套餐详情展示 * * @param id * @return */ @GetMapping("/dish/{id}") public R<List<Dish>> setmealDish(@PathVariable Long id) { //构造setmeal_dish表的查询条件 LambdaQueryWrapper<SetmealDish> queryWrapper = new LambdaQueryWrapper<>(); //根据套餐id查询 queryWrapper.eq(SetmealDish::getSetmealId, id); //查询出setmealDish的集合 List<SetmealDish> list = setmealDishService.list(queryWrapper); //遍历其中的每一个setmealDish,取出对应的dishId List<Dish> dishes = list.stream().map(item -> { Long dishId = item.getDishId(); //查询出对应的dish信息 Dish dish = dishService.getById(dishId); //返回收集查询的dish信息为dish集合 return dish; }).collect(Collectors.toList()); return R.success(dishes); }
2、最终效果:
|菜品展示
|套餐列表
|套餐内详情菜品