分布式商城项目总结四之商品规格参数的实现
2019-10-20 本文已影响0人
MisterDo
2. 什么是商品规格参数
规格参数:
规格参数.PNG
2.1.商品规格参数和类目关系
- 商品规格参数的模板是和商品类目关联的,不同的类目拥有不同的商品规格参数模板。
- 商品规格参数是和商品数据关联的,不同的商品拥有不同的商品规格参数数据。
1.1. 实现思路
1.1.1. 方案一
规格参数的第一种方案.PNG使用二维表来维护规格数据:
- 一个商品分类对应多个规格组,每个规格组对应多个规格项
问题:
1、需要创建的表比较多,表和表之间的关系复杂,查询时需要大量的关联。查询效率低。
2、如果展示的规格组或者是规格项需要调整实现麻烦,需要添加排序列。
3、维护不方便,如果删除某个规格分组信息,则所有与之相关的商品的规格信息都发生变化。
解决方案:
使用模板的方式来解决。
2.2.2. 方案二
使用一种动态的方法描述参数模板,每个商品分类对应一个参数模板。添加商品信息时,根据规格参数模板生成规格参数录入项。保存商品时将规格参数生成一个字符串保存到数据库中。展示商品详情时,从数据库中取出规格参数信息,转换成html展示给用户。
如何设计一种动态结构的数据结构?
- 1、 xml
- 2、 Json
结论:使用json来实现模板以及规格参数数据。
实现流程:
规格参数实现.PNG模板表:
CREATE TABLE `tb_item_param` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`item_cat_id` bigint(20) DEFAULT NULL COMMENT '商品类目ID',
`param_data` text COMMENT '参数数据,格式为json格式',
`created` datetime DEFAULT NULL,
`updated` datetime DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `item_cat_id` (`item_cat_id`)
) ENGINE=InnoDB AUTO_INCREMENT=28 DEFAULT CHARSET=utf8 COMMENT='商品规则参数'
数据表:
CREATE TABLE `tb_item_param_item` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`item_id` bigint(20) DEFAULT NULL COMMENT '商品ID',
`param_data` text COMMENT '参数数据,格式为json格式',
`created` datetime DEFAULT NULL,
`updated` datetime DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `item_id` (`item_id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=utf8 COMMENT='商品规格和商品的关系表'
2.4. 模板格式
[
{
"group": "主体", //组名称
"params": [ // 记录规格成员
"品牌",
"型号",
"颜色",
"上市年份",
"上市月份"
]
},
{
"group": "网络", //组名称
"params": [ // 记录规格成员
"4G",
"3G,
"2G"
]
}
]
2.5. 生成的规格数据格式
[
{
"group": "主体",
"params": [
{
"k": "品牌",
"v": "苹果(Apple)"
},
{
"k": "型号",
"v": "iPhone 6 A1589"
},
{
"k": "智能机",
"v": "是 "
}
]
}
]
2.6 相关页面
2.7 规格参数添加
2.7.1. 查询商品分类是否有模板
商品的规格主要由前端实现,前端到服务端查询是否存在该商品的规格参数,若存在,则不再添加;若不存在,显示添加组件
2.7.1.1. 请求url:
// 判断选择的类目是否已经添加过规格
$.getJSON("/item/param/query/itemcatid/" + node.id,function(data){
if(data.status == 200 && data.data){
$.messager.alert("提示", "该类目已经添加,请选择其他类目。", undefined, function(){
$("#itemParamAddTable .selectItemCat").click();
});
return ;
}
2.7.1.2 返回结果:
TaotaoResult
2.7.1.3. Mapper
使用逆向工程生成的mapper文件
2.7.1.4. Service
//根据商品分类Id去商品规格表中查询对应分类的规格参数
public TaotaoResult getItemParamByCid(long cid) {
TbItemParamExample example = new TbItemParamExample();
TbItemParamExample.Criteria criteria = example.createCriteria();
criteria.andItemCatIdEqualTo(cid);
List<TbItemParam> list = itemParamMapper.selectByExample(example);
if(list!=null && list.size()!=0){
return TaotaoResult.ok(list.get(0));
}
return TaotaoResult.ok();
}
2.7.1.5 Controller
//@Controller
//@RequestMapping("/item/param")
//public class ItemParamController {
@RequestMapping("/query/itemcatid/{itemCatId}")
@ResponseBody
public TaotaoResult getItemParamByCid(@PathVariable Long itemCatId){
TaotaoResult result = itemParamService.getItemParamByCid(itemCatId);
return result;
}
2.7.2. 提交实现:
2.7.2.1. 前台js
2.7.2.2. 请求url
2.7.2.3. 响应的数据
TaotaoResult
2.7.2.4. Mapper
略
2.7.2.5. Service
@Override
public TaotaoResult saveItemParam(long cid, String itemParam) throws Exception {
//创建TbItemParam对象
TbItemParam param = new TbItemParam();
param.setItemCatId(cid);
param.setParamData(itemParam);
param.setCreated(new Date());
param.setUpdated(new Date());
//向数据库添加数据
itemParamMapper.insert(param);
return TaotaoResult.ok();
}
2.7.2.6. Controller
@RequestMapping("/save/{cid}")
@ResponseBody
public TaotaoResult saveItemParam(@PathVariable Long cid, String paramData) throws Exception {
TaotaoResult result = itemParamService.saveItemParam(cid, paramData);
return result;
}