Browse Source

oss本地上传下载

master
zhouyl 1 year ago
parent
commit
bf2c693b43
  1. 2
      tp-admin/src/main/java/com/inscloudtech/TestPlatformApplication.java
  2. 10
      tp-common/src/main/java/com/inscloudtech/common/config/ProjectConfig.java
  3. 8
      tp-common/src/main/java/com/inscloudtech/common/core/controller/BaseController.java
  4. 56
      tp-common/src/main/java/com/inscloudtech/common/utils/DownLoadUtils.java
  5. 4
      tp-common/src/main/java/com/inscloudtech/common/utils/file/FileUploadUtils.java
  6. 33
      tp-demo/pom.xml
  7. 52
      tp-demo/src/main/java/com/inscloudtech/demo/controller/MailController.java
  8. 95
      tp-demo/src/main/java/com/inscloudtech/demo/controller/RedisCacheController.java
  9. 71
      tp-demo/src/main/java/com/inscloudtech/demo/controller/RedisLockController.java
  10. 47
      tp-demo/src/main/java/com/inscloudtech/demo/controller/RedisPubSubController.java
  11. 64
      tp-demo/src/main/java/com/inscloudtech/demo/controller/RedisRateLimiterController.java
  12. 60
      tp-demo/src/main/java/com/inscloudtech/demo/controller/SmsController.java
  13. 31
      tp-demo/src/main/java/com/inscloudtech/demo/controller/Swagger3DemoController.java
  14. 90
      tp-demo/src/main/java/com/inscloudtech/demo/controller/TestBatchController.java
  15. 148
      tp-demo/src/main/java/com/inscloudtech/demo/controller/TestDemoController.java
  16. 55
      tp-demo/src/main/java/com/inscloudtech/demo/controller/TestEncryptController.java
  17. 125
      tp-demo/src/main/java/com/inscloudtech/demo/controller/TestExcelController.java
  18. 71
      tp-demo/src/main/java/com/inscloudtech/demo/controller/TestI18nController.java
  19. 75
      tp-demo/src/main/java/com/inscloudtech/demo/controller/TestSensitiveController.java
  20. 117
      tp-demo/src/main/java/com/inscloudtech/demo/controller/TestTreeController.java
  21. 1
      tp-demo/src/main/java/com/inscloudtech/demo/controller/package-info.java
  22. 90
      tp-demo/src/main/java/com/inscloudtech/demo/controller/queue/BoundedQueueController.java
  23. 90
      tp-demo/src/main/java/com/inscloudtech/demo/controller/queue/DelayedQueueController.java
  24. 22
      tp-demo/src/main/java/com/inscloudtech/demo/controller/queue/PriorityDemo.java
  25. 89
      tp-demo/src/main/java/com/inscloudtech/demo/controller/queue/PriorityQueueController.java
  26. 66
      tp-demo/src/main/java/com/inscloudtech/demo/domain/TestDemo.java
  27. 29
      tp-demo/src/main/java/com/inscloudtech/demo/domain/TestDemoEncrypt.java
  28. 58
      tp-demo/src/main/java/com/inscloudtech/demo/domain/TestTree.java
  29. 59
      tp-demo/src/main/java/com/inscloudtech/demo/domain/bo/TestDemoBo.java
  30. 53
      tp-demo/src/main/java/com/inscloudtech/demo/domain/bo/TestDemoImportVo.java
  31. 47
      tp-demo/src/main/java/com/inscloudtech/demo/domain/bo/TestTreeBo.java
  32. 1
      tp-demo/src/main/java/com/inscloudtech/demo/domain/package-info.java
  33. 119
      tp-demo/src/main/java/com/inscloudtech/demo/domain/vo/ExportDemoVo.java
  34. 83
      tp-demo/src/main/java/com/inscloudtech/demo/domain/vo/TestDemoVo.java
  35. 58
      tp-demo/src/main/java/com/inscloudtech/demo/domain/vo/TestTreeVo.java
  36. 68
      tp-demo/src/main/java/com/inscloudtech/demo/listener/ExportDemoListener.java
  37. 13
      tp-demo/src/main/java/com/inscloudtech/demo/mapper/TestDemoEncryptMapper.java
  38. 58
      tp-demo/src/main/java/com/inscloudtech/demo/mapper/TestDemoMapper.java
  39. 21
      tp-demo/src/main/java/com/inscloudtech/demo/mapper/TestTreeMapper.java
  40. 1
      tp-demo/src/main/java/com/inscloudtech/demo/mapper/package-info.java
  41. 18
      tp-demo/src/main/java/com/inscloudtech/demo/service/IExportExcelService.java
  42. 71
      tp-demo/src/main/java/com/inscloudtech/demo/service/ITestDemoService.java
  43. 52
      tp-demo/src/main/java/com/inscloudtech/demo/service/ITestTreeService.java
  44. 222
      tp-demo/src/main/java/com/inscloudtech/demo/service/impl/ExportExcelServiceImpl.java
  45. 110
      tp-demo/src/main/java/com/inscloudtech/demo/service/impl/TestDemoServiceImpl.java
  46. 87
      tp-demo/src/main/java/com/inscloudtech/demo/service/impl/TestTreeServiceImpl.java
  47. 1
      tp-demo/src/main/java/com/inscloudtech/demo/service/impl/package-info.java
  48. 1
      tp-demo/src/main/java/com/inscloudtech/demo/service/package-info.java
  49. BIN
      tp-demo/src/main/resources/excel/单列表.xlsx
  50. BIN
      tp-demo/src/main/resources/excel/多列表.xlsx
  51. 26
      tp-demo/src/main/resources/mapper/demo/TestDemoMapper.xml
  52. 3
      tp-demo/src/main/resources/mapper/package-info.md
  53. 20
      tp-functional/src/main/java/com/inscloudtech/functional/controller/FuncCarApiController.java
  54. 19
      tp-functional/src/main/java/com/inscloudtech/functional/controller/FuncCarMediaController.java
  55. 36
      tp-functional/src/main/java/com/inscloudtech/functional/controller/ToolDownLoadController.java
  56. 4
      tp-system/src/main/java/com/inscloudtech/system/runner/SystemApplicationRunner.java
  57. 73
      tp-system/src/main/java/com/inscloudtech/system/service/impl/SysOssServiceImpl.java

2
tp-admin/src/main/java/com/inscloudtech/TestPlatformApplication.java

@ -17,7 +17,7 @@ public class TestPlatformApplication {
SpringApplication application = new SpringApplication(TestPlatformApplication.class);
application.setApplicationStartup(new BufferingApplicationStartup(2048));
application.run(args);
System.out.println("启动成功");
System.out.println("------------服务启动成功");
}
}

10
tp-common/src/main/java/com/inscloudtech/common/config/ProjectConfig.java

@ -35,15 +35,15 @@ public class ProjectConfig {
*/
private boolean cacheLazy;
private String profile;
private static String profile;
public String getProfile() {
public static String getProfile() {
return profile;
}
public static String getStaticProfile() {
return null;
public void setProfile(String profile) {
ProjectConfig.profile = profile;
}
/**
@ -70,7 +70,7 @@ public class ProjectConfig {
/**
* 获取上传路径
*/
public String getUploadPath() {
public static String getUploadPath() {
return getProfile() + "/upload";
}

8
tp-common/src/main/java/com/inscloudtech/common/core/controller/BaseController.java

@ -3,8 +3,11 @@ package com.inscloudtech.common.core.controller;
import com.inscloudtech.common.core.domain.R;
import com.inscloudtech.common.core.domain.model.LoginUser;
import com.inscloudtech.common.helper.LoginHelper;
import com.inscloudtech.common.utils.DownLoadUtils;
import com.inscloudtech.common.utils.StringUtils;
import javax.servlet.http.HttpServletResponse;
/**
* web层通用数据处理
*
@ -66,4 +69,9 @@ public class BaseController {
public String getUsername() {
return LoginHelper.getUsername();
}
public void doDownLoad(String filepath,HttpServletResponse response){
DownLoadUtils.doDownLoad(filepath,response);
}
}

56
tp-common/src/main/java/com/inscloudtech/common/utils/DownLoadUtils.java

@ -0,0 +1,56 @@
package com.inscloudtech.common.utils;
import com.inscloudtech.common.config.ProjectConfig;
import com.inscloudtech.common.utils.file.FileUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
import javax.servlet.http.HttpServletResponse;
@Component
public class DownLoadUtils {
private static String downloadPath;
private static String uploadPath;
@Value("${testplatform.profile}")
private String profile;
@PostConstruct
private void getApiToken() {
downloadPath = this.profile + "/download/";
uploadPath = this.profile + "/upload/";
}
public static String getDownloadPath() {
return downloadPath;
}
public static String getUploadPath() {
return uploadPath;
}
public static void doDownLoad(String filename, HttpServletResponse response){
try {
if (!FileUtils.checkAllowDownload(filename)) {
throw new Exception(StringUtils.format("文件名称({})非法,不允许下载。 ", filename));
}
String realFileName = System.currentTimeMillis() + filename.substring(filename.indexOf("_") + 1);
String filePath = getDownloadPath() + filename;
response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE);
FileUtils.setAttachmentResponseHeader(response, realFileName);
FileUtils.writeBytes(filePath, response.getOutputStream());
// if (delete) {
// FileUtils.deleteFile(filePath);
// }
} catch (Exception e) {
e.printStackTrace();
}
}
}

4
tp-common/src/main/java/com/inscloudtech/common/utils/file/FileUploadUtils.java

@ -37,7 +37,7 @@ public class FileUploadUtils {
* 本地默认上传的地址
*/
@Getter
private static String defaultBaseDir = ProjectConfig.getStaticProfile();
private static String defaultBaseDir = ProjectConfig.getProfile();
/**
* Minio默认上传的地址
@ -181,7 +181,7 @@ public class FileUploadUtils {
}
public static String getPathFileName(String uploadDir, String fileName) throws IOException {
int dirLastIndex = ProjectConfig.getStaticProfile().length() + 1;
int dirLastIndex = ProjectConfig.getProfile().length() + 1;
String currentDir = StringUtils.substring(uploadDir, dirLastIndex);
return Constants.RESOURCE_PREFIX + "/" + currentDir + "/" + fileName;
}

33
tp-demo/pom.xml

@ -1,33 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
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">
<parent>
<artifactId>test-platform-service</artifactId>
<groupId>com.inscloudtech</groupId>
<version>4.8.2</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>tp-demo</artifactId>
<description>
demo模块
</description>
<dependencies>
<!-- 通用工具-->
<dependency>
<groupId>com.inscloudtech</groupId>
<artifactId>tp-common</artifactId>
</dependency>
<dependency>
<groupId>com.inscloudtech</groupId>
<artifactId>tp-sms</artifactId>
</dependency>
</dependencies>
</project>

52
tp-demo/src/main/java/com/inscloudtech/demo/controller/MailController.java

@ -1,52 +0,0 @@
package com.inscloudtech.demo.controller;
import com.inscloudtech.common.core.domain.R;
import com.inscloudtech.common.utils.email.MailUtils;
import lombok.RequiredArgsConstructor;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.io.File;
/**
* 邮件发送案例
*
* @author Michelle.Chung
*/
@Validated
@RequiredArgsConstructor
@RestController
@RequestMapping("/demo/mail")
public class MailController {
/**
* 发送邮件
*
* @param to 接收人
* @param subject 标题
* @param text 内容
*/
@GetMapping("/sendSimpleMessage")
public R<Void> sendSimpleMessage(String to, String subject, String text) {
MailUtils.sendText(to, subject, text);
return R.ok();
}
/**
* 发送邮件带附件
*
* @param to 接收人
* @param subject 标题
* @param text 内容
* @param filePath 附件路径
*/
@GetMapping("/sendMessageWithAttachment")
public R<Void> sendMessageWithAttachment(String to, String subject, String text, String filePath) {
MailUtils.sendText(to, subject, text, new File(filePath));
return R.ok();
}
}

95
tp-demo/src/main/java/com/inscloudtech/demo/controller/RedisCacheController.java

@ -1,95 +0,0 @@
package com.inscloudtech.demo.controller;
import com.inscloudtech.common.constant.CacheNames;
import com.inscloudtech.common.core.domain.R;
import com.inscloudtech.common.utils.redis.RedisUtils;
import lombok.RequiredArgsConstructor;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.CachePut;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.time.Duration;
/**
* spring-cache 演示案例
*
* @author inscloudtech
*/
// 类级别 缓存统一配置
//@CacheConfig(cacheNames = CacheNames.DEMO_CACHE)
@RequiredArgsConstructor
@RestController
@RequestMapping("/demo/cache")
public class RedisCacheController {
/**
* 测试 @Cacheable
* <p>
* 表示这个方法有了缓存的功能,方法的返回值会被缓存下来
* 下一次调用该方法前,会去检查是否缓存中已经有值
* 如果有就直接返回,不调用方法
* 如果没有,就调用方法,然后把结果缓存起来
* 这个注解一般用在查询方法上
* <p>
* 重点说明: 缓存注解严禁与其他筛选数据功能一起使用
* 例如: 数据权限注解 会造成 缓存击穿 数据不一致问题
* <p>
* cacheNames 命名规则 查看 {@link CacheNames} 注释 支持多参数
*/
@Cacheable(cacheNames = "demo:cache#60s#10m#20", key = "#key", condition = "#key != null")
@GetMapping("/test1")
public R<String> test1(String key, String value) {
return R.ok("操作成功", value);
}
/**
* 测试 @CachePut
* <p>
* 加了@CachePut注解的方法,会把方法的返回值put到缓存里面缓存起来,供其它地方使用
* 通常用在新增或者实时更新方法上
* <p>
* cacheNames 命名规则 查看 {@link CacheNames} 注释 支持多参数
*/
@CachePut(cacheNames = CacheNames.DEMO_CACHE, key = "#key", condition = "#key != null")
@GetMapping("/test2")
public R<String> test2(String key, String value) {
return R.ok("操作成功", value);
}
/**
* 测试 @CacheEvict
* <p>
* 使用了CacheEvict注解的方法,会清空指定缓存
* 一般用在删除的方法上
* <p>
* cacheNames 命名规则 查看 {@link CacheNames} 注释 支持多参数
*/
@CacheEvict(cacheNames = CacheNames.DEMO_CACHE, key = "#key", condition = "#key != null")
@GetMapping("/test3")
public R<String> test3(String key, String value) {
return R.ok("操作成功", value);
}
/**
* 测试设置过期时间
* 手动设置过期时间10秒
* 11秒后获取 判断是否相等
*/
@GetMapping("/test6")
public R<Boolean> test6(String key, String value) {
RedisUtils.setCacheObject(key, value);
boolean flag = RedisUtils.expire(key, Duration.ofSeconds(10));
System.out.println("***********" + flag);
try {
Thread.sleep(11 * 1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
Object obj = RedisUtils.getCacheObject(key);
return R.ok(value.equals(obj));
}
}

71
tp-demo/src/main/java/com/inscloudtech/demo/controller/RedisLockController.java

@ -1,71 +0,0 @@
package com.inscloudtech.demo.controller;
import com.baomidou.lock.LockInfo;
import com.baomidou.lock.LockTemplate;
import com.baomidou.lock.annotation.Lock4j;
import com.baomidou.lock.executor.RedissonLockExecutor;
import com.inscloudtech.common.core.domain.R;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.time.LocalTime;
/**
* 测试分布式锁的样例
*
* @author shenxinquan
*/
@Slf4j
@RestController
@RequestMapping("/demo/redisLock")
public class RedisLockController {
@Autowired
private LockTemplate lockTemplate;
/**
* 测试lock4j 注解
*/
@Lock4j(keys = {"#key"})
@GetMapping("/testLock4j")
public R<String> testLock4j(String key, String value) {
System.out.println("start:" + key + ",time:" + LocalTime.now().toString());
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("end :" + key + ",time:" + LocalTime.now().toString());
return R.ok("操作成功", value);
}
/**
* 测试lock4j 工具
*/
@GetMapping("/testLock4jLockTemplate")
public R<String> testLock4jLockTemplate(String key, String value) {
final LockInfo lockInfo = lockTemplate.lock(key, 30000L, 5000L, RedissonLockExecutor.class);
if (null == lockInfo) {
throw new RuntimeException("业务处理中,请稍后再试");
}
// 获取锁成功处理业务
try {
try {
Thread.sleep(8000);
} catch (InterruptedException e) {
//
}
System.out.println("执行简单方法1 , 当前线程:" + Thread.currentThread().getName());
} finally {
//释放锁
lockTemplate.releaseLock(lockInfo);
}
//结束
return R.ok("操作成功", value);
}
}

47
tp-demo/src/main/java/com/inscloudtech/demo/controller/RedisPubSubController.java

@ -1,47 +0,0 @@
package com.inscloudtech.demo.controller;
import com.inscloudtech.common.core.domain.R;
import com.inscloudtech.common.utils.redis.RedisUtils;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* Redis 发布订阅 演示案例
*
* @author inscloudtech
*/
@RequiredArgsConstructor
@RestController
@RequestMapping("/demo/redis/pubsub")
public class RedisPubSubController {
/**
* 发布消息
*
* @param key 通道Key
* @param value 发送内容
*/
@GetMapping("/pub")
public R<Void> pub(String key, String value) {
RedisUtils.publish(key, value, consumer -> {
System.out.println("发布通道 => " + key + ", 发送值 => " + value);
});
return R.ok("操作成功");
}
/**
* 订阅消息
*
* @param key 通道Key
*/
@GetMapping("/sub")
public R<Void> sub(String key) {
RedisUtils.subscribe(key, String.class, msg -> {
System.out.println("订阅通道 => " + key + ", 接收值 => " + msg);
});
return R.ok("操作成功");
}
}

64
tp-demo/src/main/java/com/inscloudtech/demo/controller/RedisRateLimiterController.java

@ -1,64 +0,0 @@
package com.inscloudtech.demo.controller;
import com.inscloudtech.common.annotation.RateLimiter;
import com.inscloudtech.common.core.domain.R;
import com.inscloudtech.common.enums.LimitType;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* 测试分布式限流样例
*
* @author inscloudtech
*/
@Slf4j
@RestController
@RequestMapping("/demo/rateLimiter")
public class RedisRateLimiterController {
/**
* 测试全局限流
* 全局影响
*/
@RateLimiter(count = 2, time = 10)
@GetMapping("/test")
public R<String> test(String value) {
return R.ok("操作成功", value);
}
/**
* 测试请求IP限流
* 同一IP请求受影响
*/
@RateLimiter(count = 2, time = 10, limitType = LimitType.IP)
@GetMapping("/testip")
public R<String> testip(String value) {
return R.ok("操作成功", value);
}
/**
* 测试集群实例限流
* 启动两个后端服务互不影响
*/
@RateLimiter(count = 2, time = 10, limitType = LimitType.CLUSTER)
@GetMapping("/testcluster")
public R<String> testcluster(String value) {
return R.ok("操作成功", value);
}
/**
* 测试请求IP限流(key基于参数获取)
* 同一IP请求受影响
*
* 简单变量获取 #变量 复杂表达式 #{#变量 != 1 ? 1 : 0}
*/
@RateLimiter(count = 2, time = 10, limitType = LimitType.IP, key = "#value")
@GetMapping("/testObj")
public R<String> testObj(String value) {
return R.ok("操作成功", value);
}
}

60
tp-demo/src/main/java/com/inscloudtech/demo/controller/SmsController.java

@ -1,60 +0,0 @@
package com.inscloudtech.demo.controller;
import com.inscloudtech.common.core.domain.R;
import lombok.RequiredArgsConstructor;
import org.dromara.sms4j.api.SmsBlend;
import org.dromara.sms4j.api.entity.SmsResponse;
import org.dromara.sms4j.core.factory.SmsFactory;
import org.dromara.sms4j.provider.enumerate.SupplierType;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.LinkedHashMap;
/**
* 短信演示案例
* 请先阅读文档 否则无法使用
*
* @author inscloudtech
* @version 4.2.0
*/
@Validated
@RequiredArgsConstructor
@RestController
@RequestMapping("/demo/sms")
public class SmsController {
/**
* 发送短信Aliyun
*
* @param phones 电话号
* @param templateId 模板ID
*/
@GetMapping("/sendAliyun")
public R<Object> sendAliyun(String phones, String templateId) {
LinkedHashMap<String, String> map = new LinkedHashMap<>(1);
map.put("code", "1234");
SmsBlend smsBlend = SmsFactory.createSmsBlend(SupplierType.ALIBABA);
SmsResponse smsResponse = smsBlend.sendMessage(phones, templateId, map);
return R.ok(smsResponse);
}
/**
* 发送短信Tencent
*
* @param phones 电话号
* @param templateId 模板ID
*/
@GetMapping("/sendTencent")
public R<Object> sendTencent(String phones, String templateId) {
LinkedHashMap<String, String> map = new LinkedHashMap<>(1);
// map.put("2", "测试测试");
map.put("1", "1234");
SmsBlend smsBlend = SmsFactory.createSmsBlend(SupplierType.TENCENT);
SmsResponse smsResponse = smsBlend.sendMessage(phones, templateId, map);
return R.ok(smsResponse);
}
}

31
tp-demo/src/main/java/com/inscloudtech/demo/controller/Swagger3DemoController.java

@ -1,31 +0,0 @@
package com.inscloudtech.demo.controller;
import com.inscloudtech.common.core.domain.R;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestPart;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
/**
* swagger3 用法示例
*
* @author inscloudtech
*/
@RestController
@RequestMapping("/swagger/demo")
public class Swagger3DemoController {
/**
* 上传请求
* 必须使用 @RequestPart 注解标注为文件
*
* @param file 文件
*/
@PostMapping(value = "/upload", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
public R<String> upload(@RequestPart("file") MultipartFile file) {
return R.ok("操作成功", file.getOriginalFilename());
}
}

90
tp-demo/src/main/java/com/inscloudtech/demo/controller/TestBatchController.java

@ -1,90 +0,0 @@
package com.inscloudtech.demo.controller;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.inscloudtech.common.core.controller.BaseController;
import com.inscloudtech.common.core.domain.R;
import com.inscloudtech.demo.domain.TestDemo;
import com.inscloudtech.demo.mapper.TestDemoMapper;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.ArrayList;
import java.util.List;
/**
* 测试批量方法
*
* @author inscloudtech
* @date 2021-05-30
*/
@RequiredArgsConstructor
@RestController
@RequestMapping("/demo/batch")
public class TestBatchController extends BaseController {
/**
* 为了便于测试 直接引入mapper
*/
private final TestDemoMapper testDemoMapper;
/**
* 新增批量方法 可完美替代 saveBatch 秒级插入上万数据 (对mysql负荷较大)
* <p>
* 3.5.0 版本 增加 rewriteBatchedStatements=true 批处理参数 使 MP 原生批处理可以达到同样的速度
*/
@PostMapping("/add")
// @DS("slave")
public R<Void> add() {
List<TestDemo> list = new ArrayList<>();
for (int i = 0; i < 1000; i++) {
TestDemo testDemo = new TestDemo();
testDemo.setOrderNum(-1);
testDemo.setTestKey("批量新增");
testDemo.setValue("测试新增");
list.add(testDemo);
}
return toAjax(testDemoMapper.insertBatch(list));
}
/**
* 新增或更新 可完美替代 saveOrUpdateBatch 高性能
* <p>
* 3.5.0 版本 增加 rewriteBatchedStatements=true 批处理参数 使 MP 原生批处理可以达到同样的速度
*/
@PostMapping("/addOrUpdate")
// @DS("slave")
public R<Void> addOrUpdate() {
List<TestDemo> list = new ArrayList<>();
for (int i = 0; i < 1000; i++) {
TestDemo testDemo = new TestDemo();
testDemo.setOrderNum(-1);
testDemo.setTestKey("批量新增");
testDemo.setValue("测试新增");
list.add(testDemo);
}
testDemoMapper.insertBatch(list);
for (int i = 0; i < list.size(); i++) {
TestDemo testDemo = list.get(i);
testDemo.setTestKey("批量新增或修改");
testDemo.setValue("批量新增或修改");
if (i % 2 == 0) {
testDemo.setId(null);
}
}
return toAjax(testDemoMapper.insertOrUpdateBatch(list));
}
/**
* 删除批量方法
*/
@DeleteMapping()
// @DS("slave")
public R<Void> remove() {
return toAjax(testDemoMapper.delete(new LambdaQueryWrapper<TestDemo>()
.eq(TestDemo::getOrderNum, -1L)));
}
}

148
tp-demo/src/main/java/com/inscloudtech/demo/controller/TestDemoController.java

@ -1,148 +0,0 @@
package com.inscloudtech.demo.controller;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.hutool.core.bean.BeanUtil;
import com.inscloudtech.common.annotation.Log;
import com.inscloudtech.common.annotation.RepeatSubmit;
import com.inscloudtech.common.core.controller.BaseController;
import com.inscloudtech.common.core.domain.PageQuery;
import com.inscloudtech.common.core.domain.R;
import com.inscloudtech.common.core.page.TableDataInfo;
import com.inscloudtech.common.core.validate.AddGroup;
import com.inscloudtech.common.core.validate.EditGroup;
import com.inscloudtech.common.core.validate.QueryGroup;
import com.inscloudtech.common.enums.BusinessType;
import com.inscloudtech.common.excel.ExcelResult;
import com.inscloudtech.common.utils.ValidatorUtils;
import com.inscloudtech.common.utils.poi.ExcelUtil;
import com.inscloudtech.demo.domain.TestDemo;
import com.inscloudtech.demo.domain.bo.TestDemoBo;
import com.inscloudtech.demo.domain.bo.TestDemoImportVo;
import com.inscloudtech.demo.domain.vo.TestDemoVo;
import com.inscloudtech.demo.service.ITestDemoService;
import lombok.RequiredArgsConstructor;
import org.springframework.http.MediaType;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletResponse;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import java.util.Arrays;
import java.util.List;
import java.util.concurrent.TimeUnit;
/**
* 测试单表Controller
*
* @author inscloudtech
* @date 2021-07-26
*/
@Validated
@RequiredArgsConstructor
@RestController
@RequestMapping("/demo/demo")
public class TestDemoController extends BaseController {
private final ITestDemoService iTestDemoService;
/**
* 查询测试单表列表
*/
@SaCheckPermission("demo:demo:list")
@GetMapping("/list")
public TableDataInfo<TestDemoVo> list(@Validated(QueryGroup.class) TestDemoBo bo, PageQuery pageQuery) {
return iTestDemoService.queryPageList(bo, pageQuery);
}
/**
* 自定义分页查询
*/
@SaCheckPermission("demo:demo:list")
@GetMapping("/page")
public TableDataInfo<TestDemoVo> page(@Validated(QueryGroup.class) TestDemoBo bo, PageQuery pageQuery) {
return iTestDemoService.customPageList(bo, pageQuery);
}
/**
* 导入数据
*
* @param file 导入文件
*/
@Log(title = "测试单表", businessType = BusinessType.IMPORT)
@SaCheckPermission("demo:demo:import")
@PostMapping(value = "/importData", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
public R<Void> importData(@RequestPart("file") MultipartFile file) throws Exception {
ExcelResult<TestDemoImportVo> excelResult = ExcelUtil.importExcel(file.getInputStream(), TestDemoImportVo.class, true);
List<TestDemoImportVo> volist = excelResult.getList();
List<TestDemo> list = BeanUtil.copyToList(volist, TestDemo.class);
iTestDemoService.saveBatch(list);
return R.ok(excelResult.getAnalysis());
}
/**
* 导出测试单表列表
*/
@SaCheckPermission("demo:demo:export")
@Log(title = "测试单表", businessType = BusinessType.EXPORT)
@PostMapping("/export")
public void export(@Validated TestDemoBo bo, HttpServletResponse response) {
List<TestDemoVo> list = iTestDemoService.queryList(bo);
// 测试雪花id导出
// for (TestDemoVo vo : list) {
// vo.setId(1234567891234567893L);
// }
ExcelUtil.exportExcel(list, "测试单表", TestDemoVo.class, response);
}
/**
* 获取测试单表详细信息
*
* @param id 测试ID
*/
@SaCheckPermission("demo:demo:query")
@GetMapping("/{id}")
public R<TestDemoVo> getInfo(@NotNull(message = "主键不能为空")
@PathVariable("id") Long id) {
return R.ok(iTestDemoService.queryById(id));
}
/**
* 新增测试单表
*/
@SaCheckPermission("demo:demo:add")
@Log(title = "测试单表", businessType = BusinessType.INSERT)
@RepeatSubmit(interval = 2, timeUnit = TimeUnit.SECONDS, message = "{repeat.submit.message}")
@PostMapping()
public R<Void> add(@RequestBody TestDemoBo bo) {
// 使用校验工具对标 @Validated(AddGroup.class) 注解
// 用于在非 Controller 的地方校验对象
ValidatorUtils.validate(bo, AddGroup.class);
return toAjax(iTestDemoService.insertByBo(bo));
}
/**
* 修改测试单表
*/
@SaCheckPermission("demo:demo:edit")
@Log(title = "测试单表", businessType = BusinessType.UPDATE)
@RepeatSubmit
@PutMapping()
public R<Void> edit(@Validated(EditGroup.class) @RequestBody TestDemoBo bo) {
return toAjax(iTestDemoService.updateByBo(bo));
}
/**
* 删除测试单表
*
* @param ids 测试ID串
*/
@SaCheckPermission("demo:demo:remove")
@Log(title = "测试单表", businessType = BusinessType.DELETE)
@DeleteMapping("/{ids}")
public R<Void> remove(@NotEmpty(message = "主键不能为空")
@PathVariable Long[] ids) {
return toAjax(iTestDemoService.deleteWithValidByIds(Arrays.asList(ids), true));
}
}

55
tp-demo/src/main/java/com/inscloudtech/demo/controller/TestEncryptController.java

@ -1,55 +0,0 @@
package com.inscloudtech.demo.controller;
import com.inscloudtech.common.core.domain.R;
import com.inscloudtech.demo.domain.TestDemoEncrypt;
import com.inscloudtech.demo.mapper.TestDemoEncryptMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.HashMap;
import java.util.Map;
/**
* 测试数据库加解密功能
*
* @author inscloudtech
*/
@Validated
@RestController
@RequestMapping("/demo/encrypt")
public class TestEncryptController {
@Autowired
private TestDemoEncryptMapper mapper;
@Value("${mybatis-encryptor.enable}")
private Boolean encryptEnable;
/**
* 测试数据库加解密
*
* @param key 测试key
* @param value 测试value
*/
@GetMapping()
public R<Map<String, TestDemoEncrypt>> test(String key, String value) {
if (!encryptEnable) {
throw new RuntimeException("加密功能未开启!");
}
Map<String, TestDemoEncrypt> map = new HashMap<>(2);
TestDemoEncrypt demo = new TestDemoEncrypt();
demo.setTestKey(key);
demo.setValue(value);
mapper.insert(demo);
map.put("加密", demo);
TestDemoEncrypt testDemo = mapper.selectById(demo.getId());
map.put("解密", testDemo);
return R.ok(map);
}
}

125
tp-demo/src/main/java/com/inscloudtech/demo/controller/TestExcelController.java

@ -1,125 +0,0 @@
package com.inscloudtech.demo.controller;
import cn.hutool.core.collection.CollUtil;
import com.inscloudtech.common.excel.ExcelResult;
import com.inscloudtech.common.utils.poi.ExcelUtil;
import com.inscloudtech.demo.domain.vo.ExportDemoVo;
import com.inscloudtech.demo.listener.ExportDemoListener;
import com.inscloudtech.demo.service.IExportExcelService;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.RequiredArgsConstructor;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletResponse;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* 测试Excel功能
*
* @author inscloudtech
*/
@RestController
@RequiredArgsConstructor
@RequestMapping("/demo/excel")
public class TestExcelController {
private final IExportExcelService exportExcelService;
/**
* 单列表多数据
*/
@GetMapping("/exportTemplateOne")
public void exportTemplateOne(HttpServletResponse response) {
Map<String, String> map = new HashMap<>();
map.put("title", "单列表多数据");
map.put("test1", "数据测试1");
map.put("test2", "数据测试2");
map.put("test3", "数据测试3");
map.put("test4", "数据测试4");
map.put("testTest", "666");
List<TestObj> list = new ArrayList<>();
list.add(new TestObj("单列表测试1", "列表测试1", "列表测试2", "列表测试3", "列表测试4"));
list.add(new TestObj("单列表测试2", "列表测试5", "列表测试6", "列表测试7", "列表测试8"));
list.add(new TestObj("单列表测试3", "列表测试9", "列表测试10", "列表测试11", "列表测试12"));
ExcelUtil.exportTemplate(CollUtil.newArrayList(map, list), "单列表.xlsx", "excel/单列表.xlsx", response);
}
/**
* 多列表多数据
*/
@GetMapping("/exportTemplateMuliti")
public void exportTemplateMuliti(HttpServletResponse response) {
Map<String, String> map = new HashMap<>();
map.put("title1", "标题1");
map.put("title2", "标题2");
map.put("title3", "标题3");
map.put("title4", "标题4");
map.put("author", "Lion Li");
List<TestObj1> list1 = new ArrayList<>();
list1.add(new TestObj1("list1测试1", "list1测试2", "list1测试3"));
list1.add(new TestObj1("list1测试4", "list1测试5", "list1测试6"));
list1.add(new TestObj1("list1测试7", "list1测试8", "list1测试9"));
List<TestObj1> list2 = new ArrayList<>();
list2.add(new TestObj1("list2测试1", "list2测试2", "list2测试3"));
list2.add(new TestObj1("list2测试4", "list2测试5", "list2测试6"));
List<TestObj1> list3 = new ArrayList<>();
list3.add(new TestObj1("list3测试1", "list3测试2", "list3测试3"));
List<TestObj1> list4 = new ArrayList<>();
list4.add(new TestObj1("list4测试1", "list4测试2", "list4测试3"));
list4.add(new TestObj1("list4测试4", "list4测试5", "list4测试6"));
list4.add(new TestObj1("list4测试7", "list4测试8", "list4测试9"));
list4.add(new TestObj1("list4测试10", "list4测试11", "list4测试12"));
Map<String, Object> multiListMap = new HashMap<>();
multiListMap.put("map", map);
multiListMap.put("data1", list1);
multiListMap.put("data2", list2);
multiListMap.put("data3", list3);
multiListMap.put("data4", list4);
ExcelUtil.exportTemplateMultiList(multiListMap, "多列表.xlsx", "excel/多列表.xlsx", response);
}
/**
* 导出下拉框
*
* @param response /
*/
@GetMapping("/exportWithOptions")
public void exportWithOptions(HttpServletResponse response) {
exportExcelService.exportWithOptions(response);
}
/**
* 导入表格
*/
@PostMapping(value = "/importWithOptions", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
public List<ExportDemoVo> importWithOptions(@RequestPart("file") MultipartFile file) throws Exception {
// 处理解析结果
ExcelResult<ExportDemoVo> excelResult = ExcelUtil.importExcel(file.getInputStream(), ExportDemoVo.class, new ExportDemoListener());
return excelResult.getList();
}
@Data
@AllArgsConstructor
static class TestObj1 {
private String test1;
private String test2;
private String test3;
}
@Data
@AllArgsConstructor
static class TestObj {
private String name;
private String list1;
private String list2;
private String list3;
private String list4;
}
}

71
tp-demo/src/main/java/com/inscloudtech/demo/controller/TestI18nController.java

@ -1,71 +0,0 @@
package com.inscloudtech.demo.controller;
import com.inscloudtech.common.core.domain.R;
import com.inscloudtech.common.utils.MessageUtils;
import lombok.Data;
import org.hibernate.validator.constraints.Range;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
/**
* 测试国际化
*
* @author inscloudtech
*/
@Validated
@RestController
@RequestMapping("/demo/i18n")
public class TestI18nController {
/**
* 通过code获取国际化内容
* code为 messages.properties 中的 key
* <p>
* 测试使用 user.register.success
*
* @param code 国际化code
*/
@GetMapping()
public R<Void> get(String code) {
return R.ok(MessageUtils.message(code));
}
/**
* Validator 校验国际化
* 不传值 分别查看异常返回
* <p>
* 测试使用 not.null
*/
@GetMapping("/test1")
public R<Void> test1(@NotBlank(message = "{not.null}") String str) {
return R.ok(str);
}
/**
* Bean 校验国际化
* 不传值 分别查看异常返回
* <p>
* 测试使用 not.null
*/
@GetMapping("/test2")
public R<TestI18nBo> test2(@Validated TestI18nBo bo) {
return R.ok(bo);
}
@Data
public static class TestI18nBo {
@NotBlank(message = "{not.null}")
private String name;
@NotNull(message = "{not.null}")
@Range(min = 0, max = 100, message = "{length.not.valid}")
private Integer age;
}
}

75
tp-demo/src/main/java/com/inscloudtech/demo/controller/TestSensitiveController.java

@ -1,75 +0,0 @@
package com.inscloudtech.demo.controller;
import com.inscloudtech.common.annotation.Sensitive;
import com.inscloudtech.common.core.controller.BaseController;
import com.inscloudtech.common.core.domain.R;
import com.inscloudtech.common.enums.SensitiveStrategy;
import lombok.Data;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* 测试数据脱敏控制器
* <p>
* 默认管理员不过滤
* 需自行根据业务重写实现
*
* @author inscloudtech
* @version 3.6.0
* @see com.inscloudtech.common.core.service.SensitiveService
*/
@RestController
@RequestMapping("/demo/sensitive")
public class TestSensitiveController extends BaseController {
/**
* 测试数据脱敏
*/
@GetMapping("/test")
public R<TestSensitive> test() {
TestSensitive testSensitive = new TestSensitive();
testSensitive.setIdCard("210397198608215431");
testSensitive.setPhone("17640125371");
testSensitive.setAddress("北京市朝阳区某某四合院1203室");
testSensitive.setEmail("17640125371@163.com");
testSensitive.setBankCard("6226456952351452853");
return R.ok(testSensitive);
}
@Data
static class TestSensitive {
/**
* 身份证
*/
@Sensitive(strategy = SensitiveStrategy.ID_CARD)
private String idCard;
/**
* 电话
*/
@Sensitive(strategy = SensitiveStrategy.PHONE)
private String phone;
/**
* 地址
*/
@Sensitive(strategy = SensitiveStrategy.ADDRESS)
private String address;
/**
* 邮箱
*/
@Sensitive(strategy = SensitiveStrategy.EMAIL)
private String email;
/**
* 银行卡
*/
@Sensitive(strategy = SensitiveStrategy.BANK_CARD)
private String bankCard;
}
}

117
tp-demo/src/main/java/com/inscloudtech/demo/controller/TestTreeController.java

@ -1,117 +0,0 @@
package com.inscloudtech.demo.controller;
import cn.dev33.satoken.annotation.SaCheckPermission;
import com.inscloudtech.common.annotation.Log;
import com.inscloudtech.common.annotation.RepeatSubmit;
import com.inscloudtech.common.core.controller.BaseController;
import com.inscloudtech.common.core.domain.R;
import com.inscloudtech.common.core.validate.AddGroup;
import com.inscloudtech.common.core.validate.EditGroup;
import com.inscloudtech.common.core.validate.QueryGroup;
import com.inscloudtech.common.enums.BusinessType;
import com.inscloudtech.common.utils.poi.ExcelUtil;
import com.inscloudtech.demo.domain.bo.TestTreeBo;
import com.inscloudtech.demo.domain.vo.TestTreeVo;
import com.inscloudtech.demo.service.ITestTreeService;
import lombok.RequiredArgsConstructor;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletResponse;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import java.util.Arrays;
import java.util.List;
/**
* 测试树表Controller
*
* @author inscloudtech
* @date 2021-07-26
*/
@Validated
@RequiredArgsConstructor
@RestController
@RequestMapping("/demo/tree")
public class TestTreeController extends BaseController {
private final ITestTreeService iTestTreeService;
/**
* 查询测试树表列表
*/
@SaCheckPermission("demo:tree:list")
@GetMapping("/list")
public R<List<TestTreeVo>> list(@Validated(QueryGroup.class) TestTreeBo bo) {
List<TestTreeVo> list = iTestTreeService.queryList(bo);
return R.ok(list);
}
/**
* 查询测试树表列表
*/
@SaCheckPermission("demo:tree:list")
@GetMapping("/f")
public R<List<TestTreeVo>> f(@Validated(QueryGroup.class) TestTreeBo bo) {
List<TestTreeVo> list = iTestTreeService.queryList(bo);
return R.ok(list);
}
/**
* 导出测试树表列表
*/
@SaCheckPermission("demo:tree:export")
@Log(title = "测试树表", businessType = BusinessType.EXPORT)
@GetMapping("/export")
public void export(@Validated TestTreeBo bo, HttpServletResponse response) {
List<TestTreeVo> list = iTestTreeService.queryList(bo);
ExcelUtil.exportExcel(list, "测试树表", TestTreeVo.class, response);
}
/**
* 获取测试树表详细信息
*
* @param id 测试树ID
*/
@SaCheckPermission("demo:tree:query")
@GetMapping("/{id}")
public R<TestTreeVo> getInfo(@NotNull(message = "主键不能为空")
@PathVariable("id") Long id) {
return R.ok(iTestTreeService.queryById(id));
}
/**
* 新增测试树表
*/
@SaCheckPermission("demo:tree:add")
@Log(title = "测试树表", businessType = BusinessType.INSERT)
@RepeatSubmit
@PostMapping()
public R<Void> add(@Validated(AddGroup.class) @RequestBody TestTreeBo bo) {
return toAjax(iTestTreeService.insertByBo(bo));
}
/**
* 修改测试树表
*/
@SaCheckPermission("demo:tree:edit")
@Log(title = "测试树表", businessType = BusinessType.UPDATE)
@RepeatSubmit
@PutMapping()
public R<Void> edit(@Validated(EditGroup.class) @RequestBody TestTreeBo bo) {
return toAjax(iTestTreeService.updateByBo(bo));
}
/**
* 删除测试树表
*
* @param ids 测试树ID串
*/
@SaCheckPermission("demo:tree:remove")
@Log(title = "测试树表", businessType = BusinessType.DELETE)
@DeleteMapping("/{ids}")
public R<Void> remove(@NotEmpty(message = "主键不能为空")
@PathVariable Long[] ids) {
return toAjax(iTestTreeService.deleteWithValidByIds(Arrays.asList(ids), true));
}
}

1
tp-demo/src/main/java/com/inscloudtech/demo/controller/package-info.java

@ -1 +0,0 @@
package com.inscloudtech.demo.controller;

90
tp-demo/src/main/java/com/inscloudtech/demo/controller/queue/BoundedQueueController.java

@ -1,90 +0,0 @@
package com.inscloudtech.demo.controller.queue;
import com.inscloudtech.common.core.domain.R;
import com.inscloudtech.common.utils.redis.QueueUtils;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* 有界队列 演示案例
* <p>
* 轻量级队列 重量级数据量 请使用 MQ
* <p>
* 集群测试通过 同一个数据只会被消费一次 做好事务补偿
* 集群测试流程 在其中一台发送数据 两端分别调用获取接口 一次获取一条
*
* @author inscloudtech
* @version 3.6.0
*/
@Slf4j
@RequiredArgsConstructor
@RestController
@RequestMapping("/demo/queue/bounded")
public class BoundedQueueController {
/**
* 添加队列数据
*
* @param queueName 队列名
* @param capacity 容量
*/
@GetMapping("/add")
public R<Void> add(String queueName, int capacity) {
// 用完了一定要销毁 否则会一直存在
boolean b = QueueUtils.destroyBoundedQueue(queueName);
log.info("通道: {} , 删除: {}", queueName, b);
// 初始化设置一次即可
if (QueueUtils.trySetBoundedQueueCapacity(queueName, capacity)) {
log.info("通道: {} , 设置容量: {}", queueName, capacity);
} else {
log.info("通道: {} , 设置容量失败", queueName);
return R.fail("操作失败");
}
for (int i = 0; i < 11; i++) {
String data = "data-" + i;
boolean flag = QueueUtils.addBoundedQueueObject(queueName, data);
if (flag == false) {
log.info("通道: {} , 发送数据: {} 失败, 通道已满", queueName, data);
} else {
log.info("通道: {} , 发送数据: {}", queueName, data);
}
}
return R.ok("操作成功");
}
/**
* 删除队列数据
*
* @param queueName 队列名
*/
@GetMapping("/remove")
public R<Void> remove(String queueName) {
String data = "data-" + 5;
if (QueueUtils.removeBoundedQueueObject(queueName, data)) {
log.info("通道: {} , 删除数据: {}", queueName, data);
} else {
return R.fail("操作失败");
}
return R.ok("操作成功");
}
/**
* 获取队列数据
*
* @param queueName 队列名
*/
@GetMapping("/get")
public R<Void> get(String queueName) {
String data;
do {
data = QueueUtils.getBoundedQueueObject(queueName);
log.info("通道: {} , 获取数据: {}", queueName, data);
} while (data != null);
return R.ok("操作成功");
}
}

90
tp-demo/src/main/java/com/inscloudtech/demo/controller/queue/DelayedQueueController.java

@ -1,90 +0,0 @@
package com.inscloudtech.demo.controller.queue;
import com.inscloudtech.common.core.domain.R;
import com.inscloudtech.common.utils.redis.QueueUtils;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.concurrent.TimeUnit;
/**
* 延迟队列 演示案例
* <p>
* 轻量级队列 重量级数据量 请使用 MQ
* 例如: 创建订单30分钟后过期处理
* <p>
* 集群测试通过 同一个数据只会被消费一次 做好事务补偿
* 集群测试流程 两台集群分别开启订阅 在其中一台发送数据 观察接收消息的规律
*
* @author inscloudtech
* @version 3.6.0
*/
@Slf4j
@RequiredArgsConstructor
@RestController
@RequestMapping("/demo/queue/delayed")
public class DelayedQueueController {
/**
* 订阅队列
*
* @param queueName 队列名
*/
@GetMapping("/subscribe")
public R<Void> subscribe(String queueName) {
log.info("通道: {} 监听中......", queueName);
// 项目初始化设置一次即可
QueueUtils.subscribeBlockingQueue(queueName, (String orderNum) -> {
// 观察接收时间
log.info("通道: {}, 收到数据: {}", queueName, orderNum);
}, true);
return R.ok("操作成功");
}
/**
* 添加队列数据
*
* @param queueName 队列名
* @param orderNum 订单号
* @param time 延迟时间()
*/
@GetMapping("/add")
public R<Void> add(String queueName, String orderNum, Long time) {
QueueUtils.addDelayedQueueObject(queueName, orderNum, time, TimeUnit.SECONDS);
// 观察发送时间
log.info("通道: {} , 发送数据: {}", queueName, orderNum);
return R.ok("操作成功");
}
/**
* 删除队列数据
*
* @param queueName 队列名
* @param orderNum 订单号
*/
@GetMapping("/remove")
public R<Void> remove(String queueName, String orderNum) {
if (QueueUtils.removeDelayedQueueObject(queueName, orderNum)) {
log.info("通道: {} , 删除数据: {}", queueName, orderNum);
} else {
return R.fail("操作失败");
}
return R.ok("操作成功");
}
/**
* 销毁队列
*
* @param queueName 队列名
*/
@GetMapping("/destroy")
public R<Void> destroy(String queueName) {
// 用完了一定要销毁 否则会一直存在
QueueUtils.destroyDelayedQueue(queueName);
return R.ok("操作成功");
}
}

22
tp-demo/src/main/java/com/inscloudtech/demo/controller/queue/PriorityDemo.java

@ -1,22 +0,0 @@
package com.inscloudtech.demo.controller.queue;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* 实体类 注意不允许使用内部类 否则会找不到类
*
* @author inscloudtech
* @version 3.6.0
*/
@Data
@NoArgsConstructor
public class PriorityDemo implements Comparable<PriorityDemo> {
private String name;
private Integer orderNum;
@Override
public int compareTo(PriorityDemo other) {
return Integer.compare(getOrderNum(), other.getOrderNum());
}
}

89
tp-demo/src/main/java/com/inscloudtech/demo/controller/queue/PriorityQueueController.java

@ -1,89 +0,0 @@
package com.inscloudtech.demo.controller.queue;
import cn.hutool.core.util.RandomUtil;
import com.inscloudtech.common.core.domain.R;
import com.inscloudtech.common.utils.redis.QueueUtils;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* 优先队列 演示案例
* <p>
* 轻量级队列 重量级数据量 请使用 MQ
* <p>
* 集群测试通过 同一个消息只会被消费一次 做好事务补偿
* 集群测试流程 在其中一台发送数据 两端分别调用获取接口 一次获取一条
*
* @author inscloudtech
* @version 3.6.0
*/
@Slf4j
@RequiredArgsConstructor
@RestController
@RequestMapping("/demo/queue/priority")
public class PriorityQueueController {
/**
* 添加队列数据
*
* @param queueName 队列名
*/
@GetMapping("/add")
public R<Void> add(String queueName) {
// 用完了一定要销毁 否则会一直存在
boolean b = QueueUtils.destroyPriorityQueue(queueName);
log.info("通道: {} , 删除: {}", queueName, b);
for (int i = 0; i < 10; i++) {
int randomNum = RandomUtil.randomInt(10);
PriorityDemo data = new PriorityDemo();
data.setName("data-" + i);
data.setOrderNum(randomNum);
if (QueueUtils.addPriorityQueueObject(queueName, data)) {
log.info("通道: {} , 发送数据: {}", queueName, data);
} else {
log.info("通道: {} , 发送数据: {}, 发送失败", queueName, data);
}
}
return R.ok("操作成功");
}
/**
* 删除队列数据
*
* @param queueName 队列名
* @param name 对象名
* @param orderNum 排序号
*/
@GetMapping("/remove")
public R<Void> remove(String queueName, String name, Integer orderNum) {
PriorityDemo data = new PriorityDemo();
data.setName(name);
data.setOrderNum(orderNum);
if (QueueUtils.removePriorityQueueObject(queueName, data)) {
log.info("通道: {} , 删除数据: {}", queueName, data);
} else {
return R.fail("操作失败");
}
return R.ok("操作成功");
}
/**
* 获取队列数据
*
* @param queueName 队列名
*/
@GetMapping("/get")
public R<Void> get(String queueName) {
PriorityDemo data;
do {
data = QueueUtils.getPriorityQueueObject(queueName);
log.info("通道: {} , 获取数据: {}", queueName, data);
} while (data != null);
return R.ok("操作成功");
}
}

66
tp-demo/src/main/java/com/inscloudtech/demo/domain/TestDemo.java

@ -1,66 +0,0 @@
package com.inscloudtech.demo.domain;
import com.baomidou.mybatisplus.annotation.*;
import com.inscloudtech.common.core.domain.BaseEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* 测试单表对象 test_demo
*
* @author inscloudtech
* @date 2021-07-26
*/
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("test_demo")
public class TestDemo extends BaseEntity {
private static final long serialVersionUID = 1L;
/**
* 主键
*/
@TableId(value = "id")
private Long id;
/**
* 部门id
*/
private Long deptId;
/**
* 用户id
*/
private Long userId;
/**
* 排序号
*/
@OrderBy(asc = false, sort = 1)
private Integer orderNum;
/**
* key键
*/
private String testKey;
/**
*
*/
private String value;
/**
* 版本
*/
@Version
private Long version;
/**
* 删除标志
*/
@TableLogic
private Long delFlag;
}

29
tp-demo/src/main/java/com/inscloudtech/demo/domain/TestDemoEncrypt.java

@ -1,29 +0,0 @@
package com.inscloudtech.demo.domain;
import com.baomidou.mybatisplus.annotation.TableName;
import com.inscloudtech.common.annotation.EncryptField;
import com.inscloudtech.common.enums.AlgorithmType;
import lombok.Data;
import lombok.EqualsAndHashCode;
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("test_demo")
public class TestDemoEncrypt extends TestDemo {
/**
* key键
*/
// @EncryptField(algorithm=AlgorithmType.SM2, privateKey = "MIGTAgEAMBMGByqGSM49AgEGCCqBHM9VAYItBHkwdwIBAQQgZSlOvw8FBiH+aFJWLYZP/VRjg9wjfRarTkGBZd/T3N+gCgYIKoEcz1UBgi2hRANCAAR5DGuQwJqkxnbCsP+iPSDoHWIF4RwcR5EsSvT8QPxO1wRkR2IhCkzvRb32x2CUgJFdvoqVqfApFDPZzShqzBwX", publicKey = "MFkwEwYHKoZIzj0CAQYIKoEcz1UBgi0DQgAEeQxrkMCapMZ2wrD/oj0g6B1iBeEcHEeRLEr0/ED8TtcEZEdiIQpM70W99sdglICRXb6KlanwKRQz2c0oaswcFw==")
@EncryptField(algorithm = AlgorithmType.RSA, privateKey = "MIICdQIBADANBgkqhkiG9w0BAQEFAASCAl8wggJbAgEAAoGBANBBEeueWlXlkkj2+WY5l+IWe42d8b5K28g+G/CFKC/yYAEHtqGlCsBOrb+YBkG9mPzmuYA/n9k0NFIc8E8yY5vZQaroyFBrTTWEzG9RY2f7Y3svVyybs6jpXSUs4xff8abo7wL1Y/wUaeatTViamxYnyTvdTmLm3d+JjRij68rxAgMBAAECgYAB0TnhXraSopwIVRfmboea1b0upl+BUdTJcmci412UjrKr5aE695ZLPkXbFXijVu7HJlyyv94NVUdaMACV7Ku/S2RuNB70M7YJm8rAjHFC3/i2ZeIM60h1Ziy4QKv0XM3pRATlDCDNhC1WUrtQCQSgU8kcp6eUUppruOqDzcY04QJBAPm9+sBP9CwDRgy3e5+V8aZtJkwDstb0lVVV/KY890cydVxiCwvX3fqVnxKMlb+x0YtH0sb9v+71xvK2lGobaRECQQDVePU6r/cCEfpc+nkWF6osAH1f8Mux3rYv2DoBGvaPzV2BGfsLed4neRfCwWNCKvGPCdW+L0xMJg8+RwaoBUPhAkAT5kViqXxFPYWJYd1h2+rDXhMdH3ZSlm6HvDBDdrwlWinr0Iwcx3iSjPV93uHXwm118aUj4fg3LDJMCKxOwBxhAkByrQXfvwOMYygBprRBf/j0plazoWFrbd6lGR0f1uI5IfNnFRPdeFw1DEINZ2Hw+6zEUF44SqRMC+4IYJNc02dBAkBCgy7RvfyV/A7N6kKXxTHauY0v6XwSSvpeKtRJkbIcRWOdIYvaHO9L7cklj3vIEdwjSUp9K4VTBYYlmAz1xh03", publicKey = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDQQRHrnlpV5ZJI9vlmOZfiFnuNnfG+StvIPhvwhSgv8mABB7ahpQrATq2/mAZBvZj85rmAP5/ZNDRSHPBPMmOb2UGq6MhQa001hMxvUWNn+2N7L1csm7Oo6V0lLOMX3/Gm6O8C9WP8FGnmrU1YmpsWJ8k73U5i5t3fiY0Yo+vK8QIDAQAB")
private String testKey;
/**
*
*/
// @EncryptField // 什么也不写走默认yml配置
// @EncryptField(algorithm = AlgorithmType.SM4, password = "10rfylhtccpuyke5")
@EncryptField(algorithm = AlgorithmType.AES, password = "10rfylhtccpuyke5")
private String value;
}

58
tp-demo/src/main/java/com/inscloudtech/demo/domain/TestTree.java

@ -1,58 +0,0 @@
package com.inscloudtech.demo.domain;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableLogic;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.annotation.Version;
import com.inscloudtech.common.core.domain.TreeEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* 测试树表对象 test_tree
*
* @author inscloudtech
* @date 2021-07-26
*/
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("test_tree")
public class TestTree extends TreeEntity<TestTree> {
private static final long serialVersionUID = 1L;
/**
* 主键
*/
@TableId(value = "id")
private Long id;
/**
* 部门id
*/
private Long deptId;
/**
* 用户id
*/
private Long userId;
/**
* 树节点名
*/
private String treeName;
/**
* 版本
*/
@Version
private Long version;
/**
* 删除标志
*/
@TableLogic
private Long delFlag;
}

59
tp-demo/src/main/java/com/inscloudtech/demo/domain/bo/TestDemoBo.java

@ -1,59 +0,0 @@
package com.inscloudtech.demo.domain.bo;
import com.inscloudtech.common.core.domain.BaseEntity;
import com.inscloudtech.common.core.validate.AddGroup;
import com.inscloudtech.common.core.validate.EditGroup;
import lombok.Data;
import lombok.EqualsAndHashCode;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
/**
* 测试单表业务对象 test_demo
*
* @author inscloudtech
* @date 2021-07-26
*/
@Data
@EqualsAndHashCode(callSuper = true)
public class TestDemoBo extends BaseEntity {
/**
* 主键
*/
@NotNull(message = "主键不能为空", groups = {EditGroup.class})
private Long id;
/**
* 部门id
*/
@NotNull(message = "部门id不能为空", groups = {AddGroup.class, EditGroup.class})
private Long deptId;
/**
* 用户id
*/
@NotNull(message = "用户id不能为空", groups = {AddGroup.class, EditGroup.class})
private Long userId;
/**
* 排序号
*/
@NotNull(message = "排序号不能为空", groups = {AddGroup.class, EditGroup.class})
private Integer orderNum;
/**
* key键
*/
@NotBlank(message = "key键不能为空", groups = {AddGroup.class, EditGroup.class})
private String testKey;
/**
*
*/
@NotBlank(message = "值不能为空", groups = {AddGroup.class, EditGroup.class})
private String value;
}

53
tp-demo/src/main/java/com/inscloudtech/demo/domain/bo/TestDemoImportVo.java

@ -1,53 +0,0 @@
package com.inscloudtech.demo.domain.bo;
import com.alibaba.excel.annotation.ExcelProperty;
import lombok.Data;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
/**
* 测试单表业务对象 test_demo
*
* @author inscloudtech
* @date 2021-07-26
*/
@Data
public class TestDemoImportVo {
/**
* 部门id
*/
@NotNull(message = "部门id不能为空")
@ExcelProperty(value = "部门id")
private Long deptId;
/**
* 用户id
*/
@NotNull(message = "用户id不能为空")
@ExcelProperty(value = "用户id")
private Long userId;
/**
* 排序号
*/
@NotNull(message = "排序号不能为空")
@ExcelProperty(value = "排序号")
private Long orderNum;
/**
* key键
*/
@NotBlank(message = "key键不能为空")
@ExcelProperty(value = "key键")
private String testKey;
/**
*
*/
@NotBlank(message = "值不能为空")
@ExcelProperty(value = "值")
private String value;
}

47
tp-demo/src/main/java/com/inscloudtech/demo/domain/bo/TestTreeBo.java

@ -1,47 +0,0 @@
package com.inscloudtech.demo.domain.bo;
import com.inscloudtech.common.core.domain.TreeEntity;
import com.inscloudtech.common.core.validate.AddGroup;
import com.inscloudtech.common.core.validate.EditGroup;
import lombok.Data;
import lombok.EqualsAndHashCode;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
/**
* 测试树表业务对象 test_tree
*
* @author inscloudtech
* @date 2021-07-26
*/
@Data
@EqualsAndHashCode(callSuper = true)
public class TestTreeBo extends TreeEntity<TestTreeBo> {
/**
* 主键
*/
@NotNull(message = "主键不能为空", groups = {EditGroup.class})
private Long id;
/**
* 部门id
*/
@NotNull(message = "部门id不能为空", groups = {AddGroup.class, EditGroup.class})
private Long deptId;
/**
* 用户id
*/
@NotNull(message = "用户id不能为空", groups = {AddGroup.class, EditGroup.class})
private Long userId;
/**
* 树节点名
*/
@NotBlank(message = "树节点名不能为空", groups = {AddGroup.class, EditGroup.class})
private String treeName;
}

1
tp-demo/src/main/java/com/inscloudtech/demo/domain/package-info.java

@ -1 +0,0 @@
package com.inscloudtech.demo.domain;

119
tp-demo/src/main/java/com/inscloudtech/demo/domain/vo/ExportDemoVo.java

@ -1,119 +0,0 @@
package com.inscloudtech.demo.domain.vo;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty;
import com.inscloudtech.common.annotation.ExcelDictFormat;
import com.inscloudtech.common.annotation.ExcelEnumFormat;
import com.inscloudtech.common.convert.ExcelDictConvert;
import com.inscloudtech.common.convert.ExcelEnumConvert;
import com.inscloudtech.common.core.validate.AddGroup;
import com.inscloudtech.common.core.validate.EditGroup;
import com.inscloudtech.common.enums.UserStatus;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
/**
* 带有下拉选的Excel导出
*
* @author Emil.Zhang
*/
@Data
@ExcelIgnoreUnannotated
@AllArgsConstructor
@NoArgsConstructor
public class ExportDemoVo {
private static final long serialVersionUID = 1L;
/**
* 用户昵称
*/
@ExcelProperty(value = "用户名", index = 0)
@NotEmpty(message = "用户名不能为空", groups = AddGroup.class)
private String nickName;
/**
* 用户类型
* </p>
* 使用ExcelEnumFormat注解需要进行下拉选的部分
*/
@ExcelProperty(value = "用户类型", index = 1, converter = ExcelEnumConvert.class)
@ExcelEnumFormat(enumClass = UserStatus.class, textField = "info")
@NotEmpty(message = "用户类型不能为空", groups = AddGroup.class)
private String userStatus;
/**
* 性别
* <p>
* 使用ExcelDictFormat注解需要进行下拉选的部分
*/
@ExcelProperty(value = "性别", index = 2, converter = ExcelDictConvert.class)
@ExcelDictFormat(dictType = "sys_user_sex")
@NotEmpty(message = "性别不能为空", groups = AddGroup.class)
private String gender;
/**
* 手机号
*/
@ExcelProperty(value = "手机号", index = 3)
@NotEmpty(message = "手机号不能为空", groups = AddGroup.class)
private String phoneNumber;
/**
* Email
*/
@ExcelProperty(value = "Email", index = 4)
@NotEmpty(message = "Email不能为空", groups = AddGroup.class)
private String email;
/**
*
* <p>
* 级联下拉仅判断是否选了
*/
@ExcelProperty(value = "省", index = 5)
@NotNull(message = "省不能为空", groups = AddGroup.class)
private String province;
/**
* 数据库中的省ID
* </p>
* 处理完毕后再判断是否市正确的值
*/
@NotNull(message = "请勿手动输入", groups = EditGroup.class)
private Integer provinceId;
/**
*
* <p>
* 级联下拉
*/
@ExcelProperty(value = "市", index = 6)
@NotNull(message = "市不能为空", groups = AddGroup.class)
private String city;
/**
* 数据库中的市ID
*/
@NotNull(message = "请勿手动输入", groups = EditGroup.class)
private Integer cityId;
/**
*
* <p>
* 级联下拉
*/
@ExcelProperty(value = "县", index = 7)
@NotNull(message = "县不能为空", groups = AddGroup.class)
private String area;
/**
* 数据库中的县ID
*/
@NotNull(message = "请勿手动输入", groups = EditGroup.class)
private Integer areaId;
}

83
tp-demo/src/main/java/com/inscloudtech/demo/domain/vo/TestDemoVo.java

@ -1,83 +0,0 @@
package com.inscloudtech.demo.domain.vo;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty;
import lombok.Data;
import java.util.Date;
/**
* 测试单表视图对象 test_demo
*
* @author inscloudtech
* @date 2021-07-26
*/
@Data
@ExcelIgnoreUnannotated
public class TestDemoVo {
private static final long serialVersionUID = 1L;
/**
* 主键
*/
@ExcelProperty(value = "主键")
private Long id;
/**
* 部门id
*/
@ExcelProperty(value = "部门id")
private Long deptId;
/**
* 用户id
*/
@ExcelProperty(value = "用户id")
private Long userId;
/**
* 排序号
*/
@ExcelProperty(value = "排序号")
private Integer orderNum;
/**
* key键
*/
@ExcelProperty(value = "key键")
private String testKey;
/**
*
*/
@ExcelProperty(value = "值")
private String value;
/**
* 创建时间
*/
@ExcelProperty(value = "创建时间")
private Date createTime;
/**
* 创建人
*/
@ExcelProperty(value = "创建人")
private String createBy;
/**
* 更新时间
*/
@ExcelProperty(value = "更新时间")
private Date updateTime;
/**
* 更新人
*/
@ExcelProperty(value = "更新人")
private String updateBy;
}

58
tp-demo/src/main/java/com/inscloudtech/demo/domain/vo/TestTreeVo.java

@ -1,58 +0,0 @@
package com.inscloudtech.demo.domain.vo;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty;
import lombok.Data;
import java.util.Date;
/**
* 测试树表视图对象 test_tree
*
* @author inscloudtech
* @date 2021-07-26
*/
@Data
@ExcelIgnoreUnannotated
public class TestTreeVo {
private static final long serialVersionUID = 1L;
/**
* 主键
*/
private Long id;
/**
* 父id
*/
@ExcelProperty(value = "父id")
private Long parentId;
/**
* 部门id
*/
@ExcelProperty(value = "部门id")
private Long deptId;
/**
* 用户id
*/
@ExcelProperty(value = "用户id")
private Long userId;
/**
* 树节点名
*/
@ExcelProperty(value = "树节点名")
private String treeName;
/**
* 创建时间
*/
@ExcelProperty(value = "创建时间")
private Date createTime;
}

68
tp-demo/src/main/java/com/inscloudtech/demo/listener/ExportDemoListener.java

@ -1,68 +0,0 @@
package com.inscloudtech.demo.listener;
import cn.hutool.core.util.NumberUtil;
import com.alibaba.excel.context.AnalysisContext;
import com.inscloudtech.common.core.validate.AddGroup;
import com.inscloudtech.common.core.validate.EditGroup;
import com.inscloudtech.common.excel.DefaultExcelListener;
import com.inscloudtech.common.excel.DropDownOptions;
import com.inscloudtech.common.utils.ValidatorUtils;
import com.inscloudtech.demo.domain.vo.ExportDemoVo;
import java.util.List;
/**
* Excel带下拉框的解析处理器
*
* @author Emil.Zhang
*/
public class ExportDemoListener extends DefaultExcelListener<ExportDemoVo> {
public ExportDemoListener() {
// 显示使用构造函数否则将导致空指针
super(true);
}
@Override
public void invoke(ExportDemoVo data, AnalysisContext context) {
// 先校验必填
ValidatorUtils.validate(data, AddGroup.class);
// 处理级联下拉的部分
String province = data.getProvince();
String city = data.getCity();
String area = data.getArea();
// 本行用户选择的省
List<String> thisRowSelectedProvinceOption = DropDownOptions.analyzeOptionValue(province);
if (thisRowSelectedProvinceOption.size() == 2) {
String provinceIdStr = thisRowSelectedProvinceOption.get(1);
if (NumberUtil.isNumber(provinceIdStr)) {
// 严格要求数据的话可以在这里做与数据库相关的判断
// 例如判断省信息是否在数据库中存在等建议结合RedisCache做缓存10s减少数据库调用
data.setProvinceId(Integer.parseInt(provinceIdStr));
}
}
// 本行用户选择的市
List<String> thisRowSelectedCityOption = DropDownOptions.analyzeOptionValue(city);
if (thisRowSelectedCityOption.size() == 2) {
String cityIdStr = thisRowSelectedCityOption.get(1);
if (NumberUtil.isNumber(cityIdStr)) {
data.setCityId(Integer.parseInt(cityIdStr));
}
}
// 本行用户选择的县
List<String> thisRowSelectedAreaOption = DropDownOptions.analyzeOptionValue(area);
if (thisRowSelectedAreaOption.size() == 2) {
String areaIdStr = thisRowSelectedAreaOption.get(1);
if (NumberUtil.isNumber(areaIdStr)) {
data.setAreaId(Integer.parseInt(areaIdStr));
}
}
// 处理完毕以后判断是否符合规则
ValidatorUtils.validate(data, EditGroup.class);
// 添加到处理结果中
getExcelResult().getList().add(data);
}
}

13
tp-demo/src/main/java/com/inscloudtech/demo/mapper/TestDemoEncryptMapper.java

@ -1,13 +0,0 @@
package com.inscloudtech.demo.mapper;
import com.inscloudtech.common.core.mapper.BaseMapperPlus;
import com.inscloudtech.demo.domain.TestDemoEncrypt;
/**
* 测试加密功能
*
* @author inscloudtech
*/
public interface TestDemoEncryptMapper extends BaseMapperPlus<TestDemoEncryptMapper, TestDemoEncrypt, TestDemoEncrypt> {
}

58
tp-demo/src/main/java/com/inscloudtech/demo/mapper/TestDemoMapper.java

@ -1,58 +0,0 @@
package com.inscloudtech.demo.mapper;
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Constants;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.inscloudtech.common.annotation.DataColumn;
import com.inscloudtech.common.annotation.DataPermission;
import com.inscloudtech.common.core.mapper.BaseMapperPlus;
import com.inscloudtech.demo.domain.TestDemo;
import com.inscloudtech.demo.domain.vo.TestDemoVo;
import org.apache.ibatis.annotations.Param;
import java.util.Collection;
import java.util.List;
/**
* 测试单表Mapper接口
*
* @author inscloudtech
* @date 2021-07-26
*/
public interface TestDemoMapper extends BaseMapperPlus<TestDemoMapper, TestDemo, TestDemoVo> {
@DataPermission({
@DataColumn(key = "deptName", value = "dept_id"),
@DataColumn(key = "userName", value = "user_id")
})
Page<TestDemoVo> customPageList(@Param("page") Page<TestDemo> page, @Param("ew") Wrapper<TestDemo> wrapper);
@Override
@DataPermission({
@DataColumn(key = "deptName", value = "dept_id"),
@DataColumn(key = "userName", value = "user_id")
})
List<TestDemo> selectList(IPage<TestDemo> page, @Param(Constants.WRAPPER) Wrapper<TestDemo> queryWrapper);
@Override
@DataPermission({
@DataColumn(key = "deptName", value = "dept_id"),
@DataColumn(key = "userName", value = "user_id")
})
List<TestDemo> selectList(@Param(Constants.WRAPPER) Wrapper<TestDemo> queryWrapper);
@Override
@DataPermission({
@DataColumn(key = "deptName", value = "dept_id"),
@DataColumn(key = "userName", value = "user_id")
})
int updateById(@Param(Constants.ENTITY) TestDemo entity);
@Override
@DataPermission({
@DataColumn(key = "deptName", value = "dept_id"),
@DataColumn(key = "userName", value = "user_id")
})
int deleteBatchIds(@Param(Constants.COLL) Collection<?> idList);
}

21
tp-demo/src/main/java/com/inscloudtech/demo/mapper/TestTreeMapper.java

@ -1,21 +0,0 @@
package com.inscloudtech.demo.mapper;
import com.inscloudtech.common.annotation.DataColumn;
import com.inscloudtech.common.annotation.DataPermission;
import com.inscloudtech.common.core.mapper.BaseMapperPlus;
import com.inscloudtech.demo.domain.TestTree;
import com.inscloudtech.demo.domain.vo.TestTreeVo;
/**
* 测试树表Mapper接口
*
* @author inscloudtech
* @date 2021-07-26
*/
@DataPermission({
@DataColumn(key = "deptName", value = "dept_id"),
@DataColumn(key = "userName", value = "user_id")
})
public interface TestTreeMapper extends BaseMapperPlus<TestTreeMapper, TestTree, TestTreeVo> {
}

1
tp-demo/src/main/java/com/inscloudtech/demo/mapper/package-info.java

@ -1 +0,0 @@
package com.inscloudtech.demo.mapper;

18
tp-demo/src/main/java/com/inscloudtech/demo/service/IExportExcelService.java

@ -1,18 +0,0 @@
package com.inscloudtech.demo.service;
import javax.servlet.http.HttpServletResponse;
/**
* 导出下拉框Excel示例
*
* @author Emil.Zhang
*/
public interface IExportExcelService {
/**
* 导出下拉框
*
* @param response /
*/
void exportWithOptions(HttpServletResponse response);
}

71
tp-demo/src/main/java/com/inscloudtech/demo/service/ITestDemoService.java

@ -1,71 +0,0 @@
package com.inscloudtech.demo.service;
import com.inscloudtech.common.core.domain.PageQuery;
import com.inscloudtech.common.core.page.TableDataInfo;
import com.inscloudtech.demo.domain.TestDemo;
import com.inscloudtech.demo.domain.bo.TestDemoBo;
import com.inscloudtech.demo.domain.vo.TestDemoVo;
import java.util.Collection;
import java.util.List;
/**
* 测试单表Service接口
*
* @author inscloudtech
* @date 2021-07-26
*/
public interface ITestDemoService {
/**
* 查询单个
*
* @return
*/
TestDemoVo queryById(Long id);
/**
* 查询列表
*/
TableDataInfo<TestDemoVo> queryPageList(TestDemoBo bo, PageQuery pageQuery);
/**
* 自定义分页查询
*/
TableDataInfo<TestDemoVo> customPageList(TestDemoBo bo, PageQuery pageQuery);
/**
* 查询列表
*/
List<TestDemoVo> queryList(TestDemoBo bo);
/**
* 根据新增业务对象插入测试单表
*
* @param bo 测试单表新增业务对象
* @return
*/
Boolean insertByBo(TestDemoBo bo);
/**
* 根据编辑业务对象修改测试单表
*
* @param bo 测试单表编辑业务对象
* @return
*/
Boolean updateByBo(TestDemoBo bo);
/**
* 校验并删除数据
*
* @param ids 主键集合
* @param isValid 是否校验,true-删除前校验,false-不校验
* @return
*/
Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
/**
* 批量保存
*/
Boolean saveBatch(List<TestDemo> list);
}

52
tp-demo/src/main/java/com/inscloudtech/demo/service/ITestTreeService.java

@ -1,52 +0,0 @@
package com.inscloudtech.demo.service;
import com.inscloudtech.demo.domain.bo.TestTreeBo;
import com.inscloudtech.demo.domain.vo.TestTreeVo;
import java.util.Collection;
import java.util.List;
/**
* 测试树表Service接口
*
* @author inscloudtech
* @date 2021-07-26
*/
public interface ITestTreeService {
/**
* 查询单个
*
* @return
*/
TestTreeVo queryById(Long id);
/**
* 查询列表
*/
List<TestTreeVo> queryList(TestTreeBo bo);
/**
* 根据新增业务对象插入测试树表
*
* @param bo 测试树表新增业务对象
* @return
*/
Boolean insertByBo(TestTreeBo bo);
/**
* 根据编辑业务对象修改测试树表
*
* @param bo 测试树表编辑业务对象
* @return
*/
Boolean updateByBo(TestTreeBo bo);
/**
* 校验并删除数据
*
* @param ids 主键集合
* @param isValid 是否校验,true-删除前校验,false-不校验
* @return
*/
Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
}

222
tp-demo/src/main/java/com/inscloudtech/demo/service/impl/ExportExcelServiceImpl.java

@ -1,222 +0,0 @@
package com.inscloudtech.demo.service.impl;
import cn.hutool.core.util.StrUtil;
import com.inscloudtech.common.enums.UserStatus;
import com.inscloudtech.common.excel.DropDownOptions;
import com.inscloudtech.common.utils.StreamUtils;
import com.inscloudtech.common.utils.poi.ExcelUtil;
import com.inscloudtech.demo.domain.vo.ExportDemoVo;
import com.inscloudtech.demo.service.IExportExcelService;
import lombok.Data;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import javax.servlet.http.HttpServletResponse;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
* 导出下拉框Excel示例
*
* @author Emil.Zhang
*/
@Service
@RequiredArgsConstructor
public class ExportExcelServiceImpl implements IExportExcelService {
@Override
public void exportWithOptions(HttpServletResponse response) {
// 创建表格数据业务中一般通过数据库查询
List<ExportDemoVo> excelDataList = new ArrayList<>();
for (int i = 0; i < 3; i++) {
// 模拟数据库中的一条数据
ExportDemoVo everyRowData = new ExportDemoVo();
everyRowData.setNickName("用户-" + i);
everyRowData.setUserStatus(UserStatus.OK.getCode());
everyRowData.setGender("1");
everyRowData.setPhoneNumber(String.format("175%08d", i));
everyRowData.setEmail(String.format("175%08d", i) + "@163.com");
everyRowData.setProvinceId(i);
everyRowData.setCityId(i);
everyRowData.setAreaId(i);
excelDataList.add(everyRowData);
}
// 通过@ExcelIgnoreUnannotated配合@ExcelProperty合理显示需要的列
// 并通过@DropDown注解指定下拉值或者通过创建ExcelOptions来指定下拉框
// 使用ExcelOptions时建议指定列index防止出现下拉列解析不对齐
// 首先从数据库中查询下拉框内的可选项
// 这里模拟查询结果
List<DemoCityData> provinceList = getProvinceList(),
cityList = getCityList(provinceList),
areaList = getAreaList(cityList);
int provinceIndex = 5, cityIndex = 6, areaIndex = 7;
DropDownOptions provinceToCity = DropDownOptions.buildLinkedOptions(
provinceList,
provinceIndex,
cityList,
cityIndex,
DemoCityData::getId,
DemoCityData::getPid,
everyOptions -> DropDownOptions.createOptionValue(
everyOptions.getName(),
everyOptions.getId()
)
);
DropDownOptions cityToArea = DropDownOptions.buildLinkedOptions(
cityList,
cityIndex,
areaList,
areaIndex,
DemoCityData::getId,
DemoCityData::getPid,
everyOptions -> DropDownOptions.createOptionValue(
everyOptions.getName(),
everyOptions.getId()
)
);
// 把所有的下拉框存储
List<DropDownOptions> options = new ArrayList<>();
options.add(provinceToCity);
options.add(cityToArea);
// 到此为止所有的下拉框可选项已全部配置完毕
// 接下来需要将Excel中的展示数据转换为对应的下拉选
List<ExportDemoVo> outList = StreamUtils.toList(excelDataList, everyRowData -> {
// 只需要处理没有使用@ExcelDictFormat注解的下拉框
// 一般来说可以直接在数据库查询即查询出省市县信息这里通过模拟操作赋值
everyRowData.setProvince(buildOptions(provinceList, everyRowData.getProvinceId()));
everyRowData.setCity(buildOptions(cityList, everyRowData.getCityId()));
everyRowData.setArea(buildOptions(areaList, everyRowData.getAreaId()));
return everyRowData;
});
ExcelUtil.exportExcel(outList, "下拉框示例", ExportDemoVo.class, response, options);
}
private String buildOptions(List<DemoCityData> cityDataList, Integer id) {
Map<Integer, List<DemoCityData>> groupByIdMap =
cityDataList.stream().collect(Collectors.groupingBy(DemoCityData::getId));
if (groupByIdMap.containsKey(id)) {
DemoCityData demoCityData = groupByIdMap.get(id).get(0);
return DropDownOptions.createOptionValue(demoCityData.getName(), demoCityData.getId());
} else {
return StrUtil.EMPTY;
}
}
/**
* 模拟查询数据库操作
*
* @return /
*/
private List<DemoCityData> getProvinceList() {
List<DemoCityData> provinceList = new ArrayList<>();
// 实际业务中一般采用数据库读取的形式这里直接拼接创建
provinceList.add(new DemoCityData(0, null, "安徽省"));
provinceList.add(new DemoCityData(1, null, "江苏省"));
return provinceList;
}
/**
* 模拟查找数据库操作需要连带查询出省的数据
*
* @param provinceList 模拟的父省数据
* @return /
*/
private List<DemoCityData> getCityList(List<DemoCityData> provinceList) {
List<DemoCityData> cityList = new ArrayList<>();
// 实际业务中一般采用数据库读取的形式这里直接拼接创建
cityList.add(new DemoCityData(0, 0, "合肥市"));
cityList.add(new DemoCityData(1, 0, "芜湖市"));
cityList.add(new DemoCityData(2, 1, "南京市"));
cityList.add(new DemoCityData(3, 1, "无锡市"));
cityList.add(new DemoCityData(4, 1, "徐州市"));
selectParentData(provinceList, cityList);
return cityList;
}
/**
* 模拟查找数据库操作需要连带查询出市的数据
*
* @param cityList 模拟的父市数据
* @return /
*/
private List<DemoCityData> getAreaList(List<DemoCityData> cityList) {
List<DemoCityData> areaList = new ArrayList<>();
// 实际业务中一般采用数据库读取的形式这里直接拼接创建
areaList.add(new DemoCityData(0, 0, "瑶海区"));
areaList.add(new DemoCityData(1, 0, "庐江区"));
areaList.add(new DemoCityData(2, 1, "南宁县"));
areaList.add(new DemoCityData(3, 1, "镜湖区"));
areaList.add(new DemoCityData(4, 2, "玄武区"));
areaList.add(new DemoCityData(5, 2, "秦淮区"));
areaList.add(new DemoCityData(6, 3, "宜兴市"));
areaList.add(new DemoCityData(7, 3, "新吴区"));
areaList.add(new DemoCityData(8, 4, "鼓楼区"));
areaList.add(new DemoCityData(9, 4, "丰县"));
selectParentData(cityList, areaList);
return areaList;
}
/**
* 模拟数据库的查询父数据操作
*
* @param parentList /
* @param sonList /
*/
private void selectParentData(List<DemoCityData> parentList, List<DemoCityData> sonList) {
Map<Integer, List<DemoCityData>> parentGroupByIdMap =
parentList.stream().collect(Collectors.groupingBy(DemoCityData::getId));
sonList.forEach(everySon -> {
if (parentGroupByIdMap.containsKey(everySon.getPid())) {
everySon.setPData(parentGroupByIdMap.get(everySon.getPid()).get(0));
}
});
}
/**
* 模拟的数据库省市县
*/
@Data
private static class DemoCityData {
/**
* 数据库id字段
*/
private Integer id;
/**
* 数据库pid字段
*/
private Integer pid;
/**
* 数据库name字段
*/
private String name;
/**
* MyBatisPlus连带查询父数据
*/
private DemoCityData pData;
public DemoCityData(Integer id, Integer pid, String name) {
this.id = id;
this.pid = pid;
this.name = name;
}
}
}

110
tp-demo/src/main/java/com/inscloudtech/demo/service/impl/TestDemoServiceImpl.java

@ -1,110 +0,0 @@
package com.inscloudtech.demo.service.impl;
import cn.hutool.core.bean.BeanUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.inscloudtech.common.core.domain.PageQuery;
import com.inscloudtech.common.core.page.TableDataInfo;
import com.inscloudtech.common.utils.StringUtils;
import com.inscloudtech.demo.domain.TestDemo;
import com.inscloudtech.demo.domain.bo.TestDemoBo;
import com.inscloudtech.demo.domain.vo.TestDemoVo;
import com.inscloudtech.demo.mapper.TestDemoMapper;
import com.inscloudtech.demo.service.ITestDemoService;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import java.util.Collection;
import java.util.List;
import java.util.Map;
/**
* 测试单表Service业务层处理
*
* @author inscloudtech
* @date 2021-07-26
*/
@RequiredArgsConstructor
@Service
public class TestDemoServiceImpl implements ITestDemoService {
private final TestDemoMapper baseMapper;
@Override
public TestDemoVo queryById(Long id) {
return baseMapper.selectVoById(id);
}
@Override
public TableDataInfo<TestDemoVo> queryPageList(TestDemoBo bo, PageQuery pageQuery) {
LambdaQueryWrapper<TestDemo> lqw = buildQueryWrapper(bo);
Page<TestDemoVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
return TableDataInfo.build(result);
}
/**
* 自定义分页查询
*/
@Override
public TableDataInfo<TestDemoVo> customPageList(TestDemoBo bo, PageQuery pageQuery) {
LambdaQueryWrapper<TestDemo> lqw = buildQueryWrapper(bo);
Page<TestDemoVo> result = baseMapper.customPageList(pageQuery.build(), lqw);
return TableDataInfo.build(result);
}
@Override
public List<TestDemoVo> queryList(TestDemoBo bo) {
return baseMapper.selectVoList(buildQueryWrapper(bo));
}
private LambdaQueryWrapper<TestDemo> buildQueryWrapper(TestDemoBo bo) {
Map<String, Object> params = bo.getParams();
LambdaQueryWrapper<TestDemo> lqw = Wrappers.lambdaQuery();
lqw.like(StringUtils.isNotBlank(bo.getTestKey()), TestDemo::getTestKey, bo.getTestKey());
lqw.eq(StringUtils.isNotBlank(bo.getValue()), TestDemo::getValue, bo.getValue());
lqw.between(params.get("beginCreateTime") != null && params.get("endCreateTime") != null,
TestDemo::getCreateTime, params.get("beginCreateTime"), params.get("endCreateTime"));
return lqw;
}
@Override
public Boolean insertByBo(TestDemoBo bo) {
TestDemo add = BeanUtil.toBean(bo, TestDemo.class);
validEntityBeforeSave(add);
boolean flag = baseMapper.insert(add) > 0;
if (flag) {
bo.setId(add.getId());
}
return flag;
}
@Override
public Boolean updateByBo(TestDemoBo bo) {
TestDemo update = BeanUtil.toBean(bo, TestDemo.class);
validEntityBeforeSave(update);
return baseMapper.updateById(update) > 0;
}
/**
* 保存前的数据校验
*
* @param entity 实体类数据
*/
private void validEntityBeforeSave(TestDemo entity) {
//TODO 做一些数据校验,如唯一约束
}
@Override
public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
if (isValid) {
//TODO 做一些业务上的校验,判断是否需要校验
}
return baseMapper.deleteBatchIds(ids) > 0;
}
@Override
public Boolean saveBatch(List<TestDemo> list) {
return baseMapper.insertBatch(list);
}
}

87
tp-demo/src/main/java/com/inscloudtech/demo/service/impl/TestTreeServiceImpl.java

@ -1,87 +0,0 @@
package com.inscloudtech.demo.service.impl;
import cn.hutool.core.bean.BeanUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.inscloudtech.common.utils.StringUtils;
import com.inscloudtech.demo.domain.TestTree;
import com.inscloudtech.demo.domain.bo.TestTreeBo;
import com.inscloudtech.demo.domain.vo.TestTreeVo;
import com.inscloudtech.demo.mapper.TestTreeMapper;
import com.inscloudtech.demo.service.ITestTreeService;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import java.util.Collection;
import java.util.List;
import java.util.Map;
/**
* 测试树表Service业务层处理
*
* @author inscloudtech
* @date 2021-07-26
*/
// @DS("slave") // 切换从库查询
@RequiredArgsConstructor
@Service
public class TestTreeServiceImpl implements ITestTreeService {
private final TestTreeMapper baseMapper;
@Override
public TestTreeVo queryById(Long id) {
return baseMapper.selectVoById(id);
}
// @DS("slave") // 切换从库查询
@Override
public List<TestTreeVo> queryList(TestTreeBo bo) {
LambdaQueryWrapper<TestTree> lqw = buildQueryWrapper(bo);
return baseMapper.selectVoList(lqw);
}
private LambdaQueryWrapper<TestTree> buildQueryWrapper(TestTreeBo bo) {
Map<String, Object> params = bo.getParams();
LambdaQueryWrapper<TestTree> lqw = Wrappers.lambdaQuery();
lqw.like(StringUtils.isNotBlank(bo.getTreeName()), TestTree::getTreeName, bo.getTreeName());
lqw.between(params.get("beginCreateTime") != null && params.get("endCreateTime") != null,
TestTree::getCreateTime, params.get("beginCreateTime"), params.get("endCreateTime"));
return lqw;
}
@Override
public Boolean insertByBo(TestTreeBo bo) {
TestTree add = BeanUtil.toBean(bo, TestTree.class);
validEntityBeforeSave(add);
boolean flag = baseMapper.insert(add) > 0;
if (flag) {
bo.setId(add.getId());
}
return flag;
}
@Override
public Boolean updateByBo(TestTreeBo bo) {
TestTree update = BeanUtil.toBean(bo, TestTree.class);
validEntityBeforeSave(update);
return baseMapper.updateById(update) > 0;
}
/**
* 保存前的数据校验
*
* @param entity 实体类数据
*/
private void validEntityBeforeSave(TestTree entity) {
//TODO 做一些数据校验,如唯一约束
}
@Override
public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
if (isValid) {
//TODO 做一些业务上的校验,判断是否需要校验
}
return baseMapper.deleteBatchIds(ids) > 0;
}
}

1
tp-demo/src/main/java/com/inscloudtech/demo/service/impl/package-info.java

@ -1 +0,0 @@
package com.inscloudtech.demo.service.impl;

1
tp-demo/src/main/java/com/inscloudtech/demo/service/package-info.java

@ -1 +0,0 @@
package com.inscloudtech.demo.service;

BIN
tp-demo/src/main/resources/excel/单列表.xlsx

BIN
tp-demo/src/main/resources/excel/多列表.xlsx

26
tp-demo/src/main/resources/mapper/demo/TestDemoMapper.xml

@ -1,26 +0,0 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.inscloudtech.demo.mapper.TestDemoMapper">
<resultMap type="com.inscloudtech.demo.domain.TestDemo" id="TestDemoResult">
<result property="id" column="id"/>
<result property="deptId" column="dept_id"/>
<result property="userId" column="user_id"/>
<result property="orderNum" column="order_num"/>
<result property="testKey" column="test_key"/>
<result property="value" column="value"/>
<result property="version" column="version"/>
<result property="createTime" column="create_time"/>
<result property="createBy" column="create_by"/>
<result property="updateTime" column="update_time"/>
<result property="updateBy" column="update_by"/>
<result property="delFlag" column="del_flag"/>
</resultMap>
<select id="customPageList" resultType="com.inscloudtech.demo.domain.vo.TestDemoVo">
SELECT * FROM test_demo ${ew.customSqlSegment}
</select>
</mapper>

3
tp-demo/src/main/resources/mapper/package-info.md

@ -1,3 +0,0 @@
java包使用 `.` 分割 resource 目录使用 `/` 分割
<br>
此文件目的 防止文件夹粘连找不到 `xml` 文件

20
tp-functional/src/main/java/com/inscloudtech/functional/controller/FuncCarApiController.java

@ -32,8 +32,6 @@ public class FuncCarApiController extends BaseController {
private final IFuncCarApiService iFuncCarApiService;
private final ProjectConfig projectConfig;
private final static String JMETER_FILE_NAME = "apache-jmeter.zip";
/**
@ -89,24 +87,6 @@ public class FuncCarApiController extends BaseController {
doDownLoad(JMETER_FILE_NAME,response);
}
void doDownLoad(String filename,HttpServletResponse response){
try {
if (!FileUtils.checkAllowDownload(filename)) {
throw new Exception(StringUtils.format("文件名称({})非法,不允许下载。 ", filename));
}
String realFileName = System.currentTimeMillis() + filename.substring(filename.indexOf("_") + 1);
String filePath = projectConfig.getDownloadPath() + filename;
response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE);
FileUtils.setAttachmentResponseHeader(response, realFileName);
FileUtils.writeBytes(filePath, response.getOutputStream());
// if (delete) {
// FileUtils.deleteFile(filePath);
// }
} catch (Exception e) {
e.printStackTrace();
}
}
}

19
tp-functional/src/main/java/com/inscloudtech/functional/controller/FuncCarMediaController.java

@ -2,6 +2,7 @@ package com.inscloudtech.functional.controller;
import com.inscloudtech.common.config.ProjectConfig;
import com.inscloudtech.common.core.controller.BaseController;
import com.inscloudtech.common.utils.DownLoadUtils;
import com.inscloudtech.common.utils.StringUtils;
import com.inscloudtech.common.utils.file.FileUtils;
import lombok.RequiredArgsConstructor;
@ -22,8 +23,6 @@ import javax.servlet.http.HttpServletResponse;
@RequestMapping("/functional/carMedia")
public class FuncCarMediaController extends BaseController {
private final ProjectConfig projectConfig;
private final static String FFMPEG_FILE_NAME = "ffmpeg.zip";
@ -36,21 +35,5 @@ public class FuncCarMediaController extends BaseController {
}
void doDownLoad(String filename,HttpServletResponse response){
try {
if (!FileUtils.checkAllowDownload(filename)) {
throw new Exception(StringUtils.format("文件名称({})非法,不允许下载。 ", filename));
}
String realFileName = System.currentTimeMillis() + filename.substring(filename.indexOf("_") + 1);
String filePath = projectConfig.getDownloadPath() + filename;
response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE);
FileUtils.setAttachmentResponseHeader(response, realFileName);
FileUtils.writeBytes(filePath, response.getOutputStream());
} catch (Exception e) {
e.printStackTrace();
}
}
}

36
tp-functional/src/main/java/com/inscloudtech/functional/controller/ToolDownLoadController.java

@ -30,12 +30,11 @@ import javax.servlet.http.HttpServletResponse;
@RequestMapping("/functional/toolDownLoad")
public class ToolDownLoadController extends BaseController {
private final ProjectConfig projectConfig;
private final static String CPU_SHIPEI_TEST_TOOL = "cpu_shipei_test_tool.zip";
private final static String CPU_SHIPEI_TEST_TIPS = "cpu_shipei_test_tips.zip";
private final static String MEDIA_INFO_TOOL = "media_info_tool.zip";
private final static String MEDIA_INFO_TOOL_TIPS = "media_info_tools_tips.zip";
/**
@ -54,25 +53,24 @@ public class ToolDownLoadController extends BaseController {
doDownLoad(CPU_SHIPEI_TEST_TIPS,response);
}
void doDownLoad(String filename,HttpServletResponse response){
try {
if (!FileUtils.checkAllowDownload(filename)) {
throw new Exception(StringUtils.format("文件名称({})非法,不允许下载。 ", filename));
/**
* 多媒体文件兼容性测试工具
*/
@GetMapping("/mediaInfoTool")
public void mediaInfoTool(HttpServletResponse response, HttpServletRequest request) {
doDownLoad(MEDIA_INFO_TOOL,response);
}
String realFileName = System.currentTimeMillis() + filename.substring(filename.indexOf("_") + 1);
String filePath = projectConfig.getDownloadPath() + filename;
response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE);
FileUtils.setAttachmentResponseHeader(response, realFileName);
FileUtils.writeBytes(filePath, response.getOutputStream());
// if (delete) {
// FileUtils.deleteFile(filePath);
// }
} catch (Exception e) {
e.printStackTrace();
}
/**
* 多媒体文件兼容性测试工具操作手册下载
*/
@GetMapping("/mediaInfoToolTips")
public void mediaInfoToolTips(HttpServletResponse response, HttpServletRequest request) {
doDownLoad(MEDIA_INFO_TOOL_TIPS,response);
}
}

4
tp-system/src/main/java/com/inscloudtech/system/runner/SystemApplicationRunner.java

@ -33,9 +33,9 @@ public class SystemApplicationRunner implements ApplicationRunner {
return;
}
configService.loadingConfigCache();
log.info("加载参数缓存数据成功");
// log.info("加载参数缓存数据成功");
dictTypeService.loadingDictCache();
log.info("加载字典缓存数据成功");
// log.info("加载字典缓存数据成功");
}
}

73
tp-system/src/main/java/com/inscloudtech/system/service/impl/SysOssServiceImpl.java

@ -4,15 +4,21 @@ import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.convert.Convert;
import cn.hutool.core.io.IoUtil;
import cn.hutool.core.util.ObjectUtil;
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.plugins.pagination.Page;
import com.inscloudtech.common.config.ProjectConfig;
import com.inscloudtech.common.constant.CacheNames;
import com.inscloudtech.common.core.domain.PageQuery;
import com.inscloudtech.common.core.page.TableDataInfo;
import com.inscloudtech.common.core.service.OssService;
import com.inscloudtech.common.exception.ServiceException;
import com.inscloudtech.common.helper.LoginHelper;
import com.inscloudtech.common.utils.DownLoadUtils;
import com.inscloudtech.common.utils.ServletUtils;
import com.inscloudtech.common.utils.StringUtils;
import com.inscloudtech.common.utils.file.FileUploadUtils;
import com.inscloudtech.common.utils.file.FileUtils;
import com.inscloudtech.common.utils.spring.SpringUtils;
import com.inscloudtech.oss.core.OssClient;
@ -25,19 +31,18 @@ import com.inscloudtech.system.domain.vo.SysOssVo;
import com.inscloudtech.system.mapper.SysOssMapper;
import com.inscloudtech.system.service.ISysOssService;
import lombok.RequiredArgsConstructor;
import lombok.SneakyThrows;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.*;
import java.util.stream.Collectors;
/**
@ -119,7 +124,8 @@ public class SysOssServiceImpl implements ISysOssService, OssService {
if (ObjectUtil.isNull(sysOss)) {
throw new ServiceException("文件数据不存在!");
}
FileUtils.setAttachmentResponseHeader(response, sysOss.getOriginalName());
this.downloadLocal(sysOss.getFileName(),sysOss.getOriginalName(),response);
/* FileUtils.setAttachmentResponseHeader(response, sysOss.getOriginalName());
response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE + "; charset=UTF-8");
OssClient storage = OssFactory.instance(sysOss.getService());
try(InputStream inputStream = storage.getObjectContent(sysOss.getUrl())) {
@ -128,24 +134,68 @@ public class SysOssServiceImpl implements ISysOssService, OssService {
response.setContentLength(available);
} catch (Exception e) {
throw new ServiceException(e.getMessage());
}*/
}
@SneakyThrows
public void downloadLocal(String fileName, String originalName, HttpServletResponse response){
if (!FileUtils.checkAllowDownload(fileName)) {
throw new RuntimeException(StrUtil.format("文件名称({})非法,不允许下载。 ", fileName));
}
String filePath = ProjectConfig.getUploadPath() + fileName;
response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE);
FileUtils.setAttachmentResponseHeader(response, originalName);
FileUtils.writeBytes(filePath, response.getOutputStream());
}
@Override
public SysOssVo upload(MultipartFile file) {
String originalfileName = file.getOriginalFilename();
String suffix = StringUtils.substring(originalfileName, originalfileName.lastIndexOf("."), originalfileName.length());
OssClient storage = OssFactory.instance();
UploadResult uploadResult;
UploadResult uploadResult = upload2Local(file);
// try {
// uploadResult = storage.uploadSuffix(file.getBytes(), suffix, file.getContentType());
// } catch (IOException e) {
// throw new ServiceException(e.getMessage());
// }
// 保存文件信息
return buildResultEntity(originalfileName, suffix, "local", uploadResult);
}
public UploadResult upload2Local(MultipartFile file) {
// 上传文件路径
String filePath = DownLoadUtils.getUploadPath();
// 上传并返回新文件名称
String fileName = null;
try {
uploadResult = storage.uploadSuffix(file.getBytes(), suffix, file.getContentType());
fileName = FileUploadUtils.upload(filePath, file);
} catch (IOException e) {
e.printStackTrace();
throw new ServiceException(e.getMessage());
}
// 保存文件信息
return buildResultEntity(originalfileName, suffix, storage.getConfigKey(), uploadResult);
String url = this.getUrl() + fileName;
if(fileName.contains("/profile/upload")){
fileName = fileName.replace("/profile/upload","");
}
return UploadResult.builder().url(url).filename(fileName).build();
}
/**
* 获取完整的请求路径包括域名端口上下文访问路径
*
* @return 服务地址
*/
public String getUrl() {
HttpServletRequest request = ServletUtils.getRequest();
StringBuffer url = request.getRequestURL();
String contextPath = request.getServletContext().getContextPath();
return url.delete(url.length() - request.getRequestURI().length(), url.length()).append(contextPath).toString();
}
@Override
public SysOssVo upload(File file) {
String originalfileName = file.getName();
@ -165,7 +215,8 @@ public class SysOssServiceImpl implements ISysOssService, OssService {
oss.setService(configKey);
baseMapper.insert(oss);
SysOssVo sysOssVo = BeanUtil.toBean(oss, SysOssVo.class);
return this.matchingUrl(sysOssVo);
return sysOssVo;
// return this.matchingUrl(sysOssVo);
}
@Override

Loading…
Cancel
Save