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
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
Editar arquivo de mapeamento do mapeador
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
2.3 Editar ItemDesc
2.4 Introdução ao Editor de Rich Text
2.4.1 Caso introdutório
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
2.5.3 Editar ItemService
2.6 Exibição de detalhes do produto
2.6.1 Análise de página
2.6.2 Análise JS da página
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
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
2.7.3 Editar ItemService
2.8 Operação de exclusão de mercadoria
Edite ItemService para implementar a operação de exclusão de detalhes do produto
3 Upload de arquivo
3.1 Introdução ao upload de arquivo
3.1.1 Identificação de página
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
3.2.2 Parâmetros de solicitação
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
Entre no sistema BIOS na placa-mãe e ative as configurações de virtualização.