EsayUI增删改查和上架下架--day4

2024-01-06 15:39

本文主要是介绍EsayUI增删改查和上架下架--day4,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

复习day03
在这里插入图片描述

1.引入js

1.1关于后端JS的引入问题说明

<jsp:include page="/commons/common-js.jsp"></jsp:include>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<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>
<!-- 自己实现业务逻辑 -->
<script type="text/javascript" src="/js/common.js"></script>

1.2、EsayUI中弹出窗口( 入门案例)

1.2.1 、页面标识
  • 空白框(弹出框效果)
$("#btn1").bind("click",function(){//EasyUI框架提供的js$("#win1").window({title:"弹出框",width:400,height:400,modal:true   //这是一个模式窗口,只能点击弹出框,不允许点击别处})})
<!--主要展现弹出框  --><a id="btn1" href="#" class="easyui-linkbutton" data-options="iconCls:'icon-search'">搜索</a><div id="win1">如果需要展现页面效果,则需要在指定的div中设计</div>
  • 确认框
/*定义退出消息框  */$("#btn4").click(function(){$.messager.confirm('系统消息','你确定要XXX吗',function(r){ if (r){ alert("成功XXX!!!");} else{alert("下次再来!!!");}});})
<div style="float: right"><a id="btn4" href="#" class="easyui-linkbutton" data-options="iconCls:'icon-cancel'">退款</a>
</div>
1.2.2 、页面标识符
 			<tr><td>商品类目:</td><td><a href="javascript:void(0)" class="easyui-linkbutton selectItemCat">选择类目</a><input type="hidden" name="cid" style="width: 280px;"></input></td></tr>

点击按钮,出现下面的弹出框(class=“easyui-linkbutton”)

// 初始化选择类目组件initItemCat : function(data){$(".selectItemCat").each(function(i,e){//i= index 下标,e:element:元素var _ele = $(e);if(data && data.cid){		//循环遍历_ele.after("<span style='margin-left:10px;'>"+data.cid+"</span>");}else{_ele.after("<span style='margin-left:10px;'></span>");}_ele.unbind('click').click(function(){$("<div>").css({padding:"5px"}).html("<ul>")//下面几个药理解一下.window({width:'500',height:"450",modal:true,closed:true,		//是否可以被关闭iconCls:'icon-save',title:'选择类目',onOpen : function(){ //当窗口打开后执行var _win = this;$("ul",_win).tree({url:'/item/cat/list',animate:true,onClick : function(node){if($(this).tree("isLeaf",node.target)){// 填写到cid中_ele.parent().find("[name=cid]").val(node.id);_ele.next().text(node.text).attr("cid",node.id);$(_win).window('close');if(data && data.fun){data.fun.call(this,node);}}}});},onClose : function(){$(this).window("destroy");}}).window('open');});});},createEditor : function(select){return KindEditor.create(select, TT.kingEditorParams);},

1.3 商品分类数据表分析

1.3.1 业务表分析
/*一级商品分类信息 parent_id=0*/
SELECT * FROM tb_item_cat WHERE parent_id=0/*二级商品分类信息 parent_id=0*/
SELECT * FROM tb_item_cat WHERE parent_id=1/*三级商品分类信息 parent_id=0*/
SELECT * FROM tb_item_cat WHERE parent_id=24

1.4 EasyUI中树形结构分析

1.4.1页面数据展现
	<body><h1>EasyUI-树形结构</h1><ul id="tree"></ul></body><script type="text/javascript">/*通过js创建树形结构 */$(function(){$("#tree").tree({url:"tree.json",		//加载远程JSON数据method:"get",			//请求方式  POSTanimate:true,			//表示显示折叠端口动画效果checkbox:true,			//表述复选框lines:true,				//表示显示连接线dnd:true,				//是否拖拽onClick:function(node){	//添加点击事件//控制台console.info(node);}});})
</script>

tree.json—字符串

[{"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"}
]
1.4.2数据结构分析

JSON串格式说明:[{“id”:“1”,“text”:“英雄联盟”,“state”:“open”,},{“id”:“2”,“text”:“王者联盟”,“state”:“closed”,}]

1.5 商品分类业务实现

1.5.1页面分析
  • 页面url分析

在这里插入图片描述

1.5.2封装树形结构的VO对象
@Data
@NoArgsConstructor	
@AllArgsConstructor
@Accessors(chain = true)   //开启链式加载结构
public class EasyUITree{//{"id":"1","text":"英雄联盟","iconCls":"icon-save",}private Long id;		//id值  		与ItemCat中的Id一致的private String text;	//文本信息  	与ItemCat中的name属性一致private String state;	//状态   	打开:open		关闭:closed}
1.5.3在ItemCatController中添加
/*** 业务:查询商品分类信息,返回 VO对象* url地址:http://localhost:8091/item/cat/list* 参数:暂时没有* 返回值: EsayUITree对象* json格式:[{"id":"1","text":"英雄联盟","state":"open",},{"id":"2","text":"王者联盟","state":"closed",}]* sql语句:1.查询一级商品分类信息:       SELECT * FROM tb_item_cat WHERE parent_id=0*/@RequestMapping("/list")public List<EasyUITree> findItemCatList() {//1.查询一级商品分类信息Long parentId = 0L;return itemCatService.findItemCatByParentId(parentId);}
1.5.4编辑ItemCatService
/*** 数据的来源:数据库中* 数据库中的数据类型:ItemCat对象信息* 需要的类型:		EasyUITree对象信息,VO对象* 思路:将ItemCat转化为EasyUITree对象.*/@Overridepublic List<EasyUITree> findItemCatByParentId(Long parentId) {//1.根据parentId查询数据库信息   根据父级查询子级信息.QueryWrapper<ItemCat> queryWrapper=new QueryWrapper<ItemCat>();queryWrapper.eq("parent_id", parentId);List<ItemCat> itemCatList = itemCatMapper.selectList(queryWrapper);//2.将数据库记录转化为VO数据List<EasyUITree> treeList = new ArrayList<EasyUITree>();   //创建一个空集合用于返回数据for (ItemCat itemCat : itemCatList) {Long id=itemCat.getId();String text=itemCat.getName();//如果是父级标题,则默认关闭closed,否则开启,openString state=itemCat.getIsParent()?"closed":"open";EasyUITree uiTree =new EasyUITree(id,text,state);treeList.add(uiTree);}return treeList;}
1.5.5展示效果

在这里插入图片描述

1.5.6、实现树形结构(编辑Controller)

参数:暂时没有—>id:一级分类的Id值

@RequestMapping("/list")public List<EasyUITree> findItemCatByParentId(Long id) {//初始化时应该设置应该默认值.//1.查询一级商品分类信息Long parentId = id ==null?0L:id;return itemCatService.findItemCatByParentId(parentId);}

或者

@RequestMapping("/list")public List<EasyUITree> findItemCatByParentId(@RequestParam(value = "id",defaultValue = "0")Long parentId) {//初始化时应该设置应该默认值.//1.查询一级商品分类信息//Long parentId = id ==null?0L:id;return itemCatService.findItemCatByParentId(parentId);}

2商品信息后端维护

2.1新增商品

2.1.1页面分析

<div style="padding:10px 10px 10px 10px"><form id="itemAddForm" class="itemForm" method="post"><table cellpadding="5"><tr><td>商品类目:</td><td><a href="javascript:void(0)" class="easyui-linkbutton selectItemCat">选择类目</a><input type="hidden" name="cid" style="width: 280px;"></input></td></tr><tr><td>商品标题:</td><td><input class="easyui-textbox" type="text" name="title" data-options="required:true" style="width: 280px;"></input></td></tr><tr><td>商品卖点:</td><td><input class="easyui-textbox" name="sellPoint" data-options="multiline:true,validType:'length[0,150]'" style="height:60px;width: 280px;"></input></td></tr><tr><td>商品价格:</td><td><input class="easyui-numberbox" type="text" name="priceView" data-options="min:1,max:99999999,precision:2,required:true" /><input type="hidden" name="price"/></td></tr><tr><td>库存数量:</td><td><input class="easyui-numberbox" type="text" name="num" data-options="min:1,max:99999999,precision:0,required:true" /></td></tr><tr><td>条形码:</td><td><input class="easyui-textbox" type="text" name="barcode" data-options="validType:'length[1,30]'" /></td></tr><tr><td>商品图片:</td><td><a href="javascript:void(0)" class="easyui-linkbutton picFileUpload">上传图片</a><input type="hidden" name="image"/></td></tr><tr><td>商品描述:</td><td><textarea style="width:800px;height:300px;visibility:hidden;" name="itemDesc"></textarea></td></tr><tr class="params hide"><td>商品规格:</td><td></td></tr></table><input type="hidden" name="itemParams"/></form><div style="padding:5px"><a href="javascript:void(0)" class="easyui-linkbutton" onclick="submitForm()">提交</a><a href="javascript:void(0)" class="easyui-linkbutton" onclick="clearForm()">重置</a></div>
</div>
	function submitForm(){//表单校验if(!$('#itemAddForm').form('validate')){$.messager.alert('提示','表单还未填写完成!');return ;}//转化价格单位,将元转化为分   $("元素").val(100)  赋值操作    $("元素").val()取值//eveal()专门做算术运算的封装体 - - ->$("#itemAddForm [name=price]").val(eval($("#itemAddForm [name=priceView]").val()) * 100);itemAddEditor.sync();//将输入的内容同步到多行文本中var paramJson = [];$("#itemAddForm .params li").each(function(i,e){var trs = $(e).find("tr");var group = trs.eq(0).text();var ps = [];for(var i = 1;i<trs.length;i++){var tr = trs.eq(i);ps.push({"k" : $.trim(tr.find("td").eq(0).find("span").text()),"v" : $.trim(tr.find("input").val())});}paramJson.push({"group" : group,"params": ps});});paramJson = JSON.stringify(paramJson);//将对象转化为json字符串$("#itemAddForm [name=itemParams]").val(paramJson);/*参数类型:1.{"key":"value","key2":"value2",.......}  	少量数据提交2.key=value&key2=value2......				基于字符串拼接,少量数据提交js表单常用方法:(海量数据)3.($("#itemAddForm").serialize());			将所有的from表单中的数据,采用字符串的形式自动拼接之后提交关于回调函数业务说明需求:确定后端服务器调用是否正确!!!策略说明:属性1:status==200 调用正确 status==201 调用失败属性2:msg  提交服务器相关说明信息属性3: data 服务器返回页面的业务数据  一般都是对象的JSON.*///$.post/get((地址)url,(提交参数信息)JSON,(回调函数)function(data){....}) //alert($("#itemAddForm").serialize());$.post("/item/save",$("#itemAddForm").serialize(), function(data){if(data.status == 200){$.messager.alert('提示','新增商品成功!');}else{$.messager.alert("提示","新增商品失败!");}});}

2.1.2封装VO对象

@Data
@NoArgsConstructor	
@AllArgsConstructor
@Accessors(chain = true)   //开启链式加载结构
public class SysResult {/**	策略说明:* 属性1:status==200 调用正确 status!=200 调用失败* 属性2:msg  提交服务器相关说明信息* 属性3: data 服务器返回页面的业务数据  一般都是对象的JSON.* */private Integer Status;private String msg;private Object data;//准备工具API 方便用户调用public static SysResult fail() {return new SysResult(201,"业务调用失败",null);}//成功方式1.需要返回服务器数据datapublic static  SysResult success() {return new SysResult(200,"业务调用成功",null);}//成功方式2.需要返回服务器数据datapublic static  SysResult success(Object data) {return new SysResult(200,"业务调用成功",data);}//成功方式3.可能告知服务器信息及服务器 public static  SysResult success(String msg,Object data) {return new SysResult(200,msg,data);}
}

2.1.3编辑ItemController

/*** 业务:商品的新增操作* url:/item/save* 参数:from表单数据* 返回值结果:SysResult对象*/@RequestMapping("/save")public SysResult saveItem(Item item) {try {itemService.saveItem(item);return SysResult.success();}catch(Exception e) {e.printStackTrace();	//打印错误信息return SysResult.fail();}}

2.1.4编辑ItemServiceImpl

	@Transactional  //控制数据库事务@Overridepublic void saveItem(Item item) {item.setStatus(1).setCreated(new Date()).setUpdated(item.getCreated());itemMapper.insert(item);}

2.2全局异常处理机制

2.2.1说明

代码中频繁出现cry{}catch,则可能影响代码结构. 不便于阅读. 能否利用全局的异常的捕获机制,简化try-catch个数
捕获位置: 常规捕获的位置是Controller层,因为Controller层是业务调用的最后的控制层.

2.2.2实现

//表示该类是全局异常处理机制类
@RestControllerAdvice  //advice-->通知    Rest-->返回的数据都是json串
@Slf4j		//添加日志
public class SystemExceptionAOP {/** 添加通用的异常返回的方法* 底层原理:AOP的异常通知*/@ExceptionHandler(RuntimeException.class) //拦截运行时异常public Object systemResultException(Exception e) {e.printStackTrace();  		//如果有问题,则直接在控制台打印log.error("{~~~业务调用异常~~~}",e);return SysResult.fail();	//返回统一的失败数据}
}

2.3商品修改

2.3.1修改提交页面分析

  • 定义弹出框位置
<div id="itemEditWindow" class="easyui-window" title="编辑商品" data-options="modal:true,closed:true,iconCls:'icon-save',href:'/page/item-edit'" style="width:80%;height:80%;padding:10px;"></div>
  • 点击编辑按钮效果
{text:'编辑',iconCls:'icon-edit',handler:function(){//获取用户选中的数据var ids = getSelectionsIds();if(ids.length == 0){$.messager.alert('提示','必须选择一个商品才能编辑!');return ;}//通过","号判断用户选择几个if(ids.indexOf(',') > 0){$.messager.alert('提示','只能选择一个商品!');return ;}//做完校验之后,执行弹出框操作,之后跳转到商品修改页面href:'/page/item-edit'"$("#itemEditWindow").window({...}
//目的实现商品的类目的回显var cid=data.cid;//发起ajax请求,注意请求参数问题,必须与方法接收一致$.get("/item/cat/queryItemName",{"itemCatId":cid},function (data) {$("#itemeEditForm input[name='cid']").siblings("span").text(data);});
  • 修改页面js
$("#itemeEditForm [name=itemParams]").val(paramJson);//alert($("#itemeEditForm").serialize());$.post("/item/update",$("#itemeEditForm").serialize(), function(data){if(data.status == 200){$.messager.alert('提示','修改商品成功!','info',function(){$("#itemEditWindow").window('close');$("#itemList").datagrid("reload");});}else{$.message.alert("提示",data.msg);}});

2.3.2编辑ItemController

/*** 业务:商品的修改操作* url:/item/update* 参数:from表单数据* 返回值结果:SysResult对象*/@RequestMapping("/update")public SysResult updateItem(Item item) {itemService.updateItem(item);return SysResult.success();}

2.3.2编辑ItemServiceImpl

@Transactional  //控制数据库事务@Overridepublic void updateItem(Item item) {item.setCreated(new Date()); //如果加了插件就可以注释掉这行itemMapper.updateById(item);}
扩展,创建时间和修改时间插件

在jt-common中

package com.jt.pojo;@Data
@Accessors(chain=true)
public class BasePojo implements Serializable{@TableField(fill = FieldFill.INSERT) //新增有效private Date created;@TableField(fill = FieldFill.UPDATE) //新增/修改时有效private Date updated;}
//完成自动填充功能
@Component //将对象交给Spring容器管理
public class MyMetaObjectHandler implements MetaObjectHandler {@Overridepublic void insertFill(MetaObject metaObject) {//设置自动填充的属性和属性值this.setInsertFieldValByName("created",new Date(), metaObject);this.setInsertFieldValByName("updated",new Date(), metaObject);}@Overridepublic void updateFill(MetaObject metaObject) {this.setUpdateFieldValByName("updated",new Date(), metaObject);}
}

2.4商品删除

2.4.1编辑ItemController

/*** 业务:商品的删除操作* url:http://localhost:8091/item/delete* 参数:from表单数据* 返回值结果:SysResult对象*/@RequestMapping("/delete")public SysResult deleteItem(Integer[] ids) {itemService.deleteItem(ids);return SysResult.success();}

2.4.2编辑ItemServiceImpl

@Transactional  //控制数据库事务@Overridepublic void deleteItem(Integer[] ids) {itemMapper.deleteBatchIds(Arrays.asList(ids));}

2.5上架下架

2.5.1编辑ItemController

/*** 业务:商品的上架/下架操作* url:/item/reshelf(instock)* 参数:from表单数据* 返回值结果:SysResult对象*/@RequestMapping("/reshelf")public SysResult reshelfItem(Long[] ids) {itemService.reshelfItem(ids);return SysResult.success();}@RequestMapping("/instock")public SysResult instockItem(Long[] ids) {itemService.instockItem(ids);return SysResult.success();}

2.5.2编辑ItemServiceImpl

@Transactional  //控制数据库事务@Overridepublic void reshelfItem(Long[] ids) {Item item=new Item();item.setStatus(1);//.setUpdated(new Date());//2.定义条件构造器UpdateWrapper<Item> updateWrapper =new UpdateWrapper<>();updateWrapper.in("id", Arrays.asList(ids));itemMapper.update(item, updateWrapper);}@Transactional  //控制数据库事务@Overridepublic void instockItem(Long[] ids) {Item item=new Item();item.setStatus(2);//.setUpdated(new Date());//2.定义条件构造器UpdateWrapper<Item> updateWrapper =new UpdateWrapper<>();updateWrapper.in("id", Arrays.asList(ids));itemMapper.update(item, updateWrapper);}

2.5.3将上架下架合并

		@RequestMapping("/status")public SysResult statusItem(Long[] ids) {itemService.statusItem(ids);return SysResult.success();}
	@Transactional  //控制数据库事务@Overridepublic void statusItem(Long[] ids) {Item item=new Item();Integer status;for (Long id : ids) {item= itemMapper.selectById(id);status=item.getStatus();//Item item=new Item();status=status==1?2:1;					//status=1则改为2,,!=1则改为1item.setStatus(status);//.setUpdated(new Date());				//设置状态和更新时间itemMapper.updateById(item);}

最后再加一个按钮

{text:'上/下架',iconCls:'icon-remove',handler:function(){//获取选中的ID串中间使用","号分割var ids = getSelectionsIds();if(ids.length == 0){$.messager.alert('提示','未选中商品!');return ;}$.messager.confirm('确认','确定上/下架ID为 '+ids+' 的商品吗?',function(r){if (r){var params = {"ids":ids,"status":status};$.post("/item/status",params, function(data){if(data.status == 200){$.messager.alert('提示','上/下架商品成功!',undefined,function(){$("#itemList").datagrid("reload");});}});}});}}

这篇关于EsayUI增删改查和上架下架--day4的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/576797

相关文章

在Mysql环境下对数据进行增删改查的操作方法

《在Mysql环境下对数据进行增删改查的操作方法》本文介绍了在MySQL环境下对数据进行增删改查的基本操作,包括插入数据、修改数据、删除数据、数据查询(基本查询、连接查询、聚合函数查询、子查询)等,并... 目录一、插入数据:二、修改数据:三、删除数据:1、delete from 表名;2、truncate

[MySQL表的增删改查-进阶]

🌈个人主页:努力学编程’ ⛅个人推荐: c语言从初阶到进阶 JavaEE详解 数据结构 ⚡学好数据结构,刷题刻不容缓:点击一起刷题 🌙心灵鸡汤:总有人要赢,为什么不能是我呢 💻💻💻数据库约束 🔭🔭🔭约束类型 not null: 指示某列不能存储 NULL 值unique: 保证某列的每行必须有唯一的值default: 规定没有给列赋值时的默认值.primary key:

08 增删查功能

划重点: lable 标签keyup:键盘事件标签内添加样式:style使用事件修饰符:preventforEach :遍历 数组indexOf: 可以返回要查询的某个字符串值在整个字符串中首次出现的位置下标findIndex:返回传入一个测试条件(函数)符合条件数组的首个元素的位置splice:向/从数组中添加/删除项目,然后返回被删除后的新的项目数组 黑椒蟹 一对: <!DOCTYPE

JSP的增删改查part2

增加显示数据库表格cdsn的功能 1. 》》对CdsnDao接口和方法,CdsnService接口和方法进行处理,并增加CdsnServlet用于对新建展示页面进行处理 对cdsnDao接口和方法增加 》》接口 //获取cdsn用户数据列表 public List<cdsn> getCdsnList();》》CdsnDaoImpl增加内容//获得数据库所有数据publ

JSP的增删改查part1

运用Myeclisp对数据库进行增删改查 要建立6个库 1).其中dao层用与连接数据库和对数据库进行相关操作; 2).entity层用于存放数据库连接后的实体数据; 3.)service层是在mcv三层模式中新添加一层,能够更加清晰的定义应用程序的边界,需要操作数据的时候,通过service层访问DAO层来实现。

AI聊天应用不能上架?Google play对AI类型应用的规则要求是什么?

随着生成式AI模型的广泛应用,很多开发者都有在开发AI应用或将其整合到应用中。我们知道,谷歌是非常注重应用生态的,去年开始就推出了一些针对生成式AI应用的政策,对AI应用的内容质量和合规性问题提出了一些要求。 几天前,还有开发者聊到,现在AI类型应用(如AI聊天)上架越来越难了。 (可斯信进qun与众多开发者交流上架经验) 这很可能是没了解清楚Google play 对AI应用的一些

QT QxOrm CRUD增删改查mysql数据库操作

QT QxOrm CRUD增删改查mysql数据库操作 QxOrm 是一个 C++ 库,旨在为 C++ 用户提供对象关系映射 (ORM) 功能。 基于每个类的简单 C++ 设置函数(如 Java 中的 Hibernate XML 映射文件),QxOrm 库提供以下功能: 持久性: 支持最常见的数据库,如 SQLite、MySQL、PostgreSQL、Oracle、MS SQL Server、Mo

ES增删改查内部原理

一、ES查询内部原理 客户端发起请求到集群协调节点coordinate node若是根据docId(不是根据docId查询则根据随机轮询算法,分配到所有分片查询)查询则根据路由算法,找到分片根据随机轮询算法,将请求分摊给主备节点,达到负载均衡的目的各个节点将结果返回给协调节点,由协调节点统一返回数据给客户端 二、ES增删改内部原理 客户端发起创建的请求到集群协调节点coordinate

算法训练营——day4螺旋矩阵

1 螺旋矩阵II-力扣59(中等) 1.1 题目:螺旋矩阵II 给你一个正整数 n ,生成一个包含 1 到 n2 所有元素,且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。 示例 1: 输入:n = 3输出:[[1,2,3],[8,9,4],[7,6,5]] 示例 2: 输入:n = 1输出:[[1]] 提示: 1 <= n <= 20 1.

MyBatis的增删改查基本操作

MyBatis和Hibernate的使用基本一样,区别在于Hibernate在Java代码中实现数据库操作,集成度高;Mybatis在注解或者xml文件中通过配置实现SQL语句,更加灵活 创建使用MyBatis的Java项目 1. 创建并配置 创建Java项目并引入MyBaits的jar文件配置log4j.properties(用于查看执行的SQL语句,日志等) log4j.ro