瑞吉外卖Day6 07-09购物车功能的实现

活动地址:CSDN21天学习挑战赛

目录

1.需求分析

2.数据模型

3.梳理交互过程

4.代码开发

1.需求分析

移动端用户可以将菜品或者套餐添加到购物车。

对于菜品来说,如果设置了口味信息,则需要选择规格以后才能加入购物车。

对于套餐来说,可以直接点击 + 来将当前的套餐加入购物车。

在购物车中可以修改菜品和套餐的数量,也可以清空购物车。

2.数据模型

购物车对应的表为shopping_cart表。

瑞吉外卖Day6 07-09购物车功能的实现_第1张图片

3.梳理交互过程

在开发代码之前,需要梳理一下购物车操作时前端页面和服务端的交互过程:
1、点击    加入购物车  或者 +  按钮,页面发送ajax请求,请求服务端,将菜品或者套餐添加到购物车。
2、点击购物车图标,页面发送ajax请求,请求服务端查询购物车中的菜品和套餐。
3、点击清空购物车按钮,页面发送ajax请求,请求服务端来执行清空购物车操作。

开发购物车功能,其实就是在服务端编写代码去处理前端页面发送的这3次请求即可。

4.代码开发

  • 实体类ShoppingCart
package com.zjw.reggie.entity;

import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;

/**
 * 购物车
 */
@Data
public class ShoppingCart implements Serializable {

    private static final long serialVersionUID = 1L;

    private Long id;

    //名称
    private String name;

    //用户id
    private Long userId;

    //菜品id
    private Long dishId;

    //套餐id
    private Long setmealId;

    //口味
    private String dishFlavor;

    //数量
    private Integer number;

    //金额
    private BigDecimal amount;

    //图片
    private String image;

    private LocalDateTime createTime;
}
  • Mapper接口ShoppingCartMapper
package com.zjw.reggie.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.zjw.reggie.entity.ShoppingCart;
import org.apache.ibatis.annotations.Mapper;

@Mapper
public interface ShoppingCartMapper extends BaseMapper {
}
  • 业务层接口ShoppingCartService
package com.zjw.reggie.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.zjw.reggie.entity.ShoppingCart;

public interface ShoppingCartService extends IService {
}
  • 业务层实现类ShoppingCartServicelmpl
package com.zjw.reggie.service.impl;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.zjw.reggie.entity.ShoppingCart;
import com.zjw.reggie.mapper.ShoppingCartMapper;
import com.zjw.reggie.service.ShoppingCartService;
import org.springframework.stereotype.Service;

@Service
public class ShoppingCartServiceImpl extends ServiceImpl implements ShoppingCartService {
}
  • 控制层ShoppingCartController
package com.zjw.reggie.controller;


import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.zjw.reggie.common.BaseContext;
import com.zjw.reggie.common.R;
import com.zjw.reggie.entity.ShoppingCart;
import com.zjw.reggie.service.ShoppingCartService;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.annotations.Delete;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.List;

@Slf4j
@RestController
@RequestMapping("/shoppingCart")
public class ShoppingCartController {
    @Autowired
    private ShoppingCartService shoppingCartService;

    /**
     * 添加购物车
     * @param shoppingCart
     * @return
     */
    @PostMapping("/add")
    public R add(@RequestBody ShoppingCart shoppingCart){
        //1.先设置用户id,指定当前是哪个用户的购物车数据。  因为前端没有传这个id给我们,但是这个id又非常重要(数据库这个字段不能为null),
        //所以要想办法获取到,我们在用户登录的时候就已经保存了用户的id,存在线程池中。
        Long currentId = BaseContext.getCurrentId();
        shoppingCart.setUserId(currentId);
        //2.获取当前菜品id。 并且判断我们添加的是菜品还是套餐。
        Long dishId = shoppingCart.getDishId();
        LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>();
        if (dishId!=null){
            queryWrapper.eq(ShoppingCart::getDishId,dishId);
        }else {
            queryWrapper.eq(ShoppingCart::getSetmealId,shoppingCart.getSetmealId());

        }
        //3.查询当前菜品或者套餐是否在购物车中。 如果已存在就在当前的数量上加1,  如果不存在,则添加到购物车,数量默认为1。
        ShoppingCart cartServiceOne = shoppingCartService.getOne(queryWrapper);
        if (cartServiceOne!=null){
            Integer number = cartServiceOne.getNumber();
            cartServiceOne.setNumber(number+1);
            shoppingCartService.updateById(cartServiceOne);
        }else {
            shoppingCart.setCreateTime(LocalDateTime.now());
            shoppingCartService.save(shoppingCart);
            //同意返回值
            cartServiceOne = shoppingCart;
        }

        return R.success(cartServiceOne);
    }

    /**
     * 查询用户购物车数据
     * @return
     */
    @GetMapping("/list")
    public R> list(){
        LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(ShoppingCart::getUserId,BaseContext.getCurrentId());
        queryWrapper.orderByDesc(ShoppingCart::getCreateTime);
        List list = shoppingCartService.list(queryWrapper);
        return R.success(list);
    }


    /**
     * 清空购物车
     * @return
     */
    @DeleteMapping("clean")
    public R clean(){
        LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(ShoppingCart::getUserId,BaseContext.getCurrentId());
        shoppingCartService.remove(queryWrapper);
        return R.success("成功清除购物车");
    }
}


你可能感兴趣的:(瑞吉外卖,springboot)