添加一体机登录接口
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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无指纹信息*/
|
||||
}
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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];
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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
|
||||
|
||||
@@ -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分钟,自动刷新缓存
|
||||
*
|
||||
|
||||
Reference in New Issue
Block a user