第04项目:淘淘商城(SpringMVC+Spring+Mybatis) 的学习实践总结【第四天】
https://pan.baidu.com/s/1bptYGAb#list/path=%2F&parentPath=%2Fsharelink389619878-229862621083040
第04项目:淘淘商城(SpringMVC+Spring+Mybatis) 的学习实践总结【第二天】
第04项目:淘淘商城(SpringMVC+Spring+Mybatis) 的学习实践总结【第三天】
第04项目:淘淘商城(SpringMVC+Spring+Mybatis) 的学习实践总结【第四天】
04.第四天(商品规格实现)
一、#虚拟机桥接模式下重启后 Nginx需要手动启动
cd /usr/local/nginx/sbin/ ./nginx -s quit mkdir /var/run/nginx ./nginx -c /usr/local/nginx/conf/taotao-nginx.conf
二、Maven -> Update Project
三、使用Navicat查看在富文本编辑器添加商品后,数据库是否修改成功
SELECT * FROM `tb_item` WHERE price =10000;
使用模板
每个商品对应一唯一的规格参数。在添加商品时,可以根据规格参数的模板。生成一个表单。保存规格参数时。还可以生成规格参数的json数据。保存到数据库中。
实现流程
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<TbItemParam> list = itemParamMapper.selectByExample(example); //判断是否查询到结果 if (list != null && list.size() > 0 ) { return TaotaoResult.ok(list.get(0)); } //返回一个自定义的封装类对象 return TaotaoResult.ok(); }pojo
TaotaoResultpackage com.taotao.common.pojo; import java.util.List; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; /** * 淘淘商城自定义响应结构 */ public class TaotaoResult { // 定义jackson对象 private static final ObjectMapper MAPPER = new ObjectMapper(); // 响应业务状态 private Integer status; // 响应消息 private String msg; // 响应中的数据 private Object data; public static TaotaoResult build(Integer status, String msg, Object data) { return new TaotaoResult(status, msg, data); } public static TaotaoResult ok(Object data) { return new TaotaoResult(data); } public static TaotaoResult ok() { return new TaotaoResult(null); } public TaotaoResult() { } public static TaotaoResult build(Integer status, String msg) { return new TaotaoResult(status, msg, null); } public TaotaoResult(Integer status, String msg, Object data) { this.status = status; this.msg = msg; this.data = data; } public TaotaoResult(Object data) { this.status = 200; this.msg = "OK"; this.data = data; } // public Boolean isOK() { // return this.status == 200; // } public Integer getStatus() { return status; } public void setStatus(Integer status) { this.status = status; } public String getMsg() { return msg; } public void setMsg(String msg) { this.msg = msg; } public Object getData() { return data; } public void setData(Object data) { this.data = data; } /** * 将json结果集转化为TaotaoResult对象 * * @param jsonData json数据 * @param clazz TaotaoResult中的object类型 * @return */ public static TaotaoResult formatToPojo(String jsonData, Class<?> clazz) { try { if (clazz == null) { return MAPPER.readValue(jsonData, TaotaoResult.class); } JsonNode jsonNode = MAPPER.readTree(jsonData); JsonNode data = jsonNode.get("data"); Object obj = null; if (clazz != null) { if (data.isObject()) { obj = MAPPER.readValue(data.traverse(), clazz); } else if (data.isTextual()) { obj = MAPPER.readValue(data.asText(), clazz); } } return build(jsonNode.get("status").intValue(), jsonNode.get("msg").asText(), obj); } catch (Exception e) { return null; } } /** * 没有object对象的转化 * * @param json * @return */ public static TaotaoResult format(String json) { try { return MAPPER.readValue(json, TaotaoResult.class); } catch (Exception e) { e.printStackTrace(); } return null; } /** * Object是集合转化 * * @param jsonData json数据 * @param clazz 集合中的类型 * @return */ public static TaotaoResult formatToList(String jsonData, Class<?> clazz) { try { JsonNode jsonNode = MAPPER.readTree(jsonData); JsonNode data = jsonNode.get("data"); Object obj = null; if (data.isArray() && data.size() > 0) { obj = MAPPER.readValue(data.traverse(), MAPPER.getTypeFactory().constructCollectionType(List.class, clazz)); } return build(jsonNode.get("status").intValue(), jsonNode.get("msg").asText(), obj); } catch (Exception e) { return null; } } }Controller层
接收cid参数。调用Service查询规格参数模板。返回TaotaoResult。返回json数据。
ItemParamController//商品规格参数模板管理 @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); return result; } }
4.2 提交规格参数模板
4.2.1 需求分析
首先把页面中所有文本框中的内容转换成json数据。把json字符串提交给后台。保存到规格参数表中。
4.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(); }
4.2.4 Controller层
功能:接收cid、规格参数模板。创建一TbItemParam对象。调用Service返回TaotaoResult。easyUI用的返回json数据。
ItemParamController
@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); return result; }
6 保存商品的规格参数
提交表单之前,先把规格参数表单中的内容转换成json数据然后跟商品基本信息、商品描述同时提交给后台。保存至数据库。
转换后把规格参数的信息放到表单的hidden域中:
随着表单的提交同时提交。
//添加规格参数的私有方法 private TaotaoResult insertItemParam(Long itemId, String itemParam) { Date date = new Date(); // 创建一个pojo TbItemParamItem itemParamItem = new TbItemParamItem(); itemParamItem.setItemId(itemId); itemParamItem.setParamData(itemParam); itemParamItem.setCreated(date); itemParamItem.setUpdated(date); // 向表中插入数据 itemParamItemMapper.insert(itemParamItem); return TaotaoResult.ok(); }
表现层
接收规格参数信息,调用Service层保存商品信息及商品描述及商品规格参数。返回taotaoResult
//添加商品和商品描述 @RequestMapping(value="/item/save",method = RequestMethod.POST) @ResponseBody private TaotaoResult createItem(TbItem item, String desc,String itemParams ) throws Exception{ //添加商品和商品描述以及规格参数 TaotaoResult result = itemService.createItem(item, desc,itemParams); return result; }
7 展示规格参数
当现实商品详情页面时,需要把商品的规格参数根据商品id取出来,生成html展示到页面。
7.1 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<TbItemParamItem> 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("<table cellpadding=\"0\" cellspacing=\"1\" width=\"100%\" border=\"0\" class=\"Ptable\">\n"); sb.append(" <tbody>\n"); for(Map m1:jsonList) { sb.append(" <tr>\n"); sb.append(" <th class=\"tdTitle\" colspan=\"2\">"+m1.get("group")+"</th>\n"); sb.append(" </tr>\n"); List<Map> list2 = (List<Map>) m1.get("params"); for(Map m2:list2) { sb.append(" <tr>\n"); sb.append(" <td class=\"tdTitle\">"+m2.get("k")+"</td>\n"); sb.append(" <td>"+m2.get("v")+"</td>\n"); sb.append(" </tr>\n"); } } sb.append(" </tbody>\n"); sb.append("</table>"); return sb.toString(); } }
7.2 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"; } }
=============================================
参考资料:
end