苍穹外卖【day7| 对购物车进行操作】

📅 发布时间:2026/8/5 8:05:16
苍穹外卖【day7| 对购物车进行操作】
个人主页:一条泥憨鱼(欢迎各位大佬莅临)精选专栏传送门:❄️《数据结构》 ❄️《AI与Agent那些事》❄️《从0开始学计算机网络》 ❄️《后端开发》添加购物车需求分析和设计数据库设计代码开发1️⃣ 数据传输层 (DTO)ShoppingCartDTO.javaData public class ShoppingCartDTO implements Serializable { private Long dishId; // 菜品ID private Long setmealId; // 套餐ID private String dishFlavor; // 菜品口味 }作用接收前端传来的添加购物车请求数据只包含必要的前端参数。2️⃣ 实体类 (Entity)ShoppingCart.javaData Builder public class ShoppingCart implements Serializable { private Long id; private String name; // 商品名称 private Long userId; // 用户ID private Long dishId; // 菜品ID private Long setmealId; // 套餐ID private String dishFlavor; // 口味 private Integer number; // 数量 private BigDecimal amount; // 金额 private String image; // 图片 private LocalDateTime createTime; // 创建时间 }作用购物车的完整数据模型对应数据库表结构。3️⃣ 控制层 (Controller)ShoppingCartController.javaRestController RequestMapping(/user/shoppingCart) Api(tags C端购物车相关接口) public class ShoppingCartController { Autowired private ShoppingCartService shoppingCartService; PostMapping(/add) ApiOperation(添加购物车) public Result add(RequestBody ShoppingCartDTO shoppingCartDTO){ log.info(添加购物车商品信息为:{}, shoppingCartDTO); shoppingCartService.addShoppingCart(shoppingCartDTO); return Result.success(); } }路由POST /user/shoppingCart/add功能接收JSON请求调用service层处理返回成功结果使用Slf4j启用Lombok日志4️⃣ 服务接口层 (Service Interface)ShoppingCartService.javapublic interface ShoppingCartService { void addShoppingCart(ShoppingCartDTO shoppingCartDTO); }5️⃣ 服务实现层 (Service Implementation)ShoppingCartServiceImpl.javaService Slf4j public class ShoppingCartServiceImpl implements ShoppingCartService { Autowired private ShoppingCartMapper shoppingCartMapper; Autowired private DishMapper dishMapper; Autowired private SetmealMapper setmealMapper; public void addShoppingCart(ShoppingCartDTO shoppingCartDTO){ // 1. 构建查询条件 ShoppingCart shoppingCart new ShoppingCart(); BeanUtils.copyProperties(shoppingCartDTO, shoppingCart); Long userId BaseContext.getCurrentId(); // 获取当前登录用户ID shoppingCart.setUserId(userId); // 2. 查询当前用户的购物车中是否已有该商品 ListShoppingCart list shoppingCartMapper.list(shoppingCart); // 3. 如果存在该商品数量1 if(list ! null list.size() 0){ ShoppingCart cart list.get(0); cart.setNumber(cart.getNumber() 1); shoppingCartMapper.updateNumberById(cart); } // 4. 如果不存在需要新增一条记录 else { // 判断是菜品还是套餐 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 { // 添加的是套餐 Long setmealId shoppingCartDTO.getSetmealId(); Setmeal setmeal setmealMapper.getById(setmealId); shoppingCart.setName(setmeal.getName()); shoppingCart.setImage(setmeal.getImage()); shoppingCart.setAmount(setmeal.getPrice()); } shoppingCart.setNumber(1); shoppingCart.setCreateTime(LocalDateTime.now()); shoppingCartMapper.insert(shoppingCart); } } }核心业务逻辑用户隔离通过BaseContext.getCurrentId()获取当前用户ID确保每个用户只能操作自己的购物车存在性检查先查询购物车是否已存在相同商品判断条件userId dishId/setmealId dishFlavor数量累加如果已存在只需将数量number 1新增记录如果不存在根据 dishId 或 setmealId 查询商品信息插入新记录6️⃣ 数据访问层 (Mapper)ShoppingCartMapper.javaMapper public interface ShoppingCartMapper { // 动态条件查询 ListShoppingCart list(ShoppingCart shoppingCart); // 根据id修改商品数量 Update(update shopping_cart set number #{number} where id #{id}) void updateNumberById(ShoppingCart shoppingCart); // 插入购物车数据 Insert(insert into shopping_cart(name, image, user_id, dish_id, setmeal_id, dish_flavor, number, amount, create_time) values(#{name}, #{image}, #{userId}, #{dishId}, #{setmealId}, #{dishFlavor}, #{number}, #{amount}, #{createTime})) void insert(ShoppingCart shoppingCart); }7️⃣ 用户上下文工具类BaseContext.javapublic class BaseContext { public static ThreadLocalLong threadLocal new ThreadLocal(); public static Long getCurrentId() { return threadLocal.get(); } public static void setCurrentId(Long id) { threadLocal.set(id); } }查看购物车需求分析和设计代码开发1️⃣ 控制层 (Controller)ShoppingCartController.javaGetMapping(/list) ApiOperation(查看购物车) public ResultListShoppingCart list (){ ListShoppingCart list shoppingCartService.showShoppingCart(); return Result.success(list); }路由GET /user/shoppingCart/list返回类型ResultListShoppingCart- 包装了购物车列表功能查询当前用户的购物车列表并返回2️⃣ 服务实现层 (Service Implementation)ShoppingCartServiceImpl.java//查看购物车 public ListShoppingCart showShoppingCart(){ //获取到当前微信用户的id Long userId BaseContext.getCurrentId(); ShoppingCart shoppingCart ShoppingCart.builder() .userId(userId) .build(); ListShoppingCart list shoppingCartMapper.list(shoppingCart); return list; }用户隔离通过BaseContext.getCurrentId()获取当前登录用户ID构建查询条件只按userId查询确保用户只能看到自己的购物车调用Mapper执行数据库查询并返回结果3️⃣ Mapper 接口层ShoppingCartMapper.javaMapper public interface ShoppingCartMapper { //动态条件查询 ListShoppingCart list(ShoppingCart shoppingCart); //根据id修改商品数量 Update(update shopping_cart set number #{number} where id #{id}) void updateNumberById(ShoppingCart shoppingCart); //插入购物车数据 Insert(insert into shopping_cart...) void insert(ShoppingCart shoppingCart); }4️⃣ MyBatis XML 映射文件核心SQLShoppingCartMapper.xmlselect idlist resultTypecom.sky.entity.ShoppingCart select * from shopping_cart where if testuserId ! null and user_id #{userId} /if if testsetmealId ! null and setmeal_id #{setmealId} /if if testdishId ! null and dish_id #{dishId} /if if testdishFlavor ! null and dish_flavor #{dishFlavor} /if /where /select 完整请求流程前端 GET /user/shoppingCart/list ↓ ShoppingCartController.list() ↓ ShoppingCartServiceImpl.showShoppingCart() ├── 1. 获取当前用户ID (BaseContext.getCurrentId()) ├── 2. 构建查询条件: ShoppingCart(userId当前用户) └── 3. 调用 shoppingCartMapper.list() ↓ ShoppingCartMapper.xml.list() ↓ 执行动态SQL: SELECT * FROM shopping_cart WHERE user_id ? ↓ 返回 ListShoppingCart ↓ Result.success(list) 包装结果 ↓ 前端收到购物车列表清空购物车需求分析和设计代码开发1️⃣ 控制层 (Controller)ShoppingCartController.java//清空购物车 DeleteMapping(/clean) ApiOperation(清空购物车) public Result clean(){ shoppingCartService.cleanShoppingCart(); return Result.success(); }2️⃣ 服务接口层 (Service Interface)ShoppingCartService.java//清空购物车 void cleanShoppingCart();3️⃣ 服务实现层 (Service Implementation)核心逻辑ShoppingCartServiceImpl.java//清空购物车 public void cleanShoppingCart(){ //获取到当前微信用户的id Long userId BaseContext.getCurrentId(); shoppingCartMapper.deleteByUserId(userId); }用户隔离通过BaseContext.getCurrentId()获取当前登录用户ID只做一件事调用shoppingCartMapper.deleteByUserId(userId)删除该用户的所有购物车数据简洁至上清空购物车不需要复杂的业务逻辑只需按用户ID删除4️⃣ 数据访问层 (Mapper) ⭐核心SQLShoppingCartMapper.java//根据用户id删除购物车数据 Delete(delete from shopping_cart where user_id #{userId}) void deleteByUserId(Long userId); 完整请求流程前端 DELETE /user/shoppingCart/clean ↓ ShoppingCartController.clean() ↓ ShoppingCartServiceImpl.cleanShoppingCart() ├── 1. 获取当前用户ID (BaseContext.getCurrentId()) └── 2. 调用 shoppingCartMapper.deleteByUserId(userId) ↓ 执行SQL: DELETE FROM shopping_cart WHERE user_id ? ↓ 数据库中该用户的所有购物车记录被删除 ↓ Result.success() // 返回成功 ↓ 前端收到成功响应购物车已清空至此操作购物车的代码开发已经全部结束