From 40835d2f693736b1bec9dc80c2d4fc3c8a6fce0b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=85=AD=E5=A6=82?= <8775@163.com> Date: Sun, 27 Oct 2024 21:08:00 +0800 Subject: [PATCH] 5.0 --- sop-gateway/checkstyle.xml => checkstyle.xml | 0 pom.xml | 160 +++++++++- sop-admin/pom.xml | 7 +- sop-admin/sop-admin-backend/pom.xml | 153 ++------- .../sop/adminbackend/common/RSATool.java | 79 ++--- .../adminbackend/common/enums/StatusEnum.java | 7 +- .../common/exception/ErrorCode.java | 3 +- .../sop/adminbackend/common/resp/Result.java | 1 + .../service/isv/PermIsvGroupService.java | 3 - .../service/sys/login/LoginService.java | 3 +- .../service/sys/login/enums/RegTypeEnum.java | 3 +- .../gitee/sop/adminbackend/util/IdGen.java | 298 ++++++++++-------- .../gitee/sop/adminbackend/util/JwtUtil.java | 8 +- .../sop/adminbackend/util/PasswordUtil.java | 7 +- .../{sop-story => example-payment}/.gitignore | 0 sop-example/example-payment/pom.xml | 129 ++++++++ .../payment/ExamplePaymentApplication.java | 16 + .../gitee/sop/payment/open/OpenPayment.java | 25 ++ .../payment/open/impl/OpenPaymentImpl.java | 25 ++ .../open/req/AlipayTradeWapPayRequest.java | 177 +++++++++++ .../open/resp/AlipayTradeWapPayResponse.java | 19 ++ .../main/resources/application-dev.properties | 0 .../resources/application-test.properties | 0 .../src/main/resources/application.properties | 9 + .../src/main/resources/download.txt | 0 .../resources/i18n/isp/bizerror_en.properties | 0 .../i18n/isp/bizerror_zh_CN.properties | 0 .../i18n/isp/goods_error_en.properties | 0 .../i18n/isp/goods_error_zh_CN.properties | 0 sop-example/example-story/.gitignore | 25 ++ .../{sop-story => example-story}/pom.xml | 4 +- .../storyweb/ExampleStoryApplication.java} | 4 +- .../gitee/sop/storyweb/open/OpenStory.java | 0 .../sop/storyweb/open/impl/OpenStoryImpl.java | 0 .../sop/storyweb/open/req/StorySaveDTO.java | 0 .../sop/storyweb/open/resp/StoryResponse.java | 0 .../main/resources/application-dev.properties | 1 + .../resources/application-test.properties | 2 + .../src/main/resources/application.properties | 0 .../src/main/resources/download.txt | 1 + .../resources/i18n/isp/bizerror_en.properties | 10 + .../i18n/isp/bizerror_zh_CN.properties | 14 + .../i18n/isp/goods_error_en.properties | 2 + .../i18n/isp/goods_error_zh_CN.properties | 5 + sop-example/pom.xml | 5 +- sop-gateway/pom.xml | 130 +------- .../sop/gateway/response/ApiResponse.java | 16 +- .../service/dubbo/ApiRegisterServiceImpl.java | 48 ++- .../internal/ResultRouteInterceptor.java | 2 +- .../service/validate/ApiValidator.java | 4 +- sop-sdk/pom.xml | 9 +- .../sop/support/register/ApiRegister.java | 8 +- .../support/service/ApiRegisterService.java | 3 +- .../support/service/dto/RegisterResult.java | 31 ++ sop-test/pom.xml | 54 +++- .../gitee/sop/test/AlipayClientPostTest.java | 9 +- .../java/com/gitee/sop/test/AllInOneTest.java | 8 +- 57 files changed, 991 insertions(+), 536 deletions(-) rename sop-gateway/checkstyle.xml => checkstyle.xml (100%) rename sop-example/{sop-story => example-payment}/.gitignore (100%) create mode 100644 sop-example/example-payment/pom.xml create mode 100644 sop-example/example-payment/src/main/java/com/gitee/sop/payment/ExamplePaymentApplication.java create mode 100644 sop-example/example-payment/src/main/java/com/gitee/sop/payment/open/OpenPayment.java create mode 100644 sop-example/example-payment/src/main/java/com/gitee/sop/payment/open/impl/OpenPaymentImpl.java create mode 100644 sop-example/example-payment/src/main/java/com/gitee/sop/payment/open/req/AlipayTradeWapPayRequest.java create mode 100644 sop-example/example-payment/src/main/java/com/gitee/sop/payment/open/resp/AlipayTradeWapPayResponse.java rename sop-example/{sop-story => example-payment}/src/main/resources/application-dev.properties (100%) rename sop-example/{sop-story => example-payment}/src/main/resources/application-test.properties (100%) create mode 100644 sop-example/example-payment/src/main/resources/application.properties rename sop-example/{sop-story => example-payment}/src/main/resources/download.txt (100%) rename sop-example/{sop-story => example-payment}/src/main/resources/i18n/isp/bizerror_en.properties (100%) rename sop-example/{sop-story => example-payment}/src/main/resources/i18n/isp/bizerror_zh_CN.properties (100%) rename sop-example/{sop-story => example-payment}/src/main/resources/i18n/isp/goods_error_en.properties (100%) rename sop-example/{sop-story => example-payment}/src/main/resources/i18n/isp/goods_error_zh_CN.properties (100%) create mode 100644 sop-example/example-story/.gitignore rename sop-example/{sop-story => example-story}/pom.xml (98%) rename sop-example/{sop-story/src/main/java/com/gitee/sop/storyweb/SopStoryApplication.java => example-story/src/main/java/com/gitee/sop/storyweb/ExampleStoryApplication.java} (74%) rename sop-example/{sop-story => example-story}/src/main/java/com/gitee/sop/storyweb/open/OpenStory.java (100%) rename sop-example/{sop-story => example-story}/src/main/java/com/gitee/sop/storyweb/open/impl/OpenStoryImpl.java (100%) rename sop-example/{sop-story => example-story}/src/main/java/com/gitee/sop/storyweb/open/req/StorySaveDTO.java (100%) rename sop-example/{sop-story => example-story}/src/main/java/com/gitee/sop/storyweb/open/resp/StoryResponse.java (100%) create mode 100644 sop-example/example-story/src/main/resources/application-dev.properties create mode 100644 sop-example/example-story/src/main/resources/application-test.properties rename sop-example/{sop-story => example-story}/src/main/resources/application.properties (100%) create mode 100644 sop-example/example-story/src/main/resources/download.txt create mode 100644 sop-example/example-story/src/main/resources/i18n/isp/bizerror_en.properties create mode 100644 sop-example/example-story/src/main/resources/i18n/isp/bizerror_zh_CN.properties create mode 100644 sop-example/example-story/src/main/resources/i18n/isp/goods_error_en.properties create mode 100644 sop-example/example-story/src/main/resources/i18n/isp/goods_error_zh_CN.properties create mode 100644 sop-support/sop-service-support/src/main/java/com/gitee/sop/support/service/dto/RegisterResult.java diff --git a/sop-gateway/checkstyle.xml b/checkstyle.xml similarity index 100% rename from sop-gateway/checkstyle.xml rename to checkstyle.xml diff --git a/pom.xml b/pom.xml index aae42024..dfbcde4c 100644 --- a/pom.xml +++ b/pom.xml @@ -14,10 +14,11 @@ 5.0.0-SNAPSHOT pom 一个开放平台解决方案项目,基于Spring Cloud实现,目标是能够让用户快速得搭建起自己的开放平台 + doc - sop-common + sop-example sop-admin @@ -31,13 +32,142 @@ - 1.8 - + 8 + 8 UTF-8 - 1.8 - 1.8 + + + 2.6.15 + + 2021.0.5 + + + 2021.0.5.0 + + 3.2.10 + + 4.11 + 2.5 + 1.3.3 + 3.2.2 + 3.8.1 + 1.11 + 1.2 + 2.0.1.Final + 6.0.13.Final + 3.0.12 + + + + + org.springframework.boot + spring-boot-dependencies + ${spring-boot.version} + pom + import + + + org.springframework.cloud + spring-cloud-dependencies + ${spring-cloud.version} + pom + import + + + com.alibaba.cloud + spring-cloud-alibaba-dependencies + ${spring-cloud-alibaba.version} + pom + import + + + org.apache.dubbo + dubbo-bom + ${dubbo.version} + pom + import + + + + io.gitee.durcframework + fastmybatis-spring-boot-starter + ${fastmybatis.version} + + + + com.squareup.okhttp3 + okhttp + 3.14.7 + + + + javax.validation + validation-api + ${validation-api.version} + + + org.hibernate + hibernate-validator + ${hibernate-validator.version} + + + com.auth0 + java-jwt + 3.2.0 + + + com.alibaba + transmittable-thread-local + 2.14.5 + + + + + org.apache.commons + commons-lang3 + ${commons-lang3.version} + + + commons-collections + commons-collections + ${commons-collection.version} + + + commons-io + commons-io + ${commons-io.version} + + + commons-codec + commons-codec + ${commons-codec.version} + + + commons-fileupload + commons-fileupload + ${commons-fileupload.version} + + + commons-logging + commons-logging + ${commons-logging.version} + + + + org.projectlombok + lombok + 1.18.34 + + + javax.servlet + javax.servlet-api + 3.1.0 + + + + aliyun @@ -67,6 +197,26 @@ UTF-8 + + org.apache.maven.plugins + maven-checkstyle-plugin + 3.3.1 + + checkstyle.xml + true + true + false + + + + validate + validate + + check + + + + diff --git a/sop-admin/pom.xml b/sop-admin/pom.xml index 933ef2d3..b98d40ee 100644 --- a/sop-admin/pom.xml +++ b/sop-admin/pom.xml @@ -4,9 +4,12 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - com.gitee.sop + + com.gitee.sop + sop-parent + 5.0.0-SNAPSHOT + sop-admin - 5.0.0-SNAPSHOT pom diff --git a/sop-admin/sop-admin-backend/pom.xml b/sop-admin/sop-admin-backend/pom.xml index 001ee56e..59b5cb2a 100644 --- a/sop-admin/sop-admin-backend/pom.xml +++ b/sop-admin/sop-admin-backend/pom.xml @@ -4,41 +4,18 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - org.springframework.boot - spring-boot-starter-parent - 2.6.15 - + com.gitee.sop + sop-admin + 5.0.0-SNAPSHOT - com.gitee.sop sop-admin-backend - 5.0.0-SNAPSHOT 8 8 UTF-8 - - 2.6.15 - - 2021.0.5 - - - 2021.0.5.0 - - 3.2.10 - - 4.11 - 2.5 - 1.3.3 - 3.2.2 - 3.8.1 - 1.11 - 1.2 - 2.0.1.Final - 6.0.13.Final - 3.0.12 @@ -150,110 +127,6 @@ - - - - - org.springframework.boot - spring-boot-dependencies - ${spring-boot.version} - pom - import - - - org.springframework.cloud - spring-cloud-dependencies - ${spring-cloud.version} - pom - import - - - com.alibaba.cloud - spring-cloud-alibaba-dependencies - ${spring-cloud-alibaba.version} - pom - import - - - org.apache.dubbo - dubbo-bom - ${dubbo.version} - pom - import - - - - io.gitee.durcframework - fastmybatis-spring-boot-starter - ${fastmybatis.version} - - - - com.squareup.okhttp3 - okhttp - 3.14.7 - - - - javax.validation - validation-api - ${validation-api.version} - - - org.hibernate - hibernate-validator - ${hibernate-validator.version} - - - - - org.apache.commons - commons-lang3 - ${commons-lang3.version} - - - commons-collections - commons-collections - ${commons-collection.version} - - - commons-io - commons-io - ${commons-io.version} - - - commons-codec - commons-codec - ${commons-codec.version} - - - commons-fileupload - commons-fileupload - ${commons-fileupload.version} - - - commons-logging - commons-logging - ${commons-logging.version} - - - com.auth0 - java-jwt - 3.2.0 - - - - org.projectlombok - lombok - 1.18.30 - - - javax.servlet - javax.servlet-api - 3.1.0 - - - @@ -288,6 +161,26 @@ UTF-8 + + org.apache.maven.plugins + maven-checkstyle-plugin + 3.3.1 + + checkstyle.xml + true + true + false + + + + validate + validate + + check + + + + diff --git a/sop-admin/sop-admin-backend/src/main/java/com/gitee/sop/adminbackend/common/RSATool.java b/sop-admin/sop-admin-backend/src/main/java/com/gitee/sop/adminbackend/common/RSATool.java index a366b96a..709d0673 100644 --- a/sop-admin/sop-admin-backend/src/main/java/com/gitee/sop/adminbackend/common/RSATool.java +++ b/sop-admin/sop-admin-backend/src/main/java/com/gitee/sop/adminbackend/common/RSATool.java @@ -23,10 +23,10 @@ import java.util.Objects; * @author 六如 */ public class RSATool { - public static String RSA_ALGORITHM = "RSA"; + private static final String RSA_ALGORITHM = "RSA"; - private KeyFormat keyFormat; - private KeyLength keyLength; + private final KeyFormat keyFormat; + private final KeyLength keyLength; public RSATool(KeyFormat keyFormat, KeyLength keyLength) { this.keyFormat = keyFormat; @@ -120,9 +120,9 @@ public class RSATool { Cipher cipher = Cipher.getInstance(keyFormat.getCipherAlgorithm()); cipher.init(Cipher.ENCRYPT_MODE, publicKey); // 模长 - int key_len = publicKey.getModulus().bitLength() / 8; + int keyLen = publicKey.getModulus().bitLength() / 8; // 加密数据长度 <= 模长-11 - String[] datas = splitString(data, key_len - 11); + String[] datas = splitString(data, keyLen - 11); String mi = ""; // 如果明文长度大于模长-11则要分组加密 for (String s : datas) { @@ -147,9 +147,9 @@ public class RSATool { Cipher cipher = Cipher.getInstance(keyFormat.getCipherAlgorithm()); cipher.init(Cipher.ENCRYPT_MODE, privateKey); // 模长 - int key_len = privateKey.getModulus().bitLength() / 8; + int keyLen = privateKey.getModulus().bitLength() / 8; // 加密数据长度 <= 模长-11 - String[] datas = splitString(data, key_len - 11); + String[] datas = splitString(data, keyLen - 11); String mi = ""; // 如果明文长度大于模长-11则要分组加密 for (String s : datas) { @@ -174,12 +174,12 @@ public class RSATool { Cipher cipher = Cipher.getInstance(keyFormat.getCipherAlgorithm()); cipher.init(Cipher.DECRYPT_MODE, privateKey); // 模长 - int key_len = privateKey.getModulus().bitLength() / 8; + int keyLen = privateKey.getModulus().bitLength() / 8; byte[] bytes = data.getBytes(); - byte[] bcd = ASCII_To_BCD(bytes, bytes.length); + byte[] bcd = asciiToBcd(bytes, bytes.length); // 如果密文长度大于模长则要分组解密 String ming = ""; - byte[][] arrays = splitArray(bcd, key_len); + byte[][] arrays = splitArray(bcd, keyLen); for (byte[] arr : arrays) { ming += new String(cipher.doFinal(arr)); } @@ -198,19 +198,19 @@ public class RSATool { Cipher cipher = Cipher.getInstance(keyFormat.getCipherAlgorithm()); cipher.init(Cipher.DECRYPT_MODE, rsaPublicKey); // 模长 - int key_len = rsaPublicKey.getModulus().bitLength() / 8; + int keyLen = rsaPublicKey.getModulus().bitLength() / 8; byte[] bytes = data.getBytes(); - byte[] bcd = ASCII_To_BCD(bytes, bytes.length); + byte[] bcd = asciiToBcd(bytes, bytes.length); // 如果密文长度大于模长则要分组解密 String ming = ""; - byte[][] arrays = splitArray(bcd, key_len); + byte[][] arrays = splitArray(bcd, keyLen); for (byte[] arr : arrays) { ming += new String(cipher.doFinal(arr)); } return ming; } - public static String convertPkcs8ToPkcs1(byte[] privateKeyData) throws Exception{ + public static String convertPkcs8ToPkcs1(byte[] privateKeyData) throws Exception { PrivateKeyInfo pkInfo = PrivateKeyInfo.getInstance(privateKeyData); ASN1Encodable encodable = pkInfo.parsePrivateKey(); ASN1Primitive primitive = encodable.toASN1Primitive(); @@ -222,17 +222,17 @@ public class RSATool { /** * ASCII码转BCD码 */ - public static byte[] ASCII_To_BCD(byte[] ascii, int asc_len) { + public static byte[] asciiToBcd(byte[] ascii, int asc_len) { byte[] bcd = new byte[asc_len / 2]; int j = 0; for (int i = 0; i < (asc_len + 1) / 2; i++) { - bcd[i] = asc_to_bcd(ascii[j++]); - bcd[i] = (byte) (((j >= asc_len) ? 0x00 : asc_to_bcd(ascii[j++]) & 0xff) + (bcd[i] << 4)); + bcd[i] = ascToBcd(ascii[j++]); + bcd[i] = (byte) (((j >= asc_len) ? 0x00 : ascToBcd(ascii[j++]) & 0xff) + (bcd[i] << 4)); } return bcd; } - public static byte asc_to_bcd(byte asc) { + public static byte ascToBcd(byte asc) { byte bcd; if ((asc >= '0') && (asc <= '9')) { @@ -380,47 +380,4 @@ public class RSATool { } - - /* ------------ Test ------------ - public static void main(String[] args) throws Exception { - - RSATool rsa_pkcs8_1024 = new RSATool(KeyFormat.PKCS8, KeyLength.LENGTH_1024); - RSATool rsa_pkcs8_2048 = new RSATool(KeyFormat.PKCS8, KeyLength.LENGTH_2048); - - doTest(rsa_pkcs8_1024); - doTest(rsa_pkcs8_2048); - - // PKCS在Java环境无法测试,可以生成一对,到非java平台测试,如C# - } - - private static void doTest(RSATool rsaTool) throws Exception { - System.out.println("秘钥格式:" + rsaTool.keyFormat.name() + ", 秘钥长度:" + rsaTool.keyLength.getLength()); - KeyStore keys = rsaTool.createKeys(); - String pubKey = keys.getPublicKey(); - System.out.println("pubKey:"); - System.out.println(pubKey); - String priKey = keys.getPrivateKey(); - System.out.println("priKey:"); - System.out.println(priKey); - System.out.println("--------"); - - String ming = "你好,abc123~!@="; - // 用公钥加密 - String mi = rsaTool.encryptByPublicKey(ming, rsaTool.getPublicKey(pubKey)); - System.out.println("mi : " + mi); - // 用私钥解密 - String ming2 = rsaTool.decryptByPrivateKey(mi, rsaTool.getPrivateKey(priKey)); - System.out.println("ming : " + ming2 + ", 结果:" + ming2.equals(ming)); - - // 用私钥加密 - String mi2 = rsaTool.encryptByPrivateKey(ming, rsaTool.getPrivateKey(priKey)); - - System.out.println("mi2 : " + mi2); - // 用公钥解密 - String ming3 = rsaTool.decryptByPublicKey(mi2, rsaTool.getPublicKey(pubKey)); - System.out.println("ming3 : " + ming3 + ", 结果:" + ming3.equals(ming)); - System.out.println("---------------------"); - } - */ - } diff --git a/sop-admin/sop-admin-backend/src/main/java/com/gitee/sop/adminbackend/common/enums/StatusEnum.java b/sop-admin/sop-admin-backend/src/main/java/com/gitee/sop/adminbackend/common/enums/StatusEnum.java index a6c64c24..ff7de476 100644 --- a/sop-admin/sop-admin-backend/src/main/java/com/gitee/sop/adminbackend/common/enums/StatusEnum.java +++ b/sop-admin/sop-admin-backend/src/main/java/com/gitee/sop/adminbackend/common/enums/StatusEnum.java @@ -9,10 +9,9 @@ import java.util.Objects; */ @Getter public enum StatusEnum { - DISABLED((byte)2), - ENABLE((byte)1), - SET_PWD((byte)3), - ; + DISABLED((byte) 2), + ENABLE((byte) 1), + SET_PWD((byte) 3); private final int status; diff --git a/sop-admin/sop-admin-backend/src/main/java/com/gitee/sop/adminbackend/common/exception/ErrorCode.java b/sop-admin/sop-admin-backend/src/main/java/com/gitee/sop/adminbackend/common/exception/ErrorCode.java index 88759d64..b6bd18a1 100644 --- a/sop-admin/sop-admin-backend/src/main/java/com/gitee/sop/adminbackend/common/exception/ErrorCode.java +++ b/sop-admin/sop-admin-backend/src/main/java/com/gitee/sop/adminbackend/common/exception/ErrorCode.java @@ -9,8 +9,7 @@ public enum ErrorCode { JWT_CREATE("1000", "create token error"), JWT_ERROR("1000", "invalid token"), JWT_EXPIRED("1000", "token expired"), - SET_PASSWORD("2000", "set password"), - ; + SET_PASSWORD("2000", "set password"); ErrorCode(String code, String msg) { this.code = code; diff --git a/sop-admin/sop-admin-backend/src/main/java/com/gitee/sop/adminbackend/common/resp/Result.java b/sop-admin/sop-admin-backend/src/main/java/com/gitee/sop/adminbackend/common/resp/Result.java index 58fb9169..9c4e75d1 100644 --- a/sop-admin/sop-admin-backend/src/main/java/com/gitee/sop/adminbackend/common/resp/Result.java +++ b/sop-admin/sop-admin-backend/src/main/java/com/gitee/sop/adminbackend/common/resp/Result.java @@ -5,6 +5,7 @@ import lombok.Data; import java.util.Objects; /** + * @param 数据 * @author thc */ @Data diff --git a/sop-admin/sop-admin-backend/src/main/java/com/gitee/sop/adminbackend/service/isv/PermIsvGroupService.java b/sop-admin/sop-admin-backend/src/main/java/com/gitee/sop/adminbackend/service/isv/PermIsvGroupService.java index 6af7ae8c..dfe1d1e5 100644 --- a/sop-admin/sop-admin-backend/src/main/java/com/gitee/sop/adminbackend/service/isv/PermIsvGroupService.java +++ b/sop-admin/sop-admin-backend/src/main/java/com/gitee/sop/adminbackend/service/isv/PermIsvGroupService.java @@ -3,11 +3,9 @@ package com.gitee.sop.adminbackend.service.isv; import com.gitee.fastmybatis.core.PageInfo; import com.gitee.fastmybatis.core.query.LambdaQuery; import com.gitee.fastmybatis.core.support.LambdaService; -import com.gitee.sop.adminbackend.common.SpringContext; import com.gitee.sop.adminbackend.dao.entity.PermIsvGroup; import com.gitee.sop.adminbackend.dao.mapper.PermIsvGroupMapper; import com.gitee.sop.adminbackend.service.isv.dto.IsvGroupSettingDTO; -import com.gitee.sop.adminbackend.service.isv.event.ChangeIsvPermEvent; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -15,7 +13,6 @@ import org.springframework.util.CollectionUtils; import java.util.ArrayList; import java.util.Collection; -import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; diff --git a/sop-admin/sop-admin-backend/src/main/java/com/gitee/sop/adminbackend/service/sys/login/LoginService.java b/sop-admin/sop-admin-backend/src/main/java/com/gitee/sop/adminbackend/service/sys/login/LoginService.java index bf8888f7..792a6d69 100644 --- a/sop-admin/sop-admin-backend/src/main/java/com/gitee/sop/adminbackend/service/sys/login/LoginService.java +++ b/sop-admin/sop-admin-backend/src/main/java/com/gitee/sop/adminbackend/service/sys/login/LoginService.java @@ -54,10 +54,9 @@ public class LoginService { case LDAP: // LDAP登录 throw new UnsupportedOperationException("LDAP登录登录暂未支持"); - default: { + default: // 默认注册账号登录 userInfo = this.doDatabaseLogin(username, password); - } } LoginUser loginUser = buildLoginUser(userInfo); // 保存到缓存 diff --git a/sop-admin/sop-admin-backend/src/main/java/com/gitee/sop/adminbackend/service/sys/login/enums/RegTypeEnum.java b/sop-admin/sop-admin-backend/src/main/java/com/gitee/sop/adminbackend/service/sys/login/enums/RegTypeEnum.java index d350d306..f4b39453 100644 --- a/sop-admin/sop-admin-backend/src/main/java/com/gitee/sop/adminbackend/service/sys/login/enums/RegTypeEnum.java +++ b/sop-admin/sop-admin-backend/src/main/java/com/gitee/sop/adminbackend/service/sys/login/enums/RegTypeEnum.java @@ -14,8 +14,7 @@ public enum RegTypeEnum { BACKEND("backend"), FORM("form"), OAUTH("oauth"), - LDAP("ldap"), - ; + LDAP("ldap"); public static RegTypeEnum of(String source) { for (RegTypeEnum value : RegTypeEnum.values()) { diff --git a/sop-admin/sop-admin-backend/src/main/java/com/gitee/sop/adminbackend/util/IdGen.java b/sop-admin/sop-admin-backend/src/main/java/com/gitee/sop/adminbackend/util/IdGen.java index c595505f..3425d6ee 100644 --- a/sop-admin/sop-admin-backend/src/main/java/com/gitee/sop/adminbackend/util/IdGen.java +++ b/sop-admin/sop-admin-backend/src/main/java/com/gitee/sop/adminbackend/util/IdGen.java @@ -3,169 +3,191 @@ package com.gitee.sop.adminbackend.util; import java.util.UUID; public class IdGen { - private static long workId = 0; - private static final SnowflakeIdWorker worker = new SnowflakeIdWorker(workId++, 0); + private static long workId = 0; + private static final SnowflakeIdWorker SNOWFLAKE_ID_WORKER = new SnowflakeIdWorker(workId++, 0); - public static long genId() { - return worker.nextId(); - } + public static long genId() { + return SNOWFLAKE_ID_WORKER.nextId(); + } - /** - * 生成唯一id - * @return - */ - public static String nextId() { - return String.valueOf(genId()); - } + /** + * 生成唯一id + * + * @return + */ + public static String nextId() { + return String.valueOf(genId()); + } - public static String uuid() { - return UUID.randomUUID().toString().replace("-", ""); - } + public static String uuid() { + return UUID.randomUUID().toString().replace("-", ""); + } - /** - * Twitter_Snowflake
- * SnowFlake的结构如下(每部分用-分开):
- * 0 - 0000000000 0000000000 0000000000 0000000000 0 - 00000 - 00000 - 000000000000
- * 1位标识,由于long基本类型在Java中是带符号的,最高位是符号位,正数是0,负数是1,所以id一般是正数,最高位是0
- * 41位时间截(毫秒级),注意,41位时间截不是存储当前时间的时间截,而是存储时间截的差值(当前时间截 - 开始时间截) - * 得到的值),这里的的开始时间截,一般是我们的id生成器开始使用的时间,由我们程序来指定的(如下下面程序IdWorker类的startTime属性)。41位的时间截,可以使用69年,年T = (1L << 41) / (1000L * 60 * 60 * 24 * 365) = 69
- * 10位的数据机器位,可以部署在1024个节点,包括5位datacenterId和5位workerId
- * 12位序列,毫秒内的计数,12位的计数顺序号支持每个节点每毫秒(同一机器,同一时间截)产生4096个ID序号
- * 加起来刚好64位,为一个Long型。
- * SnowFlake的优点是,整体上按照时间自增排序,并且整个分布式系统内不会产生ID碰撞(由数据中心ID和机器ID作区分),并且效率较高,经测试,SnowFlake每秒能够产生26万ID左右。 - */ - public static class SnowflakeIdWorker { + /** + * Twitter_Snowflake
+ * SnowFlake的结构如下(每部分用-分开):
+ * 0 - 0000000000 0000000000 0000000000 0000000000 0 - 00000 - 00000 - 000000000000
+ * 1位标识,由于long基本类型在Java中是带符号的,最高位是符号位,正数是0,负数是1,所以id一般是正数,最高位是0
+ * 41位时间截(毫秒级),注意,41位时间截不是存储当前时间的时间截,而是存储时间截的差值(当前时间截 - 开始时间截) + * 得到的值),这里的的开始时间截,一般是我们的id生成器开始使用的时间,由我们程序来指定的(如下下面程序IdWorker类的startTime属性)。41位的时间截,可以使用69年,年T = (1L << 41) / (1000L * 60 * 60 * 24 * 365) = 69
+ * 10位的数据机器位,可以部署在1024个节点,包括5位datacenterId和5位workerId
+ * 12位序列,毫秒内的计数,12位的计数顺序号支持每个节点每毫秒(同一机器,同一时间截)产生4096个ID序号
+ * 加起来刚好64位,为一个Long型。
+ * SnowFlake的优点是,整体上按照时间自增排序,并且整个分布式系统内不会产生ID碰撞(由数据中心ID和机器ID作区分),并且效率较高,经测试,SnowFlake每秒能够产生26万ID左右。 + */ + public static class SnowflakeIdWorker { - // ==============================Fields=========================================== - /** 开始时间截 (2015-01-01) */ - private final long twepoch = 1420041100000L; + // ==============================Fields=========================================== + /** + * 开始时间截 (2015-01-01) + */ + private final long twepoch = 1420041100000L; - /** 机器id所占的位数 */ - private final long workerIdBits = 5L; + /** + * 机器id所占的位数 + */ + private final long workerIdBits = 5L; - /** 数据标识id所占的位数 */ - private final long datacenterIdBits = 5L; + /** + * 数据标识id所占的位数 + */ + private final long datacenterIdBits = 5L; - /** 支持的最大机器id,结果是31 (这个移位算法可以很快的计算出几位二进制数所能表示的最大十进制数) */ - private final long maxWorkerId = -1L ^ (-1L << workerIdBits); + /** + * 支持的最大机器id,结果是31 (这个移位算法可以很快的计算出几位二进制数所能表示的最大十进制数) + */ + private final long maxWorkerId = -1L ^ (-1L << workerIdBits); - /** 支持的最大数据标识id,结果是31 */ - private final long maxDatacenterId = -1L ^ (-1L << datacenterIdBits); + /** + * 支持的最大数据标识id,结果是31 + */ + private final long maxDatacenterId = -1L ^ (-1L << datacenterIdBits); - /** 序列在id中占的位数 */ - private final long sequenceBits = 12L; + /** + * 序列在id中占的位数 + */ + private final long sequenceBits = 12L; - /** 机器ID向左移12位 */ - private final long workerIdShift = sequenceBits; + /** + * 机器ID向左移12位 + */ + private final long workerIdShift = sequenceBits; - /** 数据标识id向左移17位(12+5) */ - private final long datacenterIdShift = sequenceBits + workerIdBits; + /** + * 数据标识id向左移17位(12+5) + */ + private final long datacenterIdShift = sequenceBits + workerIdBits; - /** 时间截向左移22位(5+5+12) */ - private final long timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits; + /** + * 时间截向左移22位(5+5+12) + */ + private final long timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits; - /** 生成序列的掩码,这里为4095 (0b111111111111=0xfff=4095) */ - private final long sequenceMask = -1L ^ (-1L << sequenceBits); + /** + * 生成序列的掩码,这里为4095 (0b111111111111=0xfff=4095) + */ + private final long sequenceMask = -1L ^ (-1L << sequenceBits); - /** 工作机器ID(0~31) */ - private long workerId; + /** + * 工作机器ID(0~31) + */ + private long workerId; - /** 数据中心ID(0~31) */ - private long datacenterId; + /** + * 数据中心ID(0~31) + */ + private long datacenterId; - /** 毫秒内序列(0~4095) */ - private long sequence = 0L; + /** + * 毫秒内序列(0~4095) + */ + private long sequence = 0L; - /** 上次生成ID的时间截 */ - private long lastTimestamp = -1L; + /** + * 上次生成ID的时间截 + */ + private long lastTimestamp = -1L; - //==============================Constructors===================================== - /** - * 构造函数 - * @param workerId 工作ID (0~31) - * @param datacenterId 数据中心ID (0~31) - */ - public SnowflakeIdWorker(long workerId, long datacenterId) { - if (workerId > maxWorkerId || workerId < 0) { - throw new IllegalArgumentException(String.format("worker Id can't be greater than %d or less than 0", maxWorkerId)); - } - if (datacenterId > maxDatacenterId || datacenterId < 0) { - throw new IllegalArgumentException(String.format("datacenter Id can't be greater than %d or less than 0", maxDatacenterId)); - } - this.workerId = workerId; - this.datacenterId = datacenterId; - } + //==============================Constructors===================================== - // ==============================Methods========================================== - /** - * 获得下一个ID (该方法是线程安全的) - * @return SnowflakeId - */ - public synchronized long nextId() { - long timestamp = timeGen(); + /** + * 构造函数 + * + * @param workerId 工作ID (0~31) + * @param datacenterId 数据中心ID (0~31) + */ + public SnowflakeIdWorker(long workerId, long datacenterId) { + if (workerId > maxWorkerId || workerId < 0) { + throw new IllegalArgumentException(String.format("worker Id can't be greater than %d or less than 0", maxWorkerId)); + } + if (datacenterId > maxDatacenterId || datacenterId < 0) { + throw new IllegalArgumentException(String.format("datacenter Id can't be greater than %d or less than 0", maxDatacenterId)); + } + this.workerId = workerId; + this.datacenterId = datacenterId; + } - //如果当前时间小于上一次ID生成的时间戳,说明系统时钟回退过这个时候应当抛出异常 - if (timestamp < lastTimestamp) { - throw new RuntimeException( - String.format("Clock moved backwards. Refusing to generate id for %d milliseconds", lastTimestamp - timestamp)); - } + // ==============================Methods========================================== - //如果是同一时间生成的,则进行毫秒内序列 - if (lastTimestamp == timestamp) { - sequence = (sequence + 1) & sequenceMask; - //毫秒内序列溢出 - if (sequence == 0) { - //阻塞到下一个毫秒,获得新的时间戳 - timestamp = tilNextMillis(lastTimestamp); - } - } - //时间戳改变,毫秒内序列重置 - else { - sequence = 0L; - } + /** + * 获得下一个ID (该方法是线程安全的) + * + * @return SnowflakeId + */ + public synchronized long nextId() { + long timestamp = timeGen(); - //上次生成ID的时间截 - lastTimestamp = timestamp; + //如果当前时间小于上一次ID生成的时间戳,说明系统时钟回退过这个时候应当抛出异常 + if (timestamp < lastTimestamp) { + throw new RuntimeException( + String.format("Clock moved backwards. Refusing to generate id for %d milliseconds", lastTimestamp - timestamp)); + } - //移位并通过或运算拼到一起组成64位的ID - return ((timestamp - twepoch) << timestampLeftShift) - | (datacenterId << datacenterIdShift) - | (workerId << workerIdShift) - | sequence; - } + //如果是同一时间生成的,则进行毫秒内序列 + if (lastTimestamp == timestamp) { + sequence = (sequence + 1) & sequenceMask; + //毫秒内序列溢出 + if (sequence == 0) { + //阻塞到下一个毫秒,获得新的时间戳 + timestamp = tilNextMillis(lastTimestamp); + } + } else { + //时间戳改变,毫秒内序列重置 + sequence = 0L; + } - /** - * 阻塞到下一个毫秒,直到获得新的时间戳 - * @param lastTimestamp 上次生成ID的时间截 - * @return 当前时间戳 - */ - protected long tilNextMillis(long lastTimestamp) { - long timestamp = timeGen(); - while (timestamp <= lastTimestamp) { - timestamp = timeGen(); - } - return timestamp; - } + //上次生成ID的时间截 + lastTimestamp = timestamp; - /** - * 返回以毫秒为单位的当前时间 - * @return 当前时间(毫秒) - */ - protected long timeGen() { - return System.currentTimeMillis(); - } + //移位并通过或运算拼到一起组成64位的ID + return ((timestamp - twepoch) << timestampLeftShift) + | (datacenterId << datacenterIdShift) + | (workerId << workerIdShift) + | sequence; + } - } - /*//==============================Test============================================= - */ - /** 测试 - public static void main(String[] args) { - SnowflakeIdWorker idWorker = new SnowflakeIdWorker(0, 0); - for (int i = 0; i < 100; i++) { - long id = idWorker.nextId(); - System.out.println("id:" + id); - System.out.println("toBinaryString:" + Long.toBinaryString(id)); - } - } - */ + /** + * 阻塞到下一个毫秒,直到获得新的时间戳 + * + * @param lastTimestamp 上次生成ID的时间截 + * @return 当前时间戳 + */ + protected long tilNextMillis(long lastTimestamp) { + long timestamp = timeGen(); + while (timestamp <= lastTimestamp) { + timestamp = timeGen(); + } + return timestamp; + } + + /** + * 返回以毫秒为单位的当前时间 + * + * @return 当前时间(毫秒) + */ + protected long timeGen() { + return System.currentTimeMillis(); + } + + } } diff --git a/sop-admin/sop-admin-backend/src/main/java/com/gitee/sop/adminbackend/util/JwtUtil.java b/sop-admin/sop-admin-backend/src/main/java/com/gitee/sop/adminbackend/util/JwtUtil.java index 4b7b53cb..3edc2011 100644 --- a/sop-admin/sop-admin-backend/src/main/java/com/gitee/sop/adminbackend/util/JwtUtil.java +++ b/sop-admin/sop-admin-backend/src/main/java/com/gitee/sop/adminbackend/util/JwtUtil.java @@ -26,7 +26,7 @@ import java.util.Set; @Slf4j public class JwtUtil { - private static final Map headerClaims = new HashMap<>(); + private static final Map HEADER_CLAIMS = new HashMap<>(); /** * 登录成功后跳转页面 @@ -39,12 +39,12 @@ public class JwtUtil { )); static { - headerClaims.put("typ", "JWT"); - headerClaims.put("alg", "HS256"); + HEADER_CLAIMS.put("typ", "JWT"); + HEADER_CLAIMS.put("alg", "HS256"); } public static String createJwt(Map data, int timeoutDays, String secret) { - JWTCreator.Builder builder = JWT.create().withHeader(headerClaims); + JWTCreator.Builder builder = JWT.create().withHeader(HEADER_CLAIMS); Set> entrySet = data.entrySet(); for (Map.Entry entry : entrySet) { builder.withClaim(entry.getKey(), entry.getValue()); diff --git a/sop-admin/sop-admin-backend/src/main/java/com/gitee/sop/adminbackend/util/PasswordUtil.java b/sop-admin/sop-admin-backend/src/main/java/com/gitee/sop/adminbackend/util/PasswordUtil.java index 5ebb47f8..c8716405 100644 --- a/sop-admin/sop-admin-backend/src/main/java/com/gitee/sop/adminbackend/util/PasswordUtil.java +++ b/sop-admin/sop-admin-backend/src/main/java/com/gitee/sop/adminbackend/util/PasswordUtil.java @@ -25,13 +25,9 @@ public class PasswordUtil { return list; } - public static void main(String[] args) { - String password = getRandomPassword(32); - System.out.println(password); - } - /** * 随机密码生成,仅字母数字 + * * @param len 密码长度,必须大于等于4 */ public static String getRandomSimplePassword(int len) { @@ -48,6 +44,7 @@ public class PasswordUtil { /** * 随机密码生成 + * * @param len 密码长度,必须大于等于6 */ public static String getRandomPassword(int len) { diff --git a/sop-example/sop-story/.gitignore b/sop-example/example-payment/.gitignore similarity index 100% rename from sop-example/sop-story/.gitignore rename to sop-example/example-payment/.gitignore diff --git a/sop-example/example-payment/pom.xml b/sop-example/example-payment/pom.xml new file mode 100644 index 00000000..4dbcba7e --- /dev/null +++ b/sop-example/example-payment/pom.xml @@ -0,0 +1,129 @@ + + + + 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 2.6.15 + + + + com.gitee.sop + example-payment + 5.0.0-SNAPSHOT + example-payment + + + 1.8 + + 3.2.10 + + + + + com.gitee.sop + sop-spring-boot-starter + 5.0.0-SNAPSHOT + + + + org.springframework.boot + spring-boot-starter-web + + + + org.apache.dubbo + dubbo-spring-boot-starter + + + + + org.apache.dubbo + dubbo-nacos-spring-boot-starter + + + + org.apache.commons + commons-lang3 + + + + org.springframework.boot + spring-boot-starter-validation + + + + org.springframework.boot + spring-boot-starter-test + test + + + + + org.apache.dubbo + dubbo-dependencies-zookeeper-curator5 + ${dubbo.version} + pom + provided + + + + io.swagger + swagger-annotations + 1.6.14 + + + + org.projectlombok + lombok + 1.18.34 + provided + + + + + + + org.apache.dubbo + dubbo-bom + ${dubbo.version} + pom + import + + + + + + + + + org.apache.maven.plugins + maven-surefire-plugin + 2.12.4 + + true + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + + + spring-milestones + Spring Milestones + https://repo.spring.io/milestone + + + maven_central + Maven Central + https://repo.maven.apache.org/maven2/ + + + + diff --git a/sop-example/example-payment/src/main/java/com/gitee/sop/payment/ExamplePaymentApplication.java b/sop-example/example-payment/src/main/java/com/gitee/sop/payment/ExamplePaymentApplication.java new file mode 100644 index 00000000..d7835100 --- /dev/null +++ b/sop-example/example-payment/src/main/java/com/gitee/sop/payment/ExamplePaymentApplication.java @@ -0,0 +1,16 @@ +package com.gitee.sop.payment; + +import org.apache.dubbo.config.spring.context.annotation.EnableDubbo; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +@EnableDubbo +public class ExamplePaymentApplication { + + public static void main(String[] args) { + SpringApplication.run(ExamplePaymentApplication.class, args); + } + +} + diff --git a/sop-example/example-payment/src/main/java/com/gitee/sop/payment/open/OpenPayment.java b/sop-example/example-payment/src/main/java/com/gitee/sop/payment/open/OpenPayment.java new file mode 100644 index 00000000..232bb9b6 --- /dev/null +++ b/sop-example/example-payment/src/main/java/com/gitee/sop/payment/open/OpenPayment.java @@ -0,0 +1,25 @@ +package com.gitee.sop.payment.open; + +import com.gitee.sop.payment.open.req.AlipayTradeWapPayRequest; +import com.gitee.sop.payment.open.resp.AlipayTradeWapPayResponse; +import com.gitee.sop.support.annotation.Open; +import io.swagger.annotations.ApiOperation; + +/** + * 支付接口 + * + * @author 六如 + */ +public interface OpenPayment { + + @ApiOperation( + value = "alipay.trade.wap.pay(手机网站支付接口2.0)", + notes = "该接口是页面跳转接口,用于生成用户访问支付宝的跳转链接。" + + "请在服务端执行支付宝SDK中pageExecute方法,读取响应中的body()结果。" + + "该结果用于跳转到支付宝页面,返回到用户浏览器渲染或重定向跳转到支付宝页面。" + + "具体使用方法请参考 接入指南" + ) + @Open(value = "alipay.trade.wap.pay", version = "2.0") + AlipayTradeWapPayResponse tradeWapPay(AlipayTradeWapPayRequest request); + +} diff --git a/sop-example/example-payment/src/main/java/com/gitee/sop/payment/open/impl/OpenPaymentImpl.java b/sop-example/example-payment/src/main/java/com/gitee/sop/payment/open/impl/OpenPaymentImpl.java new file mode 100644 index 00000000..eb59c0cc --- /dev/null +++ b/sop-example/example-payment/src/main/java/com/gitee/sop/payment/open/impl/OpenPaymentImpl.java @@ -0,0 +1,25 @@ +package com.gitee.sop.payment.open.impl; + +import com.gitee.sop.payment.open.OpenPayment; +import com.gitee.sop.payment.open.req.AlipayTradeWapPayRequest; +import com.gitee.sop.payment.open.resp.AlipayTradeWapPayResponse; +import org.apache.dubbo.config.annotation.DubboService; + +import java.util.UUID; + + +/** + * 开放接口实现 + * + * @author 六如 + */ +@DubboService(validation = "true") +public class OpenPaymentImpl implements OpenPayment { + + @Override + public AlipayTradeWapPayResponse tradeWapPay(AlipayTradeWapPayRequest request) { + AlipayTradeWapPayResponse alipayTradeWapPayResponse = new AlipayTradeWapPayResponse(); + alipayTradeWapPayResponse.setPageRedirectionData(UUID.randomUUID().toString()); + return alipayTradeWapPayResponse; + } +} diff --git a/sop-example/example-payment/src/main/java/com/gitee/sop/payment/open/req/AlipayTradeWapPayRequest.java b/sop-example/example-payment/src/main/java/com/gitee/sop/payment/open/req/AlipayTradeWapPayRequest.java new file mode 100644 index 00000000..d9995550 --- /dev/null +++ b/sop-example/example-payment/src/main/java/com/gitee/sop/payment/open/req/AlipayTradeWapPayRequest.java @@ -0,0 +1,177 @@ +package com.gitee.sop.payment.open.req; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; +import org.hibernate.validator.constraints.Length; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import java.math.BigDecimal; +import java.util.List; + +/** + * alipay.trade.wap.pay(手机网站支付接口2.0) + * + * @author 六如 + * https://opendocs.alipay.com/open/29ae8cb6_alipay.trade.wap.pay?pathHash=1ef587fd&ref=api&scene=21 + */ +@Data +public class AlipayTradeWapPayRequest { + + + @ApiModelProperty(value = "商户网站唯一订单号", required = true, example = "70501111111S001111119") + @Length(max = 64) + @NotBlank + private String out_trade_no; + + @ApiModelProperty(value = "订单总金额.单位为元,精确到小数点后两位,取值范围:[0.01,100000000] ", + required = true, example = "9.00") + @NotNull + private BigDecimal total_amount; + + + @ApiModelProperty( + value = "订单标题。注意:不可使用特殊字符,如 /,=,& 等。", + required = true, + example = "大乐透" + ) + @Length(max = 256) + @NotBlank + private String subject; + + @ApiModelProperty( + value = "销售产品码,商家和支付宝签约的产品码。手机网站支付为:QUICK_WAP_WAY", + required = true, + example = "QUICK_WAP_WAY" + ) + @NotBlank + @Length(max = 64) + private String product_code; + + + @ApiModelProperty( + value = "针对用户授权接口,获取用户相关数据时,用于标识用户授权关系", + example = "appopenBb64d181d0146481ab6a762c00714cC27" + ) + @Length(max = 40) + private String auth_token; + + @ApiModelProperty( + value = "用户付款中途退出返回商户网站的地址", + example = "http://www.taobao.com/product/113714.html" + ) + @Length(max = 400) + private String quit_url; + + @ApiModelProperty( + value = "订单包含的商品列表信息,json格式,其它说明详见商品明细说明" + ) + private List goods_detail; + + @ApiModelProperty( + value = "绝对超时时间,格式为yyyy-MM-dd HH:mm:ss。超时时间范围:1m~15d。", + example = "2016-12-31 10:05:00" + ) + @Length(max = 32) + private String time_expire; + + @ApiModelProperty( + value = "商户传入业务信息,具体值要和支付宝约定,应用于安全,营销等参数直传场景,格式为json格式", + example = "{\"mc_create_trade_ip\":\"127.0.0.1\"}" + ) + @Length(max = 512) + private String business_params; + + + @ApiModelProperty( + value = "公用回传参数,如果请求时传递了该参数,则返回给商户时会回传该参数。支付宝只会在同步返回(包括跳转回商户网站)和异步通知时将该参数原样返回。本参数必须进行UrlEncode之后才可以发送给支付宝。", + example = "merchantBizType%3d3C%26merchantBizNo%3d2016010101111" + ) + @Length(max = 512) + private String passback_params; + + @ApiModelProperty( + value = "商户原始订单号,最大长度限制32位", + example = "{\"mc_create_trade_ip\":\"127.0.0.1\"}" + ) + @Length(max = 32) + private String merchant_order_no; + + // --- + + @Data + public static class GoodsDetail { + @ApiModelProperty( + value = "商品的编号", + required = true, + example = "apple-01" + ) + @NotBlank + @Length(max = 64) + private String goods_id; + + + @ApiModelProperty( + value = "商品名称", + required = true, + example = "ipad" + ) + @NotBlank + @Length(max = 256) + private String goods_name; + + @ApiModelProperty( + value = "商品数量", + required = true, + example = "1" + ) + @NotNull + private Integer quantity; + + @ApiModelProperty( + value = "商品单价,单位为元", + required = true, + example = "2000" + ) + @NotNull + private BigDecimal price; + + @ApiModelProperty( + value = "支付宝定义的统一商品编号", + example = "20010001" + ) + @Length(max = 32) + private String alipay_goods_id; + + @ApiModelProperty( + value = "商品类目", + example = "34543238" + ) + @Length(max = 24) + private String goods_category; + + @ApiModelProperty( + value = "商品类目树,从商品类目根节点到叶子节点的类目id组成,类目id值使用|分割", + example = "124868003|126232002|126252004" + ) + @Length(max = 128) + private String categories_tree; + + @ApiModelProperty( + value = "商品描述信息", + example = "特价手机" + ) + @Length(max = 1000) + private String body; + + @ApiModelProperty( + value = "商品的展示地址", + example = "http://www.alipay.com/xxx.jpg" + ) + @Length(max = 400) + private String show_url; + + + } + +} diff --git a/sop-example/example-payment/src/main/java/com/gitee/sop/payment/open/resp/AlipayTradeWapPayResponse.java b/sop-example/example-payment/src/main/java/com/gitee/sop/payment/open/resp/AlipayTradeWapPayResponse.java new file mode 100644 index 00000000..4c7564a5 --- /dev/null +++ b/sop-example/example-payment/src/main/java/com/gitee/sop/payment/open/resp/AlipayTradeWapPayResponse.java @@ -0,0 +1,19 @@ +package com.gitee.sop.payment.open.resp; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Data; + +/** + * @author 六如 + */ +@Data +public class AlipayTradeWapPayResponse { + + @ApiModelProperty( + value = "用于跳转支付宝页面的信息,POST和GET方法生成内容不同:使用POST方法执行,结果为html form表单,在浏览器渲染即可;使用GET方法会得到支付宝URL,需要打开或重定向到该URL。建议使用POST方式。具体使用方法请参考", + required = true, + example = "请参考响应示例" + ) + private String pageRedirectionData; + +} diff --git a/sop-example/sop-story/src/main/resources/application-dev.properties b/sop-example/example-payment/src/main/resources/application-dev.properties similarity index 100% rename from sop-example/sop-story/src/main/resources/application-dev.properties rename to sop-example/example-payment/src/main/resources/application-dev.properties diff --git a/sop-example/sop-story/src/main/resources/application-test.properties b/sop-example/example-payment/src/main/resources/application-test.properties similarity index 100% rename from sop-example/sop-story/src/main/resources/application-test.properties rename to sop-example/example-payment/src/main/resources/application-test.properties diff --git a/sop-example/example-payment/src/main/resources/application.properties b/sop-example/example-payment/src/main/resources/application.properties new file mode 100644 index 00000000..a98bc57c --- /dev/null +++ b/sop-example/example-payment/src/main/resources/application.properties @@ -0,0 +1,9 @@ +spring.profiles.active=dev + +server.port=7072 +spring.application.name=example-payment + +dubbo.protocol.name=dubbo +dubbo.protocol.port=-1 +dubbo.application.qos-enable=false +dubbo.registry.address=zookeeper://localhost:2181 diff --git a/sop-example/sop-story/src/main/resources/download.txt b/sop-example/example-payment/src/main/resources/download.txt similarity index 100% rename from sop-example/sop-story/src/main/resources/download.txt rename to sop-example/example-payment/src/main/resources/download.txt diff --git a/sop-example/sop-story/src/main/resources/i18n/isp/bizerror_en.properties b/sop-example/example-payment/src/main/resources/i18n/isp/bizerror_en.properties similarity index 100% rename from sop-example/sop-story/src/main/resources/i18n/isp/bizerror_en.properties rename to sop-example/example-payment/src/main/resources/i18n/isp/bizerror_en.properties diff --git a/sop-example/sop-story/src/main/resources/i18n/isp/bizerror_zh_CN.properties b/sop-example/example-payment/src/main/resources/i18n/isp/bizerror_zh_CN.properties similarity index 100% rename from sop-example/sop-story/src/main/resources/i18n/isp/bizerror_zh_CN.properties rename to sop-example/example-payment/src/main/resources/i18n/isp/bizerror_zh_CN.properties diff --git a/sop-example/sop-story/src/main/resources/i18n/isp/goods_error_en.properties b/sop-example/example-payment/src/main/resources/i18n/isp/goods_error_en.properties similarity index 100% rename from sop-example/sop-story/src/main/resources/i18n/isp/goods_error_en.properties rename to sop-example/example-payment/src/main/resources/i18n/isp/goods_error_en.properties diff --git a/sop-example/sop-story/src/main/resources/i18n/isp/goods_error_zh_CN.properties b/sop-example/example-payment/src/main/resources/i18n/isp/goods_error_zh_CN.properties similarity index 100% rename from sop-example/sop-story/src/main/resources/i18n/isp/goods_error_zh_CN.properties rename to sop-example/example-payment/src/main/resources/i18n/isp/goods_error_zh_CN.properties diff --git a/sop-example/example-story/.gitignore b/sop-example/example-story/.gitignore new file mode 100644 index 00000000..18ccf36e --- /dev/null +++ b/sop-example/example-story/.gitignore @@ -0,0 +1,25 @@ +target/ +!.mvn/wrapper/maven-wrapper.jar + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr + +### NetBeans ### +nbproject/private/ +build/ +nbbuild/ +dist/ +nbdist/ +.nb-gradle/ +/local-config/ diff --git a/sop-example/sop-story/pom.xml b/sop-example/example-story/pom.xml similarity index 98% rename from sop-example/sop-story/pom.xml rename to sop-example/example-story/pom.xml index 4ace5b3a..c237aea3 100644 --- a/sop-example/sop-story/pom.xml +++ b/sop-example/example-story/pom.xml @@ -11,9 +11,9 @@ com.gitee.sop - sop-story + example-story 5.0.0-SNAPSHOT - sop-story + example-story 1.8 diff --git a/sop-example/sop-story/src/main/java/com/gitee/sop/storyweb/SopStoryApplication.java b/sop-example/example-story/src/main/java/com/gitee/sop/storyweb/ExampleStoryApplication.java similarity index 74% rename from sop-example/sop-story/src/main/java/com/gitee/sop/storyweb/SopStoryApplication.java rename to sop-example/example-story/src/main/java/com/gitee/sop/storyweb/ExampleStoryApplication.java index e78bbf68..af37857f 100644 --- a/sop-example/sop-story/src/main/java/com/gitee/sop/storyweb/SopStoryApplication.java +++ b/sop-example/example-story/src/main/java/com/gitee/sop/storyweb/ExampleStoryApplication.java @@ -6,10 +6,10 @@ import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication @EnableDubbo -public class SopStoryApplication { +public class ExampleStoryApplication { public static void main(String[] args) { - SpringApplication.run(SopStoryApplication.class, args); + SpringApplication.run(ExampleStoryApplication.class, args); } } diff --git a/sop-example/sop-story/src/main/java/com/gitee/sop/storyweb/open/OpenStory.java b/sop-example/example-story/src/main/java/com/gitee/sop/storyweb/open/OpenStory.java similarity index 100% rename from sop-example/sop-story/src/main/java/com/gitee/sop/storyweb/open/OpenStory.java rename to sop-example/example-story/src/main/java/com/gitee/sop/storyweb/open/OpenStory.java diff --git a/sop-example/sop-story/src/main/java/com/gitee/sop/storyweb/open/impl/OpenStoryImpl.java b/sop-example/example-story/src/main/java/com/gitee/sop/storyweb/open/impl/OpenStoryImpl.java similarity index 100% rename from sop-example/sop-story/src/main/java/com/gitee/sop/storyweb/open/impl/OpenStoryImpl.java rename to sop-example/example-story/src/main/java/com/gitee/sop/storyweb/open/impl/OpenStoryImpl.java diff --git a/sop-example/sop-story/src/main/java/com/gitee/sop/storyweb/open/req/StorySaveDTO.java b/sop-example/example-story/src/main/java/com/gitee/sop/storyweb/open/req/StorySaveDTO.java similarity index 100% rename from sop-example/sop-story/src/main/java/com/gitee/sop/storyweb/open/req/StorySaveDTO.java rename to sop-example/example-story/src/main/java/com/gitee/sop/storyweb/open/req/StorySaveDTO.java diff --git a/sop-example/sop-story/src/main/java/com/gitee/sop/storyweb/open/resp/StoryResponse.java b/sop-example/example-story/src/main/java/com/gitee/sop/storyweb/open/resp/StoryResponse.java similarity index 100% rename from sop-example/sop-story/src/main/java/com/gitee/sop/storyweb/open/resp/StoryResponse.java rename to sop-example/example-story/src/main/java/com/gitee/sop/storyweb/open/resp/StoryResponse.java diff --git a/sop-example/example-story/src/main/resources/application-dev.properties b/sop-example/example-story/src/main/resources/application-dev.properties new file mode 100644 index 00000000..bfead63f --- /dev/null +++ b/sop-example/example-story/src/main/resources/application-dev.properties @@ -0,0 +1 @@ +dubbo.registry.address=zookeeper://localhost:2181 diff --git a/sop-example/example-story/src/main/resources/application-test.properties b/sop-example/example-story/src/main/resources/application-test.properties new file mode 100644 index 00000000..53e5d0bc --- /dev/null +++ b/sop-example/example-story/src/main/resources/application-test.properties @@ -0,0 +1,2 @@ + +dubbo.registry.address=nacos://localhost:8848 diff --git a/sop-example/sop-story/src/main/resources/application.properties b/sop-example/example-story/src/main/resources/application.properties similarity index 100% rename from sop-example/sop-story/src/main/resources/application.properties rename to sop-example/example-story/src/main/resources/application.properties diff --git a/sop-example/example-story/src/main/resources/download.txt b/sop-example/example-story/src/main/resources/download.txt new file mode 100644 index 00000000..8c2fce43 --- /dev/null +++ b/sop-example/example-story/src/main/resources/download.txt @@ -0,0 +1 @@ +abc,你好~!@# diff --git a/sop-example/example-story/src/main/resources/i18n/isp/bizerror_en.properties b/sop-example/example-story/src/main/resources/i18n/isp/bizerror_en.properties new file mode 100644 index 00000000..48d134c8 --- /dev/null +++ b/sop-example/example-story/src/main/resources/i18n/isp/bizerror_en.properties @@ -0,0 +1,10 @@ +# 错误配置 + +# 系统配置 +isp.error_isv.common-error=The system is busy. +isp.error_isv.invalid-parameter=Invalid parameter, {0} + +# ==== 参数配置 ==== + +goods.remark.notNull=The goods_remark can not be null +goods.comment.length=The goods_comment length must >= {0} and <= {1} \ No newline at end of file diff --git a/sop-example/example-story/src/main/resources/i18n/isp/bizerror_zh_CN.properties b/sop-example/example-story/src/main/resources/i18n/isp/bizerror_zh_CN.properties new file mode 100644 index 00000000..4ac48428 --- /dev/null +++ b/sop-example/example-story/src/main/resources/i18n/isp/bizerror_zh_CN.properties @@ -0,0 +1,14 @@ +# 错误配置 + +# 系统繁忙 +isp.error_isv.common-error=\u7cfb\u7edf\u7e41\u5fd9 +# 参数无效 +isp.error_isv.invalid-parameter=\u53c2\u6570\u65e0\u6548, {0} + +# ==== 参数配置 ==== + +# 商品备注不能为空 +goods.remark.notNull=\u5546\u54c1\u5907\u6ce8\u4e0d\u80fd\u4e3a\u7a7a +# 商品评论长度必须在{0}和{1}之间 +goods.comment.length=\u5546\u54c1\u8bc4\u8bba\u957f\u5ea6\u5fc5\u987b\u5728{0}\u548c{1}\u4e4b\u95f4 + diff --git a/sop-example/example-story/src/main/resources/i18n/isp/goods_error_en.properties b/sop-example/example-story/src/main/resources/i18n/isp/goods_error_en.properties new file mode 100644 index 00000000..195c7d2b --- /dev/null +++ b/sop-example/example-story/src/main/resources/i18n/isp/goods_error_en.properties @@ -0,0 +1,2 @@ +isp.goods_error_100=the goods_name can NOT be null +isp.goods_error_101=the goods_name must bigger than {0} \ No newline at end of file diff --git a/sop-example/example-story/src/main/resources/i18n/isp/goods_error_zh_CN.properties b/sop-example/example-story/src/main/resources/i18n/isp/goods_error_zh_CN.properties new file mode 100644 index 00000000..af1a43bc --- /dev/null +++ b/sop-example/example-story/src/main/resources/i18n/isp/goods_error_zh_CN.properties @@ -0,0 +1,5 @@ +# 商品名字不能为空 +isp.goods_error_100=\u5546\u54C1\u540D\u79F0\u4E0D\u80FD\u4E3A\u7A7A + +# 商品名称太短,不能小于{0}个字 +isp.goods_error_101=\u5546\u54C1\u540D\u79F0\u592A\u77ED\uFF0C\u4E0D\u80FD\u5C0F\u4E8E{0}\u4E2A\u5B57 \ No newline at end of file diff --git a/sop-example/pom.xml b/sop-example/pom.xml index d7122533..3423bddb 100644 --- a/sop-example/pom.xml +++ b/sop-example/pom.xml @@ -3,13 +3,14 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> - com.gitee.sop 4.0.0 + com.gitee.sop sop-example 5.0.0-SNAPSHOT pom - sop-story + example-story + example-payment diff --git a/sop-gateway/pom.xml b/sop-gateway/pom.xml index 6158d29c..c82583e0 100644 --- a/sop-gateway/pom.xml +++ b/sop-gateway/pom.xml @@ -4,41 +4,17 @@ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 - org.springframework.boot - spring-boot-starter-parent - 2.6.15 - + com.gitee.sop + sop-parent + 5.0.0-SNAPSHOT - com.gitee.sop sop-gateway - 5.0.0-SNAPSHOT 8 8 UTF-8 - - - 2.6.15 - - 2021.0.5 - - - 2021.0.5.0 - - 3.2.10 - - 4.11 - 2.5 - 1.3.3 - 3.2.2 - 3.8.1 - 1.11 - 1.2 - 2.0.1.Final - 6.0.13.Final - 3.0.12 @@ -139,106 +115,6 @@ - - - - - org.springframework.boot - spring-boot-dependencies - ${spring-boot.version} - pom - import - - - org.springframework.cloud - spring-cloud-dependencies - ${spring-cloud.version} - pom - import - - - com.alibaba.cloud - spring-cloud-alibaba-dependencies - ${spring-cloud-alibaba.version} - pom - import - - - org.apache.dubbo - dubbo-bom - ${dubbo.version} - pom - import - - - - io.gitee.durcframework - fastmybatis-spring-boot-starter - ${fastmybatis.version} - - - - com.squareup.okhttp3 - okhttp - 3.14.7 - - - - javax.validation - validation-api - ${validation-api.version} - - - org.hibernate - hibernate-validator - ${hibernate-validator.version} - - - - - org.apache.commons - commons-lang3 - ${commons-lang3.version} - - - commons-collections - commons-collections - ${commons-collection.version} - - - commons-io - commons-io - ${commons-io.version} - - - commons-codec - commons-codec - ${commons-codec.version} - - - commons-fileupload - commons-fileupload - ${commons-fileupload.version} - - - commons-logging - commons-logging - ${commons-logging.version} - - - - org.projectlombok - lombok - 1.18.34 - - - javax.servlet - javax.servlet-api - 3.1.0 - - - - aliyun diff --git a/sop-gateway/src/main/java/com/gitee/sop/gateway/response/ApiResponse.java b/sop-gateway/src/main/java/com/gitee/sop/gateway/response/ApiResponse.java index ddcf29ba..80fc7f28 100644 --- a/sop-gateway/src/main/java/com/gitee/sop/gateway/response/ApiResponse.java +++ b/sop-gateway/src/main/java/com/gitee/sop/gateway/response/ApiResponse.java @@ -72,12 +72,12 @@ public class ApiResponse { /** * 业务异常码 */ - private String sub_code = ""; + private String subCode = ""; /** * 业务异常信息 */ - private String sub_msg = ""; + private String subMsg = ""; /** * 返回对象 @@ -98,8 +98,8 @@ public class ApiResponse { IError error = e.getError(); apiResponse.setCode(error.getCode()); apiResponse.setMsg(error.getMsg()); - apiResponse.setSub_code(error.getSubCode()); - apiResponse.setSub_msg(error.getSubMsg()); + apiResponse.setSubCode(error.getSubCode()); + apiResponse.setSubMsg(error.getSubMsg()); return apiResponse; } @@ -109,8 +109,8 @@ public class ApiResponse { IError error = errorMeta.getError(locale); apiResponse.setCode(error.getCode()); apiResponse.setMsg(error.getMsg()); - apiResponse.setSub_code(error.getSubCode()); - apiResponse.setSub_msg(subMsg); + apiResponse.setSubCode(error.getSubCode()); + apiResponse.setSubMsg(subMsg); return apiResponse; } @@ -120,8 +120,8 @@ public class ApiResponse { IError error = errorMeta.getError(locale); apiResponse.setCode(error.getCode()); apiResponse.setMsg(error.getMsg()); - apiResponse.setSub_code(error.getSubCode()); - apiResponse.setSub_msg(error.getSubMsg()); + apiResponse.setSubCode(error.getSubCode()); + apiResponse.setSubMsg(error.getSubMsg()); return apiResponse; } diff --git a/sop-gateway/src/main/java/com/gitee/sop/gateway/service/dubbo/ApiRegisterServiceImpl.java b/sop-gateway/src/main/java/com/gitee/sop/gateway/service/dubbo/ApiRegisterServiceImpl.java index 845e9244..d619d663 100644 --- a/sop-gateway/src/main/java/com/gitee/sop/gateway/service/dubbo/ApiRegisterServiceImpl.java +++ b/sop-gateway/src/main/java/com/gitee/sop/gateway/service/dubbo/ApiRegisterServiceImpl.java @@ -8,11 +8,13 @@ import com.gitee.sop.gateway.service.manager.ApiManager; import com.gitee.sop.gateway.util.CopyUtil; import com.gitee.sop.support.service.ApiRegisterService; import com.gitee.sop.support.service.dto.RegisterDTO; +import com.gitee.sop.support.service.dto.RegisterResult; import lombok.extern.slf4j.Slf4j; import org.apache.dubbo.config.annotation.DubboService; - import org.springframework.beans.factory.annotation.Autowired; +import java.util.Objects; + /** * @author 六如 */ @@ -23,26 +25,44 @@ public class ApiRegisterServiceImpl implements ApiRegisterService { private static final int REG_SOURCE_SYS = 1; @Autowired - private ApiManager apiCacheManager; + private ApiManager apiManager; @Autowired private ApiInfoMapper apiInfoMapper; @Override - public void register(RegisterDTO registerDTO) { + public RegisterResult register(RegisterDTO registerDTO) { log.info("收到接口注册, registerDTO={}", registerDTO); - ApiInfoDTO apiInfoDTO = CopyUtil.copyBean(registerDTO, ApiInfoDTO::new); - apiInfoDTO.setStatus(StatusEnum.ENABLE.getValue()); - ApiInfo apiInfo = apiInfoMapper.getByNameVersion(apiInfoDTO.getApiName(), apiInfoDTO.getApiVersion()); - if (apiInfo == null) { - apiInfo = new ApiInfo(); + try { + ApiInfoDTO apiInfoDTO = CopyUtil.copyBean(registerDTO, ApiInfoDTO::new); + apiInfoDTO.setStatus(StatusEnum.ENABLE.getValue()); + + ApiInfo apiInfo = apiInfoMapper.getByNameVersion(apiInfoDTO.getApiName(), apiInfoDTO.getApiVersion()); + + if (apiInfo == null) { + apiInfo = new ApiInfo(); + } else { + check(apiInfo, registerDTO); + } + CopyUtil.copyPropertiesIgnoreNull(apiInfoDTO, apiInfo); + apiInfo.setRegSource(REG_SOURCE_SYS); + // 保存到数据库 + apiInfoMapper.saveOrUpdate(apiInfo); + apiInfoDTO.setId(apiInfo.getId()); + // 保存到缓存 + apiManager.save(apiInfoDTO); + return RegisterResult.success(); + } catch (Exception e) { + log.error("接口注册失败, registerDTO={}", registerDTO, e); + return RegisterResult.error(e.getMessage()); } - CopyUtil.copyPropertiesIgnoreNull(apiInfoDTO, apiInfo); - apiInfo.setRegSource(REG_SOURCE_SYS); - // 保存到数据库 - apiInfoMapper.saveOrUpdate(apiInfo); - // 保存到缓存 - apiCacheManager.save(apiInfoDTO); } + + private void check(ApiInfo apiInfo, RegisterDTO registerDTO) { + if (!Objects.equals(apiInfo.getApplication(), registerDTO.getApplication())) { + throw new RuntimeException("接口[" + registerDTO + "]已存在于[" + apiInfo.getApplication() + "]应用中.必须保证接口全局唯一"); + } + } + } diff --git a/sop-gateway/src/main/java/com/gitee/sop/gateway/service/interceptor/internal/ResultRouteInterceptor.java b/sop-gateway/src/main/java/com/gitee/sop/gateway/service/interceptor/internal/ResultRouteInterceptor.java index 4029b752..dc77ffbe 100644 --- a/sop-gateway/src/main/java/com/gitee/sop/gateway/service/interceptor/internal/ResultRouteInterceptor.java +++ b/sop-gateway/src/main/java/com/gitee/sop/gateway/service/interceptor/internal/ResultRouteInterceptor.java @@ -32,7 +32,7 @@ public class ResultRouteInterceptor implements RouteInterceptor { } if (result instanceof Map) { - Map map = (Map) result; + Map map = (Map) result; Object className = map.get(CLASS); // 处理文件下载 if (Objects.equals(className, FileData.class.getName()) || Objects.equals(className, CommonFileData.class.getName())) { diff --git a/sop-gateway/src/main/java/com/gitee/sop/gateway/service/validate/ApiValidator.java b/sop-gateway/src/main/java/com/gitee/sop/gateway/service/validate/ApiValidator.java index 862310e5..ccf75a46 100644 --- a/sop-gateway/src/main/java/com/gitee/sop/gateway/service/validate/ApiValidator.java +++ b/sop-gateway/src/main/java/com/gitee/sop/gateway/service/validate/ApiValidator.java @@ -62,7 +62,7 @@ public class ApiValidator implements Validator { private ApiConfig apiConfig; @Autowired - private ApiManager apiCacheManager; + private ApiManager apiManager; @Autowired private IpBlacklistManager ipBlacklistManager; @@ -94,7 +94,7 @@ public class ApiValidator implements Validator { checkIP(apiRequestContext); ApiRequest apiRequest = apiRequestContext.getApiRequest(); - ApiInfoDTO apiInfo = apiCacheManager.get(apiRequest.getMethod(), apiRequest.getVersion()); + ApiInfoDTO apiInfo = apiManager.get(apiRequest.getMethod(), apiRequest.getVersion()); // 检查接口信息 checkApiInfo(apiRequestContext, apiInfo, isvDTO); diff --git a/sop-sdk/pom.xml b/sop-sdk/pom.xml index 9e16d90c..30a380d3 100644 --- a/sop-sdk/pom.xml +++ b/sop-sdk/pom.xml @@ -3,15 +3,10 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> - - com.gitee.sop - sop-parent - 5.0.0-SNAPSHOT - ../pom.xml - - 4.0.0 + com.gitee.sop sop-sdk + 5.0.0-SNAPSHOT pom diff --git a/sop-support/sop-service-support/src/main/java/com/gitee/sop/support/register/ApiRegister.java b/sop-support/sop-service-support/src/main/java/com/gitee/sop/support/register/ApiRegister.java index a3b4de3d..b72f5c52 100644 --- a/sop-support/sop-service-support/src/main/java/com/gitee/sop/support/register/ApiRegister.java +++ b/sop-support/sop-service-support/src/main/java/com/gitee/sop/support/register/ApiRegister.java @@ -4,6 +4,7 @@ import com.alibaba.fastjson2.JSON; import com.gitee.sop.support.annotation.Open; import com.gitee.sop.support.service.ApiRegisterService; import com.gitee.sop.support.service.dto.RegisterDTO; +import com.gitee.sop.support.service.dto.RegisterResult; import lombok.Data; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -109,10 +110,9 @@ public class ApiRegister { registerDTO.setIsPermission(parseBoolean(open.permission())); registerDTO.setIsNeedToken(parseBoolean(open.needToken())); LOG.info("注册开放接口, apiInfo=" + registerDTO); - try { - apiRegisterService.register(registerDTO); - } catch (Exception e) { - LOG.error("接口注册失败, registerDTO=" + registerDTO + ", method=" + method, e); + RegisterResult result = apiRegisterService.register(registerDTO); + if (!result.getSuccess()) { + throw new RuntimeException(result.getMsg()); } } diff --git a/sop-support/sop-service-support/src/main/java/com/gitee/sop/support/service/ApiRegisterService.java b/sop-support/sop-service-support/src/main/java/com/gitee/sop/support/service/ApiRegisterService.java index ef50f34c..eaeb680a 100644 --- a/sop-support/sop-service-support/src/main/java/com/gitee/sop/support/service/ApiRegisterService.java +++ b/sop-support/sop-service-support/src/main/java/com/gitee/sop/support/service/ApiRegisterService.java @@ -1,6 +1,7 @@ package com.gitee.sop.support.service; import com.gitee.sop.support.service.dto.RegisterDTO; +import com.gitee.sop.support.service.dto.RegisterResult; /** * @author 六如 @@ -11,5 +12,5 @@ public interface ApiRegisterService { * * @param registerDTO 接口信息 */ - void register(RegisterDTO registerDTO); + RegisterResult register(RegisterDTO registerDTO); } diff --git a/sop-support/sop-service-support/src/main/java/com/gitee/sop/support/service/dto/RegisterResult.java b/sop-support/sop-service-support/src/main/java/com/gitee/sop/support/service/dto/RegisterResult.java new file mode 100644 index 00000000..13229ed4 --- /dev/null +++ b/sop-support/sop-service-support/src/main/java/com/gitee/sop/support/service/dto/RegisterResult.java @@ -0,0 +1,31 @@ +package com.gitee.sop.support.service.dto; + +import java.io.Serializable; +import lombok.Data; + + +/** + * @author 六如 + */ +@Data +public class RegisterResult implements Serializable { + private static final long serialVersionUID = 4605838522659698419L; + + private Boolean success; + + private String msg; + + public static RegisterResult success() { + RegisterResult registerResult = new RegisterResult(); + registerResult.setSuccess(true); + return registerResult; + } + + public static RegisterResult error(String msg) { + RegisterResult registerResult = new RegisterResult(); + registerResult.setSuccess(false); + registerResult.setMsg(msg); + return registerResult; + } + +} diff --git a/sop-test/pom.xml b/sop-test/pom.xml index 425b0a79..b2e41676 100644 --- a/sop-test/pom.xml +++ b/sop-test/pom.xml @@ -3,8 +3,12 @@ - com.gitee.sop 4.0.0 + + com.gitee.sop + sop-parent + 5.0.0-SNAPSHOT + sop-test 5.0.0-SNAPSHOT @@ -50,4 +54,52 @@ + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.3 + + ${java.version} + ${java.version} + + -parameters + + + + + org.apache.maven.plugins + maven-surefire-plugin + 3.0.0 + + true + + + + org.apache.maven.plugins + maven-source-plugin + 3.2.1 + + + attach-sources + + jar-no-fork + + + + + + org.apache.maven.plugins + maven-resources-plugin + 3.3.1 + + UTF-8 + + + + + + diff --git a/sop-test/src/test/java/com/gitee/sop/test/AlipayClientPostTest.java b/sop-test/src/test/java/com/gitee/sop/test/AlipayClientPostTest.java index 3316bfdc..2b28dce8 100644 --- a/sop-test/src/test/java/com/gitee/sop/test/AlipayClientPostTest.java +++ b/sop-test/src/test/java/com/gitee/sop/test/AlipayClientPostTest.java @@ -39,16 +39,19 @@ public class AlipayClientPostTest extends TestBase { // 公共请求参数 Map params = new HashMap(); params.put("app_id", appId); - params.put("method", "story.get"); + params.put("method", "alipay.trade.wap.pay"); params.put("format", "json"); params.put("charset", "utf-8"); params.put("sign_type", "RSA2"); params.put("timestamp", new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); - params.put("version", "1.0"); + params.put("version", "2.0"); // 业务参数 Map bizContent = new HashMap<>(); - bizContent.put("id", "1"); + bizContent.put("out_trade_no", "70501111111S001111119"); + bizContent.put("total_amount", "9.00"); + bizContent.put("subject", "衣服"); + bizContent.put("product_code", "QUICK_WAP_WAY"); params.put("biz_content", JSON.toJSONString(bizContent)); String content = AlipaySignature.getSignContent(params); diff --git a/sop-test/src/test/java/com/gitee/sop/test/AllInOneTest.java b/sop-test/src/test/java/com/gitee/sop/test/AllInOneTest.java index 7bf1d590..014e57bc 100644 --- a/sop-test/src/test/java/com/gitee/sop/test/AllInOneTest.java +++ b/sop-test/src/test/java/com/gitee/sop/test/AllInOneTest.java @@ -96,7 +96,7 @@ public class AllInOneTest extends TestBase { System.out.println(responseData); String node = requestInfo.getDataNode(); JSONObject jsonObject = JSON.parseObject(responseData).getJSONObject(node); - Assert.assertEquals("isv.route-no-permissions", jsonObject.getString("sub_code")); + Assert.assertEquals("isv.route-no-permissions", jsonObject.getString("subCode")); }); //client.execute(requestBuilder); @@ -182,7 +182,7 @@ public class AllInOneTest extends TestBase { .callback((requestInfo, responseData) -> { System.out.println(responseData); JSONObject jsonObject = JSON.parseObject(responseData); - Assert.assertEquals(jsonObject.getString("sub_code"), "isv.invalid-file-size"); + Assert.assertEquals(jsonObject.getString("subCode"), "isv.invalid-file-size"); }) ; @@ -204,7 +204,7 @@ public class AllInOneTest extends TestBase { .callback((requestInfo, responseData) -> { System.out.println(responseData); JSONObject jsonObject = JSON.parseObject(responseData); - Assert.assertEquals(jsonObject.getString("sub_code"), "isv.invalid-file-size"); + Assert.assertEquals(jsonObject.getString("subCode"), "isv.invalid-file-size"); }) ; @@ -282,7 +282,7 @@ public class AllInOneTest extends TestBase { .callback((requestInfo, responseData) -> { System.out.println(responseData); JSONObject jsonObject = JSON.parseObject(responseData); - Assert.assertEquals("Nonexistent method name", jsonObject.getString("sub_msg")); + Assert.assertEquals("Nonexistent method name", jsonObject.getString("subMsg")); }); client.execute(requestBuilder);