From aeea8f907205f89974a082ea24243eb04eba537c Mon Sep 17 00:00:00 2001 From: chenyouting <514333061@qq.com> Date: Wed, 17 Sep 2025 10:56:25 +0800 Subject: [PATCH] =?UTF-8?q?=E7=99=BB=E5=BD=95=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../app/controller/AppAuthController.java | 118 ++++++++++++-- .../fuyuanshen/app/model/AppRegisterBody.java | 30 ++++ .../fuyuanshen/app/model/AppSmsLoginBody.java | 11 +- .../app/service/AppRegisterService.java | 145 ++++++++++++++++++ .../service/impl/AppPasswordAuthStrategy.java | 144 +++++++++++++++++ .../common/core/constant/GlobalConstants.java | 10 ++ .../domain/model/AppPasswordLoginBody.java | 31 ++++ 7 files changed, 471 insertions(+), 18 deletions(-) create mode 100644 fys-admin/src/main/java/com/fuyuanshen/app/model/AppRegisterBody.java create mode 100644 fys-admin/src/main/java/com/fuyuanshen/app/service/AppRegisterService.java create mode 100644 fys-admin/src/main/java/com/fuyuanshen/web/service/impl/AppPasswordAuthStrategy.java create mode 100644 fys-common/fys-common-core/src/main/java/com/fuyuanshen/common/core/domain/model/AppPasswordLoginBody.java diff --git a/fys-admin/src/main/java/com/fuyuanshen/app/controller/AppAuthController.java b/fys-admin/src/main/java/com/fuyuanshen/app/controller/AppAuthController.java index d483e457c..980fd55f2 100644 --- a/fys-admin/src/main/java/com/fuyuanshen/app/controller/AppAuthController.java +++ b/fys-admin/src/main/java/com/fuyuanshen/app/controller/AppAuthController.java @@ -4,15 +4,24 @@ import cn.dev33.satoken.annotation.SaIgnore; import cn.dev33.satoken.exception.NotLoginException; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.RandomUtil; +import com.fuyuanshen.app.model.AppRegisterBody; import com.fuyuanshen.app.model.AppSmsLoginBody; import com.fuyuanshen.app.service.AppLoginService; +import com.fuyuanshen.app.service.AppRegisterService; +import com.fuyuanshen.common.core.constant.Constants; +import com.fuyuanshen.common.core.constant.GlobalConstants; import com.fuyuanshen.common.core.constant.SystemConstants; import com.fuyuanshen.common.core.domain.R; +import com.fuyuanshen.common.core.domain.model.AppPasswordLoginBody; import com.fuyuanshen.common.core.domain.model.RegisterBody; import com.fuyuanshen.common.core.domain.model.SmsLoginBody; +import com.fuyuanshen.common.core.enums.LoginType; import com.fuyuanshen.common.core.utils.*; import com.fuyuanshen.common.encrypt.annotation.ApiEncrypt; import com.fuyuanshen.common.json.utils.JsonUtils; +import com.fuyuanshen.common.ratelimiter.annotation.RateLimiter; +import com.fuyuanshen.common.redis.utils.RedisUtils; import com.fuyuanshen.common.satoken.utils.LoginHelper; import com.fuyuanshen.common.tenant.helper.TenantHelper; import com.fuyuanshen.system.domain.bo.SysTenantBo; @@ -27,6 +36,7 @@ import com.fuyuanshen.web.domain.vo.TenantListVo; import com.fuyuanshen.web.service.IAuthStrategy; import com.fuyuanshen.web.service.SysRegisterService; import jakarta.servlet.http.HttpServletRequest; +import jakarta.validation.constraints.NotBlank; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.dromara.sms4j.api.SmsBlend; @@ -36,8 +46,12 @@ import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import java.net.URL; +import java.time.Duration; +import java.util.LinkedHashMap; import java.util.List; +import static com.fuyuanshen.common.core.constant.GlobalConstants.DEVICE_SHARE_CODES_KEY; + /** * APP认证 * @@ -51,7 +65,7 @@ import java.util.List; public class AppAuthController { private final AppLoginService loginService; - private final SysRegisterService registerService; + private final AppRegisterService registerService; private final ISysConfigService configService; private final ISysTenantService tenantService; private final ISysClientService clientService; @@ -66,16 +80,34 @@ public class AppAuthController { @PostMapping("/login") public R login(@RequestBody AppSmsLoginBody appSmsLoginBody) { // SmsLoginBody loginBody = JsonUtils.parseObject(body, SmsLoginBody.class); - ValidatorUtils.validate(appSmsLoginBody); - SmsLoginBody loginBody = new SmsLoginBody(); - loginBody.setPhonenumber(appSmsLoginBody.getPhonenumber()); - loginBody.setSmsCode(appSmsLoginBody.getSmsCode()); - loginBody.setTenantId(appSmsLoginBody.getTenantId()); - loginBody.setClientId("ca839698e245d60aa2f0e59bd52b34f8"); - loginBody.setGrantType("appSms"); + String loginType = appSmsLoginBody.getLoginType(); + String body = ""; // 授权类型和客户端id - String clientId = loginBody.getClientId(); - String grantType = loginBody.getGrantType(); + String clientId = ""; + String grantType = ""; + String tenantId = appSmsLoginBody.getTenantId(); + ValidatorUtils.validate(appSmsLoginBody); + if("2".equals(loginType)){ + AppPasswordLoginBody loginBody = new AppPasswordLoginBody(); + loginBody.setUsername(appSmsLoginBody.getPhonenumber()); + loginBody.setPassword(appSmsLoginBody.getLoginPassword()); + loginBody.setClientId("835b15335d389c9fcfdf99421fa8019b"); + loginBody.setGrantType("appPassword"); + clientId = loginBody.getClientId(); + grantType = loginBody.getGrantType(); + body = JsonUtils.toJsonString(loginBody); + }else{ + SmsLoginBody loginBody = new SmsLoginBody(); + loginBody.setPhonenumber(appSmsLoginBody.getPhonenumber()); + loginBody.setSmsCode(appSmsLoginBody.getSmsCode()); + loginBody.setTenantId(appSmsLoginBody.getTenantId()); + loginBody.setClientId("ca839698e245d60aa2f0e59bd52b34f8"); + loginBody.setGrantType("appSms"); + clientId = loginBody.getClientId(); + grantType = loginBody.getGrantType(); + body = JsonUtils.toJsonString(loginBody); + } + SysClientVo client = clientService.queryByClientId(clientId); // 查询不到 client 或 client 内不包含 grantType if (ObjectUtil.isNull(client) || !StringUtils.contains(client.getGrantType(), grantType)) { @@ -85,9 +117,9 @@ public class AppAuthController { return R.fail(MessageUtils.message("auth.grant.type.blocked")); } // 校验租户 - loginService.checkTenant(loginBody.getTenantId()); +// loginService.checkTenant(loginBody.getTenantId()); + loginService.checkTenant(tenantId); // 登录 - String body = JsonUtils.toJsonString(loginBody); LoginVo loginVo = IAuthStrategy.login(body, client, grantType); return R.ok(loginVo); } @@ -113,16 +145,68 @@ public class AppAuthController { return R.ok("用户注销成功"); } + /** * 用户注册 */ - @ApiEncrypt @PostMapping("/register") - public R register(@Validated @RequestBody RegisterBody user) { - if (!configService.selectRegisterEnabled(user.getTenantId())) { - return R.fail("当前系统没有开启注册功能!"); + public R register(@Validated @RequestBody AppRegisterBody body) { + registerService.register(body); + return R.ok(); + } + + + /** + * 找回密码 + */ + @PostMapping("/forgetPassword") + public R forgetPassword(@Validated @RequestBody AppRegisterBody body) { + registerService.forgetPassword(body); + return R.ok(); + } + + + /** + * 用户注册短信验证码 + * + * @param phonenumber 用户手机号 + */ + @SaIgnore + @RateLimiter(key = "#phonenumber", time = 60, count = 1) + @GetMapping("/registerSmsCode") + public R registerSmsCode(@NotBlank(message = "{user.phonenumber.not.blank}") String phonenumber) { + String key = GlobalConstants.REGISTER_CODE_KEY + phonenumber; + String code = RandomUtil.randomNumbers(4); + RedisUtils.setCacheObject(key, code, Duration.ofMinutes(Constants.CAPTCHA_EXPIRATION)); + LinkedHashMap map = new LinkedHashMap<>(1); + map.put("code", code); + SmsBlend smsBlend = SmsFactory.getSmsBlend("config1"); + SmsResponse smsResponse = smsBlend.sendMessage(phonenumber, map); + if (!smsResponse.isSuccess()) { + return R.fail(smsResponse.getData().toString()); + } + return R.ok(); + } + + /** + * 找回密码短信验证码 + * + * @param phonenumber 用户手机号 + */ + @SaIgnore + @RateLimiter(key = "#phonenumber", time = 60, count = 1) + @GetMapping("/forgetPasswordSmsCode") + public R forgetPasswordSmsCode(@NotBlank(message = "{user.phonenumber.not.blank}") String phonenumber) { + String key = GlobalConstants.FORGET_PASSWORD_CODE_KEY + phonenumber; + String code = RandomUtil.randomNumbers(4); + RedisUtils.setCacheObject(key, code, Duration.ofMinutes(Constants.CAPTCHA_EXPIRATION)); + LinkedHashMap map = new LinkedHashMap<>(1); + map.put("code", code); + SmsBlend smsBlend = SmsFactory.getSmsBlend("config1"); + SmsResponse smsResponse = smsBlend.sendMessage(phonenumber, map); + if (!smsResponse.isSuccess()) { + return R.fail(smsResponse.getData().toString()); } - registerService.register(user); return R.ok(); } diff --git a/fys-admin/src/main/java/com/fuyuanshen/app/model/AppRegisterBody.java b/fys-admin/src/main/java/com/fuyuanshen/app/model/AppRegisterBody.java new file mode 100644 index 000000000..73a737618 --- /dev/null +++ b/fys-admin/src/main/java/com/fuyuanshen/app/model/AppRegisterBody.java @@ -0,0 +1,30 @@ +package com.fuyuanshen.app.model; + +import jakarta.validation.constraints.NotBlank; +import lombok.Data; + +@Data +public class AppRegisterBody { + /** + * 手机号 + */ + @NotBlank(message = "{user.phonenumber.not.blank}") + private String phonenumber; + + /** + * 短信code + */ + private String smsCode; + + /** + * 租户ID + */ + @NotBlank(message = "租户ID不能为空") + private String tenantId; + + + /** + * 登录密码 + */ + private String password; +} diff --git a/fys-admin/src/main/java/com/fuyuanshen/app/model/AppSmsLoginBody.java b/fys-admin/src/main/java/com/fuyuanshen/app/model/AppSmsLoginBody.java index ba91fe5a6..1d1cb8b39 100644 --- a/fys-admin/src/main/java/com/fuyuanshen/app/model/AppSmsLoginBody.java +++ b/fys-admin/src/main/java/com/fuyuanshen/app/model/AppSmsLoginBody.java @@ -14,7 +14,6 @@ public class AppSmsLoginBody { /** * 短信code */ - @NotBlank(message = "{sms.code.not.blank}") private String smsCode; /** @@ -23,4 +22,14 @@ public class AppSmsLoginBody { @NotBlank(message = "租户ID不能为空") private String tenantId; + /** + * 登录方式 1:手机验证码登录 2:密码登录 + */ + @NotBlank(message = "登录方式不能为空") + private String loginType; + + /** + * 登录密码 + */ + private String loginPassword; } diff --git a/fys-admin/src/main/java/com/fuyuanshen/app/service/AppRegisterService.java b/fys-admin/src/main/java/com/fuyuanshen/app/service/AppRegisterService.java new file mode 100644 index 000000000..66361d77f --- /dev/null +++ b/fys-admin/src/main/java/com/fuyuanshen/app/service/AppRegisterService.java @@ -0,0 +1,145 @@ +package com.fuyuanshen.app.service; + +import cn.hutool.crypto.digest.BCrypt; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; +import com.fuyuanshen.app.domain.AppUser; +import com.fuyuanshen.app.mapper.AppUserMapper; +import com.fuyuanshen.app.model.AppRegisterBody; +import com.fuyuanshen.common.core.constant.Constants; +import com.fuyuanshen.common.core.constant.GlobalConstants; +import com.fuyuanshen.common.core.domain.model.RegisterBody; +import com.fuyuanshen.common.core.enums.UserType; +import com.fuyuanshen.common.core.exception.user.CaptchaException; +import com.fuyuanshen.common.core.exception.user.CaptchaExpireException; +import com.fuyuanshen.common.core.exception.user.UserException; +import com.fuyuanshen.common.core.utils.MessageUtils; +import com.fuyuanshen.common.core.utils.ServletUtils; +import com.fuyuanshen.common.core.utils.SpringUtils; +import com.fuyuanshen.common.core.utils.StringUtils; +import com.fuyuanshen.common.log.event.LogininforEvent; +import com.fuyuanshen.common.redis.utils.RedisUtils; +import com.fuyuanshen.common.tenant.helper.TenantHelper; +import com.fuyuanshen.common.web.config.properties.CaptchaProperties; +import com.fuyuanshen.system.domain.SysUser; +import com.fuyuanshen.system.domain.bo.SysUserBo; +import com.fuyuanshen.system.mapper.SysUserMapper; +import com.fuyuanshen.system.service.ISysUserService; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +import java.util.Date; + +/** + * 注册校验方法 + * + * @author Lion Li + */ +@RequiredArgsConstructor +@Service +public class AppRegisterService { + + private final IAppUserService userService; + private final AppUserMapper userMapper; + + /** + * 注册 + */ + public void register(AppRegisterBody registerBody) { + String tenantId = registerBody.getTenantId(); + String username = registerBody.getPhonenumber(); + String password = registerBody.getPassword(); + + boolean codeValidate = validateRegisterSmsCode(tenantId, username, registerBody.getSmsCode()); + if (!codeValidate) { + throw new CaptchaException(); + } + + // 校验用户类型是否存在 + String userType = UserType.APP_USER.getUserType(); + + boolean exist = TenantHelper.dynamic(tenantId, () -> { + return userMapper.exists(new LambdaQueryWrapper() + .eq(AppUser::getUserName, username)); + }); + if (exist) { + throw new UserException("user.register.save.error", username); + } + AppUser appUser = new AppUser(); + appUser.setPhonenumber(username); + appUser.setUserName(username); + appUser.setStatus("0"); + appUser.setLoginDate(new Date()); + appUser.setLoginIp(ServletUtils.getClientIP()); + appUser.setTenantId(tenantId); + appUser.setPassword(password); + appUser.setUserType(userType); + userMapper.insert(appUser); + recordLogininfor(tenantId, username, Constants.REGISTER, MessageUtils.message("user.register.success")); + } + + /** + * 注册校验短信验证码 + */ + private boolean validateRegisterSmsCode(String tenantId, String phonenumber, String smsCode) { + String code = RedisUtils.getCacheObject(GlobalConstants.REGISTER_CODE_KEY + phonenumber); + if (StringUtils.isBlank(code)) { + recordLogininfor(tenantId, phonenumber, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.expire")); + throw new CaptchaExpireException(); + } + return code.equals(smsCode); + } + + /** + * 忘记密码校验验证码 + */ + private boolean validateForgetPasswordCode(String tenantId, String phonenumber, String smsCode) { + String code = RedisUtils.getCacheObject(GlobalConstants.FORGET_PASSWORD_CODE_KEY + phonenumber); + if (StringUtils.isBlank(code)) { + recordLogininfor(tenantId, phonenumber, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.expire")); + throw new CaptchaExpireException(); + } + return code.equals(smsCode); + } + + /** + * 记录登录信息 + * + * @param tenantId 租户ID + * @param username 用户名 + * @param status 状态 + * @param message 消息内容 + * @return + */ + private void recordLogininfor(String tenantId, String username, String status, String message) { + LogininforEvent logininforEvent = new LogininforEvent(); + logininforEvent.setTenantId(tenantId); + logininforEvent.setUsername(username); + logininforEvent.setStatus(status); + logininforEvent.setMessage(message); + logininforEvent.setRequest(ServletUtils.getRequest()); + SpringUtils.context().publishEvent(logininforEvent); + } + + public void forgetPassword(AppRegisterBody registerBody) { + String tenantId = registerBody.getTenantId(); + String username = registerBody.getPhonenumber(); + String password = registerBody.getPassword(); + boolean codeValidate = validateForgetPasswordCode(tenantId, username, registerBody.getSmsCode()); + if (!codeValidate) { + throw new CaptchaException(); + } + boolean exist = TenantHelper.dynamic(tenantId, () -> { + return userMapper.exists(new LambdaQueryWrapper() + .eq(AppUser::getUserName, username)); + }); + if (!exist) { + throw new UserException("用户不存在"); + } + + UpdateWrapper updateWrapper = new UpdateWrapper<>(); + updateWrapper.eq("user_name", username) + .set("password", password); + userMapper.update(updateWrapper); + } +} diff --git a/fys-admin/src/main/java/com/fuyuanshen/web/service/impl/AppPasswordAuthStrategy.java b/fys-admin/src/main/java/com/fuyuanshen/web/service/impl/AppPasswordAuthStrategy.java new file mode 100644 index 000000000..2d1b0468a --- /dev/null +++ b/fys-admin/src/main/java/com/fuyuanshen/web/service/impl/AppPasswordAuthStrategy.java @@ -0,0 +1,144 @@ +package com.fuyuanshen.web.service.impl; + +import cn.dev33.satoken.stp.StpUtil; +import cn.dev33.satoken.stp.parameter.SaLoginParameter; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.crypto.digest.BCrypt; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.fuyuanshen.app.domain.AppUser; +import com.fuyuanshen.app.domain.vo.AppUserVo; +import com.fuyuanshen.app.mapper.AppUserMapper; +import com.fuyuanshen.app.service.AppLoginService; +import com.fuyuanshen.common.core.constant.Constants; +import com.fuyuanshen.common.core.constant.GlobalConstants; +import com.fuyuanshen.common.core.constant.SystemConstants; +import com.fuyuanshen.common.core.domain.model.AppLoginUser; +import com.fuyuanshen.common.core.domain.model.LoginUser; +import com.fuyuanshen.common.core.domain.model.PasswordLoginBody; +import com.fuyuanshen.common.core.enums.LoginType; +import com.fuyuanshen.common.core.enums.UserType; +import com.fuyuanshen.common.core.exception.user.CaptchaException; +import com.fuyuanshen.common.core.exception.user.CaptchaExpireException; +import com.fuyuanshen.common.core.exception.user.UserException; +import com.fuyuanshen.common.core.utils.MessageUtils; +import com.fuyuanshen.common.core.utils.StringUtils; +import com.fuyuanshen.common.core.utils.ValidatorUtils; +import com.fuyuanshen.common.json.utils.JsonUtils; +import com.fuyuanshen.common.redis.utils.RedisUtils; +import com.fuyuanshen.common.satoken.utils.AppLoginHelper; +import com.fuyuanshen.common.satoken.utils.LoginHelper; +import com.fuyuanshen.common.tenant.helper.TenantHelper; +import com.fuyuanshen.common.web.config.properties.CaptchaProperties; +import com.fuyuanshen.system.domain.SysUser; +import com.fuyuanshen.system.domain.vo.SysClientVo; +import com.fuyuanshen.system.domain.vo.SysUserVo; +import com.fuyuanshen.system.mapper.SysUserMapper; +import com.fuyuanshen.web.domain.vo.LoginVo; +import com.fuyuanshen.web.service.IAuthStrategy; +import com.fuyuanshen.web.service.SysLoginService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +/** + * APP密码认证策略 + * + * @author Michelle.Chung + */ +@Slf4j +@Service("appPassword" + IAuthStrategy.BASE_NAME) +@RequiredArgsConstructor +public class AppPasswordAuthStrategy implements IAuthStrategy { + + private final CaptchaProperties captchaProperties; + private final AppLoginService loginService; + private final AppUserMapper appUserMapper; + + @Override + public LoginVo login(String body, SysClientVo client) { + PasswordLoginBody loginBody = JsonUtils.parseObject(body, PasswordLoginBody.class); + ValidatorUtils.validate(loginBody); + String tenantId = loginBody.getTenantId(); + String username = loginBody.getUsername(); + String password = loginBody.getPassword(); + String code = loginBody.getCode(); + String uuid = loginBody.getUuid(); + +// boolean captchaEnabled = captchaProperties.getEnable(); +// // 验证码开关 +// if (captchaEnabled) { +// validateCaptcha(tenantId, username, code, uuid); +// } + AppLoginUser loginUser = TenantHelper.dynamic(tenantId, () -> { + AppUserVo user = loadUserByUsername(username); + loginService.checkLogin(LoginType.PASSWORD, tenantId, username, () -> !StringUtils.equals(password, user.getPassword())); + // 此处可根据登录用户的数据不同 自行创建 loginUser + return loginService.buildLoginUser(user); + }); + loginUser.setClientKey(client.getClientKey()); + loginUser.setDeviceType(client.getDeviceType()); + SaLoginParameter model = new SaLoginParameter(); + model.setDeviceType(client.getDeviceType()); + // 自定义分配 不同用户体系 不同 token 授权时间 不设置默认走全局 yml 配置 + // 例如: 后台用户30分钟过期 app用户1天过期 + model.setTimeout(client.getTimeout()); + model.setActiveTimeout(client.getActiveTimeout()); + model.setExtra(LoginHelper.CLIENT_KEY, client.getClientId()); + // 生成token + AppLoginHelper.login(loginUser, model); + + LoginVo loginVo = new LoginVo(); + loginVo.setAccessToken(StpUtil.getTokenValue()); + loginVo.setExpireIn(StpUtil.getTokenTimeout()); + loginVo.setClientId(client.getClientId()); + return loginVo; + } + + /** + * 校验验证码 + * + * @param username 用户名 + * @param code 验证码 + * @param uuid 唯一标识 + */ + private void validateCaptcha(String tenantId, String username, String code, String uuid) { + String verifyKey = GlobalConstants.CAPTCHA_CODE_KEY + StringUtils.blankToDefault(uuid, ""); + String captcha = RedisUtils.getCacheObject(verifyKey); + RedisUtils.deleteObject(verifyKey); + if (captcha == null) { + loginService.recordLogininfor(tenantId, username, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.expire")); + throw new CaptchaExpireException(); + } + if (!code.equalsIgnoreCase(captcha)) { + loginService.recordLogininfor(tenantId, username, Constants.LOGIN_FAIL, MessageUtils.message("user.jcaptcha.error")); + throw new CaptchaException(); + } + } + + private AppUserVo loadUserByUsername(String username) { +// SysUserVo user = userMapper.selectVoOne(new LambdaQueryWrapper().eq(SysUser::getUserName, username)); +// if (ObjectUtil.isNull(user)) { +// log.info("登录用户:{} 不存在.", username); +// throw new UserException("user.not.exists", username); +// } else if (SystemConstants.DISABLE.equals(user.getStatus())) { +// log.info("登录用户:{} 已被停用.", username); +// throw new UserException("user.blocked", username); +// } +// return user; + + AppUserVo user = appUserMapper.selectVoOne(new LambdaQueryWrapper() + .eq(AppUser::getPhonenumber, username) + .eq(AppUser::getUserType, UserType.APP_USER.getUserType())); + if (ObjectUtil.isNull(user)) { + log.info("登录用户:{} 不存在.", username); +// throw new UserException("user.not.exists", phonenumber); + // 新增AppUser用户 + return null; + } else if (SystemConstants.DISABLE.equals(user.getStatus())) { + log.info("登录用户:{} 已被停用.", username); + throw new UserException("user.blocked", username); + } + return user; + } + +} diff --git a/fys-common/fys-common-core/src/main/java/com/fuyuanshen/common/core/constant/GlobalConstants.java b/fys-common/fys-common-core/src/main/java/com/fuyuanshen/common/core/constant/GlobalConstants.java index 3eaad963d..72deb0060 100644 --- a/fys-common/fys-common-core/src/main/java/com/fuyuanshen/common/core/constant/GlobalConstants.java +++ b/fys-common/fys-common-core/src/main/java/com/fuyuanshen/common/core/constant/GlobalConstants.java @@ -17,6 +17,16 @@ public interface GlobalConstants { */ String CAPTCHA_CODE_KEY = GLOBAL_REDIS_KEY + "captcha_codes:"; + /** + * 忘记密码验证码 redis key + */ + String FORGET_PASSWORD_CODE_KEY = GLOBAL_REDIS_KEY + "forget_password_codes:"; + + /** + * 注册验证码 redis key + */ + String REGISTER_CODE_KEY = GLOBAL_REDIS_KEY + "register_codes:"; + /** * 设备分享验证码 redis key */ diff --git a/fys-common/fys-common-core/src/main/java/com/fuyuanshen/common/core/domain/model/AppPasswordLoginBody.java b/fys-common/fys-common-core/src/main/java/com/fuyuanshen/common/core/domain/model/AppPasswordLoginBody.java new file mode 100644 index 000000000..1a167799f --- /dev/null +++ b/fys-common/fys-common-core/src/main/java/com/fuyuanshen/common/core/domain/model/AppPasswordLoginBody.java @@ -0,0 +1,31 @@ +package com.fuyuanshen.common.core.domain.model; + +import jakarta.validation.constraints.NotBlank; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.hibernate.validator.constraints.Length; + +/** + * 密码登录对象 + * + * @author Lion Li + */ +@Data +@EqualsAndHashCode(callSuper = true) +public class AppPasswordLoginBody extends LoginBody { + + /** + * 用户名 + */ + @NotBlank(message = "{user.username.not.blank}") + @Length(min = 2, max = 30, message = "{user.username.length.valid}") + private String username; + + /** + * 用户密码 + */ + @NotBlank(message = "{user.password.not.blank}") + @Length(min = 5, max = 30, message = "{user.password.length.valid}") + private String password; + +}