0831 江哥链接 https://blog.csdn.net/qq_16804847/article/details/108315987
day05
问题归纳总结
子类继承父类=属性/方法/属性的值
父类:属性-private修饰
如上图 属性私有 但是方法公有可以被继承
方法被引入后 我们需要操作方法 方法需要操作 就需要属性的赋值 值从哪来?
在类中 虚拟化的 内存中多出来两个属性 一个是updated 一个是created 只有继承了父级
不可能给方法做空赋值
动态生成属性,只要子类继承了父类,可以通过方法为自己赋值
继承是继承属性的值
私有之后 只有方法的地方 内存会虚拟化一份份属性由方法为属性(内存动态生成的)赋值
晚上9.22前
那个项目需要单独的运行 发布 pom就加build标签 或者install打包
复习开始
结构理清 按规定套路 itemcontroller的那张图
与前端交互最关键的
看url(network)和页面需要的
还有 我们需要返回什么(controller层)
有逆向思维 要从前端给的json串 转化成vo层
看括号就好
如上图 而且value可以做无限层级的嵌套
用别人的工具 返回值固定(按别人的要求写) 不然无法解析
总结的顺序 实际最重要的 如下图
先写返回值 根据类型 通过自己的方法 然后无限趋近返回值的结果
要啥可以自己去写 利用API
9.48 晚上或者中午回看 一句话
然后控制层 controller层
返回值就变成了一个json 因为@RestController
0831开始正式
商品分类信息回显
1.1 数据格式化问题
Item的POJO问题说明
分析pojo
商品价格为啥是long类型 (不引入新问题 解决就问题)
整数快 比double快
精度问题 9.57 引入一个???
1.1.2 格式化价格
1).页面标识符
formatter 属性是EasyUI中专门负载格式化数据的函数.通过调用js.将返回值的结果进行展现.
传递参数时会传递2个参数. 一个是当前标签的值value.当前标签所在的行号.
easyUI可以进行动态的回显 但是需要和pojo保持一致
<th data-options="field:'price',width:70,align:'right',formatter:KindEditorUtil.formatPrice">价格</th>
格式化函数介绍:
// 格式化价格
formatPrice : function(val,row){
return (val/100).toFixed(2);
},
如上图 试试删掉matter 缩小100倍的问题 10.06前
调用了js
1.1.3 格式化状态
1.页面JS函数调用
<th data-options="field:'status',width:60,align:'center',formatter:KindEditorUtil.formatItemStatus">状态</th>
引入js 1.1.2上面 看博客 复制
去common.js看具体的
没有引js是怎么调用通畅的呢
跳转的时候已经有包括js了
1.1.2 common.js是如何被item-list.jsp所引用的???
说明: 由于用户默认的首页访问的是Index.jsp,在其中引入js
引入js的过程
补充说明: 由于item-list.jsp页面是index.jsp中的一部分.所以父级引入JS.子级也可以使用JS.
局部可以用整体 10.25 晚上(over)
用的化只用了val 没用row
结束
页面的js函数调用
1.1.3对应标题 插入
1.1.3 也是格式化状态
1.页面JS函数调用
<th data-options="field:'status',width:60,align:'center',formatter:KindEditorUtil.formatItemStatus">状态</th>
如上 用户看不清楚
所以
2.js编辑说明
// 格式化商品的状态
formatItemStatus : function formatStatus(val,row){
if (val == 1){
return '<span style="color:green;">上架</span>';
} else if(val == 2){
return '<span style="color:red;">下架</span>';
} else {
return '未知';
}
},
刷新
更好的说明了
1.2 商品分类回显
1.2.1 页面结构分析
需求说明: 如果在没有进行格式化时.展现的是商品分类的ID号.如图:
去掉formatter:KindEditorUtil.findItemCatName 后
需求 展现具体需求的名字
需要通過格式化的函数,动态获取商品分类的名称,之后进行页面展现.
<th data-options="field:'cid',width:100,align:'center',formatter:KindEditorUtil.findItemCatName">叶子类目</th>
560手机标签
1.2.2 页面业务实现的说明 (叶子类目)
1.利用格式化的函数的调用 向后端发送ajax请求.获取商品分类的名称
2.创建商品分类的POJO对象 ItemCat对象
3.创建ItemCatMapper 接口
4.实现通过数据库查询返回itemCat的name属性.
前端对应都写好了
标识页面的ajax
//格式化名称
findItemCatName : function(val,row){
var name;
$.ajax({
type:"post",
url:"/item/cat/queryItemName",
data:{itemCatId:val},
cache:true, //缓存
async:false, //表示同步 默认的是异步的true
dataType:"text",//表示返回值参数类型
success:function(data){ //返回商品分类名称
name = data;
}
});
return name;
},
开始写pojo
为什么ItemCat放jt-common
common不止一个人用 前端也可能用到common 所以公共的东西就往common放
如下
晚上回看自己录得 重
从格式化 formatXXXX()
去进行数据格式化的访问
需求 展示1和2 客户不理解 铺垫业务
第一步
关键技巧 1.不过是什么业务 根据上图的需求 先把层级代码写完 并作脚手架
如上图 有对象必有数据库
dao层(Mapper 集合到一起了)
service层
controller层
然后脚手架做好了
**
第二部:再分析业务 service层(业务逻辑层)
**
如上分析
第三步 干活
从controller层开始写
如上图 改为/item/cat
service层
dao层
脚手架第二部就写了 没语句即可???疑问
11.16回放 怎么从controller引出接口 和上面的getName (over)
小点
自我实现 客户端
分析改了async 同步异步问题
//格式化名称
findItemCatName : function(val,row){
var name;
$.ajax({
type:"post",
url:"/item/cat/queryItemName",
data:{itemCatId:val},
cache:true, //缓存
async:true, //表示同步 默认的是异步的true
dataType:"text",//表示返回值参数类型
success:function(data){
name = data;
}
});
return name;
},
改成true
ajax嵌套问题
说明:如果在页面中涉及到ajax嵌套问题,一般的解决的方法就是将内层的ajax设置为同步模式.可以正确的展现数据.
说明 页面发起了
第二次 晚上 11.35前
不可能一次性展现 只能一行一行
又发起了ajax请求
叶子类目 数据有 再这个数据的背后 加载好之后已经错过了
需要一次刷新! 11.41 晚上 再理解一次
同步才能好一点
保证内部数据一切正常
改回去
总结
因为一个查询只刷新一次
晚上总结
如上图 查询页面 ajax可是一共发起了几次请求 2次
第一次 展示所有列表的时候 用url把所有数据分页显示出来那个
第二次 叶子类目为第二次异步
第二次展示数据的异步展现 一行一行展现 解析第一行的时候(有ajax) 不会被堵塞 叶子类目空白则绕开
因为一条一条数据显示出来 为异步 叶子类目处理完了数据 车开走了 (如下图)只欠缺一次刷新 改成同步的话 即可 就可以等叶子类目更新后 再执行下一行的查询
新增
点击会有弹出框
分析
src/main/webapp/easy-ui/easyui-5-window.html
效果
看懂在写什么
想进行弹出框的展现
退出按钮
function为返回值的结果 r代表确定或取消
回看 晚上 11.52(over)
问题
分析京东
一般分3级
蓝色是定位
涉及到父子级关系时 一般采用parentId的形式进行关联
试着
一级的时候 parentId=0
二级 父级应该是parentId=0
说明:一般电商网址的商品分类信息一般都是3级菜单. 级与级之间存在父子级关系. 在数据库中应该如何存储???
解答: 一般涉及到父子级关系时,一般采用parentId的形式进行关联.
例如: 查询一级商品分类信息:
/*查询一级商品分类信息 父级Id=0*/
select * from tb_item_cat where parent_id=0;
/*查询二级商品分类信息 父级一级ID*/
SELECT * FROM tb_item_cat WHERE parent_id=1;
/*查询三级商品分类信息 父级二级ID*/
SELECT * FROM tb_item_cat WHERE parent_id=2;
树形结构讲解
页面分析
/*通过js创建树形结构 */
$(function(){
$("#tree").tree({
url:"tree.json", //加载远程JSON数据
method:"get", //请求方式 POST
animate:true, //表示显示折叠端口动画效果
checkbox:true, //表述复选框
lines:true, //表示显示连接线
dnd:true, //是否拖拽
onClick:function(node){ //添加点击事件
//控制台
console.info(node);
}
});
})
</script>
</head>
<body>
<h1>EasyUI-树形结构</h1>
<ul id="tree"></ul>
</body>
</html>
## **```关于树形结构的UI框架**
json串的返回值的分析
```java
[
{
"id":"1",
"text":"英雄联盟",
"iconCls":"icon-save",
"children":[
{
"id":"4",
"text":"沙漠死神"
},{
"id":"5",
"text":"德玛西亚"
},{
"id":"6",
"text":"诺克萨斯之手"
},
{
"id":"7",
"text":"蛮族之王"
},
{
"id":"8",
"text":"孙悟空"
}
],
"state":"open"
},{
"id":"2",
"text":"王者荣耀",
"children":[
{
"id":"10",
"text":"阿科"
},{
"id":"11",
"text":"吕布"
},{
"id":"12",
"text":"陈咬金"
},{
"id":"13",
"text":"典韦"
}
],
"state":"closed"
},
{
"id":"3",
"text":"吃鸡游戏",
"iconCls":"icon-save"
}
]
数组 数组配置节点 开放还是关闭
如下图 json串自己判断的时候 还得分析 比如"children"和"iconCls"是不需要考虑得 框架处理
需要一个一个封装
封装EasyUITree vo对象
数据来源是数据表
判断state节点打开还是闭合
分析结构(参照京东)
url页面展示说明
如上 都遍历xxxx
和点添加的时候 url一样
点击选择类目的时候
编辑itemcatcontroller 依旧三板斧
1.分析业务需求
实现商品分类的展现
url地址:http://localhost:8091/item/cat/list
参数:parentId=0 查询一级商品分类菜单
返回值结果: List
试着自我实现
查询都是一级
自我实现
先有json后有vo
//该对象的主要的目的是为了展现树形结构的数据.
@Data
@Accessors(chain = true)
@NoArgsConstructor
@AllArgsConstructor
public class EasyUITree implements Serializable {
//"id":"3","text":"吃鸡游戏","state":"open/closed" 数据来源 数据表
private Long id; //商品分类的Id信息
private String text; //商品分类name属性
private String state; //由是否为父级决定 如果是父级则关闭closed 否则为子级open
}
对接到数据库
脚手架
建好后
分析需求
上面发出后 去接
controller层
service层
里面同时加入了Dao层的数据持久层 面向对象去操作数据库语句
错误
1.controller没写requestMapping()里面的url 一开始需求还没弄懂
2.没用add存在内存的数据
显示成功
ps:显示端口号被占用
idea结束就可 直接关闭
晚上 foreach遗忘
讲解 15.46 水果沙拉
商品查询的url分析
点开都是一级菜单信息
三级商品信息分类目录的展现
异步树空间的加载
2.3.8 异步树控件加载
树控件读取URL。子节点的加载依赖于父节点的状态。当展开一个封闭的节点,如果节点没有加载子节点,它将会把节点id的值作为http请求参数并命名为’id’,通过URL发送到服务器上面检索子节点。
总结:当展现了树形结构之后,当展开树形节点时会向后台传递该节点的id值格式如下 id:100
/**
为空的话就代表第一次打开
/**
* 业务需求: 实现商品分类的展现
* url地址: http://localhost:8091/item/cat/list
* 参数: parentId = 0 查询一级商品分类菜单.
* 返回值结果: List<EasyUITree>
*/
@RequestMapping("/list")
public List<EasyUITree> findItemCatList(Long id){
//当初始时树形结构没有加载不会传递ID,所以ID为null.只需要传递0.
Long parentId = (id==null)?0:id;
return itemCatService.findItemCatList(parentId);
}
不加children是因为整体更新会很耗资源 一个一个更新即可
后台维护
商品新增
业务说明
系统级别的vo 写在commnon最合适 状态
vo 方法重载 方便调用
为什么写long 不写int
@Data
@Accessors(chain = true)
@NoArgsConstructor
@AllArgsConstructor
public class SysResult implements Serializable {
private Integer status; //定义状态信息 200业务处理成功, 201业务处理失败.
private String msg; //服务器返回的提示信息.
private Object data; //服务器返回业务数据.
//封装一些静态API 简化用户调用过程.
public static SysResult fail(){
return new SysResult(201,"服务器调用失败",null);
}
public static SysResult success(){
return new SysResult(200, "业务执行成功!!!", null);
}
public static SysResult success(Object data){
return new SysResult(200, "业务执行成功!!!", data);
}
}
页面的url参数
ajax
提交函数
校验机制
//表单校验
if(!$('#itemAddForm').form('validate')){
$.messager.alert('提示','表单还未填写完成!');
return ;
}
//转化价格单位,将元转化为分
$("#itemAddForm [name=price]").val(eval($("#itemAddForm [name=priceView]").val()) * 100);
itemAddEditor.sync();//将输入的内容同步到多行文本中
扩大100倍的结果 如上图
序列化
1.json方式
满足提交100个的需求
ajax可以解析
完成商品入库操作
商品的业务逻辑 ItemController
三板斧开始
拦截商品信息即可
全局异常的处理机制
service层
从前台到后台的交互
自我实现 需求分析好后
分析json–vo----脚手架—分析业务逻辑—
controller层
service层
完成
客户端页面
控制事务
1.业务优化
自己测试 看下提交错误后 数据库还有记录吗
写进去了
出现了问题 事务没有得到控制
得加个注解
优化2 全局异常的处理机制
作用
@RestControllerAdvice //作用: 标识我是一个通知方法,并且只拦截Controll层的异常.并且返回JSON.
public class SysResultException {
//需要定义一个全局的方法 返回指定的报错信息.
//ExceptionHandler 配置异常的类型,当遇到了某种异常时在执行该方法.
@ExceptionHandler(RuntimeException.class)
public Object exception(Exception e){
e.printStackTrace(); //日志记录/控制台输出. 让程序员知道哪里报错!!!
return SysResult.fail();
}
}
再试试事务 验证
可以实现了
自我实现
先前效果 不加全局异常处理得化 及时impl业务逻辑语句报错 也会把数据插入到数据库
现在
提交
运行时报错 直接保证了事务的一致性
现在去查看数据库
无新增数据 还可以做回滚之类的