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
*
* 注意事项:
* 1.树形结构初始化时不会传递任何信息.只有展开子节点时传递Id
* 2.页面传递什么样的数据,后端必须接收什么样的数据
*
* id: 296
*/
@RequestMapping("/list")
public List findItemCatList(Long id){
Long parentId = (id==null?0L:id);
return itemCatService.findItemCatList(parentId);
}`
1.1.3 编辑ItemCatController(方式二)
可以利用注解动态获取参数,并且实现转化.
`//2.一般写业务需要见名知意
@RequestMapping("/list")
public List 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分析
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 页面效果展现
作业
完成商品 更新/删除/上架/下架 等操作…