修改登录-添加先排除网格员

This commit is contained in:
sh
2025-12-24 12:51:56 +08:00
parent 0199c91dbd
commit 4ad2a85850
4 changed files with 154 additions and 26 deletions

View File

@@ -285,6 +285,7 @@ public class OauthLoginHlwService {
appUserParm.setPhone(wwTyInfo.getPhone());
appUserParm.setIdCard(wwTyInfo.getIdno());
appUserParm.setName(wwTyInfo.getName());
appUserParm.setIsCompanyUser(StringUtil.IS_JOB_REQUEST_USER);
code=wwTyInfo.getIdno();
break;
default:
@@ -294,9 +295,11 @@ public class OauthLoginHlwService {
//企业联系人->现根据社会信用代码查询企业信息
updateCompanyContact(wwTyInfo);
//移动端
appUserParm.setPhone(wwTyInfo.getPhone());
String phone = StringUtils.isNotBlank(wwTyInfo.getPhone()) ? wwTyInfo.getPhone() : wwTyInfo.getContactphone();
appUserParm.setPhone(phone);
appUserParm.setIdCard(wwTyInfo.getEnterprisecode());
appUserParm.setName(wwTyInfo.getEnterprisename());
appUserParm.setIsCompanyUser(StringUtil.IS_COMPANY_USER);
code=wwTyInfo.getEnterprisecode();
}
String localUsername=StringUtil.USER_KEY+code;

View File

@@ -43,6 +43,7 @@ import com.ruoyi.system.service.ISysUserService;
import org.springframework.transaction.annotation.Transactional;
import java.util.Date;
import java.util.concurrent.TimeUnit;
/**
* 登录校验方法
@@ -321,41 +322,68 @@ public class SysLoginService
/**
* 小程序登录主逻辑
* 核心逻辑优先处理网格员is_company_user=2再处理普通招聘者/求职者
*/
public AjaxResult appLoginNew(LoginBody dto) {
//1.验证基础参数
// 1. 验证基础参数前端userType仅0/1拦截非法参数
AjaxResult validateResult = validateBaseParam(dto);
if (validateResult != null) {
return validateResult;
}
try {
//2. 微信授权获取OpenID/UnionID/SessionKey
// 2. 微信授权获取OpenID/UnionID/SessionKey网格员查询依赖OpenID
WechatAuthVO wechatAuthVO = getWechatAuthInfo(dto.getCode());
if (wechatAuthVO == null) {
System.err.println("小程序登录失败微信授权返回null");
return AjaxResult.error("微信授权失败");
}
String openid = wechatAuthVO.getOpenid();
String unionid = wechatAuthVO.getUnionid();
String sessionKey = wechatAuthVO.getSessionKey();
String userType = dto.getUserType();
//3. 优先匹配「OpenID+角色」的老用户
AppUser existingUser = appUserService.selectByOpenid(openid,userType);
if (existingUser != null) {
return handleExistingUser(existingUser, userType);
if (StringUtils.isEmpty(openid)) {
System.err.println("小程序登录失败微信授权返回openid为空");
return AjaxResult.error("微信授权失败");
}
// 4. 解密获取手机号(含二次校验
// 3. 第一步通过OpenID优先查询网格员无需解密手机号效率更高
AppUser openidSpecialUser = appUserService.selectByOpenid(openid, StringUtil.IS_GRID_USER);
if (openidSpecialUser != null) {
System.out.printf("小程序登录-匹配到OpenID网格员openid=%s, phone=%s%n",
openidSpecialUser.getOpenid(), openidSpecialUser.getPhone());
return handleSpecialUserLogin(openidSpecialUser);
}
// 4. 解密获取手机号(含二次校验)- 网格员兜底查询/普通用户登录依赖
String phone = decryptPhone(dto, sessionKey);
if (phone == null) {
System.err.println("小程序登录失败手机号解密失败openid=" + openid);
return AjaxResult.error("获取手机号失败");
}
// 5. 处理用户匹配与注册(核心逻辑拆分到独立方法
// 5. 第二步通过手机号查询网格员OpenID未匹配时兜底
AppUser phoneSpecialUser = appUserService.getPhoneAndUserType(phone, StringUtil.IS_GRID_USER);
if (phoneSpecialUser != null) {
System.out.printf("小程序登录-匹配到手机号网格员phone=%s, openid=%s%n",
phoneSpecialUser.getPhone(), phoneSpecialUser.getOpenid());
return handleSpecialUserLogin(phoneSpecialUser);
}
// 6. 非网格员:处理普通用户(招聘者/求职者)登录逻辑
String userType = dto.getUserType();
// 6.1 优先匹配「OpenID+前端传入角色」的老用户
AppUser existingUser = appUserService.selectByOpenid(openid, userType);
if (existingUser != null) {
System.out.printf("小程序登录-匹配到普通老用户openid=%s, userType=%s%n", openid, userType);
return handleExistingUser(existingUser, userType);
}
// 6.2 处理普通用户的匹配与注册(手机号绑定、新用户创建等)
return handleUserMatchAndRegister(openid, unionid, phone, userType);
} catch (Exception e) {
System.err.println("登录失败" + e.getMessage());
System.err.println("小程序登录异常" + e.getMessage());
e.printStackTrace();
return AjaxResult.error("登录失败,请稍后重试");
}
}
@@ -470,7 +498,7 @@ public class SysLoginService
*/
private AjaxResult handleNoRoleUserBinding(String openid, String unionid, String phone, String userType, AppUser noRoleUser) {
String lockKey = "login_no_role_bind_" + phone + "_" + userType;
try (DistributedLockUtil.AutoReleaseLock lock = distributedLockUtil.tryLock(lockKey)) {
try (DistributedLockUtil.AutoReleaseLock lock = distributedLockUtil.tryLock(lockKey, 3, TimeUnit.SECONDS)) {
if (!lock.isLocked()) {
return AjaxResult.error("登录请求过于频繁,请稍后重试");
}
@@ -493,7 +521,7 @@ public class SysLoginService
*/
private AjaxResult handleNewUserRegistration(String openid, String unionid, String phone, String userType) {
String createLockKey = "login_create_" + phone + "_" + userType;
try (DistributedLockUtil.AutoReleaseLock lock = distributedLockUtil.tryLock(createLockKey)) {
try (DistributedLockUtil.AutoReleaseLock lock = distributedLockUtil.tryLock(createLockKey, 3, TimeUnit.SECONDS)) {
if (!lock.isLocked()) {
return AjaxResult.error("登录请求过于频繁,请稍后重试");
}
@@ -506,6 +534,33 @@ public class SysLoginService
}
}
/**
* 8-特殊处理-网格员登录
* @param specialUser
* @return
*/
private AjaxResult handleSpecialUserLogin(AppUser specialUser) {
String lockKey = "login_grid_user_" + specialUser.getUserId(); // 按用户ID加锁
try (DistributedLockUtil.AutoReleaseLock lock = distributedLockUtil.tryLock(lockKey, 2, TimeUnit.SECONDS)) {
if (!lock.isLocked()) {
System.err.println("网格员登录请求过于频繁userId=" + specialUser.getUserId());
return AjaxResult.error("登录请求过于频繁,请稍后重试");
}
// 原有逻辑更新登录时间、生成token
AjaxResult ajax = AjaxResult.success();
updateAppUserCommon(specialUser, null, null, null);
String token = loginUserIdApp(specialUser);
ajax.put(Constants.TOKEN, token);
ajax.put("isNewUser", false);
ajax.put("idCard", StringUtil.desensitizeIdCard(specialUser.getIdCard()));
ajax.put("isCompanyUser", specialUser.getIsCompanyUser());
System.out.printf("特殊角色用户登录成功openid:%s, phone:%s, 角色:%s%n",
specialUser.getOpenid(), StringUtil.desensitizePhone(specialUser.getPhone()), specialUser.getIsCompanyUser());
System.out.println(ParamErrorConstants.LOG_AJAX_RETURN + JSON.toJSONString(ajax));
return ajax;
}
}
/**
* 处理老用户登录日志用println
*/