cgb2008-京淘day05

1.商品分类展现

1.1 树形结构展现

树控件读取URL。子节点的加载依赖于父节点的状态。当展开一个封闭的节点,如果节点没有加载子节点,它将会把节点id的值作为http请求参数并命名为’id’,通过URL发送到服务器上面检索子节点。

1.用户在默认条件下 如果没有展开子节点,则不会发送请求.
2.当用户打开封闭的节点时,则会将改节点的ID当做参数,向后端服务器请求.
在这里插入图片描述

1.2 编辑ItemCatController

/**
     * 业务需求: 实现商品分类树形结构展现
     * url地址:   http://localhost:8091/item/cat/list
     * 参数:      id= 父级节点的ID
     * 返回值:    List<EasyUITree>
     */
    @RequestMapping("/list")
    public List<EasyUITree> findItemCatList(Long id){
        //暂时只查询一级商品分类信息
        long parentId = (id==null?0:id);
        return itemCatService.findItemCatList(parentId);
    }

1.3 编辑ItemCatService

 /**
     * 1.根据parentId 查询子级目录信息
     * 2.获取ItemCatList集合,之后将List集合转化为VOList集合
     * 3.返回数据
     * @param parentId
     * @return
     */
    @Override
    public List<EasyUITree> findItemCatList(long parentId) {
        QueryWrapper<ItemCat> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("parent_id", parentId);
        List<ItemCat> catList = itemCatMapper.selectList(queryWrapper);

        //2 list集合转化
        List<EasyUITree> treeList = new ArrayList<>(catList.size());
        for (ItemCat itemCat : catList){
            long id = itemCat.getId();
            String text = itemCat.getName();
            String state = itemCat.getIsParent()?"closed":"open"; //是父级,默认应该closed
            EasyUITree easyUITree = new EasyUITree(id, text, state);
            treeList.add(easyUITree);
        }
        return treeList;
    }

1.4 页面效果展现

在这里插入图片描述

2.商品CRUD操作

2.1 商品新增

2.1.1 页面分析

在这里插入图片描述

2.1.2 用户参数

在这里插入图片描述

2.1.3 页面JS分析

在这里插入图片描述

2.1.4 封装系统VO对象

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表示成功   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);
    }

    public static SysResult success(String msg,Object data){

        return new SysResult(200, msg, data);
    }
}

2.1.5 编辑ItemController

/**
	 * 业务需求:	完成商品新增操作
	 * url:	http://localhost:8091/item/save
	 * 参数: 整个表单进行提交  使用对象接收
	 * 返回值: 系统返回值对象
	 *
	 */
	@RequestMapping("/save")
	public SysResult saveItem(Item item){
		try {
			itemService.saveItem(item);
			return SysResult.success();
		}catch (Exception e){
			e.printStackTrace();
			return SysResult.fail();
		}
	}

2.1.5 编辑ItemService

    @Override
	@Transactional	//开启事务控制
	public void saveItem(Item item) {
		Date date = new Date();
		item.setStatus(1).setCreated(date).setUpdated(date);
		itemMapper.insert(item);
		//int a = 1/0;
	}

2.2 参数自动填充功能

2.2.1 需求说明

如果用户在入库/更新操作时,能否实现时间的自动的填充功能.简化用户操作的步骤.

2.2.2 添加注解

在这里插入图片描述

2.2.3 配置自动赋值

package com.jt.config;

import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;

import java.util.Date;

@Component      //将对象交给容器管理
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);
    }

}

2.3 全局异常处理机制

2.3.1 全局异常处理机制说明

1.如果将大量的异常处理写到代码中虽然可以保证程序稳定的运行.但是代码的结构非常的混乱.
2.异常是程序运行状态的一种体现.如果没有一种统一的规则来管理异常,则程序一旦出错问题无法定位.
3.异常应该在Controller层进行拦截. mapper---->Service(工具API)----->Controller---->用户
4.使用AOP 中的异常通知完成该功能.

2.3.2 引入jar包

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.jt</groupId>
    <artifactId>jt</artifactId>
    <version>1.0-SNAPSHOT</version>
    <modules>
        <module>jt-common</module>
        <module>jt-manage</module>
    </modules>
    <!--打包类型为POM 只有pom才能被其他项目继承-->
    <packaging>pom</packaging>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.4.0</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <properties>
        <!--指定JDK版本-->
        <java.version>1.8</java.version>
        <!--跳过测试类打包-->
        <skipTests>true</skipTests>
    </properties>

    <!--依赖的作用:依赖需要的jar包文件  -->
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <!--spring-boot-starter-xxx springboot启动项
            开箱即用:
             只需要引入特定的jar包简单的配置,即可以使用该功能
             -->
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <!--支持热部署 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
        </dependency>

        <!--引入插件lombok 自动的set/get/构造方法插件  -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>

        <!--添加数据库驱动包-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>

        <!--springBoot整合jdbc-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>

        <!--SpringBoot整合MybatisPlus  mybatis和plus jar包冲突的-->
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.2.0</version>
        </dependency>

        <!--springBoot整合JSP添加依赖  -->
        <!--servlet依赖 -->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
        </dependency>

        <!--jstl依赖 -->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>jstl</artifactId>
        </dependency>

        <!--使jsp页面生效 -->
        <dependency>
            <groupId>org.apache.tomcat.embed</groupId>
            <artifactId>tomcat-embed-jasper</artifactId>
        </dependency>

        <!--添加httpClient jar包 -->
        <dependency>
            <groupId>org.apache.httpcomponents</groupId>
            <artifactId>httpclient</artifactId>
        </dependency>

        <!--引入dubbo配置 -->
        <!--<dependency>
            <groupId>com.alibaba.boot</groupId>
            <artifactId>dubbo-spring-boot-starter</artifactId>
            <version>0.2.0</version>
        </dependency>-->

        <!--添加Quartz的支持 -->
      <!--  <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-quartz</artifactId>
        </dependency>-->

        <!-- 引入aop支持 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-aop</artifactId>
        </dependency>

        <!--spring整合redis -->
        <dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.data</groupId>
            <artifactId>spring-data-redis</artifactId>
        </dependency>
    </dependencies>

    <!--不要添加build标签 -->
</project>

2.3.3 定义全局异常处理

package com.jt.aop;

import com.jt.vo.SysResult;
import lombok.extern.log4j.Log4j;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import sun.rmi.runtime.Log;

import java.sql.SQLException;
import java.util.logging.Logger;

@RestControllerAdvice   //AOP+异常通知
//@Slf4j
public class SystemException {

    //当遇到某种类型的异常时才会执行
    @ExceptionHandler({RuntimeException.class})
    public Object exception(Exception e){
        //log.info(e.getMessage());
        e.printStackTrace();//输出异常信息
        //如果出错,返回系统级别的报错数据即可
        return SysResult.fail();
    }
}


2.4 实现商品分类名称的回显

2.4.1 业务分析

在这里插入图片描述
在这里插入图片描述
说明: 需要将3动态展现为具体名称, 实现思路 动态获取3的id值,之后发起Ajax请求,之后动态获取商品分类名称之后在指定的位置展现.

2.4.2 编辑页面JS

在这里插入图片描述

2.5 商品修改

2.5.1 查看页面JS

在这里插入图片描述

2.5.2 编辑ItemController

/**
	 * 实现商品编辑
	 * url地址: /item/update
	 * 请求参数: 整个form表单提交
	 * 返回值:	sysResult对象
	 */
	@RequestMapping("/update")
	public SysResult updateItem(Item item){
		itemService.updateItem(item);
		return SysResult.success();
	}

2.5.3 编辑ItemService

@Override
@Transactional	//控制事务**
	public void updateItem(Item item) {

		itemMapper.updateById(item);
	}

2.6 商品删除操作

2.6.1 业务分析

当用户选中数据之后,点击删除按钮时,应该执行删除操作.
1.利用MP方式实现数据删除.
2.利用手写Sql形式,手动删除数据.

2.6.2 页面分析

1).请求路径
在这里插入图片描述
2).请求参数
在这里插入图片描述
3).页面JS分析
在这里插入图片描述

2.6.3 编辑ItemController

/**
	 * 需求: 实现商品删除操作
	 * url: http://localhost:8091/item/delete
	 * 请求参数:  ids: 1474392029,1474392030
	 * 返回值:  SysResult对象
	 *
	 * 知识扩展:
	 * 	问题: 页面中<input name="id"  value="100"/>
	 * 	参数是如何接收的,底层实现是什么? servlet是否熟悉
	 * 	利用servlet中的request对象/response对象进行参数传递.
	 *
	 *  注意事项:方法中的参数名称,必须与页面中的name属性名称一致!!!
	 */
	@RequestMapping("/delete")
	public SysResult deleteItems(Long[] ids){

		itemService.deleteItems(ids);
		return SysResult.success();

	/*	String ids = request.getParameter("ids");
		String[] idsStr = ids.split(",");
		Long[]   idsLong = new Long[idsStr.length];
		for(int i=0;i<idsStr.length;i++){
			idsLong[i] = Long.parseLong(idsStr[i]);
		}
		idsLong*/
	}

2.6.4 编辑ItemService

@Override
	public void deleteItems(Long[] ids) {
		//方式1:利用MP方式实现
		List<Long> longIds = Arrays.asList(ids);
		itemMapper.deleteBatchIds(longIds);
	}

2.7 手写sql实现删除

2.7.1 编辑ItemService

//sql: delete from tb_item where id in (100,101...)
	@Override
	public void deleteItems(Long[] ids) {
		//方式1:利用MP方式实现
		/*List<Long> longIds = Arrays.asList(ids);
		itemMapper.deleteBatchIds(longIds);*/

		//方式2:手写Sql完成数据删除.
		itemMapper.deleteItems(ids);
	}

2.7.2 编辑ItemMapper

public interface ItemMapper extends BaseMapper<Item>{

    @Select("select * from tb_item order by updated desc limit #{startIndex},#{rows}")
    //将多值封装成单值  Map集合   key=xxx value 0,   key=yyy  value=20
    List<Item> findItemByPage(int startIndex,int rows);

    void deleteItems(Long[] ids);
}

2.7.3 编辑映射文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.jt.mapper.ItemMapper">

	<!--
		1.实现商品删除
		知识点:  Mybatis参数传递问题(版本有关系)
		原因:	Mybatis底层实现时通过下标的方式取值
				但是下标默认值都是0 mybatis只能传递一个参数(单值传递)

		需求:    需要多值传递.  核心思想 将多值转化为单值.
		常用方法:   1.使用对象封装  2.可以封装为数组/list   3.Map集合
		取值方式:   1.#{对象的属性} 2. 特殊字符 array/list  3.#{key}

		高版本说明: 如果参数的个数多余1个时,则默认采用Map的方式进行封装.
		低版本说明:如果key有多个,则需要手动封装
	-->
	<delete id="deleteItems">
		delete from tb_item where id in (
		<foreach collection="array" separator="," item="id" >
			#{id}
		</foreach>
		)
	</delete>
</mapper>

2.8 实现商品上架/下架操作

2.8.1 业务说明

上架操作: status=1 下架操作: status=2
当用户点击上架/下架操作时,需要动态的修改状态信息.
在这里插入图片描述

2.8.2 页面JS分析

下架操作: /item/instock
上架操作: /item/reshelf

需求: 如何让程序简单操作,越简单越好. "一个方法"实现上架/下架. 可以修改JS请求/RestFul

猜你喜欢

转载自blog.csdn.net/qq_16804847/article/details/110368277