SKU
stock keeping Unit 库存量单位,我更愿意把SK看成stock中S与K的缩写,称为库存最小单位。
SPU
standard product Unit 标准产品单位,包含产品的各种规格参数,称为商品最小单位。
SPU与分类
每个分类都应该有标准的规格模板。所以有这样的关系
SPU与SKU
- 事实上,SPU中的规格参数与SKU的参数是有交集的,所以规格参数可以分为
所有sku共享的规格属性(称为全局属性)
每个sku不同的规格属性(称为特有属性)
看上去优点复杂
这里用json来保存整个规格参数模板,不需要额外的表,一个字符串就够了。
表结构
CREATE TABLE `tb_specification` (
`category_id` bigint(20) NOT NULL COMMENT '规格模板所属商品分类id',
`specifications` varchar(3000) NOT NULL DEFAULT '' COMMENT '规格参数模板,json格式',
PRIMARY KEY (`category_id`)
)
specificatons:规格参数模板,json格式
因为规格参数分为很多组,也就是把性能信息和大小信息等分开。
前端展示
用分类树的的组件展示。
分类树组件的基本原理
<template>
<li>
<!-- 点击折叠展开 -->
<div @click="toggle">
<!-- 显示内容 -->
{{model.title}}
<!-- 显示折叠展开的图标,如果没有下级目录的话,则不显示 -->
<span v-if="isFolder">[{{open?'-':'+'}}]</span>
</div>
<!-- 控制是否显示下级目录 -->
<ul v-show="open" v-if="isFolder">
<!-- 重点代码,调用自身,实现递归,绑定数据 -->
<Item v-for="model in model.children" :model="model" :key="model.title"></Item>
</ul>
</li>
</template>
<script>
export default {
name: "Item",
// 如果想使用此组件,则需要传递的数据
props: {
model: {
type: Object,
required: true
}
},
data() {
return {
// 默认不显示下级目录
open: false
};
},
computed: {
// 控制是否有下级目录和显示下级目录
isFolder() {
return this.model.children && this.model.children.length;
}
},
methods: {
// 点击折叠展开的方法
toggle() {
if (this.isFolder) {
this.open = !this.open;
}
}
}
};
如果有下一级目录就显式折叠图标。点击触发事件折叠展开。如果有children则递归调用自己。
后端使用通用mapper
- 请求参数:商品分类ID
- 返回结果:将查到的数据直接赋值给specification。
使用通用mapper的CRUD如queryByPrimaryKey就可以。
新增和修改规格参数模板就是把specifications中的内容传到后台进行相应的操作。
删除则是通过判断specifications的长度来决定。长度为0,分组就删除完毕。相应在数据库中根据ID删除。