cgb2008-jingtao day06

1. Realize a operação de mercadorias dentro e fora

1.1 Análise de página

Descrição: o código de status usa o estilo de RestFul para realizar a transmissão de parâmetros dinâmicos.
Operação de exclusão : http: // localhost: 8091 / item / updateStatus / 2 status = 2
Operação de listagem: http: // localhost: 8091 / item / 1 status = 1
Insira a descrição da imagem aqui

1.2 Editar ItemController

/**
	 * 实现商品上架/下架操作
	 * url:/item/updateStatus/2
	 * 参数: 1/2代表商品的状态, ids=100,101,102,103
	 * 返回值: SysResult对象
	 * SpringMVC框架: 参数接收说明 如果参数中间以逗号的形式分割
	 * 则可以自动的转化为数组类型
	 */
	@RequestMapping("/updateStatus/{status}")
	public SysResult updateStatus(@PathVariable Integer status,Long... ids){

		itemService.updateStatus(ids,status);
		return SysResult.success();
	}

1.3 Editar ItemService

@Override
	public void updateStatus(Long[] ids, Integer status) {
		//1.以MP的方式操作数据库  只修改状态码/updated时间
		/*Item item = new Item();
		item.setStatus(status);
		QueryWrapper<Item> queryWrapper = new QueryWrapper<>();
		queryWrapper.in("id", ids);
		itemMapper.update(item,queryWrapper);*/

		//2.手写SQL;
		itemMapper.updateStatus(ids,status);
	}

1.4 Editar ItemMapper

Insira a descrição da imagem aqui
Editar arquivo de mapeamento do mapeador
Insira a descrição da imagem aqui

2. Perceba a exibição de detalhes do produto

2.1 Descrição da empresa

Geralmente, os usuários só precisam exibir informações relacionadas ao produto ao consultar produtos. Se o usuário clicar em um produto, as informações de detalhes do produto serão exibidas. Como os detalhes do produto são grandes campos de informação, a recuperação é relativamente lenta e desperdiça desempenho.
Descrição do design da tabela:
1. tabela de produtos tb_item
2. tabela de detalhes de produtos tb_item_desc
Há apenas uma informação de detalhes para um item, portanto, a tabela de itens e itemDesc são um para um.

2.2 Projeto da tabela de detalhes do produto

Insira a descrição da imagem aqui

2.3 Editar ItemDesc

Insira a descrição da imagem aqui

2.4 Introdução ao Editor de Rich Text

2.4.1 Caso introdutório

Insira a descrição da imagem aqui

2.5 Novos produtos refatorados

2.5.1 Descrição do negócio

Visto que a adição do produto é para adicionar objetos Item / ItemDesc juntos, é necessário completar a operação de armazenamento de 2 tabelas.

2.5.2 Editar ItemController

Insira a descrição da imagem aqui

2.5.3 Editar ItemService

Insira a descrição da imagem aqui

2.6 Exibição de detalhes do produto

2.6.1 Análise de página

Insira a descrição da imagem aqui

2.6.2 Análise JS da página

Insira a descrição da imagem aqui

2.6.3 Editar ItemController

/**
	 * 业务说明: 根据商品Id号,检索商品详情信息
	 * url:  http://localhost:8091/item/query/item/desc/1474392023
	 * 参数:  result风格获取数据.
	 * 返回值: SysResult对象
	 */
	@RequestMapping("/query/item/desc/{itemId}")
	public SysResult findItemDescById(@PathVariable Long itemId){

		ItemDesc itemDesc = itemService.findItemDescById(itemId);
		return SysResult.success(itemDesc);
	}

2.6.4 Editar ItemService

@Override
	public ItemDesc findItemDescById(Long itemId) {

		return itemDescMapper.selectById(itemId);
	}

2.6.5 Exibição de efeito de página

Insira a descrição da imagem aqui

2.7 Atualização do produto refatorado

2.7.1 Descrição do negócio

Quando o usuário clica na atualização do produto, deve ser implementada a operação de atualização dos dados das duas tabelas. Atualizar item / Atualizar objeto ItemDesc

2.7.2 Editar ItemController

Insira a descrição da imagem aqui

2.7.3 Editar ItemService

Insira a descrição da imagem aqui

2.8 Operação de exclusão de mercadoria

Edite ItemService para implementar a operação de exclusão de detalhes do produto
Insira a descrição da imagem aqui

3 Upload de arquivo

3.1 Introdução ao upload de arquivo

3.1.1 Identificação de página

Insira a descrição da imagem aqui

3.1.2 Caso de entrada de upload de arquivo

package com.jt.controller;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;

@RestController
public class FileController {

    /**
     * url地址:  http://localhost:8091/file
     * 参数:     文件信息 fileImage
     * 返回值:   String
     */
    @RequestMapping("/file")
    public String file(MultipartFile fileImage) throws IOException {
        //1.获取图片名称
        String name = fileImage.getOriginalFilename();
        //2.定义文件目录
        String fileDirPath = "D:/JT-SOFT/images";
        //3.创建目录
        File fileDir = new File(fileDirPath);
        if(!fileDir.exists()){
            fileDir.mkdirs();
        }
        //4.生成文件的全路径
        String filePath = fileDirPath+"/"+name;
        File imageFile = new File(filePath);
        //5.实现文件上传
        fileImage.transferTo(imageFile);
        return "文件上传成功!!!";
    }
}

3.2 Negócios de upload de arquivos

3.2.1 Análise do URL da página

Insira a descrição da imagem aqui

3.2.2 Parâmetros de solicitação

Insira a descrição da imagem aqui

3.2.3 Editar Objeto VO

{"Erro": 0, "url": "salvar caminho da imagem", "largura": largura da imagem, "altura": altura da imagem}

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 ImageVO {
    //{"error":0,"url":"图片的保存路径","width":图片的宽度,"height":图片的高度}
    private Integer error;  // 0 表示文件上传正确    1.上传有误
    private String  url;    //图片浏览的网络地址(虚拟地址)
    private Integer width;  //宽度
    private Integer height; //高度

    public static ImageVO fail(){

        return new ImageVO(1, null, null, null);
    }

    public static ImageVO success(String url,Integer width,Integer height){

        return new ImageVO(0, url,width, height);
    }
}

3.2.4 Editar FileController

 /**
     * 业务需求: 实现文件上传操作
     *  url:http://localhost:8091/pic/upload?dir=image
     *  参数:uploadFile
     *  返回值: ImageVO对象
     */
     @RequestMapping("/pic/upload")
     public ImageVO upload(MultipartFile uploadFile){

         return fileService.upload(uploadFile);
     }

3.2.5 Editar FileService

package com.jt.service;

import com.jt.vo.ImageVO;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.datatransfer.FlavorEvent;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashSet;
import java.util.Set;
import java.util.UUID;

@Service
public class FileServiceImpl implements FileService{

    private static Set<String> typeSet = new HashSet<>();
    static {
        //利用配置文件动态将图片类型获取.
        typeSet.add(".jpg");
        typeSet.add(".png");
        typeSet.add(".gif");
    }


    /**
     * 业务逻辑:实现文件上传
     * 步骤:
     *      1.校验图片的类型  jpg|png|gif.......
     *      2.校验文件是否为恶意程序...
     *      3.采用分目录的结构进行存储
     *      4.避免文件重名  UUID
     *
     * 考题: UUID有多少种排列组合? 32位16进制数.... 0-9 A-F   2^4*32 2^128   hash碰撞
     *       hash取值有多少种可能性? 8位16进制数    2^32
     *
     * @param uploadFile
     * @return
     */
    @Override
    public ImageVO upload(MultipartFile uploadFile){
        //一. 校验图片类型  1.利用集合校验   2.正则表达式
        //1.1 获取文件名称  1.jpg  1.JPG
        String fileName = uploadFile.getOriginalFilename();
        fileName = fileName.toLowerCase();
        int index = fileName.lastIndexOf(".");
        //1.2 获取下标 获取文件后缀类型
        String fileType = fileName.substring(index);
        //1.3 判断是否为图片类型
        if(!typeSet.contains(fileType)){
            return ImageVO.fail();
        }

        //二.如果是图片  高度/宽度
        //2.1将数据转化为图片对象
        try {
            BufferedImage bufferedImage =
                    ImageIO.read(uploadFile.getInputStream());
            int width  = bufferedImage.getWidth();
            int height = bufferedImage.getHeight();

            if(width == 0 || height == 0){
                return ImageVO.fail();
            }

            //三 实现分目录存储
            String fileDir = "D:/JT-SOFT/images";
            //3.1按照/yyyy/MM/dd/的方式进行目录划分
            String dateDir = new SimpleDateFormat("/yyyy/MM/dd/")
                             .format(new Date());
            //D:/JT-SOFT/images/2020/12/1/
            String fileDirPath = fileDir + dateDir;
            File dirFile = new File(fileDirPath);
            //3.2 创建目录
            if(!dirFile.exists()){
                dirFile.mkdirs();
            }

            //四. 实现文件上传 20-18-3.3
            //4.1 准备文件名称  UUID  522f88bb-33b2-11eb-93fb-00d861eaf238
            String uuid = UUID.randomUUID()
                          .toString().replace("-", "");
            //4.2 动态生成文件名称  uuid.jpg
            String uuidName = uuid + fileType;

            //4.3 实现文件上传
            File realFile = new File(fileDirPath+uuidName);
            uploadFile.transferTo(realFile);

            String url = "https://img14.360buyimg.com/n0/jfs/t1/142351/39/11668/73504/5f91a1caEae160a0a/568da3be2b7a960c.jpg";
            return ImageVO.success(url, width,height);

        } catch (IOException e) {
            e.printStackTrace();
            return ImageVO.fail(); //报错返回
        }
    }
}

Operação

1. Entenda o que é um proxy reverso / proxy de encaminhamento
2. Se o endereço do disco pode ser otimizado e desacoplado
3. Instale uma máquina virtual / execute o sistema operacional
Insira a descrição da imagem aqui
Entre no sistema BIOS na placa-mãe e ative as configurações de virtualização.
Insira a descrição da imagem aqui

Acho que você gosta

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