1 商品后盾治理
1.1 动静实现商品分类展示
1.1.1 异步树加载控件阐明
1).树形控件树形
`每个节点都具备以下属性:id:节点ID,对加载近程数据很重要。text:显示节点文本。state:节点状态,'open' 或 'closed',默认:'open'。如果为'closed'的时候,将不主动开展该节点。checked:示意该节点是否被选中。attributes: 被增加到节点的自定义属性。children: 一个节点数组申明了若干节点。`
2).异步树阐明
树控件读取URL。子节点的加载依赖于父节点的状态。当开展一个关闭的节点,如果节点没有加载子节点,它将会把节点id的值作为http申请参数并命名为’id’,通过URL发送到服务器下面检索子节点。
如果用户点击父节点须要开展子节点时,会将父节点的id的值当做参数传递.
1.1.2 编辑ItemCatController(形式一)
`/** * 业务需要: 用户通过ajax申请,动静获取树形构造的数据. * url: http://localhost:8091/item/cat/list * 参数: 只查问一级商品分类信息 parentId = 0 * 返回值后果: List<EasyUITree> * * 注意事项: * 1.树形构造初始化时不会传递任何信息.只有开展子节点时传递Id * 2.页面传递什么样的数据,后端必须接管什么样的数据 * * id: 296 */ @RequestMapping("/list") public List<EasyUITree> findItemCatList(Long id){ Long parentId = (id==null?0L:id); return itemCatService.findItemCatList(parentId); }`
1.1.3 编辑ItemCatController(形式二)
能够利用注解动静获取参数,并且实现转化.
`//2.个别写业务须要见名知意 @RequestMapping("/list") public List<EasyUITree> findItemCatList( @RequestParam(value = "id",defaultValue = "0") Long parentId){ //形式1 //Long parentId = (id==null?0L:id); return itemCatService.findItemCatList(parentId); }`
1.2 对于SpringMVC参数传递阐明
`/** * 页面参数: http://申请门路:/办法名称 ?id=1 name="tomcat" * 对象: 1.request对象 页面给服务器参数 2.response对象 服务器给页面的响应数据. * * @param id * @param name * @return */ @RequestMapping("/xxxx") public String xxx(Long id, String name, Item item){ /* 1.根本类型属性赋值. String id = request.getParameter("id"); Long idLong = Long.valueOf(id); String strArray = request.getParameter("array"); String[] strArrays = strArray.split(","); String name = request.getParameter("namexxxxx");*/ //2.利用item对象获取属性 /*item.getId() ~~~~去除get的前缀~~~~~~~Id~~首字母小写~~~"id" String id = request.getParameter("id"); id----封装set办法----执行业务调用item.setId(id); Item.......*/ }`
总结:
1.正确编辑html标签 name属性必须书写正确 个别条件下与pojo属性雷同.
2.参数接管时,校验属性的类型及属性名称是否正确. POJO属性必须写包装类型.
3.有些特定的属性能够利用SpringMVC 进行动静的转化 数组/list汇合/map汇合等.
1.3 商品新增
1.3.1 页面剖析
1).url剖析
2).参数剖析
3).页面JS剖析
`/* * $.post(url地址,参数,回调函数) ajax参数传递的类型有几种: 1.json格局 {"id":"1","name":"tomcat"} 2.字符串拼接 "id=1&name='tomcat'" */ $.post("/item/save",$("#itemAddForm").serialize(), function(data){ if(data.status == 200){ $.messager.alert('提醒','新增商品胜利!'); }else{ $.messager.alert("提醒","新增商品失败!"); } });`
1.3.2 SysResult VO对象的创立
`package com.jt.vo;import lombok.AllArgsConstructor;import lombok.Data;import lombok.NoArgsConstructor;import lombok.experimental.Accessors;//SysResult 次要的目标是为了与页面进行交互. ajax/json@Data@Accessors(chain = true)@NoArgsConstructor@AllArgsConstructorpublic class SysResult { private Integer status; //200胜利 201 失败 private String msg; //服务器提示信息 胜利 失败 private Object data; //服务器返回值数据. //能够利用static的静态方法 将数据动静返回 public static SysResult fail(){ return new SysResult(201, "业务执行失败", null); } /** * 1.只须要返回状态码信息 200 * 2.须要返状态及业务数据 200/data * 3.返回提示信息/data业务数据 * @return */ public static SysResult success(){ return new SysResult(200, "业务执行胜利!", null); } //String json = "{key:value}" public static SysResult success(Object data){ return new SysResult(200, "业务执行胜利!", data); } //只想返回提示信息 public static SysResult success(String msg,Object data){ return new SysResult(200, msg, data); }}`
1.3.3 编辑ItemController
`@RequestMapping("/save") public SysResult saveItem(Item item){ try { itemService.saveItem(item); return SysResult.success(); }catch (Exception e){ e.printStackTrace(); return SysResult.fail(); } }`
1.3.4 编辑ItemService
`@Override public void saveItem(Item item) { //思考:如果每次编辑数据库 每次都须要操作公共的属性... Date date = new Date(); item.setStatus(1).setCreated(date).setUpdated(date); itemMapper.insert(item); }`
1.4 全局异样解决机制
1.4.1 业务需要
如果再代码中频繁的增加try-cache那么导致代码的可读性差,代码的不易保护…
例如:
1.4.2 定义全局异样的解决机制
`package com.jt.aop;import com.jt.vo.SysResult;import org.springframework.web.bind.annotation.ControllerAdvice;import org.springframework.web.bind.annotation.ExceptionHandler;import org.springframework.web.bind.annotation.ResponseBody;import org.springframework.web.bind.annotation.RestControllerAdvice;import java.sql.SQLException;//@ControllerAdvice //拦挡controller层//@ResponseBody@RestControllerAdvice //定义全局异样的解决类 AOP=异样告诉public class SystemAOP { /** * 定义全局异样的办法 当遇到了什么异样时,程序开始执行 参数个别class类型 * 如果一旦产生异样,则应该输入异样的信息,之后返回谬误数据即可. */ @ExceptionHandler({RuntimeException.class}) public Object systemAop(Exception e){ e.printStackTrace(); return SysResult.fail(); }}`
1.5 属性主动填充性能
1.5.1 MP主动填充阐明
`//pojo基类,实现2个工作,2个日期,实现序列化@Data@Accessors(chain=true)public class BasePojo implements Serializable{ @TableField(fill = FieldFill.INSERT) //入库时主动增加 private Date created; @TableField(fill = FieldFill.INSERT_UPDATE) //入库/更新操作主动增加 private Date updated;}`
1.5.2 代码主动填充性能
阐明:在jt-common中增加代码主动填充的代码…
`package com.jt.config;import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;import org.apache.ibatis.reflection.MetaObject;import org.springframework.stereotype.Component;import java.util.Date;@Component //将对象交给spring容器治理public class MyMetaObjectHandler implements MetaObjectHandler { @Override public void insertFill(MetaObject metaObject) { Date date = new Date(); //保障工夫统一 this.setInsertFieldValByName("created", date,metaObject); this.setInsertFieldValByName("updated", date,metaObject); } @Override public void updateFill(MetaObject metaObject) { this.setUpdateFieldValByName("updated", new Date(), metaObject); }}`