分布式商城项目总结四之商品规格参数的实现

2019-10-20  本文已影响0人  MisterDo

2. 什么是商品规格参数

规格参数:


规格参数.PNG

2.1.商品规格参数和类目关系

1.1. 实现思路

1.1.1. 方案一

规格参数的第一种方案.PNG
使用二维表来维护规格数据:

问题:

1、需要创建的表比较多,表和表之间的关系复杂,查询时需要大量的关联。查询效率低。
2、如果展示的规格组或者是规格项需要调整实现麻烦,需要添加排序列。
3、维护不方便,如果删除某个规格分组信息,则所有与之相关的商品的规格信息都发生变化。

解决方案:
使用模板的方式来解决。

2.2.2. 方案二

使用一种动态的方法描述参数模板,每个商品分类对应一个参数模板。添加商品信息时,根据规格参数模板生成规格参数录入项。保存商品时将规格参数生成一个字符串保存到数据库中。展示商品详情时,从数据库中取出规格参数信息,转换成html展示给用户。

如何设计一种动态结构的数据结构?

结论:使用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;
    }
上一篇下一篇

猜你喜欢

热点阅读