1. 實作商品上下架操作
1.1 頁面分析
說明:將狀態碼利用RestFul的風格實作動態傳參.
下架操作: http://localhost:8091/item/updateStatus/2 status=2
上架操作: http://localhost:8091/item/1 status=1

1.2 編輯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 編輯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 編輯ItemMapper

編輯Mapper映射檔案

2.實作商品詳情展現
2.1 業務說明
一般用戶查詢商品時,只需要展現商品相關資訊即可,如果用戶點擊某個商品時才會展現商品詳情資訊,因為商品詳情是大欄位資訊,所以檢索相對較慢,浪費性能.
表設計說明:
1.tb_item 商品表
2.tb_item_desc 商品詳情表
一個商品只有一個詳情資訊,所以item表與itemDesc一對一.
2.2 商品詳情表設計

2.3 編輯ItemDesc

2.4 富文本編輯器介紹
2.4.1 入門案例

2.5 重構商品新增
2.5.1 業務說明
由于商品新增是將Item/ItemDesc物件一起新增,所以需要完成2張表的入庫操作.
2.5.2 編輯ItemController

2.5.3 編輯ItemService

2.6 商品詳情展現
2.6.1 頁面分析

2.6.2 頁面JS分析

2.6.3 編輯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 編輯ItemService
@Override
public ItemDesc findItemDescById(Long itemId) {
return itemDescMapper.selectById(itemId);
}
2.6.5 頁面效果展現

2.7 重構商品更新
2.7.1 業務說明
當用戶點擊商品更新時,應該實作2張表的資料更新操作. 更新Item/更新ItemDesc物件
2.7.2 編輯ItemController

2.7.3 編輯ItemService

2.8 商品洗掉操作
編輯ItemService 實作商品詳情洗掉操作

3 檔案上傳
3.1 檔案上傳入門案例
3.1.1 頁面標識

3.1.2 檔案上傳入門案例
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 檔案上傳業務
3.2.1 頁面URL分析

3.2.2 請求引數

3.2.3 編輯VO物件
{“error”:0,“url”:“圖片的保存路徑”,“width”:圖片的寬度,“height”:圖片的高度}
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 編輯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 編輯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(); //報錯回傳
}
}
}
作業
1.了解什么是反向代理/正向代理
2.磁盤地址能否優化 解耦
3.安裝虛擬機/運行作業系統

在主板中 進入BIOS系統 開啟虛擬化設定即可.

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/229167.html
標籤:java
