当前位置: 首页 > news >正文

添加购物车-02.代码开发

一.代码开发

购物车属于用户端功能,因此要在user下创建controller代码。

Controller层

package com.sky.controller.user;import com.sky.dto.ShoppingCartDTO;
import com.sky.entity.ShoppingCart;
import com.sky.result.Result;
import com.sky.service.ShoppingCartService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
@RequestMapping("/user/shoppingCart")
@Slf4j
@Api(tags = "购物车相关接口")
public class ShoppingCartController {@Autowiredprivate ShoppingCartService shoppingCartService;/*** 添加购物车* @param shoppingCartDTO* @return*/@ApiOperation("添加购物车")@PostMapping("/add")public Result add(@RequestBody ShoppingCartDTO shoppingCartDTO) {log.info("向购物车中添加菜品或套餐:{}",shoppingCartDTO);shoppingCartService.add(shoppingCartDTO);return Result.success();}
}

前端传递过来的参数是JSON类型的,要使用注解@RequestBody。 ShoppingCartDTO中包含3个属性:setmealId,dishId,dishFlavor。

Service层

接口

package com.sky.service;import com.sky.dto.ShoppingCartDTO;
import org.springframework.stereotype.Service;@Service
public interface ShoppingCartService {/*** 添加购物车* @param shoppingCartDTO*/void add(ShoppingCartDTO shoppingCartDTO);
}

实现类

package com.sky.service.impl;import com.sky.context.BaseContext;
import com.sky.dto.ShoppingCartDTO;
import com.sky.entity.Dish;
import com.sky.entity.Setmeal;
import com.sky.entity.ShoppingCart;
import com.sky.mapper.DishMapper;
import com.sky.mapper.SetmealMapper;
import com.sky.mapper.ShoppingCartMapper;
import com.sky.service.ShoppingCartService;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;import java.time.LocalDateTime;
import java.util.List;@Service
public class ShoppingCartServiceImpl implements ShoppingCartService {@Autowiredprivate ShoppingCartMapper shoppingCartMapper;@Autowiredprivate DishMapper dishMapper;@Autowiredprivate SetmealMapper setmealMapper;/*** 添加购物车* @param shoppingCartDTO*/@Overridepublic void add(ShoppingCartDTO shoppingCartDTO) {// 首先判断这次添加购物车的操作加入的菜品或套餐是否已经存在,如果存在就把份数+1,如果不存在就新增ShoppingCart shoppingCart = new ShoppingCart();BeanUtils.copyProperties(shoppingCartDTO,shoppingCart);Long userId = BaseContext.getCurrentId();shoppingCart.setUserId(userId);// 1.首先查询该菜品或套餐在数据库中是否存在List<ShoppingCart> list = shoppingCartMapper.list(shoppingCart);    // 每次添加的要么是菜品,要么是套餐。且如果重复添加只会增加份数而不会新增一条数据,因此每次查询要么为空,要么查询出1条数据if (list != null && list.size() > 0) {      // 已存在,数量+1ShoppingCart cart = list.get(0);    // 将已存在的购物车对象取出cart.setNumber(cart.getNumber() + 1);   // 并将其菜品/套餐数量+1shoppingCartMapper.updateNumberById(cart);      // 通过id更新} else {// 2.不存在,先判断是套餐还是菜品,因为套餐和菜品在购物车中所需要的属性是不一样的Long dishId = shoppingCartDTO.getDishId();if (dishId != null) {// 3.如果是菜品,那么从菜品数据库中查找并将对应属性赋值给购物车对象Dish dish = dishMapper.getById(dishId);shoppingCart.setName(dish.getName());shoppingCart.setImage(dish.getImage());shoppingCart.setAmount(dish.getPrice());} else {// 4.如果是套餐,那么从套餐数据库中查找并将对应属性赋值给购物车对象Long setmealId = shoppingCartDTO.getSetmealId();Setmeal setmeal = setmealMapper.getById(setmealId);shoppingCart.setName(setmeal.getName());shoppingCart.setImage(setmeal.getImage());shoppingCart.setAmount(setmeal.getPrice());}// 5.将新增的菜品/套餐加入数据库中shoppingCart.setNumber(1);shoppingCart.setCreateTime(LocalDateTime.now());shoppingCartMapper.insert(shoppingCart);}}
}

 首先判断这次添加购物车的操作加入的菜品或套餐是否已经存在,如果存在就把份数+1,如果不存在就新增。首先我们创建一个购物车对象shoppingCart,然后将shoppingCartDTO的属性赋值给shoppingCart。接着我们通过前端请求的JWT令牌来获得登录用户的用户id作为shoppingCart对象的userId字段。接着我们进行以下操作:

1.首先查询该菜品或套餐在数据库中是否存在。请注意:每次添加的要么是菜品,要么是套餐。且如果重复添加只会增加份数而不会新增一条数据,因此每次查询要么为空,要么查询出1条数据

如果存在,那么将其数量+1即可,即进行数据库的查询和修改操作。

2.如果不存在,先判断是套餐还是菜品,因为套餐和菜品在购物车中所需要的属性是不一样的。如何判断?通过shoppingCartDTO中的dishId和setmealId判断,哪个不为空就是哪个。

3.如果是菜品,那么从菜品数据库中查找并将对应属性赋值给购物车对象。

4.如果是套餐,那么从套餐数据库中查找并将对应属性赋值给购物车对象。

5.将新增的菜品/套餐加入数据库中。

Mapper层

package com.sky.mapper;import com.sky.entity.ShoppingCart;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Update;import java.util.List;@Mapper
public interface ShoppingCartMapper {/*** 查询菜品/套餐是否存在* @param shoppingCart* @return*/List<ShoppingCart> 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, 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);
}

首先查询是否存在,不存在就执行insert操作,存在就执行update操作。 

 XML映射文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.sky.mapper.ShoppingCartMapper"><select id = "list" resultType="com.sky.entity.ShoppingCart">select * from shopping_cart<where><if test="userId != null">and user_id = #{userId}</if><if test="dishId != null">and dish_id = #{dishId}</if><if test="setmealId != null">and setmeal_id = #{setmealId}</if><if test="dishFlavor != null">and dish_flavor = #{dishFlavor}</if></where></select>
</mapper>

相关文章:

  • 讲讲git 和svn
  • VUE中通过DOM导出PDF
  • SET NX互斥功能的实现原理
  • 电商平台 WAF 防护终极指南
  • 云平台管理部署知识点——问题+答案
  • HTTP方法和状态码(Status Code)
  • 软考教材重点内容 信息安全工程师 第24章 工控安全需求分析与安全保护工程
  • Spring AI 与 Groq 的深度集成:解锁高效 AI 推理新体验
  • CTF实战秘籍:跨平台文件合并与数据重构技术
  • 用postman的时候如何区分服务器还是自己的问题?
  • PyTorch随机数控制全指南:从种子设置到状态管理
  • pclinuxos系统详解
  • AI 时代 UI 设计的未来范式
  • C++多态讲解
  • hive两个表不同数据类型字段关联引发的数据倾斜
  • Java设计模式之装饰器模式:从基础到高级的全面解析(万字解析)
  • Git的基本操作
  • hive在配置文件中添加了hive.metastore.uris之后进入hive输入命令报错
  • R语言实战第5章(1)
  • 前端面经 计网 http和https区别
  • “救护车”半路加价?陕西卫健委已介入,记者调查:黑救护车挤占市场
  • 从普通人经历中发现历史,王笛解读《线索与痕迹》
  • 寒武纪陈天石:公司的产品力获得了行业客户广泛认可,市场有望迎来新增量需求
  • 《AI×SCIENCE十大前沿观察》9:合成数据和数据基础设施
  • 人民币对美元即期汇率盘中创半年新高,离岸市场升破7.2
  • 商务部就开展打击战略矿产走私出口专项行动应询答记者问