57 changed files with 155 additions and 2830 deletions
-
2tp-admin/src/main/java/com/inscloudtech/TestPlatformApplication.java
-
10tp-common/src/main/java/com/inscloudtech/common/config/ProjectConfig.java
-
8tp-common/src/main/java/com/inscloudtech/common/core/controller/BaseController.java
-
56tp-common/src/main/java/com/inscloudtech/common/utils/DownLoadUtils.java
-
4tp-common/src/main/java/com/inscloudtech/common/utils/file/FileUploadUtils.java
-
33tp-demo/pom.xml
-
52tp-demo/src/main/java/com/inscloudtech/demo/controller/MailController.java
-
95tp-demo/src/main/java/com/inscloudtech/demo/controller/RedisCacheController.java
-
71tp-demo/src/main/java/com/inscloudtech/demo/controller/RedisLockController.java
-
47tp-demo/src/main/java/com/inscloudtech/demo/controller/RedisPubSubController.java
-
64tp-demo/src/main/java/com/inscloudtech/demo/controller/RedisRateLimiterController.java
-
60tp-demo/src/main/java/com/inscloudtech/demo/controller/SmsController.java
-
31tp-demo/src/main/java/com/inscloudtech/demo/controller/Swagger3DemoController.java
-
90tp-demo/src/main/java/com/inscloudtech/demo/controller/TestBatchController.java
-
148tp-demo/src/main/java/com/inscloudtech/demo/controller/TestDemoController.java
-
55tp-demo/src/main/java/com/inscloudtech/demo/controller/TestEncryptController.java
-
125tp-demo/src/main/java/com/inscloudtech/demo/controller/TestExcelController.java
-
71tp-demo/src/main/java/com/inscloudtech/demo/controller/TestI18nController.java
-
75tp-demo/src/main/java/com/inscloudtech/demo/controller/TestSensitiveController.java
-
117tp-demo/src/main/java/com/inscloudtech/demo/controller/TestTreeController.java
-
1tp-demo/src/main/java/com/inscloudtech/demo/controller/package-info.java
-
90tp-demo/src/main/java/com/inscloudtech/demo/controller/queue/BoundedQueueController.java
-
90tp-demo/src/main/java/com/inscloudtech/demo/controller/queue/DelayedQueueController.java
-
22tp-demo/src/main/java/com/inscloudtech/demo/controller/queue/PriorityDemo.java
-
89tp-demo/src/main/java/com/inscloudtech/demo/controller/queue/PriorityQueueController.java
-
66tp-demo/src/main/java/com/inscloudtech/demo/domain/TestDemo.java
-
29tp-demo/src/main/java/com/inscloudtech/demo/domain/TestDemoEncrypt.java
-
58tp-demo/src/main/java/com/inscloudtech/demo/domain/TestTree.java
-
59tp-demo/src/main/java/com/inscloudtech/demo/domain/bo/TestDemoBo.java
-
53tp-demo/src/main/java/com/inscloudtech/demo/domain/bo/TestDemoImportVo.java
-
47tp-demo/src/main/java/com/inscloudtech/demo/domain/bo/TestTreeBo.java
-
1tp-demo/src/main/java/com/inscloudtech/demo/domain/package-info.java
-
119tp-demo/src/main/java/com/inscloudtech/demo/domain/vo/ExportDemoVo.java
-
83tp-demo/src/main/java/com/inscloudtech/demo/domain/vo/TestDemoVo.java
-
58tp-demo/src/main/java/com/inscloudtech/demo/domain/vo/TestTreeVo.java
-
68tp-demo/src/main/java/com/inscloudtech/demo/listener/ExportDemoListener.java
-
13tp-demo/src/main/java/com/inscloudtech/demo/mapper/TestDemoEncryptMapper.java
-
58tp-demo/src/main/java/com/inscloudtech/demo/mapper/TestDemoMapper.java
-
21tp-demo/src/main/java/com/inscloudtech/demo/mapper/TestTreeMapper.java
-
1tp-demo/src/main/java/com/inscloudtech/demo/mapper/package-info.java
-
18tp-demo/src/main/java/com/inscloudtech/demo/service/IExportExcelService.java
-
71tp-demo/src/main/java/com/inscloudtech/demo/service/ITestDemoService.java
-
52tp-demo/src/main/java/com/inscloudtech/demo/service/ITestTreeService.java
-
222tp-demo/src/main/java/com/inscloudtech/demo/service/impl/ExportExcelServiceImpl.java
-
110tp-demo/src/main/java/com/inscloudtech/demo/service/impl/TestDemoServiceImpl.java
-
87tp-demo/src/main/java/com/inscloudtech/demo/service/impl/TestTreeServiceImpl.java
-
1tp-demo/src/main/java/com/inscloudtech/demo/service/impl/package-info.java
-
1tp-demo/src/main/java/com/inscloudtech/demo/service/package-info.java
-
BINtp-demo/src/main/resources/excel/单列表.xlsx
-
BINtp-demo/src/main/resources/excel/多列表.xlsx
-
26tp-demo/src/main/resources/mapper/demo/TestDemoMapper.xml
-
3tp-demo/src/main/resources/mapper/package-info.md
-
20tp-functional/src/main/java/com/inscloudtech/functional/controller/FuncCarApiController.java
-
19tp-functional/src/main/java/com/inscloudtech/functional/controller/FuncCarMediaController.java
-
36tp-functional/src/main/java/com/inscloudtech/functional/controller/ToolDownLoadController.java
-
4tp-system/src/main/java/com/inscloudtech/system/runner/SystemApplicationRunner.java
-
73tp-system/src/main/java/com/inscloudtech/system/service/impl/SysOssServiceImpl.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(); |
||||
|
} |
||||
|
} |
||||
|
} |
@ -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> |
|
@ -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(); |
|
||||
} |
|
||||
|
|
||||
} |
|
@ -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)); |
|
||||
} |
|
||||
|
|
||||
} |
|
@ -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); |
|
||||
} |
|
||||
|
|
||||
} |
|
@ -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("操作成功"); |
|
||||
} |
|
||||
|
|
||||
} |
|
@ -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); |
|
||||
} |
|
||||
|
|
||||
} |
|
@ -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); |
|
||||
} |
|
||||
|
|
||||
} |
|
@ -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()); |
|
||||
} |
|
||||
|
|
||||
} |
|
@ -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))); |
|
||||
} |
|
||||
|
|
||||
} |
|
@ -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)); |
|
||||
} |
|
||||
} |
|
@ -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); |
|
||||
} |
|
||||
|
|
||||
|
|
||||
} |
|
@ -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; |
|
||||
} |
|
||||
|
|
||||
} |
|
@ -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; |
|
||||
} |
|
||||
} |
|
@ -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; |
|
||||
|
|
||||
} |
|
||||
|
|
||||
} |
|
@ -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 +0,0 @@ |
|||||
package com.inscloudtech.demo.controller; |
|
@ -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("操作成功"); |
|
||||
} |
|
||||
|
|
||||
} |
|
@ -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("操作成功"); |
|
||||
} |
|
||||
|
|
||||
} |
|
@ -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()); |
|
||||
} |
|
||||
} |
|
@ -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("操作成功"); |
|
||||
} |
|
||||
|
|
||||
} |
|
@ -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; |
|
||||
|
|
||||
} |
|
@ -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; |
|
||||
|
|
||||
} |
|
@ -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; |
|
||||
|
|
||||
} |
|
@ -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; |
|
||||
|
|
||||
} |
|
@ -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; |
|
||||
|
|
||||
} |
|
@ -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 +0,0 @@ |
|||||
package com.inscloudtech.demo.domain; |
|
@ -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; |
|
||||
} |
|
@ -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; |
|
||||
|
|
||||
|
|
||||
} |
|
@ -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; |
|
||||
|
|
||||
|
|
||||
} |
|
@ -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); |
|
||||
} |
|
||||
} |
|
@ -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> { |
|
||||
|
|
||||
} |
|
@ -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); |
|
||||
} |
|
@ -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 +0,0 @@ |
|||||
package com.inscloudtech.demo.mapper; |
|
@ -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); |
|
||||
} |
|
@ -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); |
|
||||
} |
|
@ -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); |
|
||||
} |
|
@ -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; |
|
||||
} |
|
||||
} |
|
||||
} |
|
@ -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); |
|
||||
} |
|
||||
} |
|
@ -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 +0,0 @@ |
|||||
package com.inscloudtech.demo.service.impl; |
|
@ -1 +0,0 @@ |
|||||
package com.inscloudtech.demo.service; |
|
@ -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> |
|
@ -1,3 +0,0 @@ |
|||||
java包使用 `.` 分割 resource 目录使用 `/` 分割 |
|
||||
<br> |
|
||||
此文件目的 防止文件夹粘连找不到 `xml` 文件 |
|
Write
Preview
Loading…
Cancel
Save
Reference in new issue