Commit 679952c7 authored by 罗林杰's avatar 罗林杰

Merge remote-tracking branch 'origin/master'

parents 98929816 70288619
...@@ -152,6 +152,12 @@ ...@@ -152,6 +152,12 @@
<version>4.2</version> <version>4.2</version>
</dependency> </dependency>
<dependency>
<groupId>com.drewnoakes</groupId>
<artifactId>metadata-extractor</artifactId>
<version>2.14.0</version>
</dependency>
</dependencies> </dependencies>
......
...@@ -4,6 +4,9 @@ package org.rcisoft.app.appMemInfo.controller; ...@@ -4,6 +4,9 @@ package org.rcisoft.app.appMemInfo.controller;
/*固定导入*/ /*固定导入*/
import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.metadata.IPage;
import com.drew.imaging.ImageMetadataReader;
import com.drew.metadata.Metadata;
import com.drew.metadata.exif.ExifIFD0Directory;
import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.Parameters; import io.swagger.v3.oas.annotations.Parameters;
...@@ -36,6 +39,7 @@ import org.springframework.web.multipart.MultipartFile; ...@@ -36,6 +39,7 @@ import org.springframework.web.multipart.MultipartFile;
import javax.imageio.ImageIO; import javax.imageio.ImageIO;
import javax.validation.Valid; import javax.validation.Valid;
import java.awt.*;
import java.awt.image.BufferedImage; import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream; import java.io.ByteArrayOutputStream;
import java.io.IOException; import java.io.IOException;
...@@ -136,24 +140,28 @@ public class AppMemInfoController extends CyPaginationController<MemInfo> { ...@@ -136,24 +140,28 @@ public class AppMemInfoController extends CyPaginationController<MemInfo> {
cyFileStorageService.filePath(file, temp, bucket)); cyFileStorageService.filePath(file, temp, bucket));
} }
//图片压缩
private static MultipartFile compressImage(MultipartFile file) { private static MultipartFile compressImage(MultipartFile file) {
BufferedImage image = null; BufferedImage image = null;
try { try {
image = ImageIO.read(file.getInputStream()); image = ImageIO.read(file.getInputStream());
// 设置压缩质量 // 获取图像的方向信息并进行旋转调整
float quality = 1.0f; image = fixImageOrientation(file, image);
// // 设置压缩质量
// float quality = 1.0f;
// 调整图片尺寸,设置目标宽度和高度 // 调整图片尺寸,设置目标宽度和高度
int targetWidth = 800; // 目标宽度(可以根据需求调整) int targetWidth = 800; // 目标宽度(可以根据需求调整)
int targetHeight = 600; // 目标高度(可以根据需求调整) int targetHeight = 600; // 目标高度(可以根据需求调整)
// 使用Imgscalr进行图像压缩(缩放) // 使用Imgscalr进行图像压缩(缩放)
BufferedImage compressedImage = Scalr.resize(image, Scalr.Method.QUALITY, targetWidth, targetHeight); // BufferedImage compressedImage = Scalr.resize(image,Scalr.Method.QUALITY, Scalr.Mode.AUTOMATIC,500);
// 将BufferedImage写入ByteArrayOutputStream // 将BufferedImage写入ByteArrayOutputStream
ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
String originalFilename = file.getOriginalFilename(); String originalFilename = file.getOriginalFilename();
String extension = originalFilename.substring(originalFilename.lastIndexOf('.') + 1).toLowerCase(); String extension = originalFilename.substring(originalFilename.lastIndexOf('.') + 1).toLowerCase();
ImageIO.write(compressedImage, extension, outputStream); // 假设原始图片格式为jpg ImageIO.write(image, extension, outputStream); // 假设原始图片格式为jpg
// 将压缩后的图片数据转换为byte数组 // 将压缩后的图片数据转换为byte数组
byte[] compressedImageData = outputStream.toByteArray(); byte[] compressedImageData = outputStream.toByteArray();
...@@ -167,4 +175,72 @@ public class AppMemInfoController extends CyPaginationController<MemInfo> { ...@@ -167,4 +175,72 @@ public class AppMemInfoController extends CyPaginationController<MemInfo> {
return file; return file;
} }
/**
* 获取图像的 EXIF 方向标签
*/
private static int getExifOrientation(MultipartFile file) {
try {
Metadata metadata = ImageMetadataReader.readMetadata(file.getInputStream());
ExifIFD0Directory directory = metadata.getFirstDirectoryOfType(ExifIFD0Directory.class);
if (directory != null) {
Integer orientationTag = directory.getInteger(ExifIFD0Directory.TAG_ORIENTATION);
if (orientationTag != null) {
return orientationTag;
}
}
} catch (Exception e) {
e.printStackTrace();
}
return 1; // 默认方向,无旋转
}
/**
* 旋转图像
*/
private static BufferedImage rotateImage(BufferedImage image, int angle) {
int width = image.getWidth();
int height = image.getHeight();
// 计算旋转后的新宽高
double radians = Math.toRadians(angle);
int newWidth = (int) Math.abs(width * Math.cos(radians)) + (int) Math.abs(height * Math.sin(radians));
int newHeight = (int) Math.abs(height * Math.cos(radians)) + (int) Math.abs(width * Math.sin(radians));
// 创建一个新的图像,背景色为白色或透明
BufferedImage rotatedImage = new BufferedImage(newWidth, newHeight, image.getType());
Graphics2D g2d = rotatedImage.createGraphics();
// g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
// g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BICUBIC);
//
// // 设置旋转中心
g2d.translate((newWidth - width) / 2, (newHeight - height) / 2); // 居中
// g2d.rotate(radians, width / 2, height / 2); // 旋转
g2d.rotate(radians, width / 2, height / 2);
// 绘制原图像
g2d.drawImage(image, 0, 0, null);
g2d.dispose();
return rotatedImage;
}
/**
* 根据 EXIF 信息修正图像方向
*/
private static BufferedImage fixImageOrientation(MultipartFile file, BufferedImage image) throws IOException {
int orientation = getExifOrientation(file);
switch (orientation) {
case 3:
return rotateImage(image, 180);
case 6:
return rotateImage(image, 90);
case 8:
return rotateImage(image, 270);
default:
return image; // 无需旋转
}
}
} }
package org.rcisoft.app.login.cons;
/**
* Created with family.
* author: cy
* Date: 2021/5/10
* Time: 4:15 PM
* description:
*/
public class WxMiniCons {
// 微信获取 openid
public static final String LOGIN_URL = "https://api.weixin.qq.com/sns/jscode2session?appid=%s&secret=%s&js_code=%s&grant_type=authorization_code";
// map - code码
public static final String CODE = "code";
// map - user对象
public static final String DATA = "data";
// map - token
public static final String TOKEN = "token";
// map - openId
public static final String OPEN_ID = "openId";
// 已登录,已授权 1
public static final Integer CODE_AUTHOR = 200;
// 已登录,未授权 0.5
public static final Integer CODE_LOGIN = 202;
// 异常 -1
public static final Integer CODE_ERROR = 500;
// 未登录 0
public static final Integer CODE_UNLOGIN = 204;
//微信接口
public static final String OPEN_ID_STR = "openid";
public static final String SESSION_KEY_STR = "session_key";
//redis openid
public static final String REDIS_OPENID_STR = "users:sk:";
// 解密phone str
public static final String PHONE_STR = "phoneNumber";
//操作提示
public static final String OPE_PHONE_ERROR = "获取手机号错误,请稍后重试";
public static final String OPE_PHONE_EXIST = "您的手机号被占用,请联系客服";
public static final String OPE_PHONE_NOT_EXIST = "您的手机号,系统不存在,请联系客服";
public static final String OPE_PROFILE_NOT_LOGIN = "用户未登录,请先登录";
}
package org.rcisoft.app.login.controller;
import jakarta.servlet.http.HttpServletRequest;
import lombok.extern.slf4j.Slf4j;
import org.rcisoft.app.login.service.WxMiniService;
import org.rcisoft.core.jwt.util.CyJwtUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.Map;
/**
* @author cy
* Created by cy on 21/5/10.
* @descript
*/
@RestController
@RequestMapping("/app/wxMiniApp")
@Slf4j
public class WxMiniAppController {
@Autowired
private WxMiniService wxMiniServiceImpl;
@Autowired
private CyJwtUtil cyJwtUtil;
/**
* wx login 第一步
* 1. 小程序刚进入的时候,可能会有token
* 2. 手机号登录,之前调用的
*
* @param code code
* @return
*/
@GetMapping("/validLogin")
public Map<String, Object> validLogin(@RequestParam("code") String code, HttpServletRequest request) {
// 1. 已经登录 ----> 延长登录过期时间 30分钟,返回token 和 基本信息(身份)
return wxMiniServiceImpl.validLogin(code, cyJwtUtil.getToken(request));
}
/**
* 手机号登录 第二步
*
* @return
*/
@GetMapping("/phoneLogin")
public Map<String, Object> phoneLogin(@RequestParam("encryptedData") String encryptedData,
@RequestParam("iv") String iv,
@RequestParam("openId") String openId) {
return wxMiniServiceImpl.phoneLogin(encryptedData, iv, openId);
}
/**
* 保存授权信息 第三步
*
* @return
*/
@PostMapping("/saveUserProfile")
public Map<String, Object> saveUserProfile(HttpServletRequest request,
@RequestParam("nickName") String nickName,
@RequestParam("avatarUrl") String avatarUrl,
@RequestParam("gender") String gender,
@RequestParam("address") String address) {
return wxMiniServiceImpl.saveUserProfile(nickName, avatarUrl, gender, address, cyJwtUtil.getToken(request));
}
}
package org.rcisoft.app.login.service;
import java.util.Map;
/**
* Created with family.
* author: cy
* Date: 2021/5/10
* Time: 3:41 PM
* description:
*/
public interface WxMiniService {
/**
* 验证登录
*
* @param code
* @return
*/
Map<String, Object> validLogin(String code, String token);
/**
* 手机登录
*
* @param encryptedData
* @param iv
* @param openId
* @return
*/
Map<String, Object> phoneLogin(String encryptedData, String iv, String openId);
/**
* 保存profile
*
* @param nickName
* @param avatarUrl
* @param gender
* @param address
* @return
*/
Map<String, Object> saveUserProfile(String nickName, String avatarUrl, String gender, String address, String token);
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment