动态实现商品分类展现
异步树加载控件说明
1).树形控件
每个节点都具备以下属性:
id:节点ID,对加载远程数据很重要。
text:显示节点文本。
state:节点状态,'open' 或 'closed',默认:'open'。如果为'closed'的时候,将不自动展开该节点。
checked:表示该节点是否被选中。
attributes: 被添加到节点的自定义属性。
children: 一个节点数组声明了若干节点。
2).异步树说明
树控件读取URL。子节点的加载依赖于父节点的状态。当展开一个封闭的节点,如果节点没有加载子节点,它将会把节点id的值作为http请求参数并命名为’id’,通过URL发送到服务器上面检索子节点。
如果用户点击父节点需要展开子节点时,会将父节点的id的值当做参数传递.
编辑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);
}
编辑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);
}
关于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集合等.
商品新增
页面分析
/*
* $.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("提示","新增商品失败!");
}
});
SysResult VO对象的创建
在jt-common中创建VO
//vo对象主要的目的为了与前端页面进行交互
@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);
}
//返回值数据作为参数传入
public static SysResult success(Object data){
return new SysResult(200,"业务执行成功",data);
}
//只想返回提示信息
public static SysResult success(String msg,Object data){
return new SysResult(200,"业务执行成功",data);
}
}
编辑ItemController
/**
* 业务需求:
* 完成商品入库操作,如果成功应该返回vo对象
* url:/item/save
* 参数:整个表单数据
* 返回值:SysResult vo 对象
*/
@RequestMapping("/save")
public SysResult saveItem(Item item, ItemDesc itemDesc){
/*如果每个控制层都需要处理异常的话这种写法太繁琐
try{ itemService.saveItem(item); return SysResult.success(); }catch(Exception e){
e.printStackTrace(); return SysResult.fail(); }*/ //设置一个全局异常处理类
itemService.saveItem(item,itemDesc);
return SysResult.success(); }
编辑ItemService
@Override
public void saveItem(Item item) {
//思考:如果每次编辑数据库 每次都需要操作公共的属性...
Date date = new Date();
item.setStatus(1).setCreated(date).setUpdated(date);
itemMapper.insert(item);
}
全局异常处理机制
业务需求
如果再代码中频繁的添加try-cache那么导致代码的可读性差,代码的不易维护…
例如:
定义全局异常的处理机制
//@ControllerAdvice //拦截controller层
//@ResponseBody
@RestControllerAdvice //定义全局异常的处理类 AOP=异常通知
public class SystemAOP {
/**
* 定义全局异常的方法 当遇到了什么异常时,程序开始执行 参数一般class类型
* 如果一旦发生异常,则应该输出异常的信息,之后返回错误数据即可.
*/
@ExceptionHandler({RuntimeException.class})
public Object systemAop(Exception e){
e.printStackTrace();
return SysResult.fail();
}
}
属性自动填充功能
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;
}
代码自动填充功能
说明:在jt-common中添加代码自动填充的代码
@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);
}
}