上传图片接口

pull/1/head
xiaoning 3 weeks ago
parent 02be470cd3
commit 47f964b366

@ -3,13 +3,13 @@
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 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"> 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> <modelVersion>4.0.0</modelVersion>
<groupId>com.ruoyi</groupId> <groupId>com.ruoyi</groupId>
<artifactId>ruoyi</artifactId> <artifactId>ruoyi</artifactId>
<version>3.7.0</version> <version>3.7.0</version>
<name>ruoyi</name> <name>ruoyi</name>
<properties> <properties>
<ruoyi.version>3.7.0</ruoyi.version> <ruoyi.version>3.7.0</ruoyi.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
@ -36,7 +36,7 @@
<!-- SMS 配置 --> <!-- SMS 配置 -->
<aliyun.sms.version>2.0.23</aliyun.sms.version> <aliyun.sms.version>2.0.23</aliyun.sms.version>
</properties> </properties>
<!-- 依赖声明 --> <!-- 依赖声明 -->
<dependencyManagement> <dependencyManagement>
<dependencies> <dependencies>
@ -268,6 +268,25 @@
<artifactId>mybatis-plus-boot-starter</artifactId> <artifactId>mybatis-plus-boot-starter</artifactId>
<version>${mybatis.plus.version}</version> <version>${mybatis.plus.version}</version>
</dependency> </dependency>
<!-- 文件系统minio -->
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
<version>4.8.1</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>io.minio</groupId>
<artifactId>minio</artifactId>
<version>8.2.1</version>
</dependency>
<!--thumbnailator图片处理-->
<dependency>
<groupId>net.coobird</groupId>
<artifactId>thumbnailator</artifactId>
<version>0.4.8</version>
</dependency>
</dependencies> </dependencies>
<build> <build>

@ -1,10 +1,8 @@
package com.ruoyi; package com.ruoyi;
import com.cyl.wechat.WechatPayData;
import org.springframework.boot.SpringApplication; import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.scheduling.annotation.EnableScheduling; import org.springframework.scheduling.annotation.EnableScheduling;
/** /**
@ -14,9 +12,8 @@ import org.springframework.scheduling.annotation.EnableScheduling;
*/ */
@SpringBootApplication( @SpringBootApplication(
exclude = {DataSourceAutoConfiguration.class}, exclude = {DataSourceAutoConfiguration.class},
scanBasePackages = {"com.ruoyi", "com.cyl"} scanBasePackages = {"com.ruoyi"}
) )
@EnableConfigurationProperties(WechatPayData.class)
@EnableScheduling @EnableScheduling
public class RuoYiApplication { public class RuoYiApplication {
public static void main(String[] args) { public static void main(String[] args) {

@ -1,183 +1,52 @@
package com.ruoyi.web.controller.common; package com.ruoyi.web.controller.common;
import com.alibaba.fastjson.JSON; import com.ruoyi.common.core.domain.RestResponse;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.ruoyi.system.service.FileService;
import com.cyl.manager.ums.domain.entity.Address; import io.swagger.v3.oas.annotations.Operation;
import com.cyl.manager.ums.mapper.AddressMapper; import io.swagger.v3.oas.annotations.tags.Tag;
import com.cyl.manager.ums.domain.dto.AddressDTO; import lombok.RequiredArgsConstructor;
import com.ruoyi.common.config.RuoYiConfig; import lombok.extern.slf4j.Slf4j;
import com.ruoyi.common.constant.Constants;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.redis.RedisService;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.file.FileUploadUtils;
import com.ruoyi.common.utils.file.FileUtils;
import com.ruoyi.common.utils.file.MimeTypeUtils;
import com.ruoyi.framework.config.ServerConfig;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.*;
import java.util.stream.Collectors;
/** /**
* *
* *
* @author ruoyi * @author ruoyi
*/ */
@Slf4j
@RestController @RestController
@Tag(name = "文件上传")
@RequiredArgsConstructor
@RequestMapping("/com")
public class CommonController public class CommonController
{ {
private static final Logger log = LoggerFactory.getLogger(CommonController.class);
@Autowired
private ServerConfig serverConfig;
@Autowired
private RedisService redisService;
@Autowired
private AddressMapper addressMapper;
/** private final FileService fileService;
*
*
* @param fileName
* @param delete
*/
@GetMapping("common/download")
public void fileDownload(String fileName, Boolean delete, HttpServletResponse response, HttpServletRequest request)
{
try
{
if (!FileUtils.checkAllowDownload(fileName))
{
throw new Exception(StringUtils.format("文件名称({})非法,不允许下载。 ", fileName));
}
String realFileName = System.currentTimeMillis() + fileName.substring(fileName.indexOf("_") + 1);
String filePath = RuoYiConfig.getDownloadPath() + fileName;
response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE); @Operation(summary = "上传课程相关图片", description = "上传图片,上传后返回原图和缩略图的url")
FileUtils.setAttachmentResponseHeader(response, realFileName); @PostMapping("/courseImage/upload")
FileUtils.writeBytes(filePath, response.getOutputStream()); public RestResponse uploadCourseImage(@RequestParam("file") MultipartFile file) {
if (delete) return new RestResponse().setData(fileService.uploadCourseImage(file));
{
FileUtils.deleteFile(filePath);
}
}
catch (Exception e)
{
log.error("下载文件失败", e);
}
} }
/** @Operation(summary = "上传商城相关图片", description = "上传图片,上传后返回原图和缩略图的url")
* @PostMapping("/productImage/upload")
*/ public RestResponse uploadProductImage(@RequestParam("file") MultipartFile file) {
@PostMapping("/common/upload") return new RestResponse().setData(fileService.uploadProductImage(file));
public AjaxResult uploadFile(MultipartFile file) throws Exception
{
try
{
// 上传文件路径
String filePath = RuoYiConfig.getUploadPath();
// 上传并返回新文件名称
String fileName = FileUploadUtils.upload(filePath, file, MimeTypeUtils.isImg(file.getContentType()));
String url = serverConfig.getUrl() + fileName;
AjaxResult ajax = AjaxResult.success();
ajax.put("fileName", fileName);
ajax.put("url", url);
return ajax;
}
catch (Exception e)
{
return AjaxResult.error(e.getMessage());
}
} }
/** @Operation(summary = "上传文件", description = "上传文件上传后返回文件url")
* @PostMapping("/file/upload")
*/ public RestResponse uploadFile(@RequestParam("file") MultipartFile file) {
@GetMapping("/common/download/resource") return new RestResponse().setData(fileService.uploadFile(file));
public void resourceDownload(String resource, HttpServletRequest request, HttpServletResponse response)
throws Exception
{
try
{
if (!FileUtils.checkAllowDownload(resource))
{
throw new Exception(StringUtils.format("资源文件({})非法,不允许下载。 ", resource));
}
// 本地资源路径
String localPath = RuoYiConfig.getProfile();
// 数据库资源地址
String downloadPath = localPath + StringUtils.substringAfter(resource, Constants.RESOURCE_PREFIX);
// 下载名称
String downloadName = StringUtils.substringAfterLast(downloadPath, "/");
response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE);
FileUtils.setAttachmentResponseHeader(response, downloadName);
FileUtils.writeBytes(downloadPath, response.getOutputStream());
}
catch (Exception e)
{
log.error("下载文件失败", e);
}
} }
@GetMapping("/common/area")
public AjaxResult getAddressList() {
String addresses = redisService.getAddressList();
if (org.apache.commons.lang3.StringUtils.isNotEmpty(addresses)) {
List<AddressDTO> addressDTOList = JSON.parseArray(addresses, AddressDTO.class);
if(addressDTOList.size()>0){
return AjaxResult.success(addressDTOList);
}
}
QueryWrapper<Address> addressQueryWrapper = new QueryWrapper<>();
addressQueryWrapper.in("level", Arrays.asList(0,1,2));
List<Address> addressList = addressMapper.selectList(addressQueryWrapper);
Map<Long, List<Address>> cityMap = addressList.stream().filter(it -> it.getLevel() == 1).collect(Collectors.groupingBy(it -> it.getParentCode()));
Map<Long, List<Address>> districtMap = addressList.stream().filter(it -> it.getLevel() == 2).collect(Collectors.groupingBy(it -> it.getParentCode()));
List<AddressDTO> result = new ArrayList<>();
addressList.stream().filter(it -> it.getLevel() == 0).forEach(it -> {
AddressDTO dto = new AddressDTO();
dto.setId(it.getCode());
dto.setLevel("province");
dto.setName(it.getName());
dto.setPid(0L);
//获取城市列表
List<AddressDTO> child = new ArrayList<>();
if (cityMap.containsKey(it.getCode())) {
cityMap.get(it.getCode()).forEach(city -> {
AddressDTO cityDto = new AddressDTO();
cityDto.setId(city.getCode());
cityDto.setLevel("city");
cityDto.setName(city.getName());
cityDto.setPid(city.getParentCode());
cityDto.setChildren(districtMap.containsKey(city.getCode()) ?
districtMap.get(city.getCode()).stream().map(district -> {
AddressDTO districtDto = new AddressDTO();
districtDto.setId(district.getCode());
districtDto.setLevel("district");
districtDto.setName(district.getName());
districtDto.setPid(district.getParentCode());
return districtDto;
}).collect(Collectors.toList()) : Collections.EMPTY_LIST);
child.add(cityDto);
});
}
dto.setChildren(child);
result.add(dto);
});
redisService.setAddressList(JSON.toJSONString(result));
return AjaxResult.success(result);
}
} }

@ -1,43 +0,0 @@
package com.ruoyi.web.controller.common;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.utils.OssUtils;
import io.swagger.annotations.Api;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import java.util.List;
@RestController
@Api(tags = "OSS对象存储Controller")
@RequestMapping("/oss")
public class OssController {
@Autowired
OssUtils ossUtils;
@PostMapping("upload")
public AjaxResult uploadFile(MultipartFile file) {
//返回上传oss的url
String url = ossUtils.uploadOneFile(file);
AjaxResult ajax = AjaxResult.success();
ajax.put("fileName", file.getOriginalFilename());
ajax.put("url", url);
return ajax;
}
@PostMapping("uploadArrayFile")
public List<String> uploadArrayFile(MultipartFile[] files) {
//返回上传oss的url
return ossUtils.uploadArrayFile(files);
}
@PostMapping("deleteFile")
public boolean deleteFile(@RequestBody String fileUrl) {
//返回是否删除成功
return ossUtils.deleteFile(fileUrl);
}
}

@ -1,69 +0,0 @@
package com.ruoyi.web.core.config;
import com.cyl.manager.ums.domain.entity.Member;
import com.cyl.manager.ums.service.MemberService;
import com.ruoyi.common.constant.Constants;
import com.ruoyi.common.constant.HttpStatus;
import com.ruoyi.common.core.domain.model.LoginMember;
import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.framework.config.LocalDataUtil;
import com.ruoyi.framework.web.service.TokenService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@Configuration
public class H5MemberInterceptor extends HandlerInterceptorAdapter {
@Autowired
private TokenService tokenService;
@Autowired
private MemberService memberService;
private static String[] WHITE_PATHS = {
"/h5/sms/login",
"/h5/wechat/login",
"/h5/account/login",
"/h5/register",
"/h5/validate"
};
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
String requestUri = request.getRequestURI();
boolean flag = true;
if (!requestUri.startsWith("/h5/")) {
return super.preHandle(request, response, handler);
}
for (String s : WHITE_PATHS) {
if (requestUri.startsWith(s)) {
flag = false;
break;
}
}
if (!flag) {
return super.preHandle(request, response, handler);
}
LoginMember loginMember = tokenService.getLoginMember(request);
if (loginMember == null) {
throw new ServiceException("获取用户ID异常", HttpStatus.UNAUTHORIZED);
}
tokenService.verifyMemberToken(loginMember);
//获取会员信息
Member member = memberService.selectById(loginMember.getMemberId());
if (member == null || member.getStatus() == 0) {
throw new ServiceException("获取用户ID异常", HttpStatus.UNAUTHORIZED);
}
//将会员信息存放至全局
LocalDataUtil.setVar(Constants.MEMBER_INFO, member);
return super.preHandle(request, response, handler);
}
}

@ -1,23 +0,0 @@
package com.ruoyi.web.core.config;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
@Configuration
@Slf4j
public class MvcConfig extends WebMvcConfigurerAdapter {
@Bean
public H5MemberInterceptor memberInterceptor() {
return new H5MemberInterceptor();
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(memberInterceptor());
}
}

@ -6,9 +6,9 @@ spring:
druid: druid:
# 主库数据源 # 主库数据源
master: master:
url: jdbc:mysql://localhost:3306/ry?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&rewriteBatchedStatements=true url: jdbc:mysql://localhost:3306/yj?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&rewriteBatchedStatements=true
username: root username: root
password: password password: 123456
# 从库数据源 # 从库数据源
slave: slave:
# 从数据源开关/默认关闭 # 从数据源开关/默认关闭
@ -23,46 +23,24 @@ spring:
# redis 配置 # redis 配置
redis: redis:
# 地址 # 地址
host: host: localhost
# 端口默认为6379 # 端口默认为6379
port: port: 6379
# 数据库索引 # 数据库索引
database: database: 0
# 密码 # 密码
password: password:
ruoyi:
# 文件路径 示例( Windows配置C:/ruoyi/uploadPathLinux配置 /home/ruoyi/uploadPath
profile: C:/ruoyi/uploadPath
scheduling: scheduling:
enabled: false enabled: false
#操作oss需要的一些参数
aliyun: minio:
accessKeyId: 你的accessKeyId # 阿里云的accessKeyId endpoint: http://62.234.183.14:9000
secretAccessKey: 你的accessKey密码 # accessKey 密码 accessKey: IvostdowO3hTkXuaa392
oss: secretKey: wZCLColkVlNMYrxczzdvEC2VyK3lLh5DCb8yrFhE
endPoint: 你的endpoint # Endpoint:在阿里云oss控制台查看自己使用的endpoint bucketName: yoga-mall
bucketName: 你的bucketName # bucket 名称 productImagePath: mall-product-image
wechat: courseImagePath: mall-course-image
enabled: false filePath: file
appId: 你的微信服务号信息h5的时候需要小程序的时候不需要 videoPath: video
secret: 你的微信服务号信息h5的时候需要小程序的时候不需要 expireIn: 180 # 文件过期时间,单位:天
merchantId: 微信支付商户号
privateKeyPath: 微信支付密钥地址相对地址
merchantSerialNumber: 微信支付密钥对应的序列号
apiV3key: 微信支付apiV3key
notifyUrl: 微信支付回调地址
miniProgramAppId: 小程序apppidh5的时候不需要
miniProgramSecret: 小程序Secreth5的时候不需要
sms:
enabled: true
# 阿里云 dysmsapi.aliyuncs.com
endpoint: dysmsapi.aliyuncs.com
accessKeyId: 你的accessKeyId #阿里云短信服务控制台查看
accessKeySecret: 你的accessKeySecret #同上
signName: 签名
templateId: 模板id
# 腾讯专用
sdkAppId:
aes:
# aes的密钥(长度只能是16或24或32位)
key: 1111111111111111

@ -9,7 +9,7 @@ ruoyi:
# 实例演示开关 # 实例演示开关
demoEnabled: true demoEnabled: true
# 文件路径 示例( Windows配置D:/ruoyi/uploadPathLinux配置 /home/ruoyi/uploadPath # 文件路径 示例( Windows配置D:/ruoyi/uploadPathLinux配置 /home/ruoyi/uploadPath
profile: C:/ruoyi/uploadPath profile: /workspace/project/yoga/uploadPath
# 获取ip地址开关 # 获取ip地址开关
addressEnabled: true addressEnabled: true
# 验证码类型 math 数组计算 char 字符验证 # 验证码类型 math 数组计算 char 字符验证
@ -44,7 +44,7 @@ spring:
messages: messages:
# 国际化资源文件路径 # 国际化资源文件路径
basename: i18n/messages basename: i18n/messages
profiles: profiles:
active: druid active: druid
# 文件上传 # 文件上传
servlet: servlet:
@ -118,7 +118,7 @@ token:
# 令牌自定义标识 # 令牌自定义标识
header: Authorization header: Authorization
# 令牌密钥 # 令牌密钥
secret: abcdefghijkomnopqrstuvwxyx secret: 4b5c4d8cc1a5d54afac74291c8f43dc6
# 令牌有效期默认30分钟 # 令牌有效期默认30分钟
expireTime: 30 expireTime: 30
memberExpireTime: 30 memberExpireTime: 30
@ -137,7 +137,7 @@ mybatis-plus:
pagehelper: pagehelper:
helperDialect: mysql helperDialect: mysql
supportMethodsArguments: true supportMethodsArguments: true
params: count=countSql params: count=countSql
# Swagger配置 # Swagger配置
swagger: swagger:
@ -147,7 +147,7 @@ swagger:
pathMapping: /dev-api pathMapping: /dev-api
# 防止XSS攻击 # 防止XSS攻击
xss: xss:
# 过滤开关 # 过滤开关
enabled: true enabled: true
# 排除链接(多个用逗号分隔) # 排除链接(多个用逗号分隔)

@ -1,123 +0,0 @@
package com.fjp.lc.test.common;
import cn.hutool.core.img.Img;
import cn.hutool.core.img.ImgUtil;
import cn.hutool.core.io.FileUtil;
import com.alibaba.fastjson.JSON;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.codec.digest.DigestUtils;
import org.junit.Test;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.web.client.RestTemplate;
import java.io.File;
import java.io.IOException;
import java.security.NoSuchAlgorithmException;
import java.time.Instant;
import java.util.HashMap;
import java.util.Map;
@Slf4j
public class CommonTest {
/* @Test
public void test3() throws IOException {
Long start = System.currentTimeMillis();
log.info("start {}", start);
Thumbnails.of("D:/build/tt.jpg")
.scale(1f)
.outputQuality(0.5f)
.toFile("D:/build/tt1.jpg");
log.info("end {}", System.currentTimeMillis() - start);
}*/
@Test
public void testEquals(){
Integer num1 = 100;
Integer num2 = 100;
System.out.println(num1 == num2); // true因为对于 Integer 类型,-128 到 127 之间的值会被缓存
System.out.println(num1.equals(num2)); // true因为它们的值相同
Integer num3 = 200;
Integer num4 = 200;
System.out.println(num3 == num4); // false因为超出了缓存范围会创建新的对象实例
System.out.println(num3.equals(num4)); // true因为它们的值相同
}
@Test
public void test4() throws IOException {
String f1 = "D:/build/tt.jpg";
String f2 = "D:/build/tt2.jpg";
Long start = System.currentTimeMillis();
log.info("start {}", start);
ImgUtil.scale(new File(f1), new File(f2), .1f);
log.info("end {}", System.currentTimeMillis() - start);
}
@Test
public void test5() throws IOException {
String f1 = "D:/build/tt.jpg";
String f2 = "D:/build/tt3.jpg";
Long start = System.currentTimeMillis();
log.info("start {}", start);
Img.from(FileUtil.file(f1))
.setQuality(1)//压缩比率
.write(FileUtil.file(f2));
log.info("end {}", System.currentTimeMillis() - start);
}
@Test
public void testTimestampt(){
Instant tsObj = Instant.now();
long secs = tsObj.getEpochSecond();
System.out.println(secs);
}
@Test
public void test() throws NoSuchAlgorithmException {
RestTemplate restTemplate = new RestTemplate();
String url = "http://bmfw.www.gov.cn/bjww/interface/interfaceJson";
String key = "3C502C97ABDA40D0A60FBEE50FAAD1DA";
Long timestamp = Instant.now().getEpochSecond();
String token = "23y0ufFl5YxIyGrI8hWRUZmKkvtSjLQA";
String nonce ="123456789abcdefg";
String passid = "zdww";
String tempString = timestamp + token + nonce + timestamp;
String signatureHeader = DigestUtils.sha256Hex(tempString).toUpperCase();
System.out.println(signatureHeader);
tempString = timestamp + "fTN2pfuisxTavbTuYVSsNJHetwq5bJvC" + "QkjjtiLM2dCratiA" + timestamp;
String zdwwsignature = DigestUtils.sha256Hex(tempString).toUpperCase();
System.out.println(zdwwsignature);
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
headers.set("x-wif-nonce","QkjjtiLM2dCratiA");
headers.set("x-wif-paasid","smt-application");
headers.set("x-wif-signature",zdwwsignature);
headers.set("x-wif-timestamp",timestamp.toString());
headers.set("Origin","http://bmfw.www.gov.cn");
headers.set("Referer","http://bmfw.www.gov.cn/yqfxdjcx/risk.html");
Map<String,String> map = new HashMap<String,String>();
map.put("appId","NcApplication");
map.put("paasHeader",passid);
map.put("timestampHeader",timestamp.toString());
map.put("nonceHeader",nonce);
map.put("signatureHeader",signatureHeader);
map.put("key",key);
String json= JSON.toJSONString(map);
System.out.println(json);
HttpEntity<String> entity = new HttpEntity<String>(json,headers);
String ans = restTemplate.postForObject(url, entity, String.class);
System.out.println(ans);
}
}

@ -1,46 +0,0 @@
package com.fjp.lc.test.service;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.cyl.h5.controller.H5OrderController;
import com.cyl.h5.domain.form.ApplyRefundForm;
import com.cyl.manager.oms.domain.entity.Order;
import com.cyl.manager.oms.domain.entity.OrderItem;
import com.cyl.manager.oms.mapper.OrderMapper;
import com.cyl.manager.oms.service.OrderService;
import com.ruoyi.RuoYiApplication;
import lombok.extern.slf4j.Slf4j;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.ActiveProfiles;
import org.springframework.test.context.junit4.SpringRunner;
import java.math.BigDecimal;
@RunWith(SpringRunner.class)
@SpringBootTest(classes = RuoYiApplication.class)
@ActiveProfiles("dev")
@Slf4j
public class ControllerTest {
@Autowired
private H5OrderController h5OrderController;
@Autowired
private OrderMapper orderMapper;
@Test
public void test() {
ApplyRefundForm applyRefundForm = new ApplyRefundForm();
QueryWrapper<Order> queryWrapper = new QueryWrapper();
queryWrapper.eq("pay_id", 6226229322123265l);
Order order = orderMapper.selectOne(queryWrapper);
applyRefundForm.setOrderId(order.getId());
applyRefundForm.setApplyRefundType(1);
applyRefundForm.setReason("不要了");
applyRefundForm.setQuantity(1);
applyRefundForm.setRefundAmount(new BigDecimal(0.01));
h5OrderController.applyRefund(applyRefundForm);
}
}

@ -1,173 +0,0 @@
package com.fjp.lc.test.service;
import com.ruoyi.RuoYiApplication;
import com.ruoyi.common.utils.OssUtils;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.ActiveProfiles;
import org.springframework.test.context.junit4.SpringRunner;
@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.NONE, classes = RuoYiApplication.class)
@ActiveProfiles("dev")
public class OssTest {
@Autowired
private OssUtils ossUtils;
@Test
public void download() {
ossUtils.downloadFile("2022/12/306da8f7f6491046ba86633e4de8240b84微信图片_20220606114231.jpg");
ossUtils.downloadFile("2022/12/29543652b023af4caeb5d9d74c2f98bdfb微信图片_20220606114231.jpg");
ossUtils.downloadFile("2022/12/30237d83af8f8e494f98caff9ac87d8eed微信图片_20220801215429.png");
ossUtils.downloadFile("2023/03/119682c2bb40d54639b51f9819cb127f44400x400.png");
ossUtils.downloadFile("2023/03/11a67b86d4dd6b4fc687f9044155c34083400x400blue.png");
ossUtils.downloadFile("2023/07/26975a5546e4e14baca40ffde696ee3ffb微信图片_202304151221202.jpg");
ossUtils.downloadFile("2023/07/26e89dd1d370b74598aba6dd7cced81f72微信图片_20230415121747.jpg");
ossUtils.downloadFile("2023/07/2625f4fc4576974035990f35ffae4cbe89微信图片_202305311200104.jpg");
ossUtils.downloadFile("2023/07/269436b74dd01f45a09e0d63c02bc2bc20微信图片_202207241638361.jpg");
ossUtils.downloadFile("2023/07/2609fb7c7b52f04b29893fb7034d5488eb微信图片_20220822144529.jpg");
ossUtils.downloadFile("2023/07/26561982918fbd4269abc1a87ea7c2f09b微信图片_20230518014301.jpg");
ossUtils.downloadFile("2023/05/26572ddcb26dd64ea9aef1615c518311f2main.jpg");
ossUtils.downloadFile("2023/07/26b0e6d79409c047afbf435c2e45b2864e微信图片_202305070430094.jpg");
ossUtils.downloadFile("2023/07/268673a92f29ea4ed9a3503587c658fb7d微信图片_20230304190516.jpg");
ossUtils.downloadFile("2023/08/14ff4bde97153a416e9cdde8035bc7e0f326db1efa38167a4cd5ab392cd7bb6b8fc9ed5b46ef3e460fe27f73aa280993004.jpg.png");
ossUtils.downloadFile("2023/07/269922ae58ef074304a907f6524d13401c微信图片_20220801215429.png");
ossUtils.downloadFile("2023/07/26ecce066aa266490b9462dd6326ad1718微信图片_20220801215429.png");
ossUtils.downloadFile("2023/07/26ecce066aa266490b9462dd6326ad1718微信图片_20220801215429.png");
ossUtils.downloadFile("2023/07/26ecce066aa266490b9462dd6326ad1718微信图片_20220801215429.png");
ossUtils.downloadFile("2023/07/26ecce066aa266490b9462dd6326ad1718微信图片_20220801215429.png");
ossUtils.downloadFile("2023/07/26ecce066aa266490b9462dd6326ad1718微信图片_20220801215429.png");
ossUtils.downloadFile("2023/07/26ecce066aa266490b9462dd6326ad1718微信图片_20220801215429.png");
ossUtils.downloadFile("2023/07/26ecce066aa266490b9462dd6326ad1718微信图片_20220801215429.png");
ossUtils.downloadFile("2023/12/03847a4833090f40de9c6b49f7d553608a微信图片_202303082336274.jpg");
ossUtils.downloadFile("2023/12/034459c85e71e3402aba5eb7e0531201fd微信图片_202303082336273.jpg");
ossUtils.downloadFile("2023/12/03d3e5fc569e7d42529c8a3b504ae4d92c微信图片_202303082336271.jpg");
ossUtils.downloadFile("2023/12/0383e8c4d2be284355a07233bc1c38e6d7微信图片_202303082336272.jpg");
ossUtils.downloadFile("2023/06/12539d8d04c72247c4bd4ac3820ae939a3227ddfae236d5a4adca97541f7937488dc033fc965331ca74b3a9d6daa9fd0e48225sy_content_good_stuff@2x.png");
ossUtils.downloadFile("2023/03/113d7ab00580e44f9ab2d274c0e3f9cd89400x400.png");
ossUtils.downloadFile("2023/03/11a1e8bc35653044d2a2012ef1a30dc5d9blue.png");
ossUtils.downloadFile("2023/03/11ca202adcbef54a97879e3b6ca9214729red.png");
ossUtils.downloadFile("2023/03/113be968d872ca4a0bb0d8fc08e13bb81fgrey.png");
ossUtils.downloadFile("2023/03/112f186945ad444e71a6fdaf5a634577d0yellow.png");
ossUtils.downloadFile("2023/03/11703d301ec87448a8ad8c754ca7c043e5blue.png");
ossUtils.downloadFile("2023/06/126850de7100594b2cbe67ba10ac30315e227ddfae236d5a4adca97541f7937488dc033fc965331ca74b3a9d6daa9fd0e48225sy_content_good_stuff@2x.png");
ossUtils.downloadFile("2023/06/1297a4dd69e5b14fe0bc8da968c0b2043f22dea3ccb9cd45412da6300c5ac7d8f68903bae3d53cef7f4dfeb38bbafe109a3755sy_content_digital@2x.png");
ossUtils.downloadFile("2023/06/1261979f808cb04d108727cf3709ffa355226569ab1688ec4eb8a7a2d879f3cd36b303df12b214f50f49928b53ad113e11170bsy_content_apparel@2x.png");
ossUtils.downloadFile("2023/06/123c2915e18c604f3290ff4876954f6aa32213fbf4b69d9041d68da50fdd71aa6b5403afbad6ea2bce46db8108e48eb2bed9d3sy_content_care@2x.png");
ossUtils.downloadFile("2023/06/12beec9af7400c44deb3951fa5be95b0ae22e0ce080252874dd4b22e7559ac1478bf036ce7046f48eb4faba7f43849d2d7814dsy_content_rice@2x.png");
ossUtils.downloadFile("2023/06/12cbeee94461d44d13bba3503682286e382231e1747caf7a4f9f9d54af5789d1d538033d7aaef21b2b4984abd8a07a2b97c49csy_content_drinks@2x.png");
ossUtils.downloadFile("2023/06/121dde34bbb8024ac99e09af20e380d78822b62a9a9f2e8349cc9e0321a53e27bf780322d4a84f6c334c7d984484f04e87dbb1sy_content_sports@2x.png");
ossUtils.downloadFile("2023/06/129a33a0881f4e4d279cc067e592b588612253d01aa5f365420e8b96cd93ee1893f6035a69224ec7904e2b94047f22ddfb5d19sy_content_other@2x.png");
ossUtils.downloadFile("2023/03/119682c2bb40d54639b51f9819cb127f44400x400.png");
ossUtils.downloadFile("2023/03/11a67b86d4dd6b4fc687f9044155c34083400x400blue.png");
ossUtils.downloadFile("2023/07/26975a5546e4e14baca40ffde696ee3ffb微信图片_202304151221202.jpg");
ossUtils.downloadFile("2023/07/26e89dd1d370b74598aba6dd7cced81f72微信图片_20230415121747.jpg");
ossUtils.downloadFile("2023/07/2625f4fc4576974035990f35ffae4cbe89微信图片_202305311200104.jpg");
ossUtils.downloadFile("2023/07/269436b74dd01f45a09e0d63c02bc2bc20微信图片_202207241638361.jpg");
ossUtils.downloadFile("2023/07/2609fb7c7b52f04b29893fb7034d5488eb微信图片_20220822144529.jpg");
ossUtils.downloadFile("2023/07/26561982918fbd4269abc1a87ea7c2f09b微信图片_20230518014301.jpg");
ossUtils.downloadFile("2023/05/26572ddcb26dd64ea9aef1615c518311f2main.jpg");
ossUtils.downloadFile("2023/07/26b0e6d79409c047afbf435c2e45b2864e微信图片_202305070430094.jpg");
ossUtils.downloadFile("2023/07/268673a92f29ea4ed9a3503587c658fb7d微信图片_20230304190516.jpg");
ossUtils.downloadFile("2023/08/14ff4bde97153a416e9cdde8035bc7e0f326db1efa38167a4cd5ab392cd7bb6b8fc9ed5b46ef3e460fe27f73aa280993004.jpg.png");
ossUtils.downloadFile("2023/07/269922ae58ef074304a907f6524d13401c微信图片_20220801215429.png");
ossUtils.downloadFile("2023/07/26ecce066aa266490b9462dd6326ad1718微信图片_20220801215429.png");
ossUtils.downloadFile("2023/07/264d37c9c96f464a3c9a25cca77312e2a6微信图片_20220801215429.png");
ossUtils.downloadFile("2023/07/263ab3be7a6bb24ad7b809f550e0948939微信图片_20220801215429.png");
ossUtils.downloadFile("2023/06/16f6c3727142d4486089a09dbd19762c39266fb233a90ba449bf9c082ebd592078dd1679204678mm5.jpg");
ossUtils.downloadFile("2023/06/1654b558f7bbc241a8aecd5f017227a3e4266fb233a90ba449bf9c082ebd592078dd1679204678mm5.jpg");
ossUtils.downloadFile("2023/06/1638b241a1b12d4a4ebf8c5eb08bc9986d266fb233a90ba449bf9c082ebd592078dd1679204678mm5.jpg");
ossUtils.downloadFile("2023/06/16da593a9165834cabb4ab5ed2ba580cbd266fb233a90ba449bf9c082ebd592078dd1679204678mm5.jpg");
ossUtils.downloadFile("2023/12/03847a4833090f40de9c6b49f7d553608a微信图片_202303082336274.jpg");
ossUtils.downloadFile("2023/12/034459c85e71e3402aba5eb7e0531201fd微信图片_202303082336273.jpg");
ossUtils.downloadFile("2023/12/03d3e5fc569e7d42529c8a3b504ae4d92c微信图片_202303082336271.jpg");
ossUtils.downloadFile("2023/12/0383e8c4d2be284355a07233bc1c38e6d7微信图片_202303082336272.jpg");
ossUtils.downloadFile("2023/08/148a3892f617f04af3ab2da2dbf50b2219269922ae58ef074304a907f6524d13401c微信图片_20220801215429.png.png");
ossUtils.downloadFile("2023/05/266fb233a90ba449bf9c082ebd592078dd1679204678mm5.jpg");
ossUtils.downloadFile("2023/05/2602dc3dc1e02f44289c89a5426b3922femain.jpg");
ossUtils.downloadFile("2023/05/2688e9a4a5a22847eda09c555a0f16f3a52222.png");
ossUtils.downloadFile("2023/07/26db1efa38167a4cd5ab392cd7bb6b8fc9ed5b46ef3e460fe27f73aa280993004.jpg");
ossUtils.downloadFile("2023/07/26079a8b93ec924d44b11915cc17dfd53e微信图片_20230415122120.jpg");
ossUtils.downloadFile("2023/07/267eaa27402fd44f2ea12801cd263b6a41微信图片_20230507043009.jpg");
ossUtils.downloadFile("2023/07/26d9a42d98a1a244d094b39516be0241c9微信图片_20230415121747.jpg");
ossUtils.downloadFile("2023/07/263c45b789fb254c2fbc6bb639357b3f5f微信图片_202305311200104.jpg");
ossUtils.downloadFile("2023/07/269436b74dd01f45a09e0d63c02bc2bc20微信图片_202207241638361.jpg");
ossUtils.downloadFile("2023/07/2609fb7c7b52f04b29893fb7034d5488eb微信图片_20220822144529.jpg");
ossUtils.downloadFile("2023/07/268673a92f29ea4ed9a3503587c658fb7d微信图片_20230304190516.jpg");
ossUtils.downloadFile("2023/07/26561982918fbd4269abc1a87ea7c2f09b微信图片_20230518014301.jpg");
ossUtils.downloadFile("2023/12/187be2528584434a488b4580c363bc559d作品.jpg");
ossUtils.downloadFile("2023/07/26f73d933b547a4574979ee7ae3ede47f4微信图片_202304151217474.jpg");
ossUtils.downloadFile("2023/05/26972c7a98b6df49dab1fe839232bff5c31679204678mm5.jpg");
ossUtils.downloadFile("2023/05/267c68f6226f2a443485699c8411e299d4main.jpg");
ossUtils.downloadFile("2023/05/26db36f518447d4df98957285931c83d7c1r.jpg");
ossUtils.downloadFile("2023/05/2629464fb14f79418985a99ba3238b8db624.jpg");
ossUtils.downloadFile("2023/05/267c89e30b8f8c45d58161a4e78800d4813.jpg");
ossUtils.downloadFile("2023/05/263a48cd980e5546f8b2db583f1753c6f64.jpg");
ossUtils.downloadFile("2023/05/263252d6187d1647c186b5c3e703615e352222.png");
ossUtils.downloadFile("2023/07/26fb45128fd4e44b049148db359ff53c01a82772585ab081455e14bbe92afbc64.jpg");
ossUtils.downloadFile("2023/07/2619a2b65b4ac54d10a8ccd1078d800a7bc46ad9eba9cd72a0995a1ea0c3f06dd.jpg");
ossUtils.downloadFile("2023/07/26d43585cc52dd43e7b33d29a8812bf766微信图片_202303292142191.jpg");
ossUtils.downloadFile("2023/07/2636761e811dfb4c1192cf3aeaf6c32a78微信图片_20230329214219.jpg");
ossUtils.downloadFile("2023/07/26af858c07e28044baabf4670f0a18d759微信图片_202303292142192.jpg");
ossUtils.downloadFile("2023/07/2681376357d7ae42a5b78f318c23d57e14微信图片_202304151221203.jpg");
ossUtils.downloadFile("2023/07/261e8252d98a2f46698ca78f15107cc49f微信图片_202304151221204.jpg");
ossUtils.downloadFile("2023/07/26abbd8208878349669e0fb7ea6df11350微信图片_202304151221201.jpg");
ossUtils.downloadFile("2023/07/267008c38e1fd54ea593693eed573963f7微信图片_20230415122120.jpg");
ossUtils.downloadFile("2023/07/2635b63ed15d1345d08e6a685701cc58f1微信图片_202304151221202.jpg");
ossUtils.downloadFile("2023/07/260c209bf387f6490db6505aee72e620f5微信图片_20230507043009.jpg");
ossUtils.downloadFile("2023/07/268dcb6126ad73407eabb54baa2fb0ec80微信图片_202305070430091.jpg");
ossUtils.downloadFile("2023/07/262df759a436784bc481080e25a2d9d708微信图片_202305070430092.jpg");
ossUtils.downloadFile("2023/07/26666593a296a64088af4eb0647a4e2f20微信图片_202305070430094.jpg");
ossUtils.downloadFile("2023/07/26e1c4d225037746bea54766d2d947aae2微信图片_202305070430093.jpg");
ossUtils.downloadFile("2023/07/265d82761866ec44a1891a03dc079951de微信图片_20230415121747.jpg");
ossUtils.downloadFile("2023/07/266b3a6d093bc344409937958a83422c4e微信图片_202304151217471.jpg");
ossUtils.downloadFile("2023/07/26c681b61d879d48a8a50f219bf0b45423微信图片_202304151217474.jpg");
ossUtils.downloadFile("2023/07/26c92bd48e55634ed18ce7a49f3488a5e5微信图片_202304151217472.jpg");
ossUtils.downloadFile("2023/07/26160d66ecfa6d4e4480936c0627ab6168微信图片_202304151217473.jpg");
ossUtils.downloadFile("2023/07/26e91ff64478f8405a817964730d35f645微信图片_20230531120010.jpg");
ossUtils.downloadFile("2023/07/262d7e659fc9044a35a00717d927eb6201微信图片_202305311200101.jpg");
ossUtils.downloadFile("2023/07/26b6d799a3e30e43c4900bd726f1d87c39微信图片_202305311200103.jpg");
ossUtils.downloadFile("2023/07/26555fabd98cdf46a58c391898c63f62f2微信图片_202305311200102.jpg");
ossUtils.downloadFile("2023/07/26f44d84cea13f4276b92c75d072aabeea微信图片_202305311200104.jpg");
ossUtils.downloadFile("2023/07/2627916262b7c442a08c04f1b3738a1ccc微信图片_20220724163836.jpg");
ossUtils.downloadFile("2023/07/26ef9876f509e14e0985fb045ea4f8d02f微信图片_202207241638361.jpg");
ossUtils.downloadFile("2023/07/26f2ac39fef9d7491a8a3908df9695ab51微信图片_202207241638362.jpg");
ossUtils.downloadFile("2023/07/2676b97cc6b45a43ba96756e9b21dcf2cb微信图片_202207241638363.jpg");
ossUtils.downloadFile("2023/07/263867f3bf67f248ce9c31fe0985f40523微信图片_202208221445291.jpg");
ossUtils.downloadFile("2023/07/26feafa3cc0e584620855759538098bc4f微信图片_202208221445292.jpg");
ossUtils.downloadFile("2023/07/268699fd3e13bb42c5a941784fe85ff366微信图片_202208221445294.jpg");
ossUtils.downloadFile("2023/07/26b717d87954914c60893fdff0bc6eb83d微信图片_202208221445293.jpg");
ossUtils.downloadFile("2023/07/267af6e46a2119467ab7baf569f57e0136微信图片_202303041905163.jpg");
ossUtils.downloadFile("2023/07/26386743e26a594bdcaaf4d481d5d34b0a微信图片_202303041905164.jpg");
ossUtils.downloadFile("2023/07/26e258e26755474d12967277e16281c0f6微信图片_202303041905165.jpg");
ossUtils.downloadFile("2023/07/267a9d29bb17a3403e84edc968fb2a5133微信图片_202305180143012.jpg");
ossUtils.downloadFile("2023/07/26a1f38481c8784e2782f1857b35dfacc1微信图片_202305180143014.jpg");
ossUtils.downloadFile("2023/07/267bc956e7bb97441e98af9d07aee71f1c微信图片_202305180143013.jpg");
ossUtils.downloadFile("2023/07/26ee7b2f3365a848c6a952a7b9c4582023微信图片_2022080121");
ossUtils.downloadFile("2023/05/268ee9e13df1fb499697550eec576b08af1.png");
ossUtils.downloadFile("2023/05/26795e6f86285a4cc99c21d79f3ad06e1e2.jpg");
ossUtils.downloadFile("2023/05/26772b2920bfd04a1faf85fe6a9ff5bb953.jpg");
ossUtils.downloadFile("2023/05/2600944930702a442583d92c3bd6ba6af94.jpg");
ossUtils.downloadFile("2023/05/26b6ba13ad4ade4ba881466c58cb21bfd8main.jpg");
ossUtils.downloadFile("2023/05/262961530966aa48c5a5f13860b446a0df24.jpg");
ossUtils.downloadFile("2023/05/26d678b548b96b437cb1ca4402771525c23.jpg");
ossUtils.downloadFile("2023/05/264d31c21f18924e02bd386dd7be61809e4.jpg");
ossUtils.downloadFile("2023/05/26ba2304c124294ff6b47e3b7bb9faa900a.jpg");
ossUtils.downloadFile("2023/05/26dcc01da95cb7466095ee4be3e8e57943b.jpg");
ossUtils.downloadFile("2023/05/266a1c5e16e05b45cfbe152af9ca558b70c.png");
ossUtils.downloadFile("2023/07/2665647ec5442d4e72960fa1772b5a2befa82772585ab081455e14bbe92afbc64.jpg");
ossUtils.downloadFile("2023/07/26759113e01b5f4230be78447d733de531微信图片_202304151221205.jpg");
ossUtils.downloadFile("2023/07/264e6e7ee82cb144b498757c8c2b65bf83微信图片_20230507043009.jpg");
ossUtils.downloadFile("2023/07/26898650b538c34de399e831417c4bb69a微信图片_202304151217474.jpg");
ossUtils.downloadFile("2023/07/269e8efd18c2784fe29898d8f0885cc688微信图片_202305311200101.jpg");
ossUtils.downloadFile("2023/07/2688d0c5787ae54b158b88a03a3f874c68微信图片_202305311200102.jpg");
ossUtils.downloadFile("2023/07/26596a8e6b207a474fa4e7cf5560da251d微信图片_202207241638366.jpg");
ossUtils.downloadFile("2023/07/26832713b49dd4488eaf3c3d46b9dfe83d微信图片_202207241638367.jpg");
ossUtils.downloadFile("2023/07/26e9928d05666e47e488491e63d8d4c7d5微信图片_20220822144529.jpg");
ossUtils.downloadFile("2023/07/26c442b5df35c140228dde498ef4b6c1d2微信图片_202303041905161.jpg");
ossUtils.downloadFile("2023/07/26779b5452701140d9927c698825eb93e0微信图片_202305180143011.jpg");
ossUtils.downloadFile("2023/07/26405414f3d4134af1a786585c6780f88c微信图片_202305180143014.jpg");
}
}

@ -1,136 +0,0 @@
package com.fjp.lc.test.service;
import cn.hutool.core.lang.Snowflake;
import cn.hutool.core.util.CharsetUtil;
import cn.hutool.core.util.IdUtil;
import cn.hutool.crypto.SecureUtil;
import cn.hutool.crypto.symmetric.AES;
import com.alibaba.fastjson.JSON;
import com.cyl.h5.domain.dto.PayNotifyMessageDTO;
import com.cyl.h5.service.H5OrderService;
import com.cyl.job.OrderJob;
import com.cyl.manager.act.service.IntegralHistoryService;
import com.cyl.manager.oms.service.AftersaleService;
import com.cyl.manager.ums.service.MemberCartService;
import com.ruoyi.RuoYiApplication;
import com.ruoyi.common.config.properties.SmsProperties;
import com.ruoyi.common.core.sms.AliyunSmsTemplate;
import com.ruoyi.common.core.sms.SmsTemplate;
import com.ruoyi.common.utils.SecurityUtils;
import com.wechat.pay.java.service.partnerpayments.jsapi.model.Transaction;
import com.wechat.pay.java.service.refund.model.RefundNotification;
import lombok.extern.slf4j.Slf4j;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.http.ResponseEntity;
import org.springframework.test.context.ActiveProfiles;
import org.springframework.test.context.junit4.SpringRunner;
import java.math.BigDecimal;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.NONE, classes = RuoYiApplication.class)
@ActiveProfiles("dev")
@Slf4j
public class ServiceTest {
@Autowired
private AftersaleService aftersaleService;
@Autowired
private MemberCartService memberCartService;
@Autowired
private SmsProperties smsProperties;
@Value("${aes.key}")
private String key;
@Autowired
private IntegralHistoryService integralHistoryService;
@Autowired
private OrderJob orderJob;
@Test
public void testOrderJob(){
orderJob.batchCompleteOrder();
}
@Test
public void test12(){
integralHistoryService.handleIntegral(5405053175810048L,new BigDecimal("2.89"),29L);
}
@Test
public void t(){
String a = "{\"amount\":{\"currency\":\"CNY\",\"discountRefund\":0,\"from\":[],\"payerRefund\":2,\"payerTotal\":2,\"refund\":2,\"refundFee\":0,\"settlementRefund\":2,\"settlementTotal\":2,\"total\":2},\"channel\":\"ORIGINAL\",\"createTime\":\"2024-04-26T18:17:56+08:00\",\"fundsAccount\":\"UNAVAILABLE\",\"outRefundNo\":\"5773276988819456\",\"outTradeNo\":\"5773274485622785\",\"promotionDetail\":[],\"refundId\":\"50303909472024042683046217485\",\"refundStatus\":\"SUCCESS\",\"transactionId\":\"4200002186202404266125196354\",\"userReceivedAccount\":\"支付用户零钱通\"}";
RefundNotification params = JSON.parseObject(a,RefundNotification.class);
aftersaleService.refundOrderExc(params);
}
@Test
public void test1() {
memberCartService.mineCartNum();
}
@Test
public void encryptPassword() {
String newPwd = "admin123";
System.out.println("新密码:"+ SecurityUtils.encryptPassword(newPwd));
}
@Test
public void test2(){
System.out.println(smsProperties);
if (!smsProperties.getEnabled()) {
throw new RuntimeException("没有开启短信服务");
}
Map<String, String> map = new HashMap<>(1);
map.put("code", "1234");
SmsTemplate smsTemplate = new AliyunSmsTemplate(smsProperties);
Object send = smsTemplate.send("15706259078", "SMS_146125046", map);
log.info("短信发送结果:" + send);
}
@Test
public void test3(){
String content = "test中文";
AES aes = SecureUtil.aes(key.getBytes());
byte[] encrypt = aes.encrypt(content);
byte[] decrypt = aes.decrypt(encrypt);
String encryptHex = aes.encryptHex(content);
System.out.println("加密后16进制" + encryptHex);
String decryptStr = aes.decryptStr(encryptHex, CharsetUtil.CHARSET_UTF_8);
System.out.println("解密:" + decryptStr);
}
@Test
public void test4(){
//参数1为终端ID
//参数2为数据中心ID
Snowflake snowflake = IdUtil.createSnowflake(1, 1);
long id = snowflake.nextId();
System.out.println("id:" + id);
}
@Autowired
private H5OrderService h5OrderService;
@Test
public void test6(){
PayNotifyMessageDTO messageDTO = new PayNotifyMessageDTO();
messageDTO.setPayTime(new Date());
messageDTO.setOutTradeNo(5365581195495425L);
messageDTO.setMemberId(22L);
messageDTO.setTradeStatus(Transaction.TradeStateEnum.SUCCESS);
messageDTO.setTradeNo("");
ResponseEntity<String> stringResponseEntity = h5OrderService.payCallBack(messageDTO);
System.out.println(stringResponseEntity.getBody());
}
}

@ -1,25 +0,0 @@
package com.fjp.lc.test.service;
import com.cyl.h5.domain.form.WechatLoginForm;
import com.cyl.manager.ums.service.MemberWechatService;
import com.ruoyi.RuoYiApplication;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.ActiveProfiles;
import org.springframework.test.context.junit4.SpringRunner;
@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.NONE, classes = RuoYiApplication.class)
@ActiveProfiles("dev")
public class WechatTest {
@Autowired
private MemberWechatService memberWechatService;
@Test
public void testAuth() {
WechatLoginForm f = new WechatLoginForm();
f.setCode("081zPgHa1FbRQE0wGIIa1lgb1C1zPgHi");
memberWechatService.login(f);
}
}

@ -0,0 +1,76 @@
package com.ruoyi.common.core.domain;
import cn.hutool.json.JSONUtil;
import java.util.HashMap;
public class RestResponse extends HashMap<String, Object> {
public static RestResponse success(){
return success("成功");
}
public static RestResponse success(String message){
RestResponse restResponse = new RestResponse();
restResponse.setSuccess(true);
restResponse.setMessage(message);
return restResponse;
}
public static RestResponse failure(String message){
RestResponse restResponse = new RestResponse();
restResponse.setSuccess(false);
restResponse.setMessage(message);
return restResponse;
}
public RestResponse setSuccess(Boolean success) {
if (success != null) put("success", success);
return this;
}
public RestResponse setMessage(String message) {
if (message != null) put("message", message);
return this;
}
public RestResponse setData(Object data) {
if (data != null) put("data", data);
return this;
}
public RestResponse setPage(Integer page) {
if (page != null) put("page", page);
return this;
}
public RestResponse setCurrentPage(Integer currentPage){
if (currentPage != null) put("currentPage", currentPage);
return this;
}
public RestResponse setLimit(Integer limit) {
if (limit != null) put("limit", limit);
return this;
}
public RestResponse setTotal(Long total) {
if (total != null) put("total", total);
return this;
}
public RestResponse setAny(String key, Object value) {
if (key != null && value != null) put(key, value);
return this;
}
public Boolean getSuccess(){
return (Boolean) get("success");
}
public String getMessage(){
return (String) get("message");
}
public String toString(){
// return JSONObject.toJSONString(this);
return JSONUtil.toJsonStr(this);
}
}

@ -1,17 +1,18 @@
package com.ruoyi.common.core.domain.entity; package com.ruoyi.common.core.domain.entity;
import java.util.ArrayList; import com.ruoyi.common.core.domain.BaseEntity;
import java.util.List; import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
import javax.validation.constraints.Email; import javax.validation.constraints.Email;
import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotBlank;
import javax.validation.constraints.Size; import javax.validation.constraints.Size;
import org.apache.commons.lang3.builder.ToStringBuilder; import java.util.ArrayList;
import org.apache.commons.lang3.builder.ToStringStyle; import java.util.List;
import com.ruoyi.common.core.domain.BaseEntity;
/** /**
* sys_dept * sys_dept
* *
* @author ruoyi * @author ruoyi
*/ */
public class SysDept extends BaseEntity public class SysDept extends BaseEntity
@ -35,6 +36,7 @@ public class SysDept extends BaseEntity
/** 负责人 */ /** 负责人 */
private String leader; private String leader;
private Long leaderId;
/** 联系电话 */ /** 联系电话 */
private String phone; private String phone;
@ -50,7 +52,7 @@ public class SysDept extends BaseEntity
/** 父部门名称 */ /** 父部门名称 */
private String parentName; private String parentName;
/** 子部门 */ /** 子部门 */
private List<SysDept> children = new ArrayList<SysDept>(); private List<SysDept> children = new ArrayList<SysDept>();

@ -0,0 +1,78 @@
package com.ruoyi.common.utils;
import lombok.extern.slf4j.Slf4j;
import net.coobird.thumbnailator.Thumbnails;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
@Slf4j
public final class ImageUtil {
//以下是常量,按照阿里代码开发规范,不允许代码中出现魔法值
private static final Integer ZERO = 0;
private static final Integer ONE_ZERO_TWO_FOUR = 1024;
private static final Integer NINE_ZERO_ZERO = 900;
private static final Integer THREE_TWO_SEVEN_FIVE = 3275;
private static final Integer TWO_ZERO_FOUR_SEVEN = 2047;
private static final Double ZERO_EIGHT_FIVE = 0.85;
private static final Double ZERO_SIX = 0.6;
private static final Double ZERO_FOUR_FOUR = 0.44;
private static final Double ZERO_FOUR = 0.4;
/**
*
*
* @param imageBytes
* @param desFileSize kb
* @return
*/
public static byte[] compressForScale(byte[] imageBytes, long desFileSize) {
if (imageBytes == null || imageBytes.length <= ZERO || imageBytes.length < desFileSize * ONE_ZERO_TWO_FOUR) {
return imageBytes;
}
long srcSize = imageBytes.length;
double accuracy = getAccuracy(srcSize / ONE_ZERO_TWO_FOUR);
try {
while (imageBytes.length > desFileSize * ONE_ZERO_TWO_FOUR) {
ByteArrayInputStream inputStream = new ByteArrayInputStream(imageBytes);
ByteArrayOutputStream outputStream = new ByteArrayOutputStream(imageBytes.length);
Thumbnails.of(inputStream)
.scale(accuracy)
.outputQuality(accuracy)
.toOutputStream(outputStream);
imageBytes = outputStream.toByteArray();
}
log.info("图片原大小={}kb | 压缩后大小={}kb",
srcSize / ONE_ZERO_TWO_FOUR, imageBytes.length / ONE_ZERO_TWO_FOUR);
} catch (Exception e) {
log.error("【图片压缩】msg=图片压缩失败!", e);
}
return imageBytes;
}
/**
* ()
*
* @param size
* @return
*/
private static double getAccuracy(long size) {
double accuracy;
if (size < NINE_ZERO_ZERO) {
accuracy = ZERO_EIGHT_FIVE;
} else if (size < TWO_ZERO_FOUR_SEVEN) {
accuracy = ZERO_SIX;
} else if (size < THREE_TWO_SEVEN_FIVE) {
accuracy = ZERO_FOUR_FOUR;
} else {
accuracy = ZERO_FOUR;
}
return accuracy;
}
}

@ -1,130 +0,0 @@
package com.ruoyi.common.utils;
import cn.hutool.core.date.DateTime;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.model.DownloadFileRequest;
import com.aliyun.oss.model.GetObjectRequest;
import com.ruoyi.common.utils.uuid.UUID;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
@Slf4j
@Component
public class OssUtils {
@Value("${aliyun.accessKeyId}")
private String accessKeyId;
@Value("${aliyun.secretAccessKey}")
private String secretAccessKey;
@Value("${aliyun.oss.endPoint}")
private String endPoint;
@Value("${aliyun.oss.bucketName}")
private String bucketName;
public void downloadFile(String objectName){
// 创建OSSClient实例。
OSS ossClient = new OSSClientBuilder().build(endPoint, accessKeyId, secretAccessKey);
//截取objectName的第二个/之后的内容作为pathName
String pathName = objectName.substring(objectName.lastIndexOf("/"));
try{
ossClient.getObject(new GetObjectRequest(bucketName, objectName), new File("D:\\oss\\"+pathName));
}catch (Exception e){
log.error(pathName);
}
}
public String uploadOneFile(MultipartFile file) {
// 创建OSSClient实例。
OSS ossClient = new OSSClientBuilder().build(endPoint, accessKeyId, secretAccessKey);
//设置文件名
String fileName = new DateTime().toString("yyyy/MM/dd")
+ UUID.randomUUID().toString().replace("-", "")
+ file.getOriginalFilename();
try {
// 创建PutObject请求。
ossClient.putObject(bucketName, fileName, file.getInputStream());
String url = "https://" + bucketName + "." + endPoint + "/" + fileName;
return url;
} catch (Exception e) {
e.printStackTrace();
return null;
} finally {
if (ossClient != null) {
ossClient.shutdown();
}
}
}
public List<String> uploadArrayFile(MultipartFile[] files) {
// 创建OSSClient实例。
OSS ossClient = new OSSClientBuilder().build(endPoint, accessKeyId, secretAccessKey);
List<String> list = new ArrayList<>();
try {
//设置文件名
for (MultipartFile file : files) {
String fileName = new DateTime().toString("yyyy/MM/dd")
+ UUID.randomUUID().toString().replace("-", "")
+ file.getOriginalFilename();
// 创建PutObject请求。
ossClient.putObject(bucketName, fileName, file.getInputStream());
String url = "http://" + bucketName + "." + endPoint + "/" + fileName;
// System.out.println(url);
list.add(url);
}
} catch (Exception e) {
e.printStackTrace();
return null;
} finally {
if (ossClient != null) {
ossClient.shutdown();
}
}
return list;
}
public boolean deleteFile(String fileUrl) {
// 创建OSSClient实例。
OSS ossClient = new OSSClientBuilder().build(endPoint, accessKeyId, secretAccessKey);
/** ossBucket
* http://edu-czf.oss-cn-guangzhou.aliyuncs.com/2022/08/abc.jpg",
* 2022/08/abc.jpg
*/
int begin = ("http://" + bucketName + "." + endPoint + "/").length(); //找到文件路径的开始下标
String deleteUrl = fileUrl.substring(begin);
try {
// 删除文件请求
ossClient.deleteObject(bucketName, deleteUrl);
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
} finally {
if (ossClient != null) {
ossClient.shutdown();
}
}
}
}

@ -20,7 +20,7 @@ import com.ruoyi.framework.security.handle.LogoutSuccessHandlerImpl;
/** /**
* spring security * spring security
* *
* @author ruoyi * @author ruoyi
*/ */
@EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true) @EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true)
@ -31,7 +31,7 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter
*/ */
@Autowired @Autowired
private UserDetailsService userDetailsService; private UserDetailsService userDetailsService;
/** /**
* *
*/ */
@ -49,13 +49,13 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter
*/ */
@Autowired @Autowired
private JwtAuthenticationTokenFilter authenticationTokenFilter; private JwtAuthenticationTokenFilter authenticationTokenFilter;
/** /**
* *
*/ */
@Autowired @Autowired
private CorsFilter corsFilter; private CorsFilter corsFilter;
/** /**
* AuthenticationManager * AuthenticationManager
* *

@ -0,0 +1,67 @@
package com.ruoyi.system.domain;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import java.util.Date;
/**
* @author Blue
* @version 1.0
*/
@Data
@TableName("im_file_info")
public class FileInfo {
/**
* ID
*/
@TableId
private Long id;
/**
*
*/
private String fileName;
/**
*
*/
private String filePath;
/**
*
*/
private String compressedPath;
/**
*
*/
private String coverPath;
/**
* ()
*/
private Long fileSize;
/**
*
*/
private Date uploadTime;
/**
* : FileType
*/
private Integer fileType;
/**
*
*/
private Boolean isPermanent;
/**
* MD5
*/
private String md5;
}

@ -0,0 +1,13 @@
package com.ruoyi.system.domain.vo;
import lombok.Data;
@Data
public class UploadImageVO {
private String originUrl;//*"原图"
private String thumbUrl;//缩略图
}

@ -0,0 +1,9 @@
package com.ruoyi.system.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.system.domain.FileInfo;
public interface FileInfoMapper extends BaseMapper<FileInfo> {
}

@ -0,0 +1,19 @@
package com.ruoyi.system.minioConfig;
import com.ruoyi.system.thirdparty.MinioProperties;
import io.minio.MinioClient;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class MinIoClientConfig {
@Bean
public MinioClient minioClient(MinioProperties minioProps) {
// 注入minio 客户端
return MinioClient.builder()
.endpoint(minioProps.getEndpoint())
.credentials(minioProps.getAccessKey(), minioProps.getSecretKey())
.build();
}
}

@ -0,0 +1,17 @@
package com.ruoyi.system.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.system.domain.FileInfo;
import com.ruoyi.system.domain.vo.UploadImageVO;
import org.springframework.web.multipart.MultipartFile;
public interface FileService extends IService<FileInfo> {
String uploadFile(MultipartFile file);
UploadImageVO uploadProductImage(MultipartFile file);
UploadImageVO uploadCourseImage(MultipartFile file);
}

@ -0,0 +1,310 @@
package com.ruoyi.system.service.impl;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.common.exception.GlobalException;
import com.ruoyi.common.utils.ImageUtil;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.system.domain.FileInfo;
import com.ruoyi.system.domain.vo.UploadImageVO;
import com.ruoyi.system.mapper.FileInfoMapper;
import com.ruoyi.system.service.FileService;
import com.ruoyi.system.thirdparty.MinioProperties;
import com.ruoyi.system.thirdparty.MinioService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.DigestUtils;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.PostConstruct;
import java.io.IOException;
import java.util.Date;
import java.util.Objects;
/**
*
*
* author: Blue date: 2024-09-28 version: 1.0
*/
@Slf4j
@Service
@RequiredArgsConstructor
public class FileServiceImpl extends ServiceImpl<FileInfoMapper, FileInfo> implements FileService {
private final MinioService minioSerivce;
private final MinioProperties minioProps;
/**
*
*/
public static final Long MAX_IMAGE_SIZE = 20 * 1024 * 1024L;
/**
*
*/
public static final Long MAX_FILE_SIZE = 20 * 1024 * 1024L;
public static final int FILE = 0;//文件
public static final int PRODUCTIMAGE = 1;//商品图片
public static final int COURSEIMAGE = 2;//课程图片
public static final Boolean isPermanent = true;//课程图片
@PostConstruct
public void init() {
if (!minioSerivce.bucketExists(minioProps.getBucketName())) {
// 创建bucket
minioSerivce.makeBucket(minioProps.getBucketName());
// 公开bucket
minioSerivce.setBucketPublic(minioProps.getBucketName());
}
}
@Override
public String uploadFile(MultipartFile file) {
try {
Long userId = SecurityUtils.getUserId();
// 大小校验
if (file.getSize() > MAX_FILE_SIZE) {
throw new GlobalException("文件大小不能超过20M");
}
// 如果文件已存在,直接复用
String md5 = DigestUtils.md5DigestAsHex(file.getInputStream());
FileInfo fileInfo = findByMd5(md5);
if (!Objects.isNull(fileInfo)) {
// 更新上传时间
fileInfo.setUploadTime(new Date());
this.updateById(fileInfo);
// 返回
return fileInfo.getFilePath();
}
// 上传
String fileName = minioSerivce.upload(minioProps.getBucketName(), minioProps.getFilePath(), file);
if (StringUtils.isEmpty(fileName)) {
throw new GlobalException( "文件上传失败");
}
String url = generUrl(FILE, fileName);
// 保存文件
saveFileInfo(file, md5, url);
log.info("文件文件成功用户id:{},url:{}", userId, url);
return url;
} catch (IOException e) {
log.error("上传图片失败,{}", e.getMessage(), e);
throw new GlobalException( "上传图片失败");
}
}
/**
*
* @param file
* @return
*/
@Transactional
@Override
public UploadImageVO uploadProductImage(MultipartFile file) {
try {
Long userId = SecurityUtils.getUserId();
// 大小校验
if (file.getSize() > MAX_IMAGE_SIZE) {
throw new GlobalException("图片大小不能超过20M");
}
// 图片格式校验
if (!isImage(file.getOriginalFilename())) {
throw new GlobalException("图片格式不合法");
}
UploadImageVO vo = new UploadImageVO();
// 如果文件已存在,直接复用
String md5 = DigestUtils.md5DigestAsHex(file.getInputStream());
FileInfo fileInfo = findByMd5(md5);
if (!Objects.isNull(fileInfo)) {
// 更新上传时间和持久化标记
fileInfo.setIsPermanent(isPermanent || fileInfo.getIsPermanent());
fileInfo.setUploadTime(new Date());
this.updateById(fileInfo);
// 返回
vo.setOriginUrl(fileInfo.getFilePath());
vo.setThumbUrl(fileInfo.getCompressedPath());
return vo;
}
// 上传原图
String fileName=minioSerivce.upload(minioProps.getBucketName(), minioProps.getProductImagePath(), file);
if (StringUtils.isEmpty(fileName)) {
throw new GlobalException("图片上传失败");
}
vo.setOriginUrl(generUrl(PRODUCTIMAGE, fileName));
if (file.getSize() > 50 * 1024) {
// 大于50K的文件需上传缩略图
byte[] imageByte = ImageUtil.compressForScale(file.getBytes(), 30);
String thumbFileName= minioSerivce.upload(minioProps.getBucketName(), minioProps.getProductImagePath(),
file.getOriginalFilename(), imageByte, file.getContentType());
if (StringUtils.isEmpty(thumbFileName)) {
throw new GlobalException( "图片上传失败");
}
vo.setThumbUrl(generUrl(PRODUCTIMAGE, thumbFileName));
// 保存文件信息
saveImageFileInfo(file, md5, vo.getOriginUrl(), vo.getThumbUrl(), isPermanent,PRODUCTIMAGE);
}else{
// 小于50k用原图充当缩略图
vo.setThumbUrl(generUrl(PRODUCTIMAGE, fileName));
// 保存文件信息,由于缩略图不允许删除,此时原图也不允许删除
saveImageFileInfo(file, md5, vo.getOriginUrl(), vo.getThumbUrl(), true,PRODUCTIMAGE);
}
log.info("文件图片成功用户id:{},url:{}", userId, vo.getOriginUrl());
return vo;
} catch (IOException e) {
log.error("上传图片失败,{}", e.getMessage(), e);
throw new GlobalException( "图片上传失败");
}
}
/**
*
* @param file
* @return
*/
@Transactional
@Override
public UploadImageVO uploadCourseImage(MultipartFile file) {
try {
Long userId = SecurityUtils.getUserId();
// 大小校验
if (file.getSize() > MAX_IMAGE_SIZE) {
throw new GlobalException("图片大小不能超过20M");
}
// 图片格式校验
if (!isImage(file.getOriginalFilename())) {
throw new GlobalException("图片格式不合法");
}
UploadImageVO vo = new UploadImageVO();
// 如果文件已存在,直接复用
String md5 = DigestUtils.md5DigestAsHex(file.getInputStream());
FileInfo fileInfo = findByMd5(md5);
if (!Objects.isNull(fileInfo)) {
// 更新上传时间和持久化标记
fileInfo.setIsPermanent(isPermanent || fileInfo.getIsPermanent());
fileInfo.setUploadTime(new Date());
this.updateById(fileInfo);
// 返回
vo.setOriginUrl(fileInfo.getFilePath());
vo.setThumbUrl(fileInfo.getCompressedPath());
return vo;
}
// 上传原图
String fileName=minioSerivce.upload(minioProps.getBucketName(), minioProps.getCourseImagePath(), file);
if (StringUtils.isEmpty(fileName)) {
throw new GlobalException("图片上传失败");
}
vo.setOriginUrl(generUrl(COURSEIMAGE, fileName));
if (file.getSize() > 50 * 1024) {
// 大于50K的文件需上传缩略图
byte[] imageByte = ImageUtil.compressForScale(file.getBytes(), 30);
String thumbFileName= minioSerivce.upload(minioProps.getBucketName(), minioProps.getCourseImagePath(),
file.getOriginalFilename(), imageByte, file.getContentType());
if (StringUtils.isEmpty(thumbFileName)) {
throw new GlobalException( "图片上传失败");
}
vo.setThumbUrl(generUrl(COURSEIMAGE, thumbFileName));
// 保存文件信息
saveImageFileInfo(file, md5, vo.getOriginUrl(), vo.getThumbUrl(), isPermanent,COURSEIMAGE);
}else{
// 小于50k用原图充当缩略图
vo.setThumbUrl(generUrl(COURSEIMAGE, fileName));
// 保存文件信息,由于缩略图不允许删除,此时原图也不允许删除
saveImageFileInfo(file, md5, vo.getOriginUrl(), vo.getThumbUrl(), true,COURSEIMAGE);
}
log.info("文件图片成功用户id:{},url:{}", userId, vo.getOriginUrl());
return vo;
} catch (IOException e) {
log.error("上传图片失败,{}", e.getMessage(), e);
throw new GlobalException( "图片上传失败");
}
}
private String generUrl(int fileType, String fileName) {
return StrUtil.join("/", minioProps.getEndpoint(), minioProps.getBucketName(), getBucketPath(fileType), fileName);
}
private String getBucketPath(int fileType) {
switch (fileType) {
case FILE : return minioProps.getFilePath();
case COURSEIMAGE : return minioProps.getCourseImagePath();
case PRODUCTIMAGE: return minioProps.getProductImagePath();
default:return null;
}
}
private FileInfo findByMd5(String md5) {
LambdaQueryWrapper<FileInfo> wrapper = Wrappers.lambdaQuery();
wrapper.eq(FileInfo::getMd5, md5);
return getOne(wrapper);
}
private void saveImageFileInfo(MultipartFile file, String md5, String filePath, String compressedPath,
Boolean isPermanent,int fileType) throws IOException {
FileInfo fileInfo = new FileInfo();
fileInfo.setFileName(file.getOriginalFilename());
fileInfo.setFileSize(file.getSize());
fileInfo.setFileType(fileType);
fileInfo.setFilePath(filePath);
fileInfo.setCompressedPath(compressedPath);
fileInfo.setMd5(md5);
fileInfo.setIsPermanent(isPermanent);
fileInfo.setUploadTime(new Date());
this.save(fileInfo);
}
private void saveFileInfo(MultipartFile file, String md5, String filePath) throws IOException {
FileInfo fileInfo = new FileInfo();
fileInfo.setFileName(file.getOriginalFilename());
fileInfo.setFileSize(file.getSize());
fileInfo.setFileType(FILE);
fileInfo.setFilePath(filePath);
fileInfo.setMd5(md5);
fileInfo.setIsPermanent(false);
fileInfo.setUploadTime(new Date());
this.save(fileInfo);
}
/**
*
*
* @param fileName
* @return boolean
*/
public static String getFileExtension(String fileName) {
return fileName.substring(fileName.lastIndexOf(".") + 1);
}
/**
*
*
* @param fileName
* @return boolean
*/
public static boolean isImage(String fileName) {
String extension = getFileExtension(fileName);
String[] imageExtension = new String[]{"jpeg", "jpg", "bmp", "png", "webp", "gif"};
for (String e : imageExtension) {
if (extension.toLowerCase().equals(e)) {
return true;
}
}
return false;
}
}

@ -0,0 +1,30 @@
package com.ruoyi.system.thirdparty;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
@Data
@Component
@ConfigurationProperties(prefix = "minio")
public class MinioProperties {
private String endpoint;
private String accessKey;
private String secretKey;
private String domain;
private String bucketName;
private String productImagePath;
private String courseImagePath;
private String filePath;
private String videoPath;
private Integer expireIn;
}

@ -0,0 +1,167 @@
package com.ruoyi.system.thirdparty;
import com.ruoyi.common.utils.DateUtils;
import io.minio.*;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.util.Date;
@Slf4j
@Component
@RequiredArgsConstructor
public class MinioService {
private final MinioClient minioClient;
/**
* bucket
*
* @return boolean
*/
public Boolean bucketExists(String bucketName) {
try {
return minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build());
} catch (Exception e) {
log.error("查询bucket失败", e);
return false;
}
}
/**
* bucket
*/
public void makeBucket(String bucketName) {
try {
minioClient.makeBucket(MakeBucketArgs.builder()
.bucket(bucketName)
.build());
} catch (Exception e) {
log.error("创建bucket失败,", e);
}
}
/**
* bucketpublic
*/
public void setBucketPublic(String bucketName) {
try {
// 设置公开
String sb = "{\"Version\":\"2012-10-17\"," +
"\"Statement\":[{\"Effect\":\"Allow\",\"Principal\":" +
"{\"AWS\":[\"*\"]},\"Action\":[\"s3:ListBucket\",\"s3:ListBucketMultipartUploads\"," +
"\"s3:GetBucketLocation\"],\"Resource\":[\"arn:aws:s3:::" + bucketName +
"\"]},{\"Effect\":\"Allow\",\"Principal\":{\"AWS\":[\"*\"]},\"Action\":[\"s3:PutObject\",\"s3:AbortMultipartUpload\",\"s3:DeleteObject\",\"s3:GetObject\",\"s3:ListMultipartUploadParts\"],\"Resource\":[\"arn:aws:s3:::" +
bucketName +
"/*\"]}]}";
minioClient.setBucketPolicy(
SetBucketPolicyArgs.builder()
.bucket(bucketName)
.config(sb)
.build());
} catch (Exception e) {
log.error("创建bucket失败,", e);
}
}
/**
*
*
* @param bucketName bucket
* @param path
* @param file
* @return Boolean
*/
public String upload(String bucketName, String path, MultipartFile file) {
String originalFilename = file.getOriginalFilename();
if (StringUtils.isBlank(originalFilename)) {
throw new RuntimeException();
}
String fileName = System.currentTimeMillis() + "";
if (originalFilename.lastIndexOf(".") >= 0) {
fileName += originalFilename.substring(originalFilename.lastIndexOf("."));
}
String objectName = DateUtils.parseDateToStr("yyyyMMdd", new Date()) + "/" + fileName;
try {
InputStream stream = new ByteArrayInputStream(file.getBytes());
PutObjectArgs objectArgs = PutObjectArgs.builder().bucket(bucketName).object(path + "/" + objectName)
.stream(stream, file.getSize(), -1).contentType(file.getContentType()).build();
//文件名称相同会覆盖
minioClient.putObject(objectArgs);
} catch (Exception e) {
log.error("上传图片失败,", e);
return null;
}
return objectName;
}
/**
*
*
* @param bucketName bucket
* @param path
* @param name
* @param fileByte
* @param contentType contentType
* @return objectName
*/
public String upload(String bucketName, String path, String name, byte[] fileByte, String contentType) {
String fileName = System.currentTimeMillis() + name.substring(name.lastIndexOf("."));
String objectName = DateUtils.parseDateToStr("yyyyMMdd", new Date()) + "/" + fileName;
try {
InputStream stream = new ByteArrayInputStream(fileByte);
PutObjectArgs objectArgs = PutObjectArgs.builder().bucket(bucketName).object(path + "/" + objectName)
.stream(stream, fileByte.length, -1).contentType(contentType).build();
//文件名称相同会覆盖
minioClient.putObject(objectArgs);
} catch (Exception e) {
log.error("上传文件失败,", e);
return null;
}
return objectName;
}
/**
*
*
* @param bucketName bucket
* @param path
* @param fileName
* @return true/false
*/
public boolean remove(String bucketName, String path, String fileName) {
try {
minioClient.removeObject(RemoveObjectArgs.builder().bucket(bucketName).object(path + "/" + fileName).build());
} catch (Exception e) {
log.error("删除文件失败,", e);
return false;
}
return true;
}
/**
*
*
* @param bucketName bucket
* @param path
* @param fileName
* @return
*/
public Boolean isExist(String bucketName, String path, String fileName) {
try {
minioClient.statObject(StatObjectArgs.builder().bucket(bucketName).object(path + "/" + fileName).build());
} catch (Exception e) {
return false;
}
return true;
}
}
Loading…
Cancel
Save