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; }