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 = '购物车'; 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; src/main/java/cc/mrbird/febs/mall/controller/ApiMallShoppingCartController.java
New file @@ -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; } } src/main/java/cc/mrbird/febs/mall/conversion/MallShoppingCartConversion.java
New file @@ -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); } src/main/java/cc/mrbird/febs/mall/dto/AddCartDto.java
New file @@ -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; } src/main/java/cc/mrbird/febs/mall/entity/MallShoppingCart.java
New file @@ -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; } src/main/java/cc/mrbird/febs/mall/mapper/MallShoppingCartMapper.java
New file @@ -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); } src/main/java/cc/mrbird/febs/mall/service/IApiMallShoppingCartService.java
New file @@ -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); } src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallShoppingCartServiceImpl.java
New file @@ -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); } } } src/main/java/cc/mrbird/febs/mall/vo/ShoppingCartGoodsVo.java
New file @@ -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; } src/main/resources/mapper/modules/MallGoodsSkuMapper.xml
New file @@ -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> src/main/resources/mapper/modules/MallShoppingCartMapper.xml
New file @@ -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>