购物车相关
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);
后记
👉👉💕💕美好的一天,到此结束,下次继续努力!欲知后续,请看下回分解,写作不易,感谢大家的支持!! 🌹🌹🌹
版权归原作者 失重外太空. 所有, 如有侵权,请联系我们删除。