框架 day76 涛涛商城项目-使用json模板实现带分类的产品规格信息存储及展示

淘淘商城第四天

                       讲师:入云龙

1  商品描述的保存

后台要接收前台页面提交的商品信息,及商品描述。商品信息保存还要保存商品描述。

数据库中商品信息和商品描述是分开存储的。

框架 day76 涛涛商城项目-使用json模板实现带分类的产品规格信息存储及展示_第1张图片

1.1    Dao层

把商品描述信息保存到tb_item_desc表中。

可以使用逆向工程生成的代码

 

1.2    Service层

接收商品描述调用dao把商品描述插入到表中。

参数:String 商品描述

返回值:TaotaoResult

 

@Override

     public TaotaoResult createItem(TbItem item, String desc) throws Exception {

          //item补全

          //生成商品ID

          Long itemId = IDUtils.genItemId();

          item.setId(itemId);

          // '商品状态,1-正常,2-下架,3-删除',

          item.setStatus((byte) 1);

          item.setCreated(new Date());

          item.setUpdated(new Date());

          //插入到数据库

          itemMapper.insert(item);

          //添加商品描述信息

          TaotaoResult result = insertItemDesc(itemId, desc);

          if (result.getStatus() != 200) {

               throw new Exception();

          }

          return TaotaoResult.ok();

     }

     /**

      * 添加商品描述

      *

Title: insertItemDesc

      *

Description:

      * @param desc

      */

     private TaotaoResult insertItemDesc(Long itemId, String desc) {

          TbItemDesc itemDesc = new TbItemDesc();

          itemDesc.setItemId(itemId);

          itemDesc.setItemDesc(desc);

          itemDesc.setCreated(new Date());

          itemDesc.setUpdated(new Date());

          itemDescMapper.insert(itemDesc);

          return TaotaoResult.ok();

     }

 

1.3    Controller

接收商品描述信息。

框架 day76 涛涛商城项目-使用json模板实现带分类的产品规格信息存储及展示_第2张图片



2  商品规格

2.1    什么是商品规格

框架 day76 涛涛商城项目-使用json模板实现带分类的产品规格信息存储及展示_第3张图片

规格参数:

规格组

  |-规格项:规格值

 

规律:

1、同一类商品的规格项分组相同。

2、同一类商品的规格项目是相同的。规格项目是跟商品关联。

3、不同商品规格参数的值是不同的

 

2.2    实现方案

2.2.1  方案一:使用多个表来存储

1、每一类商品有多个分组

2、每个分组下有多个项

3、每个商品对应不同的规格参数

框架 day76 涛涛商城项目-使用json模板实现带分类的产品规格信息存储及展示_第4张图片


框架 day76 涛涛商城项目-使用json模板实现带分类的产品规格信息存储及展示_第5张图片 

使用二维表来维护规格数据。

表一:规格组信息

列名

类型

长度

可以null

说明

Id

Int

 

P

主键(自增长)

group_name

varchar

20

 

规格分组名称

item_cat_id

Int

 

F

商品分类id(外键)

表二:规格项信息

列名

类型

长度

可以null

说明

Id

Int

 

P

主键(自增长)

param_name

varchar

20

 

规格项目名称

group_id

Int

 

F

规格分组id(外键)

表三:商品规格信息

列名

类型

长度

可以null

说明

item_id

Int

 

P

商品id(联合主键)

param_id

varchar

 

P

规格项id(联合主键)

param_value

varchar

500

 

规格信息

 

2.2.2  Sql语句

SELECT

      pg.group_name,pk.param_name,pv.param_value

FROM

      tb_item_param_value pv

LEFT JOIN tb_item_param_key pk ON pv.param_id = pk.id

LEFT JOIN tb_item_param_group pg ON pk.group_id = pg.id

WHERE

      item_id = 855739

 

2.2.3  方案一存在的问题:

1、需要创建多张表来描述规格参数之间的关系。

2、查询时需要复杂的sql语句查询。

3、规格参数数据量是商品信息的几十倍,数据量十分庞大。查询时效率很低。

4、如果要求新添加的商品规格项发生改变,之前的商品不变是不能实现的。

 

2.3    方案二

2.3.1  方案分析

可以使用模板的思路来解决此问题。

1、每一个商品分类对一个规格参数模板。

[

   {

       "group": "主体",  //组名称

       "params": [ // 记录规格成员

            "品牌",

            "型号",

            "颜色",

            "上市年份",

            "上市月份"

       ]

},

{

       "group": "网络",  //组名称

       "params": [ // 记录规格成员

            "4G",

            "3G,

            "2G"

       ]

}

 

]

 

2、使用模板

每个商品对应一唯一的规格参数。在添加商品时,可以根据规格参数的模板。生成一个表单。保存规格参数时。还可以生成规格参数的json数据。保存到数据库中。

[

   {

       "group": "主体",

       "params": [

            {

                "k": "品牌",

                "v": "苹果(Apple)"

            },

            {

                "k": "型号",

                "v": "iPhone 6A1589"

            },

{

                "k": "智能机",

                "v": "是 "

            }

 

       ]

}

]

 

2.3.2  实现流程

框架 day76 涛涛商城项目-使用json模板实现带分类的产品规格信息存储及展示_第6张图片

2.3.3  数据库存储

规格参数模板表:

框架 day76 涛涛商城项目-使用json模板实现带分类的产品规格信息存储及展示_第7张图片

商品的规格参数表:

框架 day76 涛涛商城项目-使用json模板实现带分类的产品规格信息存储及展示_第8张图片 

优点:

1、不需要做多表管理。

2、如果要求新添加的商品规格项发生改变,之前的商品不变是很简单的。

 

缺点:

复杂的表单和json之间的转换。对js的编写要求很高。

 

3  创建规格参数模板

3.1    选择商品分类

选择商品分类后根据选择的商品分类到tb_item_param规格参数模板表中取规格模板,取到了说明此商品分类的规格模板已经添加提示不能添加。

如果没有取得正常添加。

框架 day76 涛涛商城项目-使用json模板实现带分类的产品规格信息存储及展示_第9张图片

框架 day76 涛涛商城项目-使用json模板实现带分类的产品规格信息存储及展示_第10张图片

 框架 day76 涛涛商城项目-使用json模板实现带分类的产品规格信息存储及展示_第11张图片

 

3.1.1  功能分析

请求的url:

/item/param/query/itemcatid/{itemCatId}

参数:itemCatId,从url中获得

返回值:TaotaoResult

 

3.1.2  Dao层

从tb_item_param表中根据商品分类id查询内容。

单表操作。可以实现逆向工程的代码。

 

3.1.3  Service层

功能:接收商品分类id。调用mapper查询tb_item_param表,返回结果TaotaoResult。

@Service

public class ItemParamServiceImpl implements ItemParamService {

 

     @Autowired

     private TbItemParamMapper itemParamMapper;

    

     @Override

     public TaotaoResult getItemParamByCid(long cid) {

          TbItemParamExample example = new TbItemParamExample();

          Criteria criteria = example.createCriteria();

          criteria.andItemCatIdEqualTo(cid);

          List list = itemParamMapper.selectByExample(example);

          //判断是否查询到结果

          if (list != null && list.size() > 0) {

               return TaotaoResult.ok(list.get(0));

          }

         

          return TaotaoResult.ok();

     }

 

}

 

 

3.1.4  Controller

接收cid参数。调用Service查询规格参数模板。返回TaotaoResult。返回json数据。

@Controller

@RequestMapping("/item/param")

public class ItemParamController {

 

     @Autowired

     private ItemParamService itemParamService;

    

     @RequestMapping("/query/itemcatid/{itemCatId}")

     @ResponseBody

     public TaotaoResult getItemParamByCid(@PathVariable Long itemCatId) {

          TaotaoResult result = itemParamService.getItemParamByCid(itemCatId);

          returnresult;

     }

}

3.1.5  Jsp

框架 day76 涛涛商城项目-使用json模板实现带分类的产品规格信息存储及展示_第12张图片

3.2    提交规格参数模板

3.2.1  需求分析

首先把页面中所有文本框中的内容转换成json数据。把json字符串提交给后台。保存到规格参数表中。

框架 day76 涛涛商城项目-使用json模板实现带分类的产品规格信息存储及展示_第13张图片

请求的url:

/item/param/save/{cid}

框架 day76 涛涛商城项目-使用json模板实现带分类的产品规格信息存储及展示_第14张图片

参数:

String paramData

框架 day76 涛涛商城项目-使用json模板实现带分类的产品规格信息存储及展示_第15张图片

返回值:

TaotaoResult

 

3.2.2  Dao层

保存规格参数模板,向tb_item_param表添加一条记录。可以使用逆向工程生成的代码。

 

3.2.3  Service层

功能:接收TbItemParam对象。 把对象调用mapper插入到tb_item_param表中。返回TaotaoResult。

@Override

     public TaotaoResult insertItemParam(TbItemParam itemParam) {

          //补全pojo

          itemParam.setCreated(new Date());

          itemParam.setUpdated(new Date());

          //插入到规格参数模板表

          itemParamMapper.insert(itemParam);

          return TaotaoResult.ok();

     }

 

3.2.4  Controller层

功能:接收cid、规格参数模板。创建一TbItemParam对象。调用Service返回TaotaoResult。返回json数据。

@RequestMapping("/save/{cid}")

     @ResponseBody

     public TaotaoResult insertItemParam(@PathVariable Long cid, String paramData) {

          //创建pojo对象

          TbItemParam itemParam = new TbItemParam();

          itemParam.setItemCatId(cid);

          itemParam.setParamData(paramData);

          TaotaoResult result = itemParamService.insertItemParam(itemParam);

          returnresult;

     }

 

 






4  根据规格参数模板生成表单

在商品添加功能中,读取此商品对应的规格模板,生成表单。供使用者添加规格参数。

4.1    需求分析

框架 day76 涛涛商城项目-使用json模板实现带分类的产品规格信息存储及展示_第16张图片

 

Service修改:

框架 day76 涛涛商城项目-使用json模板实现带分类的产品规格信息存储及展示_第17张图片

框架 day76 涛涛商城项目-使用json模板实现带分类的产品规格信息存储及展示_第18张图片

5  保存商品的规格参数

5.1    需求分析

提交表单之前,先把规格参数表单中的内容转换成json数据然后跟商品基本信息、商品描述同时提交给后台。保存至数据库。

 框架 day76 涛涛商城项目-使用json模板实现带分类的产品规格信息存储及展示_第19张图片

转换后把规格参数的信息放到表单的hidden域中:

框架 day76 涛涛商城项目-使用json模板实现带分类的产品规格信息存储及展示_第20张图片

随着表单的提交同时提交。

 

5.2    Dao层

需要向tb_item_param_item表中添加数据。

 

5.3    Service层

接收规格参数的内容,和商品id。拼装成pojo调用mapper 的方法tb_item_param_item表中添加数据返回TaotaoResult。

/**

      * 添加规格参数

      *

Title: insertItemParamItem

      *

Description:

      * @param itemId

      * @param itemParam

      * @return

      */

     private TaotaoResult insertItemParamItem(Long itemId, String itemParam) {

          //创建一个pojo

          TbItemParamItem itemParamItem = new TbItemParamItem();

          itemParamItem.setItemId(itemId);

          itemParamItem.setParamData(itemParam);

          itemParamItem.setCreated(new Date());

          itemParamItem.setUpdated(new Date());

          //向表中插入数据

          itemParamItemMapper.insert(itemParamItem);

         

          return TaotaoResult.ok();

         

     }

 

 框架 day76 涛涛商城项目-使用json模板实现带分类的产品规格信息存储及展示_第21张图片

5.4    表现层

接收规格参数信息,调用Service层保存商品信息及商品描述及商品规格参数。返回taotaoResult.

框架 day76 涛涛商城项目-使用json模板实现带分类的产品规格信息存储及展示_第22张图片

6  展示规格参数

当现实商品详情页面时,需要把商品的规格参数根据商品id取出来,生成html展示到页面。


6.1    Dao层

根据商品id查询规格参数,单表查询。

 

6.2    Service

接收商品id查询规格参数表。根据返回的规格参数生成html返回html。

@Service

public class ItemParamItemServiceImpl implements ItemParamItemService {

 

     @Autowired

     private TbItemParamItemMapper itemParamItemMapper;

    

     @Override

     public String getItemParamByItemId(Long itemId) {

          //根据商品id查询规格参数

          TbItemParamItemExample example = new TbItemParamItemExample();

          Criteria criteria = example.createCriteria();

          criteria.andItemIdEqualTo(itemId);

          //执行查询

          List list = itemParamItemMapper.selectByExampleWithBLOBs(example);

          if (list == null || list.size() == 0) {

               return "";

          }

          //取规格参数信息

          TbItemParamItem itemParamItem = list.get(0);

          String paramData = itemParamItem.getParamData();

          //生成html

          // 把规格参数json数据转换成java对象

          List<Map> jsonList = JsonUtils.jsonToList(paramData, Map.class);

          StringBuffer sb = new StringBuffer();

          sb.append("

\n");

          sb.append("   

\n");

          for(Map m1:jsonList) {

               sb.append("       

\n");

               sb.append("           

\n");

               sb.append("       

\n");

               List<Map> list2 = (List) m1.get("params");

               for(Map m2:list2) {

                    sb.append("        

\n");

                    sb.append("           

\n");

                    sb.append("           

\n");

                    sb.append("       

\n");

               }

          }

          sb.append("   

\n");

          sb.append("

"+m1.get("group")+"
"+m2.get("k")+" "+m2.get("v")+"
");

          return sb.toString();

     }

 

}

 

6.3    Controller

接收商品id调用Service查询规格参数信息,得到规格参数的html。返回一个逻辑视图。把html展示到页面。

@Controller

public class ItemParamItemController {

 

     @Autowired

     private ItemParamItemService itemParamItemService;

    

     @RequestMapping("/item/{itemId}")

     public String showItemParam(@PathVariable Long itemId, Model model) {

          String string = itemParamItemService.getItemParamByItemId(itemId);

          model.addAttribute("itemParam", string);

          return"item";

     }

}

 

 

你可能感兴趣的:(笔记)