diff --git a/ruoyi-common/pom.xml b/ruoyi-common/pom.xml index b899bba..b38aa2f 100644 --- a/ruoyi-common/pom.xml +++ b/ruoyi-common/pom.xml @@ -101,6 +101,13 @@ spring-boot-starter-data-redis + + + org.bouncycastle + bcprov-jdk18on + 1.77 + + org.apache.commons diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/tymh/authority/QxRegister.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/tymh/authority/QxRegister.java new file mode 100644 index 0000000..77cee7f --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/tymh/authority/QxRegister.java @@ -0,0 +1,38 @@ +package com.ruoyi.common.core.domain.entity.tymh.authority; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +public class QxRegister { + + @ApiModelProperty("用户名 String(40)") + private String username; + + @ApiModelProperty("登录名 String(100)") + private String loginName; + + @ApiModelProperty("密码 String(100) 经过一次md5") + private String password; + + @ApiModelProperty("证件类型 String(2) 固定01") + private String certType; + + @ApiModelProperty("证件号码 String(40) 身份证号码") + private String certNum; + + @ApiModelProperty("联系电话 String(40)") + private String phone; + + @ApiModelProperty("地址 String(200)") + private String address; + + @ApiModelProperty("邮箱 String(100)") + private String email; + + @ApiModelProperty("隶属机构id String(100)") + private String organizationSubordinated; + + @ApiModelProperty("用户类型 String(2) 固定1") + private String userType; +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/tymh/authority/QxRole.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/tymh/authority/QxRole.java new file mode 100644 index 0000000..57b686d --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/tymh/authority/QxRole.java @@ -0,0 +1,25 @@ +package com.ruoyi.common.core.domain.entity.tymh.authority; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +public class QxRole { + @ApiModelProperty("权限id") + private String pathId; + + @ApiModelProperty("权限名称") + private String pathName; + + @ApiModelProperty("应用id") + private String appid; + + @ApiModelProperty("上级权限id") + private String superiorPathId; + + @ApiModelProperty("序号") + private String displayOrder; + + @ApiModelProperty("显示名称") + private String showName; +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/tymh/authority/QxUnit.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/tymh/authority/QxUnit.java new file mode 100644 index 0000000..20523e9 --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/tymh/authority/QxUnit.java @@ -0,0 +1,22 @@ +package com.ruoyi.common.core.domain.entity.tymh.authority; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +public class QxUnit { + @ApiModelProperty("机构 ID") + private String organizationId; + + @ApiModelProperty("机构名称") + private String organizationName; + + @ApiModelProperty("机构类型") + private String organizationType; + + @ApiModelProperty("所属行政区划") + private String regionCode; + + @ApiModelProperty("上级机构 ID") + private String superiorOrganizationId; +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/tymh/authority/QxUserInfo.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/tymh/authority/QxUserInfo.java new file mode 100644 index 0000000..1923a6f --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/tymh/authority/QxUserInfo.java @@ -0,0 +1,34 @@ +package com.ruoyi.common.core.domain.entity.tymh.authority; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +public class QxUserInfo { + @ApiModelProperty("用户id") + private String userid; + + @ApiModelProperty("用户名称") + private String username; + + @ApiModelProperty("登录名称") + private String loginName; + + @ApiModelProperty("性别 1男性,2女性") + private String gender; + + @ApiModelProperty("证件号码") + private String certNum; + + @ApiModelProperty("电话号码") + private String phone; + + @ApiModelProperty("邮件") + private String email; + + @ApiModelProperty("隶属机构id") + private String organizationSubordinated; + + @ApiModelProperty("隶属机构名称") + private String organizationName; +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/tymh/authority/QxUserRoleList.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/tymh/authority/QxUserRoleList.java new file mode 100644 index 0000000..70f007c --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/tymh/authority/QxUserRoleList.java @@ -0,0 +1,17 @@ +package com.ruoyi.common.core.domain.entity.tymh.authority; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +public class QxUserRoleList { + + @ApiModelProperty("角色ID") + private String roleId; + + @ApiModelProperty("角色名称") + private String roleName; + + @ApiModelProperty("角色类型 0管理角色,1经办角色") + private String roleType; +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/tymh/authority/QxUserSystemList.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/tymh/authority/QxUserSystemList.java new file mode 100644 index 0000000..0fdb1ad --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/tymh/authority/QxUserSystemList.java @@ -0,0 +1,19 @@ +package com.ruoyi.common.core.domain.entity.tymh.authority; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +public class QxUserSystemList { + @ApiModelProperty("系统id") + private String appId; + + @ApiModelProperty("系统名称") + private String appName; + + @ApiModelProperty("应用简称") + private String appNameAlias; + + @ApiModelProperty("应用地址") + private String appPath; +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/tymh/nwToken/NwTokenResult.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/tymh/nwToken/NwTokenResult.java new file mode 100644 index 0000000..03e62df --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/tymh/nwToken/NwTokenResult.java @@ -0,0 +1,22 @@ +package com.ruoyi.common.core.domain.entity.tymh.nwToken; + +import com.fasterxml.jackson.annotation.JsonProperty; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +public class NwTokenResult { + + @ApiModelProperty("错误标识(1错误0正常)") + private String errflag; + + @ApiModelProperty("错误标识(1错误0正常)") + private String errtext; + + @JsonProperty("Access-Token") + @ApiModelProperty("错误标识(1错误0正常)") + private String accessToken; + + @ApiModelProperty("错误标识(1错误0正常)") + private Long expiresIn; +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/tymh/nwToken/NwUserInfoResult.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/tymh/nwToken/NwUserInfoResult.java new file mode 100644 index 0000000..20904b0 --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/tymh/nwToken/NwUserInfoResult.java @@ -0,0 +1,23 @@ +package com.ruoyi.common.core.domain.entity.tymh.nwToken; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +@Data +public class NwUserInfoResult { + + @ApiModelProperty("错误标识(1错误0正常)") + private String errflag; + + @ApiModelProperty("错误文本") + private String errtext; + + @ApiModelProperty("身份证号码") + private String idcardno; + + @ApiModelProperty("姓名") + private String name; + + @ApiModelProperty("用户id") + private String userid; +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/tymh/wwToken/WwRegister.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/tymh/wwToken/WwRegister.java new file mode 100644 index 0000000..2b54ad1 --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/tymh/wwToken/WwRegister.java @@ -0,0 +1,34 @@ +package com.ruoyi.common.core.domain.entity.tymh.wwToken; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 统一认证-注册 + */ +@Data +public class WwRegister { + @ApiModelProperty("身份证号 个人注册必填,单位注册不填") + private String idno; + + @ApiModelProperty("姓名 个人注册必填,单位注册不填") + private String name; + + @ApiModelProperty("单位统一社会信用代码 单位注册必填,个人注册不填") + private String enterprisecode; + + @ApiModelProperty("单位名称 单位注册必填,个人注册不填") + private String enterprisename; + + @ApiModelProperty("单位联系人 单位注册必填,个人注册不填") + private String contactperson; + + @ApiModelProperty("单位联系电话 单位注册必填,个人注册不填") + private String contactphone; + + @ApiModelProperty("用户类型 1:个人 2:单位") + private String usertype; + + @ApiModelProperty("渠道 1:门户 2:小程序 3:终端") + private String channel; +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/tymh/wwToken/WwResult.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/tymh/wwToken/WwResult.java new file mode 100644 index 0000000..341824b --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/tymh/wwToken/WwResult.java @@ -0,0 +1,27 @@ +package com.ruoyi.common.core.domain.entity.tymh.wwToken; + +import com.fasterxml.jackson.annotation.JsonProperty; +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 统一认证-返回 + */ +@Data +public class WwResult { + @ApiModelProperty("错误标识(1错误0正常)") + private String errflag; + + @ApiModelProperty("错误文本") + private String errtext; + + @JsonProperty("Access-Token") + @ApiModelProperty("访问令牌 Access-Token") + private String accessToken; + + @ApiModelProperty("身份证号") + private String idno; + + @ApiModelProperty("姓名") + private String name; +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/tymh/wwToken/WwUnitInfoResult.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/tymh/wwToken/WwUnitInfoResult.java new file mode 100644 index 0000000..e421fe8 --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/tymh/wwToken/WwUnitInfoResult.java @@ -0,0 +1,28 @@ +package com.ruoyi.common.core.domain.entity.tymh.wwToken; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 统一认证-单位信息 + */ +@Data +public class WwUnitInfoResult { + @ApiModelProperty("错误标识(1错误0正常)") + private String errflag; + + @ApiModelProperty("错误文本") + private String errtext; + + @ApiModelProperty("统一社会信用代码") + private String enterprisecode; + + @ApiModelProperty("单位名称") + private String enterprisename; + + @ApiModelProperty("联系人") + private String contactperson; + + @ApiModelProperty("联系电话") + private String contactphone; +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/tymh/wwToken/WwUserInfoResult.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/tymh/wwToken/WwUserInfoResult.java new file mode 100644 index 0000000..924fcb2 --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/tymh/wwToken/WwUserInfoResult.java @@ -0,0 +1,22 @@ +package com.ruoyi.common.core.domain.entity.tymh.wwToken; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 统一认证-个人信息 + */ +@Data +public class WwUserInfoResult { + @ApiModelProperty("错误标识(1错误0正常)") + private String errflag; + + @ApiModelProperty("错误文本") + private String errtext; + + @ApiModelProperty("身份证号") + private String idno; + + @ApiModelProperty("姓名") + private String name; +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/tymh/wwToken/WwUserLogin.java b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/tymh/wwToken/WwUserLogin.java new file mode 100644 index 0000000..5baa41c --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/tymh/wwToken/WwUserLogin.java @@ -0,0 +1,22 @@ +package com.ruoyi.common.core.domain.entity.tymh.wwToken; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * 统一认证-登录 + */ +@Data +public class WwUserLogin { + @ApiModelProperty("身份证号或统一社会信用代码") + private String username; + + @ApiModelProperty("1:个人 2:单位") + private String usertype; + + @ApiModelProperty("1:账号、短信验证码 2:电子社保卡 3:政务网") + private String logontype; + + @ApiModelProperty("1:门户 2:小程序 3:终端") + private String logonchannel; +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/crypto/CryptoUtil.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/crypto/CryptoUtil.java new file mode 100644 index 0000000..b3f30ce --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/crypto/CryptoUtil.java @@ -0,0 +1,87 @@ +package com.ruoyi.common.utils.crypto; + +import org.bouncycastle.crypto.InvalidCipherTextException; +import org.bouncycastle.crypto.engines.SM2Engine; +import org.bouncycastle.crypto.params.ECDomainParameters; +import org.bouncycastle.crypto.params.ECPrivateKeyParameters; +import org.bouncycastle.crypto.params.ECPublicKeyParameters; +import org.bouncycastle.crypto.params.ParametersWithRandom; +import org.bouncycastle.math.ec.ECCurve; +import org.bouncycastle.math.ec.ECPoint; +import org.bouncycastle.util.encoders.Hex; + +import java.math.BigInteger; +import java.nio.charset.StandardCharsets; +import java.security.SecureRandom; + +public class CryptoUtil { + public static final int SM3_DIGEST_LENGTH = 32; + private static final BigInteger SM2_ECC_P = new BigInteger("FFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFF", 16); + private static final BigInteger SM2_ECC_A = new BigInteger("FFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000FFFFFFFFFFFFFFFC", 16); + private static final BigInteger SM2_ECC_B = new BigInteger("28E9FA9E9D9F5E344D5A9E4BCF6509A7F39789F515AB8F92DDBCBD414D940E93", 16); + private static final BigInteger SM2_ECC_N = new BigInteger("FFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFF7203DF6B21C6052B53BBF40939D54123", 16); + private static final BigInteger SM2_ECC_GX = new BigInteger("32C4AE2C1F1981195F9904466A39C9948FE30BBFF2660BE1715A4589334C74C7", 16); + private static final BigInteger SM2_ECC_GY = new BigInteger("BC3736A2F4F6779C59BDCEE36B692153D0A9877CC62A474002DF32E52139F0A0", 16); + private static final ECCurve CURVE; + private static final ECPoint G_POINT; + private static final ECDomainParameters DOMAIN_PARAMS; + + static { + CURVE = new ECCurve.Fp(SM2_ECC_P, SM2_ECC_A, SM2_ECC_B, (BigInteger)null, (BigInteger)null); + G_POINT = CURVE.createPoint(SM2_ECC_GX, SM2_ECC_GY); + DOMAIN_PARAMS = new ECDomainParameters(CURVE, G_POINT, SM2_ECC_N, BigInteger.ONE); + } + + public static ECPublicKeyParameters importPublicKeyFromHex(String publicKeyStr) throws Exception{ + ECPoint pubKey = null; + + try { + pubKey = CURVE.decodePoint(org.apache.commons.codec.binary.Hex.decodeHex(publicKeyStr)); + } catch (Exception var3) { + throw new Exception("读取公钥失败:" + var3.getMessage()); + } + + return new ECPublicKeyParameters(pubKey, DOMAIN_PARAMS); + } + + + /** + * 方法描述:sm2加密 + */ + public static String sm2Encrypt(String signature, String plainText) throws Exception { + ECPublicKeyParameters ecPublicKeyParameters = importPublicKeyFromHex(signature); + byte[] srcData = plainText.getBytes(StandardCharsets.UTF_8); + byte[] bodyBytes; + try { + SM2Engine engine = new SM2Engine(); + ParametersWithRandom pwr = new ParametersWithRandom(ecPublicKeyParameters, new SecureRandom()); + engine.init(true, pwr); + bodyBytes = engine.processBlock(srcData, 0, srcData.length); + } catch (InvalidCipherTextException var4) { + throw new Exception("加密失败:" + var4.getMessage()); + } + return Hex.toHexString(bodyBytes); + } + + public static ECPrivateKeyParameters importPrivateKey(String privateKeyHex) { + BigInteger privateKey = new BigInteger(privateKeyHex, 16); + return new ECPrivateKeyParameters(privateKey, DOMAIN_PARAMS); + } + + /** + * 方法描述:sm2解密 + */ + public static String sm2Decrypt(String signature, String cipherText) throws Exception { + ECPrivateKeyParameters ecPrivateKeyParameters = importPrivateKey(signature); + byte[] bodyBytes; + try { + SM2Engine engine = new SM2Engine(); + byte[] sm2CipherText = Hex.decode(cipherText.getBytes(StandardCharsets.UTF_8)); + engine.init(false, ecPrivateKeyParameters); + bodyBytes = engine.processBlock(sm2CipherText, 0, sm2CipherText.length); + } catch (InvalidCipherTextException var3) { + throw new Exception("解密失败:" + var3.getMessage()); + } + return new String(bodyBytes, StandardCharsets.UTF_8); + } +} \ No newline at end of file