From bb2a9eb3140aa02a93953ef241fdb4d32deb30bd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=85=AD=E5=A6=82?= <8775@163.com> Date: Sat, 21 Dec 2024 20:16:00 +0800 Subject: [PATCH] 5.0 --- .../config/SopAdminConfiguration.java | 17 +- .../src/main/resources/application.properties | 4 + .../sop-admin-backend/backend-common/pom.xml | 5 + .../common/context/UserContext.java | 4 +- .../sop/adminbackend/common/dto/UserDTO.java | 31 + .../sop/adminbackend/common/enums/IEnum.java | 1 + .../sop/adminbackend/common/resp/UserVO.java | 19 + .../common/support/ServiceSupport.java | 54 ++ .../sop/adminbackend/common/user/User.java | 11 + .../adminbackend/common/util/DateUtil.java | 4 +- .../sop/adminbackend/common/util/RSATool.java | 8 + .../sop/adminbackend/common/RSAToolTest.java | 19 + .../service/doc/DocAppService.java | 9 +- .../service/doc/DocContentService.java | 4 +- .../service/doc/DocInfoService.java | 12 +- .../service/doc/DocInfoSyncService.java | 13 +- .../service/doc/dto/DocAppDTO.java | 4 +- .../service/doc/dto/DocInfoTreeDTO.java | 13 +- .../service/isv/IsvInfoService.java | 22 +- .../service/isv/IsvKeysService.java | 6 +- .../isv/PermGroupPermissionService.java | 4 +- .../service/isv/PermGroupService.java | 4 +- .../service/isv/PermIsvGroupService.java | 4 +- .../service/isv/dto/IsvInfoDTO.java | 12 + .../convert/annotation/UserFormat.java | 31 + .../convert/serde/UserFormatSerializer.java | 43 ++ .../service/jackson/package-info.java | 1 + .../service/serve/ApiInfoService.java | 8 +- .../service/sys/SysConfigService.java | 2 +- .../service/sys/SysDeptService.java | 5 +- .../service/sys/SysResourceService.java | 4 +- .../service/sys/SysRoleResourceService.java | 4 +- .../service/sys/SysRoleService.java | 4 +- .../service/sys/SysUserDeptService.java | 4 +- .../service/sys/SysUserRoleService.java | 4 +- .../service/sys/SysUserService.java | 35 +- .../service/sys/UpgradeService.java | 2 +- .../service/sys/UserCacheService.java | 14 + .../service/sys/dto/MenuTreeDTO.java | 1 - .../service/sys/dto/SysUserDTO.java | 17 +- .../service/sys/dto/UserPermissionDTO.java | 3 +- .../sys/impl/LocalUserCacheService.java | 56 ++ .../login/impl/DefaultUserCacheManager.java | 6 +- .../controller/doc/DocController.java | 7 +- .../controller/doc/vo/DocInfoTreeVO.java | 3 + .../controller/isv/IsvInfoController.java | 12 +- .../isv/PermGroupPermissionController.java | 2 +- .../isv/PermIsvGroupController.java | 2 +- .../controller/isv/vo/IsvInfoVO.java | 56 ++ .../controller/serve/ApiInfoController.java | 8 +- .../controller/serve/vo/ApiInfoVO.java | 107 +++ .../controller/sys/LoginController.java | 2 +- .../controller/sys/param/SysRoleParam.java | 2 - .../controller/sys/param/SysUserAddParam.java | 3 +- .../controller/sys/vo/LoginResultVO.java | 1 - .../controller/sys/vo/SysUserVO.java | 2 - .../src/views/admin/user/index.ts | 306 --------- .../src/views/admin/user/index.vue | 63 -- .../src/views/doc/list/index.ts | 19 +- .../src/views/doc/list/index.vue | 1 + .../src/views/doc/setting/index.ts | 96 +-- .../src/views/doc/setting/index.vue | 3 +- .../src/views/isv/list/index.ts | 547 ++++++++-------- .../src/views/isv/list/index.vue | 6 +- .../src/views/isv/list/isvGroup.ts | 4 +- .../src/views/isv/list/isvKeys.ts | 4 +- .../src/views/isv/perm/permGroup.ts | 294 +++++---- .../src/views/isv/perm/permGroup.vue | 5 +- .../src/views/isv/perm/permGroupApi.vue | 1 + .../src/views/permission/button/index.vue | 99 --- .../src/views/permission/button/perms.vue | 109 ---- .../src/views/permission/page/index.vue | 66 -- .../src/views/serve/api/index.ts | 28 +- .../src/views/serve/api/index.vue | 1 + .../src/views/system/dept/utils/hook.tsx | 8 +- .../src/views/system/role/utils/hook.tsx | 8 +- .../src/views/system/user/utils/hook.tsx | 8 +- .../src/main/resources/doc.json | 2 +- .../gitee/sop/storyweb/open/OpenStory.java | 12 + .../example-story/src/main/resources/doc.json | 27 + .../com/gitee/sop/storyweb/DocPushTest.java | 14 + .../gitee/sop/gateway/dao/entity/ApiInfo.java | 5 +- .../gitee/sop/gateway/dao/entity/IsvKeys.java | 5 +- .../dao/entity/PermGroupPermission.java | 5 +- .../sop/gateway/dao/entity/PermIsvGroup.java | 5 +- .../ControllerGlobalExceptionHandler.java | 2 +- .../internal/ResultRouteInterceptor.java | 2 +- .../service/dubbo/RefreshServiceImpl.java | 2 +- .../service/impl/ResultWrapperImpl.java | 2 - .../service/impl/RouteServiceImpl.java | 1 - .../sop/gateway/service/impl/SerdeImpl.java | 10 +- .../LocalIsvApiPermissionManagerImpl.java | 2 +- .../manager/impl/LocalIsvManagerImpl.java | 2 +- .../manager/impl/LocalSecretManagerImpl.java | 2 +- .../manager/impl/RedisApiManagerImpl.java | 2 +- .../RedisIsvApiPermissionManagerImpl.java | 2 +- .../manager/impl/RedisIsvManagerImpl.java | 2 +- .../manager/impl/RedisSecretManager.java | 2 +- .../service/validate/AbstractSigner.java | 4 +- .../service/validate/ApiValidator.java | 2 +- .../gitee/sop/registry/EmbeddedZooKeeper.java | 6 +- .../com/gitee/sop/registry/RegistryMain.java | 7 +- sop-sdk/sdk-csharp/SDKCSharp/Program.cs | 6 +- sop-test/pom.xml | 12 +- .../main/java/com/gitee/sop/test/Client.java | 8 +- .../sop/test/alipay/AlipaySignature.java | 611 ------------------ .../gitee/sop/test/alipay/StringUtils.java | 171 ----- .../{alipay => sign}/AlipayApiException.java | 6 +- .../{alipay => sign}/AlipayConstants.java | 4 +- .../gitee/sop/test/sign/AlipaySignature.java | 335 ++++++++++ .../sop/test/{alipay => sign}/StreamUtil.java | 4 +- .../com/gitee/sop/test/sign/StringUtils.java | 168 +++++ .../com/gitee/sop/test/taobao/Constants.java | 10 - .../sop/test/taobao/TaobaoSignature.java | 95 --- .../gitee/sop/test/AlipayClientPostTest.java | 2 +- sop.sql | 348 +++++++++- 116 files changed, 2124 insertions(+), 2194 deletions(-) create mode 100644 sop-admin/sop-admin-backend/backend-common/src/main/java/com/gitee/sop/adminbackend/common/dto/UserDTO.java create mode 100644 sop-admin/sop-admin-backend/backend-common/src/main/java/com/gitee/sop/adminbackend/common/resp/UserVO.java create mode 100644 sop-admin/sop-admin-backend/backend-common/src/main/java/com/gitee/sop/adminbackend/common/support/ServiceSupport.java create mode 100644 sop-admin/sop-admin-backend/backend-common/src/test/java/com/gitee/sop/adminbackend/common/RSAToolTest.java create mode 100644 sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/jackson/convert/annotation/UserFormat.java create mode 100644 sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/jackson/convert/serde/UserFormatSerializer.java create mode 100644 sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/jackson/package-info.java create mode 100644 sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/sys/UserCacheService.java create mode 100644 sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/sys/impl/LocalUserCacheService.java create mode 100644 sop-admin/sop-admin-backend/backend-web/src/main/java/com/gitee/sop/adminbackend/controller/isv/vo/IsvInfoVO.java create mode 100644 sop-admin/sop-admin-backend/backend-web/src/main/java/com/gitee/sop/adminbackend/controller/serve/vo/ApiInfoVO.java delete mode 100644 sop-admin/sop-admin-frontend/src/views/admin/user/index.ts delete mode 100644 sop-admin/sop-admin-frontend/src/views/admin/user/index.vue delete mode 100644 sop-admin/sop-admin-frontend/src/views/permission/button/index.vue delete mode 100644 sop-admin/sop-admin-frontend/src/views/permission/button/perms.vue delete mode 100644 sop-admin/sop-admin-frontend/src/views/permission/page/index.vue create mode 100644 sop-example/example-story/src/main/resources/doc.json create mode 100644 sop-example/example-story/src/test/java/com/gitee/sop/storyweb/DocPushTest.java delete mode 100644 sop-test/src/main/java/com/gitee/sop/test/alipay/AlipaySignature.java delete mode 100644 sop-test/src/main/java/com/gitee/sop/test/alipay/StringUtils.java rename sop-test/src/main/java/com/gitee/sop/test/{alipay => sign}/AlipayApiException.java (95%) rename sop-test/src/main/java/com/gitee/sop/test/{alipay => sign}/AlipayConstants.java (98%) create mode 100644 sop-test/src/main/java/com/gitee/sop/test/sign/AlipaySignature.java rename sop-test/src/main/java/com/gitee/sop/test/{alipay => sign}/StreamUtil.java (98%) create mode 100644 sop-test/src/main/java/com/gitee/sop/test/sign/StringUtils.java delete mode 100644 sop-test/src/main/java/com/gitee/sop/test/taobao/Constants.java delete mode 100644 sop-test/src/main/java/com/gitee/sop/test/taobao/TaobaoSignature.java diff --git a/sop-admin/sop-admin-backend/backend-boot/src/main/java/com/gitee/sop/adminbackend/config/SopAdminConfiguration.java b/sop-admin/sop-admin-backend/backend-boot/src/main/java/com/gitee/sop/adminbackend/config/SopAdminConfiguration.java index f97be572..ed92f4ae 100644 --- a/sop-admin/sop-admin-backend/backend-boot/src/main/java/com/gitee/sop/adminbackend/config/SopAdminConfiguration.java +++ b/sop-admin/sop-admin-backend/backend-boot/src/main/java/com/gitee/sop/adminbackend/config/SopAdminConfiguration.java @@ -3,9 +3,12 @@ package com.gitee.sop.adminbackend.config; import com.gitee.sop.adminbackend.common.context.SpringContext; import com.gitee.sop.adminbackend.common.util.SystemUtil; import com.gitee.sop.adminbackend.interceptor.LoginInterceptor; +import com.gitee.sop.adminbackend.service.sys.UserCacheService; +import com.gitee.sop.adminbackend.service.sys.impl.LocalUserCacheService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.BeansException; import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; import org.springframework.context.annotation.Bean; @@ -33,6 +36,12 @@ public class SopAdminConfiguration implements ApplicationContextAware, WebMvcCon SpringContext.setApplicationContext(applicationContext); } + @Bean + @ConditionalOnProperty(value = "user.cache.type", havingValue = "local", matchIfMissing = true) + public UserCacheService userCacheService() { + return new LocalUserCacheService(); + } + /** * 配置拦截器 * @@ -84,10 +93,10 @@ public class SopAdminConfiguration implements ApplicationContextAware, WebMvcCon frontRoot = homeDir + "/dist"; } log.info("前端资源目录:{}", frontRoot); - String frontLocation = "file:" + frontRoot; - registry.addResourceHandler("/index.html").addResourceLocations(frontLocation + "/index.html"); - registry.addResourceHandler("/favicon.ico").addResourceLocations(frontLocation + "/favicon.ico"); - registry.addResourceHandler("/static/**").addResourceLocations(frontLocation + "/static/"); + String location = "file:" + frontRoot; + registry.addResourceHandler("/index.html").addResourceLocations(location + "/index.html"); + registry.addResourceHandler("/favicon.ico").addResourceLocations(location + "/favicon.ico"); + registry.addResourceHandler("/static/**").addResourceLocations(location + "/static/"); } } diff --git a/sop-admin/sop-admin-backend/backend-boot/src/main/resources/application.properties b/sop-admin/sop-admin-backend/backend-boot/src/main/resources/application.properties index 68a66b39..1835f3a1 100644 --- a/sop-admin/sop-admin-backend/backend-boot/src/main/resources/application.properties +++ b/sop-admin/sop-admin-backend/backend-boot/src/main/resources/application.properties @@ -3,6 +3,10 @@ spring.profiles.active=dev spring.application.name=sop-admin-backend +####### admin config ####### +# user cache +user.cache.type=local + dubbo.protocol.name=dubbo dubbo.protocol.port=-1 dubbo.application.qos-enable=false diff --git a/sop-admin/sop-admin-backend/backend-common/pom.xml b/sop-admin/sop-admin-backend/backend-common/pom.xml index 785f35ca..242d72c4 100644 --- a/sop-admin/sop-admin-backend/backend-common/pom.xml +++ b/sop-admin/sop-admin-backend/backend-common/pom.xml @@ -88,6 +88,11 @@ lombok true + + junit + junit + test + diff --git a/sop-admin/sop-admin-backend/backend-common/src/main/java/com/gitee/sop/adminbackend/common/context/UserContext.java b/sop-admin/sop-admin-backend/backend-common/src/main/java/com/gitee/sop/adminbackend/common/context/UserContext.java index 4ba3c4c5..816d4d6e 100644 --- a/sop-admin/sop-admin-backend/backend-common/src/main/java/com/gitee/sop/adminbackend/common/context/UserContext.java +++ b/sop-admin/sop-admin-backend/backend-common/src/main/java/com/gitee/sop/adminbackend/common/context/UserContext.java @@ -43,10 +43,10 @@ public class UserContext { /** * 获取当前登录用户id - * @return 返回id,没有返回-1 + * @return 返回id,没有返回null */ public static Long getUserId() { - return Optional.ofNullable(getUser()).map(User::getUserId).orElse(-1L); + return Optional.ofNullable(getUser()).map(User::getUserId).orElse(null); } /** diff --git a/sop-admin/sop-admin-backend/backend-common/src/main/java/com/gitee/sop/adminbackend/common/dto/UserDTO.java b/sop-admin/sop-admin-backend/backend-common/src/main/java/com/gitee/sop/adminbackend/common/dto/UserDTO.java new file mode 100644 index 00000000..c849cb12 --- /dev/null +++ b/sop-admin/sop-admin-backend/backend-common/src/main/java/com/gitee/sop/adminbackend/common/dto/UserDTO.java @@ -0,0 +1,31 @@ +package com.gitee.sop.adminbackend.common.dto; + +import lombok.Data; + +/** + * @author 六如 + */ +@Data +public class UserDTO { + + /** + * 创建人id + */ + private Long addBy; + + /** + * 添加人姓名 + */ + private String addByName; + + /** + * 修改人id + */ + private Long updateBy; + + /** + * 修改人姓名 + */ + private String updateByName; + +} diff --git a/sop-admin/sop-admin-backend/backend-common/src/main/java/com/gitee/sop/adminbackend/common/enums/IEnum.java b/sop-admin/sop-admin-backend/backend-common/src/main/java/com/gitee/sop/adminbackend/common/enums/IEnum.java index b5a5e184..15afcbb5 100644 --- a/sop-admin/sop-admin-backend/backend-common/src/main/java/com/gitee/sop/adminbackend/common/enums/IEnum.java +++ b/sop-admin/sop-admin-backend/backend-common/src/main/java/com/gitee/sop/adminbackend/common/enums/IEnum.java @@ -4,6 +4,7 @@ import java.io.Serializable; /** * @author 六如 + * @param 参数类型 */ public interface IEnum { diff --git a/sop-admin/sop-admin-backend/backend-common/src/main/java/com/gitee/sop/adminbackend/common/resp/UserVO.java b/sop-admin/sop-admin-backend/backend-common/src/main/java/com/gitee/sop/adminbackend/common/resp/UserVO.java new file mode 100644 index 00000000..a049c1bc --- /dev/null +++ b/sop-admin/sop-admin-backend/backend-common/src/main/java/com/gitee/sop/adminbackend/common/resp/UserVO.java @@ -0,0 +1,19 @@ +package com.gitee.sop.adminbackend.common.resp; + +import lombok.Data; + +/** + * @author 六如 + */ +@Data +public class UserVO { + + private Long id; + + private String username; + + private String nickname; + + private String showName; + +} diff --git a/sop-admin/sop-admin-backend/backend-common/src/main/java/com/gitee/sop/adminbackend/common/support/ServiceSupport.java b/sop-admin/sop-admin-backend/backend-common/src/main/java/com/gitee/sop/adminbackend/common/support/ServiceSupport.java new file mode 100644 index 00000000..e87af50f --- /dev/null +++ b/sop-admin/sop-admin-backend/backend-common/src/main/java/com/gitee/sop/adminbackend/common/support/ServiceSupport.java @@ -0,0 +1,54 @@ +package com.gitee.sop.adminbackend.common.support; + +import com.gitee.fastmybatis.core.mapper.BaseMapper; +import com.gitee.fastmybatis.core.query.LambdaQuery; +import com.gitee.fastmybatis.core.support.LambdaService; +import com.gitee.sop.adminbackend.common.context.UserContext; +import com.gitee.sop.adminbackend.common.util.DateUtil; + +import java.time.LocalDateTime; + +/** + * @param 实体类 + * @param Mapper + * @author 六如 + */ +public interface ServiceSupport> extends LambdaService { + + @Override + default LambdaQuery query() { + return new MyLambdaQuery<>(this.getEntityClass()); + } + + class MyLambdaQuery extends LambdaQuery { + private static final long serialVersionUID = 5232128649485429495L; + + private static final String UPDATE_BY_FORMAT = "update_by = %s"; + private static final String UPDATE_TIME_FORMAT = "update_time = '%s'"; + + public MyLambdaQuery(Class entityClass) { + super(entityClass); + } + + @Override + public int update() { + this.appendUpdate(); + return super.update(); + } + + @Override + public int delete() { + this.appendUpdate(); + return super.delete(); + } + + private void appendUpdate() { + Long userId = UserContext.getUserId(); + if (userId != null) { + this.setExpression(String.format(UPDATE_BY_FORMAT, userId)); + } + this.setExpression(String.format(UPDATE_TIME_FORMAT, DateUtil.formatYmdhms(LocalDateTime.now()))); + } + + } +} diff --git a/sop-admin/sop-admin-backend/backend-common/src/main/java/com/gitee/sop/adminbackend/common/user/User.java b/sop-admin/sop-admin-backend/backend-common/src/main/java/com/gitee/sop/adminbackend/common/user/User.java index 137074fb..97ab1ee6 100644 --- a/sop-admin/sop-admin-backend/backend-common/src/main/java/com/gitee/sop/adminbackend/common/user/User.java +++ b/sop-admin/sop-admin-backend/backend-common/src/main/java/com/gitee/sop/adminbackend/common/user/User.java @@ -12,6 +12,12 @@ public interface User { */ Long getUserId(); + /** + * 返回username + * @return + */ + String getUsername(); + /** * 昵称 * @return @@ -21,4 +27,9 @@ public interface User { Integer getStatus(); String getToken(); + + default String getShowName() { + String nickname = getNickname(); + return nickname != null && !nickname.isEmpty() ? nickname : getUsername(); + } } diff --git a/sop-admin/sop-admin-backend/backend-common/src/main/java/com/gitee/sop/adminbackend/common/util/DateUtil.java b/sop-admin/sop-admin-backend/backend-common/src/main/java/com/gitee/sop/adminbackend/common/util/DateUtil.java index f8e4927f..b0a0590f 100644 --- a/sop-admin/sop-admin-backend/backend-common/src/main/java/com/gitee/sop/adminbackend/common/util/DateUtil.java +++ b/sop-admin/sop-admin-backend/backend-common/src/main/java/com/gitee/sop/adminbackend/common/util/DateUtil.java @@ -8,8 +8,8 @@ import java.time.format.DateTimeFormatter; */ public class DateUtil { - static DateTimeFormatter FORMATTER_FRONT = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss"); - static DateTimeFormatter FORMATTER_YMDHMS = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + static final DateTimeFormatter FORMATTER_FRONT = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss"); + static final DateTimeFormatter FORMATTER_YMDHMS = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); public static String formatFrontDate(LocalDateTime localDateTime) { return FORMATTER_FRONT.format(localDateTime); diff --git a/sop-admin/sop-admin-backend/backend-common/src/main/java/com/gitee/sop/adminbackend/common/util/RSATool.java b/sop-admin/sop-admin-backend/backend-common/src/main/java/com/gitee/sop/adminbackend/common/util/RSATool.java index b49a04e5..f0e72724 100644 --- a/sop-admin/sop-admin-backend/backend-common/src/main/java/com/gitee/sop/adminbackend/common/util/RSATool.java +++ b/sop-admin/sop-admin-backend/backend-common/src/main/java/com/gitee/sop/adminbackend/common/util/RSATool.java @@ -350,6 +350,14 @@ public class RSATool { public void setPrivateKey(String privateKey) { this.privateKey = privateKey; } + + @Override + public String toString() { + return "KeyStore{" + + "publicKey='" + publicKey + '\'' + + ", privateKey='" + privateKey + '\'' + + '}'; + } } @AllArgsConstructor diff --git a/sop-admin/sop-admin-backend/backend-common/src/test/java/com/gitee/sop/adminbackend/common/RSAToolTest.java b/sop-admin/sop-admin-backend/backend-common/src/test/java/com/gitee/sop/adminbackend/common/RSAToolTest.java new file mode 100644 index 00000000..ead8e0a8 --- /dev/null +++ b/sop-admin/sop-admin-backend/backend-common/src/test/java/com/gitee/sop/adminbackend/common/RSAToolTest.java @@ -0,0 +1,19 @@ +package com.gitee.sop.adminbackend.common; + +import com.gitee.sop.adminbackend.common.util.RSATool; +import org.junit.Test; + +/** + * @author 六如 + */ +public class RSAToolTest { + + @Test + public void create() throws Exception { + RSATool.KeyStore keys = new RSATool(RSATool.KeyFormat.PKCS1, RSATool.KeyLength.LENGTH_2048).createKeys(); + System.out.println(keys.getPrivateKey()); + System.out.println(keys.getPublicKey()); + } + + +} diff --git a/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/doc/DocAppService.java b/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/doc/DocAppService.java index c5ea8146..bae917f3 100644 --- a/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/doc/DocAppService.java +++ b/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/doc/DocAppService.java @@ -1,6 +1,7 @@ package com.gitee.sop.adminbackend.service.doc; -import com.gitee.fastmybatis.core.support.LambdaService; +import com.gitee.sop.adminbackend.common.support.ServiceSupport; +import com.gitee.sop.adminbackend.common.user.User; import com.gitee.sop.adminbackend.common.util.CopyUtil; import com.gitee.sop.adminbackend.dao.entity.DocApp; import com.gitee.sop.adminbackend.dao.mapper.DocAppMapper; @@ -16,7 +17,7 @@ import java.util.List; * @author 六如 */ @Service -public class DocAppService implements LambdaService { +public class DocAppService implements ServiceSupport { @Autowired private TornaClient tornaClient; @@ -26,7 +27,7 @@ public class DocAppService implements LambdaService { @Autowired private DocInfoSyncService docInfoSyncService; - public Long addDocApp(String token) { + public Long addDocApp(String token, User user) { TornaModuleDTO tornaModuleDTO = tornaClient.execute("module.get", null, token, TornaModuleDTO.class); DocApp docApp = this.get(DocApp::getToken, token); if (docApp == null) { @@ -39,7 +40,7 @@ public class DocAppService implements LambdaService { this.update(docApp); } // 同步文档 - docInfoSyncService.syncDocInfo(docApp, null); + docInfoSyncService.syncDocInfo(docApp, null, user); return docApp.getId(); } diff --git a/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/doc/DocContentService.java b/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/doc/DocContentService.java index 705b8881..29a8245b 100644 --- a/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/doc/DocContentService.java +++ b/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/doc/DocContentService.java @@ -1,6 +1,6 @@ package com.gitee.sop.adminbackend.service.doc; -import com.gitee.fastmybatis.core.support.LambdaService; +import com.gitee.sop.adminbackend.common.support.ServiceSupport; import com.gitee.sop.adminbackend.dao.entity.DocContent; import com.gitee.sop.adminbackend.dao.mapper.DocContentMapper; import org.springframework.stereotype.Service; @@ -10,7 +10,7 @@ import org.springframework.stereotype.Service; * @author 六如 */ @Service -public class DocContentService implements LambdaService { +public class DocContentService implements ServiceSupport { public void saveContent(Long docInfoId, String content) { DocContent docContent = this.get(DocContent::getDocInfoId, docInfoId); diff --git a/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/doc/DocInfoService.java b/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/doc/DocInfoService.java index 382767f2..ad068ca0 100644 --- a/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/doc/DocInfoService.java +++ b/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/doc/DocInfoService.java @@ -1,10 +1,10 @@ package com.gitee.sop.adminbackend.service.doc; import com.alibaba.fastjson2.JSON; -import com.gitee.fastmybatis.core.support.LambdaService; import com.gitee.fastmybatis.core.util.TreeUtil; import com.gitee.sop.adminbackend.common.constants.YesOrNo; import com.gitee.sop.adminbackend.common.exception.BizException; +import com.gitee.sop.adminbackend.common.support.ServiceSupport; import com.gitee.sop.adminbackend.common.util.CopyUtil; import com.gitee.sop.adminbackend.dao.entity.DocApp; import com.gitee.sop.adminbackend.dao.entity.DocInfo; @@ -13,6 +13,8 @@ import com.gitee.sop.adminbackend.dao.mapper.DocInfoMapper; import com.gitee.sop.adminbackend.service.doc.dto.DocInfoPublishUpdateDTO; import com.gitee.sop.adminbackend.service.doc.dto.DocInfoTreeDTO; import com.gitee.sop.adminbackend.service.doc.dto.torna.TornaDocInfoViewDTO; +import com.gitee.sop.adminbackend.service.sys.SysUserService; +import com.google.common.collect.Lists; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.util.CollectionUtils; @@ -27,12 +29,14 @@ import java.util.stream.Collectors; * @author 六如 */ @Service -public class DocInfoService implements LambdaService { +public class DocInfoService implements ServiceSupport { @Autowired private DocAppMapper docAppMapper; @Autowired private DocContentService docContentService; + @Autowired + private SysUserService sysUserService; public List listChildDoc(Long parentId) { return this.list(DocInfo::getParentId, parentId); @@ -43,7 +47,11 @@ public class DocInfoService implements LambdaService { if (CollectionUtils.isEmpty(list)) { return new ArrayList<>(0); } + Set userIds = list.stream().flatMap(docInfo -> Lists.newArrayList(docInfo.getAddBy(), docInfo.getUpdateBy()).stream()) + .filter(val -> val != null && val > 0) + .collect(Collectors.toSet()); List docInfoTreeDTOS = CopyUtil.copyList(list, DocInfoTreeDTO::new); + sysUserService.fillShowName(docInfoTreeDTOS); return TreeUtil.convertTree(docInfoTreeDTOS, 0L); } diff --git a/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/doc/DocInfoSyncService.java b/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/doc/DocInfoSyncService.java index 7fc8048e..88105b8f 100644 --- a/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/doc/DocInfoSyncService.java +++ b/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/doc/DocInfoSyncService.java @@ -4,6 +4,7 @@ import com.alibaba.fastjson2.JSON; import com.gitee.fastmybatis.core.util.TreeUtil; import com.gitee.sop.adminbackend.common.constants.YesOrNo; import com.gitee.sop.adminbackend.common.enums.DocSourceTypeEnum; +import com.gitee.sop.adminbackend.common.user.User; import com.gitee.sop.adminbackend.dao.entity.DocApp; import com.gitee.sop.adminbackend.dao.entity.DocInfo; import com.gitee.sop.adminbackend.dao.mapper.DocAppMapper; @@ -42,18 +43,18 @@ public class DocInfoSyncService { @Autowired private DocContentService docContentService; - public void syncAppDoc(Long docAppId) { + public void syncAppDoc(Long docAppId, User user) { DocApp docApp = docAppMapper.getById(docAppId); - this.syncDocInfo(docApp, null); + this.syncDocInfo(docApp, null, user); } - public void syncDoc(Long docInfoId) { + public void syncDoc(Long docInfoId, User user) { DocInfo docInfo = docInfoService.getById(docInfoId); DocApp docApp = docAppMapper.getById(docInfo.getDocAppId()); - this.syncDocInfo(docApp, docInfoId); + this.syncDocInfo(docApp, docInfoId, user); } - public void syncDocInfo(DocApp docApp, Long docInfoId) { + public void syncDocInfo(DocApp docApp, Long docInfoId, User user) { Long docAppId = docApp.getId(); Map nameVersionMap = docInfoService.list(DocInfo::getDocAppId, docAppId) .stream() @@ -86,6 +87,7 @@ public class DocInfoSyncService { docInfo.setDescription(tornaDocInfoDTO.getDescription()); docInfo.setIsFolder(tornaDocInfoDTO.getIsFolder().intValue()); docInfo.setParentId(tornaDocInfoDTO.getParentId()); + docInfo.setUpdateBy(user.getUserId()); updateList.add(docInfo); } } @@ -118,6 +120,7 @@ public class DocInfoSyncService { docInfo.setDescription(tornaDocInfoDTO.getDescription()); docInfo.setIsFolder(tornaDocInfoDTO.getIsFolder().intValue()); docInfo.setParentId(tornaDocInfoDTO.getParentId()); + docInfo.setAddBy(user.getUserId()); return docInfo; }) .collect(Collectors.toList()); diff --git a/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/doc/dto/DocAppDTO.java b/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/doc/dto/DocAppDTO.java index babebe62..32ee43e3 100644 --- a/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/doc/dto/DocAppDTO.java +++ b/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/doc/dto/DocAppDTO.java @@ -1,9 +1,9 @@ package com.gitee.sop.adminbackend.service.doc.dto; -import java.time.LocalDateTime; - import lombok.Data; +import java.time.LocalDateTime; + /** * 备注:文档应用 diff --git a/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/doc/dto/DocInfoTreeDTO.java b/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/doc/dto/DocInfoTreeDTO.java index be5f62d0..2a44ea52 100644 --- a/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/doc/dto/DocInfoTreeDTO.java +++ b/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/doc/dto/DocInfoTreeDTO.java @@ -1,6 +1,7 @@ package com.gitee.sop.adminbackend.service.doc.dto; import com.gitee.fastmybatis.core.support.TreeNode; +import com.gitee.sop.adminbackend.common.dto.UserDTO; import lombok.Data; import java.time.LocalDateTime; @@ -13,7 +14,7 @@ import java.util.List; * @author 六如 */ @Data -public class DocInfoTreeDTO implements TreeNode { +public class DocInfoTreeDTO extends UserDTO implements TreeNode { /** * id @@ -90,16 +91,6 @@ public class DocInfoTreeDTO implements TreeNode { */ private LocalDateTime updateTime; - /** - * 创建人id - */ - private Long addBy; - - /** - * 修改人id - */ - private Long updateBy; - private List children; diff --git a/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/isv/IsvInfoService.java b/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/isv/IsvInfoService.java index 733f54eb..c14aa07f 100644 --- a/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/isv/IsvInfoService.java +++ b/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/isv/IsvInfoService.java @@ -2,12 +2,14 @@ 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.util.RSATool; +import com.gitee.sop.adminbackend.common.constants.YesOrNo; import com.gitee.sop.adminbackend.common.context.SpringContext; import com.gitee.sop.adminbackend.common.dto.StatusUpdateDTO; import com.gitee.sop.adminbackend.common.enums.StatusEnum; -import com.gitee.sop.adminbackend.common.constants.YesOrNo; +import com.gitee.sop.adminbackend.common.support.ServiceSupport; +import com.gitee.sop.adminbackend.common.util.CopyUtil; +import com.gitee.sop.adminbackend.common.util.IdGen; +import com.gitee.sop.adminbackend.common.util.RSATool; import com.gitee.sop.adminbackend.dao.entity.IsvInfo; import com.gitee.sop.adminbackend.dao.entity.IsvKeys; import com.gitee.sop.adminbackend.dao.mapper.IsvInfoMapper; @@ -17,8 +19,6 @@ import com.gitee.sop.adminbackend.service.isv.dto.IsvInfoUpdateDTO; import com.gitee.sop.adminbackend.service.isv.dto.IsvInfoUpdateKeysDTO; import com.gitee.sop.adminbackend.service.isv.dto.IsvKeysDTO; import com.gitee.sop.adminbackend.service.isv.event.ChangeIsvInfoEvent; -import com.gitee.sop.adminbackend.common.util.CopyUtil; -import com.gitee.sop.adminbackend.common.util.IdGen; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -38,7 +38,7 @@ import java.util.stream.Collectors; * @author 六如 */ @Service -public class IsvInfoService implements LambdaService { +public class IsvInfoService implements ServiceSupport { @Autowired private IsvKeysService isvKeysService; @@ -107,11 +107,11 @@ public class IsvInfoService implements LambdaService { } public int update(IsvInfoUpdateDTO isvInfoUpdateDTO) { - int cnt = this.query() - .eq(IsvInfo::getId, isvInfoUpdateDTO.getId()) - .set(IsvInfo::getStatus, isvInfoUpdateDTO.getStatus()) - .set(IsvInfo::getRemark, isvInfoUpdateDTO.getRemark()) - .update(); + IsvInfo isvInfo = new IsvInfo(); + isvInfo.setId(isvInfoUpdateDTO.getId()); + isvInfo.setStatus(isvInfoUpdateDTO.getStatus()); + isvInfo.setRemark(isvInfoUpdateDTO.getRemark()); + int cnt = this.update(isvInfo); sendChangeEvent(isvInfoUpdateDTO.getId()); return cnt; } diff --git a/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/isv/IsvKeysService.java b/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/isv/IsvKeysService.java index 17689727..6ec45e1b 100644 --- a/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/isv/IsvKeysService.java +++ b/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/isv/IsvKeysService.java @@ -1,12 +1,12 @@ package com.gitee.sop.adminbackend.service.isv; -import com.gitee.fastmybatis.core.support.LambdaService; import com.gitee.sop.adminbackend.common.context.SpringContext; +import com.gitee.sop.adminbackend.common.support.ServiceSupport; +import com.gitee.sop.adminbackend.common.util.CopyUtil; import com.gitee.sop.adminbackend.dao.entity.IsvKeys; import com.gitee.sop.adminbackend.dao.mapper.IsvKeysMapper; import com.gitee.sop.adminbackend.service.isv.dto.IsvInfoUpdateKeysDTO; import com.gitee.sop.adminbackend.service.isv.event.ChangeIsvKeyEvent; -import com.gitee.sop.adminbackend.common.util.CopyUtil; import org.springframework.stereotype.Service; import java.util.Collections; @@ -16,7 +16,7 @@ import java.util.Collections; * @author 六如 */ @Service -public class IsvKeysService implements LambdaService { +public class IsvKeysService implements ServiceSupport { public int saveKeys(IsvInfoUpdateKeysDTO isvInfoUpdateKeysDTO) { IsvKeys isvKeys = this.get(IsvKeys::getIsvId, isvInfoUpdateKeysDTO.getIsvId()); diff --git a/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/isv/PermGroupPermissionService.java b/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/isv/PermGroupPermissionService.java index cebc8110..2e72ac76 100644 --- a/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/isv/PermGroupPermissionService.java +++ b/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/isv/PermGroupPermissionService.java @@ -2,8 +2,8 @@ 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.context.SpringContext; +import com.gitee.sop.adminbackend.common.support.ServiceSupport; import com.gitee.sop.adminbackend.dao.entity.ApiInfo; import com.gitee.sop.adminbackend.dao.entity.PermGroupPermission; import com.gitee.sop.adminbackend.dao.entity.PermIsvGroup; @@ -25,7 +25,7 @@ import java.util.stream.Collectors; * @author 六如 */ @Service -public class PermGroupPermissionService implements LambdaService { +public class PermGroupPermissionService implements ServiceSupport { @Autowired private ApiInfoMapper apiInfoMapper; diff --git a/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/isv/PermGroupService.java b/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/isv/PermGroupService.java index 9002563a..c14960ce 100644 --- a/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/isv/PermGroupService.java +++ b/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/isv/PermGroupService.java @@ -2,8 +2,8 @@ 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.exception.BizException; +import com.gitee.sop.adminbackend.common.support.ServiceSupport; import com.gitee.sop.adminbackend.dao.entity.PermGroup; import com.gitee.sop.adminbackend.dao.entity.PermIsvGroup; import com.gitee.sop.adminbackend.dao.mapper.PermGroupMapper; @@ -19,7 +19,7 @@ import java.util.Map; * @author 六如 */ @Service -public class PermGroupService implements LambdaService { +public class PermGroupService implements ServiceSupport { @Autowired PermIsvGroupMapper permIsvGroupMapper; diff --git a/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/isv/PermIsvGroupService.java b/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/isv/PermIsvGroupService.java index dfe1d1e5..49a49a58 100644 --- a/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/isv/PermIsvGroupService.java +++ b/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/isv/PermIsvGroupService.java @@ -2,7 +2,7 @@ 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.support.ServiceSupport; 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; @@ -24,7 +24,7 @@ import java.util.stream.Collectors; * @author 六如 */ @Service -public class PermIsvGroupService implements LambdaService { +public class PermIsvGroupService implements ServiceSupport { @Autowired private PermGroupService permGroupService; diff --git a/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/isv/dto/IsvInfoDTO.java b/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/isv/dto/IsvInfoDTO.java index 62d94726..e21c3c58 100644 --- a/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/isv/dto/IsvInfoDTO.java +++ b/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/isv/dto/IsvInfoDTO.java @@ -1,5 +1,6 @@ package com.gitee.sop.adminbackend.service.isv.dto; +import com.gitee.sop.adminbackend.service.jackson.convert.annotation.UserFormat; import lombok.Data; import java.time.LocalDateTime; @@ -40,5 +41,16 @@ public class IsvInfoDTO { private LocalDateTime updateTime; + /** + * 创建人id + */ + @UserFormat + private Long addBy; + + /** + * 修改人id + */ + @UserFormat + private Long updateBy; } diff --git a/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/jackson/convert/annotation/UserFormat.java b/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/jackson/convert/annotation/UserFormat.java new file mode 100644 index 00000000..e7869a87 --- /dev/null +++ b/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/jackson/convert/annotation/UserFormat.java @@ -0,0 +1,31 @@ +package com.gitee.sop.adminbackend.service.jackson.convert.annotation; + + +import com.fasterxml.jackson.annotation.JacksonAnnotationsInside; +import com.fasterxml.jackson.databind.annotation.JsonSerialize; +import com.gitee.sop.adminbackend.service.jackson.convert.serde.UserFormatSerializer; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * 序列化自动转换成用户名称 + * + * @author 六如 + */ +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.FIELD) +@JacksonAnnotationsInside +@JsonSerialize(using = UserFormatSerializer.class) +public @interface UserFormat { + + /** + * 显示用户名称 + * @return + */ + boolean showName() default true; + + +} diff --git a/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/jackson/convert/serde/UserFormatSerializer.java b/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/jackson/convert/serde/UserFormatSerializer.java new file mode 100644 index 00000000..35fdbd59 --- /dev/null +++ b/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/jackson/convert/serde/UserFormatSerializer.java @@ -0,0 +1,43 @@ +package com.gitee.sop.adminbackend.service.jackson.convert.serde; + +import com.fasterxml.jackson.core.JsonGenerator; +import com.fasterxml.jackson.databind.JsonSerializer; +import com.fasterxml.jackson.databind.SerializerProvider; +import com.gitee.sop.adminbackend.common.context.SpringContext; +import com.gitee.sop.adminbackend.common.resp.UserVO; +import com.gitee.sop.adminbackend.common.user.User; +import com.gitee.sop.adminbackend.common.util.CopyUtil; +import com.gitee.sop.adminbackend.service.sys.UserCacheService; +import lombok.extern.slf4j.Slf4j; + +import java.io.IOException; +import java.util.Objects; +import java.util.Optional; + +/** + * @author 六如 + */ +@Slf4j +public class UserFormatSerializer extends JsonSerializer { + + @Override + public void serialize(Object value, JsonGenerator gen, SerializerProvider serializers) throws IOException { + if (value == null) { + gen.writeNull(); + return; + } + Long userId = (Long) value; + if (Objects.equals(userId, 0L)) { + gen.writeNumber(userId); + return; + } + Optional userOpt = SpringContext.getBean(UserCacheService.class).getUser(userId); + if (userOpt.isPresent()) { + User user = userOpt.get(); + UserVO userVO = CopyUtil.copyBean(user, UserVO::new); + gen.writeObject(userVO); + } else { + gen.writeObject(value); + } + } +} diff --git a/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/jackson/package-info.java b/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/jackson/package-info.java new file mode 100644 index 00000000..1b5b5549 --- /dev/null +++ b/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/jackson/package-info.java @@ -0,0 +1 @@ +package com.gitee.sop.adminbackend.service.jackson; diff --git a/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/serve/ApiInfoService.java b/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/serve/ApiInfoService.java index 7fa0fb2b..edaf44c9 100644 --- a/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/serve/ApiInfoService.java +++ b/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/serve/ApiInfoService.java @@ -1,8 +1,8 @@ package com.gitee.sop.adminbackend.service.serve; -import com.gitee.fastmybatis.core.support.LambdaService; import com.gitee.sop.adminbackend.common.context.SpringContext; import com.gitee.sop.adminbackend.common.dto.StatusUpdateDTO; +import com.gitee.sop.adminbackend.common.support.ServiceSupport; import com.gitee.sop.adminbackend.dao.entity.ApiInfo; import com.gitee.sop.adminbackend.dao.mapper.ApiInfoMapper; import com.gitee.sop.adminbackend.service.isv.event.ChangeApiInfoEvent; @@ -15,7 +15,7 @@ import java.util.Collections; * @author 六如 */ @Service -public class ApiInfoService implements LambdaService { +public class ApiInfoService implements ServiceSupport { /** * 修改状态 @@ -34,11 +34,13 @@ public class ApiInfoService implements LambdaService { @Override public int update(ApiInfo entity) { - int cnt = LambdaService.super.update(entity); + int cnt = ServiceSupport.super.update(entity); sendChangeEvent(entity.getId()); return cnt; } + + private void sendChangeEvent(Long id) { SpringContext.publishEvent(new ChangeApiInfoEvent(Collections.singletonList(id))); } diff --git a/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/sys/SysConfigService.java b/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/sys/SysConfigService.java index e578e293..9414c282 100644 --- a/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/sys/SysConfigService.java +++ b/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/sys/SysConfigService.java @@ -2,10 +2,10 @@ package com.gitee.sop.adminbackend.service.sys; import com.gitee.fastmybatis.core.support.BaseLambdaService; import com.gitee.sop.adminbackend.common.config.IConfig; +import com.gitee.sop.adminbackend.common.util.CopyUtil; import com.gitee.sop.adminbackend.dao.entity.SysConfig; import com.gitee.sop.adminbackend.dao.mapper.SysConfigMapper; import com.gitee.sop.adminbackend.service.sys.dto.SystemConfigDTO; -import com.gitee.sop.adminbackend.common.util.CopyUtil; import com.google.common.cache.CacheBuilder; import com.google.common.cache.CacheLoader; import com.google.common.cache.LoadingCache; diff --git a/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/sys/SysDeptService.java b/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/sys/SysDeptService.java index 9ba734f8..c5f69b72 100644 --- a/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/sys/SysDeptService.java +++ b/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/sys/SysDeptService.java @@ -1,11 +1,10 @@ package com.gitee.sop.adminbackend.service.sys; -import com.gitee.fastmybatis.core.PageInfo; import com.gitee.fastmybatis.core.query.LambdaQuery; -import com.gitee.fastmybatis.core.support.LambdaService; import com.gitee.fastmybatis.core.util.TreeUtil; import com.gitee.sop.adminbackend.common.dto.StatusUpdateDTO; import com.gitee.sop.adminbackend.common.exception.BizException; +import com.gitee.sop.adminbackend.common.support.ServiceSupport; import com.gitee.sop.adminbackend.common.util.CopyUtil; import com.gitee.sop.adminbackend.dao.entity.SysDept; import com.gitee.sop.adminbackend.dao.mapper.SysDeptMapper; @@ -20,7 +19,7 @@ import java.util.Objects; * @author 六如 */ @Service -public class SysDeptService implements LambdaService { +public class SysDeptService implements ServiceSupport { public Long addDept(SysDept sysDept) { long count = this.query() diff --git a/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/sys/SysResourceService.java b/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/sys/SysResourceService.java index 7ded99e6..317f7a6d 100644 --- a/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/sys/SysResourceService.java +++ b/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/sys/SysResourceService.java @@ -1,6 +1,6 @@ package com.gitee.sop.adminbackend.service.sys; -import com.gitee.fastmybatis.core.support.LambdaService; +import com.gitee.sop.adminbackend.common.support.ServiceSupport; import com.gitee.sop.adminbackend.dao.entity.SysResource; import com.gitee.sop.adminbackend.dao.mapper.SysResourceMapper; import org.springframework.stereotype.Service; @@ -10,6 +10,6 @@ import org.springframework.stereotype.Service; * @author 六如 */ @Service -public class SysResourceService implements LambdaService { +public class SysResourceService implements ServiceSupport { } diff --git a/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/sys/SysRoleResourceService.java b/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/sys/SysRoleResourceService.java index 049cb6c4..33547584 100644 --- a/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/sys/SysRoleResourceService.java +++ b/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/sys/SysRoleResourceService.java @@ -1,6 +1,6 @@ package com.gitee.sop.adminbackend.service.sys; -import com.gitee.fastmybatis.core.support.LambdaService; +import com.gitee.sop.adminbackend.common.support.ServiceSupport; import com.gitee.sop.adminbackend.dao.entity.SysRoleResource; import com.gitee.sop.adminbackend.dao.mapper.SysRoleResourceMapper; import com.gitee.sop.adminbackend.service.sys.dto.SysRoleResourceDTO; @@ -16,7 +16,7 @@ import java.util.stream.Collectors; * @author 六如 */ @Service -public class SysRoleResourceService implements LambdaService { +public class SysRoleResourceService implements ServiceSupport { /** diff --git a/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/sys/SysRoleService.java b/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/sys/SysRoleService.java index ca97342f..76210ccc 100644 --- a/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/sys/SysRoleService.java +++ b/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/sys/SysRoleService.java @@ -1,7 +1,7 @@ package com.gitee.sop.adminbackend.service.sys; -import com.gitee.fastmybatis.core.support.LambdaService; import com.gitee.sop.adminbackend.common.dto.StatusUpdateDTO; +import com.gitee.sop.adminbackend.common.support.ServiceSupport; import com.gitee.sop.adminbackend.dao.entity.SysRole; import com.gitee.sop.adminbackend.dao.mapper.SysRoleMapper; import org.springframework.stereotype.Service; @@ -11,7 +11,7 @@ import org.springframework.stereotype.Service; * @author 六如 */ @Service -public class SysRoleService implements LambdaService { +public class SysRoleService implements ServiceSupport { /** diff --git a/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/sys/SysUserDeptService.java b/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/sys/SysUserDeptService.java index bb453634..c06f2c7e 100644 --- a/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/sys/SysUserDeptService.java +++ b/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/sys/SysUserDeptService.java @@ -1,6 +1,6 @@ package com.gitee.sop.adminbackend.service.sys; -import com.gitee.fastmybatis.core.support.LambdaService; +import com.gitee.sop.adminbackend.common.support.ServiceSupport; import com.gitee.sop.adminbackend.common.util.CopyUtil; import com.gitee.sop.adminbackend.dao.entity.SysDept; import com.gitee.sop.adminbackend.dao.entity.SysUserDept; @@ -25,7 +25,7 @@ import java.util.stream.Collectors; * @author 六如 */ @Service -public class SysUserDeptService implements LambdaService { +public class SysUserDeptService implements ServiceSupport { @Autowired SysDeptMapper sysDeptMapper; diff --git a/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/sys/SysUserRoleService.java b/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/sys/SysUserRoleService.java index 2e07f312..62222d68 100644 --- a/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/sys/SysUserRoleService.java +++ b/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/sys/SysUserRoleService.java @@ -1,6 +1,6 @@ package com.gitee.sop.adminbackend.service.sys; -import com.gitee.fastmybatis.core.support.LambdaService; +import com.gitee.sop.adminbackend.common.support.ServiceSupport; import com.gitee.sop.adminbackend.common.user.User; import com.gitee.sop.adminbackend.common.util.CopyUtil; import com.gitee.sop.adminbackend.dao.entity.SysRole; @@ -22,7 +22,7 @@ import java.util.stream.Collectors; * @author 六如 */ @Service -public class SysUserRoleService implements LambdaService { +public class SysUserRoleService implements ServiceSupport { @Autowired private SysRoleMapper sysRoleMapper; diff --git a/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/sys/SysUserService.java b/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/sys/SysUserService.java index c9f02dab..edaf9a7f 100644 --- a/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/sys/SysUserService.java +++ b/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/sys/SysUserService.java @@ -2,11 +2,12 @@ package com.gitee.sop.adminbackend.service.sys; 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.config.Configs; import com.gitee.sop.adminbackend.common.dto.StatusUpdateBatchDTO; import com.gitee.sop.adminbackend.common.dto.StatusUpdateDTO; +import com.gitee.sop.adminbackend.common.dto.UserDTO; import com.gitee.sop.adminbackend.common.enums.ConfigKeyEnum; +import com.gitee.sop.adminbackend.common.support.ServiceSupport; import com.gitee.sop.adminbackend.common.util.CopyUtil; import com.gitee.sop.adminbackend.common.util.GenerateUtil; import com.gitee.sop.adminbackend.dao.entity.SysUser; @@ -24,6 +25,7 @@ import org.springframework.security.crypto.bcrypt.BCrypt; import org.springframework.stereotype.Service; import org.springframework.util.CollectionUtils; +import java.util.Collection; import java.util.Collections; import java.util.List; import java.util.Map; @@ -35,11 +37,40 @@ import java.util.stream.Collectors; * @author 六如 */ @Service -public class SysUserService implements LambdaService { +public class SysUserService implements ServiceSupport { @Autowired SysUserDeptService sysUserDeptService; + public void fillShowName(Collection userDTOS) { + if (CollectionUtils.isEmpty(userDTOS)) { + return; + } + Set userIds = userDTOS.stream().flatMap(docInfo -> Lists.newArrayList(docInfo.getAddBy(), docInfo.getUpdateBy()).stream()) + .filter(val -> val != null && val > 0) + .collect(Collectors.toSet()); + Map userIdMap = this.getUserInfo(userIds); + for (T userDTO : userDTOS) { + SysUserDTO addUser = userIdMap.get(userDTO.getAddBy()); + if (addUser != null) { + userDTO.setAddByName(addUser.getShowName()); + } + SysUserDTO updateUser = userIdMap.get(userDTO.getUpdateBy()); + if (updateUser != null) { + userDTO.setUpdateByName(updateUser.getShowName()); + } + } + } + + public Map getUserInfo(Collection userIds) { + if (CollectionUtils.isEmpty(userIds)) { + return Collections.emptyMap(); + } + return this.query() + .in(SysUser::getId, userIds) + .map(SysUser::getId, sysUser -> CopyUtil.copyBean(sysUser, SysUserDTO::new)); + } + public PageInfo doPage(SysUserSearchDTO sysUserSearchDTO) { LambdaQuery query = sysUserSearchDTO.toLambdaQuery(SysUser.class); Long deptId = sysUserSearchDTO.getDeptId(); diff --git a/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/sys/UpgradeService.java b/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/sys/UpgradeService.java index 33fac0a6..b65f4bf9 100644 --- a/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/sys/UpgradeService.java +++ b/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/sys/UpgradeService.java @@ -1,10 +1,10 @@ package com.gitee.sop.adminbackend.service.sys; import com.gitee.sop.adminbackend.common.enums.ConfigKeyEnum; +import com.gitee.sop.adminbackend.common.util.PasswordUtil; import com.gitee.sop.adminbackend.dao.entity.SysUser; import com.gitee.sop.adminbackend.dao.mapper.UpgradeMapper; import com.gitee.sop.adminbackend.service.sys.login.enums.RegTypeEnum; -import com.gitee.sop.adminbackend.common.util.PasswordUtil; import org.apache.commons.codec.digest.DigestUtils; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; diff --git a/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/sys/UserCacheService.java b/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/sys/UserCacheService.java new file mode 100644 index 00000000..cc76a01a --- /dev/null +++ b/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/sys/UserCacheService.java @@ -0,0 +1,14 @@ +package com.gitee.sop.adminbackend.service.sys; + +import com.gitee.sop.adminbackend.common.user.User; + +import java.util.Optional; + +/** + * @author 六如 + */ +public interface UserCacheService { + + Optional getUser(Long userId); + +} diff --git a/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/sys/dto/MenuTreeDTO.java b/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/sys/dto/MenuTreeDTO.java index a41f4b48..c96d59ff 100644 --- a/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/sys/dto/MenuTreeDTO.java +++ b/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/sys/dto/MenuTreeDTO.java @@ -3,7 +3,6 @@ package com.gitee.sop.adminbackend.service.sys.dto; import com.fasterxml.jackson.annotation.JsonInclude; import com.gitee.fastmybatis.core.support.TreeNode; import com.gitee.sop.adminbackend.common.jackson.convert.annotation.Bool; -import com.google.common.collect.Lists; import lombok.Data; import java.util.List; diff --git a/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/sys/dto/SysUserDTO.java b/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/sys/dto/SysUserDTO.java index 243f9ee4..2554cb3a 100644 --- a/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/sys/dto/SysUserDTO.java +++ b/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/sys/dto/SysUserDTO.java @@ -1,9 +1,8 @@ package com.gitee.sop.adminbackend.service.sys.dto; +import com.gitee.sop.adminbackend.common.user.User; import lombok.Data; -import javax.validation.constraints.Min; -import javax.validation.constraints.NotNull; import java.time.LocalDateTime; @@ -12,7 +11,7 @@ import java.time.LocalDateTime; * @author 六如 */ @Data -public class SysUserDTO { +public class SysUserDTO implements User { /** * id @@ -94,5 +93,17 @@ public class SysUserDTO { */ private SysDeptDTO dept; + @Override + public Long getUserId() { + return id; + } + @Override + public String getToken() { + return ""; + } + + public String getShowName() { + return nickname != null && !nickname.isEmpty() ? nickname : username; + } } diff --git a/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/sys/dto/UserPermissionDTO.java b/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/sys/dto/UserPermissionDTO.java index c1ce3199..ac3fcc3b 100644 --- a/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/sys/dto/UserPermissionDTO.java +++ b/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/sys/dto/UserPermissionDTO.java @@ -1,8 +1,9 @@ package com.gitee.sop.adminbackend.service.sys.dto; +import lombok.Data; + import java.util.ArrayList; import java.util.List; -import lombok.Data; /** diff --git a/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/sys/impl/LocalUserCacheService.java b/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/sys/impl/LocalUserCacheService.java new file mode 100644 index 00000000..417043d1 --- /dev/null +++ b/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/sys/impl/LocalUserCacheService.java @@ -0,0 +1,56 @@ +package com.gitee.sop.adminbackend.service.sys.impl; + +import com.gitee.sop.adminbackend.common.user.User; +import com.gitee.sop.adminbackend.common.util.CopyUtil; +import com.gitee.sop.adminbackend.dao.entity.SysUser; +import com.gitee.sop.adminbackend.service.sys.SysUserService; +import com.gitee.sop.adminbackend.service.sys.UserCacheService; +import com.gitee.sop.adminbackend.service.sys.dto.SysUserDTO; +import com.google.common.cache.CacheBuilder; +import com.google.common.cache.CacheLoader; +import com.google.common.cache.LoadingCache; +import org.springframework.beans.factory.annotation.Autowired; + +import javax.annotation.PostConstruct; +import java.util.List; +import java.util.Optional; +import java.util.concurrent.TimeUnit; + +/** + * @author 六如 + */ +public class LocalUserCacheService implements UserCacheService { + + @Autowired + private SysUserService sysUserService; + + // key: configKey, value: configValue + private final LoadingCache> configCache = CacheBuilder.newBuilder() + .expireAfterAccess(30, TimeUnit.MINUTES) + .build(new CacheLoader>() { + @Override + public Optional load(Long key) throws Exception { + return Optional.ofNullable(loadFromDb(key)); + } + }); + + @Override + public Optional getUser(Long userId) { + return configCache.getUnchecked(userId); + } + + private User loadFromDb(Long userId) { + SysUser sysUser = sysUserService.getById(userId); + return CopyUtil.copyBean(sysUser, SysUserDTO::new); + } + + @PostConstruct + public void init() { + List sysUsers = sysUserService.listAll(); + List sysUserDTOS = CopyUtil.copyList(sysUsers, SysUserDTO::new); + for (SysUserDTO sysUserDTO : sysUserDTOS) { + configCache.put(sysUserDTO.getUserId(), Optional.of(sysUserDTO)); + } + } + +} diff --git a/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/sys/login/impl/DefaultUserCacheManager.java b/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/sys/login/impl/DefaultUserCacheManager.java index b3fbb0cf..cd676e80 100644 --- a/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/sys/login/impl/DefaultUserCacheManager.java +++ b/sop-admin/sop-admin-backend/backend-service/src/main/java/com/gitee/sop/adminbackend/service/sys/login/impl/DefaultUserCacheManager.java @@ -1,12 +1,12 @@ package com.gitee.sop.adminbackend.service.sys.login.impl; -import com.gitee.sop.adminbackend.common.user.User; import com.gitee.sop.adminbackend.common.enums.StatusEnum; +import com.gitee.sop.adminbackend.common.manager.UserCacheManager; +import com.gitee.sop.adminbackend.common.user.User; +import com.gitee.sop.adminbackend.common.util.CopyUtil; import com.gitee.sop.adminbackend.dao.entity.SysUser; import com.gitee.sop.adminbackend.service.sys.SysUserService; -import com.gitee.sop.adminbackend.common.manager.UserCacheManager; import com.gitee.sop.adminbackend.service.sys.login.dto.LoginUser; -import com.gitee.sop.adminbackend.common.util.CopyUtil; import com.google.common.cache.CacheBuilder; import com.google.common.cache.CacheLoader; import com.google.common.cache.LoadingCache; diff --git a/sop-admin/sop-admin-backend/backend-web/src/main/java/com/gitee/sop/adminbackend/controller/doc/DocController.java b/sop-admin/sop-admin-backend/backend-web/src/main/java/com/gitee/sop/adminbackend/controller/doc/DocController.java index 30a0d9fa..de22a938 100644 --- a/sop-admin/sop-admin-backend/backend-web/src/main/java/com/gitee/sop/adminbackend/controller/doc/DocController.java +++ b/sop-admin/sop-admin-backend/backend-web/src/main/java/com/gitee/sop/adminbackend/controller/doc/DocController.java @@ -1,5 +1,6 @@ package com.gitee.sop.adminbackend.controller.doc; +import com.gitee.sop.adminbackend.common.context.UserContext; import com.gitee.sop.adminbackend.common.req.IdParam; import com.gitee.sop.adminbackend.common.resp.Result; import com.gitee.sop.adminbackend.common.util.CopyUtil; @@ -47,19 +48,19 @@ public class DocController { @PostMapping("app/add") public Result addApp(@Validated @RequestBody DocAppAddParam param) { - Long docAppId = docAppService.addDocApp(param.getTornaToken()); + Long docAppId = docAppService.addDocApp(param.getTornaToken(), UserContext.getUser()); return Result.ok(docAppId); } @PostMapping("app/syncAppDoc") public Result syncAppDoc(@Validated @RequestBody IdParam param) { - docInfoSyncService.syncAppDoc(param.getId()); + docInfoSyncService.syncAppDoc(param.getId(), UserContext.getUser()); return Result.ok(1); } @PostMapping("app/syncDoc") public Result syncDoc(@Validated @RequestBody IdParam param) { - docInfoSyncService.syncDoc(param.getId()); + docInfoSyncService.syncDoc(param.getId(), UserContext.getUser()); return Result.ok(1); } diff --git a/sop-admin/sop-admin-backend/backend-web/src/main/java/com/gitee/sop/adminbackend/controller/doc/vo/DocInfoTreeVO.java b/sop-admin/sop-admin-backend/backend-web/src/main/java/com/gitee/sop/adminbackend/controller/doc/vo/DocInfoTreeVO.java index ee1400a5..404edfaf 100644 --- a/sop-admin/sop-admin-backend/backend-web/src/main/java/com/gitee/sop/adminbackend/controller/doc/vo/DocInfoTreeVO.java +++ b/sop-admin/sop-admin-backend/backend-web/src/main/java/com/gitee/sop/adminbackend/controller/doc/vo/DocInfoTreeVO.java @@ -2,6 +2,7 @@ package com.gitee.sop.adminbackend.controller.doc.vo; import com.gitee.fastmybatis.core.support.TreeNode; import com.gitee.sop.adminbackend.common.constants.YesOrNo; +import com.gitee.sop.adminbackend.service.jackson.convert.annotation.UserFormat; import lombok.Data; import java.time.LocalDateTime; @@ -95,11 +96,13 @@ public class DocInfoTreeVO implements TreeNode { /** * 创建人id */ + @UserFormat private Long addBy; /** * 修改人id */ + @UserFormat private Long updateBy; diff --git a/sop-admin/sop-admin-backend/backend-web/src/main/java/com/gitee/sop/adminbackend/controller/isv/IsvInfoController.java b/sop-admin/sop-admin-backend/backend-web/src/main/java/com/gitee/sop/adminbackend/controller/isv/IsvInfoController.java index 6f3391b5..00ec3634 100644 --- a/sop-admin/sop-admin-backend/backend-web/src/main/java/com/gitee/sop/adminbackend/controller/isv/IsvInfoController.java +++ b/sop-admin/sop-admin-backend/backend-web/src/main/java/com/gitee/sop/adminbackend/controller/isv/IsvInfoController.java @@ -3,14 +3,16 @@ package com.gitee.sop.adminbackend.controller.isv; import com.gitee.fastmybatis.core.PageInfo; import com.gitee.fastmybatis.core.query.LambdaQuery; import com.gitee.fastmybatis.core.query.param.PageParam; -import com.gitee.sop.adminbackend.common.util.RSATool; import com.gitee.sop.adminbackend.common.dto.StatusUpdateDTO; import com.gitee.sop.adminbackend.common.req.StatusUpdateParam; import com.gitee.sop.adminbackend.common.resp.Result; +import com.gitee.sop.adminbackend.common.util.CopyUtil; +import com.gitee.sop.adminbackend.common.util.RSATool; import com.gitee.sop.adminbackend.controller.isv.param.IsvInfoAddParam; import com.gitee.sop.adminbackend.controller.isv.param.IsvInfoUpdateKeysParam; import com.gitee.sop.adminbackend.controller.isv.param.IsvInfoUpdateParam; import com.gitee.sop.adminbackend.controller.isv.param.IsvKeysGenParam; +import com.gitee.sop.adminbackend.controller.isv.vo.IsvInfoVO; import com.gitee.sop.adminbackend.dao.entity.IsvInfo; import com.gitee.sop.adminbackend.service.isv.IsvInfoService; import com.gitee.sop.adminbackend.service.isv.PermIsvGroupService; @@ -19,7 +21,6 @@ import com.gitee.sop.adminbackend.service.isv.dto.IsvInfoDTO; import com.gitee.sop.adminbackend.service.isv.dto.IsvInfoUpdateDTO; import com.gitee.sop.adminbackend.service.isv.dto.IsvInfoUpdateKeysDTO; import com.gitee.sop.adminbackend.service.isv.dto.IsvKeysDTO; -import com.gitee.sop.adminbackend.common.util.CopyUtil; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.GetMapping; @@ -49,10 +50,11 @@ public class IsvInfoController { * @return */ @GetMapping("/page") - public Result> page(PageParam param) { + public Result> page(PageParam param) { LambdaQuery query = param.toLambdaQuery(IsvInfo.class); PageInfo isvInfoDTOPageInfo = isvInfoService.doPage(query); - return Result.ok(isvInfoDTOPageInfo); + PageInfo retPage = isvInfoDTOPageInfo.convert(isvInfoDTO -> CopyUtil.copyBean(isvInfoDTO, IsvInfoVO::new)); + return Result.ok(retPage); } /** @@ -63,7 +65,7 @@ public class IsvInfoController { * @throws Exception */ @PostMapping("createKeys") - public Result createKeys(IsvKeysGenParam param) throws Exception { + public Result createKeys(@Validated @RequestBody IsvKeysGenParam param) throws Exception { RSATool.KeyFormat format = RSATool.KeyFormat.of(param.getKeyFormat()); RSATool.KeyStore keyStore = isvInfoService.createKeys(format); return Result.ok(keyStore); diff --git a/sop-admin/sop-admin-backend/backend-web/src/main/java/com/gitee/sop/adminbackend/controller/isv/PermGroupPermissionController.java b/sop-admin/sop-admin-backend/backend-web/src/main/java/com/gitee/sop/adminbackend/controller/isv/PermGroupPermissionController.java index 2f489823..9f547da1 100644 --- a/sop-admin/sop-admin-backend/backend-web/src/main/java/com/gitee/sop/adminbackend/controller/isv/PermGroupPermissionController.java +++ b/sop-admin/sop-admin-backend/backend-web/src/main/java/com/gitee/sop/adminbackend/controller/isv/PermGroupPermissionController.java @@ -3,12 +3,12 @@ package com.gitee.sop.adminbackend.controller.isv; import com.gitee.fastmybatis.core.PageInfo; import com.gitee.fastmybatis.core.query.LambdaQuery; import com.gitee.sop.adminbackend.common.resp.Result; +import com.gitee.sop.adminbackend.common.util.CopyUtil; import com.gitee.sop.adminbackend.controller.isv.param.PermGroupApiInfoParam; import com.gitee.sop.adminbackend.controller.isv.param.PermGroupPermissionParam; import com.gitee.sop.adminbackend.dao.entity.ApiInfo; import com.gitee.sop.adminbackend.service.isv.PermGroupPermissionService; import com.gitee.sop.adminbackend.service.isv.dto.PermGroupPermissionDTO; -import com.gitee.sop.adminbackend.common.util.CopyUtil; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.GetMapping; diff --git a/sop-admin/sop-admin-backend/backend-web/src/main/java/com/gitee/sop/adminbackend/controller/isv/PermIsvGroupController.java b/sop-admin/sop-admin-backend/backend-web/src/main/java/com/gitee/sop/adminbackend/controller/isv/PermIsvGroupController.java index ba6db7ee..a192304a 100644 --- a/sop-admin/sop-admin-backend/backend-web/src/main/java/com/gitee/sop/adminbackend/controller/isv/PermIsvGroupController.java +++ b/sop-admin/sop-admin-backend/backend-web/src/main/java/com/gitee/sop/adminbackend/controller/isv/PermIsvGroupController.java @@ -2,11 +2,11 @@ package com.gitee.sop.adminbackend.controller.isv; import com.gitee.sop.adminbackend.common.context.SpringContext; import com.gitee.sop.adminbackend.common.resp.Result; +import com.gitee.sop.adminbackend.common.util.CopyUtil; import com.gitee.sop.adminbackend.controller.isv.param.IsvGroupSettingParam; import com.gitee.sop.adminbackend.service.isv.PermIsvGroupService; import com.gitee.sop.adminbackend.service.isv.dto.IsvGroupSettingDTO; import com.gitee.sop.adminbackend.service.isv.event.ChangeIsvPermEvent; -import com.gitee.sop.adminbackend.common.util.CopyUtil; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.GetMapping; diff --git a/sop-admin/sop-admin-backend/backend-web/src/main/java/com/gitee/sop/adminbackend/controller/isv/vo/IsvInfoVO.java b/sop-admin/sop-admin-backend/backend-web/src/main/java/com/gitee/sop/adminbackend/controller/isv/vo/IsvInfoVO.java new file mode 100644 index 00000000..463f6902 --- /dev/null +++ b/sop-admin/sop-admin-backend/backend-web/src/main/java/com/gitee/sop/adminbackend/controller/isv/vo/IsvInfoVO.java @@ -0,0 +1,56 @@ +package com.gitee.sop.adminbackend.controller.isv.vo; + +import com.gitee.sop.adminbackend.service.jackson.convert.annotation.UserFormat; +import lombok.Data; + +import java.time.LocalDateTime; + + +/** + * + * @author 六如 + */ +@Data +public class IsvInfoVO { + + private Long id; + + /** + * appKey + */ + private String appId; + + /** + * 1启用,2禁用 + */ + private Integer status; + + /** + * 是否有秘钥 + */ + private Integer hasKeys; + + /** + * 备注 + */ + private String remark; + + private String groupNames; + + private LocalDateTime addTime; + + private LocalDateTime updateTime; + + /** + * 创建人id + */ + @UserFormat + private Long addBy; + + /** + * 修改人id + */ + @UserFormat + private Long updateBy; + +} diff --git a/sop-admin/sop-admin-backend/backend-web/src/main/java/com/gitee/sop/adminbackend/controller/serve/ApiInfoController.java b/sop-admin/sop-admin-backend/backend-web/src/main/java/com/gitee/sop/adminbackend/controller/serve/ApiInfoController.java index 2634cc7a..7d88dd81 100644 --- a/sop-admin/sop-admin-backend/backend-web/src/main/java/com/gitee/sop/adminbackend/controller/serve/ApiInfoController.java +++ b/sop-admin/sop-admin-backend/backend-web/src/main/java/com/gitee/sop/adminbackend/controller/serve/ApiInfoController.java @@ -5,10 +5,11 @@ import com.gitee.fastmybatis.core.query.Query; import com.gitee.sop.adminbackend.common.dto.StatusUpdateDTO; import com.gitee.sop.adminbackend.common.req.StatusUpdateParam; import com.gitee.sop.adminbackend.common.resp.Result; +import com.gitee.sop.adminbackend.common.util.CopyUtil; import com.gitee.sop.adminbackend.controller.serve.param.ApiInfoPageParam; +import com.gitee.sop.adminbackend.controller.serve.vo.ApiInfoVO; import com.gitee.sop.adminbackend.dao.entity.ApiInfo; import com.gitee.sop.adminbackend.service.serve.ApiInfoService; -import com.gitee.sop.adminbackend.common.util.CopyUtil; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.GetMapping; @@ -43,6 +44,7 @@ public class ApiInfoController { Query query = param.toQuery(); query.orderByDesc("id"); PageInfo pageInfo = apiInfoService.page(query); + pageInfo.convert(apiInfo -> CopyUtil.copyBean(apiInfo, ApiInfoVO::new)); return Result.ok(pageInfo); } @@ -53,11 +55,11 @@ public class ApiInfoController { * @return */ @GetMapping("/listAll") - public Result> listAll(ApiInfoPageParam param) { + public Result> listAll(ApiInfoPageParam param) { Query query = param.toQuery(); query.orderByDesc("id"); List list = apiInfoService.list(query); - return Result.ok(list); + return Result.ok(CopyUtil.copyList(list, ApiInfoVO::new)); } /** diff --git a/sop-admin/sop-admin-backend/backend-web/src/main/java/com/gitee/sop/adminbackend/controller/serve/vo/ApiInfoVO.java b/sop-admin/sop-admin-backend/backend-web/src/main/java/com/gitee/sop/adminbackend/controller/serve/vo/ApiInfoVO.java new file mode 100644 index 00000000..9bfccb7f --- /dev/null +++ b/sop-admin/sop-admin-backend/backend-web/src/main/java/com/gitee/sop/adminbackend/controller/serve/vo/ApiInfoVO.java @@ -0,0 +1,107 @@ +package com.gitee.sop.adminbackend.controller.serve.vo; + +import com.gitee.sop.adminbackend.service.jackson.convert.annotation.UserFormat; +import lombok.Data; + +import java.time.LocalDateTime; + + +/** + * @author 六如 + */ +@Data +public class ApiInfoVO { + + /** + * id + */ + private Long id; + + /** + * 所属应用 + */ + private String application; + + /** + * 接口名称 + */ + private String apiName; + + /** + * 版本号 + */ + private String apiVersion; + + /** + * 接口描述 + */ + private String description; + + /** + * 备注 + */ + private String remark; + + /** + * 接口class + */ + private String interfaceClassName; + + /** + * 方法名称 + */ + private String methodName; + + /** + * 参数信息 + */ + private String paramInfo; + + /** + * 接口是否需要授权访问 + */ + private Integer isPermission; + + /** + * 是否需要appAuthToken + */ + private Integer isNeedToken; + + /** + * 是否有公共响应参数 + */ + private Integer hasCommonResponse; + + /** + * 注册来源,1-系统注册,2-手动注册 + */ + private Integer regSource; + + /** + * 1启用,0禁用 + */ + private Integer status; + + /** + * 添加时间 + */ + private LocalDateTime addTime; + + /** + * 修改时间 + */ + private LocalDateTime updateTime; + + /** + * 创建人id + */ + @UserFormat + private Long addBy; + + /** + * 最后更新人id + */ + @UserFormat + private Long updateBy; + +} diff --git a/sop-admin/sop-admin-backend/backend-web/src/main/java/com/gitee/sop/adminbackend/controller/sys/LoginController.java b/sop-admin/sop-admin-backend/backend-web/src/main/java/com/gitee/sop/adminbackend/controller/sys/LoginController.java index cdc14370..f6adb68a 100644 --- a/sop-admin/sop-admin-backend/backend-web/src/main/java/com/gitee/sop/adminbackend/controller/sys/LoginController.java +++ b/sop-admin/sop-admin-backend/backend-web/src/main/java/com/gitee/sop/adminbackend/controller/sys/LoginController.java @@ -2,13 +2,13 @@ package com.gitee.sop.adminbackend.controller.sys; import com.gitee.sop.adminbackend.common.annotation.NoToken; import com.gitee.sop.adminbackend.common.resp.Result; +import com.gitee.sop.adminbackend.common.util.CopyUtil; import com.gitee.sop.adminbackend.controller.sys.param.LoginParam; import com.gitee.sop.adminbackend.controller.sys.vo.LoginResultVO; import com.gitee.sop.adminbackend.service.sys.login.LoginService; import com.gitee.sop.adminbackend.service.sys.login.dto.LoginDTO; import com.gitee.sop.adminbackend.service.sys.login.dto.LoginUser; import com.gitee.sop.adminbackend.service.sys.login.enums.RegTypeEnum; -import com.gitee.sop.adminbackend.common.util.CopyUtil; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.PostMapping; diff --git a/sop-admin/sop-admin-backend/backend-web/src/main/java/com/gitee/sop/adminbackend/controller/sys/param/SysRoleParam.java b/sop-admin/sop-admin-backend/backend-web/src/main/java/com/gitee/sop/adminbackend/controller/sys/param/SysRoleParam.java index f16a1802..dad55eb9 100644 --- a/sop-admin/sop-admin-backend/backend-web/src/main/java/com/gitee/sop/adminbackend/controller/sys/param/SysRoleParam.java +++ b/sop-admin/sop-admin-backend/backend-web/src/main/java/com/gitee/sop/adminbackend/controller/sys/param/SysRoleParam.java @@ -1,7 +1,5 @@ package com.gitee.sop.adminbackend.controller.sys.param; -import java.time.LocalDateTime; - import com.gitee.fastmybatis.core.query.Operator; import com.gitee.fastmybatis.core.query.annotation.Condition; import com.gitee.fastmybatis.core.query.param.PageParam; diff --git a/sop-admin/sop-admin-backend/backend-web/src/main/java/com/gitee/sop/adminbackend/controller/sys/param/SysUserAddParam.java b/sop-admin/sop-admin-backend/backend-web/src/main/java/com/gitee/sop/adminbackend/controller/sys/param/SysUserAddParam.java index 90f27234..728ca8ad 100644 --- a/sop-admin/sop-admin-backend/backend-web/src/main/java/com/gitee/sop/adminbackend/controller/sys/param/SysUserAddParam.java +++ b/sop-admin/sop-admin-backend/backend-web/src/main/java/com/gitee/sop/adminbackend/controller/sys/param/SysUserAddParam.java @@ -1,11 +1,10 @@ package com.gitee.sop.adminbackend.controller.sys.param; -import java.time.LocalDateTime; - import lombok.Data; import javax.validation.constraints.Min; import javax.validation.constraints.NotNull; +import java.time.LocalDateTime; /** diff --git a/sop-admin/sop-admin-backend/backend-web/src/main/java/com/gitee/sop/adminbackend/controller/sys/vo/LoginResultVO.java b/sop-admin/sop-admin-backend/backend-web/src/main/java/com/gitee/sop/adminbackend/controller/sys/vo/LoginResultVO.java index e07d662f..6e6efa08 100644 --- a/sop-admin/sop-admin-backend/backend-web/src/main/java/com/gitee/sop/adminbackend/controller/sys/vo/LoginResultVO.java +++ b/sop-admin/sop-admin-backend/backend-web/src/main/java/com/gitee/sop/adminbackend/controller/sys/vo/LoginResultVO.java @@ -3,7 +3,6 @@ package com.gitee.sop.adminbackend.controller.sys.vo; import lombok.Data; import java.util.List; -import java.util.Set; /** * @author 六如 diff --git a/sop-admin/sop-admin-backend/backend-web/src/main/java/com/gitee/sop/adminbackend/controller/sys/vo/SysUserVO.java b/sop-admin/sop-admin-backend/backend-web/src/main/java/com/gitee/sop/adminbackend/controller/sys/vo/SysUserVO.java index 1b858348..393601c9 100644 --- a/sop-admin/sop-admin-backend/backend-web/src/main/java/com/gitee/sop/adminbackend/controller/sys/vo/SysUserVO.java +++ b/sop-admin/sop-admin-backend/backend-web/src/main/java/com/gitee/sop/adminbackend/controller/sys/vo/SysUserVO.java @@ -2,8 +2,6 @@ package com.gitee.sop.adminbackend.controller.sys.vo; import lombok.Data; -import javax.validation.constraints.Min; -import javax.validation.constraints.NotNull; import java.time.LocalDateTime; diff --git a/sop-admin/sop-admin-frontend/src/views/admin/user/index.ts b/sop-admin/sop-admin-frontend/src/views/admin/user/index.ts deleted file mode 100644 index 35dd6478..00000000 --- a/sop-admin/sop-admin-frontend/src/views/admin/user/index.ts +++ /dev/null @@ -1,306 +0,0 @@ -import { computed, ref } from "vue"; -import { - type ButtonsCallBackParams, - type FieldValues, - type PageInfo, - type PlusColumn, - useTable -} from "plus-pro-components"; -import { ElMessage } from "element-plus"; -import { api } from "@/api/sysAdminUser"; - -const isAdd = ref(false); - -// ========= search form ========= - -// 查询表单对象 -export const searchFormData = ref({ - id: "", - username: "", - password: "", - nickname: "", - email: "", - avatar: "", - status: "", - regType: "", - addTime: "", - updateTime: "", - pageIndex: 1, - pageSize: 10 -}); - -// 查询表单字段定义 -export const searchFormColumns: PlusColumn[] = [ - { - label: "用户名", - prop: "username" - }, - { - label: "密码", - prop: "password" - }, - { - label: "用户名", - prop: "nickname" - }, - { - label: "邮箱", - prop: "email" - }, - { - label: "头像", - prop: "avatar" - }, - { - label: "状态,1:启用,2:禁用", - prop: "status" - }, - { - label: "注册类型", - prop: "regType" - }, - { - label: "addTime", - prop: "addTime" - }, - { - label: "updateTime", - prop: "updateTime" - } -]; - -// ========= table ========= - -// 表格对象 -export const { - tableData, - total, - pageInfo, - buttons: actionButtons -} = useTable(); -// 默认每页条数,默认10 -pageInfo.value.pageSize = 10; - -// 表格字段定义 -export const tableColumns: PlusColumn[] = [ - { - label: "用户名", - prop: "username" - }, - { - label: "密码", - prop: "password" - }, - { - label: "用户名", - prop: "nickname" - }, - { - label: "邮箱", - prop: "email" - }, - { - label: "头像", - prop: "avatar" - }, - { - label: "状态,1:启用,2:禁用", - prop: "status" - }, - { - label: "注册类型", - prop: "regType" - }, - { - label: "addTime", - prop: "addTime" - }, - { - label: "updateTime", - prop: "updateTime" - } -]; -// 表格按钮定义 -actionButtons.value = [ - { - // 修改 - text: "修改", - code: "edit", - props: { - type: "primary" - }, - show: computed(() => true), - onClick(params: ButtonsCallBackParams) { - isAdd.value = false; - editFormData.value = Object.assign({}, params.row); - dlgTitle.value = "修改"; - dlgShow.value = true; - } - }, - { - // 删除 - text: "删除", - code: "delete", - props: { - type: "danger" - }, - confirm: { - options: { draggable: false } - }, - onConfirm(params: ButtonsCallBackParams) { - api.del(params).then(() => { - ElMessage({ - message: "删除成功", - type: "success" - }); - dlgShow.value = false; - search(); - }); - } - } -]; - -// ========= dialog form ========= - -// 弹窗显示 -export const dlgShow = ref(false); -export const dlgTitle = ref(""); -// 表单值 -const editFormDataGen = () => { - return { - username: "", - password: "", - nickname: "", - email: "", - avatar: "", - status: "", - regType: "", - addTime: "", - updateTime: "" - }; -}; -export const editFormData = ref(editFormDataGen()); -export const editFormRules = { - id: [{ required: true, message: "请输入id" }], - username: [{ required: true, message: "请输入用户名" }], - password: [{ required: true, message: "请输入密码" }], - nickname: [{ required: true, message: "请输入用户名" }], - email: [{ required: true, message: "请输入邮箱" }], - avatar: [{ required: true, message: "请输入头像" }], - status: [{ required: true, message: "请输入状态,1:启用,2:禁用" }], - regType: [{ required: true, message: "请输入注册类型" }], - addTime: [{ required: true, message: "请输入addTime" }], - updateTime: [{ required: true, message: "请输入updateTime" }] -}; - -// 表单内容 -export const editFormColumns: PlusColumn[] = [ - { - label: "id", - prop: "id", - valueType: "copy" - }, - { - label: "用户名", - prop: "username", - valueType: "copy" - }, - { - label: "密码", - prop: "password", - valueType: "copy" - }, - { - label: "用户名", - prop: "nickname", - valueType: "copy" - }, - { - label: "邮箱", - prop: "email", - valueType: "copy" - }, - { - label: "头像", - prop: "avatar", - valueType: "copy" - }, - { - label: "状态,1:启用,2:禁用", - prop: "status", - valueType: "copy" - }, - { - label: "注册类型", - prop: "regType", - valueType: "copy" - }, - { - label: "addTime", - prop: "addTime", - valueType: "copy" - }, - { - label: "updateTime", - prop: "updateTime", - valueType: "copy" - } -]; - -// ========= event ========= - -// 添加按钮事件 -export const handleAdd = () => { - isAdd.value = true; - editFormData.value = editFormDataGen(); - dlgTitle.value = "新增"; - dlgShow.value = true; -}; - -// 保存按钮事件,校验成功后触发 -export const handleSave = () => { - const postData = editFormData.value; - const pms = isAdd.value ? api.add(postData) : api.update(postData); - pms.then(() => { - ElMessage({ - message: "保存成功", - type: "success" - }); - dlgShow.value = false; - search(); - }); -}; - -// 点击查询按钮 -export const handleSearch = () => { - pageInfo.value.page = 1; - search(); -}; - -// 分页事件 -export const handlePaginationChange = (_pageInfo: PageInfo): void => { - pageInfo.value = _pageInfo; - search(); -}; - -// 查询 -const search = async () => { - try { - const { data } = await doSearch(); - tableData.value = data.list; - total.value = data.total; - } catch (error) {} -}; -// 请求接口 -const doSearch = async () => { - // 查询参数 - const data = searchFormData.value; - // 添加分页参数 - data.pageIndex = pageInfo.value.page; - data.pageSize = pageInfo.value.pageSize; - - return api.page(data); -}; - -// 页面加载 -search(); diff --git a/sop-admin/sop-admin-frontend/src/views/admin/user/index.vue b/sop-admin/sop-admin-frontend/src/views/admin/user/index.vue deleted file mode 100644 index 624b8652..00000000 --- a/sop-admin/sop-admin-frontend/src/views/admin/user/index.vue +++ /dev/null @@ -1,63 +0,0 @@ - - diff --git a/sop-admin/sop-admin-frontend/src/views/doc/list/index.ts b/sop-admin/sop-admin-frontend/src/views/doc/list/index.ts index 0c3a4cb0..ec50167d 100644 --- a/sop-admin/sop-admin-frontend/src/views/doc/list/index.ts +++ b/sop-admin/sop-admin-frontend/src/views/doc/list/index.ts @@ -66,10 +66,7 @@ export function useDocList() { }, { label: "描述", - prop: "description", - tableColumnProps: { - showOverflowTooltip: true - } + prop: "description" }, { label: "发布状态", @@ -98,12 +95,22 @@ export function useDocList() { } }, { - width: 160, + width: 100, + label: "添加人", + prop: "addBy.showName" + }, + { + width: 100, + label: "修改人", + prop: "updateBy.showName" + }, + { + width: 120, label: "添加时间", prop: "addTime" }, { - width: 160, + width: 120, label: "修改时间", prop: "updateTime" } diff --git a/sop-admin/sop-admin-frontend/src/views/doc/list/index.vue b/sop-admin/sop-admin-frontend/src/views/doc/list/index.vue index fb958e10..840e33dd 100644 --- a/sop-admin/sop-admin-frontend/src/views/doc/list/index.vue +++ b/sop-admin/sop-admin-frontend/src/views/doc/list/index.vue @@ -46,6 +46,7 @@ const { v-show="tabsData.length > 0" :columns="tableColumns" :table-data="tableRows" + showOverflowTooltip :action-bar="{ buttons: actionButtons, confirmType: 'popconfirm', diff --git a/sop-admin/sop-admin-frontend/src/views/doc/setting/index.ts b/sop-admin/sop-admin-frontend/src/views/doc/setting/index.ts index 859a0b5c..e4fcd219 100644 --- a/sop-admin/sop-admin-frontend/src/views/doc/setting/index.ts +++ b/sop-admin/sop-admin-frontend/src/views/doc/setting/index.ts @@ -1,53 +1,59 @@ -import { ref } from "vue"; +import { onMounted, ref } from "vue"; import type { PlusColumn, FieldValues } from "plus-pro-components"; import { api } from "@/api/docSetting"; import { ElMessage } from "element-plus"; -export const state = ref({ - tornaServerAddr: "", - openProdUrl: "", - openSandboxUrl: "" -}); - -export const rules = {}; - -export const columns: PlusColumn[] = [ - { - label: "Torna地址", - prop: "tornaServerAddr", - valueType: "copy", - fieldProps: { - placeholder: "Torna地址,到端口号,如:https://torna.xxx.com:7700" - } - }, - { - label: "开放平台线上环境地址", - prop: "openProdUrl", - valueType: "copy", - fieldProps: { - placeholder: "开放平台线上环境地址,如:https://open.xxx.com/api" - } - }, - { - label: "开放平台沙箱环境地址", - prop: "openSandboxUrl", - valueType: "copy", - fieldProps: { - placeholder: "开放平台沙箱环境地址, 如:https://open-sandbox.xxx.com/api" - } - } -]; - -export const handleSubmit = (values: FieldValues) => { - api.save(values).then(() => { - ElMessage.success("保存成功"); +export function useDocSetting() { + const state = ref({ + tornaServerAddr: "", + openProdUrl: "", + openSandboxUrl: "" }); -}; -const loadSetting = () => { - api.get().then(resp => { - state.value = resp.data; + const rules = {}; + + const columns: PlusColumn[] = [ + { + label: "Torna地址", + prop: "tornaServerAddr", + valueType: "copy", + fieldProps: { + placeholder: "Torna地址,到端口号,如:https://torna.xxx.com:7700" + } + }, + { + label: "开放平台线上环境地址", + prop: "openProdUrl", + valueType: "copy", + fieldProps: { + placeholder: "开放平台线上环境地址,如:https://open.xxx.com/api" + } + }, + { + label: "开放平台沙箱环境地址", + prop: "openSandboxUrl", + valueType: "copy", + fieldProps: { + placeholder: "开放平台沙箱环境地址, 如:https://open-sandbox.xxx.com/api" + } + } + ]; + + const handleSubmit = (values: FieldValues) => { + api.save(values).then(() => { + ElMessage.success("保存成功"); + }); + }; + + const loadSetting = () => { + api.get().then(resp => { + state.value = resp.data; + }); + }; + + onMounted(() => { + loadSetting(); }); -}; -loadSetting(); + return { state, rules, columns, handleSubmit }; +} diff --git a/sop-admin/sop-admin-frontend/src/views/doc/setting/index.vue b/sop-admin/sop-admin-frontend/src/views/doc/setting/index.vue index f4c2d0d6..e0cc1dca 100644 --- a/sop-admin/sop-admin-frontend/src/views/doc/setting/index.vue +++ b/sop-admin/sop-admin-frontend/src/views/doc/setting/index.vue @@ -1,5 +1,6 @@ - - diff --git a/sop-admin/sop-admin-frontend/src/views/permission/button/perms.vue b/sop-admin/sop-admin-frontend/src/views/permission/button/perms.vue deleted file mode 100644 index 0cdc6b55..00000000 --- a/sop-admin/sop-admin-frontend/src/views/permission/button/perms.vue +++ /dev/null @@ -1,109 +0,0 @@ - - - diff --git a/sop-admin/sop-admin-frontend/src/views/permission/page/index.vue b/sop-admin/sop-admin-frontend/src/views/permission/page/index.vue deleted file mode 100644 index 27fb26a1..00000000 --- a/sop-admin/sop-admin-frontend/src/views/permission/page/index.vue +++ /dev/null @@ -1,66 +0,0 @@ - - - diff --git a/sop-admin/sop-admin-frontend/src/views/serve/api/index.ts b/sop-admin/sop-admin-frontend/src/views/serve/api/index.ts index 3aab6a39..baa4b718 100644 --- a/sop-admin/sop-admin-frontend/src/views/serve/api/index.ts +++ b/sop-admin/sop-admin-frontend/src/views/serve/api/index.ts @@ -66,18 +66,12 @@ export const tableColumns: PlusColumn[] = [ { label: "所属应用", prop: "application", - minWidth: 150, - tableColumnProps: { - showOverflowTooltip: true - } + minWidth: 150 }, { label: "接口名称", prop: "apiName", - minWidth: 200, - tableColumnProps: { - showOverflowTooltip: true - } + minWidth: 200 }, { label: "版本号", @@ -87,17 +81,11 @@ export const tableColumns: PlusColumn[] = [ { label: "接口描述", prop: "description", - minWidth: 100, - tableColumnProps: { - showOverflowTooltip: true - } + minWidth: 100 }, { label: "备注", - prop: "remark", - tableColumnProps: { - showOverflowTooltip: true - } + prop: "remark" }, { label: "需要授权", @@ -187,14 +175,14 @@ export const tableColumns: PlusColumn[] = [ ] }, { + width: 120, label: "添加时间", - prop: "addTime", - width: 160 + prop: "addTime" }, { + width: 120, label: "修改时间", - prop: "updateTime", - width: 160 + prop: "updateTime" } ]; // 表格按钮权限 diff --git a/sop-admin/sop-admin-frontend/src/views/serve/api/index.vue b/sop-admin/sop-admin-frontend/src/views/serve/api/index.vue index b31a09d0..1dc44661 100644 --- a/sop-admin/sop-admin-frontend/src/views/serve/api/index.vue +++ b/sop-admin/sop-admin-frontend/src/views/serve/api/index.vue @@ -44,6 +44,7 @@ defineOptions({ pageSizeList: [10, 20, 50, 100], align: 'right' }" + showOverflowTooltip adaptive @paginationChange="handlePaginationChange" > diff --git a/sop-admin/sop-admin-frontend/src/views/system/dept/utils/hook.tsx b/sop-admin/sop-admin-frontend/src/views/system/dept/utils/hook.tsx index 3eb48868..6643ffb6 100644 --- a/sop-admin/sop-admin-frontend/src/views/system/dept/utils/hook.tsx +++ b/sop-admin/sop-admin-frontend/src/views/system/dept/utils/hook.tsx @@ -1,4 +1,3 @@ -import dayjs from "dayjs"; import editForm from "../form.vue"; import { handleTree } from "@/utils/tree"; import { message } from "@/utils/message"; @@ -44,10 +43,9 @@ export function useDept() { }, { label: "创建时间", - minWidth: 200, - prop: "createTime", - formatter: ({ createTime }) => - dayjs(createTime).format("YYYY-MM-DD HH:mm:ss") + width: 120, + prop: "addTime", + showOverflowTooltip: true }, { label: "备注", diff --git a/sop-admin/sop-admin-frontend/src/views/system/role/utils/hook.tsx b/sop-admin/sop-admin-frontend/src/views/system/role/utils/hook.tsx index f7b44eb5..1e480044 100644 --- a/sop-admin/sop-admin-frontend/src/views/system/role/utils/hook.tsx +++ b/sop-admin/sop-admin-frontend/src/views/system/role/utils/hook.tsx @@ -1,4 +1,3 @@ -import dayjs from "dayjs"; import editForm from "../form.vue"; import { handleTree } from "@/utils/tree"; import { message } from "@/utils/message"; @@ -90,10 +89,9 @@ export function useRole(treeRef: Ref) { }, { label: "创建时间", - prop: "createTime", - minWidth: 160, - formatter: ({ createTime }) => - dayjs(createTime).format("YYYY-MM-DD HH:mm:ss") + prop: "addTime", + width: 120, + showOverflowTooltip: true }, { label: "操作", diff --git a/sop-admin/sop-admin-frontend/src/views/system/user/utils/hook.tsx b/sop-admin/sop-admin-frontend/src/views/system/user/utils/hook.tsx index 9ebb6d1c..ac279af9 100644 --- a/sop-admin/sop-admin-frontend/src/views/system/user/utils/hook.tsx +++ b/sop-admin/sop-admin-frontend/src/views/system/user/utils/hook.tsx @@ -1,5 +1,4 @@ import "./reset.css"; -import dayjs from "dayjs"; import roleForm from "../form/role.vue"; import editForm from "../form/index.vue"; import { zxcvbn } from "@zxcvbn-ts/core"; @@ -157,10 +156,9 @@ export function useUser(tableRef: Ref, treeRef: Ref) { }, { label: "创建时间", - minWidth: 90, - prop: "createTime", - formatter: ({ createTime }) => - dayjs(createTime).format("YYYY-MM-DD HH:mm:ss") + width: 120, + prop: "addTime", + showOverflowTooltip: true }, { label: "操作", diff --git a/sop-example/example-payment/src/main/resources/doc.json b/sop-example/example-payment/src/main/resources/doc.json index 2defaf8e..2e1ba445 100644 --- a/sop-example/example-payment/src/main/resources/doc.json +++ b/sop-example/example-payment/src/main/resources/doc.json @@ -15,7 +15,7 @@ "isReplace": true, // 第三方jar中的class配置 "jarClass": { - "com.baomidou.mybatisplus.extension.plugins.pagination.Page": { + "com.xx.Page": { "records": { "value": "查询数据列表", "example": "" }, "total": { "value": "总数", "example": "100" }, "size": { "value": "页数", "example": "10" }, diff --git a/sop-example/example-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 index f7ce89dc..1039ffdc 100644 --- a/sop-example/example-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 @@ -5,6 +5,8 @@ import com.gitee.sop.storyweb.open.resp.StoryResponse; import com.gitee.sop.support.annotation.Open; import com.gitee.sop.support.context.OpenContext; import com.gitee.sop.support.dto.FileData; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; import javax.validation.constraints.NotNull; import javax.validation.constraints.Size; @@ -15,6 +17,7 @@ import java.util.List; * * @author 六如 */ +@Api("故事服务") public interface OpenStory { @Open("story.save") @@ -27,6 +30,7 @@ public interface OpenStory { @Open("story.updateError") Integer updateError(Integer id); + @ApiOperation(value = "根据id获取故事") @Open("story.get") StoryResponse getById(@NotNull(message = "id必填") Integer id); @@ -46,6 +50,14 @@ public interface OpenStory { return storyResponse; } + // 默认方法,注解放在这里也有效 + @Open("alipay.story.find") + default StoryResponse findByName(String name) { + StoryResponse storyResponse = new StoryResponse(); + storyResponse.setName(name); + return storyResponse; + } + // 演示单文件上传 @Open("story.upload") StoryResponse upload(StorySaveRequest storySaveRequest, FileData file); diff --git a/sop-example/example-story/src/main/resources/doc.json b/sop-example/example-story/src/main/resources/doc.json new file mode 100644 index 00000000..61dda328 --- /dev/null +++ b/sop-example/example-story/src/main/resources/doc.json @@ -0,0 +1,27 @@ +{ + // 开启推送 + "enable": true, + // 扫描package,多个用;隔开 + "basePackage": "com.gitee.sop.storyweb.open", + // 推送URL,IP端口对应Torna服务器 + "url": "http://localhost:7700/api", + // 模块token + "token": "d4f07434c9cf4a989e4c6d301684b357", + // 推送人 + "author": "Jim", + // 打开调试:true/false + "debug": true, + // 是否替换文档,true:替换,false:不替换(追加)。默认:true + "isReplace": true, + // 第三方jar中的class配置 + "jarClass": { + "com.xx.Page": { + "records": { "value": "查询数据列表", "example": "" }, + "total": { "value": "总数", "example": "100" }, + "size": { "value": "页数", "example": "10" }, + "current": { "value": "当前页", "example": "1" }, + "countId": { "hidden": true }, + "orders": { "hidden": true } + } + } +} diff --git a/sop-example/example-story/src/test/java/com/gitee/sop/storyweb/DocPushTest.java b/sop-example/example-story/src/test/java/com/gitee/sop/storyweb/DocPushTest.java new file mode 100644 index 00000000..fbe7c0ed --- /dev/null +++ b/sop-example/example-story/src/test/java/com/gitee/sop/storyweb/DocPushTest.java @@ -0,0 +1,14 @@ +package com.gitee.sop.storyweb; + + +import cn.torna.swaggerplugin.SwaggerPlugin; + +/** + * 推送swagger文档 + * @author thc + */ +public class DocPushTest { + public static void main(String[] args) { + SwaggerPlugin.pushDoc(); + } +} diff --git a/sop-gateway/src/main/java/com/gitee/sop/gateway/dao/entity/ApiInfo.java b/sop-gateway/src/main/java/com/gitee/sop/gateway/dao/entity/ApiInfo.java index 1da2346e..7556e567 100644 --- a/sop-gateway/src/main/java/com/gitee/sop/gateway/dao/entity/ApiInfo.java +++ b/sop-gateway/src/main/java/com/gitee/sop/gateway/dao/entity/ApiInfo.java @@ -1,13 +1,12 @@ package com.gitee.sop.gateway.dao.entity; -import java.time.LocalDateTime; - import com.gitee.fastmybatis.annotation.Pk; import com.gitee.fastmybatis.annotation.PkStrategy; import com.gitee.fastmybatis.annotation.Table; - import lombok.Data; +import java.time.LocalDateTime; + /** * 表名:api_info diff --git a/sop-gateway/src/main/java/com/gitee/sop/gateway/dao/entity/IsvKeys.java b/sop-gateway/src/main/java/com/gitee/sop/gateway/dao/entity/IsvKeys.java index a3f20b5f..23de622c 100644 --- a/sop-gateway/src/main/java/com/gitee/sop/gateway/dao/entity/IsvKeys.java +++ b/sop-gateway/src/main/java/com/gitee/sop/gateway/dao/entity/IsvKeys.java @@ -1,13 +1,12 @@ package com.gitee.sop.gateway.dao.entity; -import java.time.LocalDateTime; - import com.gitee.fastmybatis.annotation.Pk; import com.gitee.fastmybatis.annotation.PkStrategy; import com.gitee.fastmybatis.annotation.Table; - import lombok.Data; +import java.time.LocalDateTime; + /** * 表名:isv_keys diff --git a/sop-gateway/src/main/java/com/gitee/sop/gateway/dao/entity/PermGroupPermission.java b/sop-gateway/src/main/java/com/gitee/sop/gateway/dao/entity/PermGroupPermission.java index 92fdff22..0b6b97a8 100644 --- a/sop-gateway/src/main/java/com/gitee/sop/gateway/dao/entity/PermGroupPermission.java +++ b/sop-gateway/src/main/java/com/gitee/sop/gateway/dao/entity/PermGroupPermission.java @@ -1,13 +1,12 @@ package com.gitee.sop.gateway.dao.entity; -import java.time.LocalDateTime; - import com.gitee.fastmybatis.annotation.Pk; import com.gitee.fastmybatis.annotation.PkStrategy; import com.gitee.fastmybatis.annotation.Table; - import lombok.Data; +import java.time.LocalDateTime; + /** * 表名:perm_group_permission diff --git a/sop-gateway/src/main/java/com/gitee/sop/gateway/dao/entity/PermIsvGroup.java b/sop-gateway/src/main/java/com/gitee/sop/gateway/dao/entity/PermIsvGroup.java index 271adb48..3c379ab2 100644 --- a/sop-gateway/src/main/java/com/gitee/sop/gateway/dao/entity/PermIsvGroup.java +++ b/sop-gateway/src/main/java/com/gitee/sop/gateway/dao/entity/PermIsvGroup.java @@ -1,13 +1,12 @@ package com.gitee.sop.gateway.dao.entity; -import java.time.LocalDateTime; - import com.gitee.fastmybatis.annotation.Pk; import com.gitee.fastmybatis.annotation.PkStrategy; import com.gitee.fastmybatis.annotation.Table; - import lombok.Data; +import java.time.LocalDateTime; + /** * 表名:perm_isv_group diff --git a/sop-gateway/src/main/java/com/gitee/sop/gateway/exception/ControllerGlobalExceptionHandler.java b/sop-gateway/src/main/java/com/gitee/sop/gateway/exception/ControllerGlobalExceptionHandler.java index 4c564d00..b0389697 100644 --- a/sop-gateway/src/main/java/com/gitee/sop/gateway/exception/ControllerGlobalExceptionHandler.java +++ b/sop-gateway/src/main/java/com/gitee/sop/gateway/exception/ControllerGlobalExceptionHandler.java @@ -1,7 +1,7 @@ package com.gitee.sop.gateway.exception; -import com.gitee.sop.gateway.response.ApiResponse; import com.gitee.sop.gateway.message.ErrorEnum; +import com.gitee.sop.gateway.response.ApiResponse; import lombok.extern.slf4j.Slf4j; import org.springframework.validation.BindException; import org.springframework.validation.FieldError; diff --git a/sop-gateway/src/main/java/com/gitee/sop/gateway/interceptor/internal/ResultRouteInterceptor.java b/sop-gateway/src/main/java/com/gitee/sop/gateway/interceptor/internal/ResultRouteInterceptor.java index c999fb6b..2465b46a 100644 --- a/sop-gateway/src/main/java/com/gitee/sop/gateway/interceptor/internal/ResultRouteInterceptor.java +++ b/sop-gateway/src/main/java/com/gitee/sop/gateway/interceptor/internal/ResultRouteInterceptor.java @@ -1,9 +1,9 @@ package com.gitee.sop.gateway.interceptor.internal; import com.gitee.sop.gateway.common.ApiInfoDTO; -import com.gitee.sop.gateway.request.ApiRequestContext; import com.gitee.sop.gateway.interceptor.RouteInterceptor; import com.gitee.sop.gateway.interceptor.RouteInterceptorOrders; +import com.gitee.sop.gateway.request.ApiRequestContext; import com.gitee.sop.support.dto.CommonFileData; import com.gitee.sop.support.dto.FileData; import org.springframework.stereotype.Component; diff --git a/sop-gateway/src/main/java/com/gitee/sop/gateway/service/dubbo/RefreshServiceImpl.java b/sop-gateway/src/main/java/com/gitee/sop/gateway/service/dubbo/RefreshServiceImpl.java index 5fcd65ff..be0768d7 100644 --- a/sop-gateway/src/main/java/com/gitee/sop/gateway/service/dubbo/RefreshServiceImpl.java +++ b/sop-gateway/src/main/java/com/gitee/sop/gateway/service/dubbo/RefreshServiceImpl.java @@ -7,8 +7,8 @@ import com.gitee.sop.gateway.service.manager.SecretManager; import com.gitee.sop.support.service.RefreshService; import lombok.extern.slf4j.Slf4j; import org.apache.dubbo.config.annotation.DubboService; - import org.springframework.beans.factory.annotation.Autowired; + import java.util.Collection; /** diff --git a/sop-gateway/src/main/java/com/gitee/sop/gateway/service/impl/ResultWrapperImpl.java b/sop-gateway/src/main/java/com/gitee/sop/gateway/service/impl/ResultWrapperImpl.java index cb4ed90c..984fa586 100644 --- a/sop-gateway/src/main/java/com/gitee/sop/gateway/service/impl/ResultWrapperImpl.java +++ b/sop-gateway/src/main/java/com/gitee/sop/gateway/service/impl/ResultWrapperImpl.java @@ -11,8 +11,6 @@ import com.gitee.sop.gateway.service.ResultWrapper; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import java.util.Objects; - /** * @author 六如 */ diff --git a/sop-gateway/src/main/java/com/gitee/sop/gateway/service/impl/RouteServiceImpl.java b/sop-gateway/src/main/java/com/gitee/sop/gateway/service/impl/RouteServiceImpl.java index 33fdaea7..e7e897ad 100644 --- a/sop-gateway/src/main/java/com/gitee/sop/gateway/service/impl/RouteServiceImpl.java +++ b/sop-gateway/src/main/java/com/gitee/sop/gateway/service/impl/RouteServiceImpl.java @@ -35,7 +35,6 @@ import java.util.ArrayList; import java.util.Collection; import java.util.Comparator; import java.util.List; -import java.util.Map; import java.util.Objects; import java.util.Optional; diff --git a/sop-gateway/src/main/java/com/gitee/sop/gateway/service/impl/SerdeImpl.java b/sop-gateway/src/main/java/com/gitee/sop/gateway/service/impl/SerdeImpl.java index 376063f5..19e49d97 100644 --- a/sop-gateway/src/main/java/com/gitee/sop/gateway/service/impl/SerdeImpl.java +++ b/sop-gateway/src/main/java/com/gitee/sop/gateway/service/impl/SerdeImpl.java @@ -1,7 +1,6 @@ package com.gitee.sop.gateway.service.impl; import com.alibaba.fastjson2.JSON; -import com.alibaba.fastjson2.JSONObject; import com.alibaba.fastjson2.JSONWriter; import com.fasterxml.jackson.core.JsonProcessingException; import com.gitee.sop.gateway.config.ApiConfig; @@ -11,7 +10,6 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import javax.annotation.PostConstruct; -import java.util.Collections; import java.util.Map; /** @@ -19,7 +17,7 @@ import java.util.Map; */ public class SerdeImpl implements Serde { - static JSONWriter.Context WRITE_CONTEXT; + static JSONWriter.Context writeContext; @Autowired protected ApiConfig apiConfig; @@ -29,7 +27,7 @@ public class SerdeImpl implements Serde { @Override public String toJson(Object object) { - return JSON.toJSONString(object); + return JSON.toJSONString(object, writeContext); } @Override @@ -48,8 +46,8 @@ public class SerdeImpl implements Serde { @PostConstruct public void init() { - WRITE_CONTEXT = new JSONWriter.Context(); - WRITE_CONTEXT.setDateFormat(dateFormat); + writeContext = new JSONWriter.Context(); + writeContext.setDateFormat(dateFormat); this.doInit(); } diff --git a/sop-gateway/src/main/java/com/gitee/sop/gateway/service/manager/impl/LocalIsvApiPermissionManagerImpl.java b/sop-gateway/src/main/java/com/gitee/sop/gateway/service/manager/impl/LocalIsvApiPermissionManagerImpl.java index 84ad00b8..65c28cfa 100644 --- a/sop-gateway/src/main/java/com/gitee/sop/gateway/service/manager/impl/LocalIsvApiPermissionManagerImpl.java +++ b/sop-gateway/src/main/java/com/gitee/sop/gateway/service/manager/impl/LocalIsvApiPermissionManagerImpl.java @@ -10,9 +10,9 @@ import com.gitee.sop.gateway.dao.mapper.PermGroupPermissionMapper; import com.gitee.sop.gateway.dao.mapper.PermIsvGroupMapper; import com.gitee.sop.gateway.service.manager.IsvApiPermissionManager; import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; -import org.springframework.beans.factory.annotation.Autowired; import java.util.Collection; import java.util.Collections; import java.util.HashMap; diff --git a/sop-gateway/src/main/java/com/gitee/sop/gateway/service/manager/impl/LocalIsvManagerImpl.java b/sop-gateway/src/main/java/com/gitee/sop/gateway/service/manager/impl/LocalIsvManagerImpl.java index 5505a4e2..8bdae1ce 100644 --- a/sop-gateway/src/main/java/com/gitee/sop/gateway/service/manager/impl/LocalIsvManagerImpl.java +++ b/sop-gateway/src/main/java/com/gitee/sop/gateway/service/manager/impl/LocalIsvManagerImpl.java @@ -6,9 +6,9 @@ import com.gitee.sop.gateway.service.manager.IsvManager; import com.gitee.sop.gateway.service.manager.dto.IsvDTO; import com.gitee.sop.gateway.util.CopyUtil; import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; -import org.springframework.beans.factory.annotation.Autowired; import java.util.Collection; import java.util.Collections; import java.util.HashMap; diff --git a/sop-gateway/src/main/java/com/gitee/sop/gateway/service/manager/impl/LocalSecretManagerImpl.java b/sop-gateway/src/main/java/com/gitee/sop/gateway/service/manager/impl/LocalSecretManagerImpl.java index e25e9779..901a0e95 100644 --- a/sop-gateway/src/main/java/com/gitee/sop/gateway/service/manager/impl/LocalSecretManagerImpl.java +++ b/sop-gateway/src/main/java/com/gitee/sop/gateway/service/manager/impl/LocalSecretManagerImpl.java @@ -4,9 +4,9 @@ import com.gitee.sop.gateway.dao.entity.IsvKeys; import com.gitee.sop.gateway.dao.mapper.IsvKeysMapper; import com.gitee.sop.gateway.service.manager.SecretManager; import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; -import org.springframework.beans.factory.annotation.Autowired; import java.util.Collection; import java.util.Collections; import java.util.HashMap; diff --git a/sop-gateway/src/main/java/com/gitee/sop/gateway/service/manager/impl/RedisApiManagerImpl.java b/sop-gateway/src/main/java/com/gitee/sop/gateway/service/manager/impl/RedisApiManagerImpl.java index b6203316..0626ed22 100644 --- a/sop-gateway/src/main/java/com/gitee/sop/gateway/service/manager/impl/RedisApiManagerImpl.java +++ b/sop-gateway/src/main/java/com/gitee/sop/gateway/service/manager/impl/RedisApiManagerImpl.java @@ -6,12 +6,12 @@ import com.gitee.sop.gateway.dao.entity.ApiInfo; import com.gitee.sop.gateway.util.CopyUtil; import com.gitee.sop.gateway.util.JsonUtil; import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.BoundHashOperations; import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.util.ObjectUtils; import javax.annotation.PostConstruct; -import org.springframework.beans.factory.annotation.Autowired; import java.util.List; /** diff --git a/sop-gateway/src/main/java/com/gitee/sop/gateway/service/manager/impl/RedisIsvApiPermissionManagerImpl.java b/sop-gateway/src/main/java/com/gitee/sop/gateway/service/manager/impl/RedisIsvApiPermissionManagerImpl.java index 626ca190..c4338911 100644 --- a/sop-gateway/src/main/java/com/gitee/sop/gateway/service/manager/impl/RedisIsvApiPermissionManagerImpl.java +++ b/sop-gateway/src/main/java/com/gitee/sop/gateway/service/manager/impl/RedisIsvApiPermissionManagerImpl.java @@ -7,11 +7,11 @@ import com.gitee.sop.gateway.dao.entity.IsvInfo; import com.gitee.sop.gateway.dao.mapper.IsvInfoMapper; import com.gitee.sop.gateway.util.JsonUtil; import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.BoundHashOperations; import org.springframework.data.redis.core.StringRedisTemplate; import javax.annotation.PostConstruct; -import org.springframework.beans.factory.annotation.Autowired; import java.util.Collections; import java.util.List; import java.util.Map; diff --git a/sop-gateway/src/main/java/com/gitee/sop/gateway/service/manager/impl/RedisIsvManagerImpl.java b/sop-gateway/src/main/java/com/gitee/sop/gateway/service/manager/impl/RedisIsvManagerImpl.java index c95891f4..bdfa5ef9 100644 --- a/sop-gateway/src/main/java/com/gitee/sop/gateway/service/manager/impl/RedisIsvManagerImpl.java +++ b/sop-gateway/src/main/java/com/gitee/sop/gateway/service/manager/impl/RedisIsvManagerImpl.java @@ -7,10 +7,10 @@ import com.gitee.sop.gateway.service.manager.dto.IsvDTO; import com.gitee.sop.gateway.util.CopyUtil; import com.gitee.sop.gateway.util.JsonUtil; import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.StringRedisTemplate; import javax.annotation.PostConstruct; -import org.springframework.beans.factory.annotation.Autowired; import java.util.Collections; import java.util.List; import java.util.Map; diff --git a/sop-gateway/src/main/java/com/gitee/sop/gateway/service/manager/impl/RedisSecretManager.java b/sop-gateway/src/main/java/com/gitee/sop/gateway/service/manager/impl/RedisSecretManager.java index 9aca0b2b..1d19f485 100644 --- a/sop-gateway/src/main/java/com/gitee/sop/gateway/service/manager/impl/RedisSecretManager.java +++ b/sop-gateway/src/main/java/com/gitee/sop/gateway/service/manager/impl/RedisSecretManager.java @@ -4,10 +4,10 @@ import com.gitee.sop.gateway.common.CacheKey; import com.gitee.sop.gateway.common.SopConstants; import com.gitee.sop.gateway.dao.entity.IsvKeys; import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.StringRedisTemplate; import javax.annotation.PostConstruct; -import org.springframework.beans.factory.annotation.Autowired; import java.util.Collections; import java.util.List; import java.util.Map; diff --git a/sop-gateway/src/main/java/com/gitee/sop/gateway/service/validate/AbstractSigner.java b/sop-gateway/src/main/java/com/gitee/sop/gateway/service/validate/AbstractSigner.java index ddc7c8d3..21f10464 100644 --- a/sop-gateway/src/main/java/com/gitee/sop/gateway/service/validate/AbstractSigner.java +++ b/sop-gateway/src/main/java/com/gitee/sop/gateway/service/validate/AbstractSigner.java @@ -1,9 +1,9 @@ package com.gitee.sop.gateway.service.validate; -import com.gitee.sop.gateway.request.ApiRequest; -import com.gitee.sop.gateway.request.ApiRequestContext; import com.gitee.sop.gateway.exception.ApiException; import com.gitee.sop.gateway.message.ErrorEnum; +import com.gitee.sop.gateway.request.ApiRequest; +import com.gitee.sop.gateway.request.ApiRequestContext; import lombok.extern.slf4j.Slf4j; import org.apache.dubbo.common.utils.StringUtils; 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 ccf75a46..8f499a12 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 @@ -17,6 +17,7 @@ import com.gitee.sop.gateway.service.manager.SecretManager; import com.gitee.sop.gateway.service.manager.dto.IsvDTO; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.BooleanUtils; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.util.ObjectUtils; @@ -24,7 +25,6 @@ import org.springframework.util.unit.DataSize; import org.springframework.web.multipart.MultipartFile; import javax.annotation.PostConstruct; -import org.springframework.beans.factory.annotation.Autowired; import java.time.Duration; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; diff --git a/sop-registry/src/main/java/com/gitee/sop/registry/EmbeddedZooKeeper.java b/sop-registry/src/main/java/com/gitee/sop/registry/EmbeddedZooKeeper.java index 562f3407..ca4c485d 100644 --- a/sop-registry/src/main/java/com/gitee/sop/registry/EmbeddedZooKeeper.java +++ b/sop-registry/src/main/java/com/gitee/sop/registry/EmbeddedZooKeeper.java @@ -54,7 +54,7 @@ public class EmbeddedZooKeeper implements SmartLifecycle { /** * Logger. */ - private static final Logger logger = LoggerFactory.getLogger(EmbeddedZooKeeper.class); + private static final Logger LOG = LoggerFactory.getLogger(EmbeddedZooKeeper.class); /** * ZooKeeper client port. This will be determined dynamically upon startup. @@ -196,7 +196,7 @@ public class EmbeddedZooKeeper implements SmartLifecycle { zkServerThread = null; } catch (InterruptedException e) { Thread.currentThread().interrupt(); - logger.warn("Interrupted while waiting for embedded ZooKeeper to exit"); + LOG.warn("Interrupted while waiting for embedded ZooKeeper to exit"); // abandoning zk thread zkServerThread = null; } @@ -251,7 +251,7 @@ public class EmbeddedZooKeeper implements SmartLifecycle { if (errorHandler != null) { errorHandler.handleError(e); } else { - logger.error("Exception running embedded ZooKeeper", e); + LOG.error("Exception running embedded ZooKeeper", e); } } } diff --git a/sop-registry/src/main/java/com/gitee/sop/registry/RegistryMain.java b/sop-registry/src/main/java/com/gitee/sop/registry/RegistryMain.java index c937ec88..779ff877 100644 --- a/sop-registry/src/main/java/com/gitee/sop/registry/RegistryMain.java +++ b/sop-registry/src/main/java/com/gitee/sop/registry/RegistryMain.java @@ -1,17 +1,22 @@ package com.gitee.sop.registry; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + /** * @author 六如 */ public class RegistryMain { + private static final Logger LOG = LoggerFactory.getLogger(RegistryMain.class); + /* 内置简单的注册中心,基于zookeeper,用来开发演示使用. 生产环境不可使用! */ public static void main(String[] args) { int zkPort = 2181; - System.out.println("启动内置zookeeper注册中心(仅在开发环境下使用),port=" + zkPort); + LOG.warn("启动内置zookeeper注册中心(仅在开发环境下使用),port={}", zkPort); new EmbeddedZooKeeper(zkPort, false).start(); } } diff --git a/sop-sdk/sdk-csharp/SDKCSharp/Program.cs b/sop-sdk/sdk-csharp/SDKCSharp/Program.cs index 7c3f4592..d4966d6a 100644 --- a/sop-sdk/sdk-csharp/SDKCSharp/Program.cs +++ b/sop-sdk/sdk-csharp/SDKCSharp/Program.cs @@ -14,9 +14,11 @@ namespace SDKTest class MainClass { static string url = "http://localhost:8081/api"; - static string appId = "201904035630907729292csharp"; + //static string appId = "201904035630907729292csharp"; + static string appId = "202412201319756154208780288"; // 开发者私钥, PKCS1 2048 - static string privateKey = "MIIEowIBAAKCAQEA5+OvJxeSzf44NxQ/cl7Ii+BzPg2k6sRcvH4ffOtU5Dzq1/oEvg02nxIhmwOHBZmjbmuUu0aLsfglUTAwqfXftfAKZidshsgj9NNh0/kxk0avRZ1UoljWGz/FxVZA0ogbxxhohPZ9jWcD+eBQcIwF2DtHfAJqWWZrYFnCMeHD8mPzxo2kwXSvDzi0vf9I2tKiYvNG26a9FqeYtPOoi81sdS3+70HOMdxP8ejXtyfnKpKz7Dx506LCIRS5moWS3Q5eTLV3NGX/1CSJ8wpQA2DAQTjVhX5eVu7Yqz12t8W+sjWM/tHUR6cgwYYR10p7tSCeCPzkigjGxKm4cYXWtATQJQIDAQABAoIBAHFDsgrrJca+NKEan77ycwx3jnKx4WrWjOF4zVKL9AQjiSYDNgvKknJyPb3kpC/lEoHdxGERHSzJoxib7DkoIqRQYhPxj73pxj5QfYk3P7LLJNNg/LTrpXDb3nL8JV9wIflGf87qQvstZTDJEyFWE4jBs7Hr0BxovWvri8InnzkmERJ1cbGJgNHe1Y3Zo2tw0yaHxQCxLuajP+notRZhD9bEp7uKeI0w9AvlW6k8m/7y10F0BK/TlyW8rQiEC391yOiRYoMcUh4hd2Q9bMx3jngZgX8PXIvZZcup4/pvWlv1alwhB2tsnLdazP62r1MO80vLyLunzGO+7WwCjEYlVaECgYEA+lQRFmbhKaPuAuXMtY31Fbga8nedka5TjnEV7+/kX+yowE2OlNujF+ZG8UTddTxAGv56yVNi/mjRlgD74j8z0eOsgvOq9mwbCrgLhLo51H9O/wAxtb+hBKtC5l50pBr4gER6d8W6EQNTSGojnMIaLXTkAZ5Qf6Z8e2HFVdOn0X0CgYEA7SSrTokwzukt5KldNu5ukyyd+C3D1i6orbg6qD73EP9CfNMfGSBn7dDv9wMSJH01+Ty+RgTROgtjGRDbMJWnfbdt/61NePr9ar5sb6Nbsf7/I0w7cZF5dsaFYgzaOfQYquzXPbLQHkpMT64bqpv/Mwy4F2lFvaYWY5fA4pC2uckCgYEAg75Ym9ybJaoTqky8ttQ2Jy8UZ4VSVQhVC0My02sCWwWXLlXi8y7An+Rec73Ve0yxREOn5WrQT6pkmzh7V/ABWrYi5WxODpCIjtSbo0fLBa3Wqle00b0/hdCITetqIa/cFs1zUrOqICgK3bKWeXqiAkhhcwSZwwSgwOKM04Wn7ZUCgYBvhHX2mbdVJfyJ8kc+hMOE/E9RHRxiBVEXWHJlGi8PVCqNDq8qHr4g7Mdbzprig+s0yKblwHAvrpkseWvKHiZEjVTyDipHgShY4TGXEigVvUd37uppTrLi8xpYcJjS9gH/px7VCdiq1d+q/MJP6coJ1KphgATm2UrgDMYNBWaYWQKBgEHRxrmER7btUF60/YgcqPHFc8RpYQB2ZZE0kyKGDqk2Data1XYUY6vsPAU28yRLAaWr/D2H17iyLkxP80VLm6QhifxCadv90Q/Wl1DFfOJQMW6avyQ0so6G0wFq/LJxaFK4iLXQn1RJnmTp6BYiJMmK2BhFbRzw8ssMoF6ad2rr"; + //static string privateKey = "MIIEowIBAAKCAQEA5+OvJxeSzf44NxQ/cl7Ii+BzPg2k6sRcvH4ffOtU5Dzq1/oEvg02nxIhmwOHBZmjbmuUu0aLsfglUTAwqfXftfAKZidshsgj9NNh0/kxk0avRZ1UoljWGz/FxVZA0ogbxxhohPZ9jWcD+eBQcIwF2DtHfAJqWWZrYFnCMeHD8mPzxo2kwXSvDzi0vf9I2tKiYvNG26a9FqeYtPOoi81sdS3+70HOMdxP8ejXtyfnKpKz7Dx506LCIRS5moWS3Q5eTLV3NGX/1CSJ8wpQA2DAQTjVhX5eVu7Yqz12t8W+sjWM/tHUR6cgwYYR10p7tSCeCPzkigjGxKm4cYXWtATQJQIDAQABAoIBAHFDsgrrJca+NKEan77ycwx3jnKx4WrWjOF4zVKL9AQjiSYDNgvKknJyPb3kpC/lEoHdxGERHSzJoxib7DkoIqRQYhPxj73pxj5QfYk3P7LLJNNg/LTrpXDb3nL8JV9wIflGf87qQvstZTDJEyFWE4jBs7Hr0BxovWvri8InnzkmERJ1cbGJgNHe1Y3Zo2tw0yaHxQCxLuajP+notRZhD9bEp7uKeI0w9AvlW6k8m/7y10F0BK/TlyW8rQiEC391yOiRYoMcUh4hd2Q9bMx3jngZgX8PXIvZZcup4/pvWlv1alwhB2tsnLdazP62r1MO80vLyLunzGO+7WwCjEYlVaECgYEA+lQRFmbhKaPuAuXMtY31Fbga8nedka5TjnEV7+/kX+yowE2OlNujF+ZG8UTddTxAGv56yVNi/mjRlgD74j8z0eOsgvOq9mwbCrgLhLo51H9O/wAxtb+hBKtC5l50pBr4gER6d8W6EQNTSGojnMIaLXTkAZ5Qf6Z8e2HFVdOn0X0CgYEA7SSrTokwzukt5KldNu5ukyyd+C3D1i6orbg6qD73EP9CfNMfGSBn7dDv9wMSJH01+Ty+RgTROgtjGRDbMJWnfbdt/61NePr9ar5sb6Nbsf7/I0w7cZF5dsaFYgzaOfQYquzXPbLQHkpMT64bqpv/Mwy4F2lFvaYWY5fA4pC2uckCgYEAg75Ym9ybJaoTqky8ttQ2Jy8UZ4VSVQhVC0My02sCWwWXLlXi8y7An+Rec73Ve0yxREOn5WrQT6pkmzh7V/ABWrYi5WxODpCIjtSbo0fLBa3Wqle00b0/hdCITetqIa/cFs1zUrOqICgK3bKWeXqiAkhhcwSZwwSgwOKM04Wn7ZUCgYBvhHX2mbdVJfyJ8kc+hMOE/E9RHRxiBVEXWHJlGi8PVCqNDq8qHr4g7Mdbzprig+s0yKblwHAvrpkseWvKHiZEjVTyDipHgShY4TGXEigVvUd37uppTrLi8xpYcJjS9gH/px7VCdiq1d+q/MJP6coJ1KphgATm2UrgDMYNBWaYWQKBgEHRxrmER7btUF60/YgcqPHFc8RpYQB2ZZE0kyKGDqk2Data1XYUY6vsPAU28yRLAaWr/D2H17iyLkxP80VLm6QhifxCadv90Q/Wl1DFfOJQMW6avyQ0so6G0wFq/LJxaFK4iLXQn1RJnmTp6BYiJMmK2BhFbRzw8ssMoF6ad2rr"; + static string privateKey = "MIIEowIBAAKCAQEAuepmAe0+vzqPjxGWDJcOSFIfkpYzbyOk34a2wDXgplZDVpxdJOcSxj7qgdHrMNIlLoiUzz2Xk+sWG9eY7ILqvonq8aPp83XvLQwfTH7hkoC0DxW8QfhBNaGjPdO4BwAbT1CbgDgCBNQhmkaFYVxNPWY7f9Lk2n2X1vObzXrHqTGGW8g2jnwtr2009GL6qFThmZOy6MfTCY5fidTYXve/FXIW60OrmSBtWnvrrgnoTTShcWqFZHAx0kfaSDmcgnd0Bo82biAyhoqamdZ6NmggoHFjeTkTTqSIcRhsxESi2mXzF3KGmRu2hULWh9kXzpudwbuN1x/La+gLM0Ywecai3QIDAQABAoIBAAghWginiWDvfKuzBy7RxEwhW0Qb0XAAzQsBZyiMsqBTkWpOODyO5mFJCxRWS8S8y+d3DZrqhKBxXWwmR4fASee/PEkI9AgzlhwQNaYwvkib3EP0nWD9LEzeHrdrdNbJiGg1jDdVO7FeXYHTp62UTcRrnhp+7IcpiuRZjuyze9vIPWW+6rL5qbBX+MCvLKNc2WyHaSSmafwDl3o/ZQdlAui6iHeM5H7DA7tSaCIylXAFj/iY4NkENcJY6kmcwXip2pxTIG/Cszi0NZ6ZXHOlbb37KWJFGKF15E/5o6pDYXgKQw+RrTHhKfwu7C8ZNiDJizAESHrhdY6PhpunldAs+4ECgYEA+sFJbBRUYTyAsWnsU+iAGe1P4G7tzzhGrb5LZ6X9gzg2JEFCgGOR6Q9isGHjlbIsiuy0qz3J3yUZJgKp4dYCl7aUO+WNiSU1CzcIZFucEwAAfLR6e6JjIqLjOVf3lEVzMuVnZGdoeG+ScVDQKeC0mWx4QgSdCDS1oCM678yzl80CgYEAvc3q1QbldimH1o2BybdNS7978kUDC/864J1eRcbohU+eGLVRBQKB96sypeUvd1pFuLcDQWr6CervDKeLhgZgM9VGHuXnQJFw3TQXPIfqekvcUxQy/UXYMgKOMuVUZ8cr/3OKcKjTO3ac49+NYBWXV8zTD98zOdW88XpSOQQBB1ECgYBCRd2K5CCdBmmY+j7MunFI6PCoh4jwsJX1i4rQXQ2QpcWhdWIHHsnMiBV0Opr00H93RDJH4++7u0lXQ3L0ziQnRskMv5HVwnCvgx8DrzajyudWDjkk/fkniVd2q2oy1Nwqgnj+D1qMIijZLBuoRcxVlFaAVEnQhmXOaiFEiZyZrQKBgQCKr0EdMpLLSgE1JeRljYfvBxT7qq1VQMK2iIXvmi0f61LrXuC6NmDcpLy3NsT+AnnbQ+4fCJl2UbEln+50mYgFl5pKzVWxehPrrTolQnJztaZhFetD4Jrdv7xDOAn6Yi+l0bigJNtjIYH1hsz4Hg6dWs4FVONLKP+LugMGIgTWYQKBgCPzZil24ZD4QmUtxZXTe17xmJrAekIpJ0n3B4WT+nuXAHiV3L8WD6VSh0T6HJXI/4m4NGdenEYqAp4wbAHxJshaFsoHgdt9ndX1SJ8JZ/VhjeEKx7xV5s5gHLFXWsnOsrByifj2KS2lLujxJuZYoA2cHUE0kvaa2mV4rg+trUuF"; // 开放平台给的公钥 // 前往SOP-ADMIN,ISV管理--秘钥管理,选择PKCS1,生成平台提供的公私钥,然后把【平台公钥】放到这里 static string publicKeyPlatform = ""; diff --git a/sop-test/pom.xml b/sop-test/pom.xml index b2e41676..30ba8448 100644 --- a/sop-test/pom.xml +++ b/sop-test/pom.xml @@ -4,15 +4,13 @@ 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 - sop-parent - 5.0.0-SNAPSHOT - + com.gitee.sop sop-test 5.0.0-SNAPSHOT + 8 + 8 UTF-8 1.8 @@ -42,7 +40,7 @@ org.projectlombok lombok - 1.18.6 + 1.18.34 provided @@ -60,7 +58,7 @@ org.apache.maven.plugins maven-compiler-plugin - 3.3 + 3.1 ${java.version} ${java.version} diff --git a/sop-test/src/main/java/com/gitee/sop/test/Client.java b/sop-test/src/main/java/com/gitee/sop/test/Client.java index 7cb2d014..4550aa22 100644 --- a/sop-test/src/main/java/com/gitee/sop/test/Client.java +++ b/sop-test/src/main/java/com/gitee/sop/test/Client.java @@ -1,8 +1,8 @@ package com.gitee.sop.test; import com.alibaba.fastjson.JSON; -import com.gitee.sop.test.alipay.AlipayApiException; -import com.gitee.sop.test.alipay.AlipaySignature; +import com.gitee.sop.test.sign.AlipayApiException; +import com.gitee.sop.test.sign.AlipaySignature; import lombok.Data; import java.io.File; @@ -10,7 +10,6 @@ import java.io.IOException; import java.io.InputStream; import java.text.SimpleDateFormat; import java.util.ArrayList; -import java.util.Collections; import java.util.Date; import java.util.HashMap; import java.util.List; @@ -296,7 +295,8 @@ public class Client { /** * 添加系统参数 - * @param name 参数名 + * + * @param name 参数名 * @param value 参数值 * @return 返回RequestBuilder */ diff --git a/sop-test/src/main/java/com/gitee/sop/test/alipay/AlipaySignature.java b/sop-test/src/main/java/com/gitee/sop/test/alipay/AlipaySignature.java deleted file mode 100644 index 913242ad..00000000 --- a/sop-test/src/main/java/com/gitee/sop/test/alipay/AlipaySignature.java +++ /dev/null @@ -1,611 +0,0 @@ -/** - * Alipay.com Inc. - * Copyright (c) 2004-2012 All Rights Reserved. - */ -package com.gitee.sop.test.alipay; - - -import org.apache.commons.codec.binary.Base64; - -import javax.crypto.Cipher; -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.io.StringWriter; -import java.security.KeyFactory; -import java.security.PrivateKey; -import java.security.PublicKey; -import java.security.spec.InvalidKeySpecException; -import java.security.spec.PKCS8EncodedKeySpec; -import java.security.spec.X509EncodedKeySpec; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.Map; - -/** - * - * @author runzhi - */ -public class AlipaySignature { - - /** RSA最大加密明文大小 */ - private static final int MAX_ENCRYPT_BLOCK = 117; - - /** RSA最大解密密文大小 */ - private static final int MAX_DECRYPT_BLOCK = 128; - - - - /** - * - * @param sortedParams - * @return - */ - public static String getSignContent(Map sortedParams) { - StringBuffer content = new StringBuffer(); - List keys = new ArrayList(sortedParams.keySet()); - Collections.sort(keys); - int index = 0; - for (int i = 0; i < keys.size(); i++) { - String key = keys.get(i); - String value = sortedParams.get(key); - if (StringUtils.areNotEmpty(key, value)) { - content.append((index == 0 ? "" : "&") + key + "=" + value); - index++; - } - } - return content.toString(); - } - - /** - * rsa内容签名 - * - * @param content - * @param privateKey - * @param charset - * @return - * @throws AlipayApiException - */ - public static String rsaSign(String content, String privateKey, String charset, - String signType) throws AlipayApiException { - - if (AlipayConstants.SIGN_TYPE_RSA.equals(signType)) { - - return rsaSign(content, privateKey, charset); - } else if (AlipayConstants.SIGN_TYPE_RSA2.equals(signType)) { - - return rsa256Sign(content, privateKey, charset); - } else { - - throw new AlipayApiException("Sign Type is Not Support : signType=" + signType); - } - - } - - /** - * sha256WithRsa 加签 - * - * @param content - * @param privateKey - * @param charset - * @return - * @throws AlipayApiException - */ - public static String rsa256Sign(String content, String privateKey, - String charset) throws AlipayApiException { - - try { - PrivateKey priKey = getPrivateKeyFromPKCS8(AlipayConstants.SIGN_TYPE_RSA, - new ByteArrayInputStream(privateKey.getBytes())); - - java.security.Signature signature = java.security.Signature - .getInstance(AlipayConstants.SIGN_SHA256RSA_ALGORITHMS); - - signature.initSign(priKey); - - if (StringUtils.isEmpty(charset)) { - signature.update(content.getBytes()); - } else { - signature.update(content.getBytes(charset)); - } - - byte[] signed = signature.sign(); - - return new String(Base64.encodeBase64(signed)); - } catch (Exception e) { - throw new AlipayApiException("RSAcontent = " + content + "; charset = " + charset, e); - } - - } - - /** - * sha1WithRsa 加签 - * - * @param content - * @param privateKey - * @param charset - * @return - * @throws AlipayApiException - */ - public static String rsaSign(String content, String privateKey, - String charset) throws AlipayApiException { - try { - PrivateKey priKey = getPrivateKeyFromPKCS8(AlipayConstants.SIGN_TYPE_RSA, - new ByteArrayInputStream(privateKey.getBytes())); - - java.security.Signature signature = java.security.Signature - .getInstance(AlipayConstants.SIGN_ALGORITHMS); - - signature.initSign(priKey); - - if (StringUtils.isEmpty(charset)) { - signature.update(content.getBytes()); - } else { - signature.update(content.getBytes(charset)); - } - - byte[] signed = signature.sign(); - - return new String(Base64.encodeBase64(signed)); - } catch (InvalidKeySpecException ie) { - throw new AlipayApiException("RSA私钥格式不正确,请检查是否正确配置了PKCS8格式的私钥", ie); - } catch (Exception e) { - throw new AlipayApiException("RSAcontent = " + content + "; charset = " + charset, e); - } - } - - public static String rsaSign(Map params, String privateKey, - String charset) throws AlipayApiException { - String signContent = getSignContent(params); - - return rsaSign(signContent, privateKey, charset); - - } - - public static PrivateKey getPrivateKeyFromPKCS8(String algorithm, - InputStream ins) throws Exception { - if (ins == null || StringUtils.isEmpty(algorithm)) { - return null; - } - - KeyFactory keyFactory = KeyFactory.getInstance(algorithm); - - byte[] encodedKey = StreamUtil.readText(ins).getBytes(); - - encodedKey = Base64.decodeBase64(encodedKey); - - return keyFactory.generatePrivate(new PKCS8EncodedKeySpec(encodedKey)); - } - - public static String getSignCheckContentV1(Map params) { - if (params == null) { - return null; - } - - params.remove("sign"); - params.remove("sign_type"); - - StringBuffer content = new StringBuffer(); - List keys = new ArrayList(params.keySet()); - Collections.sort(keys); - - for (int i = 0; i < keys.size(); i++) { - String key = keys.get(i); - String value = params.get(key); - content.append((i == 0 ? "" : "&") + key + "=" + value); - } - - return content.toString(); - } - - public static String getSignCheckContentV2(Map params) { - if (params == null) { - return null; - } - - params.remove("sign"); - - StringBuffer content = new StringBuffer(); - List keys = new ArrayList(params.keySet()); - Collections.sort(keys); - - for (int i = 0; i < keys.size(); i++) { - String key = keys.get(i); - String value = params.get(key); - content.append((i == 0 ? "" : "&") + key + "=" + value); - } - - return content.toString(); - } - - public static boolean rsaCheckV1(Map params, String publicKey, - String charset) throws AlipayApiException { - String sign = params.get("sign"); - String content = getSignCheckContentV1(params); - - return rsaCheckContent(content, sign, publicKey, charset); - } - - public static boolean rsaCheckV1(Map params, String publicKey, - String charset,String signType) throws AlipayApiException { - String sign = params.get("sign"); - String content = getSignCheckContentV1(params); - - return rsaCheck(content, sign, publicKey, charset,signType); - } - - public static boolean rsaCheckV2(Map params, String publicKey, - String charset) throws AlipayApiException { - String sign = params.get("sign"); - String content = getSignCheckContentV2(params); - - return rsaCheckContent(content, sign, publicKey, charset); - } - - public static boolean rsaCheckV2(Map params, String publicKey, - String charset,String signType) throws AlipayApiException { - String sign = params.get("sign"); - String content = getSignCheckContentV2(params); - - return rsaCheck(content, sign, publicKey, charset,signType); - } - - public static boolean rsaCheck(String content, String sign, String publicKey, String charset, - String signType) throws AlipayApiException { - - if (AlipayConstants.SIGN_TYPE_RSA.equals(signType)) { - - return rsaCheckContent(content, sign, publicKey, charset); - - } else if (AlipayConstants.SIGN_TYPE_RSA2.equals(signType)) { - - return rsa256CheckContent(content, sign, publicKey, charset); - - } else { - - throw new AlipayApiException("Sign Type is Not Support : signType=" + signType); - } - - } - - public static boolean rsa256CheckContent(String content, String sign, String publicKey, - String charset) throws AlipayApiException { - try { - PublicKey pubKey = getPublicKeyFromX509("RSA", - new ByteArrayInputStream(publicKey.getBytes())); - - java.security.Signature signature = java.security.Signature - .getInstance(AlipayConstants.SIGN_SHA256RSA_ALGORITHMS); - - signature.initVerify(pubKey); - - if (StringUtils.isEmpty(charset)) { - signature.update(content.getBytes()); - } else { - signature.update(content.getBytes(charset)); - } - - return signature.verify(Base64.decodeBase64(sign.getBytes())); - } catch (Exception e) { - throw new AlipayApiException( - "RSAcontent = " + content + ",sign=" + sign + ",charset = " + charset, e); - } - } - - public static boolean rsaCheckContent(String content, String sign, String publicKey, - String charset) throws AlipayApiException { - try { - PublicKey pubKey = getPublicKeyFromX509("RSA", - new ByteArrayInputStream(publicKey.getBytes())); - - java.security.Signature signature = java.security.Signature - .getInstance(AlipayConstants.SIGN_ALGORITHMS); - - signature.initVerify(pubKey); - - if (StringUtils.isEmpty(charset)) { - signature.update(content.getBytes()); - } else { - signature.update(content.getBytes(charset)); - } - - return signature.verify(Base64.decodeBase64(sign.getBytes())); - } catch (Exception e) { - throw new AlipayApiException( - "RSAcontent = " + content + ",sign=" + sign + ",charset = " + charset, e); - } - } - - public static PublicKey getPublicKeyFromX509(String algorithm, - InputStream ins) throws Exception { - KeyFactory keyFactory = KeyFactory.getInstance(algorithm); - - StringWriter writer = new StringWriter(); - StreamUtil.io(new InputStreamReader(ins), writer); - - byte[] encodedKey = writer.toString().getBytes(); - - encodedKey = Base64.decodeBase64(encodedKey); - - return keyFactory.generatePublic(new X509EncodedKeySpec(encodedKey)); - } - - /** - * 验签并解密 - *

- * 目前适用于公众号
- * params参数示例: - *
{ - *
biz_content=M0qGiGz+8kIpxe8aF4geWJdBn0aBTuJRQItLHo9R7o5JGhpic/MIUjvXo2BLB++BbkSq2OsJCEQFDZ0zK5AJYwvBgeRX30gvEj6eXqXRt16/IkB9HzAccEqKmRHrZJ7PjQWE0KfvDAHsJqFIeMvEYk1Zei2QkwSQPlso7K0oheo/iT+HYE8aTATnkqD/ByD9iNDtGg38pCa2xnnns63abKsKoV8h0DfHWgPH62urGY7Pye3r9FCOXA2Ykm8X4/Bl1bWFN/PFCEJHWe/HXj8KJKjWMO6ttsoV0xRGfeyUO8agu6t587Dl5ux5zD/s8Lbg5QXygaOwo3Fz1G8EqmGhi4+soEIQb8DBYanQOS3X+m46tVqBGMw8Oe+hsyIMpsjwF4HaPKMr37zpW3fe7xOMuimbZ0wq53YP/jhQv6XWodjT3mL0H5ACqcsSn727B5ztquzCPiwrqyjUHjJQQefFTzOse8snaWNQTUsQS7aLsHq0FveGpSBYORyA90qPdiTjXIkVP7mAiYiAIWW9pCEC7F3XtViKTZ8FRMM9ySicfuAlf3jtap6v2KPMtQv70X+hlmzO/IXB6W0Ep8DovkF5rB4r/BJYJLw/6AS0LZM9w5JfnAZhfGM2rKzpfNsgpOgEZS1WleG4I2hoQC0nxg9IcP0Hs+nWIPkEUcYNaiXqeBc=, - *
sign=rlqgA8O+RzHBVYLyHmrbODVSANWPXf3pSrr82OCO/bm3upZiXSYrX5fZr6UBmG6BZRAydEyTIguEW6VRuAKjnaO/sOiR9BsSrOdXbD5Rhos/Xt7/mGUWbTOt/F+3W0/XLuDNmuYg1yIC/6hzkg44kgtdSTsQbOC9gWM7ayB4J4c=, - * sign_type=RSA, - *
charset=UTF-8 - *
} - *

- * @param params - * @param alipayPublicKey 平台公钥 - * @param cusPrivateKey 商户私钥 - * @param isCheckSign 是否验签 - * @param isDecrypt 是否解密 - * @return 解密后明文,验签失败则异常抛出 - * @throws AlipayApiException - */ - public static String checkSignAndDecrypt(Map params, String alipayPublicKey, - String cusPrivateKey, boolean isCheckSign, - boolean isDecrypt) throws AlipayApiException { - String charset = params.get("charset"); - String bizContent = params.get("biz_content"); - if (isCheckSign) { - if (!rsaCheckV2(params, alipayPublicKey, charset)) { - throw new AlipayApiException("rsaCheck failure:rsaParams=" + params); - } - } - - if (isDecrypt) { - return rsaDecrypt(bizContent, cusPrivateKey, charset); - } - - return bizContent; - } - - /** - * 验签并解密 - *

- * 目前适用于公众号
- * params参数示例: - *
{ - *
biz_content=M0qGiGz+8kIpxe8aF4geWJdBn0aBTuJRQItLHo9R7o5JGhpic/MIUjvXo2BLB++BbkSq2OsJCEQFDZ0zK5AJYwvBgeRX30gvEj6eXqXRt16/IkB9HzAccEqKmRHrZJ7PjQWE0KfvDAHsJqFIeMvEYk1Zei2QkwSQPlso7K0oheo/iT+HYE8aTATnkqD/ByD9iNDtGg38pCa2xnnns63abKsKoV8h0DfHWgPH62urGY7Pye3r9FCOXA2Ykm8X4/Bl1bWFN/PFCEJHWe/HXj8KJKjWMO6ttsoV0xRGfeyUO8agu6t587Dl5ux5zD/s8Lbg5QXygaOwo3Fz1G8EqmGhi4+soEIQb8DBYanQOS3X+m46tVqBGMw8Oe+hsyIMpsjwF4HaPKMr37zpW3fe7xOMuimbZ0wq53YP/jhQv6XWodjT3mL0H5ACqcsSn727B5ztquzCPiwrqyjUHjJQQefFTzOse8snaWNQTUsQS7aLsHq0FveGpSBYORyA90qPdiTjXIkVP7mAiYiAIWW9pCEC7F3XtViKTZ8FRMM9ySicfuAlf3jtap6v2KPMtQv70X+hlmzO/IXB6W0Ep8DovkF5rB4r/BJYJLw/6AS0LZM9w5JfnAZhfGM2rKzpfNsgpOgEZS1WleG4I2hoQC0nxg9IcP0Hs+nWIPkEUcYNaiXqeBc=, - *
sign=rlqgA8O+RzHBVYLyHmrbODVSANWPXf3pSrr82OCO/bm3upZiXSYrX5fZr6UBmG6BZRAydEyTIguEW6VRuAKjnaO/sOiR9BsSrOdXbD5Rhos/Xt7/mGUWbTOt/F+3W0/XLuDNmuYg1yIC/6hzkg44kgtdSTsQbOC9gWM7ayB4J4c=, - * sign_type=RSA, - *
charset=UTF-8 - *
} - *

- * @param params - * @param alipayPublicKey 平台公钥 - * @param cusPrivateKey 商户私钥 - * @param isCheckSign 是否验签 - * @param isDecrypt 是否解密 - * @return 解密后明文,验签失败则异常抛出 - * @throws AlipayApiException - */ - public static String checkSignAndDecrypt(Map params, String alipayPublicKey, - String cusPrivateKey, boolean isCheckSign, - boolean isDecrypt, String signType) throws AlipayApiException { - String charset = params.get("charset"); - String bizContent = params.get("biz_content"); - if (isCheckSign) { - if (!rsaCheckV2(params, alipayPublicKey, charset,signType)) { - throw new AlipayApiException("rsaCheck failure:rsaParams=" + params); - } - } - - if (isDecrypt) { - return rsaDecrypt(bizContent, cusPrivateKey, charset); - } - - return bizContent; - } - - /** - * 加密并签名
- * 目前适用于公众号 - * @param bizContent 待加密、签名内容 - * @param alipayPublicKey 平台公钥 - * @param cusPrivateKey 商户私钥 - * @param charset 字符集,如UTF-8, GBK, GB2312 - * @param isEncrypt 是否加密,true-加密 false-不加密 - * @param isSign 是否签名,true-签名 false-不签名 - * @return 加密、签名后xml内容字符串 - *

- * 返回示例: - * - * 密文 - * RSA - * sign - * RSA - * - *

- * @throws AlipayApiException - */ - public static String encryptAndSign(String bizContent, String alipayPublicKey, - String cusPrivateKey, String charset, boolean isEncrypt, - boolean isSign) throws AlipayApiException { - StringBuilder sb = new StringBuilder(); - if (StringUtils.isEmpty(charset)) { - charset = AlipayConstants.CHARSET_GBK; - } - sb.append(""); - if (isEncrypt) {// 加密 - sb.append(""); - String encrypted = rsaEncrypt(bizContent, alipayPublicKey, charset); - sb.append("" + encrypted + ""); - sb.append("RSA"); - if (isSign) { - String sign = rsaSign(encrypted, cusPrivateKey, charset); - sb.append("" + sign + ""); - sb.append("RSA"); - } - sb.append(""); - } else if (isSign) {// 不加密,但需要签名 - sb.append(""); - sb.append("" + bizContent + ""); - String sign = rsaSign(bizContent, cusPrivateKey, charset); - sb.append("" + sign + ""); - sb.append("RSA"); - sb.append(""); - } else {// 不加密,不加签 - sb.append(bizContent); - } - return sb.toString(); - } - - /** - * 加密并签名
- * 目前适用于公众号 - * @param bizContent 待加密、签名内容 - * @param alipayPublicKey 平台公钥 - * @param cusPrivateKey 商户私钥 - * @param charset 字符集,如UTF-8, GBK, GB2312 - * @param isEncrypt 是否加密,true-加密 false-不加密 - * @param isSign 是否签名,true-签名 false-不签名 - * @return 加密、签名后xml内容字符串 - *

- * 返回示例: - * - * 密文 - * RSA - * sign - * RSA - * - *

- * @throws AlipayApiException - */ - public static String encryptAndSign(String bizContent, String alipayPublicKey, - String cusPrivateKey, String charset, boolean isEncrypt, - boolean isSign,String signType) throws AlipayApiException { - StringBuilder sb = new StringBuilder(); - if (StringUtils.isEmpty(charset)) { - charset = AlipayConstants.CHARSET_GBK; - } - sb.append(""); - if (isEncrypt) {// 加密 - sb.append(""); - String encrypted = rsaEncrypt(bizContent, alipayPublicKey, charset); - sb.append("" + encrypted + ""); - sb.append("RSA"); - if (isSign) { - String sign = rsaSign(encrypted, cusPrivateKey, charset, signType); - sb.append("" + sign + ""); - sb.append(""); - sb.append(signType); - sb.append(""); - } - sb.append(""); - } else if (isSign) {// 不加密,但需要签名 - sb.append(""); - sb.append("" + bizContent + ""); - String sign = rsaSign(bizContent, cusPrivateKey, charset, signType); - sb.append("" + sign + ""); - sb.append(""); - sb.append(signType); - sb.append(""); - sb.append(""); - } else {// 不加密,不加签 - sb.append(bizContent); - } - return sb.toString(); - } - - /** - * 公钥加密 - * - * @param content 待加密内容 - * @param publicKey 公钥 - * @param charset 字符集,如UTF-8, GBK, GB2312 - * @return 密文内容 - * @throws AlipayApiException - */ - public static String rsaEncrypt(String content, String publicKey, - String charset) throws AlipayApiException { - try { - PublicKey pubKey = getPublicKeyFromX509(AlipayConstants.SIGN_TYPE_RSA, - new ByteArrayInputStream(publicKey.getBytes())); - Cipher cipher = Cipher.getInstance(AlipayConstants.SIGN_TYPE_RSA); - cipher.init(Cipher.ENCRYPT_MODE, pubKey); - byte[] data = StringUtils.isEmpty(charset) ? content.getBytes() - : content.getBytes(charset); - int inputLen = data.length; - ByteArrayOutputStream out = new ByteArrayOutputStream(); - int offSet = 0; - byte[] cache; - int i = 0; - // 对数据分段加密 - while (inputLen - offSet > 0) { - if (inputLen - offSet > MAX_ENCRYPT_BLOCK) { - cache = cipher.doFinal(data, offSet, MAX_ENCRYPT_BLOCK); - } else { - cache = cipher.doFinal(data, offSet, inputLen - offSet); - } - out.write(cache, 0, cache.length); - i++; - offSet = i * MAX_ENCRYPT_BLOCK; - } - byte[] encryptedData = Base64.encodeBase64(out.toByteArray()); - out.close(); - - return StringUtils.isEmpty(charset) ? new String(encryptedData) - : new String(encryptedData, charset); - } catch (Exception e) { - throw new AlipayApiException("EncryptContent = " + content + ",charset = " + charset, - e); - } - } - - /** - * 私钥解密 - * - * @param content 待解密内容 - * @param privateKey 私钥 - * @param charset 字符集,如UTF-8, GBK, GB2312 - * @return 明文内容 - * @throws AlipayApiException - */ - public static String rsaDecrypt(String content, String privateKey, - String charset) throws AlipayApiException { - try { - PrivateKey priKey = getPrivateKeyFromPKCS8(AlipayConstants.SIGN_TYPE_RSA, - new ByteArrayInputStream(privateKey.getBytes())); - Cipher cipher = Cipher.getInstance(AlipayConstants.SIGN_TYPE_RSA); - cipher.init(Cipher.DECRYPT_MODE, priKey); - byte[] encryptedData = StringUtils.isEmpty(charset) - ? Base64.decodeBase64(content.getBytes()) - : Base64.decodeBase64(content.getBytes(charset)); - int inputLen = encryptedData.length; - ByteArrayOutputStream out = new ByteArrayOutputStream(); - int offSet = 0; - byte[] cache; - int i = 0; - // 对数据分段解密 - while (inputLen - offSet > 0) { - if (inputLen - offSet > MAX_DECRYPT_BLOCK) { - cache = cipher.doFinal(encryptedData, offSet, MAX_DECRYPT_BLOCK); - } else { - cache = cipher.doFinal(encryptedData, offSet, inputLen - offSet); - } - out.write(cache, 0, cache.length); - i++; - offSet = i * MAX_DECRYPT_BLOCK; - } - byte[] decryptedData = out.toByteArray(); - out.close(); - - return StringUtils.isEmpty(charset) ? new String(decryptedData) - : new String(decryptedData, charset); - } catch (Exception e) { - throw new AlipayApiException("EncodeContent = " + content + ",charset = " + charset, e); - } - } - -} diff --git a/sop-test/src/main/java/com/gitee/sop/test/alipay/StringUtils.java b/sop-test/src/main/java/com/gitee/sop/test/alipay/StringUtils.java deleted file mode 100644 index 2f6b7f70..00000000 --- a/sop-test/src/main/java/com/gitee/sop/test/alipay/StringUtils.java +++ /dev/null @@ -1,171 +0,0 @@ -package com.gitee.sop.test.alipay; - -/** - * 字符串工具类。 - * - * @author carver.gu - * @since 1.0, Sep 12, 2009 - */ -public abstract class StringUtils { - - private StringUtils() {} - - /** - * 检查指定的字符串是否为空。 - *
    - *
  • SysUtils.isEmpty(null) = true
  • - *
  • SysUtils.isEmpty("") = true
  • - *
  • SysUtils.isEmpty(" ") = true
  • - *
  • SysUtils.isEmpty("abc") = false
  • - *
- * - * @param value 待检查的字符串 - * @return true/false - */ - public static boolean isEmpty(String value) { - int strLen; - if (value == null || (strLen = value.length()) == 0) { - return true; - } - for (int i = 0; i < strLen; i++) { - if ((Character.isWhitespace(value.charAt(i)) == false)) { - return false; - } - } - return true; - } - - /** - * 检查对象是否为数字型字符串,包含负数开头的。 - */ - public static boolean isNumeric(Object obj) { - if (obj == null) { - return false; - } - char[] chars = obj.toString().toCharArray(); - int length = chars.length; - if(length < 1) { - return false; - } - - int i = 0; - if(length > 1 && chars[0] == '-') { - i = 1; - } - - for (; i < length; i++) { - if (!Character.isDigit(chars[i])) { - return false; - } - } - return true; - } - - /** - * 检查指定的字符串列表是否不为空。 - */ - public static boolean areNotEmpty(String... values) { - boolean result = true; - if (values == null || values.length == 0) { - result = false; - } else { - for (String value : values) { - result &= !isEmpty(value); - } - } - return result; - } - - /** - * 把通用字符编码的字符串转化为汉字编码。 - */ - public static String unicodeToChinese(String unicode) { - StringBuilder out = new StringBuilder(); - if (!isEmpty(unicode)) { - for (int i = 0; i < unicode.length(); i++) { - out.append(unicode.charAt(i)); - } - } - return out.toString(); - } - - /** - * 过滤不可见字符 - */ - public static String stripNonValidXMLCharacters(String input) { - if (input == null || ("".equals(input))) { - return ""; - } - StringBuilder out = new StringBuilder(); - char current; - for (int i = 0; i < input.length(); i++) { - current = input.charAt(i); - if ((current == 0x9) || (current == 0xA) || (current == 0xD) - || ((current >= 0x20) && (current <= 0xD7FF)) - || ((current >= 0xE000) && (current <= 0xFFFD)) - || ((current >= 0x10000) && (current <= 0x10FFFF))) { - out.append(current); - } - } - return out.toString(); - } - - public static String leftPad(String str, int size, char padChar) { - if (str == null) { - return null; - } else { - int pads = size - str.length(); - if (pads <= 0) { - return str; - } else { - return pads > 8192 ? leftPad(str, size, String.valueOf(padChar)) : padding(pads, padChar).concat(str); - } - } - } - - public static String leftPad(String str, int size, String padStr) { - if (str == null) { - return null; - } else { - if (isEmpty(padStr)) { - padStr = " "; - } - - int padLen = padStr.length(); - int strLen = str.length(); - int pads = size - strLen; - if (pads <= 0) { - return str; - } else if (padLen == 1 && pads <= 8192) { - return leftPad(str, size, padStr.charAt(0)); - } else if (pads == padLen) { - return padStr.concat(str); - } else if (pads < padLen) { - return padStr.substring(0, pads).concat(str); - } else { - char[] padding = new char[pads]; - char[] padChars = padStr.toCharArray(); - - for(int i = 0; i < pads; ++i) { - padding[i] = padChars[i % padLen]; - } - - return (new String(padding)).concat(str); - } - } - } - - private static String padding(int repeat, char padChar) throws IndexOutOfBoundsException { - if (repeat < 0) { - throw new IndexOutOfBoundsException("Cannot pad a negative amount: " + repeat); - } else { - char[] buf = new char[repeat]; - - for(int i = 0; i < buf.length; ++i) { - buf[i] = padChar; - } - - return new String(buf); - } - } -} diff --git a/sop-test/src/main/java/com/gitee/sop/test/alipay/AlipayApiException.java b/sop-test/src/main/java/com/gitee/sop/test/sign/AlipayApiException.java similarity index 95% rename from sop-test/src/main/java/com/gitee/sop/test/alipay/AlipayApiException.java rename to sop-test/src/main/java/com/gitee/sop/test/sign/AlipayApiException.java index adafd989..92423987 100644 --- a/sop-test/src/main/java/com/gitee/sop/test/alipay/AlipayApiException.java +++ b/sop-test/src/main/java/com/gitee/sop/test/sign/AlipayApiException.java @@ -2,11 +2,11 @@ * Alipay.com Inc. * Copyright (c) 2004-2012 All Rights Reserved. */ -package com.gitee.sop.test.alipay; +package com.gitee.sop.test.sign; /** - * + * * @author runzhi */ public class AlipayApiException extends Exception { @@ -46,4 +46,4 @@ public class AlipayApiException extends Exception { return this.errMsg; } -} \ No newline at end of file +} diff --git a/sop-test/src/main/java/com/gitee/sop/test/alipay/AlipayConstants.java b/sop-test/src/main/java/com/gitee/sop/test/sign/AlipayConstants.java similarity index 98% rename from sop-test/src/main/java/com/gitee/sop/test/alipay/AlipayConstants.java rename to sop-test/src/main/java/com/gitee/sop/test/sign/AlipayConstants.java index afa209eb..3565b09f 100644 --- a/sop-test/src/main/java/com/gitee/sop/test/alipay/AlipayConstants.java +++ b/sop-test/src/main/java/com/gitee/sop/test/sign/AlipayConstants.java @@ -2,10 +2,10 @@ * Alipay.com Inc. * Copyright (c) 2004-2012 All Rights Reserved. */ -package com.gitee.sop.test.alipay; +package com.gitee.sop.test.sign; /** - * + * * @author runzhi */ public class AlipayConstants { diff --git a/sop-test/src/main/java/com/gitee/sop/test/sign/AlipaySignature.java b/sop-test/src/main/java/com/gitee/sop/test/sign/AlipaySignature.java new file mode 100644 index 00000000..9b00d606 --- /dev/null +++ b/sop-test/src/main/java/com/gitee/sop/test/sign/AlipaySignature.java @@ -0,0 +1,335 @@ +/** + * Alipay.com Inc. + * Copyright (c) 2004-2012 All Rights Reserved. + */ +package com.gitee.sop.test.sign; + + +import org.apache.commons.codec.binary.Base64; + +import java.io.ByteArrayInputStream; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.StringWriter; +import java.security.KeyFactory; +import java.security.PrivateKey; +import java.security.PublicKey; +import java.security.spec.InvalidKeySpecException; +import java.security.spec.PKCS8EncodedKeySpec; +import java.security.spec.X509EncodedKeySpec; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Map; + +/** + * @author runzhi + */ +public class AlipaySignature { + + /** + * RSA最大加密明文大小 + */ + private static final int MAX_ENCRYPT_BLOCK = 117; + + /** + * RSA最大解密密文大小 + */ + private static final int MAX_DECRYPT_BLOCK = 128; + + + /** + * @param sortedParams + * @return + */ + public static String getSignContent(Map sortedParams) { + StringBuffer content = new StringBuffer(); + List keys = new ArrayList(sortedParams.keySet()); + Collections.sort(keys); + int index = 0; + for (int i = 0; i < keys.size(); i++) { + String key = keys.get(i); + String value = sortedParams.get(key); + if (StringUtils.areNotEmpty(key, value)) { + content.append((index == 0 ? "" : "&") + key + "=" + value); + index++; + } + } + return content.toString(); + } + + /** + * rsa内容签名 + * + * @param content + * @param privateKey + * @param charset + * @return + * @throws AlipayApiException + */ + public static String rsaSign(String content, String privateKey, String charset, + String signType) throws AlipayApiException { + + if (AlipayConstants.SIGN_TYPE_RSA.equals(signType)) { + + return rsaSign(content, privateKey, charset); + } else if (AlipayConstants.SIGN_TYPE_RSA2.equals(signType)) { + + return rsa256Sign(content, privateKey, charset); + } else { + + throw new AlipayApiException("Sign Type is Not Support : signType=" + signType); + } + + } + + /** + * sha256WithRsa 加签 + * + * @param content + * @param privateKey + * @param charset + * @return + * @throws AlipayApiException + */ + public static String rsa256Sign(String content, String privateKey, + String charset) throws AlipayApiException { + + try { + PrivateKey priKey = getPrivateKeyFromPKCS8(AlipayConstants.SIGN_TYPE_RSA, + new ByteArrayInputStream(privateKey.getBytes())); + + java.security.Signature signature = java.security.Signature + .getInstance(AlipayConstants.SIGN_SHA256RSA_ALGORITHMS); + + signature.initSign(priKey); + + if (StringUtils.isEmpty(charset)) { + signature.update(content.getBytes()); + } else { + signature.update(content.getBytes(charset)); + } + + byte[] signed = signature.sign(); + + return new String(Base64.encodeBase64(signed)); + } catch (Exception e) { + throw new AlipayApiException("RSAcontent = " + content + "; charset = " + charset, e); + } + + } + + /** + * sha1WithRsa 加签 + * + * @param content + * @param privateKey + * @param charset + * @return + * @throws AlipayApiException + */ + public static String rsaSign(String content, String privateKey, + String charset) throws AlipayApiException { + try { + PrivateKey priKey = getPrivateKeyFromPKCS8(AlipayConstants.SIGN_TYPE_RSA, + new ByteArrayInputStream(privateKey.getBytes())); + + java.security.Signature signature = java.security.Signature + .getInstance(AlipayConstants.SIGN_ALGORITHMS); + + signature.initSign(priKey); + + if (StringUtils.isEmpty(charset)) { + signature.update(content.getBytes()); + } else { + signature.update(content.getBytes(charset)); + } + + byte[] signed = signature.sign(); + + return new String(Base64.encodeBase64(signed)); + } catch (InvalidKeySpecException ie) { + throw new AlipayApiException("RSA私钥格式不正确,请检查是否正确配置了PKCS8格式的私钥", ie); + } catch (Exception e) { + throw new AlipayApiException("RSAcontent = " + content + "; charset = " + charset, e); + } + } + + public static String rsaSign(Map params, String privateKey, + String charset) throws AlipayApiException { + String signContent = getSignContent(params); + + return rsaSign(signContent, privateKey, charset); + + } + + public static PrivateKey getPrivateKeyFromPKCS8(String algorithm, + InputStream ins) throws Exception { + if (ins == null || StringUtils.isEmpty(algorithm)) { + return null; + } + + KeyFactory keyFactory = KeyFactory.getInstance(algorithm); + + byte[] encodedKey = StreamUtil.readText(ins).getBytes(); + + encodedKey = Base64.decodeBase64(encodedKey); + + return keyFactory.generatePrivate(new PKCS8EncodedKeySpec(encodedKey)); + } + + public static String getSignCheckContentV1(Map params) { + if (params == null) { + return null; + } + + params.remove("sign"); + params.remove("sign_type"); + + StringBuffer content = new StringBuffer(); + List keys = new ArrayList(params.keySet()); + Collections.sort(keys); + + for (int i = 0; i < keys.size(); i++) { + String key = keys.get(i); + String value = params.get(key); + content.append((i == 0 ? "" : "&") + key + "=" + value); + } + + return content.toString(); + } + + public static String getSignCheckContentV2(Map params) { + if (params == null) { + return null; + } + + params.remove("sign"); + + StringBuffer content = new StringBuffer(); + List keys = new ArrayList(params.keySet()); + Collections.sort(keys); + + for (int i = 0; i < keys.size(); i++) { + String key = keys.get(i); + String value = params.get(key); + content.append((i == 0 ? "" : "&") + key + "=" + value); + } + + return content.toString(); + } + + public static boolean rsaCheckV1(Map params, String publicKey, + String charset) throws AlipayApiException { + String sign = params.get("sign"); + String content = getSignCheckContentV1(params); + + return rsaCheckContent(content, sign, publicKey, charset); + } + + public static boolean rsaCheckV1(Map params, String publicKey, + String charset, String signType) throws AlipayApiException { + String sign = params.get("sign"); + String content = getSignCheckContentV1(params); + + return rsaCheck(content, sign, publicKey, charset, signType); + } + + public static boolean rsaCheckV2(Map params, String publicKey, + String charset) throws AlipayApiException { + String sign = params.get("sign"); + String content = getSignCheckContentV2(params); + + return rsaCheckContent(content, sign, publicKey, charset); + } + + public static boolean rsaCheckV2(Map params, String publicKey, + String charset, String signType) throws AlipayApiException { + String sign = params.get("sign"); + String content = getSignCheckContentV2(params); + + return rsaCheck(content, sign, publicKey, charset, signType); + } + + public static boolean rsaCheck(String content, String sign, String publicKey, String charset, + String signType) throws AlipayApiException { + + if (AlipayConstants.SIGN_TYPE_RSA.equals(signType)) { + + return rsaCheckContent(content, sign, publicKey, charset); + + } else if (AlipayConstants.SIGN_TYPE_RSA2.equals(signType)) { + + return rsa256CheckContent(content, sign, publicKey, charset); + + } else { + + throw new AlipayApiException("Sign Type is Not Support : signType=" + signType); + } + + } + + public static boolean rsa256CheckContent(String content, String sign, String publicKey, + String charset) throws AlipayApiException { + try { + PublicKey pubKey = getPublicKeyFromX509("RSA", + new ByteArrayInputStream(publicKey.getBytes())); + + java.security.Signature signature = java.security.Signature + .getInstance(AlipayConstants.SIGN_SHA256RSA_ALGORITHMS); + + signature.initVerify(pubKey); + + if (StringUtils.isEmpty(charset)) { + signature.update(content.getBytes()); + } else { + signature.update(content.getBytes(charset)); + } + + return signature.verify(Base64.decodeBase64(sign.getBytes())); + } catch (Exception e) { + throw new AlipayApiException( + "RSAcontent = " + content + ",sign=" + sign + ",charset = " + charset, e); + } + } + + public static boolean rsaCheckContent(String content, String sign, String publicKey, + String charset) throws AlipayApiException { + try { + PublicKey pubKey = getPublicKeyFromX509("RSA", + new ByteArrayInputStream(publicKey.getBytes())); + + java.security.Signature signature = java.security.Signature + .getInstance(AlipayConstants.SIGN_ALGORITHMS); + + signature.initVerify(pubKey); + + if (StringUtils.isEmpty(charset)) { + signature.update(content.getBytes()); + } else { + signature.update(content.getBytes(charset)); + } + + return signature.verify(Base64.decodeBase64(sign.getBytes())); + } catch (Exception e) { + throw new AlipayApiException( + "RSAcontent = " + content + ",sign=" + sign + ",charset = " + charset, e); + } + } + + public static PublicKey getPublicKeyFromX509(String algorithm, + InputStream ins) throws Exception { + KeyFactory keyFactory = KeyFactory.getInstance(algorithm); + + StringWriter writer = new StringWriter(); + StreamUtil.io(new InputStreamReader(ins), writer); + + byte[] encodedKey = writer.toString().getBytes(); + + encodedKey = Base64.decodeBase64(encodedKey); + + return keyFactory.generatePublic(new X509EncodedKeySpec(encodedKey)); + } + + +} diff --git a/sop-test/src/main/java/com/gitee/sop/test/alipay/StreamUtil.java b/sop-test/src/main/java/com/gitee/sop/test/sign/StreamUtil.java similarity index 98% rename from sop-test/src/main/java/com/gitee/sop/test/alipay/StreamUtil.java rename to sop-test/src/main/java/com/gitee/sop/test/sign/StreamUtil.java index e32ec10d..f0154183 100644 --- a/sop-test/src/main/java/com/gitee/sop/test/alipay/StreamUtil.java +++ b/sop-test/src/main/java/com/gitee/sop/test/sign/StreamUtil.java @@ -2,7 +2,7 @@ * Alipay.com Inc. * Copyright (c) 2004-2012 All Rights Reserved. */ -package com.gitee.sop.test.alipay; +package com.gitee.sop.test.sign; import java.io.IOException; import java.io.InputStream; @@ -13,7 +13,7 @@ import java.io.StringWriter; import java.io.Writer; /** - * + * * @author runzhi */ public class StreamUtil { diff --git a/sop-test/src/main/java/com/gitee/sop/test/sign/StringUtils.java b/sop-test/src/main/java/com/gitee/sop/test/sign/StringUtils.java new file mode 100644 index 00000000..63a4d136 --- /dev/null +++ b/sop-test/src/main/java/com/gitee/sop/test/sign/StringUtils.java @@ -0,0 +1,168 @@ +package com.gitee.sop.test.sign; + +/** + * 字符串工具类。 + */ +public abstract class StringUtils { + + private StringUtils() { + } + + /** + * 检查指定的字符串是否为空。 + *
    + *
  • SysUtils.isEmpty(null) = true
  • + *
  • SysUtils.isEmpty("") = true
  • + *
  • SysUtils.isEmpty(" ") = true
  • + *
  • SysUtils.isEmpty("abc") = false
  • + *
+ * + * @param value 待检查的字符串 + * @return true/false + */ + public static boolean isEmpty(String value) { + if (value == null || value.isEmpty()) { + return true; + } + for (int i = 0; i < value.length(); i++) { + if ((!Character.isWhitespace(value.charAt(i)))) { + return false; + } + } + return true; + } + + /** + * 检查对象是否为数字型字符串,包含负数开头的。 + */ + public static boolean isNumeric(Object obj) { + if (obj == null) { + return false; + } + char[] chars = obj.toString().toCharArray(); + int length = chars.length; + if (length < 1) { + return false; + } + + int i = 0; + if (length > 1 && chars[0] == '-') { + i = 1; + } + + for (; i < length; i++) { + if (!Character.isDigit(chars[i])) { + return false; + } + } + return true; + } + + /** + * 检查指定的字符串列表是否不为空。 + */ + public static boolean areNotEmpty(String... values) { + boolean result = true; + if (values == null || values.length == 0) { + result = false; + } else { + for (String value : values) { + result &= !isEmpty(value); + } + } + return result; + } + + /** + * 把通用字符编码的字符串转化为汉字编码。 + */ + public static String unicodeToChinese(String unicode) { + StringBuilder out = new StringBuilder(); + if (!isEmpty(unicode)) { + for (int i = 0; i < unicode.length(); i++) { + out.append(unicode.charAt(i)); + } + } + return out.toString(); + } + + /** + * 过滤不可见字符 + */ + public static String stripNonValidXMLCharacters(String input) { + if (input == null || ("".equals(input))) { + return ""; + } + StringBuilder out = new StringBuilder(); + char current; + for (int i = 0; i < input.length(); i++) { + current = input.charAt(i); + if ((current == 0x9) || (current == 0xA) || (current == 0xD) + || ((current >= 0x20) && (current <= 0xD7FF)) + || ((current >= 0xE000) && (current <= 0xFFFD)) + || ((current >= 0x10000) && (current <= 0x10FFFF))) { + out.append(current); + } + } + return out.toString(); + } + + public static String leftPad(String str, int size, char padChar) { + if (str == null) { + return null; + } else { + int pads = size - str.length(); + if (pads <= 0) { + return str; + } else { + return pads > 8192 ? leftPad(str, size, String.valueOf(padChar)) : padding(pads, padChar).concat(str); + } + } + } + + public static String leftPad(String str, int size, String padStr) { + if (str == null) { + return null; + } else { + if (isEmpty(padStr)) { + padStr = " "; + } + + int padLen = padStr.length(); + int strLen = str.length(); + int pads = size - strLen; + if (pads <= 0) { + return str; + } else if (padLen == 1 && pads <= 8192) { + return leftPad(str, size, padStr.charAt(0)); + } else if (pads == padLen) { + return padStr.concat(str); + } else if (pads < padLen) { + return padStr.substring(0, pads).concat(str); + } else { + char[] padding = new char[pads]; + char[] padChars = padStr.toCharArray(); + + for (int i = 0; i < pads; ++i) { + padding[i] = padChars[i % padLen]; + } + + return (new String(padding)).concat(str); + } + } + } + + private static String padding(int repeat, char padChar) throws IndexOutOfBoundsException { + if (repeat < 0) { + throw new IndexOutOfBoundsException("Cannot pad a negative amount: " + repeat); + } else { + char[] buf = new char[repeat]; + + for (int i = 0; i < buf.length; ++i) { + buf[i] = padChar; + } + + return new String(buf); + } + } +} diff --git a/sop-test/src/main/java/com/gitee/sop/test/taobao/Constants.java b/sop-test/src/main/java/com/gitee/sop/test/taobao/Constants.java deleted file mode 100644 index 622f7c8d..00000000 --- a/sop-test/src/main/java/com/gitee/sop/test/taobao/Constants.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.gitee.sop.test.taobao; - -/** - * @author 六如 - */ -public class Constants { - public static final String SIGN_METHOD_HMAC = "hmac"; - public static final String SIGN_METHOD_MD5 = "md5"; - public static final String CHARSET_UTF8 = "UTF-8"; -} diff --git a/sop-test/src/main/java/com/gitee/sop/test/taobao/TaobaoSignature.java b/sop-test/src/main/java/com/gitee/sop/test/taobao/TaobaoSignature.java deleted file mode 100644 index 95c6a8fa..00000000 --- a/sop-test/src/main/java/com/gitee/sop/test/taobao/TaobaoSignature.java +++ /dev/null @@ -1,95 +0,0 @@ -package com.gitee.sop.test.taobao; - -import com.gitee.sop.test.alipay.StringUtils; - -import javax.crypto.Mac; -import javax.crypto.SecretKey; -import javax.crypto.spec.SecretKeySpec; -import java.io.IOException; -import java.security.GeneralSecurityException; -import java.security.MessageDigest; -import java.security.NoSuchAlgorithmException; -import java.util.Arrays; -import java.util.Map; - -/** - * @author 六如 - */ -public class TaobaoSignature { - - - public static String signTopRequest(Map params, String secret, String signMethod) throws IOException { - String content = getSignContent(params); - return doSign(content, secret, signMethod); - } - - public static String getSignContent(Map params) { - // 第一步:检查参数是否已经排序 - String[] keys = params.keySet().toArray(new String[0]); - Arrays.sort(keys); - - // 第二步:把所有参数名和参数值串在一起 - StringBuilder query = new StringBuilder(); - - for (String key : keys) { - String value = params.get(key); - if (StringUtils.areNotEmpty(key, value)) { - query.append(key).append(value); - } - } - - return query.toString(); - } - - public static String doSign(String content,String secret, String signMethod) throws IOException { - // 第三步:使用MD5/HMAC加密 - byte[] bytes; - if (Constants.SIGN_METHOD_HMAC.equals(signMethod)) { - bytes = encryptHMAC(content, secret); - } else { - bytes = encryptMD5(secret + content + secret); - } - - // 第四步:把二进制转化为大写的十六进制(正确签名应该为32大写字符串,此方法需要时使用) - return byte2hex(bytes); - } - - public static byte[] encryptHMAC(String data, String secret) throws IOException { - byte[] bytes = null; - try { - SecretKey secretKey = new SecretKeySpec(secret.getBytes(Constants.CHARSET_UTF8), "HmacMD5"); - Mac mac = Mac.getInstance(secretKey.getAlgorithm()); - mac.init(secretKey); - bytes = mac.doFinal(data.getBytes(Constants.CHARSET_UTF8)); - } catch (GeneralSecurityException gse) { - throw new IOException(gse.toString()); - } - return bytes; - } - - public static byte[] encryptMD5(String data) throws IOException { - return encryptMD5(data.getBytes(Constants.CHARSET_UTF8)); - } - - public static byte[] encryptMD5(byte[] data) { - try { - MessageDigest digest = MessageDigest.getInstance(Constants.SIGN_METHOD_MD5); - return digest.digest(data); - } catch (NoSuchAlgorithmException e) { - e.printStackTrace(); - } - return null; - } - - public static String byte2hex(byte[] bytes) { - StringBuilder sign = new StringBuilder(); - for (int i = 0; i < bytes.length; i++) { - String hex = Integer.toHexString(bytes[i] & 0xFF); - if (hex.length() == 1) { - sign.append("0"); - } - sign.append(hex.toUpperCase()); - } - return sign.toString(); - } -} 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 d8b3d67c..9dafa502 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 @@ -1,7 +1,7 @@ package com.gitee.sop.test; import com.alibaba.fastjson.JSON; -import com.gitee.sop.test.alipay.AlipaySignature; +import com.gitee.sop.test.sign.AlipaySignature; import org.junit.Test; import java.text.SimpleDateFormat; diff --git a/sop.sql b/sop.sql index f83310fd..9ccd9aa1 100644 --- a/sop.sql +++ b/sop.sql @@ -1,7 +1,6 @@ -CREATE DATABASE IF NOT EXISTS `sop` DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci; +CREATE DATABASE IF NOT EXISTS `sop` DEFAULT CHARACTER SET utf8mb4; USE `sop`; - CREATE TABLE `api_info` ( `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'id', `application` varchar(64) NOT NULL DEFAULT '' COMMENT '应用名称', @@ -23,31 +22,51 @@ CREATE TABLE `api_info` ( `update_by` bigint(20) DEFAULT '0' COMMENT '修改人id', PRIMARY KEY (`id`), UNIQUE KEY `uk_apiname_version` (`api_name`,`api_version`) USING BTREE -) ENGINE=InnoDB AUTO_INCREMENT=22 DEFAULT CHARSET=utf32 COMMENT='接口信息表'; +) ENGINE=InnoDB AUTO_INCREMENT=24 COMMENT='接口信息表'; CREATE TABLE `doc_app` ( - `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, + `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'id', `app_name` varchar(64) NOT NULL COMMENT '应用名称', `token` varchar(64) NOT NULL COMMENT 'Torna应用token', - `add_time` datetime DEFAULT CURRENT_TIMESTAMP, - `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + `is_publish` tinyint(4) DEFAULT '0' COMMENT '是否发布', + `add_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '添加时间', + `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间', + `add_by` bigint(20) DEFAULT '0' COMMENT '创建人id', + `update_by` bigint(20) DEFAULT '0' COMMENT '修改人id', PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf32 COMMENT='文档应用'; +) ENGINE=InnoDB AUTO_INCREMENT=5 COMMENT='文档应用'; + +CREATE TABLE `doc_content` ( + `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'id', + `doc_info_id` bigint(20) NOT NULL DEFAULT '0' COMMENT 'doc_info.id', + `content` longtext COMMENT '文档内容', + `add_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '添加时间', + `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间', + `add_by` bigint(20) DEFAULT '0' COMMENT '创建人id', + `update_by` bigint(20) DEFAULT '0' COMMENT '修改人id', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=8 COMMENT='文档内容'; CREATE TABLE `doc_info` ( - `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, + `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'id', + `doc_app_id` bigint(20) NOT NULL COMMENT 'doc_app.id', + `doc_title` varchar(128) NOT NULL COMMENT '文档标题', `doc_id` bigint(20) NOT NULL COMMENT '文档id', + `doc_code` varchar(64) DEFAULT '' COMMENT '文档code', + `doc_type` int(10) DEFAULT '1' COMMENT '文档类型,1-dubbo,2-富文本,3-Markdown', + `source_type` int(10) DEFAULT '1' COMMENT '来源类型,1-torna,2-自建', + `doc_version` varchar(16) NOT NULL COMMENT '文档版本号', `doc_name` varchar(64) NOT NULL COMMENT '文档名称', - `description` varchar(64) NOT NULL COMMENT '描述', + `description` text NOT NULL COMMENT '描述', `is_folder` tinyint(4) unsigned NOT NULL DEFAULT '0' COMMENT '是否分类', `is_publish` tinyint(4) unsigned NOT NULL DEFAULT '0' COMMENT '状态, 0-未发布,1-已发布', `parent_id` bigint(20) NOT NULL COMMENT '父节点id', - `add_time` datetime DEFAULT CURRENT_TIMESTAMP, - `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + `add_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '添加时间', + `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间', `add_by` bigint(20) DEFAULT '0' COMMENT '创建人id', `update_by` bigint(20) DEFAULT '0' COMMENT '修改人id', PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf32 COMMENT='文档信息'; +) ENGINE=InnoDB AUTO_INCREMENT=27 COMMENT='文档信息'; CREATE TABLE `isv_info` ( `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'id', @@ -60,7 +79,7 @@ CREATE TABLE `isv_info` ( `update_by` bigint(20) DEFAULT '0' COMMENT '修改人id', PRIMARY KEY (`id`), UNIQUE KEY `uk_appid` (`app_id`) -) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf32 COMMENT='isv信息表'; +) ENGINE=InnoDB AUTO_INCREMENT=6 COMMENT='isv信息表'; CREATE TABLE `isv_keys` ( `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'id', @@ -76,7 +95,7 @@ CREATE TABLE `isv_keys` ( `update_by` bigint(20) DEFAULT '0' COMMENT '修改人id', PRIMARY KEY (`id`), UNIQUE KEY `uk_appid` (`isv_id`) USING BTREE -) ENGINE=InnoDB AUTO_INCREMENT=20 DEFAULT CHARSET=utf8 COMMENT='ISV秘钥管理'; +) ENGINE=InnoDB AUTO_INCREMENT=21 DEFAULT CHARSET=utf8 COMMENT='ISV秘钥管理'; CREATE TABLE `perm_group` ( `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'id', @@ -87,7 +106,7 @@ CREATE TABLE `perm_group` ( `add_by` bigint(20) DEFAULT '0' COMMENT '创建人id', `update_by` bigint(20) DEFAULT '0' COMMENT '修改人id', PRIMARY KEY (`id`) -) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf32 COMMENT='分组表'; +) ENGINE=InnoDB AUTO_INCREMENT=4 COMMENT='分组表'; CREATE TABLE `perm_group_permission` ( `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'id', @@ -99,7 +118,7 @@ CREATE TABLE `perm_group_permission` ( `update_by` bigint(20) DEFAULT '0' COMMENT '修改人id', PRIMARY KEY (`id`), UNIQUE KEY `uk_apiid_groupid` (`api_id`,`group_id`) USING BTREE -) ENGINE=InnoDB AUTO_INCREMENT=15 DEFAULT CHARSET=utf32 COMMENT='组权限表'; +) ENGINE=InnoDB AUTO_INCREMENT=15 COMMENT='组权限表'; CREATE TABLE `perm_isv_group` ( `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, @@ -111,7 +130,7 @@ CREATE TABLE `perm_isv_group` ( `update_by` bigint(20) DEFAULT '0' COMMENT '修改人id', PRIMARY KEY (`id`), UNIQUE KEY `uk_isvid_groupid` (`isv_id`,`group_id`) USING BTREE -) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf32 COMMENT='isv分组'; +) ENGINE=InnoDB AUTO_INCREMENT=12 COMMENT='isv分组'; CREATE TABLE `sys_admin_user` ( `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'id', @@ -128,7 +147,7 @@ CREATE TABLE `sys_admin_user` ( `update_by` bigint(20) DEFAULT '0' COMMENT '修改人id', PRIMARY KEY (`id`), UNIQUE KEY `uk_username` (`username`) USING BTREE -) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf32 COMMENT='系统用户表'; +) ENGINE=InnoDB AUTO_INCREMENT=3 COMMENT='系统用户表'; CREATE TABLE `sys_config` ( `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键id', @@ -142,4 +161,295 @@ CREATE TABLE `sys_config` ( `update_by` bigint(20) DEFAULT '0' COMMENT '最后更新人id', PRIMARY KEY (`id`) USING BTREE, UNIQUE KEY `uk_configkey` (`config_key`) USING BTREE -) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf32 COMMENT='系统配置表'; +) ENGINE=InnoDB AUTO_INCREMENT=7 COMMENT='系统配置表'; + +CREATE TABLE `sys_dept` ( + `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'id', + `name` varchar(64) NOT NULL DEFAULT '' COMMENT '部门名称', + `sort` int(11) NOT NULL DEFAULT '0' COMMENT '排序', + `status` tinyint(4) unsigned NOT NULL DEFAULT '1' COMMENT '状态,1:启用,2:禁用', + `remark` varchar(64) NOT NULL DEFAULT '' COMMENT '备注', + `parent_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '父级id', + `add_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '添加时间', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间', + `add_by` bigint(20) DEFAULT '0' COMMENT '创建人id', + `update_by` bigint(20) DEFAULT '0' COMMENT '修改人id', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=4 COMMENT='部门表'; + +CREATE TABLE `sys_resource` ( + `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'id', + `menu_type` tinyint(4) NOT NULL DEFAULT '0' COMMENT '菜单类型(0代表菜单、1代表iframe、2代表外链、3代表按钮)', + `title` varchar(64) DEFAULT NULL COMMENT '菜单名称', + `name` varchar(64) DEFAULT NULL COMMENT '路由名称', + `path` varchar(128) DEFAULT NULL COMMENT '路由路径', + `component` varchar(128) DEFAULT NULL COMMENT '路由路径', + `rank` int(11) DEFAULT NULL COMMENT '排序', + `redirect` varchar(128) DEFAULT NULL COMMENT '路由重定向', + `icon` varchar(128) DEFAULT NULL COMMENT '菜单图标', + `extra_icon` varchar(64) DEFAULT NULL COMMENT '右侧图标', + `enter_transition` varchar(64) DEFAULT NULL COMMENT '进场动画(页面加载动画)', + `leave_transition` varchar(64) DEFAULT NULL COMMENT '离场动画(页面加载动画)', + `active_path` varchar(64) DEFAULT NULL COMMENT '菜单激活', + `auths` varchar(64) DEFAULT NULL COMMENT '权限标识', + `frame_src` varchar(128) DEFAULT NULL COMMENT '链接地址(需要内嵌的`iframe`链接地址)', + `frame_loading` tinyint(4) DEFAULT '1' COMMENT '加载动画(内嵌的`iframe`页面是否开启首次加载动画)', + `keep_alive` tinyint(4) DEFAULT '0' COMMENT '缓存页面', + `hidden_tag` tinyint(4) DEFAULT '0' COMMENT '标签页(当前菜单名称或自定义信息禁止添加到标签页) ', + `fixed_tag` tinyint(4) DEFAULT '0' COMMENT '固定标签页(当前菜单名称是否固定显示在标签页且不可关闭)', + `show_link` tinyint(4) unsigned DEFAULT '1' COMMENT '菜单(是否显示该菜单)', + `show_parent` tinyint(4) unsigned DEFAULT NULL COMMENT '父级菜单(是否显示父级菜单', + `parent_id` bigint(20) NOT NULL DEFAULT '0' COMMENT '父级id', + `is_deleted` tinyint(4) NOT NULL DEFAULT '0' COMMENT '是否删除', + `add_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '添加时间', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间', + `add_by` bigint(20) DEFAULT '0' COMMENT '创建人id', + `update_by` bigint(20) DEFAULT '0' COMMENT '修改人id', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=21 COMMENT='菜单资源表'; + +CREATE TABLE `sys_role` ( + `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'id', + `name` varchar(64) NOT NULL DEFAULT '' COMMENT '角色名称', + `code` varchar(64) NOT NULL DEFAULT '' COMMENT '角色code', + `remark` varchar(128) NOT NULL DEFAULT '' COMMENT '备注', + `status` tinyint(4) unsigned NOT NULL DEFAULT '1' COMMENT '状态,1:启用,2:禁用', + `is_deleted` tinyint(4) NOT NULL DEFAULT '0' COMMENT '是否删除', + `add_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '添加时间', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间', + `add_by` bigint(20) DEFAULT '0' COMMENT '创建人id', + `update_by` bigint(20) DEFAULT '0' COMMENT '修改人id', + PRIMARY KEY (`id`), + UNIQUE KEY `uk_code` (`code`) +) ENGINE=InnoDB AUTO_INCREMENT=4 COMMENT='角色表'; + +CREATE TABLE `sys_role_resource` ( + `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'id', + `role_id` bigint(20) NOT NULL DEFAULT '0' COMMENT 'sys_role.id', + `resource_id` bigint(20) NOT NULL DEFAULT '0' COMMENT 'sys_resource.id', + `add_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '添加时间', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间', + `add_by` bigint(20) DEFAULT '0' COMMENT '创建人id', + `update_by` bigint(20) DEFAULT '0' COMMENT '修改人id', + PRIMARY KEY (`id`), + KEY `idx_role_id` (`role_id`) +) ENGINE=InnoDB AUTO_INCREMENT=109 COMMENT='角色资源关联表'; + +CREATE TABLE `sys_user` ( + `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'id', + `username` varchar(128) NOT NULL DEFAULT '' COMMENT '用户名', + `password` varchar(128) NOT NULL DEFAULT '' COMMENT '密码', + `nickname` varchar(64) NOT NULL DEFAULT '' COMMENT '昵称', + `phone` varchar(32) NOT NULL DEFAULT '' COMMENT '邮箱', + `email` varchar(128) NOT NULL DEFAULT '' COMMENT '邮箱', + `avatar` varchar(256) NOT NULL DEFAULT '' COMMENT '头像', + `gender` tinyint(4) unsigned NOT NULL DEFAULT '0' COMMENT '性别,0-未知,1-男,2-女', + `status` tinyint(4) unsigned NOT NULL DEFAULT '1' COMMENT '状态,1:启用,2:禁用', + `reg_type` varchar(32) NOT NULL DEFAULT 'backend' COMMENT '注册类型', + `remark` varchar(128) NOT NULL DEFAULT '' COMMENT '备注', + `add_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '添加时间', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间', + `add_by` bigint(20) DEFAULT '0' COMMENT '创建人id', + `update_by` bigint(20) DEFAULT '0' COMMENT '修改人id', + PRIMARY KEY (`id`), + UNIQUE KEY `uk_username` (`username`) USING BTREE +) ENGINE=InnoDB AUTO_INCREMENT=4 COMMENT='系统用户表'; + +CREATE TABLE `sys_user_dept` ( + `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'id', + `user_id` bigint(20) NOT NULL DEFAULT '0' COMMENT 'sys_user.id', + `dept_id` bigint(20) NOT NULL DEFAULT '0' COMMENT 'sys_dept.id', + `add_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '添加时间', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间', + `add_by` bigint(20) DEFAULT '0' COMMENT '创建人id', + `update_by` bigint(20) DEFAULT '0' COMMENT '修改人id', + PRIMARY KEY (`id`), + UNIQUE KEY `uk_userid_deptid` (`user_id`,`dept_id`) +) ENGINE=InnoDB AUTO_INCREMENT=6 COMMENT='用户部门关联表'; + +CREATE TABLE `sys_user_role` ( + `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'id', + `role_id` bigint(20) NOT NULL DEFAULT '0' COMMENT 'sys_role.id', + `user_id` bigint(20) NOT NULL DEFAULT '0' COMMENT 'sys_user.id', + `add_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '添加时间', + `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间', + `add_by` bigint(20) DEFAULT '0' COMMENT '创建人id', + `update_by` bigint(20) DEFAULT '0' COMMENT '修改人id', + PRIMARY KEY (`id`), + UNIQUE KEY `uk_userid_roleid` (`user_id`,`role_id`) +) ENGINE=InnoDB AUTO_INCREMENT=7 COMMENT='角色用户关联表'; + +INSERT INTO `api_info` (`id`, `application`, `api_name`, `api_version`, `description`, `remark`, `interface_class_name`, `method_name`, `param_info`, `is_permission`, `is_need_Token`, `has_common_response`, `reg_source`, `status`, `add_time`, `update_time`, `add_by`, `update_by`) VALUES + (1, 'story-service', 'story.get', '1.0', '', '', 'com.gitee.sop.storyweb.open.OpenStory', 'getById', '[{\"name\":\"id\",\"type\":\"java.lang.Integer\"}]', 0, 0, 1, 1, 1, '2024-09-10 18:34:05', '2024-12-21 15:03:36', 0, 0), + (2, 'story-service', 'story.save', '1.0', '', '', 'com.gitee.sop.storyweb.open.OpenStory', 'save', '[{\"name\":\"storySaveRequest\",\"type\":\"com.gitee.sop.storyweb.open.req.StorySaveRequest\"}]', 0, 0, 1, 1, 1, '2024-09-10 18:34:05', '2024-12-21 15:03:36', 0, 0), + (3, 'story-service', 'story.find', '1.0', '', '', 'com.gitee.sop.storyweb.open.OpenStory', 'getById', '[{\"name\":\"id\",\"type\":\"java.lang.Integer\"},{\"name\":\"name\",\"type\":\"java.lang.String\"}]', 0, 0, 1, 1, 1, '2024-09-10 18:38:27', '2024-12-21 15:03:36', 0, 0), + (4, 'story-service', 'story.find2', '1.0', '', '', 'com.gitee.sop.storyweb.open.StoryService', 'getById2', '[{\"name\":\"id\",\"type\":\"java.lang.Integer\"},{\"name\":\"name\",\"type\":\"java.lang.String\"}]', 0, 0, 1, 1, 1, '2024-09-10 18:44:51', '2024-09-10 18:44:51', 0, 0), + (5, 'story-service', 'story.find3', '1.0', '', '', 'com.gitee.sop.storyweb.open.StoryService', 'getById2', '[{\"name\":\"id\",\"type\":\"java.lang.Integer\"},{\"name\":\"name\",\"type\":\"java.lang.String\"}]', 0, 0, 1, 1, 1, '2024-09-10 18:49:14', '2024-09-10 18:49:14', 0, 0), + (6, 'story-service', 'story.update', '1.0', '', '', 'com.gitee.sop.storyweb.open.OpenStory', 'update', '[{\"name\":\"id\",\"type\":\"java.lang.Integer\"},{\"name\":\"storySaveRequest\",\"type\":\"com.gitee.sop.storyweb.open.req.StorySaveRequest\"}]', 0, 0, 1, 1, 1, '2024-09-10 23:00:07', '2024-12-21 15:03:36', 0, 0), + (7, 'story-service', 'story.upload', '1.0', '', '', 'com.gitee.sop.storyweb.open.OpenStory', 'upload', '[{\"name\":\"storySaveRequest\",\"type\":\"com.gitee.sop.storyweb.open.req.StorySaveRequest\"},{\"name\":\"file\",\"type\":\"com.gitee.sop.support.dto.FileData\"}]', 0, 0, 1, 1, 1, '2024-09-13 09:14:03', '2024-12-21 15:03:36', 0, 0), + (8, 'story-service', 'story.upload.more', '1.0', '', '', 'com.gitee.sop.storyweb.open.OpenStory', 'upload2', '[{\"name\":\"storySaveRequest\",\"type\":\"com.gitee.sop.storyweb.open.req.StorySaveRequest\"},{\"name\":\"idCardFront\",\"type\":\"com.gitee.sop.support.dto.FileData\"},{\"name\":\"idCardBack\",\"type\":\"com.gitee.sop.support.dto.FileData\"}]', 0, 0, 1, 1, 1, '2024-09-13 09:22:05', '2024-12-21 15:03:36', 0, 0), + (9, 'story-service', 'story.upload.list', '1.0', '', '', 'com.gitee.sop.storyweb.open.OpenStory', 'upload3', '[{\"name\":\"storySaveRequest\",\"type\":\"com.gitee.sop.storyweb.open.req.StorySaveRequest\"},{\"actualType\":\"com.gitee.sop.support.dto.FileData\",\"name\":\"files\",\"type\":\"java.util.List\"}]', 0, 0, 1, 1, 1, '2024-09-13 09:28:01', '2024-12-21 15:03:36', 0, 0), + (10, 'story-service', 'story.get', '2.0', '', '', 'com.gitee.sop.storyweb.open.OpenStory', 'getByIdV2', '[{\"name\":\"id\",\"type\":\"java.lang.Long\"}]', 0, 0, 1, 1, 1, '2024-09-14 10:40:13', '2024-12-21 15:03:36', 0, 0), + (11, 'story-service', 'story.download', '1.0', '11', '', 'com.gitee.sop.storyweb.open.OpenStory', 'download', '[{\"name\":\"id\",\"type\":\"java.lang.Integer\"}]', 0, 0, 1, 1, 1, '2024-09-16 20:56:09', '2024-12-21 15:03:36', 0, 0), + (14, 'q1', 'q11', 'q', 'q1', '备注,内容有点长内容有点长内容有点长内容有点长内容有点长内容有点长', '', '', NULL, 1, 0, 1, 1, 2, '2024-10-06 09:51:47', '2024-11-13 10:20:56', 0, 1), + (15, 'server', 'goods.get', '1.0', '1111', '2222225555', '', '', NULL, 1, 0, 1, 2, 2, '2024-10-10 10:38:59', '2024-10-25 20:19:29', 0, 0), + (18, 'example-payment', 'alipay.trade.wap.pay', '2.0', NULL, NULL, 'com.gitee.sop.payment.open.OpenPayment', 'tradeWapPay', '[{\"name\":\"request\",\"type\":\"com.gitee.sop.payment.open.req.AlipayTradeWapPayRequest\"}]', 0, 0, 1, 1, 1, '2024-10-27 17:12:20', '2024-10-27 21:02:07', 0, 0), + (19, 'story-service', 'story.updateError', '1.0', NULL, NULL, 'com.gitee.sop.storyweb.open.OpenStory', 'updateError', '[{\"name\":\"id\",\"type\":\"java.lang.Integer\"}]', 0, 0, 1, 1, 1, '2024-11-03 22:26:14', '2024-12-21 15:03:36', 0, 0), + (20, 'story-service', 'story.get', '3.0', NULL, NULL, 'com.gitee.sop.storyweb.open.OpenStory', 'getByIdV3', '[{\"name\":\"id\",\"type\":\"java.lang.Long\"},{\"name\":\"request\",\"type\":\"com.gitee.sop.support.dto.OpenRequest\"}]', 0, 0, 1, 1, 1, '2024-11-04 14:27:07', '2024-11-08 09:47:27', 0, 0), + (21, 'story-service', 'story.get.context', '1.0', NULL, NULL, 'com.gitee.sop.storyweb.open.OpenStory', 'getContext', '[{\"name\":\"id\",\"type\":\"java.lang.Long\"},{\"name\":\"context\",\"type\":\"com.gitee.sop.support.context.OpenContext\"}]', 0, 0, 1, 1, 1, '2024-11-10 23:06:45', '2024-12-21 15:03:36', 0, 0), + (22, 'example-payment', 'pay.trade.wap.pay', '1.0', '手机网站支付接口', NULL, 'com.gitee.sop.payment.open.OpenPayment', 'tradeWapPay', '[{\"name\":\"request\",\"type\":\"com.gitee.sop.payment.open.req.PayTradeWapPayRequest\"}]', 0, 0, 1, 1, 1, '2024-11-29 22:28:20', '2024-12-02 10:14:26', 0, 0), + (23, 'example-payment', 'pay.order.search', '1.0', '订单查询接口', NULL, 'com.gitee.sop.payment.open.OpenPayment', 'orderSearch', '[{\"name\":\"request\",\"type\":\"com.gitee.sop.payment.open.req.PayOrderSearchRequest\"}]', 0, 0, 1, 1, 1, '2024-11-29 22:28:20', '2024-12-02 10:14:26', 0, 0); + +INSERT INTO `doc_app` (`id`, `app_name`, `token`, `is_publish`, `add_time`, `update_time`, `add_by`, `update_by`) VALUES + (3, '支付服务', '34ff76952462413982d21219cf099d46', 1, '2024-11-26 09:19:29', '2024-11-29 22:49:20', 1, 1), + (4, '故事服务', 'd4f07434c9cf4a989e4c6d301684b357', 0, '2024-12-21 15:11:55', '2024-12-21 15:11:55', 1, 1); + +INSERT INTO `doc_content` (`id`, `doc_info_id`, `content`, `add_time`, `update_time`, `add_by`, `update_by`) VALUES + (1, 15, '{\"children\":[],\"contentType\":\"application/json\",\"description\":\"该接口是页面跳转接口,用于生成用户访问支付宝的跳转链接。请在服务端执行支付宝SDK中pageExecute方法,读取响应中的body()结果。该结果用于跳转到支付宝页面,返回到用户浏览器渲染或重定向跳转到支付宝页面。具体使用方法请参考 接入指南\",\"docName\":\"手机网站支付接口2.0\",\"docTitle\":\"手机网站支付接口2.0\",\"errorCodeParams\":[],\"globalHeaders\":[],\"globalParams\":[],\"globalReturns\":[],\"gmtCreate\":\"2024-11-26 09:50:23\",\"gmtModified\":\"2024-11-27 00:12:00\",\"headerParams\":[],\"headerParamsRaw\":[],\"httpMethod\":\"POST\",\"id\":649,\"isFolder\":0,\"name\":\"手机网站支付接口2.0\",\"parentId\":640,\"pathParams\":[],\"queryParams\":[],\"requestParams\":[{\"children\":[],\"creatorName\":\"Jim\",\"description\":\"商户网站唯一订单号\",\"docId\":649,\"enumId\":0,\"example\":\"70501111111S001111119\",\"global\":false,\"gmtCreate\":\"2024-11-26 09:50:23\",\"gmtModified\":\"2024-11-26 09:50:23\",\"id\":6480,\"maxLength\":\"64\",\"modifierName\":\"Jim\",\"name\":\"out_trade_no\",\"parentId\":0,\"require\":false,\"required\":1,\"type\":\"String\"},{\"children\":[],\"creatorName\":\"Jim\",\"description\":\"订单总金额.单位为元,精确到小数点后两位,取值范围:[0.01,100000000] \",\"docId\":649,\"enumId\":0,\"example\":\"9.00\",\"global\":false,\"gmtCreate\":\"2024-11-26 09:50:23\",\"gmtModified\":\"2024-11-26 09:50:23\",\"id\":6481,\"maxLength\":\"-\",\"modifierName\":\"Jim\",\"name\":\"total_amount\",\"parentId\":0,\"require\":false,\"required\":1,\"type\":\"BigDecimal\"},{\"children\":[],\"creatorName\":\"Jim\",\"description\":\"订单标题。注意:不可使用特殊字符,如 /,=,& 等。\",\"docId\":649,\"enumId\":0,\"example\":\"大乐透\",\"global\":false,\"gmtCreate\":\"2024-11-26 09:50:23\",\"gmtModified\":\"2024-11-26 09:50:23\",\"id\":6482,\"maxLength\":\"256\",\"modifierName\":\"Jim\",\"name\":\"subject\",\"parentId\":0,\"require\":false,\"required\":1,\"type\":\"String\"},{\"children\":[],\"creatorName\":\"Jim\",\"description\":\"销售产品码,商家和支付宝签约的产品码。手机网站支付为:QUICK_WAP_WAY\",\"docId\":649,\"enumId\":0,\"example\":\"QUICK_WAP_WAY\",\"global\":false,\"gmtCreate\":\"2024-11-26 09:50:23\",\"gmtModified\":\"2024-11-26 09:50:23\",\"id\":6483,\"maxLength\":\"64\",\"modifierName\":\"Jim\",\"name\":\"product_code\",\"parentId\":0,\"require\":false,\"required\":1,\"type\":\"String\"},{\"children\":[],\"creatorName\":\"Jim\",\"description\":\"针对用户授权接口,获取用户相关数据时,用于标识用户授权关系\",\"docId\":649,\"enumId\":0,\"example\":\"appopenBb64d181d0146481ab6a762c00714cC27\",\"global\":false,\"gmtCreate\":\"2024-11-26 09:50:23\",\"gmtModified\":\"2024-11-26 09:50:23\",\"id\":6484,\"maxLength\":\"40\",\"modifierName\":\"Jim\",\"name\":\"auth_token\",\"parentId\":0,\"require\":false,\"required\":0,\"type\":\"String\"},{\"children\":[],\"creatorName\":\"Jim\",\"description\":\"用户付款中途退出返回商户网站的地址\",\"docId\":649,\"enumId\":0,\"example\":\"http://www.taobao.com/product/113714.html\",\"global\":false,\"gmtCreate\":\"2024-11-26 09:50:23\",\"gmtModified\":\"2024-11-26 09:50:23\",\"id\":6485,\"maxLength\":\"400\",\"modifierName\":\"Jim\",\"name\":\"quit_url\",\"parentId\":0,\"require\":false,\"required\":0,\"type\":\"String\"},{\"children\":[{\"children\":[],\"creatorName\":\"Jim\",\"description\":\"商品的编号\",\"docId\":649,\"enumId\":0,\"example\":\"apple-01\",\"global\":false,\"gmtCreate\":\"2024-11-26 09:50:23\",\"gmtModified\":\"2024-11-26 09:50:23\",\"id\":6487,\"maxLength\":\"64\",\"modifierName\":\"Jim\",\"name\":\"goods_id\",\"parentId\":6486,\"require\":false,\"required\":1,\"type\":\"String\"},{\"children\":[],\"creatorName\":\"Jim\",\"description\":\"商品名称\",\"docId\":649,\"enumId\":0,\"example\":\"ipad\",\"global\":false,\"gmtCreate\":\"2024-11-26 09:50:23\",\"gmtModified\":\"2024-11-26 09:50:23\",\"id\":6488,\"maxLength\":\"256\",\"modifierName\":\"Jim\",\"name\":\"goods_name\",\"parentId\":6486,\"require\":false,\"required\":1,\"type\":\"String\"},{\"children\":[],\"creatorName\":\"Jim\",\"description\":\"商品数量\",\"docId\":649,\"enumId\":0,\"example\":\"1\",\"global\":false,\"gmtCreate\":\"2024-11-26 09:50:23\",\"gmtModified\":\"2024-11-26 09:50:23\",\"id\":6489,\"maxLength\":\"-\",\"modifierName\":\"Jim\",\"name\":\"quantity\",\"parentId\":6486,\"require\":false,\"required\":1,\"type\":\"Integer\"},{\"children\":[],\"creatorName\":\"Jim\",\"description\":\"商品单价,单位为元\",\"docId\":649,\"enumId\":0,\"example\":\"2000\",\"global\":false,\"gmtCreate\":\"2024-11-26 09:50:23\",\"gmtModified\":\"2024-11-26 09:50:23\",\"id\":6490,\"maxLength\":\"-\",\"modifierName\":\"Jim\",\"name\":\"price\",\"parentId\":6486,\"require\":false,\"required\":1,\"type\":\"BigDecimal\"},{\"children\":[],\"creatorName\":\"Jim\",\"description\":\"支付宝定义的统一商品编号\",\"docId\":649,\"enumId\":0,\"example\":\"20010001\",\"global\":false,\"gmtCreate\":\"2024-11-26 09:50:23\",\"gmtModified\":\"2024-11-26 09:50:23\",\"id\":6491,\"maxLength\":\"32\",\"modifierName\":\"Jim\",\"name\":\"alipay_goods_id\",\"parentId\":6486,\"require\":false,\"required\":0,\"type\":\"String\"},{\"children\":[],\"creatorName\":\"Jim\",\"description\":\"商品类目\",\"docId\":649,\"enumId\":0,\"example\":\"34543238\",\"global\":false,\"gmtCreate\":\"2024-11-26 09:50:23\",\"gmtModified\":\"2024-11-26 09:50:23\",\"id\":6492,\"maxLength\":\"24\",\"modifierName\":\"Jim\",\"name\":\"goods_category\",\"parentId\":6486,\"require\":false,\"required\":0,\"type\":\"String\"},{\"children\":[],\"creatorName\":\"Jim\",\"description\":\"商品类目树,从商品类目根节点到叶子节点的类目id组成,类目id值使用|分割\",\"docId\":649,\"enumId\":0,\"example\":\"124868003|126232002|126252004\",\"global\":false,\"gmtCreate\":\"2024-11-26 09:50:23\",\"gmtModified\":\"2024-11-26 09:50:23\",\"id\":6493,\"maxLength\":\"128\",\"modifierName\":\"Jim\",\"name\":\"categories_tree\",\"parentId\":6486,\"require\":false,\"required\":0,\"type\":\"String\"},{\"children\":[],\"creatorName\":\"Jim\",\"description\":\"商品描述信息\",\"docId\":649,\"enumId\":0,\"example\":\"特价手机\",\"global\":false,\"gmtCreate\":\"2024-11-26 09:50:23\",\"gmtModified\":\"2024-11-26 09:50:23\",\"id\":6494,\"maxLength\":\"1000\",\"modifierName\":\"Jim\",\"name\":\"body\",\"parentId\":6486,\"require\":false,\"required\":0,\"type\":\"String\"},{\"children\":[],\"creatorName\":\"Jim\",\"description\":\"商品的展示地址\",\"docId\":649,\"enumId\":0,\"example\":\"http://www.alipay.com/xxx.jpg\",\"global\":false,\"gmtCreate\":\"2024-11-26 09:50:23\",\"gmtModified\":\"2024-11-26 09:50:23\",\"id\":6495,\"maxLength\":\"400\",\"modifierName\":\"Jim\",\"name\":\"show_url\",\"parentId\":6486,\"require\":false,\"required\":0,\"type\":\"String\"}],\"creatorName\":\"Jim\",\"description\":\"订单包含的商品列表信息,json格式,其它说明详见商品明细说明\",\"docId\":649,\"enumId\":0,\"example\":\"\",\"global\":false,\"gmtCreate\":\"2024-11-26 09:50:23\",\"gmtModified\":\"2024-11-26 09:50:23\",\"id\":6486,\"maxLength\":\"\",\"modifierName\":\"Jim\",\"name\":\"goods_detail\",\"parentId\":0,\"require\":false,\"required\":0,\"type\":\"List\"},{\"children\":[],\"creatorName\":\"Jim\",\"description\":\"绝对超时时间,格式为yyyy-MM-dd HH:mm:ss。超时时间范围:1m~15d。\",\"docId\":649,\"enumId\":0,\"example\":\"2016-12-31 10:05:00\",\"global\":false,\"gmtCreate\":\"2024-11-26 09:50:23\",\"gmtModified\":\"2024-11-26 09:50:23\",\"id\":6496,\"maxLength\":\"32\",\"modifierName\":\"Jim\",\"name\":\"time_expire\",\"parentId\":0,\"require\":false,\"required\":0,\"type\":\"String\"},{\"children\":[],\"creatorName\":\"Jim\",\"description\":\"商户传入业务信息,具体值要和支付宝约定,应用于安全,营销等参数直传场景,格式为json格式\",\"docId\":649,\"enumId\":0,\"example\":\"{\\\"mc_create_trade_ip\\\":\\\"127.0.0.1\\\"}\",\"global\":false,\"gmtCreate\":\"2024-11-26 09:50:23\",\"gmtModified\":\"2024-11-26 09:50:23\",\"id\":6497,\"maxLength\":\"512\",\"modifierName\":\"Jim\",\"name\":\"business_params\",\"parentId\":0,\"require\":false,\"required\":0,\"type\":\"String\"},{\"children\":[],\"creatorName\":\"Jim\",\"description\":\"公用回传参数,如果请求时传递了该参数,则返回给商户时会回传该参数。支付宝只会在同步返回(包括跳转回商户网站)和异步通知时将该参数原样返回。本参数必须进行UrlEncode之后才可以发送给支付宝。\",\"docId\":649,\"enumId\":0,\"example\":\"merchantBizType%3d3C%26merchantBizNo%3d2016010101111\",\"global\":false,\"gmtCreate\":\"2024-11-26 09:50:23\",\"gmtModified\":\"2024-11-26 09:50:23\",\"id\":6498,\"maxLength\":\"512\",\"modifierName\":\"Jim\",\"name\":\"passback_params\",\"parentId\":0,\"require\":false,\"required\":0,\"type\":\"String\"},{\"children\":[],\"creatorName\":\"Jim\",\"description\":\"商户原始订单号,最大长度限制32位\",\"docId\":649,\"enumId\":0,\"example\":\"{\\\"mc_create_trade_ip\\\":\\\"127.0.0.1\\\"}\",\"global\":false,\"gmtCreate\":\"2024-11-26 09:50:23\",\"gmtModified\":\"2024-11-26 09:50:23\",\"id\":6499,\"maxLength\":\"32\",\"modifierName\":\"Jim\",\"name\":\"merchant_order_no\",\"parentId\":0,\"require\":false,\"required\":0,\"type\":\"String\"}],\"responseParams\":[{\"children\":[],\"creatorName\":\"Jim\",\"description\":\"用于跳转支付宝页面的信息,POST和GET方法生成内容不同:使用POST方法执行,结果为html form表单,在浏览器渲染即可;使用GET方法会得到支付宝URL,需要打开或重定向到该URL。建议使用POST方式。具体使用方法请参考\",\"docId\":649,\"enumId\":0,\"example\":\"请参考响应示例\",\"global\":false,\"gmtCreate\":\"2024-11-26 09:50:23\",\"gmtModified\":\"2024-11-26 09:50:23\",\"id\":6500,\"maxLength\":\"-\",\"modifierName\":\"Jim\",\"name\":\"pageRedirectionData\",\"parentId\":0,\"require\":false,\"required\":1,\"type\":\"String\"}],\"url\":\"alipay.trade.wap.pay\",\"version\":\"2.0\"}', '2024-11-29 22:18:52', '2024-11-29 22:38:17', 1, 1), + (2, 14, '{\"children\":[],\"contentType\":\"\",\"description\":\"\",\"docName\":\"支付接口\",\"docTitle\":\"支付接口\",\"errorCodeParams\":[],\"globalHeaders\":[],\"globalParams\":[],\"globalReturns\":[],\"gmtCreate\":\"2024-10-30 09:29:01\",\"gmtModified\":\"2024-11-29 22:33:41\",\"headerParams\":[],\"headerParamsRaw\":[],\"httpMethod\":\"\",\"id\":640,\"isFolder\":1,\"name\":\"支付接口\",\"parentId\":0,\"pathParams\":[],\"queryParams\":[],\"requestParams\":[],\"responseParams\":[],\"url\":\"\",\"version\":\"\"}', '2024-11-29 22:38:17', '2024-11-29 22:38:17', 1, 1), + (3, 23, '{\"children\":[],\"contentType\":\"application/json\",\"description\":\"\",\"docName\":\"订单查询接口\",\"docTitle\":\"订单查询接口\",\"errorCodeParams\":[],\"globalHeaders\":[],\"globalParams\":[],\"globalReturns\":[],\"gmtCreate\":\"2024-11-29 22:33:41\",\"gmtModified\":\"2024-11-29 22:52:49\",\"headerParams\":[],\"headerParamsRaw\":[],\"httpMethod\":\"POST\",\"id\":723,\"isFolder\":0,\"name\":\"订单查询接口\",\"parentId\":640,\"pathParams\":[],\"queryParams\":[],\"requestParams\":[{\"children\":[],\"creatorName\":\"Jim\",\"description\":\"订单编号\",\"docId\":723,\"enumId\":0,\"example\":\"xxxx\",\"global\":false,\"gmtCreate\":\"2024-11-29 22:33:41\",\"gmtModified\":\"2024-11-29 22:52:49\",\"id\":6840,\"maxLength\":\"-\",\"modifierName\":\"Jim\",\"name\":\"orderNo\",\"parentId\":0,\"require\":false,\"required\":1,\"type\":\"String\"}],\"responseParams\":[{\"children\":[],\"creatorName\":\"Jim\",\"description\":\"订单编号\",\"docId\":723,\"enumId\":0,\"example\":\"xxxx\",\"global\":false,\"gmtCreate\":\"2024-11-29 22:33:41\",\"gmtModified\":\"2024-11-29 22:52:49\",\"id\":6841,\"maxLength\":\"-\",\"modifierName\":\"Jim\",\"name\":\"orderNo\",\"parentId\":0,\"require\":false,\"required\":0,\"type\":\"String\"},{\"children\":[],\"creatorName\":\"Jim\",\"description\":\"支付编号\",\"docId\":723,\"enumId\":0,\"example\":\"xxxx\",\"global\":false,\"gmtCreate\":\"2024-11-29 22:33:41\",\"gmtModified\":\"2024-11-29 22:52:49\",\"id\":6842,\"maxLength\":\"-\",\"modifierName\":\"Jim\",\"name\":\"payNo\",\"parentId\":0,\"require\":false,\"required\":0,\"type\":\"String\"},{\"children\":[],\"creatorName\":\"Jim\",\"description\":\"支付人id\",\"docId\":723,\"enumId\":0,\"example\":\"111\",\"global\":false,\"gmtCreate\":\"2024-11-29 22:33:41\",\"gmtModified\":\"2024-11-29 22:52:49\",\"id\":6843,\"maxLength\":\"-\",\"modifierName\":\"Jim\",\"name\":\"payUserId\",\"parentId\":0,\"require\":false,\"required\":0,\"type\":\"Long\"},{\"children\":[],\"creatorName\":\"Jim\",\"description\":\"支付人姓名\",\"docId\":723,\"enumId\":0,\"example\":\"Jim\",\"global\":false,\"gmtCreate\":\"2024-11-29 22:33:41\",\"gmtModified\":\"2024-11-29 22:52:49\",\"id\":6844,\"maxLength\":\"-\",\"modifierName\":\"Jim\",\"name\":\"payUserName\",\"parentId\":0,\"require\":false,\"required\":0,\"type\":\"String\"}],\"url\":\"pay.order.search\",\"version\":\"1.0\"}', '2024-11-29 22:38:17', '2024-11-29 22:53:22', 1, 1), + (4, 24, '{\"children\":[],\"contentType\":\"application/json\",\"description\":\"该接口是页面跳转接口,用于生成用户访问跳转链接。请在服务端执行SDK中pageExecute方法,读取响应中的body()结果。该结果用于跳转到页面,返回到用户浏览器渲染或重定向跳转到页面。具体使用方法请参考 接入指南\",\"docName\":\"手机网站支付接口\",\"docTitle\":\"手机网站支付接口\",\"errorCodeParams\":[],\"globalHeaders\":[],\"globalParams\":[],\"globalReturns\":[],\"gmtCreate\":\"2024-11-29 22:33:41\",\"gmtModified\":\"2024-12-02 10:10:27\",\"headerParams\":[],\"headerParamsRaw\":[],\"httpMethod\":\"POST\",\"id\":724,\"isFolder\":0,\"name\":\"手机网站支付接口\",\"parentId\":640,\"pathParams\":[],\"queryParams\":[],\"requestParams\":[{\"children\":[],\"creatorName\":\"Jim\",\"description\":\"商户网站唯一订单号\",\"docId\":724,\"enumId\":0,\"example\":\"70501111111S001111119\",\"global\":false,\"gmtCreate\":\"2024-12-02 10:10:27\",\"gmtModified\":\"2024-12-02 10:10:27\",\"id\":6892,\"maxLength\":\"64\",\"modifierName\":\"Jim\",\"name\":\"outTradeNo\",\"parentId\":0,\"require\":false,\"required\":1,\"type\":\"String\"},{\"children\":[],\"creatorName\":\"Jim\",\"description\":\"订单总金额.单位为元,精确到小数点后两位,取值范围:[0.01,100000000] \",\"docId\":724,\"enumId\":0,\"example\":\"9.00\",\"global\":false,\"gmtCreate\":\"2024-12-02 10:10:27\",\"gmtModified\":\"2024-12-02 10:10:27\",\"id\":6893,\"maxLength\":\"-\",\"modifierName\":\"Jim\",\"name\":\"totalAmount\",\"parentId\":0,\"require\":false,\"required\":1,\"type\":\"BigDecimal\"},{\"children\":[],\"creatorName\":\"Jim\",\"description\":\"订单标题。注意:不可使用特殊字符,如 /,=,& 等。\",\"docId\":724,\"enumId\":0,\"example\":\"大乐透\",\"global\":false,\"gmtCreate\":\"2024-11-29 22:33:41\",\"gmtModified\":\"2024-12-02 10:10:27\",\"id\":6847,\"maxLength\":\"256\",\"modifierName\":\"Jim\",\"name\":\"subject\",\"parentId\":0,\"require\":false,\"required\":1,\"type\":\"String\"},{\"children\":[],\"creatorName\":\"Jim\",\"description\":\"销售产品码,商家和支付平台签约的产品码。手机网站支付为:QUICK_WAP_WAY\",\"docId\":724,\"enumId\":0,\"example\":\"QUICK_WAP_WAY\",\"global\":false,\"gmtCreate\":\"2024-12-02 10:10:27\",\"gmtModified\":\"2024-12-02 10:10:27\",\"id\":6895,\"maxLength\":\"64\",\"modifierName\":\"Jim\",\"name\":\"productCode\",\"parentId\":0,\"require\":false,\"required\":1,\"type\":\"String\"},{\"children\":[],\"creatorName\":\"Jim\",\"description\":\"针对用户授权接口,获取用户相关数据时,用于标识用户授权关系\",\"docId\":724,\"enumId\":0,\"example\":\"appopenBb64d181d0146481ab6a762c00714cC27\",\"global\":false,\"gmtCreate\":\"2024-12-02 10:10:27\",\"gmtModified\":\"2024-12-02 10:10:27\",\"id\":6896,\"maxLength\":\"40\",\"modifierName\":\"Jim\",\"name\":\"authToken\",\"parentId\":0,\"require\":false,\"required\":0,\"type\":\"String\"},{\"children\":[],\"creatorName\":\"Jim\",\"description\":\"用户付款中途退出返回商户网站的地址\",\"docId\":724,\"enumId\":0,\"example\":\"http://www.taobao.com/product/113714.html\",\"global\":false,\"gmtCreate\":\"2024-11-29 22:33:41\",\"gmtModified\":\"2024-12-02 10:10:27\",\"id\":6850,\"maxLength\":\"400\",\"modifierName\":\"Jim\",\"name\":\"quit_url\",\"parentId\":0,\"require\":false,\"required\":0,\"type\":\"String\"},{\"children\":[{\"children\":[],\"creatorName\":\"Jim\",\"description\":\"商品的编号\",\"docId\":724,\"enumId\":0,\"example\":\"apple-01\",\"global\":false,\"gmtCreate\":\"2024-12-02 10:10:27\",\"gmtModified\":\"2024-12-02 10:10:27\",\"id\":6899,\"maxLength\":\"64\",\"modifierName\":\"Jim\",\"name\":\"goodsId\",\"parentId\":6898,\"require\":false,\"required\":1,\"type\":\"String\"},{\"children\":[],\"creatorName\":\"Jim\",\"description\":\"商品名称\",\"docId\":724,\"enumId\":0,\"example\":\"ipad\",\"global\":false,\"gmtCreate\":\"2024-12-02 10:10:27\",\"gmtModified\":\"2024-12-02 10:10:27\",\"id\":6900,\"maxLength\":\"256\",\"modifierName\":\"Jim\",\"name\":\"goodsName\",\"parentId\":6898,\"require\":false,\"required\":1,\"type\":\"String\"},{\"children\":[],\"creatorName\":\"Jim\",\"description\":\"商品数量\",\"docId\":724,\"enumId\":0,\"example\":\"1\",\"global\":false,\"gmtCreate\":\"2024-12-02 10:10:27\",\"gmtModified\":\"2024-12-02 10:10:27\",\"id\":6901,\"maxLength\":\"-\",\"modifierName\":\"Jim\",\"name\":\"quantity\",\"parentId\":6898,\"require\":false,\"required\":1,\"type\":\"Integer\"},{\"children\":[],\"creatorName\":\"Jim\",\"description\":\"商品单价,单位为元\",\"docId\":724,\"enumId\":0,\"example\":\"2000\",\"global\":false,\"gmtCreate\":\"2024-12-02 10:10:27\",\"gmtModified\":\"2024-12-02 10:10:27\",\"id\":6902,\"maxLength\":\"-\",\"modifierName\":\"Jim\",\"name\":\"price\",\"parentId\":6898,\"require\":false,\"required\":1,\"type\":\"BigDecimal\"},{\"children\":[],\"creatorName\":\"Jim\",\"description\":\"支付平台定义的统一商品编号\",\"docId\":724,\"enumId\":0,\"example\":\"20010001\",\"global\":false,\"gmtCreate\":\"2024-12-02 10:10:27\",\"gmtModified\":\"2024-12-02 10:10:27\",\"id\":6903,\"maxLength\":\"32\",\"modifierName\":\"Jim\",\"name\":\"alipayGoodsId\",\"parentId\":6898,\"require\":false,\"required\":0,\"type\":\"String\"},{\"children\":[],\"creatorName\":\"Jim\",\"description\":\"商品类目\",\"docId\":724,\"enumId\":0,\"example\":\"34543238\",\"global\":false,\"gmtCreate\":\"2024-12-02 10:10:27\",\"gmtModified\":\"2024-12-02 10:10:27\",\"id\":6904,\"maxLength\":\"24\",\"modifierName\":\"Jim\",\"name\":\"goodsCategory\",\"parentId\":6898,\"require\":false,\"required\":0,\"type\":\"String\"},{\"children\":[],\"creatorName\":\"Jim\",\"description\":\"商品类目树,从商品类目根节点到叶子节点的类目id组成,类目id值使用|分割\",\"docId\":724,\"enumId\":0,\"example\":\"124868003|126232002|126252004\",\"global\":false,\"gmtCreate\":\"2024-12-02 10:10:27\",\"gmtModified\":\"2024-12-02 10:10:27\",\"id\":6905,\"maxLength\":\"128\",\"modifierName\":\"Jim\",\"name\":\"categoriesTree\",\"parentId\":6898,\"require\":false,\"required\":0,\"type\":\"String\"},{\"children\":[],\"creatorName\":\"Jim\",\"description\":\"商品描述信息\",\"docId\":724,\"enumId\":0,\"example\":\"特价手机\",\"global\":false,\"gmtCreate\":\"2024-12-02 10:10:27\",\"gmtModified\":\"2024-12-02 10:10:27\",\"id\":6906,\"maxLength\":\"1000\",\"modifierName\":\"Jim\",\"name\":\"body\",\"parentId\":6898,\"require\":false,\"required\":0,\"type\":\"String\"},{\"children\":[],\"creatorName\":\"Jim\",\"description\":\"商品的展示地址\",\"docId\":724,\"enumId\":0,\"example\":\"http://www.alipay.com/xxx.jpg\",\"global\":false,\"gmtCreate\":\"2024-12-02 10:10:27\",\"gmtModified\":\"2024-12-02 10:10:27\",\"id\":6907,\"maxLength\":\"400\",\"modifierName\":\"Jim\",\"name\":\"showUrl\",\"parentId\":6898,\"require\":false,\"required\":0,\"type\":\"String\"}],\"creatorName\":\"Jim\",\"description\":\"订单包含的商品列表信息,json格式,其它说明详见商品明细说明\",\"docId\":724,\"enumId\":0,\"example\":\"\",\"global\":false,\"gmtCreate\":\"2024-12-02 10:10:27\",\"gmtModified\":\"2024-12-02 10:10:27\",\"id\":6898,\"maxLength\":\"\",\"modifierName\":\"Jim\",\"name\":\"goodsDetail\",\"parentId\":0,\"require\":false,\"required\":0,\"type\":\"List\"},{\"children\":[],\"creatorName\":\"Jim\",\"description\":\"绝对超时时间,格式为yyyy-MM-dd HH:mm:ss。超时时间范围:1m~15d。\",\"docId\":724,\"enumId\":0,\"example\":\"2016-12-31 10:05:00\",\"global\":false,\"gmtCreate\":\"2024-12-02 10:10:27\",\"gmtModified\":\"2024-12-02 10:10:27\",\"id\":6908,\"maxLength\":\"32\",\"modifierName\":\"Jim\",\"name\":\"timeExpire\",\"parentId\":0,\"require\":false,\"required\":0,\"type\":\"String\"},{\"children\":[],\"creatorName\":\"Jim\",\"description\":\"商户传入业务信息,具体值要和支付平台约定,应用于安全,营销等参数直传场景,格式为json格式\",\"docId\":724,\"enumId\":0,\"example\":\"{\\\"mc_create_trade_ip\\\":\\\"127.0.0.1\\\"}\",\"global\":false,\"gmtCreate\":\"2024-12-02 10:10:27\",\"gmtModified\":\"2024-12-02 10:10:27\",\"id\":6909,\"maxLength\":\"512\",\"modifierName\":\"Jim\",\"name\":\"businessParams\",\"parentId\":0,\"require\":false,\"required\":0,\"type\":\"String\"},{\"children\":[],\"creatorName\":\"Jim\",\"description\":\"公用回传参数,如果请求时传递了该参数,则返回给商户时会回传该参数。支付平台只会在同步返回(包括跳转回商户网站)和异步通知时将该参数原样返回。本参数必须进行UrlEncode之后才可以发送给支付平台。\",\"docId\":724,\"enumId\":0,\"example\":\"merchantBizType%3d3C%26merchantBizNo%3d2016010101111\",\"global\":false,\"gmtCreate\":\"2024-12-02 10:10:27\",\"gmtModified\":\"2024-12-02 10:10:27\",\"id\":6910,\"maxLength\":\"512\",\"modifierName\":\"Jim\",\"name\":\"passbackParams\",\"parentId\":0,\"require\":false,\"required\":0,\"type\":\"String\"},{\"children\":[],\"creatorName\":\"Jim\",\"description\":\"商户原始订单号,最大长度限制32位\",\"docId\":724,\"enumId\":0,\"example\":\"{\\\"mc_create_trade_ip\\\":\\\"127.0.0.1\\\"}\",\"global\":false,\"gmtCreate\":\"2024-12-02 10:10:27\",\"gmtModified\":\"2024-12-02 10:10:27\",\"id\":6911,\"maxLength\":\"32\",\"modifierName\":\"Jim\",\"name\":\"merchantOrderNo\",\"parentId\":0,\"require\":false,\"required\":0,\"type\":\"String\"}],\"responseParams\":[{\"children\":[],\"creatorName\":\"Jim\",\"description\":\"用于跳转支付平台页面的信息,POST和GET方法生成内容不同:使用POST方法执行,结果为html form表单,在浏览器渲染即可;使用GET方法会得到支付平台URL,需要打开或重定向到该URL。建议使用POST方式。具体使用方法请参考\",\"docId\":724,\"enumId\":0,\"example\":\"请参考响应示例\",\"global\":false,\"gmtCreate\":\"2024-11-29 22:33:41\",\"gmtModified\":\"2024-12-02 10:10:27\",\"id\":6865,\"maxLength\":\"-\",\"modifierName\":\"Jim\",\"name\":\"pageRedirectionData\",\"parentId\":0,\"require\":false,\"required\":1,\"type\":\"String\"}],\"url\":\"pay.trade.wap.pay\",\"version\":\"1.0\"}', '2024-11-29 22:38:17', '2024-12-02 10:11:31', 1, 1), + (5, 3, '{\"children\":[],\"contentType\":\"application/json\",\"description\":\"根据表单内容新建地址\",\"docName\":\"添加地址\",\"docTitle\":\"添加地址\",\"errorCodeParams\":[],\"globalHeaders\":[],\"globalParams\":[],\"globalReturns\":[],\"gmtCreate\":\"2024-09-02 10:05:38\",\"gmtModified\":\"2024-11-14 11:08:40\",\"headerParams\":[],\"headerParamsRaw\":[],\"httpMethod\":\"POST\",\"id\":229,\"isFolder\":0,\"name\":\"添加地址\",\"parentId\":228,\"pathParams\":[],\"queryParams\":[],\"requestParams\":[{\"children\":[],\"creatorName\":\"thc\",\"description\":\"详细地址\",\"docId\":229,\"enumId\":0,\"example\":\"xxx省xx市\",\"global\":false,\"gmtCreate\":\"2024-09-02 10:05:38\",\"gmtModified\":\"2024-11-14 11:08:40\",\"id\":1406,\"maxLength\":\"-\",\"modifierName\":\"thc\",\"name\":\"address\",\"parentId\":0,\"require\":false,\"required\":0,\"type\":\"string\"},{\"children\":[],\"creatorName\":\"thc\",\"description\":\"行政编码\",\"docId\":229,\"enumId\":0,\"example\":\"330104\",\"global\":false,\"gmtCreate\":\"2024-09-02 10:05:38\",\"gmtModified\":\"2024-11-14 11:08:40\",\"id\":1407,\"maxLength\":\"-\",\"modifierName\":\"thc\",\"name\":\"areaCode\",\"parentId\":0,\"require\":false,\"required\":0,\"type\":\"string\"}],\"responseParams\":[{\"children\":[],\"creatorName\":\"thc\",\"description\":\"状态码

200:成功
400:未知失败
400xxxx:明确的失败\",\"docId\":229,\"enumId\":0,\"example\":\"0\",\"global\":false,\"gmtCreate\":\"2024-09-02 10:05:38\",\"gmtModified\":\"2024-11-14 11:08:40\",\"id\":1408,\"maxLength\":\"-\",\"modifierName\":\"thc\",\"name\":\"code\",\"parentId\":0,\"require\":false,\"required\":0,\"type\":\"int32\"},{\"children\":[],\"creatorName\":\"thc\",\"description\":\"状态描述\",\"docId\":229,\"enumId\":0,\"example\":\"\",\"global\":false,\"gmtCreate\":\"2024-09-02 10:05:38\",\"gmtModified\":\"2024-11-14 11:08:40\",\"id\":1409,\"maxLength\":\"-\",\"modifierName\":\"thc\",\"name\":\"description\",\"parentId\":0,\"require\":false,\"required\":0,\"type\":\"string\"},{\"children\":[],\"creatorName\":\"thc\",\"description\":\"数据\",\"docId\":229,\"enumId\":0,\"example\":\"\",\"global\":false,\"gmtCreate\":\"2024-09-02 10:05:38\",\"gmtModified\":\"2024-11-14 11:08:40\",\"id\":1410,\"maxLength\":\"-\",\"modifierName\":\"thc\",\"name\":\"data\",\"parentId\":0,\"require\":false,\"required\":0,\"type\":\"int64\"}],\"url\":\"/address/add\",\"version\":\"\"}', '2024-11-30 23:02:26', '2024-11-30 23:02:26', 1, 1), + (6, 25, '{\"children\":[],\"contentType\":\"\",\"description\":\"\",\"docName\":\"故事服务\",\"docTitle\":\"故事服务\",\"errorCodeParams\":[],\"globalHeaders\":[],\"globalParams\":[],\"globalReturns\":[],\"gmtCreate\":\"2024-12-21 15:11:33\",\"gmtModified\":\"2024-12-21 15:11:33\",\"headerParams\":[],\"headerParamsRaw\":[],\"httpMethod\":\"\",\"id\":796,\"isFolder\":1,\"name\":\"故事服务\",\"parentId\":0,\"pathParams\":[],\"queryParams\":[],\"requestParams\":[],\"responseParams\":[],\"url\":\"\",\"version\":\"\"}', '2024-12-21 15:11:55', '2024-12-21 15:11:55', 1, 1), + (7, 26, '{\"children\":[],\"contentType\":\"application/json\",\"description\":\"\",\"docName\":\"根据id获取故事\",\"docTitle\":\"根据id获取故事\",\"errorCodeParams\":[],\"globalHeaders\":[],\"globalParams\":[],\"globalReturns\":[],\"gmtCreate\":\"2024-12-21 15:11:34\",\"gmtModified\":\"2024-12-21 15:11:34\",\"headerParams\":[],\"headerParamsRaw\":[],\"httpMethod\":\"POST\",\"id\":797,\"isFolder\":0,\"name\":\"根据id获取故事\",\"parentId\":796,\"pathParams\":[],\"queryParams\":[],\"requestParams\":[],\"responseParams\":[{\"children\":[],\"creatorName\":\"Jim\",\"description\":\"\",\"docId\":797,\"enumId\":0,\"example\":\"\",\"global\":false,\"gmtCreate\":\"2024-12-21 15:11:34\",\"gmtModified\":\"2024-12-21 15:11:34\",\"id\":7248,\"maxLength\":\"-\",\"modifierName\":\"Jim\",\"name\":\"id\",\"parentId\":0,\"require\":false,\"required\":0,\"type\":\"Integer\"},{\"children\":[],\"creatorName\":\"Jim\",\"description\":\"\",\"docId\":797,\"enumId\":0,\"example\":\"\",\"global\":false,\"gmtCreate\":\"2024-12-21 15:11:34\",\"gmtModified\":\"2024-12-21 15:11:34\",\"id\":7249,\"maxLength\":\"-\",\"modifierName\":\"Jim\",\"name\":\"name\",\"parentId\":0,\"require\":false,\"required\":0,\"type\":\"String\"},{\"children\":[],\"creatorName\":\"Jim\",\"description\":\"\",\"docId\":797,\"enumId\":0,\"example\":\"\",\"global\":false,\"gmtCreate\":\"2024-12-21 15:11:34\",\"gmtModified\":\"2024-12-21 15:11:34\",\"id\":7250,\"maxLength\":\"-\",\"modifierName\":\"Jim\",\"name\":\"addTime\",\"parentId\":0,\"require\":false,\"required\":0,\"type\":\"Date\"}],\"url\":\"story.get\",\"version\":\"1.0\"}', '2024-12-21 15:11:55', '2024-12-21 15:11:55', 1, 1); + +INSERT INTO `doc_info` (`id`, `doc_app_id`, `doc_title`, `doc_id`, `doc_code`, `doc_type`, `source_type`, `doc_version`, `doc_name`, `description`, `is_folder`, `is_publish`, `parent_id`, `add_time`, `update_time`, `add_by`, `update_by`) VALUES + (14, 3, '支付接口', 640, '', 1, 1, '', '支付接口', '', 1, 1, 0, '2024-11-26 22:17:12', '2024-11-29 22:38:17', 0, 1), + (15, 3, '手机网站支付接口2.0', 649, '', 1, 1, '2.0', 'alipay.trade.wap.pay', '该接口是页面跳转接口,用于生成用户访问支付宝的跳转链接。请在服务端执行支付宝SDK中pageExecute方法,读取响应中的body()结果。该结果用于跳转到支付宝页面,返回到用户浏览器渲染或重定向跳转到支付宝页面。具体使用方法请参考 接入指南', 0, 0, 640, '2024-11-26 22:17:12', '2024-11-29 22:49:04', 0, 1), + (23, 3, '订单查询接口', 723, '', 1, 1, '1.0', 'pay.order.search', '', 0, 1, 640, '2024-11-29 22:38:16', '2024-11-29 22:53:22', 0, 1), + (24, 3, '手机网站支付接口', 724, '', 1, 1, '1.0', 'pay.trade.wap.pay', '该接口是页面跳转接口,用于生成用户访问跳转链接。请在服务端执行SDK中pageExecute方法,读取响应中的body()结果。该结果用于跳转到页面,返回到用户浏览器渲染或重定向跳转到页面。具体使用方法请参考 接入指南', 0, 1, 640, '2024-11-29 22:38:16', '2024-12-02 10:11:31', 0, 1), + (25, 4, '故事服务', 796, '', 1, 1, '', '故事服务', '', 1, 1, 0, '2024-12-21 15:11:54', '2024-12-21 15:11:54', 1, 0), + (26, 4, '根据id获取故事', 797, '', 1, 1, '1.0', 'story.get', '', 0, 0, 796, '2024-12-21 15:11:54', '2024-12-21 15:11:54', 1, 0); + +INSERT INTO `isv_info` (`id`, `app_id`, `status`, `remark`, `add_time`, `update_time`, `add_by`, `update_by`) VALUES + (1, '2019032617262200001', 1, 'xx', '2024-09-10 09:23:43', '2024-12-21 09:39:45', 0, 1), + (2, '224', 1, '334', '2024-10-10 10:48:40', '2024-10-10 10:50:39', 0, 0), + (3, '202410111294229455501262848', 1, '杭州限行公司', '2024-10-11 09:17:28', '2024-12-21 14:14:46', 0, 1), + (4, '202410191297295138816524288', 1, 'xx公司', '2024-10-19 20:19:24', '2024-12-20 19:49:07', 0, 0), + (5, '202412201319756154208780288', 1, '非Java', '2024-12-20 19:51:27', '2024-12-21 14:24:44', 1, 1); + + +INSERT INTO `isv_keys` (`id`, `isv_id`, `key_format`, `public_key_isv`, `private_key_isv`, `public_key_platform`, `private_key_platform`, `add_time`, `update_time`, `add_by`, `update_by`) VALUES + (16, 1, 1, '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', '2024-09-10 09:26:33', '2024-12-21 14:25:55', 0, 1), + (17, 3, 1, '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', '', '', '2024-10-11 09:17:28', '2024-10-11 09:17:28', 0, 0), + (18, 2, 1, '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', '2024-10-19 20:08:11', '2024-10-19 20:08:11', 0, 0), + (19, 4, 1, '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', '2024-10-19 20:23:38', '2024-10-19 20:23:38', 0, 0), + (20, 5, 2, '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', '2024-12-21 14:24:55', '2024-12-21 19:44:54', 1, 1); + +INSERT INTO `perm_group` (`id`, `group_name`, `is_deleted`, `add_time`, `update_time`, `add_by`, `update_by`) VALUES + (1, 'VIP', 0, '2024-10-20 16:23:31', '2024-10-23 10:37:56', 0, 0), + (2, 'VIP2', 1, '2024-10-20 16:25:11', '2024-10-21 14:13:41', 0, 0), + (3, 'VIP2', 0, '2024-11-13 10:36:12', '2024-11-13 10:36:12', 1, 1); + +INSERT INTO `perm_group_permission` (`id`, `group_id`, `api_id`, `add_time`, `update_time`, `add_by`, `update_by`) VALUES + (8, 1, 11, '2024-10-23 13:58:29', '2024-10-23 13:58:29', 0, 0), + (13, 1, 14, '2024-10-23 14:17:58', '2024-10-23 14:17:58', 0, 0), + (14, 1, 10, '2024-10-25 20:27:47', '2024-10-25 20:27:47', 0, 0); + +INSERT INTO `perm_isv_group` (`id`, `isv_id`, `group_id`, `add_time`, `update_time`, `add_by`, `update_by`) VALUES + (8, 4, 1, '2024-10-21 14:10:18', '2024-10-21 14:10:18', 0, 0), + (9, 3, 1, '2024-10-25 20:20:16', '2024-10-25 20:20:16', 0, 0), + (11, 2, 1, '2024-10-25 20:25:41', '2024-10-25 20:25:41', 0, 0); + +INSERT INTO `sys_admin_user` (`id`, `username`, `password`, `nickname`, `email`, `avatar`, `status`, `reg_type`, `add_time`, `update_time`, `add_by`, `update_by`) VALUES + (1, 'admin', '$2a$10$6LWUuQQ8V/rszLo50.qrsuBlNmbYY/q2KSC1BmrxxN5czvOxmF3qK', 'admin', '', '', 1, 'backend', '2024-10-03 08:37:03', '2024-10-03 19:08:48', 0, 0); + +INSERT INTO `sys_config` (`id`, `config_key`, `config_value`, `remark`, `is_deleted`, `add_time`, `update_time`, `add_by`, `update_by`) VALUES + (1, 'admin.jwt.secret', 'UXJC8R3NmAvj9kFKWwBgYu6y3naXh7', '', 0, '2024-10-02 21:20:41', '2024-10-02 21:20:41', 0, 0), + (2, 'admin.password-salt', 'Khq9RnXZCGsWz', '', 0, '2024-10-02 21:20:41', '2024-10-02 21:20:41', 0, 0), + (3, 'admin.torna-url', '2', 'Torna服务器地址', 0, '2024-11-19 22:21:07', '2024-11-19 22:25:22', 1, 1), + (4, 'admin.open-prod-url', 'https://open.xxx.com/api', '开放平台线上地址', 0, '2024-11-19 22:21:07', '2024-12-21 14:37:31', 1, 1), + (5, 'admin.open-sandbox-url', 'https://open-sandbox.xxx.com/api', '开放平台沙箱地址', 0, '2024-11-19 22:21:07', '2024-12-21 14:37:32', 1, 1), + (6, 'admin.torna-server-addr', 'http://localhost:7700', 'Torna服务器地址', 0, '2024-11-20 09:37:47', '2024-12-21 14:37:31', 1, 1); + +INSERT INTO `sys_dept` (`id`, `name`, `sort`, `status`, `remark`, `parent_id`, `add_time`, `update_time`, `add_by`, `update_by`) VALUES + (1, 'XX公司', 0, 1, '', 0, '2024-12-06 19:19:34', '2024-12-12 14:40:17', 1, 1), + (2, 'IT部', 0, 1, 'IT', 1, '2024-12-06 19:26:18', '2024-12-12 14:40:17', 1, 1), + (3, '财务部', 0, 1, '', 1, '2024-12-06 19:36:00', '2024-12-12 12:28:13', 1, 1); + +INSERT INTO `sys_resource` (`id`, `menu_type`, `title`, `name`, `path`, `component`, `rank`, `redirect`, `icon`, `extra_icon`, `enter_transition`, `leave_transition`, `active_path`, `auths`, `frame_src`, `frame_loading`, `keep_alive`, `hidden_tag`, `fixed_tag`, `show_link`, `show_parent`, `parent_id`, `is_deleted`, `add_time`, `update_time`, `add_by`, `update_by`) VALUES + (1, 0, '服务管理', 'ServeMgr', '/serve', NULL, 99, NULL, 'ep:files', NULL, NULL, NULL, NULL, '', NULL, 0, 0, 0, 0, 1, 1, 0, 0, '2024-12-10 22:16:29', '2024-12-18 10:39:22', 1, 1), + (2, 0, '接口管理', 'ServeApi', '/serve/api', NULL, 99, NULL, 'ep:box', NULL, NULL, NULL, NULL, '', NULL, 0, 0, 0, 0, 1, 1, 1, 0, '2024-12-10 22:17:22', '2024-12-18 10:39:22', 1, 1), + (3, 0, '文档管理', 'DocMgr', '/doc', NULL, 99, NULL, 'ep:copy-document', NULL, NULL, NULL, NULL, '', NULL, 0, 0, 0, 0, 1, 1, 0, 0, '2024-12-17 09:08:44', '2024-12-18 10:39:22', 1, 1), + (4, 0, '基础配置', 'DocSetting', '/doc/setting', NULL, 99, NULL, 'ep:setting', NULL, NULL, NULL, NULL, '', NULL, 0, 0, 0, 0, 1, 1, 3, 0, '2024-12-17 09:09:21', '2024-12-18 10:39:22', 1, 1), + (5, 0, '文档列表', 'DocList', '/doc/list', NULL, 99, NULL, 'ep:document-copy', NULL, NULL, NULL, NULL, '', NULL, 0, 0, 0, 0, 1, 1, 3, 0, '2024-12-17 09:10:12', '2024-12-18 10:39:22', 1, 1), + (6, 0, 'ISV管理', 'IsvMgr', '/isv', NULL, 99, NULL, 'ep:avatar', NULL, NULL, NULL, NULL, '', NULL, 0, 0, 0, 0, 1, 1, 0, 0, '2024-12-17 09:10:47', '2024-12-18 10:39:22', 1, 1), + (7, 0, 'ISV列表', 'IsvList', '/isv/list', NULL, 99, NULL, 'ep:user', NULL, NULL, NULL, NULL, '', NULL, 0, 0, 0, 0, 1, 1, 6, 0, '2024-12-17 09:11:19', '2024-12-18 10:39:22', 1, 1), + (8, 0, '分组管理', 'IsvPermPermGroup', '/isv/perm/permGroup', NULL, 99, NULL, 'ri:layout-grid-line', NULL, NULL, NULL, NULL, '', NULL, 0, 0, 0, 0, 1, 1, 6, 0, '2024-12-17 09:12:24', '2024-12-18 10:39:22', 1, 1), + (9, 0, '系统管理', 'PureSystem', '/system', NULL, 99, NULL, 'ri:settings-3-line', NULL, NULL, NULL, NULL, '', NULL, 0, 0, 0, 0, 1, 1, 0, 0, '2024-12-17 09:18:13', '2024-12-18 10:39:22', 1, 1), + (10, 0, '用户管理', 'SystemUser', '/system/user/index', NULL, 99, NULL, 'fa-solid:user-lock', NULL, NULL, NULL, NULL, '', NULL, 0, 0, 0, 0, 1, 1, 9, 0, '2024-12-17 09:19:46', '2024-12-18 10:39:22', 1, 1), + (11, 0, '角色管理', 'SystemRole', '/system/role/index', NULL, 99, NULL, 'ri:user-5-line', NULL, NULL, NULL, NULL, '', NULL, 0, 0, 0, 0, 1, 1, 9, 0, '2024-12-17 09:20:45', '2024-12-18 10:39:22', 1, 1), + (12, 0, '菜单管理', 'SystemMenu', '/system/menu/index', NULL, 99, NULL, 'ep:menu', NULL, NULL, NULL, NULL, '', NULL, 0, 0, 0, 0, 1, 1, 9, 0, '2024-12-17 09:21:32', '2024-12-18 10:39:22', 1, 1), + (13, 0, '部门管理', 'SystemDept', '/system/dept/index', NULL, 99, NULL, 'ri:git-branch-line', NULL, NULL, NULL, NULL, '', NULL, 0, 0, 0, 0, 1, 1, 9, 0, '2024-12-17 09:23:02', '2024-12-18 10:39:22', 1, 1), + (14, 3, '发布', '', '', NULL, 99, NULL, '', NULL, NULL, NULL, NULL, 'doc:table-btn:publish', NULL, 0, 0, 0, 0, 1, 1, 5, 0, '2024-12-17 09:38:14', '2024-12-18 10:39:22', 1, 1), + (15, 3, '下线', '', '', NULL, 99, NULL, '', NULL, NULL, NULL, NULL, 'doc:table-btn:offline', NULL, 0, 0, 0, 0, 1, 1, 5, 0, '2024-12-17 09:38:39', '2024-12-18 10:39:22', 1, 1), + (16, 3, '同步', '', '', NULL, 99, NULL, '', NULL, NULL, NULL, NULL, 'doc:table-btn:sync', NULL, 0, 0, 0, 0, 1, 1, 5, 0, '2024-12-17 09:40:33', '2024-12-18 10:39:22', 1, 1), + (17, 3, '同步全部接口', '', '', NULL, 99, NULL, '', NULL, NULL, NULL, NULL, 'doc:page-btn:sync', NULL, 0, 0, 0, 0, 1, 1, 5, 0, '2024-12-17 09:41:03', '2024-12-18 10:39:22', 1, 1), + (18, 3, '修改', '', '', '', 99, '', '', '', '', '', '', 'api:table-btn:update', '', 0, 0, 0, 0, 1, 0, 2, 0, '2024-12-19 11:30:49', '2024-12-19 11:30:49', 1, 1), + (20, 3, '启用/禁用', '', '', '', 99, '', '', '', '', '', '', 'api:table-btn:updateStatus', '', 0, 0, 0, 0, 1, 0, 2, 0, '2024-12-19 11:31:08', '2024-12-19 11:47:00', 1, 1); + +INSERT INTO `sys_role` (`id`, `name`, `code`, `remark`, `status`, `is_deleted`, `add_time`, `update_time`, `add_by`, `update_by`) VALUES + (1, '超级管理员', 'admin', '超级管理员', 1, 0, '2024-12-05 23:37:54', '2024-12-11 11:41:59', 1, 1), + (2, '开发者', 'developer', '开发者', 1, 0, '2024-12-05 23:38:00', '2024-12-11 11:41:45', 1, 1), + (3, '开发主管', 'dev_leader', '开发主管', 1, 0, '2024-12-19 09:55:30', '2024-12-19 09:55:30', 1, 1); + +INSERT INTO `sys_role_resource` (`id`, `role_id`, `resource_id`, `add_time`, `update_time`, `add_by`, `update_by`) VALUES + (67, 1, 1, '2024-12-19 11:50:02', '2024-12-19 11:50:02', 1, 1), + (68, 1, 2, '2024-12-19 11:50:02', '2024-12-19 11:50:02', 1, 1), + (69, 1, 3, '2024-12-19 11:50:02', '2024-12-19 11:50:02', 1, 1), + (70, 1, 4, '2024-12-19 11:50:02', '2024-12-19 11:50:02', 1, 1), + (71, 1, 5, '2024-12-19 11:50:02', '2024-12-19 11:50:02', 1, 1), + (72, 1, 14, '2024-12-19 11:50:02', '2024-12-19 11:50:02', 1, 1), + (73, 1, 15, '2024-12-19 11:50:02', '2024-12-19 11:50:02', 1, 1), + (74, 1, 16, '2024-12-19 11:50:02', '2024-12-19 11:50:02', 1, 1), + (75, 1, 17, '2024-12-19 11:50:02', '2024-12-19 11:50:02', 1, 1), + (76, 1, 6, '2024-12-19 11:50:02', '2024-12-19 11:50:02', 1, 1), + (77, 1, 7, '2024-12-19 11:50:02', '2024-12-19 11:50:02', 1, 1), + (78, 1, 8, '2024-12-19 11:50:02', '2024-12-19 11:50:02', 1, 1), + (79, 1, 9, '2024-12-19 11:50:02', '2024-12-19 11:50:02', 1, 1), + (80, 1, 10, '2024-12-19 11:50:02', '2024-12-19 11:50:02', 1, 1), + (81, 1, 11, '2024-12-19 11:50:02', '2024-12-19 11:50:02', 1, 1), + (82, 1, 12, '2024-12-19 11:50:02', '2024-12-19 11:50:02', 1, 1), + (83, 1, 13, '2024-12-19 11:50:02', '2024-12-19 11:50:02', 1, 1), + (84, 1, 18, '2024-12-19 11:50:02', '2024-12-19 11:50:02', 1, 1), + (85, 1, 20, '2024-12-19 11:50:02', '2024-12-19 11:50:02', 1, 1), + (86, 2, 1, '2024-12-19 11:50:08', '2024-12-19 11:50:08', 1, 1), + (87, 2, 2, '2024-12-19 11:50:08', '2024-12-19 11:50:08', 1, 1), + (88, 2, 5, '2024-12-19 11:50:08', '2024-12-19 11:50:08', 1, 1), + (89, 2, 14, '2024-12-19 11:50:08', '2024-12-19 11:50:08', 1, 1), + (90, 2, 15, '2024-12-19 11:50:08', '2024-12-19 11:50:08', 1, 1), + (91, 2, 3, '2024-12-19 11:50:08', '2024-12-19 11:50:08', 1, 1), + (92, 2, 16, '2024-12-19 11:50:08', '2024-12-19 11:50:08', 1, 1), + (93, 2, 18, '2024-12-19 11:50:08', '2024-12-19 11:50:08', 1, 1), + (94, 2, 20, '2024-12-19 11:50:08', '2024-12-19 11:50:08', 1, 1), + (95, 3, 1, '2024-12-19 11:50:13', '2024-12-19 11:50:13', 1, 1), + (96, 3, 2, '2024-12-19 11:50:13', '2024-12-19 11:50:13', 1, 1), + (97, 3, 3, '2024-12-19 11:50:13', '2024-12-19 11:50:13', 1, 1), + (98, 3, 4, '2024-12-19 11:50:13', '2024-12-19 11:50:13', 1, 1), + (99, 3, 5, '2024-12-19 11:50:13', '2024-12-19 11:50:13', 1, 1), + (100, 3, 14, '2024-12-19 11:50:13', '2024-12-19 11:50:13', 1, 1), + (101, 3, 15, '2024-12-19 11:50:13', '2024-12-19 11:50:13', 1, 1), + (102, 3, 16, '2024-12-19 11:50:13', '2024-12-19 11:50:13', 1, 1), + (103, 3, 17, '2024-12-19 11:50:13', '2024-12-19 11:50:13', 1, 1), + (104, 3, 6, '2024-12-19 11:50:13', '2024-12-19 11:50:13', 1, 1), + (105, 3, 7, '2024-12-19 11:50:13', '2024-12-19 11:50:13', 1, 1), + (106, 3, 8, '2024-12-19 11:50:13', '2024-12-19 11:50:13', 1, 1), + (107, 3, 18, '2024-12-19 11:50:13', '2024-12-19 11:50:13', 1, 1), + (108, 3, 20, '2024-12-19 11:50:13', '2024-12-19 11:50:13', 1, 1); + +INSERT INTO `sys_user` (`id`, `username`, `password`, `nickname`, `phone`, `email`, `avatar`, `gender`, `status`, `reg_type`, `remark`, `add_time`, `update_time`, `add_by`, `update_by`) VALUES + (1, 'admin', '$2a$10$vx5WzzoQbryhC6gdV5fXfu6pykE3969tuax1cH.3ADfxrimaho1tO', 'admin', '', '', '', 1, 1, 'backend', '', '2024-12-12 10:11:19', '2024-12-12 12:25:50', 0, 1), + (2, 'jim', '$2a$10$LIw8h1oewg9ORK8ikYBRQ.HXchLcxSyPvNaNV6QBP2IXKsf33kJJy', 'jim', '', '', '', 0, 1, 'backend', '', '2024-12-12 12:07:33', '2024-12-20 19:59:48', 1, 1), + (3, 'tom', '$2a$10$0drvKbiVDxZ/.zeVqyYcCOucWZs2uWx6KPDu56ddvzCAF.BmEgG06', 'tom', '', '', '', 1, 1, 'backend', '', '2024-12-12 21:51:16', '2024-12-19 09:56:52', 1, 1); + +INSERT INTO `sys_user_dept` (`id`, `user_id`, `dept_id`, `add_time`, `update_time`, `add_by`, `update_by`) VALUES + (1, 1, 2, '2024-12-12 12:25:49', '2024-12-12 12:28:28', 0, 0), + (4, 3, 2, '2024-12-12 21:51:35', '2024-12-12 21:51:35', 0, 0), + (5, 2, 3, '2024-12-20 19:59:48', '2024-12-20 19:59:48', 0, 0); + +INSERT INTO `sys_user_role` (`id`, `role_id`, `user_id`, `add_time`, `update_time`, `add_by`, `update_by`) VALUES + (4, 1, 1, '2024-12-12 20:32:13', '2024-12-12 20:32:13', 1, 0), + (5, 2, 2, '2024-12-12 20:32:16', '2024-12-12 20:32:16', 1, 0), + (6, 3, 3, '2024-12-19 09:56:08', '2024-12-19 09:56:08', 1, 0); + +