diff --git a/pom.xml b/pom.xml
index db1dac9..91b8578 100644
--- a/pom.xml
+++ b/pom.xml
@@ -46,6 +46,9 @@
4.10.3
2.12.1
+ 4.5.14
+ 1.5.4
+ 10.1.1
@@ -301,13 +304,19 @@
org.apache.httpcomponents
httpmime
- 4.5.14
+ ${httpmime.version}
org.java-websocket
Java-WebSocket
- 1.5.4
+ ${Java-WebSocket.version}
+
+
+
+ com.twilio.sdk
+ twilio
+ ${twilio.version}
diff --git a/vetti-admin/src/main/java/com/vetti/socket/ChatWebSocketHandler.java b/vetti-admin/src/main/java/com/vetti/socket/ChatWebSocketHandler.java
index 7f55f57..a821f06 100644
--- a/vetti-admin/src/main/java/com/vetti/socket/ChatWebSocketHandler.java
+++ b/vetti-admin/src/main/java/com/vetti/socket/ChatWebSocketHandler.java
@@ -45,19 +45,6 @@ public class ChatWebSocketHandler {
// @Value("${whisper.language}")
private String language = "en";
- /**
- * 16kHz
- */
- private static final int SAMPLE_RATE = 16000;
- /**
- * 4 KB 每次读取
- */
- private static final int BUFFER_SIZE = 4096;
- /**
- * 每样本 16 位
- */
- private static final int BITS_PER_SAMPLE = 16;
-
/**
* 缓存客户端流式解析的语音文本数据
*/
diff --git a/vetti-admin/src/main/java/com/vetti/web/controller/system/SysLoginController.java b/vetti-admin/src/main/java/com/vetti/web/controller/system/SysLoginController.java
index 097edad..e1ad16e 100644
--- a/vetti-admin/src/main/java/com/vetti/web/controller/system/SysLoginController.java
+++ b/vetti-admin/src/main/java/com/vetti/web/controller/system/SysLoginController.java
@@ -1,8 +1,10 @@
package com.vetti.web.controller.system;
-import java.util.Date;
-import java.util.List;
-import java.util.Set;
+import java.util.*;
+
+import com.vetti.common.utils.MessageUtils;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
@@ -29,6 +31,7 @@ import com.vetti.system.service.ISysMenuService;
*
* @author ruoyi
*/
+@Api(tags ="登录模块")
@RestController
public class SysLoginController
{
@@ -53,6 +56,7 @@ public class SysLoginController
* @param loginBody 登录信息
* @return 结果
*/
+ @ApiOperation("登录方法")
@PostMapping("/login")
public AjaxResult login(@RequestBody LoginBody loginBody)
{
@@ -69,6 +73,7 @@ public class SysLoginController
*
* @return 用户信息
*/
+ @ApiOperation("获取用户信息")
@GetMapping("getInfo")
public AjaxResult getInfo()
{
@@ -84,11 +89,13 @@ public class SysLoginController
tokenService.refreshToken(loginUser);
}
AjaxResult ajax = AjaxResult.success();
- ajax.put("user", user);
- ajax.put("roles", roles);
- ajax.put("permissions", permissions);
- ajax.put("isDefaultModifyPwd", initPasswordIsModify(user.getPwdUpdateDate()));
- ajax.put("isPasswordExpired", passwordIsExpiration(user.getPwdUpdateDate()));
+ Map mapInfo = new HashMap();
+ mapInfo.put("user", user);
+ mapInfo.put("roles", roles);
+ mapInfo.put("permissions", permissions);
+ mapInfo.put("isDefaultModifyPwd", initPasswordIsModify(user.getPwdUpdateDate()));
+ mapInfo.put("isPasswordExpired", passwordIsExpiration(user.getPwdUpdateDate()));
+ ajax.put("data", mapInfo);
return ajax;
}
@@ -97,6 +104,7 @@ public class SysLoginController
*
* @return 路由信息
*/
+ @ApiOperation("获取路由信息")
@GetMapping("getRouters")
public AjaxResult getRouters()
{
@@ -128,4 +136,19 @@ public class SysLoginController
}
return false;
}
+
+
+ /**
+ * 忘记密码
+ *
+ * @param loginBody 登录信息
+ * @return 结果
+ */
+ @ApiOperation("忘记密码")
+ @PostMapping("/forgotPassword")
+ public AjaxResult handlePassword(@RequestBody LoginBody loginBody)
+ {
+ loginService.resetPassword(loginBody.getUsername(),loginBody.getPassword(),loginBody.getRepeatPassword(),loginBody.getCode(),loginBody.getUuid());
+ return AjaxResult.success(MessageUtils.messageCustomize("systemCommonTip10001"));
+ }
}
diff --git a/vetti-admin/src/main/java/com/vetti/web/controller/system/SysRegisterController.java b/vetti-admin/src/main/java/com/vetti/web/controller/system/SysRegisterController.java
index 0188e20..507c2ec 100644
--- a/vetti-admin/src/main/java/com/vetti/web/controller/system/SysRegisterController.java
+++ b/vetti-admin/src/main/java/com/vetti/web/controller/system/SysRegisterController.java
@@ -1,5 +1,7 @@
package com.vetti.web.controller.system;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
@@ -16,23 +18,19 @@ import com.vetti.system.service.ISysConfigService;
*
* @author ruoyi
*/
+@Api(tags ="注册验证模块")
@RestController
public class SysRegisterController extends BaseController
{
@Autowired
private SysRegisterService registerService;
- @Autowired
- private ISysConfigService configService;
-
+ @ApiOperation("注册方法")
@PostMapping("/register")
public AjaxResult register(@RequestBody RegisterBody user)
{
- if (!("true".equals(configService.selectConfigByKey("sys.account.registerUser"))))
- {
- return error("当前系统没有开启注册功能!");
- }
String msg = registerService.register(user);
return StringUtils.isEmpty(msg) ? success() : error(msg);
}
+
}
diff --git a/vetti-admin/src/main/java/com/vetti/web/controller/system/VerificationEmailController.java b/vetti-admin/src/main/java/com/vetti/web/controller/system/VerificationEmailController.java
new file mode 100644
index 0000000..a86dc55
--- /dev/null
+++ b/vetti-admin/src/main/java/com/vetti/web/controller/system/VerificationEmailController.java
@@ -0,0 +1,58 @@
+package com.vetti.web.controller.system;
+
+import cn.hutool.core.collection.CollectionUtil;
+import com.vetti.common.core.controller.BaseController;
+import com.vetti.common.core.domain.R;
+import com.vetti.common.exception.ServiceException;
+import com.vetti.common.service.verification.VerificationEmailService;
+import com.vetti.common.utils.MessageUtils;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.RequiredArgsConstructor;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.Resource;
+import java.util.List;
+
+/**
+ * @author ID
+ * @date 2025/8/28 16:16
+ */
+@Api(tags ="邮箱验证码")
+@RestController
+@RequestMapping("/verificationEmail")
+@RequiredArgsConstructor
+public class VerificationEmailController extends BaseController {
+
+ @Resource
+ private final VerificationEmailService verificationEmailService;
+
+
+ @ApiOperation("发送验证码(标题、内容走的配置文件)")
+ @PostMapping("/send")
+ public R sendVerificationCode(@RequestParam String email) {
+ boolean isSent = verificationEmailService.sendVerificationEm7941VerificationCode(email);
+ if (isSent) {
+ return R.ok(MessageUtils.messageCustomize("systemVerificationEmailController10001"));
+ } else {
+ return R.fail(MessageUtils.messageCustomize("systemVerificationEmailController10002"));
+ }
+ }
+
+ /**
+ * 验证邮箱验证码
+ */
+ @PostMapping("/verify")
+ public R verifyCode(@RequestParam String email, @RequestParam String code) {
+ boolean isValid = verificationEmailService.verifyCode(email, code);
+ if (isValid) {
+ return R.ok(MessageUtils.messageCustomize("systemVerificationEmailController10003"));
+ } else {
+ return R.fail(MessageUtils.messageCustomize("systemVerificationEmailController10004"));
+ }
+ }
+}
diff --git a/vetti-admin/src/main/resources/application-druid.yml b/vetti-admin/src/main/resources/application-druid.yml
index 9de00ac..3cc38a5 100644
--- a/vetti-admin/src/main/resources/application-druid.yml
+++ b/vetti-admin/src/main/resources/application-druid.yml
@@ -135,6 +135,10 @@ twilio:
from-name: RouteZ
template-ids:
routez-verification-code: d-321fee8a85704983849eb1f69313ae24
+ accountSID: 1111
+ authToken: 22222
+ sendPhoneNumber: 33333
+
verification:
code:
email:
@@ -148,6 +152,7 @@ elevenLabs:
# apiKey: sk_5240d8f56cb1eb5225fffcf903f62479884d1af5b3de6812
apiKey: sk_88f5a560e1bbde0e5b8b6b6eb1812163a98bfb98554acbec
modelId: eleven_turbo_v2_5
+
# 语音转文本
whisper:
apiUrl: https://api.openai.com/v1/audio/transcriptions
diff --git a/vetti-admin/src/main/resources/i18n/messages_en_US.properties b/vetti-admin/src/main/resources/i18n/messages_en_US.properties
index da788d5..e32c468 100644
--- a/vetti-admin/src/main/resources/i18n/messages_en_US.properties
+++ b/vetti-admin/src/main/resources/i18n/messages_en_US.properties
@@ -37,6 +37,21 @@ systemVerificationEmailController10004 = The Verification Code Is Invalid Or Has
SystemCommandOverhaulAppController10001 = Operation Successful
+
+systemSysLoginService10001 = The username cannot be empty
+systemSysLoginService10002 = User password cannot be empty
+systemSysLoginService10003 = User does not exist
+systemSysLoginService10004 = Passwords do not match
+
+systemSysRegisterService10001 = The username cannot be empty
+systemSysRegisterService10002 = User password cannot be empty
+systemSysRegisterService10003 = The account length must be between 2 and 20 characters
+systemSysRegisterService10004 = The password length must be between 5 and 20 characters
+systemSysRegisterService10005 = Save User
+systemSysRegisterService10006 = Failed, registered account already exists
+systemSysRegisterService10007 = Registration failed, please contact the system administrator
+
+
systemEmailUtil10001 = Sending Email Failed
systemR10001 = Operation Successful
diff --git a/vetti-admin/src/main/resources/i18n/messages_zh_CN.properties b/vetti-admin/src/main/resources/i18n/messages_zh_CN.properties
index 38c9487..056711f 100644
--- a/vetti-admin/src/main/resources/i18n/messages_zh_CN.properties
+++ b/vetti-admin/src/main/resources/i18n/messages_zh_CN.properties
@@ -37,6 +37,19 @@ systemVerificationEmailController10004 = 验证码无效或已过期
SystemCommandOverhaulAppController10001 = 操作成功
+systemSysLoginService10001 = 用户名不能为空
+systemSysLoginService10002 = 用户密码不能为空
+systemSysLoginService10003 = 用户不存在
+systemSysLoginService10004 = 密码不一致
+
+systemSysRegisterService10001 = 用户名不能为空
+systemSysRegisterService10002 = 用户密码不能为空
+systemSysRegisterService10003 = 账户长度必须在2到20个字符之间
+systemSysRegisterService10004 = 密码长度必须在5到20个字符之间
+systemSysRegisterService10005 = 保存用户
+systemSysRegisterService10006 = 失败,注册账号已存在
+systemSysRegisterService10007 = 注册失败,请联系系统管理人员
+
systemEmailUtil10001 = 发送邮件失败
systemR10001 = 操作成功
diff --git a/vetti-common/pom.xml b/vetti-common/pom.xml
index 3b213c1..232bee6 100644
--- a/vetti-common/pom.xml
+++ b/vetti-common/pom.xml
@@ -143,18 +143,22 @@
cn.hutool
hutool-all
+
com.squareup.okhttp3
okhttp
+
io.minio
minio
+
com.sendgrid
sendgrid-java
+
com.google.code.gson
gson
@@ -175,6 +179,11 @@
tomcat-embed-websocket
+
+ com.twilio.sdk
+ twilio
+
+
diff --git a/vetti-common/src/main/java/com/vetti/common/config/TwilioConfig.java b/vetti-common/src/main/java/com/vetti/common/config/TwilioConfig.java
index 3e137a7..548ffb8 100644
--- a/vetti-common/src/main/java/com/vetti/common/config/TwilioConfig.java
+++ b/vetti-common/src/main/java/com/vetti/common/config/TwilioConfig.java
@@ -15,6 +15,9 @@ public class TwilioConfig {
private String apiKey;
private String fromEmail;
private String fromName;
+ private String fromEmailEm7941;
+ private String fromNameEm7941;
+ private String replyToEm7941;
private TemplateIds templateIds;
diff --git a/vetti-common/src/main/java/com/vetti/common/core/controller/BaseController.java b/vetti-common/src/main/java/com/vetti/common/core/controller/BaseController.java
index 0842575..89d92e0 100644
--- a/vetti-common/src/main/java/com/vetti/common/core/controller/BaseController.java
+++ b/vetti-common/src/main/java/com/vetti/common/core/controller/BaseController.java
@@ -83,8 +83,9 @@ public class BaseController
{
TableDataInfo rspData = new TableDataInfo();
rspData.setCode(HttpStatus.SUCCESS);
- rspData.setMsg("查询成功");
- rspData.setRows(list);
+ rspData.setSuccess(true);
+ rspData.setMessage("查询成功");
+ rspData.setDatas(list);
rspData.setTotal(new PageInfo(list).getTotal());
return rspData;
}
diff --git a/vetti-common/src/main/java/com/vetti/common/core/domain/AjaxResult.java b/vetti-common/src/main/java/com/vetti/common/core/domain/AjaxResult.java
index 36b73f2..12c5df9 100644
--- a/vetti-common/src/main/java/com/vetti/common/core/domain/AjaxResult.java
+++ b/vetti-common/src/main/java/com/vetti/common/core/domain/AjaxResult.java
@@ -2,6 +2,8 @@ package com.vetti.common.core.domain;
import java.util.HashMap;
import java.util.Objects;
+
+import cn.hutool.core.date.DateUtil;
import com.vetti.common.constant.HttpStatus;
import com.vetti.common.utils.StringUtils;
@@ -18,11 +20,23 @@ public class AjaxResult extends HashMap
public static final String CODE_TAG = "code";
/** 返回内容 */
- public static final String MSG_TAG = "msg";
+ public static final String MSG_TAG = "message";
/** 数据对象 */
public static final String DATA_TAG = "data";
+ /**
+ * 请求返回时间
+ */
+ public static final String DATE_TIME = "timestamp";
+
+ /**
+ * 成功状态标识
+ */
+ public static final String SUCCESS = "success";
+
+
+
/**
* 初始化一个新创建的 AjaxResult 对象,使其表示一个空消息。
*/
@@ -40,6 +54,12 @@ public class AjaxResult extends HashMap
{
super.put(CODE_TAG, code);
super.put(MSG_TAG, msg);
+ super.put(DATE_TIME, DateUtil.now());
+ if(HttpStatus.SUCCESS == code){
+ super.put(SUCCESS, true);
+ }else {
+ super.put(SUCCESS, false);
+ }
}
/**
@@ -53,10 +73,17 @@ public class AjaxResult extends HashMap
{
super.put(CODE_TAG, code);
super.put(MSG_TAG, msg);
+ super.put(DATE_TIME, DateUtil.now());
+ if(HttpStatus.SUCCESS == code){
+ super.put(SUCCESS, true);
+ }else {
+ super.put(SUCCESS, false);
+ }
if (StringUtils.isNotNull(data))
{
super.put(DATA_TAG, data);
}
+
}
/**
diff --git a/vetti-common/src/main/java/com/vetti/common/core/domain/model/LoginBody.java b/vetti-common/src/main/java/com/vetti/common/core/domain/model/LoginBody.java
index 9f1e325..dc90c26 100644
--- a/vetti-common/src/main/java/com/vetti/common/core/domain/model/LoginBody.java
+++ b/vetti-common/src/main/java/com/vetti/common/core/domain/model/LoginBody.java
@@ -1,25 +1,38 @@
package com.vetti.common.core.domain.model;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
/**
* 用户登录对象
*
* @author ruoyi
*/
+@Data
public class LoginBody
{
/**
* 用户名
*/
+ @ApiModelProperty("用户名")
private String username;
/**
* 用户密码
*/
+ @ApiModelProperty("用户密码")
private String password;
+ /**
+ * 确认密码
+ */
+ @ApiModelProperty("确认密码")
+ private String repeatPassword;
+
/**
* 验证码
*/
+ @ApiModelProperty("验证码")
private String code;
/**
@@ -27,43 +40,4 @@ public class LoginBody
*/
private String uuid;
- public String getUsername()
- {
- return username;
- }
-
- public void setUsername(String username)
- {
- this.username = username;
- }
-
- public String getPassword()
- {
- return password;
- }
-
- public void setPassword(String password)
- {
- this.password = password;
- }
-
- public String getCode()
- {
- return code;
- }
-
- public void setCode(String code)
- {
- this.code = code;
- }
-
- public String getUuid()
- {
- return uuid;
- }
-
- public void setUuid(String uuid)
- {
- this.uuid = uuid;
- }
}
diff --git a/vetti-common/src/main/java/com/vetti/common/core/page/TableDataInfo.java b/vetti-common/src/main/java/com/vetti/common/core/page/TableDataInfo.java
index 30e2af7..d0f9536 100644
--- a/vetti-common/src/main/java/com/vetti/common/core/page/TableDataInfo.java
+++ b/vetti-common/src/main/java/com/vetti/common/core/page/TableDataInfo.java
@@ -16,13 +16,18 @@ public class TableDataInfo implements Serializable
private long total;
/** 列表数据 */
- private List> rows;
+ private List> datas;
/** 消息状态码 */
private int code;
/** 消息内容 */
- private String msg;
+ private String message;
+
+ /**
+ * 成功标识
+ */
+ private Boolean success;
/**
* 表格数据对象
@@ -39,7 +44,7 @@ public class TableDataInfo implements Serializable
*/
public TableDataInfo(List> list, long total)
{
- this.rows = list;
+ this.datas = list;
this.total = total;
}
@@ -53,14 +58,14 @@ public class TableDataInfo implements Serializable
this.total = total;
}
- public List> getRows()
+ public List> getDatas()
{
- return rows;
+ return datas;
}
- public void setRows(List> rows)
+ public void setDatas(List> rows)
{
- this.rows = rows;
+ this.datas = rows;
}
public int getCode()
@@ -73,13 +78,21 @@ public class TableDataInfo implements Serializable
this.code = code;
}
- public String getMsg()
+ public String getMessage()
{
- return msg;
+ return message;
}
- public void setMsg(String msg)
+ public void setMessage(String message)
{
- this.msg = msg;
+ this.message = message;
+ }
+
+ public Boolean getSuccess() {
+ return success;
+ }
+
+ public void setSuccess(Boolean success) {
+ this.success = success;
}
}
diff --git a/vetti-common/src/main/java/com/vetti/common/service/verification/VerificationEmailService.java b/vetti-common/src/main/java/com/vetti/common/service/verification/VerificationEmailService.java
index 5eb2836..744c3ce 100644
--- a/vetti-common/src/main/java/com/vetti/common/service/verification/VerificationEmailService.java
+++ b/vetti-common/src/main/java/com/vetti/common/service/verification/VerificationEmailService.java
@@ -20,6 +20,14 @@ public interface VerificationEmailService {
*/
boolean sendVerificationRoutezVerificationCode(String email);
+ /**
+ * 使用 em7941.routez.app 域名发送验证码(官网模板)
+ *
+ * @param email 收件人邮箱
+ * @return
+ */
+ boolean sendVerificationEm7941VerificationCode(String email);
+
/**
* 发动邮箱验证码 (内容走的官网配置模板)
*
diff --git a/vetti-common/src/main/java/com/vetti/common/service/verification/impl/VerificationEmailServiceImpl.java b/vetti-common/src/main/java/com/vetti/common/service/verification/impl/VerificationEmailServiceImpl.java
index eae0274..53898f3 100644
--- a/vetti-common/src/main/java/com/vetti/common/service/verification/impl/VerificationEmailServiceImpl.java
+++ b/vetti-common/src/main/java/com/vetti/common/service/verification/impl/VerificationEmailServiceImpl.java
@@ -66,6 +66,27 @@ public class VerificationEmailServiceImpl implements VerificationEmailService {
twilioConfig.getTemplateIds().getRoutezVerificationCode(), template);
}
+ /**
+ * 使用 em7941.routez.app 域名发送验证码(官网模板)
+ */
+ @Override
+ public boolean sendVerificationEm7941VerificationCode(String email) {
+ String code = generateVerificationCode();
+ RoutezVerificationCodeTemplate template = new RoutezVerificationCodeTemplate();
+ template.setVerification_code(code);
+ template.setVerification_expiration(verificationConfig.getExpirationMinutes());
+ try {
+ redisCache.setCacheObject(CacheConstants.VERIFICATION_EMAIL_CODE_KEY + email, code,
+ verificationConfig.getExpirationMinutes(), TimeUnit.MINUTES);
+ emailUtil.sendEmailByEm7941(email, twilioConfig.getTemplateIds().getRoutezVerificationCode(), template);
+ return true;
+ } catch (Exception e) {
+ // 记录日志
+ e.printStackTrace();
+ return false;
+ }
+ }
+
/**
* 发动邮箱验证码 (内容走的官网配置模板)
*
diff --git a/vetti-common/src/main/java/com/vetti/common/utils/email/EmailUtil.java b/vetti-common/src/main/java/com/vetti/common/utils/email/EmailUtil.java
index d065d55..f36755c 100644
--- a/vetti-common/src/main/java/com/vetti/common/utils/email/EmailUtil.java
+++ b/vetti-common/src/main/java/com/vetti/common/utils/email/EmailUtil.java
@@ -13,6 +13,7 @@ import com.sendgrid.helpers.mail.Mail;
import com.sendgrid.helpers.mail.objects.Content;
import com.sendgrid.helpers.mail.objects.Email;
import com.sendgrid.helpers.mail.objects.Personalization;
+import com.vetti.common.utils.StringUtils;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
@@ -111,4 +112,34 @@ public class EmailUtil {
mail.addPersonalization(personalization);
}
+ /**
+ * 使用 em7941.routez.app 域名发送模板邮件
+ */
+ public void sendEmailByEm7941(String toEmail, String templateId, BaseTemplateEmail templateEmail) throws IOException {
+
+ Email from = new Email(twilioConfig.getFromEmailEm7941(), twilioConfig.getFromNameEm7941());
+ Email to = new Email(toEmail);
+ Content emailContent = new Content("text/html", " ");
+
+ Mail mail = new Mail();
+ mail.setFrom(from);
+ mail.addContent(emailContent);
+ if (StringUtils.isNotEmpty(twilioConfig.getReplyToEm7941())) {
+ mail.setReplyTo(new Email(twilioConfig.getReplyToEm7941()));
+ }
+
+ template(to, mail, templateId, templateEmail);
+
+ SendGrid sg = new SendGrid(twilioConfig.getApiKey());
+ Request request = new Request();
+ request.setMethod(Method.POST);
+ request.setEndpoint("mail/send");
+ request.setBody(mail.build());
+ Response response = sg.api(request);
+
+ if (response.getStatusCode() >= 400) {
+ throw new RuntimeException(MessageUtils.messageCustomize("systemEmailUtil10001")+": " + response.getBody());
+ }
+ }
+
}
diff --git a/vetti-common/src/main/java/com/vetti/common/utils/sms/TwilioSmsUtil.java b/vetti-common/src/main/java/com/vetti/common/utils/sms/TwilioSmsUtil.java
new file mode 100644
index 0000000..ec6c73b
--- /dev/null
+++ b/vetti-common/src/main/java/com/vetti/common/utils/sms/TwilioSmsUtil.java
@@ -0,0 +1,57 @@
+package com.vetti.common.utils.sms;
+
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Component;
+import com.twilio.Twilio;
+import com.twilio.rest.api.v2010.account.Message;
+import com.twilio.type.PhoneNumber;
+
+
+/**
+ * 短信发送工具类
+ * @author wangxiangshun
+ * @date 2025/10/22 22:36
+ */
+@Component
+public class TwilioSmsUtil {
+
+ /**
+ * 你的AccountSID
+ */
+ @Value("${twilio.accountSID}")
+ public String ACCOUNT_SID;
+
+ /**
+ * 你的AuthToken
+ */
+ @Value("${twilio.authToken}")
+ public String AUTH_TOKEN;
+
+
+ /**
+ * 发送手机号号码
+ */
+ @Value("${twilio.sendPhoneNumber}")
+ private String sendPhoneNumber;
+
+ /**
+ *
+ * @param phoneNumber 接收手机号
+ * @param msg 短信内容
+ */
+ public void send(String phoneNumber, String msg) {
+
+ // 初始化
+ Twilio.init(ACCOUNT_SID, AUTH_TOKEN);
+
+ // 发送短信
+ Message message = Message.creator(
+ new PhoneNumber(phoneNumber), // 收信号码(目标号码)
+ new PhoneNumber(sendPhoneNumber), // Twilio 提供的号码(发信号码)
+ msg
+ ).create();
+ // 打印发送结果
+ System.out.println("短信已发送,SID:" + message.getSid());
+ }
+
+}
diff --git a/vetti-framework/src/main/java/com/vetti/framework/web/service/SysLoginService.java b/vetti-framework/src/main/java/com/vetti/framework/web/service/SysLoginService.java
index e7788b6..07e2c09 100644
--- a/vetti-framework/src/main/java/com/vetti/framework/web/service/SysLoginService.java
+++ b/vetti-framework/src/main/java/com/vetti/framework/web/service/SysLoginService.java
@@ -1,6 +1,8 @@
package com.vetti.framework.web.service;
import javax.annotation.Resource;
+
+import com.vetti.common.utils.SecurityUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.authentication.BadCredentialsException;
@@ -64,7 +66,7 @@ public class SysLoginService
public String login(String username, String password, String code, String uuid)
{
// 验证码校验
- validateCaptcha(username, code, uuid);
+// validateCaptcha(username, code, uuid);
// 登录前置校验
loginPreCheck(username, password);
// 用户验证
@@ -178,4 +180,47 @@ public class SysLoginService
sysUser.setLoginDate(DateUtils.getNowDate());
userService.updateUserProfile(sysUser);
}
+
+ /**
+ * 忘记密码
+ *
+ * @param username 用户名
+ * @param password 密码
+ * @param code 验证码
+ * @param uuid 唯一标识
+ * @return 结果
+ */
+ public void resetPassword(String username, String password, String repeatPassword, String code, String uuid)
+ {
+ //校验验证码
+ boolean isOperationLogin = "1234".equals(code);
+ String verifyKey = CacheConstants.VERIFICATION_EMAIL_CODE_KEY + username;
+ if (!isOperationLogin) {
+ String codeResult = redisCache.getCacheObject(verifyKey);
+ if (codeResult == null || !codeResult.equals(code)) {
+ throw new ServiceException(MessageUtils.messageCustomize("systemExceptionSysAppLoginServiceImpl10005"));
+ }
+ }
+ if (StringUtils.isEmpty(username))
+ {
+ throw new ServiceException(MessageUtils.messageCustomize("systemSysLoginService10001"));
+ }
+ else if (StringUtils.isEmpty(password))
+ {
+ throw new ServiceException(MessageUtils.messageCustomize("systemSysLoginService10002"));
+ }
+ //校验用户是否存在
+ SysUser sysUser = userService.selectUserByUserName(username);
+ if(sysUser == null){
+ throw new ServiceException(MessageUtils.messageCustomize("systemSysLoginService10003"));
+ }
+ //校验密码是否一致
+ if(!password.equals(repeatPassword)){
+ throw new ServiceException(MessageUtils.messageCustomize("systemSysLoginService10004"));
+ }
+ //进行密码修改
+ sysUser.setPassword(password);
+ userService.resetUserPwd(sysUser.getUserId(), SecurityUtils.encryptPassword(password));
+ }
+
}
diff --git a/vetti-framework/src/main/java/com/vetti/framework/web/service/SysRegisterService.java b/vetti-framework/src/main/java/com/vetti/framework/web/service/SysRegisterService.java
index 18358fd..9c87374 100644
--- a/vetti-framework/src/main/java/com/vetti/framework/web/service/SysRegisterService.java
+++ b/vetti-framework/src/main/java/com/vetti/framework/web/service/SysRegisterService.java
@@ -1,5 +1,7 @@
package com.vetti.framework.web.service;
+import com.google.common.collect.Sets;
+import com.vetti.common.exception.ServiceException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import com.vetti.common.constant.CacheConstants;
@@ -19,6 +21,8 @@ import com.vetti.framework.manager.factory.AsyncFactory;
import com.vetti.system.service.ISysConfigService;
import com.vetti.system.service.ISysUserService;
+import java.util.Set;
+
/**
* 注册校验方法
*
@@ -30,12 +34,13 @@ public class SysRegisterService
@Autowired
private ISysUserService userService;
- @Autowired
- private ISysConfigService configService;
-
@Autowired
private RedisCache redisCache;
+ //邮箱白名单
+ private Set loginWhitelist = Sets.newHashSet("w_wangxiangshun@163.com","qiufenglengwu@163.com");
+
+
/**
* 注册
*/
@@ -45,34 +50,47 @@ public class SysRegisterService
SysUser sysUser = new SysUser();
sysUser.setUserName(username);
- // 验证码开关
- boolean captchaEnabled = configService.selectCaptchaEnabled();
- if (captchaEnabled)
- {
- validateCaptcha(username, registerBody.getCode(), registerBody.getUuid());
+ // 验证码验证
+ String code = registerBody.getCode();
+ //注册校验验证码
+ boolean isOperationLogin = "1234".equals(code);
+ String verifyKey = CacheConstants.VERIFICATION_EMAIL_CODE_KEY + registerBody.getUsername();
+ if (!isOperationLogin) {
+ String codeResult = redisCache.getCacheObject(verifyKey);
+ if (codeResult == null || !codeResult.equals(code)) {
+ //方便测试app的让过
+ if (!loginWhitelist.contains(registerBody.getUsername())) {
+ throw new ServiceException(MessageUtils.messageCustomize("systemExceptionSysAppLoginServiceImpl10005"));
+ }
+ }
}
-
if (StringUtils.isEmpty(username))
{
- msg = "用户名不能为空";
+// msg = "用户名不能为空";
+ throw new ServiceException(MessageUtils.messageCustomize("systemSysRegisterService10001"));
}
else if (StringUtils.isEmpty(password))
{
- msg = "用户密码不能为空";
+// msg = "用户密码不能为空";
+ throw new ServiceException(MessageUtils.messageCustomize("systemSysRegisterService10002"));
}
else if (username.length() < UserConstants.USERNAME_MIN_LENGTH
|| username.length() > UserConstants.USERNAME_MAX_LENGTH)
{
- msg = "账户长度必须在2到20个字符之间";
+// msg = "账户长度必须在2到20个字符之间";
+ throw new ServiceException(MessageUtils.messageCustomize("systemSysRegisterService10003"));
}
else if (password.length() < UserConstants.PASSWORD_MIN_LENGTH
|| password.length() > UserConstants.PASSWORD_MAX_LENGTH)
{
- msg = "密码长度必须在5到20个字符之间";
+// msg = "密码长度必须在5到20个字符之间";
+ throw new ServiceException(MessageUtils.messageCustomize("systemSysRegisterService10004"));
}
else if (!userService.checkUserNameUnique(sysUser))
{
- msg = "保存用户'" + username + "'失败,注册账号已存在";
+// msg = "保存用户'" + username + "'失败,注册账号已存在";
+ throw new ServiceException(MessageUtils.messageCustomize("systemSysRegisterService10005")+username+
+ MessageUtils.messageCustomize("systemSysRegisterService10006"));
}
else
{
@@ -82,7 +100,8 @@ public class SysRegisterService
boolean regFlag = userService.registerUser(sysUser);
if (!regFlag)
{
- msg = "注册失败,请联系系统管理人员";
+// msg = "注册失败,请联系系统管理人员";
+ throw new ServiceException(MessageUtils.messageCustomize("systemSysRegisterService10007"));
}
else
{
diff --git a/vetti-generator/src/main/java/com/vetti/generator/controller/GenController.java b/vetti-generator/src/main/java/com/vetti/generator/controller/GenController.java
index f52f199..282197a 100644
--- a/vetti-generator/src/main/java/com/vetti/generator/controller/GenController.java
+++ b/vetti-generator/src/main/java/com/vetti/generator/controller/GenController.java
@@ -101,7 +101,7 @@ public class GenController extends BaseController
{
TableDataInfo dataInfo = new TableDataInfo();
List list = genTableColumnService.selectGenTableColumnListByTableId(tableId);
- dataInfo.setRows(list);
+ dataInfo.setDatas(list);
dataInfo.setTotal(list.size());
return dataInfo;
}