commit 1e73fa59dbe30fb9a3d346af7a0a6003c89ffaa0
Author: 583641232@qq.com <583641232@qq.com>
Date: Mon Jul 29 00:02:45 2024 +0800
first commit
diff --git a/.editorconfig b/.editorconfig
new file mode 100644
index 0000000..25b312e
--- /dev/null
+++ b/.editorconfig
@@ -0,0 +1,18 @@
+# http://editorconfig.org
+root = true
+
+# 空格替代Tab缩进在各种编辑工具下效果一致
+[*]
+indent_style = space
+indent_size = 4
+charset = utf-8
+end_of_line = lf
+trim_trailing_whitespace = true
+insert_final_newline = true
+
+[*.{json,yml,yaml}]
+indent_size = 2
+
+[*.md]
+insert_final_newline = false
+trim_trailing_whitespace = false
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..9e33968
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,46 @@
+######################################################################
+# Build Tools
+
+.gradle
+/build/
+!gradle/wrapper/gradle-wrapper.jar
+
+target/
+!.mvn/wrapper/maven-wrapper.jar
+
+######################################################################
+# IDE
+
+### STS ###
+.apt_generated
+.classpath
+.factorypath
+.project
+.settings
+.springBeans
+
+### IntelliJ IDEA ###
+.idea
+*.iws
+*.iml
+*.ipr
+
+### JRebel ###
+rebel.xml
+
+### NetBeans ###
+nbproject/private/
+build/*
+nbbuild/
+nbdist/
+.nb-gradle/
+
+######################################################################
+# Others
+*.log
+*.xml.versionsBackup
+*.swp
+
+!*/build/*.java
+!*/build/*.html
+!*/build/*.xml
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..139597f
--- /dev/null
+++ b/README.md
@@ -0,0 +1,2 @@
+
+
diff --git a/cas-admin/pom.xml b/cas-admin/pom.xml
new file mode 100644
index 0000000..5aa7eb2
--- /dev/null
+++ b/cas-admin/pom.xml
@@ -0,0 +1,117 @@
+
+
+
+ cas-server
+ com.inscloudtech
+ 4.7.0
+
+ 4.0.0
+ jar
+ cas-admin
+
+
+ web服务入口
+
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-devtools
+ true
+
+
+
+
+ com.mysql
+ mysql-connector-j
+
+
+
+ com.microsoft.sqlserver
+ mssql-jdbc
+
+
+
+
+ com.inscloudtech
+ cas-framework
+
+
+
+ com.inscloudtech
+ cas-system
+
+
+
+ com.inscloudtech
+ cas-generator
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+
+
+
+
+
+ ${project.artifactId}
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+ ${spring-boot.version}
+
+ true
+
+
+
+
+ repackage
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-war-plugin
+ 3.2.2
+
+ false
+ ${project.artifactId}
+
+
+
+
+ net.roseboy
+ classfinal-maven-plugin
+ 1.2.1
+
+ #
+ org.spring
+ com.inscloudtech
+ application.yml,application-dev.yml,application-prod.yml,application-soft.yml
+ cas-system-4.7.0.jar
+
+
+
+
+ package
+
+ classFinal
+
+
+
+
+
+
+
+
diff --git a/cas-admin/src/main/java/com/inscloudtech/CasApplication.java b/cas-admin/src/main/java/com/inscloudtech/CasApplication.java
new file mode 100644
index 0000000..93ce7a6
--- /dev/null
+++ b/cas-admin/src/main/java/com/inscloudtech/CasApplication.java
@@ -0,0 +1,30 @@
+package com.inscloudtech;
+
+import org.dromara.easyes.starter.register.EsMapperScan;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.context.metrics.buffering.BufferingApplicationStartup;
+import org.springframework.context.annotation.EnableAspectJAutoProxy;
+import org.springframework.scheduling.annotation.EnableScheduling;
+
+/**
+ * 启动程序
+ *
+ * @author
+ */
+
+@EsMapperScan("com.inscloudtech.*.mapper")
+@SpringBootApplication(scanBasePackages = {"com.inscloudtech"})
+@EnableAspectJAutoProxy(exposeProxy = true, proxyTargetClass = true)
+@EnableScheduling
+public class CasApplication {
+
+ public static void main(String[] args) {
+ System.setProperty("spring.devtools.restart.enabled", "false");
+ SpringApplication application = new SpringApplication(CasApplication.class);
+ application.setApplicationStartup(new BufferingApplicationStartup(2048));
+ application.run(args);
+ System.out.println(">>>cas服务启动成功<<<");
+ }
+
+}
diff --git a/cas-admin/src/main/java/com/inscloudtech/CasServletInitializer.java b/cas-admin/src/main/java/com/inscloudtech/CasServletInitializer.java
new file mode 100644
index 0000000..9638c69
--- /dev/null
+++ b/cas-admin/src/main/java/com/inscloudtech/CasServletInitializer.java
@@ -0,0 +1,18 @@
+package com.inscloudtech;
+
+import org.springframework.boot.builder.SpringApplicationBuilder;
+import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
+
+/**
+ * web容器中进行部署
+ *
+ * @author inscloudtech
+ */
+public class CasServletInitializer extends SpringBootServletInitializer {
+
+ @Override
+ protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
+ return application.sources(CasApplication.class);
+ }
+
+}
diff --git a/cas-admin/src/main/java/com/inscloudtech/web/controller/analysiscenter/AnalysisReportController.java b/cas-admin/src/main/java/com/inscloudtech/web/controller/analysiscenter/AnalysisReportController.java
new file mode 100644
index 0000000..7387116
--- /dev/null
+++ b/cas-admin/src/main/java/com/inscloudtech/web/controller/analysiscenter/AnalysisReportController.java
@@ -0,0 +1,88 @@
+package com.inscloudtech.web.controller.analysiscenter;
+
+import com.inscloudtech.analysiscenter.domain.AnalysisDto;
+import com.inscloudtech.analysiscenter.domain.AnalysisReport;
+import com.inscloudtech.analysiscenter.mapper.AnalysisReportMapper;
+import com.inscloudtech.analysiscenter.service.IAnalysisReportService;
+import com.inscloudtech.common.annotation.Log;
+import com.inscloudtech.common.annotation.RepeatSubmit;
+import com.inscloudtech.common.annotation.UpdateLog;
+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.enums.BusinessType;
+import lombok.RequiredArgsConstructor;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.constraints.NotEmpty;
+import javax.validation.constraints.NotNull;
+import java.io.IOException;
+import java.util.Arrays;
+import java.util.Date;
+
+/**
+ * 分析中心-分析报告对象
+ *
+ * @author inscloudtech
+ * @date 2023-11-10
+ */
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/ac/analysisReport")
+public class AnalysisReportController extends BaseController {
+
+ private final IAnalysisReportService iAnalysisReportService;
+
+ //"OSS对象word格式转化为pdf格式")
+ @GetMapping("/download/{ossId}")
+ public void wordToPdf(@PathVariable String ossId, HttpServletResponse response) throws IOException {
+ iAnalysisReportService.download(ossId, response);
+ }
+
+ //"查询分析报告对象列表")
+ @GetMapping("/list")
+ public TableDataInfo list(AnalysisReport bo, PageQuery pageQuery) {
+ return iAnalysisReportService.queryPageList(bo, pageQuery);
+ }
+
+ //"获取分析报告对象")
+ @GetMapping("/{id}")
+ public R getInfo(@NotNull(message = "主键不能为空") @PathVariable String id) {
+ return R.ok(iAnalysisReportService.queryById(id));
+ }
+
+ //"新增分析报告对象")
+ @Log(title = "分析报告对象", businessType = BusinessType.INSERT)
+ @RepeatSubmit()
+ @PostMapping()
+ public R add(@RequestBody AnalysisReport bo) {
+ bo.setCreateBy(getUsername());
+ bo.setCreateTime(new Date());
+ iAnalysisReportService.insert(bo);
+ return R.ok("分析报告生成成功",bo);
+ }
+
+ //"修改分析报告对象")
+ @UpdateLog(title = "分析报告对象", mapperClass = AnalysisReportMapper.class, businessType = BusinessType.UPDATE)
+ @PutMapping()
+ public R edit(@RequestBody AnalysisReport bo) {
+ return R.ok(iAnalysisReportService.update(bo));
+ }
+
+ //"删除分析报告对象")
+ @Log(title = "分析报告对象", businessType = BusinessType.DELETE)
+ @DeleteMapping("/{ids}")
+ public R remove(@NotEmpty(message = "主键不能为空") @PathVariable String[] ids) {
+ return R.ok(iAnalysisReportService.deleteWithValidByIds(Arrays.asList(ids)));
+ }
+
+ //"保存至分析成果")
+ @PostMapping("/save2AnalysisResult")
+ public R save2AnalysisResult(@RequestBody AnalysisDto dto) {
+ iAnalysisReportService.save2AnalysisResult(dto);
+ return R.ok();
+ }
+
+}
diff --git a/cas-admin/src/main/java/com/inscloudtech/web/controller/analysiscenter/AnalysisResultController.java b/cas-admin/src/main/java/com/inscloudtech/web/controller/analysiscenter/AnalysisResultController.java
new file mode 100644
index 0000000..63e6989
--- /dev/null
+++ b/cas-admin/src/main/java/com/inscloudtech/web/controller/analysiscenter/AnalysisResultController.java
@@ -0,0 +1,98 @@
+package com.inscloudtech.web.controller.analysiscenter;
+
+import com.inscloudtech.analysiscenter.domain.AnalysisResult;
+import com.inscloudtech.analysiscenter.mapper.AnalysisResultMapper;
+import com.inscloudtech.analysiscenter.service.IAnalysisResultService;
+import com.inscloudtech.common.annotation.Log;
+import com.inscloudtech.common.annotation.RepeatSubmit;
+import com.inscloudtech.common.annotation.UpdateLog;
+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.enums.BusinessType;
+import com.inscloudtech.datacenter.service.QueryCenterService;
+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 javax.validation.constraints.NotEmpty;
+import javax.validation.constraints.NotNull;
+import java.util.Arrays;
+import java.util.Date;
+
+/**
+ * 分析中心-分析成果对象
+ *
+ * @author inscloudtech
+ * @date 2023-11-10
+ */
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/ac/analysisResult")
+public class AnalysisResultController extends BaseController {
+
+ private final IAnalysisResultService iAnalysisResultService;
+
+ private final QueryCenterService queryCenterService;
+
+ //"查询分析成果对象列表")
+ @GetMapping("/list")
+ public TableDataInfo list(AnalysisResult bo, PageQuery pageQuery) {
+ return iAnalysisResultService.queryPageList(bo, pageQuery);
+ }
+
+
+ //"获取分析成果对象")
+ @GetMapping("/{id}")
+ public R getInfo(@NotNull(message = "主键不能为空")
+ @PathVariable String id) {
+ return R.ok(iAnalysisResultService.queryById(id));
+ }
+
+
+ //"新增分析成果对象")
+ @Log(title = "分析成果对象", businessType = BusinessType.INSERT)
+ @RepeatSubmit()
+ @PostMapping()
+ public R add( @RequestBody AnalysisResult bo) {
+ bo.setCreateBy(getUsername());
+ bo.setCreateTime(new Date());
+ iAnalysisResultService.insert(bo);
+ return R.ok(bo.getId());
+ }
+
+
+ //"修改分析成果对象")
+ @UpdateLog(title = "分析成果对象",mapperClass = AnalysisResultMapper.class, businessType = BusinessType.UPDATE)
+ @PutMapping()
+ public R edit(@RequestBody AnalysisResult bo) {
+ return R.ok(iAnalysisResultService.update(bo));
+ }
+
+ //"删除分析成果对象")
+ @Log(title = "分析成果对象", businessType = BusinessType.DELETE)
+ @DeleteMapping("/{ids}")
+ public R remove(@NotEmpty(message = "主键不能为空")
+ @PathVariable String[] ids) {
+ return R.ok(iAnalysisResultService.deleteWithValidByIds(Arrays.asList(ids)));
+ }
+
+
+ //"下载分析成果对象")
+ @PostMapping("/export")
+ public void export(AnalysisResult bo, HttpServletResponse response) {
+ queryCenterService.excelExport(response,bo);
+ }
+
+ //"导入分析成果对象")
+ @PostMapping(value = "/import", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
+ public R importData(@RequestPart("file") MultipartFile file, String caseId, String analysisResultId) {
+ iAnalysisResultService.importData(file,caseId,analysisResultId);
+ return R.ok();
+ }
+
+}
+
diff --git a/cas-admin/src/main/java/com/inscloudtech/web/controller/analysiscenter/PlateNumberInfoController.java b/cas-admin/src/main/java/com/inscloudtech/web/controller/analysiscenter/PlateNumberInfoController.java
new file mode 100644
index 0000000..04dd8b5
--- /dev/null
+++ b/cas-admin/src/main/java/com/inscloudtech/web/controller/analysiscenter/PlateNumberInfoController.java
@@ -0,0 +1,192 @@
+package com.inscloudtech.web.controller.analysiscenter;
+
+import cn.hutool.core.collection.CollectionUtil;
+import com.inscloudtech.analysiscenter.domain.AnalysisDto;
+import com.inscloudtech.common.annotation.Log;
+import com.inscloudtech.common.annotation.UpdateLog;
+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.enums.BusinessType;
+import com.inscloudtech.common.excel.ExcelResult;
+import com.inscloudtech.common.utils.BeanCopyUtils;
+import com.inscloudtech.common.utils.poi.ExcelUtil;
+import com.inscloudtech.datacenter.domain.PlateNumberInfo;
+import com.inscloudtech.datacenter.mapper.es.PlateNumberEsMapper;
+import com.inscloudtech.system.service.ISysOssService;
+import com.inscloudtech.datacenter.service.PlateNumberService;
+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 javax.validation.constraints.NotEmpty;
+import javax.validation.constraints.NotNull;
+import java.util.*;
+
+/**
+ * 车牌抓取
+ *
+ * @author inscloudtech
+ * @date 2023-11-10
+ */
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/ac/plateNumberInfo")
+public class PlateNumberInfoController extends BaseController {
+
+ private final PlateNumberService iPlateNumberInfoService;
+
+ private final ISysOssService iSysOssService;
+
+ //"保存至分析成果")
+ @PostMapping("/save2AnalysisResult")
+ public R save2AnalysisResult(@RequestBody AnalysisDto dto) {
+ iPlateNumberInfoService.save2AnalysisResult(dto);
+ return R.ok();
+ }
+
+ /**
+ * 查询车牌抓取列表
+ */
+ //"查询车牌抓取列表")
+ @GetMapping("/list")
+ public TableDataInfo list(PlateNumberInfo bo, PageQuery pageQuery) {
+ return iPlateNumberInfoService.queryPageList(bo, pageQuery);
+ }
+
+ /**
+ * 获取车牌抓取详细信息
+ *
+ * @param id 主键
+ */
+ //"获取车牌抓取")
+ @GetMapping("/{id}")
+ public R getInfo(@NotNull(message = "主键不能为空")
+ @PathVariable String id) {
+ return R.ok(iPlateNumberInfoService.queryById(id));
+ }
+
+ /**
+ * 新增车牌抓取
+ */
+ //"新增车牌抓取")
+ @Log(title = "车牌抓取", businessType = BusinessType.INSERT)
+ @PostMapping()
+ public R add( @RequestBody PlateNumberInfo bo) {
+ bo.setCreateBy(getUsername());
+ return R.ok(iPlateNumberInfoService.insertByBo(bo));
+ }
+
+ /**
+ * 修改车牌抓取
+ */
+ //"修改车牌抓取")
+ @UpdateLog(title = "车牌抓取",mapperClass = PlateNumberEsMapper.class, businessType = BusinessType.UPDATE)
+ @PutMapping()
+ public R edit(@RequestBody PlateNumberInfo bo) {
+ return R.ok(iPlateNumberInfoService.updateByBo(bo));
+ }
+
+ /**
+ * 删除车牌抓取
+ *
+ * @param ids 主键串
+ */
+ //"删除车牌抓取")
+ @Log(title = "车牌抓取", businessType = BusinessType.DELETE)
+ @DeleteMapping("/{ids}")
+ public R remove(@NotEmpty(message = "主键不能为空")
+ @PathVariable String[] ids) {
+ return R.ok(iPlateNumberInfoService.deleteWithValidByIds(Arrays.asList(ids), true));
+ }
+
+ //"批量修改车牌抓取")
+ @PutMapping("/updateBatch")
+ public R updateBatch(@RequestBody PlateNumberInfo bo) {
+ List ids = bo.getIds();
+ List list = new ArrayList<>();
+ ids.stream().forEach(id ->{
+ PlateNumberInfo update = BeanCopyUtils.copy(bo,PlateNumberInfo.class);
+ update.setId(id);
+ update.setUpdateBy(getUsername());
+ update.setUpdateTime(new Date());
+ list.add(update);
+ });
+ return R.ok(iPlateNumberInfoService.updateBatch(list));
+ }
+
+ //"批量修改车牌抓取对象集合")
+ @PutMapping("/updateBatchByList")
+ public R updateBatch(@RequestBody List list) {
+ list.stream().forEach(update ->{
+ update.setUpdateBy(getUsername());
+ update.setUpdateTime(new Date());
+ });
+ return R.ok(iPlateNumberInfoService.updateBatch(list));
+ }
+
+ //"导入车牌抓取")
+ @PostMapping(value = "/import", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
+ public R importData(@RequestPart("file") MultipartFile file, String caseId) {
+ boolean result = false;
+ String importResultStr = "";
+ int importCount = 0;
+ try {
+ ExcelResult excelResult = ExcelUtil.importExcel(file.getInputStream(), PlateNumberInfo.class, true);
+ List list = excelResult.getList();
+ if(CollectionUtil.isNotEmpty(list)){
+ list = iPlateNumberInfoService.dataTrimAndDeduplication(list,caseId,getUsername());
+ result = iPlateNumberInfoService.importData(list,caseId,null);
+ importCount = list.size();
+ }else {
+ throw new RuntimeException("未解析到数据!");
+ }
+ }catch (Exception e){
+ importResultStr = e.getMessage();
+ }
+ iSysOssService.upload2Local(importCount,importResultStr,file,caseId,"PLATE_NUMBER_INFO");
+ return result ? R.ok() : R.fail(importResultStr);
+ }
+
+ //"分析成果-车牌抓取导入")
+ @PostMapping(value = "/import4AnalysisResult", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
+ public R importAnalysisResult(@RequestPart("file") MultipartFile file, String caseId, String analysisResultId) {
+ boolean result = false;
+ String importResultStr = "";
+ int importCount = 0;
+ try {
+ ExcelResult excelResult = ExcelUtil.importExcel(file.getInputStream(), PlateNumberInfo.class, true);
+ List list = excelResult.getList();
+ if(CollectionUtil.isNotEmpty(list)){
+ result = iPlateNumberInfoService.importAnalysisResult(list,analysisResultId,getUsername());
+ importCount = list.size();
+ }else {
+ throw new RuntimeException("未解析到数据!");
+ }
+ }catch (Exception e){
+ e.printStackTrace();
+ importResultStr = e.getMessage();
+ }
+
+ iSysOssService.upload2Local(importCount,importResultStr,file,caseId,"ANALYSIS_RESULT");
+ return result ? R.ok() : R.fail(importResultStr);
+ }
+
+ /**
+ * 导出交易对象列表
+ */
+ //"导出车牌抓取")
+ @PostMapping("/export")
+ public void export(PlateNumberInfo bo, HttpServletResponse response) {
+ List list = Collections.EMPTY_LIST;
+ if(bo.getDownloadTemplate() == null){
+ list = iPlateNumberInfoService.queryList(bo);
+ }
+ ExcelUtil.exportExcel(list, "车牌抓取", PlateNumberInfo.class, response);
+ }
+
+}
+
diff --git a/cas-admin/src/main/java/com/inscloudtech/web/controller/common/CaptchaController.java b/cas-admin/src/main/java/com/inscloudtech/web/controller/common/CaptchaController.java
new file mode 100644
index 0000000..7f642ab
--- /dev/null
+++ b/cas-admin/src/main/java/com/inscloudtech/web/controller/common/CaptchaController.java
@@ -0,0 +1,134 @@
+package com.inscloudtech.web.controller.common;
+
+import cn.dev33.satoken.annotation.SaIgnore;
+import cn.hutool.captcha.AbstractCaptcha;
+import cn.hutool.captcha.generator.CodeGenerator;
+import cn.hutool.core.util.IdUtil;
+import cn.hutool.core.util.RandomUtil;
+import com.inscloudtech.common.constant.CacheConstants;
+import com.inscloudtech.common.constant.Constants;
+import com.inscloudtech.common.core.domain.R;
+import com.inscloudtech.common.enums.CaptchaType;
+import com.inscloudtech.common.utils.StringUtils;
+import com.inscloudtech.common.utils.email.MailUtils;
+import com.inscloudtech.common.utils.redis.RedisUtils;
+import com.inscloudtech.common.utils.reflect.ReflectUtils;
+import com.inscloudtech.common.utils.spring.SpringUtils;
+import com.inscloudtech.framework.config.properties.CaptchaProperties;
+import com.inscloudtech.framework.config.properties.MailProperties;
+//import com.inscloudtech.sms.config.properties.SmsProperties;
+//import com.inscloudtech.sms.core.SmsTemplate;
+//import com.inscloudtech.sms.entity.SmsResult;
+import com.inscloudtech.system.service.ISysConfigService;
+import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.expression.Expression;
+import org.springframework.expression.ExpressionParser;
+import org.springframework.expression.spel.standard.SpelExpressionParser;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.validation.constraints.NotBlank;
+import java.time.Duration;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * 验证码操作处理
+ *
+ * @author inscloudtech
+ */
+@SaIgnore
+@Slf4j
+@Validated
+@RequiredArgsConstructor
+@RestController
+public class CaptchaController {
+
+ private final CaptchaProperties captchaProperties;
+// private final SmsProperties smsProperties;
+ private final ISysConfigService configService;
+ private final MailProperties mailProperties;
+
+// /**
+// * 短信验证码
+// *
+// * @param phonenumber 用户手机号
+// */
+// @GetMapping("/captchaSms")
+// public R smsCaptcha(@NotBlank(message = "{user.phonenumber.not.blank}") String phonenumber) {
+// if (!smsProperties.getEnabled()) {
+// return R.fail("当前系统没有开启短信功能!");
+// }
+// String key = CacheConstants.CAPTCHA_CODE_KEY + phonenumber;
+// String code = RandomUtil.randomNumbers(4);
+// RedisUtils.setCacheObject(key, code, Duration.ofMinutes(Constants.CAPTCHA_EXPIRATION));
+// // 验证码模板id 自行处理 (查数据库或写死均可)
+// String templateId = "";
+// Map map = new HashMap<>(1);
+// map.put("code", code);
+// SmsTemplate smsTemplate = SpringUtils.getBean(SmsTemplate.class);
+// SmsResult result = smsTemplate.send(phonenumber, templateId, map);
+// if (!result.isSuccess()) {
+// log.error("验证码短信发送异常 => {}", result);
+// return R.fail(result.getMessage());
+// }
+// return R.ok();
+// }
+ /**
+ * 邮箱验证码
+ *
+ * @param email 邮箱
+ */
+ @GetMapping("/captchaEmail")
+ public R emailCode(@NotBlank(message = "{user.email.not.blank}") String email) {
+ if (!mailProperties.getEnabled()) {
+ return R.fail("当前系统没有开启邮箱功能!");
+ }
+ String key = CacheConstants.CAPTCHA_CODE_KEY + email;
+ String code = RandomUtil.randomNumbers(4);
+ RedisUtils.setCacheObject(key, code, Duration.ofMinutes(Constants.CAPTCHA_EXPIRATION));
+ try {
+ MailUtils.sendText(email, "登录验证码", "您本次验证码为:" + code + ",有效性为" + Constants.CAPTCHA_EXPIRATION + "分钟,请尽快填写。");
+ } catch (Exception e) {
+ log.error("验证码短信发送异常 => {}", e.getMessage());
+ return R.fail(e.getMessage());
+ }
+ return R.ok();
+ }
+ /**
+ * 生成验证码
+ */
+ @GetMapping("/captchaImage")
+ public R