添加一体机登录接口

This commit is contained in:
chenshaohua
2026-05-12 13:07:58 +08:00
parent 0648e1f70c
commit aed2093175
6 changed files with 175 additions and 2 deletions

View File

@@ -3,6 +3,7 @@ package com.ruoyi.web.controller.system;
import java.util.List;
import java.util.Set;
import com.ruoyi.cms.domain.IDCardInfo;
import com.ruoyi.common.core.domain.entity.tymh.wwToken.WwTokenResult;
import com.ruoyi.common.core.domain.entity.tymh.wwToken.WwUserLogin;
import com.ruoyi.common.core.domain.model.RegisterBody;
@@ -109,6 +110,26 @@ public class SysLoginController
return ajax;
}
/**
* 一体机识别身份证登录
* @param info
* @return
*/
@PostMapping("/app/idCardScan")
public AjaxResult idCardScan(@RequestBody IDCardInfo info){
if (StringUtils.isBlank(info.getIdNO())) {
return AjaxResult.error("身份证号码不能为空,请重新刷卡");
}
if (!StringUtils.isIdCardValid(info.getIdNO())) {
return AjaxResult.error("身份证号码格式无效,请重新刷卡");
}
String msg = StringUtils.checkIdCardExpire(info.getExpireDate());
if (!msg.isEmpty()) {
return AjaxResult.error(msg);
}
return loginService.idCardScan(info);
}
/**
* 一体机手机号/密码登录
* @param loginBody

View File

@@ -0,0 +1,27 @@
package com.ruoyi.cms.domain;
import lombok.Data;
@Data
public class IDCardInfo {
public String name;/*中文姓名*/
public String enFullName; /*英文姓名*/
public String sex;/*性别*/
public String nation;/*民族*/
public String address; /*地址*/
public String birthDate;/*出生日期YYYYMMDD*/
public String issueDate; /*发证日期YYYYMMDD*/
public String expireDate;/*有效日期YYYYMMDD*/
public String idNO; /*证件号码*/
public String organs; /*发证机关(或外国人永久居住正-当次申请受理机关)*/
public String nationality; /*国籍*/
public byte[] photo; /*相片原始信息,例如 574C66007E00320000....*/
public String other;
public String passNu;/*通行证号*/
public String signCount; /*签发数次*/
public String certVersion; /*证件版本*/
public String certType; /*卡片类型0居民身份证I外国人J港澳台Y新版外国人*/
public String reserveName;/*英文姓名备用*/
public String previousVersionNO;/*既往版本永居证号码*/
public byte[] figData = new byte[1024];/*Uniapp无指纹信息*/
}

View File

@@ -213,4 +213,20 @@ public class StringUtil {
return "***";
}
}
/**
* 转大写
* @param str
* @return
*/
public static String toUpperCaseIgnoreBlank(String str) {
if (str == null) {
return null;
}
String trimmedStr = str.trim();
if (trimmedStr.isEmpty()) {
return str;
}
return str.toUpperCase();
}
}

View File

@@ -1,5 +1,7 @@
package com.ruoyi.common.utils;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
@@ -681,4 +683,54 @@ public class StringUtils extends org.apache.commons.lang3.StringUtils
}
return sb.toString();
}
/**
* 验证身份证有效期
* @param expireDate
* @return
*/
public static String checkIdCardExpire(String expireDate) {
// 空、空白 判定无效证件
if (expireDate == null || "".equals(expireDate.trim())) {
return "身份证无效,请重新刷卡";
}
String date = expireDate.trim();
// 长期有效 直接通过
if ("99991231".equals(date)) {
return "";
}
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMdd");
String nowDate = LocalDate.now().format(formatter);
// 已过期
if (nowDate.compareTo(date) >= 0) {
return "身份证已过有效期,请更换有效证件";
}
// 正常有效
return "";
}
/**
* 校验身份证号码是否合法18位支持校验码
*/
public static boolean isIdCardValid(String idCard) {
if (idCard == null || idCard.trim().length() != 18) {
return false;
}
// 前17位都是数字
String code = idCard.trim();
if (!code.substring(0, 17).matches("[0-9]+")) {
return false;
}
// 校验码验证(标准算法)
char[] chars = code.toCharArray();
int[] weights = {7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2};
char[] codes = {'1','0','X','9','8','7','6','5','4','3','2'};
int sum = 0;
for (int i = 0; i < 17; i++) {
sum += (chars[i] - '0') * weights[i];
}
int mod = sum % 11;
return chars[17] == codes[mod];
}
}

View File

@@ -4,6 +4,7 @@ import javax.annotation.Resource;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson2.JSON;
import com.ruoyi.cms.domain.IDCardInfo;
import com.ruoyi.cms.domain.vo.WechatAuthVO;
import com.ruoyi.cms.mapper.CompanyMapper;
import com.ruoyi.cms.service.IAppUserService;
@@ -195,8 +196,8 @@ public class SysLoginService
recordLoginInfo(appUser);
AsyncManager.me().execute(AsyncFactory.recordLogininfor(appUser.getName(), Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success")));
recordLoginInfo(appUser);
// 生成token //tokenSiteService.createToken(loginSiteUser) 有时间
return tokenSiteService.noExpireCreateToken(loginSiteUser);
// 生成token //tokenSiteService.createToken(loginSiteUser) 有时间//noExpireCreateToken
return tokenSiteService.createTokenHourTwo(loginSiteUser);
}
//单点登录
@@ -740,6 +741,36 @@ public class SysLoginService
return getAjax(appUser);
}
/**
* 一体机扫描身份证
* @param info
* @return
*/
public AjaxResult idCardScan(IDCardInfo info){
AjaxResult ajax = AjaxResult.success();
AppUser appUser=appUserService.selectAppuserByIdcard(StringUtil.toUpperCaseIgnoreBlank(info.getIdNO()));
if(appUser==null){
appUser=new AppUser();
appUser.setName(info.getName());
appUser.setSex(DictUtils.getDictValue("app_sex",info.getSex()));
appUser.setNation(DictUtils.getDictValue("nation",info.getNation()));
appUser.setAddress(info.getAddress());
appUser.setBirthDate(info.getBirthDate());
appUser.setIdCard(info.getIdNO());
try {
appUserService.insertAppUser(appUser);
}catch (Exception e){
return AjaxResult.error(e.getMessage());
}
ajax.put("isNewUser", true);
}else{
ajax.put("isNewUser", false);
}
String token=loginUserIdApp(appUser);
ajax.put(Constants.TOKEN, token);
return ajax;
}
/**
* 获取ajax
* @param appUser

View File

@@ -147,6 +147,32 @@ public class TokenSiteService
return createToken(claims);
}
/**
* 超时时间为2个小时
* @param LoginSiteUser
* @return
*/
public String createTokenHourTwo(LoginSiteUser LoginSiteUser)
{
String token = IdUtils.fastUUID();
LoginSiteUser.setToken(token);
setUserAgent(LoginSiteUser);
//redis存2个小时
String userKey = getTokenKey(token, String.valueOf(LoginSiteUser.getUserId()));
redisCache.setCacheObject(userKey, LoginSiteUser, 2, TimeUnit.HOURS);
Map<String, Object> claims = new HashMap<>();
claims.put(Constants.APP_LOGIN_USER_KEY, token);
claims.put(Constants.APP_LOGIN_USER_ID, LoginSiteUser.getUserId());
// 当前时间 + 120 分钟
long currentTimeMillis = System.currentTimeMillis();
long expireTimeMillis = currentTimeMillis + ((long) expireTime * 3 * 60 * 1000); // 12分钟 = 1800000 毫秒
long expireTimeSeconds = expireTimeMillis / 1000; // 转换为秒(时间戳)
claims.put(Constants.EXP, expireTimeSeconds);
return createToken(claims);
}
/**
* 验证令牌有效期相差不足20分钟自动刷新缓存
*