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

1.6 商品分类目录的回显-更新操作

1.6.1 页面js剖析

1.6.2 页面成果展示