CGB2005京淘-5笔记

这篇博客详细介绍了电商后台系统中商品分类信息的回显和树形结构展现,涉及数据格式化问题,包括价格和状态的格式化。讨论了如何通过Ajax和JavaScript实现商品分类的动态加载,以及在页面中引用common.js的方法。同时,讲解了商品分类树形结构的构建,包括数据库存储方式、页面分析和JSON返回值解析。最后,提到了商品后台维护的系统返回值VO对象设计和全局异常处理机制。
摘要由CSDN通过智能技术生成

1. 商品分类信息回显

1.1 数据格式化问题

1.1.1 Item POJO说明

@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 > double  0.98元  0
	private Integer num;			//商品数量
	private String barcode;			//条形码
	private String image;			//商品图片信息   1.jpg,2.jpg,3.jpg
	private Long   cid;				//表示商品的分类id
	private Integer status;			//1正常,2下架
	

1.1.2 common.js是如何被item-list.jsp所引用的???

说明:由于用户默认的首页访问的是Index.jsp,在其中引入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>

补充说明: 由于item-list.jsp页面是index.jsp中的一部分.所以父级引入JS.子级也可以使用JS.

1.1.2 格式化价格

1).页面标识符

formatter 属性是EasyUI中专门负责格式化数据的函数.通过调用js.将返回值的结果进行展现.
传递参数时会传递2个参数. 一个是当前标签的值value.当前标签所在的行号.

<th data-options="field:'price',width:70,align:'right',formatter:KindEditorUtil.formatPrice">价格</th>

格式化函数介绍:
// 格式化价格
	formatPrice : function(val,row){
		return (val/100).toFixed(2);
	},
1

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号.如图:
在这里插入图片描述
需要通过格式化的函数,动态获取商品分类的名称,之后进行页面展现.
在这里插入图片描述

1.2.2 页面实现说明

1.利用格式化的函数的调用 向后端发送ajax请求.获取商品分类的名称
2.创建商品分类的POJO对象 ItemCat对象
3.创建ItemCatMapper 接口
4.实现通过数据库查询返回itemCat的name属性.

1.2.3 标识页面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;
	},

1.2.4 编辑ItemCat POJO对象

package com.jt.pojo;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import lombok.experimental.Accessors;

@TableName("tb_item_cat")
@Data
@Accessors(chain = true)
public class ItemCat extends BasePojo{
    @TableId(type = IdType.AUTO)
    private Long id;
    private Long parentId;  //父级ID
    private String name;    //分类名称
    private Integer status;  //状态信息
    private Integer sortOrder;//排序号
    private Boolean isParent; //是否为父级
}

1.2.5 编辑ItemCatController

package com.jt.controller;

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.RestController;

@RestController
@RequestMapping("/item/cat")  //请求业务名称
public class ItemCatController {

    @Autowired
    private ItemCatService itemCatService;

    /**
     * 分析业务: 通过itemCatId获取商品分类的名称
     * 1.url地址: url:"/item/cat/queryItemName",
     * 2.参数: {itemCatId:val},
     * 3.返回值: 商品分类名称  String
     */
    @RequestMapping("/queryItemName")
    public String findItemCatName(Long itemCatId){

        return itemCatService.findItemCatNameById(itemCatId);
    }

}

1.2.6 编辑ItemCatService

package com.jt.service;

public interface ItemCatService {
    String findItemCatNameById(Long itemCatId);
}

1.2.7 编辑ItemCatServiceImpl

package com.jt.service;

import com.jt.mapper.ItemCatMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class ItemCatServiceImpl implements ItemCatService{

    @Autowired
    private ItemCatMapper itemCatMapper;

    @Override
    public String findItemCatNameById(Long itemCatId) {
        return itemCatMapper.selectById(itemCatId).getName();
    }
}

1.2.8 页面效果展现

在这里插入图片描述

1.2.9 ajax的嵌套问题

说明:如果在页面中涉及到ajax嵌套问题,一般的解决的方法就是将内存的ajax设置为同步模式,可以正确的展现数据.
在这里插入图片描述

2. 商品分类树形结构展现

2.1弹出框效果说明

$("#win1").window({
				title:"弹出框",
				width:400,
				height:400,
				modal:true   //这是一个模式窗口,只能点击弹出框,不允许点击别处
			})

2.2 商品分类数据结构分析

说明:一般电商网址的商品分类信息一般都是3级菜单. 级与级之间存在父子级关系. 在数据库中应该如何存储???
解答: 一般涉及到父子级关系时,一般采用parentId的形式进行关联.
例如: 查询一级商品分类信息:

2.3 树形结构分析

2.3.1.页面分析

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>EasyUI-3-菜单按钮</title>
<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>
<link rel="stylesheet" type="text/css"
	href="/js/jquery-easyui-1.4.1/themes/icon.css" />
<link rel="stylesheet" type="text/css"
	href="/js/jquery-easyui-1.4.1/themes/default/easyui.css" />
<script type="text/javascript">
	/*通过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-li 定义树形结构-->
		<ul id="tree"></ul>
	</body>
</html>

2.3.2 关于树形结构JSON串返回值分析

	{
		"id":"3",
		"text":"吃鸡游戏",
		"iconCls":"icon-save"
	}

2.3.3 封装EasyUITree VO对象

package com.jt.vo;

import lombok.Data;
import lombok.experimental.Accessors;

@Data
@Accessors(chain = true)
public class EasyUITree {
    //"id":"3","text":"吃鸡游戏","state","open/closed" 数据来源  数据表
    private Long  id;       //商品分类的id信息
    private String text;    //商品分类name属性
    private String state;   //闭合还是打开???
}

2.3.4 商品分类展现页面说明

在这里插入图片描述

2.3.5 编辑ItemCatController

package com.jt.controller;

import com.jt.service.ItemCatService;
import com.jt.vo.EasyUITable;
import com.jt.vo.EasyUITree;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

@RestController
@RequestMapping("/item/cat")
public class ItemCatController {
    @Autowired
    private ItemCatService itemCatService;

    /**
     * 分析业务: 通过itemCatId获取商品分类的名称
     * 1.url地址: url:"/item/cat/queryItemName",
     * 2.参数: {itemCatId:val},
     * 3.返回值: 商品分类名称  String
     */
    @RequestMapping("/queryItemName")
    public  String findItemCatName(Long itemCatId){
        return itemCatService.findItemCatNameById(itemCatId);
    }
    /**
     * 业务需求:实现商品分类的展现
     * url地址:http://localhost:8091/item/cat/list
     * 参数: parentId = 0 查询一级商品分类菜单。
     *  返回值结果:List<EasyUITree>
     */
    @RequestMapping("/list")
    public List<EasyUITree> findItemCatList(){
        Long parentId=0L;
        return itemCatService.findItemCatList(parentId);
    }
}

2.3.6 编辑ItemCatService

 /**
     * 思路:
     * 1,通过parentId查询数据库信息,返回值结果List<ItemCat>
     * 2.将ItemCat信息转化为E爱上他
     * @param parentId
     * @return
     */
    @Override
    public List<EasyUITree> findItemCatList(Long parentId) {

        //1.根据父级分类Id查询数据
        QueryWrapper<ItemCat> queryWrapper=new QueryWrapper<>();
        queryWrapper.eq("parent_id", parentId);
        List<ItemCat> catList = itemCatMapper.selectList(queryWrapper);

        //2.需要将数据转化,cartList遍历  封装EasyUITree 添加到集合中
        List<EasyUITree> treeList = new ArrayList<>();
        for (ItemCat itemCat:catList){
            Long id = itemCat.getId();
            String text = itemCat.getName();
            //是父级就打开  否则就关闭
            String state  = itemCat.getIsParent()?"closed":"open";
            EasyUITree easyUITree = new EasyUITree(id,text,state);
            //3.封装返回数据
            treeList.add(easyUITree);
        }
        return treeList;
    }

页面效果展示
在这里插入图片描述

2.3.7 商品查询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);
    }

3.商品后台维护

3.1 定义系统返回值VO对象

3.1.1 业务说明

由于业务处理一般都会通过JSON串的形式告知客户端程序是否完成.所以一般情况下都会通过vo对象来返回回执信息,
一般情况下VO对象需要返回业务是否正确/业务处理信息/业务处理数据.

3.1.2 封装SysResultVO对象

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 SysResult {
    private Integer status;  //定义状态信息 200业务处理失败
    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);
    }
}

3.2 商品新增

3.2.1 页面URL分析

1).url请求地址
在这里插入图片描述
2).页面提交参数

在这里插入图片描述
3).页面AJAX展现形式

<a href="javascript:void(0)" class="easyui-linkbutton" onclick="submitForm()">提交</a>
//alert($("#itemAddForm").serialize());
        //ajax参数提交方式1json方式 $.post("/xx/xx",{key:value,key2:value2},回调函数)
        //ajax参数提交方式1json方式 $.post("/xx/xx",key=value&key2=value2....,回调函数)
		//jQuery中提供了serialize()将整个表单的数据封装为key=value&key2=value2的形式
		//alert($("#itemAddForm").serialize());
		$.post("/item/save",$("#itemAddForm").serialize(), function(data){
			if(data.status == 200){
				$.messager.alert('提示','新增商品成功!');
			}else{
				$.messager.alert("提示","新增商品失败!");
			}
		});

3.2.2 编辑ItemController

/**
	 * 业务需求:完成商品入库操作,返回系统vo对象
	 * url1: /item/save
	 *  参数: 整个form表单   itemDesc参数
	 *  返回值: SysResult对象
	 */
	@RequestMapping("save")
	public SysResult saveItem(Item item){
		//全局异常的处理机制!!!
		try{
			itemService.saveItem(item);
			return SysResult.success();
		}catch(Exception e){
			e.printStackTrace();
			return SysResult.fail();
		}
	}

3.2.3 编辑ItemServiceImpl

	@Transactional  //控制事物
	@Override
	public void saveItem(Item item) {
		//1.默认商品为上架状态
		item.setStatus(1).setCreated(new Date()).setUpdated(new Date());
		itemMapper.insert(item);
	}

@Transactional 事物控制

3.3 全局异常处理机制

3.3.1 作用

如果在每个方法中添加异常处理机制,则会导致整个代码的结构混乱.即使将来出现了异常,也不能很好的管理.所以需要一种统一的方式实现异常的处理.
该功能在Spring中利用AOP的方式实现.

3.3.2 创建全局异常处理

package com.jt.aop;

import com.jt.vo.SysResult;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

@RestControllerAdvice      //作用:标识我是一个通知方法,并且只拦截Controller层的异常,并且返回JSON
public class SysResultException {

    //需要定义 一个全局的方法  返回指定的报错信息
    //@ExceptionHandler
    @ExceptionHandler(RuntimeException.class)
    public  Object exception(Exception e){
        e.printStackTrace();
        return SysResult.fail();
    }
}

Bug 关于SpringBoot启动报错的问题

Error starting ApplicationContext. To display the conditions report re-run your application with ‘debug’ enabled.
未解决
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值