diff --git a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/controller/cms/CommunityUserController.java b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/controller/cms/CommunityUserController.java index a1082d9..81a1913 100644 --- a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/controller/cms/CommunityUserController.java +++ b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/controller/cms/CommunityUserController.java @@ -2,6 +2,7 @@ package com.ruoyi.cms.controller.cms; import com.ruoyi.cms.domain.CommunityUser; import com.ruoyi.cms.service.ICommunityUserService; +import com.ruoyi.cms.util.encrypt.QuickValidUtils; import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.core.page.TableDataInfo; @@ -35,6 +36,8 @@ public class CommunityUserController extends BaseController { @PreAuthorize("@ss.hasPermi('application:mgmt:add')") @PostMapping public AjaxResult add(@RequestBody CommunityUser communityUser) { + //联系方式添加保密性和完整性 + QuickValidUtils.savePhoneSm4(communityUser); return toAjax(communityUserService.save(communityUser)); } @@ -42,6 +45,8 @@ public class CommunityUserController extends BaseController { @PreAuthorize("@ss.hasPermi('application:mgmt:edit')") @PutMapping public AjaxResult update(@RequestBody CommunityUser communityUser) { + //联系方式添加保密性和完整性 + QuickValidUtils.savePhoneSm4(communityUser); return toAjax(communityUserService.updateById(communityUser)); } diff --git a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/cron/JobCron.java b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/cron/JobCron.java index f452758..5936f24 100644 --- a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/cron/JobCron.java +++ b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/cron/JobCron.java @@ -1,10 +1,7 @@ package com.ruoyi.cms.cron; import com.ruoyi.cms.mapper.JobMapper; -import com.ruoyi.cms.service.IBussinessOperLogService; -import com.ruoyi.cms.service.ICompanyService; -import com.ruoyi.cms.service.IESJobSearchService; -import com.ruoyi.cms.service.IJobService; +import com.ruoyi.cms.service.*; import com.ruoyi.common.utils.spring.SpringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -28,4 +25,18 @@ public class JobCron { } //下架过期岗位 public void updateJobDown(){SpringUtils.getBean(IJobService.class).updateJobDown();} + //批量修改app_user + public void updateAppUserEncrypt(){SpringUtils.getBean(IAppUserService.class).updateAppUserEncrypt(); } + //批量更新工作人员配置 + public void updateCommunityUserEncrypt(){SpringUtils.getBean(ICommunityUserService.class).updateCommunityUserEncrypt();} + //批量更新企业表中法人联系方式和身份证 + public void updateCompanyEncrypt(){SpringUtils.getBean(ICompanyService.class).updateCompanyEncrypt();} + //批量更新录入人中身份证和手机号 + public void updateEmployeeConfirmEncrypt(){SpringUtils.getBean(EmployeeConfirmService.class).updatePhoneEncrypt();} + //批量更新企业联系人 + public void updateCompanyContactEncrypt(){SpringUtils.getBean(CompanyContactService.class).updateCompanyContactEncrypt();} + //批量更新岗位联系人 + public void updateJobContactEncrypt(){SpringUtils.getBean(JobContactService.class).updateJobContactEncrypt();} + //批量更新sys系统用户身份证和手机号 + public void updateSysUserEncrypt(){SpringUtils.getBean(IAppUserService.class).updateSysUserEncrypt();} } diff --git a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/domain/CommunityUser.java b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/domain/CommunityUser.java index 49a47be..a34ab4a 100644 --- a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/domain/CommunityUser.java +++ b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/domain/CommunityUser.java @@ -30,4 +30,14 @@ public class CommunityUser extends BaseEntity { */ private String phoneNumber; + /** + * 手机号完整性 + */ + private String phoneNumberCipher; + + /** + * 手机号机密性 + */ + private String phoneNumberEncrypt; + } diff --git a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/domain/EmployeeConfirm.java b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/domain/EmployeeConfirm.java index b733ab8..dec9aae 100644 --- a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/domain/EmployeeConfirm.java +++ b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/domain/EmployeeConfirm.java @@ -71,4 +71,16 @@ public class EmployeeConfirm extends BaseEntity { */ @TableField(exist = false) private Long applyId; + + @ApiModelProperty("联系方式完整性") + private String contactPersonPhoneCipher; + + @ApiModelProperty("身份证完整性") + private String idCardCipher; + + @ApiModelProperty("联系方式机密性") + private String contactPersonPhoneEncrypt; + + @ApiModelProperty("身份证机密性") + private String idCardEncrypt; } diff --git a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/domain/JobContact.java b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/domain/JobContact.java index c34389f..e47995c 100644 --- a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/domain/JobContact.java +++ b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/domain/JobContact.java @@ -50,4 +50,10 @@ public class JobContact extends BaseEntity { */ @ApiModelProperty("职务") private String position; + + @ApiModelProperty("联系人电话完整性") + private String contactPersonPhoneCipher; + + @ApiModelProperty("联系人电话机密性") + private String contactPersonPhoneEncrypt; } diff --git a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/domain/vo/WechatGroupVo.java b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/domain/vo/WechatGroupVo.java index 91e1457..0d047f6 100644 --- a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/domain/vo/WechatGroupVo.java +++ b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/domain/vo/WechatGroupVo.java @@ -17,4 +17,6 @@ public class WechatGroupVo { private String phoneNumber; private String wechatName; private Long communityId; + private String phoneNumberCipher; + private String phoneNumberEncrypt; } diff --git a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/mapper/AppUserMapper.java b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/mapper/AppUserMapper.java index ec2eb56..fc57822 100644 --- a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/mapper/AppUserMapper.java +++ b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/mapper/AppUserMapper.java @@ -38,4 +38,10 @@ public interface AppUserMapper extends BaseMapper SysUser selectSysUserIdcard(@Param("idCard") String idCard); List selectUserApplyList(AppUser appUser); + + void batchUpdateIdCardAndPhone(List list); + + List getSysUserListEncrypt(); + + void batchUpdateSysUserEncrypt(List list); } diff --git a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/mapper/CompanyMapper.java b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/mapper/CompanyMapper.java index b17d0f9..c02adfd 100644 --- a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/mapper/CompanyMapper.java +++ b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/mapper/CompanyMapper.java @@ -35,4 +35,8 @@ public interface CompanyMapper extends BaseMapper public Company selectByCode(@Param("code") String code); List selectBycodes(List list); + + List selectCompanyEncryptList(Company company); + + void batchUpdateEncrypt(List list); } diff --git a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/mapper/EmployeeConfirmMapper.java b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/mapper/EmployeeConfirmMapper.java index e8779b5..db15eaa 100644 --- a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/mapper/EmployeeConfirmMapper.java +++ b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/mapper/EmployeeConfirmMapper.java @@ -16,4 +16,6 @@ import java.util.List; public interface EmployeeConfirmMapper extends BaseMapper { List getEmployeeConfirmList(EmployeeConfirm employeeConfirm); + + void updatePhoneEncrypt(List list); } diff --git a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/mapper/JobContactMapper.java b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/mapper/JobContactMapper.java index 867866f..b4458e1 100644 --- a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/mapper/JobContactMapper.java +++ b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/mapper/JobContactMapper.java @@ -20,4 +20,6 @@ public interface JobContactMapper extends BaseMapper { int batchInsert(List list); List selectByJobIds(@Param("jobIds") List longs); + + void batchUpdateEncrypt(List list); } diff --git a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/service/CompanyContactService.java b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/service/CompanyContactService.java index bcb86d5..600c8bc 100644 --- a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/service/CompanyContactService.java +++ b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/service/CompanyContactService.java @@ -18,5 +18,7 @@ public interface CompanyContactService { int insertUpadteCompanyContact(List list); int insertContact(CompanyContact contact); + + void updateCompanyContactEncrypt(); } diff --git a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/service/EmployeeConfirmService.java b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/service/EmployeeConfirmService.java index cf6c3c8..4c5fc95 100644 --- a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/service/EmployeeConfirmService.java +++ b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/service/EmployeeConfirmService.java @@ -20,5 +20,7 @@ public interface EmployeeConfirmService { int updateEmployeeConfirm(EmployeeConfirm employeeConfirm); int deleteEmployeeConfirmIds(Long[] ids); + + void updatePhoneEncrypt(); } diff --git a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/service/IAppUserService.java b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/service/IAppUserService.java index c951725..06ba9a6 100644 --- a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/service/IAppUserService.java +++ b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/service/IAppUserService.java @@ -88,4 +88,11 @@ public interface IAppUserService public AppUser getYtjValidIdcard(String phone); AjaxResult recognition(byte[] bytes, String fileName, Long userId); + + //更新app用户 + public void updateAppUserEncrypt(); + //更新sys用户 + public void updateSysUserEncrypt(); + + public AppUser selectAppuserByIdcard(String idCard,String userType); } diff --git a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/service/ICommunityUserService.java b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/service/ICommunityUserService.java index 73ddb37..c84a73c 100644 --- a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/service/ICommunityUserService.java +++ b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/service/ICommunityUserService.java @@ -9,4 +9,6 @@ public interface ICommunityUserService extends IService { List selectCommunityUserList(CommunityUser communityUser); int delCommunityUser(Long[] ids); + + void updateCommunityUserEncrypt(); } diff --git a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/service/ICompanyService.java b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/service/ICompanyService.java index f69f93e..8b93184 100644 --- a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/service/ICompanyService.java +++ b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/service/ICompanyService.java @@ -79,4 +79,9 @@ public interface ICompanyService Company queryCodeCompany(String code); List selectLikeCompanyList(Company company); + + /** + * 批量更新身份证和手机号加密 + */ + void updateCompanyEncrypt(); } diff --git a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/service/JobContactService.java b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/service/JobContactService.java index 79d3a79..abe611d 100644 --- a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/service/JobContactService.java +++ b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/service/JobContactService.java @@ -16,5 +16,7 @@ public interface JobContactService{ List getSelectList(JobContact jobContact); int batchInsert(List list); + + void updateJobContactEncrypt(); } diff --git a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/service/impl/AppUserServiceImpl.java b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/service/impl/AppUserServiceImpl.java index 08da1dc..91c45ea 100644 --- a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/service/impl/AppUserServiceImpl.java +++ b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/service/impl/AppUserServiceImpl.java @@ -11,6 +11,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.ruoyi.cms.domain.UserInfoDetail; import com.ruoyi.cms.util.AppUserFieldCustomCopy; +import com.ruoyi.cms.util.encrypt.QuickValidUtils; import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.core.domain.entity.MyChart; import com.ruoyi.common.core.domain.entity.File; @@ -85,6 +86,9 @@ public class AppUserServiceImpl extends ServiceImpl imple public AppUser selectAppUserByUserId(Long userId) { AppUser appUser = appUserMapper.selectById(userId); + //验证手机号完整性 + QuickValidUtils.phoneValid(appUser); + if(StringUtils.isNotEmpty(appUser.getJobTitleId())){ List list = Arrays.asList(appUser.getJobTitleId().split(",")); List collect = list.stream().map(Long::valueOf).collect(Collectors.toList()); @@ -94,17 +98,25 @@ public class AppUserServiceImpl extends ServiceImpl imple //查询企业信息 if("0".equals(appUser.getIsCompanyUser())){ Company company=companyMapper.selectOne(Wrappers.lambdaQuery() - //.eq(Company::getCode, appUser.getIdCard()) .apply("UPPER(code) = {0}", StringUtil.toUpperCaseIgnoreBlank(appUser.getIdCard())) .orderByDesc(Company::getUpdateTime).last("LIMIT 1")); + //解密手机号 + if(company!=null){ + QuickValidUtils.legalPhoneOrIdCardValid(company); + } appUser.setCompany(company); if(company!=null){ CompanyContact contact=new CompanyContact(); contact.setCompanyId(company.getCompanyId()); List companyContactList=companyContactMapper.getSelectList(contact); + companyContactList.stream().forEach(it->{ + QuickValidUtils.companyContactPhoneValid(it); + }); company.setCompanyContactList(companyContactList); } }else if("1".equals(appUser.getIsCompanyUser())){ + //验证身份证完整性 + QuickValidUtils.idCardValid(appUser); //工作经历 UserWorkExperiences workExperiences=new UserWorkExperiences(); workExperiences.setUserId(appUser.getUserId()); @@ -146,15 +158,19 @@ public class AppUserServiceImpl extends ServiceImpl imple @Transactional(rollbackFor = Exception.class) public int insertAppUser(AppUser appUser) { + //一体机加密 if(StringUtils.isNotEmpty(appUser.getYtjPassword())){ - try { - appUser.setYtjPassword(SiteSecurityUtils.encryptPassword(appUser.getYtjPassword())); - } catch (Exception e) { - throw new RuntimeException("密码加密出错", e); - } + appUser.setYtjPassword(SiteSecurityUtils.encryptPassword(appUser.getYtjPassword())); }else{ appUser.setYtjPassword(null); } + + //密码机完整性/保密性 + QuickValidUtils.savePhoneSm4(appUser); + //判断如果是企业则不加密 + if(!StringUtil.IS_COMPANY_USER.equals(appUser.getIsCompanyUser())){ + QuickValidUtils.saveIdCardSm4(appUser); + } return appUserMapper.insert(appUser); } @@ -212,6 +228,8 @@ public class AppUserServiceImpl extends ServiceImpl imple if(!StringUtils.isBlank(appUser.getArea())){ appUser.setRegionCode(StringUtil.getAreaToRegionCode(appUser.getArea())); } + //手机号/身份证完整性 + QuickValidUtils.savePhoneIdCardSm4(appUser); return appUserMapper.updateById(appUser); } @@ -229,20 +247,35 @@ public class AppUserServiceImpl extends ServiceImpl imple @Override public AppUser getPhone(String phone) { - return appUserMapper.selectOne(new LambdaQueryWrapper() + AppUser appUser=appUserMapper.selectOne(new LambdaQueryWrapper() .eq(AppUser::getPhone, phone).eq(AppUser::getDelFlag,"0").orderByDesc(AppUser::getUpdateTime).last("LIMIT 1")); + if(appUser!=null){ + //phone解密/验证完整性 + QuickValidUtils.phoneValid(appUser); + } + return appUser; } @Override public AppUser getPhoneAndNoRole(String phone) { - return appUserMapper.selectOne(new LambdaQueryWrapper() + AppUser appUser=appUserMapper.selectOne(new LambdaQueryWrapper() .eq(AppUser::getPhone, phone).eq(AppUser::getDelFlag,"0").isNull(AppUser::getIsCompanyUser).orderByDesc(AppUser::getUpdateTime).last("LIMIT 1")); + if(appUser!=null){ + //phone解密/验证完整性 + QuickValidUtils.phoneValid(appUser); + } + return appUser; } @Override public AppUser getPhoneAndUserType(String phone,String userType) { - return appUserMapper.selectOne(new LambdaQueryWrapper() + AppUser appUser=appUserMapper.selectOne(new LambdaQueryWrapper() .eq(AppUser::getPhone, phone).eq(AppUser::getIsCompanyUser,userType).eq(AppUser::getDelFlag,"0").orderByDesc(AppUser::getUpdateTime).last("LIMIT 1")); + if(appUser!=null){ + //phone解密/验证完整性 + QuickValidUtils.phoneValid(appUser); + } + return appUser; } @Override @@ -299,6 +332,8 @@ public class AppUserServiceImpl extends ServiceImpl imple appSkillMapper.batchInsert(registerBody.getAppSkillsList()); } mapUserRole.put("roleId",StringUtil.SYS_QZZ); + //身份证加密/完整性 + QuickValidUtils.saveIdCardSm4(appUser); } //保存sys_user SysUser parmUser=appUserMapper.selectSysUserIdcard(appUser.getIdCard()); @@ -405,6 +440,8 @@ public class AppUserServiceImpl extends ServiceImpl imple */ private void handleCompanyUserLogic(AppUser appUser, Company company) { if (company != null) { + //企业法人和联系方式加密和完整性 + QuickValidUtils.legalSm4(company); Company resultCom=companyMapper.selectByCode(company.getCode()); if(resultCom==null){ // 保存企业信息(新增场景) @@ -447,6 +484,7 @@ public class AppUserServiceImpl extends ServiceImpl imple .filter(contact -> contact.getContactPerson() != null && contact.getContactPersonPhone() != null && contact.getCompanyId() != null) + .peek(QuickValidUtils::saveCompanyContactPhoneSm4) .filter(contact -> { String currentUniqueKey = contact.getContactPerson() + "_" + contact.getContactPersonPhone() + "_" + contact.getCompanyId(); return !existingContactKeySet.contains(currentUniqueKey); @@ -464,6 +502,9 @@ public class AppUserServiceImpl extends ServiceImpl imple * @param registerBody 注册请求体 */ private void handleJobSeekerUserLogic(AppUser appUser, RegisterBody registerBody) { + //身份证加密/完整性 + QuickValidUtils.saveIdCardSm4(appUser); + Long userId = appUser.getUserId(); // 保存工作经历 saveUserWorkExperiences(userId, registerBody.getExperiencesList()); @@ -579,6 +620,16 @@ public class AppUserServiceImpl extends ServiceImpl imple .orderByDesc(AppUser::getUpdateTime).last("LIMIT 1")); } + @Override + public AppUser selectAppuserByIdcard(String idCard,String userType) { + return appUserMapper.selectOne(Wrappers.lambdaQuery() + //.eq(AppUser::getIdCard, idCard) + .apply("UPPER(id_card) = {0}", StringUtil.toUpperCaseIgnoreBlank(idCard)) + .eq(AppUser::getDelFlag,"0") + .eq(AppUser::getIsCompanyUser,userType) + .orderByDesc(AppUser::getUpdateTime).last("LIMIT 1")); + } + @Override public AppUserLky selectAppUserInfo(AppUser appUser) { AppUserLky lky=new AppUserLky(); @@ -957,4 +1008,30 @@ public class AppUserServiceImpl extends ServiceImpl imple } } + @Transactional(rollbackFor = Exception.class) + public void updateAppUserEncrypt(){ + List userList=appUserMapper.selectAppUserList(new AppUser()); + List encryptedList=userList.stream().peek(user->{ + QuickValidUtils.savePhoneSm4(user); + if(!StringUtil.IS_COMPANY_USER.equals(user.getIsCompanyUser())){ + QuickValidUtils.saveIdCardSm4(user); + } + }).collect(Collectors.toList()); + List> batches = StringUtil.splitList(encryptedList, StringUtil.BATCH_SIZE); + for (List batch : batches) { + appUserMapper.batchUpdateIdCardAndPhone(batch); + } + } + + @Transactional(rollbackFor = Exception.class) + public void updateSysUserEncrypt(){ + List sysUserList=appUserMapper.getSysUserListEncrypt(); + List encryptList=sysUserList.stream().peek(QuickValidUtils::saveSysUserSm4).collect(Collectors.toList()); + if(!encryptList.isEmpty()){ + List> batches = StringUtil.splitList(encryptList, StringUtil.BATCH_SIZE); + for (List batch : batches) { + appUserMapper.batchUpdateSysUserEncrypt(batch); + } + } + } } diff --git a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/service/impl/CommunityUserServiceImpl.java b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/service/impl/CommunityUserServiceImpl.java index 9fa6119..764bb3d 100644 --- a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/service/impl/CommunityUserServiceImpl.java +++ b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/service/impl/CommunityUserServiceImpl.java @@ -2,6 +2,7 @@ package com.ruoyi.cms.service.impl; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.cms.domain.CommunityUser; @@ -9,12 +10,15 @@ import com.ruoyi.cms.domain.WechatGroup; import com.ruoyi.cms.mapper.CommunityUserMapper; import com.ruoyi.cms.mapper.WechatGroupMapper; import com.ruoyi.cms.service.ICommunityUserService; +import com.ruoyi.cms.util.encrypt.QuickValidUtils; import com.ruoyi.common.exception.ServiceException; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import java.util.Collection; import java.util.List; +import java.util.stream.Collectors; @Service public class CommunityUserServiceImpl extends ServiceImpl @@ -25,11 +29,11 @@ public class CommunityUserServiceImpl extends ServiceImpl selectCommunityUserList(CommunityUser communityUser) { - - return baseMapper.selectList(Wrappers.lambdaQuery(CommunityUser.class) + List list=baseMapper.selectList(Wrappers.lambdaQuery(CommunityUser.class) .like(StrUtil.isNotBlank(communityUser.getWechatName()), CommunityUser::getWechatName, communityUser.getWechatName()) .like(StrUtil.isNotBlank(communityUser.getPhoneNumber()), CommunityUser::getPhoneNumber, communityUser.getPhoneNumber()) ); + return list.stream().peek(QuickValidUtils::phoneValid).collect(Collectors.toList()); } @Override @@ -43,4 +47,38 @@ public class CommunityUserServiceImpl extends ServiceImpl userList = baseMapper.selectList(Wrappers.lambdaQuery(CommunityUser.class)); + List encryptList = userList.stream().peek(QuickValidUtils::savePhoneSm4).collect(Collectors.toList()); + if(!encryptList.isEmpty()){ + batchUpdatePhoneAndCipher(encryptList); + } + System.out.println("用户手机号加密更新完成,共处理 {} 条数据"+userList.size()); + }catch (Exception e) { + log.error("用户手机号加密更新失败", e); + throw e; + } + } + + /** + * 批量更新 + * @param userList + */ + public void batchUpdatePhoneAndCipher(List userList) { + int batchSize = 1000; + for (int i = 0; i < userList.size(); i += batchSize) { + int end = Math.min(i + batchSize, userList.size()); + List subList = userList.subList(i, end); + subList.forEach(user -> { + LambdaUpdateWrapper wrapper = Wrappers.lambdaUpdate(); + wrapper.eq(CommunityUser::getId, user.getId()) + .set(CommunityUser::getPhoneNumberEncrypt, user.getPhoneNumberEncrypt()) + .set(CommunityUser::getPhoneNumberCipher, user.getPhoneNumberCipher()); + baseMapper.update(null, wrapper); + }); + } + } } diff --git a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/service/impl/CompanyContactServiceImpl.java b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/service/impl/CompanyContactServiceImpl.java index fc40dbe..e0ec832 100644 --- a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/service/impl/CompanyContactServiceImpl.java +++ b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/service/impl/CompanyContactServiceImpl.java @@ -1,5 +1,7 @@ package com.ruoyi.cms.service.impl; +import com.ruoyi.cms.util.StringUtil; +import com.ruoyi.cms.util.encrypt.QuickValidUtils; import com.ruoyi.common.core.domain.entity.CompanyContact; import com.ruoyi.cms.mapper.CompanyContactMapper; import com.ruoyi.cms.service.CompanyContactService; @@ -28,6 +30,7 @@ public class CompanyContactServiceImpl extends ServiceImpl list) { Map> partitioned = list.stream() + .peek(QuickValidUtils::saveCompanyContactPhoneSm4) .collect(Collectors.partitioningBy(it -> it.getId() != null)); List add=partitioned.get(false); List udp=partitioned.get(true); @@ -42,6 +45,19 @@ public class CompanyContactServiceImpl extends ServiceImpl list=companyContactMapper.getSelectList(new CompanyContact()); + List encryptList=list.stream().peek(QuickValidUtils::saveCompanyContactPhoneSm4).collect(Collectors.toList()); + if(!encryptList.isEmpty()){ + List> batches = StringUtil.splitList(encryptList, StringUtil.BATCH_SIZE); + for (List batch : batches) { + companyContactMapper.batchUpdate(batch); + } + } + } } diff --git a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/service/impl/CompanyServiceImpl.java b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/service/impl/CompanyServiceImpl.java index cfd21b0..1a160ca 100644 --- a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/service/impl/CompanyServiceImpl.java +++ b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/service/impl/CompanyServiceImpl.java @@ -10,6 +10,8 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.ruoyi.cms.domain.*; import com.ruoyi.cms.domain.query.LabelQuery; import com.ruoyi.cms.mapper.*; +import com.ruoyi.cms.util.StringUtil; +import com.ruoyi.cms.util.encrypt.QuickValidUtils; import com.ruoyi.common.constant.Constants; import com.ruoyi.common.core.domain.entity.Company; import com.ruoyi.common.core.domain.entity.CompanyContact; @@ -119,16 +121,19 @@ public class CompanyServiceImpl extends ServiceImpl impl if(count>0){ throw new ServiceException(company.getName()+",该公司已存在"); } + List contacts=company.getCompanyContactList(); + //加密法人身份证和联系方式 + QuickValidUtils.legalPhoneOrIdCardValid(company); int insert =companyMapper.insert(company); - if(insert>0){ - if(company.getCompanyContactList()!=null){ - company.getCompanyContactList().forEach(x->{ - CompanyContact companyContact=new CompanyContact(); - BeanUtils.copyProperties(x,companyContact); - companyContact.setCompanyId(company.getCompanyId()); - companyContactMapper.insert(companyContact); - }); - } + if(insert>0&&contacts!=null){ + contacts.forEach(x->{ + CompanyContact companyContact=new CompanyContact(); + BeanUtils.copyProperties(x,companyContact); + companyContact.setCompanyId(company.getCompanyId()); + //手机号加密 + QuickValidUtils.saveCompanyContactPhoneSm4(companyContact); + companyContactMapper.insert(companyContact); + }); } return insert; } @@ -146,6 +151,8 @@ public class CompanyServiceImpl extends ServiceImpl impl if(count>1){ throw new ServiceException(company.getName()+",该公司已存在"); } + //加密法人身份证和联系方式 + QuickValidUtils.legalPhoneOrIdCardValid(company); int i=companyMapper.updateById(company); if(i>0){ companyContactMapper.update(null,Wrappers.lambdaUpdate() @@ -157,6 +164,8 @@ public class CompanyServiceImpl extends ServiceImpl impl companyContact.setCompanyId(company.getCompanyId()); companyContact.setContactPerson(x.getContactPerson()); companyContact.setContactPersonPhone(x.getContactPersonPhone()); + //手机号加密 + QuickValidUtils.saveCompanyContactPhoneSm4(companyContact); companyContactMapper.insert(companyContact); }); } @@ -330,4 +339,17 @@ public class CompanyServiceImpl extends ServiceImpl impl public List selectLikeCompanyList(Company company) { return companyMapper.selectLikeCompanyList(company); } + + @Override + @Transactional(rollbackFor = Exception.class) + public void updateCompanyEncrypt() { + List companyList=companyMapper.selectCompanyEncryptList(new Company()); + List encryptList=companyList.stream().peek(QuickValidUtils::legalSm4).collect(Collectors.toList()); + if(!encryptList.isEmpty()){ + List> batches = StringUtil.splitList(encryptList, StringUtil.BATCH_SIZE); + for (List batch : batches) { + companyMapper.batchUpdateEncrypt(batch); + } + } + } } diff --git a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/service/impl/EmployeeConfirmServiceImpl.java b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/service/impl/EmployeeConfirmServiceImpl.java index da2add3..d54696f 100644 --- a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/service/impl/EmployeeConfirmServiceImpl.java +++ b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/service/impl/EmployeeConfirmServiceImpl.java @@ -10,12 +10,15 @@ import com.ruoyi.cms.mapper.JobMapper; import com.ruoyi.cms.mapper.NoticeMapper; import com.ruoyi.cms.service.EmployeeConfirmService; import com.ruoyi.cms.util.StringUtil; +import com.ruoyi.cms.util.encrypt.QuickValidUtils; import com.ruoyi.cms.util.notice.NoticeUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; import java.util.Arrays; import java.util.List; +import java.util.stream.Collectors; @Service @@ -36,7 +39,9 @@ public class EmployeeConfirmServiceImpl implements EmployeeConfirmService { } @Override + @Transactional(rollbackFor = Exception.class) public int insertEmployeeConfirm(EmployeeConfirm employeeConfirm) { + QuickValidUtils.savePhoneIdCardSm4(employeeConfirm); int t=employeeConfirmMapper.insert(employeeConfirm); if(t>0){ JobApply apply=new JobApply(); @@ -53,7 +58,9 @@ public class EmployeeConfirmServiceImpl implements EmployeeConfirmService { } @Override + @Transactional(rollbackFor = Exception.class) public int updateEmployeeConfirm(EmployeeConfirm employeeConfirm) { + QuickValidUtils.savePhoneIdCardSm4(employeeConfirm); return employeeConfirmMapper.updateById(employeeConfirm); } @@ -61,4 +68,16 @@ public class EmployeeConfirmServiceImpl implements EmployeeConfirmService { public int deleteEmployeeConfirmIds(Long[] ids) { return employeeConfirmMapper.deleteBatchIds(Arrays.asList(ids)); } + + @Transactional(rollbackFor = Exception.class) + public void updatePhoneEncrypt(){ + List list=employeeConfirmMapper.getEmployeeConfirmList(new EmployeeConfirm()); + List encryptList=list.stream().peek(QuickValidUtils::savePhoneIdCardSm4).collect(Collectors.toList()); + if(!encryptList.isEmpty()){ + List> batches = StringUtil.splitList(encryptList, StringUtil.BATCH_SIZE); + for (List batch : batches) { + employeeConfirmMapper.updatePhoneEncrypt(batch); + } + } + } } diff --git a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/service/impl/JobContactServiceImpl.java b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/service/impl/JobContactServiceImpl.java index f07f138..d9e1ccf 100644 --- a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/service/impl/JobContactServiceImpl.java +++ b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/service/impl/JobContactServiceImpl.java @@ -3,10 +3,15 @@ package com.ruoyi.cms.service.impl; import com.ruoyi.cms.domain.JobContact; import com.ruoyi.cms.mapper.JobContactMapper; import com.ruoyi.cms.service.JobContactService; +import com.ruoyi.cms.util.StringUtil; +import com.ruoyi.cms.util.encrypt.QuickValidUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.List; +import java.util.stream.Collectors; + import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import org.springframework.transaction.annotation.Transactional; @Service @@ -23,4 +28,16 @@ public class JobContactServiceImpl extends ServiceImpl list) { return jobContactMapper.batchInsert(list); } + + @Transactional(rollbackFor = Exception.class) + public void updateJobContactEncrypt(){ + List list=jobContactMapper.getSelectList(new JobContact()); + List encryptList=list.stream().peek(QuickValidUtils::savePhoneSm4).collect(Collectors.toList()); + if(!encryptList.isEmpty()){ + List> batches = StringUtil.splitList(encryptList, StringUtil.BATCH_SIZE); + for (List batch : batches) { + jobContactMapper.batchUpdateEncrypt(batch); + } + } + } } diff --git a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/service/impl/JobServiceImpl.java b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/service/impl/JobServiceImpl.java index 0961db1..3a7f986 100644 --- a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/service/impl/JobServiceImpl.java +++ b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/service/impl/JobServiceImpl.java @@ -9,6 +9,8 @@ import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; import com.ruoyi.cms.domain.*; import com.ruoyi.cms.domain.vo.JobExcelVo; +import com.ruoyi.cms.util.DictUtils; +import com.ruoyi.cms.util.encrypt.QuickValidUtils; import com.ruoyi.cms.util.notice.NoticeUtils; import com.ruoyi.common.core.domain.entity.File; import com.ruoyi.cms.domain.query.ESJobSearch; @@ -24,10 +26,7 @@ import com.ruoyi.common.core.domain.entity.Company; import com.ruoyi.common.core.domain.entity.JobTitle; import com.ruoyi.common.core.redis.RedisCache; import com.ruoyi.common.exception.ServiceException; -import com.ruoyi.common.utils.DateUtils; -import com.ruoyi.common.utils.SecurityUtils; -import com.ruoyi.common.utils.SiteSecurityUtils; -import com.ruoyi.common.utils.StringUtils; +import com.ruoyi.common.utils.*; import com.ruoyi.common.utils.bean.BeanUtils; import com.ruoyi.common.utils.spring.SpringUtils; import org.apache.commons.collections4.CollectionUtils; @@ -375,6 +374,8 @@ public class JobServiceImpl extends ServiceImpl implements IJobSe JobContact jobContact=new JobContact(); BeanUtils.copyProperties(x,jobContact); jobContact.setJobId(job.getJobId()); + //加密 + QuickValidUtils.savePhoneSm4(jobContact); jobContactMapper.insert(jobContact); }); //添加附件 @@ -458,6 +459,8 @@ public class JobServiceImpl extends ServiceImpl implements IJobSe targetContact.setContactPerson(originContact.getContactPerson()); targetContact.setContactPersonPhone(originContact.getContactPersonPhone()); targetContact.setPosition(originContact.getPosition()); + //加密手机号 + QuickValidUtils.savePhoneSm4(targetContact); if (originContact.getId() == null) { insertList.add(targetContact); @@ -637,7 +640,9 @@ public class JobServiceImpl extends ServiceImpl implements IJobSe JobContact contact = new JobContact(); contact.setJobId(jobId); List contacts = jobContactMapper.getSelectList(contact); - job.setJobContactList(contacts == null ? Collections.emptyList() : contacts); + List contactList = contacts == null ? Collections.emptyList() : contacts; + contactList.forEach(QuickValidUtils::phoneValid); + job.setJobContactList(contactList); //查询附件 String baseFilePath = StringUtil.getFilePath(request); File queryFile = new File(); @@ -663,7 +668,7 @@ public class JobServiceImpl extends ServiceImpl implements IJobSe public List candidates(Long jobId) { List jobList = jobApplyMapper.candidates(jobId); List jobTitles = jobTitleMapper.selectList(new QueryWrapper<>()); - jobList.forEach(x->x.setJobTitle(wrapperJobTitleList(jobTitles,x.getJobTitleId()))); + jobList.stream().filter(Objects::nonNull).peek(QuickValidUtils::candidatePhoneOrIdCardValid).forEach(x->x.setJobTitle(wrapperJobTitleList(jobTitles,x.getJobTitleId()))); return jobList; } @@ -1061,7 +1066,7 @@ public class JobServiceImpl extends ServiceImpl implements IJobSe //修改联系人 List jobContactList = job.getJobContactList() != null ? job.getJobContactList() : Collections.emptyList(); - jobContactList.stream().filter(Objects::nonNull).forEach(it -> it.setJobId(job.getJobId())); + jobContactList.stream().filter(Objects::nonNull).peek(QuickValidUtils::savePhoneSm4).forEach(it -> it.setJobId(job.getJobId())); if(!jobContactList.isEmpty()){ jobContactMapper.batchInsert(jobContactList); } diff --git a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/service/impl/WechatGroupServiceImpl.java b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/service/impl/WechatGroupServiceImpl.java index 7c8e881..94cd482 100644 --- a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/service/impl/WechatGroupServiceImpl.java +++ b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/service/impl/WechatGroupServiceImpl.java @@ -5,9 +5,11 @@ import com.ruoyi.cms.domain.WechatGroup; import com.ruoyi.cms.domain.vo.WechatGroupVo; import com.ruoyi.cms.mapper.WechatGroupMapper; import com.ruoyi.cms.service.IWechatGroupService; +import com.ruoyi.cms.util.encrypt.QuickValidUtils; import org.springframework.stereotype.Service; import java.util.List; +import java.util.stream.Collectors; @Service public class WechatGroupServiceImpl extends ServiceImpl @@ -15,6 +17,7 @@ public class WechatGroupServiceImpl extends ServiceImpl selectWechatGroupList(WechatGroup wechatGroup) { - return baseMapper.selectWechatGroupList(wechatGroup); + List list=baseMapper.selectWechatGroupList(wechatGroup); + return list.stream().peek(QuickValidUtils::phoneValid).collect(Collectors.toList()); } } 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 8ecd9dd..002d232 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 @@ -97,6 +97,9 @@ public class StringUtil { */ public static final Map REGION_CODE_CODE_MAP; + //批量条数 + public static final int BATCH_SIZE = 1000; + static { Map tempMap = new HashMap<>(); tempMap.put("中专及以上", "1"); @@ -365,4 +368,13 @@ public class StringUtil { default: return code; } } + + public static List> splitList(List list, int batchSize) { + List> batches = new ArrayList<>(); + for (int i = 0; i < list.size(); i += batchSize) { + int end = Math.min(i + batchSize, list.size()); + batches.add(list.subList(i, end)); + } + return batches; + } } diff --git a/ruoyi-bussiness/src/main/java/com/ruoyi/cms/util/encrypt/QuickValidUtils.java b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/util/encrypt/QuickValidUtils.java new file mode 100644 index 0000000..0ca5365 --- /dev/null +++ b/ruoyi-bussiness/src/main/java/com/ruoyi/cms/util/encrypt/QuickValidUtils.java @@ -0,0 +1,587 @@ +package com.ruoyi.cms.util.encrypt; + +import com.ruoyi.cms.domain.CommunityUser; +import com.ruoyi.cms.domain.EmployeeConfirm; +import com.ruoyi.cms.domain.JobContact; +import com.ruoyi.cms.domain.vo.CandidateVO; +import com.ruoyi.cms.domain.vo.WechatGroupVo; +import com.ruoyi.cms.util.StringUtil; +import com.ruoyi.common.core.domain.entity.AppUser; +import com.ruoyi.common.core.domain.entity.Company; +import com.ruoyi.common.core.domain.entity.CompanyContact; +import com.ruoyi.common.core.domain.entity.SysUser; +import com.ruoyi.common.utils.EncryptDecryptUtil; +import org.apache.commons.lang3.StringUtils; +import org.quickssl.api.CryptoClient; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import javax.annotation.PostConstruct; +import java.util.Arrays; + +/** + * 加密验签工具类 + */ +@Component +public class QuickValidUtils { + + private static final Logger log = LoggerFactory.getLogger(QuickValidUtils.class); + + private static volatile QuickValidUtils INSTANCE; + + @Autowired + private EncryptDecryptUtil encryptDecryptUtil; + + private static final String TAMPER_PHONE_IDCARD_MSG = "手机号或者身份证信息完整性已被篡改,请联系管理员确认!"; + private static final String TAMPER_PHONE_MSG = "手机号信息完整性已被篡改,请联系管理员确定!"; + private static final String TAMPER_IDCARD_MSG = "身份证信息完整性已被篡改,请联系管理员确定!"; + + /** + * Spring初始化完成后赋值静态实例 + */ + @PostConstruct + public synchronized void init() { + if (INSTANCE != null) { + log.warn("QuickValidUtils已初始化,重复初始化被忽略"); + return; + } + if (encryptDecryptUtil == null) { + throw new IllegalStateException("EncryptDecryptUtil注入失败,请检查Spring配置"); + } + INSTANCE = this; + log.info("QuickValidUtils初始化成功"); + } + + /** + * 获取工具类实例 + */ + private static QuickValidUtils getInstance() { + if (INSTANCE == null) { + synchronized (QuickValidUtils.class) { + if (INSTANCE == null) { + throw new IllegalStateException("QuickValidUtils未初始化,请确保Spring容器已启动并完成注入"); + } + } + } + return INSTANCE; + } + + // ======================== 提取的通用私有方法 ======================== + /** + * 通用SM4解密方法 + * @param cipherText 加密串 + * @return 解密后的明文 + * @throws CryptoClient.CryptoException 解密异常 + */ + private static String sm4Decrypt(String cipherText) throws CryptoClient.CryptoException { + return getInstance().encryptDecryptUtil.sm4Decrypt(cipherText); + } + + /** + * 通用SM4加密方法 + * @param plainText 明文 + * @return 加密后的密文 + * @throws CryptoClient.CryptoException 加密异常 + */ + private static String sm4Encrypt(String plainText) throws CryptoClient.CryptoException { + return getInstance().encryptDecryptUtil.sm4Encrypt(plainText); + } + + /** + * 通用SM3验签方法 + * @param plainText 明文 + * @param sign 待验证的签名字符串 + * @return true-验签通过,false-验签失败 + * @throws Exception 验签异常 + */ + private static boolean sm3Verify(String plainText, String sign) throws CryptoClient.CryptoException { + return getInstance().encryptDecryptUtil.sm3Verify(plainText, sign); + } + + /** + * 通用SM3哈希方法(生成签名字符串) + * @param plainText 明文 + * @return 哈希后的签名字符串 + * @throws CryptoClient.CryptoException 哈希异常 + */ + private static String sm3Hash(String plainText) throws CryptoClient.CryptoException { + return getInstance().encryptDecryptUtil.sm3Hash(plainText); + } + + // ======================== 原有业务方法 ======================== + /** + * 企业-解密手机号/身份证并验签 + * @param company 企业实体 + */ + public static void legalPhoneOrIdCardValid(Company company) { + String phone = ""; + boolean phoneTrue = true; + String idCard = ""; + boolean idCardTrue = true; + try { + if (!StringUtils.isBlank(company.getLegalPhone())) { + phone = sm4Decrypt(company.getLegalPhoneEncrypt()); + phoneTrue = sm3Verify(phone, company.getLegalPhoneCipher()); + //company.setLegalPhone(phone); + } + if (!StringUtils.isBlank(company.getLegalIdCard())) { + idCard = sm4Decrypt(company.getLegalIdCardEncrypt()); + idCardTrue = sm3Verify(idCard, company.getLegalIdCardCipher()); + //company.setLegalIdCard(idCard); + } + if (!phoneTrue || !idCardTrue) { + throw new RuntimeException(TAMPER_PHONE_IDCARD_MSG); + } + } catch (CryptoClient.CryptoException e) { + log.error("企业法人手机号/身份证解密失败", e); + throw new RuntimeException("解密失败:" + e.getMessage(), e); + } catch (Exception e1) { + log.error("企业法人手机号/身份证验签失败", e1); + throw new RuntimeException("验签失败:" + e1.getMessage(), e1); + } + } + + /** + * 企业或个人 + * @param vo + */ + public static void candidatePhoneOrIdCardValid(CandidateVO vo) { + String phone = ""; + boolean phoneTrue = true; + String idCard = ""; + boolean idCardTrue = true; + try { + if(!StringUtils.isBlank(vo.getPhone())){ + phone=sm4Decrypt(vo.getPhoneEncrypt()); + phoneTrue=sm3Verify(phone,vo.getPhoneCipher()); + //vo.setPhone(phone); + } + if(!StringUtils.isBlank(vo.getIdCard())){ + idCard=sm4Decrypt(vo.getIdCardEncrypt()); + idCardTrue=sm3Verify(idCard,vo.getIdCardCipher()); + //vo.setIdCard(idCard); + } + if (!phoneTrue || !idCardTrue) { + throw new RuntimeException(TAMPER_PHONE_IDCARD_MSG); + } + } catch (CryptoClient.CryptoException e) { + log.error("企业和个人手机号/身份证解密失败", e); + throw new RuntimeException("解密失败:" + e.getMessage(), e); + } catch (Exception e1) { + log.error("企业和个人手机号/身份证验签失败", e1); + throw new RuntimeException("验签失败:" + e1.getMessage(), e1); + } + } + + /** + * 企业联系人手机号解密/完整性验签 + * @param contact 企业联系人实体 + */ + public static void companyContactPhoneValid(CompanyContact contact) { + String phone = ""; + boolean phoneTrue = true; + try { + if (!StringUtils.isBlank(contact.getContactPersonPhone())) { + phone = sm4Decrypt(contact.getContactPersonPhoneEncrypt()); + phoneTrue = sm3Verify(phone, contact.getContactPersonPhoneCipher()); + //contact.setContactPersonPhone(phone); + if (!phoneTrue) { + throw new RuntimeException(TAMPER_PHONE_MSG); + } + } + } catch (CryptoClient.CryptoException e) { + log.error("企业联系人手机号解密失败", e); + throw new RuntimeException("用户信息解密失败:" + e.getMessage(), e); + } catch (Exception e1) { + log.error("企业联系人手机号验签失败", e1); + throw new RuntimeException("用户信息验证失败:" + e1.getMessage(), e1); + } + } + + /** + * 用户验证-手机号解密/验证完整性 + * @param appUser 用户实体 + */ + public static void phoneValid(AppUser appUser) { + String phone = ""; + boolean phoneTrue = false; + try { + if(StringUtils.isNotBlank(appUser.getPhoneEncrypt())) { + phone = sm4Decrypt(appUser.getPhoneEncrypt()); + phoneTrue = sm3Verify(phone, appUser.getPhoneCipher()); + //appUser.setPhone(phone); + if (!phoneTrue) { + throw new RuntimeException(TAMPER_PHONE_MSG); + } + } + } catch (CryptoClient.CryptoException e) { + log.error("App用户手机号解密失败", e); + throw new RuntimeException("用户信息解密失败:" + e.getMessage(), e); + } catch (Exception e1) { + log.error("App用户手机号验签失败", e1); + throw new RuntimeException("用户信息验证失败:" + e1.getMessage(), e1); + } + } + + /** + * 岗位联系人解密/验证完整性 + * @param jobContact + */ + public static void phoneValid(JobContact jobContact) { + String phone = ""; + boolean phoneTrue = false; + try { + if(StringUtils.isNotBlank(jobContact.getContactPersonPhoneEncrypt())){ + phone=sm4Decrypt(jobContact.getContactPersonPhoneEncrypt()); + phoneTrue=sm3Verify(phone,jobContact.getContactPersonPhoneCipher()); + //jobContact.setContactPersonPhone(phone); + if (!phoneTrue) { + throw new RuntimeException(TAMPER_PHONE_MSG); + } + } + } catch (CryptoClient.CryptoException e) { + log.error("岗位联系人手机号解密失败", e); + throw new RuntimeException("用户信息解密失败:" + e.getMessage(), e); + } catch (Exception e1) { + log.error("岗位联系人手机号验签失败", e1); + throw new RuntimeException("用户信息验证失败:" + e1.getMessage(), e1); + } + } + + /** + * 工作人员手机号解密/验证完整性 + * @param communityUser + */ + public static void phoneValid(CommunityUser communityUser) { + String phone = ""; + boolean phoneTrue = false; + try { + if(StringUtils.isNotBlank(communityUser.getPhoneNumber())){ + phone=sm4Decrypt(communityUser.getPhoneNumberEncrypt()); + phoneTrue=sm3Verify(phone,communityUser.getPhoneNumberCipher()); + //communityUser.setPhoneNumber(phone); + if (!phoneTrue) { + throw new RuntimeException(TAMPER_PHONE_MSG); + } + } + } catch (CryptoClient.CryptoException e) { + log.error("手机号解密失败", e); + throw new RuntimeException("手机号解密失败:" + e.getMessage(), e); + } catch (Exception e1) { + log.error("手机号验签失败", e1); + throw new RuntimeException("手机号验证失败:" + e1.getMessage(), e1); + } + } + + /** + *转发对象手机号 + * @param vo + */ + public static void phoneValid(WechatGroupVo vo) { + String phone = ""; + boolean phoneTrue = false; + try { + if(StringUtils.isNotBlank(vo.getPhoneNumber())){ + phone=sm4Decrypt(vo.getPhoneNumberEncrypt()); + phoneTrue=sm3Verify(phone,vo.getPhoneNumberCipher()); + //vo.setPhoneNumber(phone); + if (!phoneTrue) { + throw new RuntimeException(TAMPER_PHONE_MSG); + } + } + } catch (CryptoClient.CryptoException e) { + log.error("手机号解密失败", e); + throw new RuntimeException("手机号解密失败:" + e.getMessage(), e); + } catch (Exception e1) { + log.error("手机号验签失败", e1); + throw new RuntimeException("手机号验证失败:" + e1.getMessage(), e1); + } + } + + /** + * 身份证解密/验证完整性 + * @param appUser 用户实体 + */ + public static void idCardValid(AppUser appUser) { + String idCard = ""; + boolean idCardTrue = true; + try { + if (StringUtils.isNotBlank(appUser.getIdCardCipher())) { + idCard = sm4Decrypt(appUser.getIdCardEncrypt()); + idCardTrue = sm3Verify(idCard, appUser.getIdCardCipher()); + //appUser.setIdCard(idCard); + } + if (!idCardTrue) { + throw new RuntimeException(TAMPER_IDCARD_MSG); + } + } catch (CryptoClient.CryptoException e) { + log.error("App用户身份证解密失败", e); + throw new RuntimeException("用户信息解密失败:" + e.getMessage(), e); + } catch (Exception e1) { + log.error("App用户身份证验签失败", e1); + throw new RuntimeException("用户信息验证失败:" + e1.getMessage(), e1); + } + } + + /** + * 手机号加密/生成完整性校验串 + * @param appUser 用户实体 + */ + public static void savePhoneSm4(AppUser appUser) { + try { + String phoneSm4 = sm4Encrypt(appUser.getPhone()); + String phoneSm3 = sm3Hash(appUser.getPhone()); + appUser.setPhoneEncrypt(phoneSm4); + appUser.setPhoneCipher(phoneSm3); + } catch (CryptoClient.CryptoException e) { + log.error("App用户手机号加密失败", e); + throw new RuntimeException("手机号加密失败", e); + } + } + + /** + * 岗位联系人加密 + * @param jobContact + */ + public static void savePhoneSm4(JobContact jobContact) { + try { + if(!StringUtils.isBlank(jobContact.getContactPersonPhone())){ + String phoneSm4=sm4Encrypt(jobContact.getContactPersonPhone()); + String phoneSm3=sm3Hash(jobContact.getContactPersonPhone()); + jobContact.setContactPersonPhoneEncrypt(phoneSm4); + jobContact.setContactPersonPhoneCipher(phoneSm3); + } + } catch (CryptoClient.CryptoException e) { + log.error("岗位联系人用户手机号加密失败", e); + throw new RuntimeException("手机号加密失败", e); + } + } + + /** + * 微信抓取负责人 + * @param communityUser + */ + public static void savePhoneSm4(CommunityUser communityUser) { + try { + if(!StringUtils.isBlank(communityUser.getPhoneNumber())){ + String phoneSm4=sm4Encrypt(communityUser.getPhoneNumber()); + String phoneSm3=sm3Hash(communityUser.getPhoneNumber()); + communityUser.setPhoneNumberEncrypt(phoneSm4); + communityUser.setPhoneNumberCipher(phoneSm3); + } + } catch (CryptoClient.CryptoException e) { + log.error("岗位联系人用户手机号加密失败", e); + throw new RuntimeException("手机号加密失败", e); + } + } + + /** + * 身份证加密/生成完整性校验串 + * @param appUser 用户实体 + */ + public static void saveIdCardSm4(AppUser appUser) { + try { + if (!StringUtils.isBlank(appUser.getIdCard())) { + String idCardUper = StringUtil.toUpperCaseIgnoreBlank(appUser.getIdCard()); + String idCardSm4 = sm4Encrypt(idCardUper); + String idCardSm3 = sm3Hash(idCardUper); + appUser.setIdCardEncrypt(idCardSm4); + appUser.setIdCardCipher(idCardSm3); + } + } catch (CryptoClient.CryptoException e) { + log.error("App用户身份证加密失败", e); + throw new RuntimeException("身份证加密失败", e); + } + } + + /** + * 手机号、身份证加密/生成完整性校验串 + * @param appUser 用户实体 + */ + public static void savePhoneIdCardSm4(AppUser appUser) { + try { + //密码机完整性/保密性 + if (!StringUtils.isBlank(appUser.getPhone())) { + String phoneSm4 = sm4Encrypt(appUser.getPhone()); + String phoneSm3 = sm3Hash(appUser.getPhone()); + appUser.setPhoneEncrypt(phoneSm4); + appUser.setPhoneCipher(phoneSm3); + } + if (!StringUtils.isBlank(appUser.getIdCard())) { + String idCardUper = StringUtil.toUpperCaseIgnoreBlank(appUser.getIdCard()); + String idCardSm4 = sm4Encrypt(idCardUper); + String idCardSm3 = sm3Hash(idCardUper); + appUser.setIdCardEncrypt(idCardSm4); + appUser.setIdCardCipher(idCardSm3); + } + } catch (CryptoClient.CryptoException e) { + log.error("App用户手机号+身份证加密失败", e); + } + } + + /** + * 身份证手机号加密/完整性 + * @param employeeConfirm + */ + public static void savePhoneIdCardSm4(EmployeeConfirm employeeConfirm){ + try { + if(!StringUtils.isBlank(employeeConfirm.getContactPersonPhone())){ + String phoneSm4=sm4Encrypt(employeeConfirm.getContactPersonPhone()); + String phoneSm3=sm3Hash(employeeConfirm.getContactPersonPhone()); + employeeConfirm.setContactPersonPhoneEncrypt(phoneSm4); + employeeConfirm.setContactPersonPhoneCipher(phoneSm3); + } + if(!StringUtils.isBlank(employeeConfirm.getIdCard())){ + String idCardSm4=sm4Encrypt(employeeConfirm.getIdCard()); + String idCardSm3=sm3Hash(employeeConfirm.getIdCard()); + employeeConfirm.setIdCardEncrypt(idCardSm4); + employeeConfirm.setIdCardCipher(idCardSm3); + } + } catch (CryptoClient.CryptoException e) { + log.error("企业法人手机号/身份证加密失败", e); + throw new RuntimeException("手机号加密失败", e); + } + } + + /** + * 企业法人身份证和手机号加密/生成完整性校验串 + * @param company 企业实体 + */ + public static void legalSm4(Company company) { + String legalIdCard = company.getLegalIdCard(); + String legalPhone = company.getLegalPhone(); + try { + if (!StringUtils.isBlank(legalPhone)) { + String phoneSm4 = sm4Encrypt(legalPhone); + String phoneSm3 = sm3Hash(legalPhone); + company.setLegalPhoneEncrypt(phoneSm4); + company.setLegalPhoneCipher(phoneSm3); + } + if (!StringUtils.isBlank(legalIdCard)) { + String idCardSm4 = sm4Encrypt(legalIdCard); + String idCardSm3 = sm3Hash(legalIdCard); + company.setLegalIdCardEncrypt(idCardSm4); + company.setLegalIdCardCipher(idCardSm3); + } + } catch (CryptoClient.CryptoException e) { + log.error("企业法人手机号/身份证加密失败", e); + throw new RuntimeException("法人手机号/身份证,加密失败", e); + } + } + + /** + * 企业联系人手机号加密/生成完整性校验串 + * @param contact 企业联系人实体 + */ + public static void saveCompanyContactPhoneSm4(CompanyContact contact) { + try { + String phoneSm4 = sm4Encrypt(contact.getContactPersonPhone()); + String phoneSm3 = sm3Hash(contact.getContactPersonPhone()); + contact.setContactPersonPhoneEncrypt(phoneSm4); + contact.setContactPersonPhoneCipher(phoneSm3); + } catch (CryptoClient.CryptoException e) { + log.error("企业联系人手机号加密失败", e); + throw new RuntimeException("手机号加密失败", e); + } + } + + /** + * 加密系统管理用户 + * @param sysUser + */ + public static void saveSysUserSm4(SysUser sysUser) { + String phone = sysUser.getPhonenumber(); + String idCard = sysUser.getIdCard(); + try { + if (!StringUtils.isBlank(phone)) { + String phoneSm4 = sm4Encrypt(phone); + String phoneSm3 = sm3Hash(phone); + sysUser.setPhonenumberEncrypt(phoneSm4); + sysUser.setPhonenumberCipher(phoneSm3); + } + Long[] roleIds=sysUser.getRoleIds(); + if (!StringUtils.isBlank(idCard)&& roleIds != null && roleIds.length > 0) { + boolean contains1102 = !Arrays.asList(roleIds).contains(StringUtil.COMPANY_ADMIN_ROLE_KEY); + if (contains1102) { + String idCardSm4 = sm4Encrypt(idCard); + String idCardSm3 = sm3Hash(idCard); + sysUser.setIdCardEncrypt(idCardSm4); + sysUser.setIdCardCipher(idCardSm3); + } + } + } catch (CryptoClient.CryptoException e) { + log.error("企业法人手机号/身份证加密失败", e); + throw new RuntimeException("法人手机号/身份证,加密失败", e); + } + } + + /** + * 通用SM4解密方法(对外提供) + * @param sm4 加密串 + * @return 解密后的明文 + */ + public static String getSm4Decrypt(String sm4) { + String deSm4 = ""; + try { + deSm4 = sm4Decrypt(sm4); + } catch (CryptoClient.CryptoException e) { + deSm4=sm4; + log.error("通用SM4解密失败,密文:{}", sm4, e); + } + return deSm4; + } + + /** + * 加密 + * @param sm4 + * @return + */ + public static String getSm4Encrypt(String sm4) { + String deSm4 = ""; + try { + deSm4 = sm4Encrypt(sm4); + } catch (CryptoClient.CryptoException e) { + deSm4=sm4; + log.error("通用SM4加密失败,密文:{}", sm4, e); + } + return deSm4; + } + + /** + * pc互联网端-加密返回数组 + * @param phone + * @return + */ + public static String[] savePhoneSm4(String phone){ + String phoneSm4; + String phoneSm3; + try { + phoneSm4 = sm4Encrypt(phone); + phoneSm3= sm3Hash(phone); + } catch (CryptoClient.CryptoException e) { + log.error("用户手机号加密失败:{}",phone, e); + throw new RuntimeException("手机号加密失败",e); + } + return new String[]{phoneSm4,phoneSm3}; + } + + /** + * pc互联网端-用户身份证加密 + * @param idCard + * @return + */ + public static String[] saveIdCardSm4(String idCard){ + String idCardSm4; + String idCardSm3; + try { + idCardSm4 = sm4Encrypt(idCard); + idCardSm3= sm3Hash(idCard); + } catch (CryptoClient.CryptoException e) { + log.error("用户身份证加密失败:{}",idCard, e); + throw new RuntimeException("身份证加密失败",e); + } + return new String[]{idCardSm4,idCardSm3}; + } +} \ No newline at end of file diff --git a/ruoyi-bussiness/src/main/resources/mapper/app/AppUserMapper.xml b/ruoyi-bussiness/src/main/resources/mapper/app/AppUserMapper.xml index 1db03a1..959540a 100644 --- a/ruoyi-bussiness/src/main/resources/mapper/app/AppUserMapper.xml +++ b/ruoyi-bussiness/src/main/resources/mapper/app/AppUserMapper.xml @@ -152,4 +152,88 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" order by b.create_time desc + + UPDATE app_user + SET id_card = CASE + + WHEN user_id = #{item.userId} THEN #{item.idCard} + + END, + id_card_cipher = CASE + + WHEN user_id = #{item.userId} THEN #{item.idCardCipher} + + END, + id_card_encrypt = CASE + + WHEN user_id = #{item.userId} THEN #{item.idCardEncrypt} + + END, + phone = CASE + + WHEN user_id = #{item.userId} THEN #{item.phone} + + END, + phone_cipher = CASE + + WHEN user_id = #{item.userId} THEN #{item.phoneCipher} + + END, + phone_encrypt = CASE + + WHEN user_id = #{item.userId} THEN #{item.phoneEncrypt} + + END + WHERE user_id IN + + #{item.userId} + + + + + UPDATE sys_user + SET id_card = CASE + + WHEN user_id = #{item.userId} THEN #{item.idCard} + + END, + id_card_cipher = CASE + + WHEN user_id = #{item.userId} THEN #{item.idCardCipher} + + END, + id_card_encrypt = CASE + + WHEN user_id = #{item.userId} THEN #{item.idCardEncrypt} + + END, + phonenumber = CASE + + WHEN user_id = #{item.userId} THEN #{item.phonenumber} + + END, + phonenumber_cipher = CASE + + WHEN user_id = #{item.userId} THEN #{item.phonenumberCipher} + + END, + phonenumber_encrypt = CASE + + WHEN user_id = #{item.userId} THEN #{item.phonenumberEncrypt} + + END + WHERE user_id IN + + #{item.userId} + + + + + \ No newline at end of file diff --git a/ruoyi-bussiness/src/main/resources/mapper/app/CompanyContactMapper.xml b/ruoyi-bussiness/src/main/resources/mapper/app/CompanyContactMapper.xml index d9e3dc5..57e3f26 100644 --- a/ruoyi-bussiness/src/main/resources/mapper/app/CompanyContactMapper.xml +++ b/ruoyi-bussiness/src/main/resources/mapper/app/CompanyContactMapper.xml @@ -18,7 +18,7 @@ - select id, company_id, contact_person, contact_person_phone, del_flag, create_by, create_time, update_by, update_time, remark from company_contact + select id, company_id, contact_person, contact_person_phone, del_flag, create_by, create_time, update_by, update_time, remark,contact_person_phone_cipher,contact_person_phone_encrypt from company_contact + + UPDATE company + SET legal_id_card = CASE + + WHEN company_id = #{item.companyId} THEN #{item.legalIdCard} + + END, + legal_id_card_cipher = CASE + + WHEN company_id = #{item.companyId} THEN #{item.legalIdCardCipher} + + END, + legal_id_card_encrypt = CASE + + WHEN company_id = #{item.companyId} THEN #{item.legalIdCardEncrypt} + + END, + legal_phone = CASE + + WHEN company_id = #{item.companyId} THEN #{item.legalPhone} + + END, + legal_phone_cipher = CASE + + WHEN company_id = #{item.companyId} THEN #{item.legalPhoneCipher} + + END, + legal_phone_encrypt = CASE + + WHEN company_id = #{item.companyId} THEN #{item.legalPhoneEncrypt} + + END + WHERE company_id IN + + #{item.companyId} + + + + + \ No newline at end of file diff --git a/ruoyi-bussiness/src/main/resources/mapper/app/EmployeeConfirmMapper.xml b/ruoyi-bussiness/src/main/resources/mapper/app/EmployeeConfirmMapper.xml index 5f87b9d..d9d6753 100644 --- a/ruoyi-bussiness/src/main/resources/mapper/app/EmployeeConfirmMapper.xml +++ b/ruoyi-bussiness/src/main/resources/mapper/app/EmployeeConfirmMapper.xml @@ -35,4 +35,42 @@ + + UPDATE employee_confirm + SET id_card = CASE + + WHEN id = #{item.id} THEN #{item.idCard} + + END, + id_card_cipher = CASE + + WHEN id = #{item.id} THEN #{item.idCardCipher} + + END, + id_card_encrypt = CASE + + WHEN id = #{item.id} THEN #{item.idCardEncrypt} + + END, + contact_person_phone = CASE + + WHEN id = #{item.id} THEN #{item.contactPersonPhone} + + END, + contact_person_phone_cipher = CASE + + WHEN id = #{item.id} THEN #{item.contactPersonPhoneCipher} + + END, + contact_person_phone_encrypt = CASE + + WHEN id = #{item.id} THEN #{item.contactPersonPhoneEncrypt} + + END + WHERE id IN + + #{item.id} + + + diff --git a/ruoyi-bussiness/src/main/resources/mapper/app/JobContactMapper.xml b/ruoyi-bussiness/src/main/resources/mapper/app/JobContactMapper.xml index e22e1d8..cf965ae 100644 --- a/ruoyi-bussiness/src/main/resources/mapper/app/JobContactMapper.xml +++ b/ruoyi-bussiness/src/main/resources/mapper/app/JobContactMapper.xml @@ -16,11 +16,13 @@ + + - select id, job_id, contact_person, contact_person_phone, position, del_flag, create_by, create_time, update_by, update_time, remark from job_contact + select id, job_id, contact_person, contact_person_phone, position, del_flag, create_by, create_time, update_by, update_time, remark,contact_person_phone_cipher,contact_person_phone_encrypt from job_contact @@ -45,12 +47,14 @@ INSERT INTO job_contact ( job_id, contact_person, contact_person_phone,position, - create_by, create_time, del_flag,remark + create_by, create_time, del_flag,remark,contact_person_phone_cipher, + contact_person_phone_encrypt ) VALUES ( #{item.jobId}, #{item.contactPerson}, #{item.contactPersonPhone},#{item.position}, - #{item.createBy}, #{item.createTime}, #{item.delFlag},#{item.remark} + #{item.createBy}, #{item.createTime}, #{item.delFlag},#{item.remark},#{item.contactPersonPhoneCipher}, + #{item.contactPersonPhoneEncrypt} ) @@ -73,4 +77,27 @@ + + UPDATE job_contact + SET contact_person_phone = CASE + + WHEN id = #{item.id} THEN #{item.contactPersonPhone} + + END, + contact_person_phone_cipher = CASE + + WHEN id = #{item.id} THEN #{item.contactPersonPhoneCipher} + + END, + contact_person_phone_encrypt = CASE + + WHEN id = #{item.id} THEN #{item.contactPersonPhoneEncrypt} + + END + WHERE id IN + + #{item.id} + + + diff --git a/ruoyi-bussiness/src/main/resources/mapper/app/WechatGroupMapper.xml b/ruoyi-bussiness/src/main/resources/mapper/app/WechatGroupMapper.xml index 0af8524..c6ee70d 100644 --- a/ruoyi-bussiness/src/main/resources/mapper/app/WechatGroupMapper.xml +++ b/ruoyi-bussiness/src/main/resources/mapper/app/WechatGroupMapper.xml @@ -4,7 +4,7 @@ where del_flag='0' and id_card = #{idCard} LIMIT 1 - + \ No newline at end of file diff --git a/ruoyi-system/src/main/resources/mapper/system/SysUserRoleMapper.xml b/ruoyi-system/src/main/resources/mapper/system/SysUserRoleMapper.xml index dd72689..a149da1 100644 --- a/ruoyi-system/src/main/resources/mapper/system/SysUserRoleMapper.xml +++ b/ruoyi-system/src/main/resources/mapper/system/SysUserRoleMapper.xml @@ -9,7 +9,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" - + delete from sys_user_role where user_id=#{userId} @@ -17,7 +17,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" select count(1) from sys_user_role where role_id=#{roleId} - + delete from sys_user_role where user_id in #{userId}