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
@AllArgsConstructor
public 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 页面成果展示