diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java index c7053aa..81628f0 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java @@ -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 diff --git a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/domain/IDCardInfo.java b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/domain/IDCardInfo.java new file mode 100644 index 0000000..8ab0e0b --- /dev/null +++ b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/domain/IDCardInfo.java @@ -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无指纹信息*/ +} \ No newline at end of file diff --git a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/util/StringUtil.java b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/util/StringUtil.java index c519617..a248420 100644 --- a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/util/StringUtil.java +++ b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/util/StringUtil.java @@ -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(); + } } diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/StringUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/StringUtils.java index 25c2886..9ddb69c 100644 --- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/StringUtils.java +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/StringUtils.java @@ -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]; + } + } \ No newline at end of file diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SysLoginService.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SysLoginService.java index afa9795..c6ad00f 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SysLoginService.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SysLoginService.java @@ -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 diff --git a/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/TokenSiteService.java b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/TokenSiteService.java index 2ff0fd3..f1d6928 100644 --- a/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/TokenSiteService.java +++ b/ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/TokenSiteService.java @@ -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 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分钟,自动刷新缓存 *