美文网首页
分布式商城项目总结四之商品规格参数的实现

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

作者: MisterDo | 来源:发表于2019-10-20 21:17 被阅读0次

    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;
        }
    

    相关文章

      网友评论

        本文标题:分布式商城项目总结四之商品规格参数的实现

        本文链接:https://www.haomeiwen.com/subject/edxomctx.html