Bootstrap

黑马瑞吉外卖用户端顾客手机端页面展示

八、顾客手机端页面展示

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、最终效果:

|菜品展示菜品
|套餐列表
套餐
|套餐内详情菜品
套餐详情

;