相关推荐recommended
基于SpringBoot+Redis的前后端分离外卖项目-苍穹外卖微信小程序端(十二)
作者:mmseoamin日期:2024-01-19

购物车相关

  • 1.添加购物车
    • 1.1 需求分析和设计
      • 1.1.1 产品原型
      • 1.1.2 接口设计
      • 1.1.3 表设计
      • 1.2 代码开发
        • 1.2.1 DTO设计
        • 1.2.2 Controller层
        • 1.2.3 Service层接口
        • 1.2.4 Service层实现类
        • 1.2.5 Mapper层
        • 2. 查看购物车
          • 2.1 需求分析和设计
            • 2.1.1 产品原型
            • 2.1.2 接口设计
            • 2.2 代码开发
              • 2.2.1 Controller层
              • 2.2.2 Service层接口
              • 2.2.3 Service层实现类
              • 2.3 功能测试
              • 3. 清空购物车
                • 3.1 需求分析和设计
                  • 3.1.1 产品原型
                  • 3.1.2 接口设计
                  • 3.2 代码开发
                    • 3.2.1 Controller层
                    • 3.2.2 Service层接口
                    • 3.2.3 Service层实现类
                    • 3.2.4 Mapper层

                      1.添加购物车

                      1.1 需求分析和设计

                      1.1.1 产品原型

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

                      效果图:

                      基于SpringBoot+Redis的前后端分离外卖项目-苍穹外卖微信小程序端(十二),在这里插入图片描述,第1张

                      1.1.2 接口设计

                      通过上述原型图,设计出对应的添加购物车接口

                      基于SpringBoot+Redis的前后端分离外卖项目-苍穹外卖微信小程序端(十二),在这里插入图片描述,第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:

                        基于SpringBoot+Redis的前后端分离外卖项目-苍穹外卖微信小程序端(十二),在这里插入图片描述,第3张

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

                        package com.sky.dto;
                        import lombok.Data;
                        import java.io.Serializable;
                        @Data
                        public class ShoppingCartDTO implements Serializable {
                            private Long dishId;
                            private Long setmealId;
                            private String dishFlavor;
                        }
                        

                        1.2.2 Controller层

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

                        package com.sky.controller.user;
                        /**
                         * 购物车
                         */
                        @RestController
                        @RequestMapping("/user/shoppingCart")
                        @Slf4j
                        @Api(tags = "C端-购物车接口")
                        public class ShoppingCartController {
                            @Autowired
                            private ShoppingCartService shoppingCartService;
                            /**
                             * 添加购物车
                             * @param shoppingCartDTO
                             * @return
                             */
                            @PostMapping("/add")
                            @ApiOperation("添加购物车")
                            public Result add(@RequestBody ShoppingCartDTO shoppingCartDTO){
                                log.info("添加购物车:{}", shoppingCartDTO);
                                shoppingCartService.addShoppingCart(shoppingCartDTO);//后绪步骤实现
                                return Result.success();
                            }
                        }
                        

                        1.2.3 Service层接口

                        创建ShoppingCartService接口:

                        package com.sky.service;
                        public interface ShoppingCartService {
                            /**
                             * 添加购物车
                             * @param shoppingCartDTO
                             */
                            void addShoppingCart(ShoppingCartDTO shoppingCartDTO);
                        }
                        

                        1.2.4 Service层实现类

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

                        package com.sky.service.impl;
                        @Service
                        public class ShoppingCartServiceImpl implements ShoppingCartService {
                            @Autowired
                            private ShoppingCartMapper shoppingCartMapper;
                            @Autowired
                            private DishMapper dishMapper;
                            @Autowired
                            private SetmealMapper setmealMapper;
                            
                            /**
                             * 添加购物车
                             *
                             * @param shoppingCartDTO
                             */
                            public void addShoppingCart(ShoppingCartDTO shoppingCartDTO) {
                                ShoppingCart shoppingCart = new ShoppingCart();
                                BeanUtils.copyProperties(shoppingCartDTO, shoppingCart);
                                //只能查询自己的购物车数据
                                shoppingCart.setUserId(BaseContext.getCurrentId());
                                //判断当前商品是否在购物车中
                                List 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接口:

                        package com.sky.mapper;
                        @Mapper
                        public interface ShoppingCartMapper {
                            /**
                             * 条件查询
                             *
                             * @param shoppingCart
                             * @return
                             */
                            List list(ShoppingCart shoppingCart);
                            /**
                             * 更新商品数量
                             *
                             * @param shoppingCart
                             */
                            @Update("update shopping_cart set number = #{number} where id = #{id}")
                            void updateNumberById(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})")
                            void insert(ShoppingCart shoppingCart);
                        }
                        

                        创建ShoppingCartMapper.xml:

                        
                        
                        
                            
                        
                        

                        2. 查看购物车

                        2.1 需求分析和设计

                        2.1.1 产品原型

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

                        2.1.2 接口设计

                        基于SpringBoot+Redis的前后端分离外卖项目-苍穹外卖微信小程序端(十二),在这里插入图片描述,第4张

                        2.2 代码开发

                        2.2.1 Controller层

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

                        	/**
                             * 查看购物车
                             * @return
                             */
                            @GetMapping("/list")
                            @ApiOperation("查看购物车")
                            public Result> list(){
                                return Result.success(shoppingCartService.showShoppingCart());
                            }
                        

                        2.2.2 Service层接口

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

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

                        2.2.3 Service层实现类

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

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

                        2.3 功能测试

                        基于SpringBoot+Redis的前后端分离外卖项目-苍穹外卖微信小程序端(十二),在这里插入图片描述,第5张

                        3. 清空购物车

                        3.1 需求分析和设计

                        3.1.1 产品原型

                        当点击清空按钮时,会把购物车中的数据全部清空。

                        基于SpringBoot+Redis的前后端分离外卖项目-苍穹外卖微信小程序端(十二),在这里插入图片描述,第6张

                        3.1.2 接口设计

                        基于SpringBoot+Redis的前后端分离外卖项目-苍穹外卖微信小程序端(十二),在这里插入图片描述,第7张

                        3.2 代码开发

                        3.2.1 Controller层

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

                        	/**
                             * 清空购物车商品
                             * @return
                             */
                            @DeleteMapping("/clean")
                            @ApiOperation("清空购物车商品")
                            public Result clean(){
                                shoppingCartService.cleanShoppingCart();
                                return Result.success();
                            }
                        

                        3.2.2 Service层接口

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

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

                        3.2.3 Service层实现类

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

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

                        3.2.4 Mapper层

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

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

                        后记

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