cgb2008-jingtao día05

1. Pantalla de clasificación de productos

1.1 Visualización de estructura de árbol

El control de árbol lee la URL. La carga de los nodos secundarios depende del estado del nodo principal. Al expandir un nodo cerrado, si el nodo no tiene nodos secundarios cargados, tomará el valor de la identificación del nodo como un parámetro de solicitud http y lo llamará 'id', y lo enviará al servidor a través de la URL para recuperar el nodo secundario.

1. Si el usuario no expande el nodo secundario en las condiciones predeterminadas, la solicitud no se enviará
2. Cuando el usuario abre un nodo cerrado, la ID del nodo cambiado se utilizará como parámetro para solicitar el servidor backend.
Inserte la descripción de la imagen aquí

1.2 Editar 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 Editar 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 Visualización de efectos de página

Inserte la descripción de la imagen aquí

2. Operación CRUD de productos básicos

2.1 Nuevos productos

2.1.1 Análisis de página

Inserte la descripción de la imagen aquí

2.1.2 Parámetros de usuario

Inserte la descripción de la imagen aquí

2.1.3 Análisis JS de página

Inserte la descripción de la imagen aquí

2.1.4 Objeto VO del sistema de embalaje

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 Editar 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 Editar 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 Función de llenado automático de parámetros

2.2.1 Descripción de requisitos

Si el usuario se encuentra en la operación de almacén / actualización, ¿se puede realizar la función de llenado automático del tiempo? Simplifique los pasos de la operación del usuario.

2.2.2 Agregar comentarios

Inserte la descripción de la imagen aquí

2.2.3 Configurar la asignación automática

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 Mecanismo de manejo de excepciones globales

2.3.1 Descripción del mecanismo global de tratamiento de excepciones

1. Si escribe mucho manejo de excepciones en el código, puede garantizar el funcionamiento estable del programa. Pero la estructura del código es muy confusa.
2. Las excepciones son una manifestación del estado de ejecución del programa. Si no hay una regla unificada para administrar las excepciones , Una vez que el programa falla, el problema no puede ser localizado.
3. La excepción debe ser interceptada en la capa del Controlador. Mapeador ----> Servicio (API de herramientas) -----> Controlador ----> usuario
4. Use la excepción en AOP Notifique la finalización de la función.

2.3.2 Importar paquete 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 Definir el manejo de excepciones globales

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 Darse cuenta del eco del nombre de la categoría de producto

2.4.1 Análisis empresarial

Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí
Nota: Debe mostrar dinámicamente 3 como un nombre específico, darse cuenta de la idea de obtener dinámicamente el valor de identificación de 3, luego iniciar una solicitud Ajax y luego obtener dinámicamente el nombre de la categoría de producto y mostrarlo en la ubicación especificada.

2.4.2 Editar página JS

Inserte la descripción de la imagen aquí

2.5 Modificación de la mercancía

2.5.1 Ver página JS

Inserte la descripción de la imagen aquí

2.5.2 Editar ItemController

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

2.5.3 Editar ItemService

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

		itemMapper.updateById(item);
	}

2.6 Operación de eliminación de producto

2.6.1 Análisis empresarial

Cuando el usuario selecciona los datos y hace clic en el botón eliminar, se debe ejecutar la operación de eliminación:
1. Use el método MP para eliminar los datos
2. Use el formulario SQL escrito a mano para eliminar manualmente los datos.

2.6.2 Análisis de página

1). Ruta de solicitud
Inserte la descripción de la imagen aquí
2). Parámetros de solicitud
Inserte la descripción de la imagen aquí
3). Análisis JS de página
Inserte la descripción de la imagen aquí

2.6.3 Editar 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 Editar ItemService

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

2.7 SQL de escritura a mano para lograr la eliminación

2.7.1 Editar 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 Editar 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 Editar el archivo de mapeo

<?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 Darse cuenta del funcionamiento de las mercancías dentro / fuera de los estantes

2.8.1 Descripción comercial

Operación de estantería: estado = 1
Operación de eliminación de estantería: estado = 2 Cuando el usuario hace clic en la operación de estantería / extracción, la información de estado debe modificarse dinámicamente.
Inserte la descripción de la imagen aquí

2.8.2 Análisis JS de página

Funcionamiento de la
estantería: / artículo / instock Funcionamiento de la estantería: / item / reshelf

Requisito: Cómo hacer que el programa sea simple de operar, cuanto más simple, mejor. "Un método" para lograr la inclusión / eliminación. Puede modificar la solicitud JS / RestFul

Supongo que te gusta

Origin blog.csdn.net/qq_16804847/article/details/110368277
Recomendado
Clasificación