pom.xml
@@ -22,6 +22,7 @@ <swagger.ui>2.9.2</swagger.ui> <tomcat.version>9.0.31</tomcat.version> <hutool.version>5.3.1</hutool.version> <mapstruct.version>1.3.1.Final</mapstruct.version> </properties> <dependencies> @@ -254,6 +255,12 @@ <version>4.3.5</version> </dependency> <!-- submail邮件 end --> <dependency> <groupId>org.mapstruct</groupId> <artifactId>mapstruct</artifactId> <version>${mapstruct.version}</version> </dependency> </dependencies> <build> @@ -262,6 +269,28 @@ <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.5.1</version> <configuration> <source>${java.version}</source> <target>${java.version}</target> <annotationProcessorPaths> <path> <groupId>org.mapstruct</groupId> <artifactId>mapstruct-processor</artifactId> <version>${mapstruct.version}</version> </path> <path> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>${lombok.version}</version> </path> </annotationProcessorPaths> </configuration> </plugin> </plugins> </build> </project> src/main/java/cc/mrbird/febs/mall/controller/ApiMallGoodsController.java
@@ -3,6 +3,7 @@ import cc.mrbird.febs.common.entity.FebsResponse; import cc.mrbird.febs.mall.dto.MallGoodsQueryDto; import cc.mrbird.febs.mall.service.IApiMallGoodsService; import cc.mrbird.febs.mall.vo.MallGoodsDetailsVo; import cc.mrbird.febs.mall.vo.MallGoodsListVo; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; @@ -11,10 +12,7 @@ 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; import org.springframework.web.bind.annotation.*; /** * @author wzy @@ -29,7 +27,7 @@ public class ApiMallGoodsController { private final IApiMallGoodsService mallGoodsService; @ApiOperation(value = "findMallGoodsList", notes = "获取商城商品列表") @ApiOperation(value = "获取商城商品列表", notes = "获取商城商品列表") @ApiResponses({ @ApiResponse(code = 200, message = "success", response = MallGoodsListVo.class) }) @@ -38,4 +36,13 @@ return new FebsResponse().success().data(mallGoodsService.findMallGoodsListInPage(queryDto)); } @ApiOperation(value = "获取商品详情", notes = "获取商品详情") @ApiResponses({ @ApiResponse(code = 200, message = "success", response = MallGoodsDetailsVo.class) }) @GetMapping(value = "/findMallGoodsDetailsById/{id}") public FebsResponse findMallGoodsDetailsById(@PathVariable("id") Long id) { return new FebsResponse().success().data(mallGoodsService.findMallGoodsDetailsById(id)); } } src/main/java/cc/mrbird/febs/mall/conversion/MallGoodsConversion.java
New file @@ -0,0 +1,21 @@ package cc.mrbird.febs.mall.conversion; import cc.mrbird.febs.mall.entity.MallGoods; import cc.mrbird.febs.mall.vo.MallGoodsDetailsVo; import org.mapstruct.Mapper; import org.mapstruct.factory.Mappers; import java.util.List; /** * @author wzy * @date 2021-09-17 **/ @Mapper public abstract class MallGoodsConversion { public static final MallGoodsConversion INSTANCE = Mappers.getMapper(MallGoodsConversion.class); public abstract MallGoodsDetailsVo entityToDetailsVo(MallGoods mallGoods); public abstract List<MallGoodsDetailsVo> entityListToDetailsVoList(List<MallGoods> mallGoods); } src/main/java/cc/mrbird/febs/mall/conversion/MallGoodsSkuConversion.java
New file @@ -0,0 +1,21 @@ package cc.mrbird.febs.mall.conversion; import cc.mrbird.febs.mall.entity.MallGoodsSku; import cc.mrbird.febs.mall.vo.GoodsDetailsSkuVo; import org.mapstruct.Mapper; import org.mapstruct.factory.Mappers; import java.util.List; /** * @author wzy * @date 2021-09-17 **/ @Mapper public abstract class MallGoodsSkuConversion { public static final MallGoodsSkuConversion INSTANCE = Mappers.getMapper(MallGoodsSkuConversion.class); public abstract GoodsDetailsSkuVo entityToVo(MallGoodsSku sku); public abstract List<GoodsDetailsSkuVo> entityListToSkuVoList(List<MallGoodsSku> skus); } src/main/java/cc/mrbird/febs/mall/conversion/MallGoodsStyleConversion.java
New file @@ -0,0 +1,21 @@ package cc.mrbird.febs.mall.conversion; import cc.mrbird.febs.mall.entity.MallGoodsStyle; import cc.mrbird.febs.mall.vo.GoodsDetailsStyleVo; import org.mapstruct.Mapper; import org.mapstruct.factory.Mappers; import java.util.List; /** * @author wzy * @date 2021-09-17 **/ @Mapper public abstract class MallGoodsStyleConversion { public static final MallGoodsStyleConversion INSTANCE = Mappers.getMapper(MallGoodsStyleConversion.class); public abstract GoodsDetailsStyleVo entityToStyleVo(MallGoodsStyle goodsStyle); public abstract List<GoodsDetailsStyleVo> entityListToStyleVoList(List<MallGoodsStyle> goodsStyleList); } src/main/java/cc/mrbird/febs/mall/entity/MallGoods.java
@@ -1,8 +1,11 @@ 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; import java.util.List; /** * @author wzy @@ -33,4 +36,10 @@ private Long categoryId; private Integer isHot; @TableField(exist = false) private List<MallGoodsStyle> styles; @TableField(exist = false) private List<String> images; } src/main/java/cc/mrbird/febs/mall/entity/MallGoodsStyle.java
@@ -1,8 +1,11 @@ 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; import java.util.List; /** * @author wzy @@ -15,4 +18,7 @@ private Long goodsId; private String name; @TableField(exist = false) private List<MallGoodsSku> skus; } src/main/java/cc/mrbird/febs/mall/mapper/MallGoodsImagesMapper.java
@@ -1,10 +1,15 @@ package cc.mrbird.febs.mall.mapper; 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 MallGoodsImagesMapper extends BaseMapper<MallGoodsMapper> { List<String> selectGoodsImagesByGoodsId(@Param("goodsId") Long goodsId); } src/main/java/cc/mrbird/febs/mall/mapper/MallGoodsMapper.java
@@ -12,4 +12,6 @@ public interface MallGoodsMapper extends BaseMapper<MallGoods> { IPage<MallGoodsListVo> selectMallGoodsListQueryInPage(@Param("record") MallGoodsQueryDto queryDto, Page<MallGoodsListVo> page); MallGoods selectGoodsDetailById(@Param("id") Long id); } src/main/java/cc/mrbird/febs/mall/service/IApiMallGoodsService.java
@@ -2,11 +2,15 @@ import cc.mrbird.febs.mall.dto.MallGoodsQueryDto; import cc.mrbird.febs.mall.entity.MallGoods; import cc.mrbird.febs.mall.vo.MallGoodsDetailsVo; import cc.mrbird.febs.mall.vo.MallGoodsListVo; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.service.IService; import org.apache.ibatis.annotations.Param; public interface IApiMallGoodsService extends IService<MallGoods> { IPage<MallGoodsListVo> findMallGoodsListInPage(MallGoodsQueryDto queryDto); MallGoodsDetailsVo findMallGoodsDetailsById(@Param("id") Long id); } src/main/java/cc/mrbird/febs/mall/service/impl/ApiMallGoodsServiceImpl.java
@@ -1,9 +1,14 @@ package cc.mrbird.febs.mall.service.impl; import cc.mrbird.febs.common.exception.FebsException; import cc.mrbird.febs.mall.conversion.MallGoodsConversion; import cc.mrbird.febs.mall.conversion.MallMemberConversion; import cc.mrbird.febs.mall.dto.MallGoodsQueryDto; import cc.mrbird.febs.mall.entity.MallGoods; import cc.mrbird.febs.mall.mapper.MallGoodsImagesMapper; import cc.mrbird.febs.mall.mapper.MallGoodsMapper; import cc.mrbird.febs.mall.service.IApiMallGoodsService; import cc.mrbird.febs.mall.vo.MallGoodsDetailsVo; import cc.mrbird.febs.mall.vo.MallGoodsListVo; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; @@ -23,9 +28,23 @@ @RequiredArgsConstructor public class ApiMallGoodsServiceImpl extends ServiceImpl<MallGoodsMapper, MallGoods> implements IApiMallGoodsService { private final MallGoodsImagesMapper goodsImagesMapper; @Override public IPage<MallGoodsListVo> findMallGoodsListInPage(MallGoodsQueryDto queryDto) { Page<MallGoodsListVo> page = new Page<>(queryDto.getPageNow(), queryDto.getPageSize()); return this.baseMapper.selectMallGoodsListQueryInPage(queryDto, page); } @Override public MallGoodsDetailsVo findMallGoodsDetailsById(Long id) { MallGoods mallGoods = this.baseMapper.selectGoodsDetailById(id); if (mallGoods == null) { throw new FebsException("商品不存在"); } List<String> images = goodsImagesMapper.selectGoodsImagesByGoodsId(mallGoods.getId()); MallGoodsDetailsVo mallGoodsDetailsVo = MallGoodsConversion.INSTANCE.entityToDetailsVo(mallGoods); mallGoodsDetailsVo.setImages(images); return mallGoodsDetailsVo; } } src/main/java/cc/mrbird/febs/mall/vo/GoodsDetailsSkuVo.java
New file @@ -0,0 +1,37 @@ package cc.mrbird.febs.mall.vo; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.math.BigDecimal; /** * @author wzy * @date 2021-09-17 **/ @Data @ApiModel(value = "GoodsDetailsSkuVo", description = "商品详情sku返回参数类") public class GoodsDetailsSkuVo { @ApiModelProperty(value = "id") private Long id; @ApiModelProperty(value = "sku名称") private String skuName; @ApiModelProperty(value = "sku图片") private String skuImage; @ApiModelProperty(value = "库存") private Integer stock; @ApiModelProperty(value = "销量") private Integer skuVolume; @ApiModelProperty(value = "原价") private BigDecimal originalPrice; @ApiModelProperty(value = "现价") private BigDecimal presentPrice; } src/main/java/cc/mrbird/febs/mall/vo/GoodsDetailsStyleVo.java
New file @@ -0,0 +1,25 @@ package cc.mrbird.febs.mall.vo; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.util.List; /** * @author wzy * @date 2021-09-17 **/ @Data @ApiModel(value = "GoodsDetailsStyleVo", description = "商品详情样式返回参数类") public class GoodsDetailsStyleVo { @ApiModelProperty(value = "id") private String id; @ApiModelProperty(value = "样式名称") private String name; @ApiModelProperty(value = "sku") private List<GoodsDetailsSkuVo> skus; } src/main/java/cc/mrbird/febs/mall/vo/MallGoodsDetailsVo.java
New file @@ -0,0 +1,46 @@ package cc.mrbird.febs.mall.vo; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.util.List; /** * @author wzy * @date 2021-09-17 **/ @Data @ApiModel(value = "MallGoodsDetailsVo", description = "商品详情返回参数类") public class MallGoodsDetailsVo { @ApiModelProperty(value = "id") private Long id; @ApiModelProperty(value = "商品编号") private String goodsNo; @ApiModelProperty(value = "商品名称") private String goodsName; @ApiModelProperty(value = "商品介绍") private String goodsIntrodution; @ApiModelProperty(value = "商品详情") private String goodsDetails; @ApiModelProperty(value = "原价") private String originalPrice; @ApiModelProperty(value = "现价") private String presentPrice; @ApiModelProperty(value = "是否上架 1-上架 2-下架") private Integer isSale; @ApiModelProperty(value = "轮播图") private List<String> images; @ApiModelProperty(value = "样式") private List<GoodsDetailsStyleVo> styles; } src/main/resources/mapper/modules/MallGoodsImagesMapper.xml
New file @@ -0,0 +1,8 @@ <?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.MallGoodsImagesMapper"> <select id="selectGoodsImagesByGoodsId" resultType="java.lang.String"> select image_url from mall_goods_images where goods_id=#{goodsId} </select> </mapper> src/main/resources/mapper/modules/MallGoodsMapper.xml
@@ -2,6 +2,57 @@ <!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.MallGoodsMapper"> <resultMap id="MallGoodsMap" type="cc.mrbird.febs.mall.entity.MallGoods"> <id property="id" column="id" /> <result property="goodsNo" column="goods_no" /> <result property="goodsName" column="goods_name" /> <result property="goodsIntrodution" column="goods_introdution" /> <result property="unit" column="unit" /> <result property="thumb" column="thumb" /> <result property="goodsDetails" column="goods_details" /> <result property="isSale" column="is_sale" /> <result property="originalPrice" column="original_price" /> <result property="presentPrice" column="present_price" /> <result property="categoryId" column="category_id" /> <collection property="styles" ofType="cc.mrbird.febs.mall.entity.MallGoodsStyle"> <id property="id" column="style_id" /> <result property="name" column="style_name" /> <result property="goodsId" column="style_goods_id" /> <collection property="skus" ofType="cc.mrbird.febs.mall.entity.MallGoodsSku"> <id property="id" column="sku_id" /> <result property="skuName" column="sku_name" /> <result property="skuImage" column="sku_image" /> <result property="stock" column="stock" /> <result property="skuVolume" column="sku_volume" /> <result property="originalPrice" column="sku_original_price" /> <result property="presentPrice" column="sku_present_price" /> <result property="styleId" column="sku_style_id"/> <result property="goodsId" column="sku_goods_id" /> </collection> </collection> </resultMap> <select id="selectGoodsDetailById" resultMap="MallGoodsMap"> select a.*, b.id style_id, b.name style_name, b.goods_id style_goods_id, c.id sku_id, c.sku_name, c.sku_image, c.stock, c.sku_volume, c.original_price sku_original_price, c.present_price sku_present_price, c.style_id sku_style_id, c.goods_id sku_goods_id from mall_goods a inner join mall_goods_style b on a.id = b.goods_id inner join mall_goods_sku c on b.id=c.style_id where a.id=#{id} </select> <select id="selectMallGoodsListQueryInPage" resultType="cc.mrbird.febs.mall.vo.MallGoodsListVo"> select a.id,