0


基于SpringBoot+Redis的前后端分离外卖项目-苍穹外卖微信小程序端(十二)

购物车相关

1.添加购物车

1.1 需求分析和设计

1.1.1 产品原型

用户可以将菜品或者套餐添加到购物车。对于菜品来说,如果设置了口味信息,则需要选择规格后才能加入购物车;对于套餐来说,可以直接点击+将当前套餐加入购物车。在购物车中可以修改菜品和套餐的数量,也可以清空购物车。

效果图:

在这里插入图片描述

1.1.2 接口设计

通过上述原型图,设计出对应的添加购物车接口。
在这里插入图片描述

说明:添加购物车时,有可能添加菜品,也有可能添加套餐。故传入参数要么是菜品id,要么是套餐id。

1.1.3 表设计

用户的购物车数据,也是需要保存在数据库中的,购物车对应的数据表为shopping_cart表,具体表结构如下:
字段名数据类型说明****备注idbigint主键自增namevarchar(32)商品名称冗余字段imagevarchar(255)商品图片路径冗余字段user_idbigint用户id逻辑外键dish_idbigint菜品id逻辑外键setmeal_idbigint套餐id逻辑外键dish_flavorvarchar(50)菜品口味numberint商品数量amountdecimal(10,2)商品单价冗余字段create_timedatetime创建时间
说明:

  • 购物车数据是关联用户的,在表结构中,我们需要记录,每一个用户的购物车数据是哪些
  • 菜品列表展示出来的既有套餐,又有菜品,如果用户选择的是套餐,就保存套餐ID(setmeal_id),如果用户选择的是菜品,就保存菜品ID(dish_id)
  • 对同一个菜品/套餐,如果选择多份不需要添加多条记录,增加数量number即可

1.2 代码开发

1.2.1 DTO设计

根据添加购物车接口的参数设计DTO:

在这里插入图片描述

在sky-pojo模块,ShoppingCartDTO.java已定义

packagecom.sky.dto;importlombok.Data;importjava.io.Serializable;@DatapublicclassShoppingCartDTOimplementsSerializable{privateLong dishId;privateLong setmealId;privateString dishFlavor;}

1.2.2 Controller层

根据添加购物车接口创建ShoppingCartController:

packagecom.sky.controller.user;/**
 * 购物车
 */@RestController@RequestMapping("/user/shoppingCart")@Slf4j@Api(tags ="C端-购物车接口")publicclassShoppingCartController{@AutowiredprivateShoppingCartService shoppingCartService;/**
     * 添加购物车
     * @param shoppingCartDTO
     * @return
     */@PostMapping("/add")@ApiOperation("添加购物车")publicResult<String>add(@RequestBodyShoppingCartDTO shoppingCartDTO){
        log.info("添加购物车:{}", shoppingCartDTO);
        shoppingCartService.addShoppingCart(shoppingCartDTO);//后绪步骤实现returnResult.success();}}

1.2.3 Service层接口

创建ShoppingCartService接口:

packagecom.sky.service;publicinterfaceShoppingCartService{/**
     * 添加购物车
     * @param shoppingCartDTO
     */voidaddShoppingCart(ShoppingCartDTO shoppingCartDTO);}

1.2.4 Service层实现类

创建ShoppingCartServiceImpl实现类,并实现add方法:

packagecom.sky.service.impl;@ServicepublicclassShoppingCartServiceImplimplementsShoppingCartService{@AutowiredprivateShoppingCartMapper shoppingCartMapper;@AutowiredprivateDishMapper dishMapper;@AutowiredprivateSetmealMapper setmealMapper;/**
     * 添加购物车
     *
     * @param shoppingCartDTO
     */publicvoidaddShoppingCart(ShoppingCartDTO shoppingCartDTO){ShoppingCart shoppingCart =newShoppingCart();BeanUtils.copyProperties(shoppingCartDTO, shoppingCart);//只能查询自己的购物车数据
        shoppingCart.setUserId(BaseContext.getCurrentId());//判断当前商品是否在购物车中List<ShoppingCart> shoppingCartList = shoppingCartMapper.list(shoppingCart);if(shoppingCartList !=null&& shoppingCartList.size()==1){//如果已经存在,就更新数量,数量加1
            shoppingCart = shoppingCartList.get(0);
            shoppingCart.setNumber(shoppingCart.getNumber()+1);
            shoppingCartMapper.updateNumberById(shoppingCart);}else{//如果不存在,插入数据,数量就是1//判断当前添加到购物车的是菜品还是套餐Long dishId = shoppingCartDTO.getDishId();if(dishId !=null){//添加到购物车的是菜品Dish dish = dishMapper.getById(dishId);
                shoppingCart.setName(dish.getName());
                shoppingCart.setImage(dish.getImage());
                shoppingCart.setAmount(dish.getPrice());}else{//添加到购物车的是套餐Setmeal setmeal = setmealMapper.getById(shoppingCartDTO.getSetmealId());
                shoppingCart.setName(setmeal.getName());
                shoppingCart.setImage(setmeal.getImage());
                shoppingCart.setAmount(setmeal.getPrice());}
            shoppingCart.setNumber(1);
            shoppingCart.setCreateTime(LocalDateTime.now());
            shoppingCartMapper.insert(shoppingCart);}}}

1.2.5 Mapper层

创建ShoppingCartMapper接口:

packagecom.sky.mapper;@MapperpublicinterfaceShoppingCartMapper{/**
     * 条件查询
     *
     * @param shoppingCart
     * @return
     */List<ShoppingCart>list(ShoppingCart shoppingCart);/**
     * 更新商品数量
     *
     * @param shoppingCart
     */@Update("update shopping_cart set number = #{number} where id = #{id}")voidupdateNumberById(ShoppingCart shoppingCart);/**
     * 插入购物车数据
     *
     * @param shoppingCart
     */@Insert("insert into shopping_cart (name, user_id, dish_id, setmeal_id, dish_flavor, number, amount, image, create_time) "+" values (#{name},#{userId},#{dishId},#{setmealId},#{dishFlavor},#{number},#{amount},#{image},#{createTime})")voidinsert(ShoppingCart shoppingCart);}

创建ShoppingCartMapper.xml:

<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPEmapperPUBLIC"-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mappernamespace="com.sky.mapper.ShoppingCartMapper"><selectid="list"parameterType="ShoppingCart"resultType="ShoppingCart">
        select * from shopping_cart
        <where><iftest="userId != null">
                and user_id = #{userId}
            </if><iftest="dishId != null">
                and dish_id = #{dishId}
            </if><iftest="setmealId != null">
                and setmeal_id = #{setmealId}
            </if><iftest="dishFlavor != null">
                and dish_flavor = #{dishFlavor}
            </if></where>
        order by create_time desc
    </select></mapper>

2. 查看购物车

2.1 需求分析和设计

2.1.1 产品原型

当用户添加完菜品和套餐后,可进入到购物车中,查看购物中的菜品和套餐。

2.1.2 接口设计

在这里插入图片描述

2.2 代码开发

2.2.1 Controller层

在ShoppingCartController中创建查看购物车的方法:

/**
     * 查看购物车
     * @return
     */@GetMapping("/list")@ApiOperation("查看购物车")publicResult<List<ShoppingCart>>list(){returnResult.success(shoppingCartService.showShoppingCart());}

2.2.2 Service层接口

在ShoppingCartService接口中声明查看购物车的方法:

/**
     * 查看购物车
     * @return
     */List<ShoppingCart>showShoppingCart();

2.2.3 Service层实现类

在ShoppingCartServiceImpl中实现查看购物车的方法:

/**
     * 查看购物车
     * @return
     */publicList<ShoppingCart>showShoppingCart(){return shoppingCartMapper.list(ShoppingCart.builder().userId(BaseContext.getCurrentId()).build());}

2.3 功能测试

在这里插入图片描述

3. 清空购物车

3.1 需求分析和设计

3.1.1 产品原型

当点击清空按钮时,会把购物车中的数据全部清空。
在这里插入图片描述

3.1.2 接口设计

在这里插入图片描述

3.2 代码开发

3.2.1 Controller层

在ShoppingCartController中创建清空购物车的方法:

/**
     * 清空购物车商品
     * @return
     */@DeleteMapping("/clean")@ApiOperation("清空购物车商品")publicResult<String>clean(){
        shoppingCartService.cleanShoppingCart();returnResult.success();}

3.2.2 Service层接口

在ShoppingCartService接口中声明清空购物车的方法:

/**
     * 清空购物车商品
     */voidcleanShoppingCart();

3.2.3 Service层实现类

在ShoppingCartServiceImpl中实现清空购物车的方法:

/**
     * 清空购物车商品
     */publicvoidcleanShoppingCart(){
        shoppingCartMapper.deleteByUserId(BaseContext.getCurrentId());}

3.2.4 Mapper层

在ShoppingCartMapper接口中创建删除购物车数据的方法:

/**
     * 根据用户id删除购物车数据
     *
     * @param userId
     */@Delete("delete from shopping_cart where user_id = #{userId}")voiddeleteByUserId(Long userId);

后记
👉👉💕💕美好的一天,到此结束,下次继续努力!欲知后续,请看下回分解,写作不易,感谢大家的支持!! 🌹🌹🌹


本文转载自: https://blog.csdn.net/m0_59230408/article/details/134427889
版权归原作者 失重外太空. 所有, 如有侵权,请联系我们删除。

“基于SpringBoot+Redis的前后端分离外卖项目-苍穹外卖微信小程序端(十二)”的评论:

还没有评论