cgb2008-jingtao day05

1. Отображение классификации продукта

1.1 Отображение древовидной структуры

Элемент управления в виде дерева читает URL-адрес. Загрузка дочерних узлов зависит от состояния родительского узла. При расширении закрытого узла, если у узла нет загруженных дочерних узлов, он примет значение идентификатора узла в качестве параметра HTTP-запроса и назовет его 'id' и отправит его на сервер через URL-адрес для извлечения дочернего узла.

1. Если пользователь не расширяет дочерний узел в условиях по умолчанию, запрос не будет отправлен
2. Когда пользователь открывает закрытый узел, идентификатор измененного узла будет использоваться в качестве параметра для запроса внутреннего сервера.
Вставьте описание изображения сюда

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. Исключение должно быть перехвачено на уровне контроллера. Mapper ----> Service (API инструмента) -----> Controller ----> user
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 как конкретное имя, реализовать идею динамического получения значения id, равного 3, затем инициировать запрос 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