support sms login

This commit is contained in:
Timi
2026-08-21 18:13:58 +08:00
parent aff056712e
commit 1b8936f197
12 changed files with 175 additions and 158 deletions
@@ -5,6 +5,8 @@ import com.imyeyu.api.annotation.RequireCorePermission;
import com.imyeyu.api.bean.CorePermissionCode;
import com.imyeyu.api.modules.common.entity.Attachment;
import com.imyeyu.api.modules.common.service.AttachmentService;
import com.imyeyu.api.modules.common.service.SmsService;
import com.imyeyu.api.modules.common.vo.SmsCaptchaVerifyRequest;
import com.imyeyu.api.modules.user.entity.User;
import com.imyeyu.api.modules.user.service.UserLoginService;
import com.imyeyu.api.modules.user.service.UserService;
@@ -50,6 +52,7 @@ import java.util.List;
@RequestMapping("/user")
public class UserController {
private final SmsService smsService;
private final UserService userService;
private final UserLoginService userLoginService;
private final AttachmentService attachmentService;
@@ -133,6 +136,15 @@ public class UserController {
return userLoginService.login(TimiSpring.getToken(), userLoginService.getRequireLoginUserId());
}
@AOPLog
@JsonView(ResponseView.Public.class)
@RequestRateLimit
@CaptchaValid
@PostMapping("/login/sms")
public LoginResponse loginBySms(@RequestBody SmsCaptchaVerifyRequest request) {
return userLoginService.loginBySms(request);
}
/**
* 更新当前用户资料
*
@@ -1,6 +1,6 @@
package com.imyeyu.api.modules.user.service;
import com.e2ins.ms.notify.vo.sms.CaptchaVerifyReq;
import com.imyeyu.api.modules.common.vo.SmsCaptchaVerifyRequest;
import com.imyeyu.api.modules.user.entity.User;
import com.imyeyu.api.modules.user.vo.LoginRequest;
import com.imyeyu.api.modules.user.vo.LoginResponse;
@@ -24,7 +24,7 @@ public interface UserLoginService {
LoginResponse login(String token, String userId);
LoginResponse loginBySms(CaptchaVerifyReq req);
LoginResponse loginBySms(SmsCaptchaVerifyRequest request);
/**
* 根据令牌获取用户
@@ -1,13 +1,13 @@
package com.imyeyu.api.modules.user.service.implement;
import com.e2ins.ms.notify.SmsNotifyService;
import com.e2ins.ms.notify.bean.NotifyDetail;
import com.e2ins.ms.notify.vo.sms.CaptchaVerifyReq;
import com.imyeyu.api.config.dbsource.TimiServerDBConfig;
import com.imyeyu.api.modules.common.entity.Attachment;
import com.imyeyu.api.modules.common.entity.NotifyDetail;
import com.imyeyu.api.modules.common.entity.Setting;
import com.imyeyu.api.modules.common.service.AttachmentService;
import com.imyeyu.api.modules.common.service.SettingService;
import com.imyeyu.api.modules.common.service.SmsService;
import com.imyeyu.api.modules.common.vo.SmsCaptchaVerifyRequest;
import com.imyeyu.api.modules.user.bean.BootstrapData;
import com.imyeyu.api.modules.user.entity.User;
import com.imyeyu.api.modules.user.service.UserLoginService;
@@ -16,7 +16,6 @@ import com.imyeyu.api.modules.user.service.UserService;
import com.imyeyu.api.modules.user.vo.LoginRequest;
import com.imyeyu.api.modules.user.vo.LoginResponse;
import com.imyeyu.java.TimiJava;
import com.imyeyu.java.bean.timi.TimiCode;
import com.imyeyu.java.bean.timi.TimiException;
import com.imyeyu.spring.TimiSpring;
import com.imyeyu.spring.util.Redis;
@@ -30,7 +29,6 @@ import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.io.IOException;
import java.util.UUID;
import java.util.concurrent.ThreadLocalRandom;
@@ -47,10 +45,10 @@ public class UserLoginServiceImplement implements UserLoginService, TimiJava {
private static final String PHONE_VERIFY_KEY_PREFIX = "USER:PHONE:VERIFY:";
private static final long PHONE_VERIFY_CODE_TTL = Time.M * 5;
private final SmsService smsService;
private final UserService userService;
private final SettingService settingService;
private final UserRoleService userRoleService;
private final SmsNotifyService smsNotifyService;
private final AttachmentService attachmentService;
private final Redis<String, String> redisUserToken;
@@ -104,20 +102,15 @@ public class UserLoginServiceImplement implements UserLoginService, TimiJava {
@Override
public LoginResponse loginBySms(CaptchaVerifyReq req) {
try {
NotifyDetail detail = smsNotifyService.captchaVerify(req);
// 无报错即成功
User user = userService.getByPhoneNo(detail.getSendTo());
if (!user.isValidPhone()) {
user.setPhoneNoVerifyAt(Time.now());
userService.update(user);
}
return login(UUID.randomUUID().toString(), user.getId());
} catch (IOException e) {
log.error("login by sms error", e);
throw new TimiException(TimiCode.ERROR, "验证短信失败");
public LoginResponse loginBySms(SmsCaptchaVerifyRequest request) {
NotifyDetail detail = smsService.captchaVerify(request.getDetailId(), request.getCaptcha());
// 无报错即成功
User user = userService.getByPhoneNo(detail.getSendTo());
if (!user.isValidPhone()) {
user.setPhoneNoVerifyAt(Time.now());
userService.update(user);
}
return login(UUID.randomUUID().toString(), user.getId());
}
@Override