1.页面结构
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Insert title here</title>
<link rel="stylesheet" type="text/css" href="/js/jquery-easyui-1.4.1/themes/default/easyui.css" />
<link rel="stylesheet" type="text/css" href="/js/jquery-easyui-1.4.1/themes/icon.css" />
<link rel="stylesheet" type="text/css" href="/css/jt.css" />
<script type="text/javascript" src="/js/jquery-easyui-1.4.1/jquery.min.js"></script>
<script type="text/javascript" src="/js/jquery-easyui-1.4.1/jquery.easyui.min.js"></script>
<script type="text/javascript" src="/js/jquery-easyui-1.4.1/locale/easyui-lang-zh_CN.js"></script>
</head>
<body class="easyui-layout">
<div data-options="region:'west',title:'菜单',split:true" style="width:10%;">
<ul class="easyui-tree">
<li>
<span>商品管理</span>
<ul>
<li><a onclick="addTab('商品新增','/item-add')">商品新增</a></li>
<li><a onclick="addTab('商品查询','/item-list')">商品查询</a></li>
<li><a onclick="addTab('商品更新','/item-update')">商品更新</a></li>
</ul>
</li>
<li>
<span>网站内容管理</span>
<ul>
<li>内容新增</li>
<li>内容修改</li>
</ul>
</li>
</ul>
</div>
<div id="tt" class="easyui-tabs" data-options="region:'center',title:'首页'"></div>
</body>
<script type="text/javascript">
function addTab(title, url){
if ($('#tt').tabs('exists', title)){
$('#tt').tabs('select', title);
} else {
var url2 = "https://map.baidu.com/@12964432.517776728,4826375.366248961,13z";
var content = '<iframe scrolling="auto" frameborder="0" src="'+url2+'" style="width:100%;height:100%;"></iframe>';
$('#tt').tabs('add',{
title:title,
content:content,
closable:false
});
}
}
</script>
</html>
2.商品列表的展现
2.1pojo
商品item
package com.jt.pojo;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import lombok.Data;
import lombok.experimental.Accessors;
@JsonIgnoreProperties(ignoreUnknown=true) //表示JSON转化时忽略未知属性
@TableName("tb_item")
@Data
@Accessors(chain=true)
public class Item extends BasePojo{
@TableId(type=IdType.AUTO)
private Long id; //商品id
private String title; //商品标题
private String sellPoint; //商品卖点信息
private Long price; //商品价格 Long > dubbo 存入数据库用整数,但是页面展现使用小数(小数运算不精确而且存储麻烦)
private Integer num; //商品数量
private String barcode; //条形码
private String image; //商品图片信息 1.jpg,2.jpg,3.jpg
private Long cid; //表示商品的分类id
private Integer status; //1正常,2下架
//为了满足页面调用需求,添加get方法
public String[] getImages(){
return image.split(",");
}
}
2.2UI列表的展现
页面json抽取为类的过程
2.3JSON串的说明
2.3.1什么是JSON(json本质是String)
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。它使得人们很容易的进行阅读和编写。同时也方便了机器进行解析和生成。 JSON本质是String
2.3.2JSON的基本类型
1.object 对象的格式 名称/值 对的集合 是无序的
2.数组 值的有序集合
[1,2,3,4,"打游戏","逛街"]
基本类型两种,延申出嵌套格式(值的嵌套)
{"id":1,"name":"白雪公主","hobbys":["逛街","看电视","打游戏"],"method":[{"id":1,"type":[{"id":1,"method":[{"id":1,"method":"自己走路"}]}]}]}
{"id":1,"name":"哈利珀特","hobbys":["学魔法","打伏地","敲代码"],"method":[{"type":"火系","name":"三味真火"}]}
json严格条件下字符串要加引号
2.4表格数据展现的说明
2.4.1编写EasyUITable Vo对象
编辑EasyUITable VO对象
package com.jt.vo;
import com.jt.pojo.Item;
import jdk.internal.dynalink.ChainedCallSite;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
import java.util.List;
@Data
@Accessors(chain = true)
@NoArgsConstructor
@AllArgsConstructor
public class EasyUITable {
/**
* 记录总数
* */
private Long total;
/**
* 每页展现的记录
* */
private List<Item> rows;
}
通过对象的get()方法获取JSON属性及属性值
JSON转化为对象时,通过对象的set()方法为属性赋值
package com.jt.pojo;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import lombok.Data;
import lombok.experimental.Accessors;
@JsonIgnoreProperties(ignoreUnknown=true) //表示JSON转化时忽略未知属性
@TableName("tb_item")
@Data
@Accessors(chain=true)
public class Item extends BasePojo{
@TableId(type=IdType.AUTO)
private Long id; //商品id
private String title; //商品标题
private String sellPoint; //商品卖点信息
private Long price; //商品价格 Long > dubbo 存入数据库用整数,但是页面展现使用小数(小数运算不精确而且存储麻烦)
private Integer num; //商品数量
private String barcode; //条形码
private String image; //商品图片信息 1.jpg,2.jpg,3.jpg
private Long cid; //表示商品的分类id
private Integer status; //1正常,2下架
//为了满足页面调用需求,添加get方法
public String[] getImages(){
return image.split(",");
}
}
2.4.2 controller
@RequestMapping("testVO")
public EasyUITable testVO(){
Item item1=new Item();
item1=item1.setId(1000L).setTitle("饮水机").setPrice(2000L);
Item item2=new Item();
item2.setId(2000L).setTitle("电冰箱").setPrice(30000L);
List<Item> rows=new ArrayList<>();
rows.add(item1);
rows.add(item2);
return new EasyUITable(2000L, rows);
}
说明:对象转化为json用get()方法,json转化为对象用set()方法
2.4.3 页面请求
表格页面分析:
说明:当添加了分页插件之后,当ajax程序解析时会动态的拼接参数.
ItemController
package com.jt.controller;
import com.jt.pojo.Item;
import com.jt.vo.EasyUITable;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import com.jt.service.ItemService;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import java.util.ArrayList;
import java.util.List;
@RestController //表示返回的都是json
@RequestMapping("/item")
public class ItemController {
@Autowired
private ItemService itemService;
@RequestMapping("/query")
@ResponseBody
public EasyUITable doFindItemByPage(Integer page,Integer rows){
return itemService.findItemByPage(page,rows);
}
}
1.手写SQL查询
ItemServiceImpl
package com.jt.service;
import com.jt.pojo.Item;
import com.jt.vo.EasyUITable;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.jt.mapper.ItemMapper;
import java.util.List;
@Service
public class ItemServiceImpl implements ItemService {
@Autowired
private ItemMapper itemMapper;
@Override
public EasyUITable findItemByPage(Integer page, Integer rows) {
long total=itemMapper.selectCount(null);
int startIndex=(page-1)*rows;
List<Item> itemList = itemMapper.findItemByPage(startIndex,rows);
return new EasyUITable(total, itemList);
}
}
ItemMapper
package com.jt.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.jt.pojo.Item;
import org.apache.ibatis.annotations.Select;
import java.util.List;
public interface ItemMapper extends BaseMapper<Item>{
@Select("select * from tb_item order by updated desc limit #{startIndex},#{rows}")
List<Item> findItemByPage(int startIndex, Integer rows);
}
2.使用MybatisPlus
@Override//使用MybatisPlus
public EasyUITable findItemByPage(Integer page, Integer rows) {
QueryWrapper queryWrapper=new QueryWrapper();
queryWrapper.orderByDesc("updated");
IPage<Item> iPage=new Page<>(page,rows);//IPage是接口,Page是实现的类
//根据分页模型执行分页操作,并将结果返回给分页对象
iPage=itemMapper.selectPage(iPage, queryWrapper);
Long total=iPage.getTotal();//由分页工具自动获取,获取记录总数
List<Item> itemList=iPage.getRecords();//获取查询当前页
return new EasyUITable(total, itemList);
}
需要增加配置类
package com.jt.config;
import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration//bean标签使用
public class MybatisPlusConfig {
//讲分页拦截器交给spring管理 MP是Mybatis的增强工具
@Bean
public PaginationInterceptor paginationInterceptor(){
return new PaginationInterceptor();
}
}
2.5数据格式化
2.5.1格式化价格
formatter:KindEditorUtil
2.5.2格式化状态:
2.5.3实现商品分类的回显
说明:
编辑Item-list页面
改为
ItemCat
package com.jt.pojo;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import lombok.experimental.Accessors;
@Data
@TableName("tb_item_cat")
@Accessors(chain = true)
public class ItemCat extends BasePojo{
@TableId
private Long id; //主键
private Long parentId; //父级ID
private String name; //父级
private Integer status; //状态信息
private Integer sortOrder; //排序号
private Boolean isParent; //是否为父级 tinyint用boolean进行转化
}
BasePojo
package com.jt.pojo;
import java.io.Serializable;
import java.util.Date;
import lombok.Data;
import lombok.experimental.Accessors;
//pojo基类,完成2个任务,2个日期,实现序列化
@Data
@Accessors(chain=true)
public class BasePojo implements Serializable{
private Date created;
private Date updated;
}
有了这个注解不用每个都写@Mapper
package com.jt.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.jt.pojo.ItemCat;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface ItemCatMapper extends BaseMapper<ItemCat> {
}
package com.jt.service;
import com.jt.mapper.ItemCatMapper;
import com.jt.pojo.ItemCat;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class ItemCatServiceImpl implements ItemCatService{
@Autowired
private ItemCatMapper itemCatMapper;
@Override
public ItemCat findItemCatName(Integer id) {
return itemCatMapper.selectById(id);
}
}
package com.jt.controller;
import com.jt.pojo.ItemCat;
import com.jt.service.ItemCatService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/item/cat")
public class ItemCatController {
@Autowired
private ItemCatService itemCatService;
@RequestMapping("/queryItemName")
@ResponseBody
public String doFindItemCat(Integer itemCatId){
// System.out.println("itemCat获取id:"+itemCatId);
ItemCat itemCat=itemCatService.findItemCatName(itemCatId);
//System.out.println(itemCat.getName()+"--------------");
return itemCat.getName();
}
}
每条数据都需要与后台进行一次交互,效率低(缓存)
2.6Ajax嵌套问题
若改为异步:false
页面数据不会显示
原因:页面一共发两次ajax请求,并且两次请求是嵌套关系,页面只刷新一次
解决办法:将第二次的ajax请求改为同步
扩展知识:JS中闭包问题
3 树形结构的展现
3.1common.js的依赖问题
3.2商品分类的业务分析
一般情况下,结构分为三级
layUI
elementUI
3.3树形结构的问题
3.3.1页面js
3.3.2json结构
3.3.3 EasyUITree对象的封装
package com.jt.vo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
@Data
@Accessors(chain = true)
@NoArgsConstructor
@AllArgsConstructor
public class EasyUITree {
private Long id;//数据库id为long类型
private String text;//定义节点名称
private String state;//节点状态信息
}
3.4新增页面的分析
3.4.1页面流转过程
3.4.2页面流转分析
关于参数异常问题(Mybatis版本较低)
mybatis允许单值传参,不允许多值传参,将多值封装成单值,就是封装成map集合
底层sql:#{}取值,获取的是key,然后获取value