From 9e5c3243c77592378830754c5a22e53affe8fc95 Mon Sep 17 00:00:00 2001
From: Helius <wangdoubleone@gmail.com>
Date: Fri, 17 Sep 2021 18:52:48 +0800
Subject: [PATCH] add shopping cart

---
 src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallShoppingCartServiceImpl.java |   64 ++++++++++
 src/main/java/cc/mrbird/febs/mall/conversion/MallShoppingCartConversion.java       |   21 +++
 src/main/java/cc/mrbird/febs/mall/vo/ShoppingCartGoodsVo.java                      |   27 ++++
 src/main/resources/mapper/modules/MallShoppingCartMapper.xml                       |   23 +++
 src/main/java/cc/mrbird/febs/mall/entity/MallShoppingCart.java                     |   31 +++++
 src/main/java/cc/mrbird/febs/mall/mapper/MallShoppingCartMapper.java               |   18 +++
 src/main/java/cc/mrbird/febs/mall/service/IApiMallShoppingCartService.java         |   20 +++
 sql/xc_mall.sql                                                                    |   15 ++
 src/main/java/cc/mrbird/febs/common/interceptor/LoginInterceptor.java              |    2 
 src/main/java/cc/mrbird/febs/mall/dto/AddCartDto.java                              |   24 ++++
 src/main/resources/mapper/modules/MallGoodsSkuMapper.xml                           |    9 +
 src/main/java/cc/mrbird/febs/mall/controller/ApiMallShoppingCartController.java    |   48 ++++++++
 12 files changed, 301 insertions(+), 1 deletions(-)

diff --git a/sql/xc_mall.sql b/sql/xc_mall.sql
index ac34e58..3dec379 100644
--- a/sql/xc_mall.sql
+++ b/sql/xc_mall.sql
@@ -110,4 +110,19 @@
 ALTER TABLE `mall_goods_category` ADD COLUMN `is_recommend`  int(11) NULL COMMENT '是否推荐 1:是 2:否' AFTER `parent_ids`;
 alter table mall_goods add is_hot int default 2 null comment '是否热卖 1-是 2-否';
 
+DROP TABLE IF EXISTS mall_shopping_cart;
+CREATE TABLE mall_shopping_cart(
+   REVISION INT    COMMENT '乐观锁' ,
+   CREATED_BY VARCHAR(32)    COMMENT '创建人' ,
+   CREATED_TIME DATETIME    COMMENT '创建时间' ,
+   UPDATED_BY VARCHAR(32)    COMMENT '更新人' ,
+   UPDATED_TIME DATETIME    COMMENT '更新时间' ,
+   ID BIGINT NOT NULL AUTO_INCREMENT  COMMENT '主键' ,
+   member_id BIGINT    COMMENT '用户ID' ,
+   goods_id BIGINT    COMMENT '商品ID' ,
+   style_id BIGINT    COMMENT '样式ID' ,
+   sku_id BIGINT    COMMENT 'skuId' ,
+   cnt VARCHAR(255)    COMMENT '数量' ,
+   PRIMARY KEY (ID)
+)  COMMENT = '购物车';
 
diff --git a/src/main/java/cc/mrbird/febs/common/interceptor/LoginInterceptor.java b/src/main/java/cc/mrbird/febs/common/interceptor/LoginInterceptor.java
index 81c706b..06878ae 100644
--- a/src/main/java/cc/mrbird/febs/common/interceptor/LoginInterceptor.java
+++ b/src/main/java/cc/mrbird/febs/common/interceptor/LoginInterceptor.java
@@ -87,7 +87,7 @@
     }
 
     private Boolean verifyTokenExpired(Long time) {
-        boolean isDebug = false;
+        boolean isDebug = true;
         if (!isDebug) {
             long currentTime = System.currentTimeMillis();
             return currentTime - time <= 30000;
diff --git a/src/main/java/cc/mrbird/febs/mall/controller/ApiMallShoppingCartController.java b/src/main/java/cc/mrbird/febs/mall/controller/ApiMallShoppingCartController.java
new file mode 100644
index 0000000..5b4d427
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/mall/controller/ApiMallShoppingCartController.java
@@ -0,0 +1,48 @@
+package cc.mrbird.febs.mall.controller;
+
+import cc.mrbird.febs.common.entity.FebsResponse;
+import cc.mrbird.febs.mall.dto.AddCartDto;
+import cc.mrbird.febs.mall.service.IApiMallShoppingCartService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.validation.annotation.Validated;
+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;
+
+/**
+ * @author wzy
+ * @date 2021-09-17
+ **/
+@Slf4j
+@Validated
+@RestController
+@RequiredArgsConstructor
+@RequestMapping(value = "/api/cart")
+@Api(value = "ApiMallShoppingCartController", tags = "商城购物车接口请求类")
+public class ApiMallShoppingCartController {
+
+    private final IApiMallShoppingCartService mallShoppingCartService;
+
+    @ApiOperation(value = "获取购物车商品列表", notes = "获取购物车商品列表")
+    @PostMapping(value = "/findCartGoodsList")
+    public FebsResponse findCartGoodsList() {
+        return new FebsResponse().success().data(mallShoppingCartService.findCartGoodsList());
+    }
+
+    @ApiOperation(value = "添加商品到购物车", notes = "添加商品到购物车")
+    @PostMapping(value = "/addGoodsToCart")
+    public FebsResponse addGoodsToCart(@RequestBody AddCartDto addCartDto) {
+        mallShoppingCartService.addGoodsToCart(addCartDto);
+        return new FebsResponse().success().data("添加成功");
+    }
+
+    @ApiOperation(value = "从购物车中删除商品", notes = "从购物车中删除商品")
+    @PostMapping(value = "/delGoods")
+    public FebsResponse delGoods() {
+        return null;
+    }
+}
diff --git a/src/main/java/cc/mrbird/febs/mall/conversion/MallShoppingCartConversion.java b/src/main/java/cc/mrbird/febs/mall/conversion/MallShoppingCartConversion.java
new file mode 100644
index 0000000..1ee9c8d
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/mall/conversion/MallShoppingCartConversion.java
@@ -0,0 +1,21 @@
+package cc.mrbird.febs.mall.conversion;
+
+import cc.mrbird.febs.mall.entity.MallShoppingCart;
+import cc.mrbird.febs.mall.vo.ShoppingCartGoodsVo;
+import org.mapstruct.Mapper;
+import org.mapstruct.factory.Mappers;
+
+import java.util.List;
+
+/**
+ * @author wzy
+ * @date 2021-09-17
+ **/
+@Mapper
+public abstract class MallShoppingCartConversion {
+    public static final MallShoppingCartConversion INSTANCE = Mappers.getMapper(MallShoppingCartConversion.class);
+
+    public abstract ShoppingCartGoodsVo entityToVo(MallShoppingCart cart);
+
+    public abstract List<ShoppingCartGoodsVo> entityListToVoList(List<MallShoppingCart> carts);
+}
diff --git a/src/main/java/cc/mrbird/febs/mall/dto/AddCartDto.java b/src/main/java/cc/mrbird/febs/mall/dto/AddCartDto.java
new file mode 100644
index 0000000..4e6f6ec
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/mall/dto/AddCartDto.java
@@ -0,0 +1,24 @@
+package cc.mrbird.febs.mall.dto;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+
+/**
+ * @author wzy
+ * @date 2021-09-17
+ **/
+@Data
+@ApiModel(value = "AddCartDto", description = "添加到购物车接收参数类")
+public class AddCartDto {
+
+    @NotNull(message = "参数不能为空")
+    @ApiModelProperty(value = "skuId")
+    private Long skuId;
+
+    @NotNull(message = "参数不能为空")
+    @ApiModelProperty(value = "数量")
+    private Integer cnt;
+}
diff --git a/src/main/java/cc/mrbird/febs/mall/entity/MallShoppingCart.java b/src/main/java/cc/mrbird/febs/mall/entity/MallShoppingCart.java
new file mode 100644
index 0000000..f23fc07
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/mall/entity/MallShoppingCart.java
@@ -0,0 +1,31 @@
+package cc.mrbird.febs.mall.entity;
+
+import cc.mrbird.febs.common.entity.BaseEntity;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+/**
+ * @author wzy
+ * @date 2021-09-17
+ **/
+@Data
+@TableName("mall_shopping_cart")
+public class MallShoppingCart extends BaseEntity {
+
+    private Long memberId;
+
+    private Long goodsId;
+
+    private Long styleId;
+
+    private Long skuId;
+
+    private Integer cnt;
+
+    @TableField(exist = false)
+    private MallGoods goods;
+
+    @TableField(exist = false)
+    private MallGoodsSku sku;
+}
diff --git a/src/main/java/cc/mrbird/febs/mall/mapper/MallShoppingCartMapper.java b/src/main/java/cc/mrbird/febs/mall/mapper/MallShoppingCartMapper.java
new file mode 100644
index 0000000..8b79d93
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/mall/mapper/MallShoppingCartMapper.java
@@ -0,0 +1,18 @@
+package cc.mrbird.febs.mall.mapper;
+
+import cc.mrbird.febs.mall.entity.MallShoppingCart;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * @author wzy
+ * @date 2021-09-17
+ **/
+public interface MallShoppingCartMapper extends BaseMapper<MallShoppingCart> {
+
+    List<MallShoppingCart> selectCartGoodsList(@Param("memberId") Long memberId);
+
+    MallShoppingCart selectCartGoodsBySkuId(@Param("skuId") Long skuId, @Param("memberId") Long memberId);
+}
diff --git a/src/main/java/cc/mrbird/febs/mall/service/IApiMallShoppingCartService.java b/src/main/java/cc/mrbird/febs/mall/service/IApiMallShoppingCartService.java
new file mode 100644
index 0000000..6a790d1
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/mall/service/IApiMallShoppingCartService.java
@@ -0,0 +1,20 @@
+package cc.mrbird.febs.mall.service;
+
+import cc.mrbird.febs.mall.dto.AddCartDto;
+import cc.mrbird.febs.mall.entity.MallShoppingCart;
+import cc.mrbird.febs.mall.vo.ShoppingCartGoodsVo;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+import java.util.List;
+
+/**
+ * @author wzy
+ * @date 2021-09-17
+ **/
+public interface IApiMallShoppingCartService extends IService<MallShoppingCart> {
+
+    List<ShoppingCartGoodsVo> findCartGoodsList();
+
+    void addGoodsToCart(AddCartDto addCartDto);
+
+}
diff --git a/src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallShoppingCartServiceImpl.java b/src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallShoppingCartServiceImpl.java
new file mode 100644
index 0000000..f6215dc
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallShoppingCartServiceImpl.java
@@ -0,0 +1,64 @@
+package cc.mrbird.febs.mall.service.impl;
+
+import cc.mrbird.febs.common.exception.FebsException;
+import cc.mrbird.febs.common.utils.LoginUserUtil;
+import cc.mrbird.febs.mall.conversion.MallShoppingCartConversion;
+import cc.mrbird.febs.mall.dto.AddCartDto;
+import cc.mrbird.febs.mall.entity.MallGoodsSku;
+import cc.mrbird.febs.mall.entity.MallShoppingCart;
+import cc.mrbird.febs.mall.mapper.MallGoodsSkuMapper;
+import cc.mrbird.febs.mall.mapper.MallShoppingCartMapper;
+import cc.mrbird.febs.mall.service.IApiMallShoppingCartService;
+import cc.mrbird.febs.mall.vo.ShoppingCartGoodsVo;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * @author wzy
+ * @date 2021-09-17
+ **/
+@Slf4j
+@Service
+@RequiredArgsConstructor
+public class ApiMallShoppingCartServiceImpl extends ServiceImpl<MallShoppingCartMapper, MallShoppingCart> implements IApiMallShoppingCartService {
+
+    private final MallGoodsSkuMapper mallGoodsSkuMapper;
+
+    @Override
+    public List<ShoppingCartGoodsVo> findCartGoodsList() {
+        Long memberId = LoginUserUtil.getLoginUser().getId();
+        List<MallShoppingCart> carts = this.baseMapper.selectCartGoodsList(memberId);
+
+        return MallShoppingCartConversion.INSTANCE.entityListToVoList(carts);
+    }
+
+    @Override
+    public void addGoodsToCart(AddCartDto addCartDto) {
+        MallGoodsSku sku = mallGoodsSkuMapper.selectById(addCartDto.getSkuId());
+
+        if (sku == null) {
+            throw new FebsException("sku不存在");
+        }
+
+        Long memberId = LoginUserUtil.getLoginUser().getId();
+
+        MallShoppingCart cartGoods = this.baseMapper.selectCartGoodsBySkuId(sku.getId(), memberId);
+        if (cartGoods == null) {
+            cartGoods = new MallShoppingCart();
+            cartGoods.setGoodsId(sku.getGoodsId());
+            cartGoods.setSkuId(sku.getId());
+            cartGoods.setStyleId(sku.getStyleId());
+            cartGoods.setCnt(addCartDto.getCnt());
+            cartGoods.setMemberId(memberId);
+
+            this.baseMapper.insert(cartGoods);
+        } else {
+            cartGoods.setCnt(cartGoods.getCnt() + addCartDto.getCnt());
+            this.baseMapper.updateById(cartGoods);
+        }
+    }
+}
diff --git a/src/main/java/cc/mrbird/febs/mall/vo/ShoppingCartGoodsVo.java b/src/main/java/cc/mrbird/febs/mall/vo/ShoppingCartGoodsVo.java
new file mode 100644
index 0000000..01a4f82
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/mall/vo/ShoppingCartGoodsVo.java
@@ -0,0 +1,27 @@
+package cc.mrbird.febs.mall.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * @author wzy
+ * @date 2021-09-17
+ **/
+@Data
+@ApiModel(value = "ShoppingCartGoodsVo", description = "购物车返回参数类")
+public class ShoppingCartGoodsVo {
+
+    @ApiModelProperty(value = "id")
+    private Long id;
+
+    @ApiModelProperty(value = "数量")
+    private Integer cnt;
+
+    @ApiModelProperty(value = "商品详情 若该字段为null则提示商品已删除")
+    private MallGoodsDetailsVo goods;
+
+    @ApiModelProperty(value = "sku信息 若该字段为null则提示sku已删除")
+    private GoodsDetailsSkuVo sku;
+
+}
diff --git a/src/main/resources/mapper/modules/MallGoodsSkuMapper.xml b/src/main/resources/mapper/modules/MallGoodsSkuMapper.xml
new file mode 100644
index 0000000..176ea27
--- /dev/null
+++ b/src/main/resources/mapper/modules/MallGoodsSkuMapper.xml
@@ -0,0 +1,9 @@
+<?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="cc.mrbird.febs.mall.mapper.MallGoodsSkuMapper">
+
+
+    <select id="selectSkuInfoById" resultType="cc.mrbird.febs.mall.entity.MallGoodsSku">
+        select * from mall_goods_sku where id=#{id}
+    </select>
+</mapper>
\ No newline at end of file
diff --git a/src/main/resources/mapper/modules/MallShoppingCartMapper.xml b/src/main/resources/mapper/modules/MallShoppingCartMapper.xml
new file mode 100644
index 0000000..1dd5d8d
--- /dev/null
+++ b/src/main/resources/mapper/modules/MallShoppingCartMapper.xml
@@ -0,0 +1,23 @@
+<?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="cc.mrbird.febs.mall.mapper.MallShoppingCartMapper">
+
+    <resultMap id="ShoppingCartMap" type="cc.mrbird.febs.mall.entity.MallShoppingCart">
+        <id property="id" column="id" />
+        <result property="goodsId" column="goods_id" />
+        <result property="styleId" column="style_id" />
+        <result property="skuId" column="sku_id" />
+        <result property="cnt" column="cnt" />
+        <association property="goods" select="cc.mrbird.febs.mall.mapper.MallGoodsMapper.selectGoodsDetailById" column="{id=goods_id}"></association>
+        <association property="sku" select="cc.mrbird.febs.mall.mapper.MallGoodsSkuMapper.selectSkuInfoById" column="{id=sku_id}"></association>
+    </resultMap>
+    
+    <select id="selectCartGoodsList" resultMap="ShoppingCartMap">
+        select * from mall_shopping_cart where member_id=#{memberId}
+    </select>
+
+    <select id="selectCartGoodsBySkuId" resultType="cc.mrbird.febs.mall.entity.MallShoppingCart">
+        select * from mall_shopping_cart
+        where member_id=#{memberId} and sku_id=#{skuId}
+    </select>
+</mapper>
\ No newline at end of file

--
Gitblit v1.9.1