尚品汇商城

一、业务介绍

1.1 数据库表结构

根据以上的需求,以此将SKU关联的数据库表结构设计为如下:
05 商品sku保存 - 图2

1.2 数据准备

1.1 平台属性添加05 商品sku保存 - 图3

1.2 商品spu管理

05 商品sku保存 - 图4
添加销售属性信息
05 商品sku保存 - 图5

二、保存skuInfo功能

2.1 图片加载功能

功能分析:图片列表是根据spuId得来,涉及到的数据库表spu_image

2.1.1 添加接口实现类

| 接口_/**

  • 根据spuId 查询spuImageList
  • @param **_spuId
    _* @return
    */
    _List getSpuImageList(Long spuId); | | —- | | 实现类@Override
    public List getSpuImageList(Long spuId) {
    QueryWrapper queryWrapper =
    new QueryWrapper<>();
    queryWrapper.eq(
    “spu_id”, spuId);
    return spuImageMapper**.selectList(queryWrapper);
    } |

2.1.2 添加控制器

| @Api(tags = “商品SKU接口”)
@RestController
@RequestMapping(“admin/product”)
public class SkuManageController {

@Autowired
private ManageService manageService;

_/**

  1. * 根据spuId 查询spuImageList<br />
  2. * **@param **_**_spuId<br />
  3. _**_* **@return<br />
  4. ***/<br />
  5. _@GetMapping(**"spuImageList/{spuId}"**)<br />
  6. **public **Result<List<SpuImage>> getSpuImageList(@PathVariable(**"spuId"**) Long spuId) {<br />
  7. List<SpuImage> spuImageList = **manageService**.getSpuImageList(spuId);<br />
  8. **return **Result._ok_(spuImageList);<br />
  9. }} |

| —- |

2.2 销售属性

2.2.1 编写接口以及实现类

| 接口:_/**

  • 根据spuId 查询销售属性集合
  • @param **_spuId
    _* @return
    */
    _List getSpuSaleAttrList(Long spuId); | | —- | | 实现类:@Override
    public List getSpuSaleAttrList(Long spuId) {
    return spuSaleAttrMapper.selectSpuSaleAttrList(spuId);
    } | | @Mapper
    public interface SpuSaleAttrMapper extends BaseMapper {
    // 根据spuId 查询销售属性集合 _List selectSpuSaleAttrList(Long spuId);
    } | | SpuSaleAttrMapper.xml<?_
    xml version=”1.0” encoding=”UTF-8”?>
    <!DOCTYPE mapper SYSTEM “http://mybatis.org/dtd/mybatis-3-mapper.dtd>
    <mapper namespace=”com.atguigu.gmall.product.mapper.SpuSaleAttrMapper”>
    <
    resultMap id=”spuSaleAttrMap” type=”com.atguigu.gmall.model.product.SpuSaleAttr” autoMapping=”true”>
    <
    id property=”id” column=”id”></id>
    <
    collection property=”spuSaleAttrValueList” ofType=”com.atguigu.gmall.model.product.SpuSaleAttrValue” autoMapping=”true”**>
     <**id property="id" column="sale_attr_value_id"**></**id**>
    
    </collection>
    </resultMap>
    <sql id=”spuSaleAttr”> sa.id ,sa.spu_id, sa.sale_attr_name,sa.base_sale_attr_id,
    sv.id sale_attr_value_id,
    sv.sale_attr_value_name
    </sql> <select id=”selectSpuSaleAttrList” resultMap=”spuSaleAttrMap”> select
    <include refid=”spuSaleAttr”></include> from spu_sale_attr sa inner join spu_sale_attr_value sv
    on sa.spu_id=sv.spu_id and sa.base_sale_attr_id=sv.base_sale_attr_id
    where sa.spu_id=#{spu_id}
    </select> </mapper> |

2.2.2 编写控制器

| _/**

  • 根据spuId 查询销售属性集合
  • @param **_spuId
    _* @return
    */
    _@GetMapping(
    “spuSaleAttrList/{spuId}”)
    public Result> getSpuSaleAttrList(@PathVariable(“spuId”) Long spuId) {
    List spuSaleAttrList =
    manageService.getSpuSaleAttrList(spuId);
    return **Result.ok(spuSaleAttrList);
    } | | —- |

2.3 点击保存按钮

2.3.1 创建mapper

| 创建对应数据库表实体类,以及接口mapper
@Mapper
public interface SkuInfoMapper extends BaseMapper {
} | | —- | | @Mapper
public interface SkuImageMapper extends BaseMapper {
} | | @Mapper
public interface SkuAttrValueMapper extends BaseMapper {
} | | @Mapper
public interface SkuSaleAttrValueMapper extends BaseMapper {
} |

2.3.2 编写接口与实现

| 接口_/**

  • 保存数据
  • @param **_skuInfo
    */
    void saveSkuInfo(SkuInfo skuInfo); | | —- | | 实现类@Override
    @Transactional(rollbackFor = Exception.
    class) public void *saveSkuInfo(SkuInfo skuInfo) {
    _/

     skuInfo 库存单元表 --- spuInfo!
     skuImage 库存单元图片表 --- spuImage!<br />
     skuSaleAttrValue sku销售属性值表{sku与销售属性值的中间表} --- skuInfo ,spuSaleAttrValue<br />
     skuAttrValue sku与平台属性值的中间表 --- skuInfo ,baseAttrValue<br />
    
    /
    _skuInfoMapper.insert(skuInfo);
    List skuImageList = skuInfo.getSkuImageList();
    if (skuImageList != *null
    && skuImageList.size() > 0) {

     _// 循环遍历
     _**for **(SkuImage skuImage : skuImageList) {<br />
         skuImage.setSkuId(skuInfo.getId());<br />
         **skuImageMapper**.insert(skuImage);<br />
     }<br />
    
    }

    List skuSaleAttrValueList = skuInfo.getSkuSaleAttrValueList();
    // 调用判断集合方法 if (!CollectionUtils.isEmpty(skuSaleAttrValueList)) {
     **for **(SkuSaleAttrValue skuSaleAttrValue : skuSaleAttrValueList) {<br />
         skuSaleAttrValue.setSkuId(skuInfo.getId());<br />
         skuSaleAttrValue.setSpuId(skuInfo.getSpuId());<br />
         **skuSaleAttrValueMapper**.insert(skuSaleAttrValue);<br />
     }<br />
    
    }

    List skuAttrValueList = skuInfo.getSkuAttrValueList();
    if (!CollectionUtils.isEmpty(skuAttrValueList)) {
     **for **(SkuAttrValue skuAttrValue : skuAttrValueList) {<br />
         skuAttrValue.setSkuId(skuInfo.getId());<br />
         **skuAttrValueMapper**.insert(skuAttrValue);<br />
     }<br />
    
    }
    } |

2.3.3 编写控制器

SkuManageController

| _/**

  • 保存sku
  • @param **_skuInfo
    _* @return
    */
    _@PostMapping(
    “saveSkuInfo”)
    public Result saveSkuInfo(@RequestBody SkuInfo skuInfo) {
    // 调用服务层
    manageService.saveSkuInfo(skuInfo);
    return **Result.ok();
    } | | —- |


    2.4 查询sku列表以及上下架处理

    2.4.1 编写接口与实现类

    在ManageService 中添加

/
SKU分页列表
@param pageParam
*
@return
*/_IPage getPage(Page pageParam);
/
商品上架
@param _skuId
*/void onSale(Long skuId);
_/

商品下架
@param **_skuId
*/void **cancelSale(Long skuId);

接口实现类
@Overridepublic IPage getPage(Page pageParam) {
QueryWrapper queryWrapper = new QueryWrapper<>();
queryWrapper.orderByDesc(“id”);

IPage page = skuInfoMapper.getPage(pageParam, queryWrapper);
return page;
}

@Override
@Transactionalpublic void onSale(Long skuId) {
// 更改销售状态
_SkuInfo skuInfoUp = new SkuInfo();
skuInfoUp.setId(skuId);
skuInfoUp.setIsSale(1);
skuInfoMapper.updateById(skuInfoUp);
}
@Override
@Transactionalpublic void cancelSale(Long skuId) {
// 更改销售状态
SkuInfo skuInfoUp = new SkuInfo();
skuInfoUp.setId(skuId);
skuInfoUp.setIsSale(0);
skuInfoMapper.updateById(skuInfoUp);
}

_ |

2.4.2 编写控制器

BaseManageController 控制器

| /
SKU分页列表
@param page
*
@param limit
*
@return
*/
@GetMapping(“/list/{page}/{limit}”)public Result index(
@PathVariable Long page,
@PathVariable Long limit) {

Page<SkuInfo> pageParam = **new **Page<>(page, limit);<br />    IPage<SkuInfo> pageModel = manageService.getPage(pageParam);<br />    **return **Result.ok(pageModel);<br />}<br /> <br />_/**<br /> * 商品上架<br /> * **@param **skuId<br /> * **@return<br /> ***/_@GetMapping(**"onSale/{skuId}"**)**public **Result onSale(@PathVariable(**"skuId"**) Long skuId) {<br />    manageService.onSale(skuId);<br />    **return **Result.ok();<br />}<br />_/**<br /> * 商品下架<br /> * **@param **skuId<br /> * **@return<br /> ***/_@GetMapping(**"cancelSale/{skuId}"**)**public **Result cancelSale(@PathVariable(**"skuId"**) Long skuId) {<br />    manageService.cancelSale(skuId);<br />    **return **Result.ok();<br />}<br />  |

| —- |