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() > ) {
return TaotaoResult.ok(list.get());
} //返回一个自定义的封装类对象
return TaotaoResult.ok();
}

pojo

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

TaotaoResult

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);
return result;
} }

ItemParamController

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

第04项目:淘淘商城(SpringMVC+Spring+Mybatis) 的学习实践总结【第四天】的更多相关文章

  1. 第04项目:淘淘商城(SpringMVC+Spring+Mybatis) 的学习实践总结【第二天】

    淘淘商城(SpringMVC+Spring+Mybatis)  是传智播客在2015年9月份录制的,几年过去了.由于视频里课上老师敲的代码和项目笔记有些细节上存在出入,只有根据日志报错信息作出适当的调 ...

  2. 第04项目:淘淘商城(SpringMVC+Spring+Mybatis) 的学习实践总结【第一天】

    本人做过一年的MATLAB编程和简单维护过VB和C++的项目.是跟着网上获得的黑马的Java双元视频课来自学入门Java知识和常用框架的使用. 淘淘商城(SpringMVC+Spring+Mybati ...

  3. 第04项目:淘淘商城(SpringMVC+Spring+Mybatis) 的学习实践总结【第六天】

    https://pan.baidu.com/s/1bptYGAb#list/path=%2F&parentPath=%2Fsharelink389619878-229862621083040 ...

  4. 第04项目:淘淘商城(SpringMVC+Spring+Mybatis) 的学习实践总结【第五天】

    https://pan.baidu.com/s/1bptYGAb#list/path=%2F&parentPath=%2Fsharelink389619878-229862621083040 ...

  5. 第04项目:淘淘商城(SpringMvc+Spring+Mybatis) 的学习实践总结【第三天】

    淘淘商城(SpringMVC+Spring+Mybatis)  是传智播客在2015年9月份录制的,几年过去了.由于视频里课上老师敲的代码和项目笔记有些细节上存在出入,只有根据日志报错信息作出适当的调 ...

  6. 第04项目:淘淘商城(SpringMVC+Spring+Mybatis)【第十天】(单点登录系统实现)

    https://pan.baidu.com/s/1bptYGAb#list/path=%2F&parentPath=%2Fsharelink389619878-229862621083040 ...

  7. 第04项目:淘淘商城(SpringMVC+Spring+Mybatis)【第九天】(商品详情页面实现)

    https://pan.baidu.com/s/1bptYGAb#list/path=%2F&parentPath=%2Fsharelink389619878-229862621083040 ...

  8. 第04项目:淘淘商城(SpringMVC+Spring+Mybatis)【第八天】(solr服务器搭建、搜索功能实现)

    https://pan.baidu.com/s/1bptYGAb#list/path=%2F&parentPath=%2Fsharelink389619878-229862621083040 ...

  9. 第04项目:淘淘商城(SpringMVC+Spring+Mybatis)【第七天】(redis缓存)

    https://pan.baidu.com/s/1bptYGAb#list/path=%2F&parentPath=%2Fsharelink389619878-229862621083040 ...

随机推荐

  1. Spring Boot2(001):入门介绍和一些官网链接参考

    Spring官方文档比较齐全,学习的过程中可以多参考官方文档,最权威的版本.01.Spring Boot的一些官方链接 01.01 Spring Boot官网 https://spring.io/pr ...

  2. BZOJ:2242: [SDOI2011]计算器

    题解:BSGS 问题:map空间 BSGS判无解 a%p!=0 0与最小非负整数 有区别 函数传参类型转换int->long long long long ->int; 费马小定理充分必要 ...

  3. 短网址资料-nginx非root用户启动-systemctl启动脚本-分割root权限

    https://www.cnblogs.com/aspnethot/articles/3492191.htmlhttps://www.cnblogs.com/aspnethot/articles/34 ...

  4. spring boot 环境配置(profile)切换

    Spring Boot 集成教程 Spring Boot 介绍 Spring Boot 开发环境搭建(Eclipse) Spring Boot Hello World (restful接口)例子 sp ...

  5. PAT Advanced 1013 Battle Over Cities (25) [图的遍历,统计连通分量的个数,DFS,BFS,并查集]

    题目 It is vitally important to have all the cities connected by highways in a war. If a city is occup ...

  6. 「黑科技」智能消毒防疫机器人 技术方案介绍-disinfection robot

    消毒机器人 小新防疫消杀机器人 - 自主导航全方位360°臭氧杀菌消毒机器人,采用臭氧无阻碍.无死角.遍布整个空间除菌:强力涡轮风机,30㎡室内空气循环6次/h,10分钟速效杀菌.除异味.自动转化为氧 ...

  7. 使用Object类为实例定义方法和属性

    1.1 可以使用 Object 类直接定义个实例,并且为该对象赋属性和方法,例如: var person_1 = { nickName:"xiaowu", age:28, show ...

  8. 洛谷 P5664 Emiya 家今天的饭(84分)

    题目传送门 解题思路: 对于每一个列c,f[i][j][k]表示到第i行,第c列选了j个,其它列一共选了k个,然后我们读题意发现只要j>k,那就一定是不合法的,然后统计所有方案,减去所有不合法方 ...

  9. Tomcat启动失败原因: More than one fragment with the name [spring_web] was found. 解决

    将一个eclipse上搭建好的项目移到idea开发时遇到的问题,tomcat启动时报了3个错误 -Nov- :: ms -Nov- ::)-127.0.0.1] org.apache.tomcat.u ...

  10. SQL语句、PL/SQL块和SQL*Plus命令之间的区别

    SQL语句.PL/SQL块和SQL*Plus命令之间的区别   原文链接:https://blog.csdn.net/liuzhushiqiang/article/details/12320941 在 ...