[add] app注册、登录、实名认证、人员展示、通知

This commit is contained in:
lcj
2025-07-24 17:36:30 +08:00
parent e6a98ad0bd
commit 3d2f4b05ff
55 changed files with 1998 additions and 213 deletions

View File

@ -80,7 +80,7 @@ public class AuthController {
* @param body 登录信息
* @return 结果
*/
@ApiEncrypt
// @ApiEncrypt
@PostMapping("/login")
public R<LoginVo> login(@RequestBody String body) {
LoginBody loginBody = JsonUtils.parseObject(body, LoginBody.class);
@ -183,7 +183,7 @@ public class AuthController {
/**
* 用户注册
*/
@ApiEncrypt
// @ApiEncrypt
@PostMapping("/register")
public R<Void> register(@Validated @RequestBody RegisterBody user) {
if (!configService.selectRegisterEnabled(user.getTenantId())) {

View File

@ -1,6 +1,7 @@
package org.dromara.web.service;
import cn.dev33.satoken.secure.BCrypt;
import cn.hutool.core.util.RandomUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import lombok.RequiredArgsConstructor;
import org.dromara.common.core.constant.Constants;
@ -43,6 +44,7 @@ public class SysRegisterService {
public void register(RegisterBody registerBody) {
String tenantId = registerBody.getTenantId();
String username = registerBody.getUsername();
String phonenumber = registerBody.getPhonenumber();
String password = registerBody.getPassword();
// 校验用户类型是否存在
String userType = UserType.getUserType(registerBody.getUserType()).getUserType();
@ -52,6 +54,15 @@ public class SysRegisterService {
if (!isValid) {
throw new UserException("注册失败密码需满足818位包含大小写字母、数字、特殊字符中的至少三种组合");
}
String middleFour = phonenumber.substring(3, 7);
if (StringUtils.isBlank(username)) {
do {
// 生成 6 位随机字母,并转为小写
String randomSix = RandomUtil.randomString(6).toLowerCase();
username = randomSix + middleFour;
// 如果已有同名记录,循环继续
} while (existsUsername(username));
}
boolean captchaEnabled = captchaProperties.getEnable();
// 验证码开关
if (captchaEnabled) {
@ -62,6 +73,7 @@ public class SysRegisterService {
sysUser.setNickName(username);
sysUser.setPassword(BCrypt.hashpw(password));
sysUser.setUserType(userType);
sysUser.setPhonenumber(phonenumber);
boolean exist = TenantHelper.dynamic(tenantId, () -> {
return userMapper.exists(new LambdaQueryWrapper<SysUser>()
@ -77,6 +89,13 @@ public class SysRegisterService {
recordLogininfor(tenantId, username, Constants.REGISTER, MessageUtils.message("user.register.success"));
}
private boolean existsUsername(String username) {
LambdaQueryWrapper<SysUser> qw = new LambdaQueryWrapper<>();
qw.eq(SysUser::getUserName, username);
// selectCount 性能足够,若并发极高可改为 exists 查询
return userMapper.selectCount(qw) > 0;
}
/**
* 校验验证码
*

View File

@ -54,17 +54,31 @@ public class PasswordAuthStrategy implements IAuthStrategy {
String tenantId = loginBody.getTenantId();
String username = loginBody.getUsername();
String password = loginBody.getPassword();
String phonenumber = loginBody.getPhonenumber();
String code = loginBody.getCode();
String uuid = loginBody.getUuid();
// 2. 如果没传用户名,用手机号去查,并写到新的局部变量里
String finalUsername;
if (StringUtils.isAllBlank(username, phonenumber)) {
throw new UserException("用户名或手机号不能为空");
}
if (StringUtils.isBlank(username)) {
SysUserVo sysUserVo = userMapper.selectVoOne(
new LambdaQueryWrapper<SysUser>()
.eq(SysUser::getPhonenumber, phonenumber)
);
finalUsername = sysUserVo.getUserName();
} else {
finalUsername = username;
}
boolean captchaEnabled = captchaProperties.getEnable();
// 验证码开关
if (captchaEnabled) {
validateCaptcha(tenantId, username, code, uuid);
validateCaptcha(tenantId, finalUsername, code, uuid);
}
LoginUser loginUser = TenantHelper.dynamic(tenantId, () -> {
SysUserVo user = loadUserByUsername(username);
loginService.checkLogin(LoginType.PASSWORD, tenantId, username, () -> !BCrypt.checkpw(password, user.getPassword()));
SysUserVo user = loadUserByUsername(finalUsername);
loginService.checkLogin(LoginType.PASSWORD, tenantId, finalUsername, () -> !BCrypt.checkpw(password, user.getPassword()));
// 此处可根据登录用户的数据不同 自行创建 loginUser
return loginService.buildLoginUser(user);
});

View File

@ -8,7 +8,7 @@ ruoyi:
copyrightYear: 2024
captcha:
enable: true
enable: false
# 页面 <参数设置> 可开启关闭 验证码校验
# 验证码类型 math 数组计算 char 字符验证
type: MATH
@ -193,7 +193,6 @@ api-decrypt:
- /v3/api-docs/** # 放行OpenAPI文档
- /actuator/** # 放行监控接口
- /other/ys7Device/webhook # 放行萤石云设备回调接口
- /auth/register # 放行注册接口
springdoc:
api-docs: