我们测试时可以将发送邮件的代码注释掉,通过控制台打印验证码来简化测试流程
地址簿相关功能:
新增:
// AddressBookController.java
@PostMapping
public R<AddressBook> save(@RequestBody AddressBook addressBook){
// 设置userId
addressBook.setUserId(BaseContext.getCurrentId());
if (addressBookService.save(addressBook)) return R.success(addressBook);
else return R.error("save fail...");
}
设置默认地址:
两个对数据库的操作,用事务,在service层拓展方法
// AddressBookServiceImpl.java
@Override
@Transactional
public boolean setDefaultAddress(AddressBook addressBook) {
// 将userId对应的所有地址默认状态都设为0(取消默认)
LambdaUpdateWrapper<AddressBook> updateWrapper = new LambdaUpdateWrapper<>();
updateWrapper.eq(AddressBook::getUserId, BaseContext.getCurrentId());
updateWrapper.set(AddressBook::getIsDefault, 0);
super.update(updateWrapper);
// 将addressBookId对应的地址设为默认
addressBook.setIsDefault(1);
return super.updateById(addressBook);
}
// AddressBookController.java
@PutMapping("/default")
public R<AddressBook> setDefault(@RequestBody AddressBook addressBook){
if (addressBookService.setDefaultAddress(addressBook)) return R.success(addressBook);
else return R.error("set default fail...");
}
根据id查询地址:
// AddressBookController.java
@GetMapping("/{id}")
public R<AddressBook> get(@PathVariable Long id){
AddressBook addressBook = addressBookService.getById(id);
if (addressBook != null) return R.success(addressBook);
else return R.error("get address fail...");
}
获取默认地址:
// AddressBookController.java
@GetMapping("/default")
public R<AddressBook> getDefault(){
Long userId = BaseContext.getCurrentId();
LambdaQueryWrapper<AddressBook> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(AddressBook::getIsDefault, 1);
queryWrapper.eq(AddressBook::getUserId, userId);
AddressBook addressBook = addressBookService.getOne(queryWrapper);
if (addressBook != null) return R.success(addressBook);
else return R.error("get default address fail...");
}
查询用户所有地址:
// AddressBookController.java
@GetMapping("/list")
public R<List<AddressBook>> list(){
Long userId = BaseContext.getCurrentId();
LambdaQueryWrapper<AddressBook> queryWrapper = new LambdaQueryWrapper();
queryWrapper.eq(AddressBook::getUserId, userId);
queryWrapper.orderByDesc(AddressBook::getUpdateTime);
List<AddressBook> list = addressBookService.list(queryWrapper);
return R.success(list);
}
修改地址:
// AddressBookController.java
@PutMapping
public R<String> updateAds(@RequestBody AddressBook addressBook){
log.info("address = " + addressBook.toString());
if (addressBookService.updateById(addressBook)) return R.success("update address success...");
else return R.error("update address fail...");
}
菜品管理:
菜品展示:

正是因为购物车请求404,所以页面无法显示
同时,页面需要菜品口味信息,但是响应信息的方法返回的是List<Dish>,不包含菜品口味
所以需要把返回类型修改为List<DishDto>,并且赋上口味数据
完善返回数据:
// DishController.java
@GetMapping("/list")
public R<List<DishDto>> list(Dish dish){
LambdaQueryWrapper<Dish> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(dish.getCategoryId() != null, Dish::getCategoryId, dish.getCategoryId());
queryWrapper.orderByAsc(Dish::getSort).orderByDesc(Dish::getUpdateTime);
queryWrapper.eq(Dish::getStatus, 1);
List<Dish> list = dishService.list(queryWrapper);
List<DishDto> dishDtoList = list.stream().map((item) -> {
DishDto dishDto = new DishDto();
BeanUtils.copyProperties(item, dishDto);
LambdaQueryWrapper<DishFlavor> flavorQueryWrapper = new LambdaQueryWrapper<>();
flavorQueryWrapper.eq(DishFlavor::getDishId, item.getId());
List<DishFlavor> dishFlavors = dishFlavorService.list(flavorQueryWrapper);
dishDto.setFlavors(dishFlavors);
return dishDto;
}).collect(Collectors.toList());
return R.success(dishDtoList);
}
套餐展示:

当选择套餐分类时,报404,原因是套餐也需要list方法
// SetMealController.java
@GetMapping("/list")
public R<List<SetMeal>> list(SetMeal setMeal){
LambdaQueryWrapper<SetMeal> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(SetMeal::getCategoryId, setMeal.getCategoryId());
queryWrapper.orderByDesc(SetMeal::getUpdateTime);
List<SetMeal> list = setmealService.list(queryWrapper);
if (list.size() > 0) return R.success(list);
else return R.error("get list fail...");
}
购物车管理:

创建ShoppingCart实体类的mapper, service, serviceImpl, controller
添加/删除:
抽取出代码:
private ShoppingCart queryAndJudge(ShoppingCart shoppingCart){
// 设置用户id
shoppingCart.setUserId(BaseContext.getCurrentId());
LambdaQueryWrapper<ShoppingCart> queryWrapper = new LambdaQueryWrapper<>();
// 根据用户id查询
queryWrapper.eq(ShoppingCart::getUserId, shoppingCart.getUserId());
Long dishId = shoppingCart.getDishId();
// 判断添加到购物车的是dish还是setmeal
if (dishId != null)
queryWrapper.eq(ShoppingCart::getDishId, dishId);
else
queryWrapper.eq(ShoppingCart::getSetmealId, shoppingCart.getSetmealId());
return shoppingCartService.getOne(queryWrapper);
}
添加:
// ShoppingCartController.java
@PostMapping("/add")
public R<ShoppingCart> add(@RequestBody ShoppingCart shoppingCart){
ShoppingCart cart = queryAndJudge(shoppingCart);
// 如果查到,则添加的数量+1,没查到就新添加
if (cart != null){
cart.setNumber(cart.getNumber() + 1);
shoppingCartService.updateById(cart);
} else {
shoppingCartService.save(shoppingCart);
shoppingCart.setCreateTime(LocalDateTime.now());
// 将结果统一到cart上,方便返回
cart = shoppingCart;
}
return R.success(cart);
}
删除:
// ShoppingCartController.java
@PostMapping("/sub")
public R<ShoppingCart> sub(@RequestBody ShoppingCart shoppingCart){
ShoppingCart cart = queryAndJudge(shoppingCart);
if (cart != null){
if (cart.getNumber() == 0) {
shoppingCartService.removeById(cart.getId());
return R.success(cart);
}
cart.setNumber(cart.getNumber() - 1);
shoppingCartService.updateById(cart);
}
return R.success(cart);
}
清空购物车:
// ShoppingCartController.java
@DeleteMapping("/clean")
public R<String> cleanCart(){
Long userId = BaseContext.getCurrentId();
LambdaQueryWrapper<ShoppingCart> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(ShoppingCart::getUserId, userId);
if (shoppingCartService.remove(queryWrapper)) return R.success("delete success...");
else return R.error("delete fail...");
}
用户下单:

创建Order和OrderDetail的mapper, service, serviceImpl, controller
下单操作需要同时操作orders表和order_detial表,在service层扩展方法
// OrderServiceImpl.java
@Override
@Transactional
public boolean submit(Orders orders) {
Long userId = BaseContext.getCurrentId();
// 购物车数据
LambdaQueryWrapper<ShoppingCart> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(ShoppingCart::getUserId, userId);
List<ShoppingCart> carts = shoppingCartService.list(queryWrapper);
if (carts == null || carts.size() == 0) throw new CustomException("shopping cart is empty");
// 用户数据
User user = userService.getById(userId);
// 地址数据
Long addressBookId = orders.getAddressBookId();
AddressBook addressBook = addressBookService.getById(addressBookId);
if (addressBook == null) throw new CustomException("addressBook is empty");
long orderId = IdWorker.getId();
AtomicInteger amount = new AtomicInteger(0);
List<OrderDetail> orderDetailList = carts.stream().map((item) -> {
OrderDetail orderDetail = new OrderDetail();
orderDetail.setOrderId(orderId);
orderDetail.setNumber(item.getNumber());
orderDetail.setDishFlavor(item.getDishFlavor());
orderDetail.setDishId(item.getDishId());
orderDetail.setSetmealId(item.getSetmealId());
orderDetail.setName(item.getName());
orderDetail.setImage(item.getImage());
orderDetail.setAmount(item.getAmount());
amount.addAndGet(item.getAmount().multiply(new BigDecimal(item.getNumber())).intValue());
return orderDetail;
}).collect(Collectors.toList());
// 组装订单数据
orders.setId(orderId);
orders.setOrderTime(LocalDateTime.now());
orders.setCheckoutTime(LocalDateTime.now());
orders.setStatus(2);
orders.setAmount(new BigDecimal(amount.get()));//总金额
orders.setUserId(userId);
orders.setNumber(String.valueOf(orderId));
orders.setUserName(user.getName());
orders.setConsignee(addressBook.getConsignee());
orders.setPhone(addressBook.getPhone());
orders.setAddress((addressBook.getProvinceName() == null ? "" : addressBook.getProvinceName())
+ (addressBook.getCityName() == null ? "" : addressBook.getCityName())
+ (addressBook.getDistrictName() == null ? "" : addressBook.getDistrictName())
+ (addressBook.getDetail() == null ? "" : addressBook.getDetail()));
// 订单表插入数据
super.save(orders);
// 订单明细表插入数据
orderDetailService.saveBatch(orderDetailList);
// 删除购物车
return shoppingCartService.remove(queryWrapper);
}
// OrderController.java
@PostMapping("/submit")
public R<String> submit(@RequestBody Orders orders){
if (orderService.submit(orders)) return R.success("submit success...");
else return R.error("submit fail...");
}
查询订单:
// OrderController.java
@GetMapping("/userPage")
public R<Page<Orders>> page(int page, int pageSize){
Page<Orders> pageInfo = new Page<>(page, pageSize);
LambdaQueryWrapper<Orders> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.orderByDesc(Orders::getOrderTime);
orderService.page(pageInfo, queryWrapper);
return R.success(pageInfo);
}