SpringBoot项目 瑞吉外卖(10)移动端相关

本文描述了一个电商系统的部分关键功能实现,包括测试时通过控制台打印验证码简化流程,地址簿的新增、设置默认地址、查询和修改操作。同时涉及菜品管理,如菜品口味信息的完善,以及购物车的添加、删除和清空功能。最后提到了下单过程,包括订单与订单详情的处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我们测试时可以将发送邮件的代码注释掉,通过控制台打印验证码来简化测试流程

地址簿相关功能:

新增:

// 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);
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值