tanghc 6 years ago
parent 4cc1c60959
commit 65e119eea8
  1. 5
      changelog.md
  2. 7
      doc/docs/files/10070_easyopen支持.md
  3. 3
      sop-1.5.0.sql
  4. 15
      sop-admin/sop-admin-front/pages/isv/isvList.js
  5. 3
      sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/api/isv/IsvApi.java
  6. 11
      sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/api/isv/param/IsvInfoForm.java
  7. 3
      sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/api/isv/result/IsvVO.java
  8. 8
      sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/entity/IsvInfo.java
  9. 2
      sop-common/pom.xml
  10. 4
      sop-common/sop-gateway-common/pom.xml
  11. 8
      sop-common/sop-gateway-common/src/main/java/com/gitee/sop/gatewaycommon/bean/BeanInitializer.java
  12. 5
      sop-common/sop-gateway-common/src/main/java/com/gitee/sop/gatewaycommon/easyopen/EasyopenZuulConfiguration.java
  13. 25
      sop-common/sop-gateway-common/src/main/java/com/gitee/sop/gatewaycommon/manager/AbstractConfiguration.java
  14. 8
      sop-common/sop-gateway-common/src/main/java/com/gitee/sop/gatewaycommon/manager/IsvRoutePermissionManager.java
  15. 8
      sop-common/sop-gateway-common/src/main/java/com/gitee/sop/gatewaycommon/manager/RouteConfigManager.java
  16. 4
      sop-common/sop-gateway-common/src/main/java/com/gitee/sop/gatewaycommon/secret/CacheIsvManager.java
  17. 10
      sop-common/sop-gateway-common/src/main/java/com/gitee/sop/gatewaycommon/secret/IsvManager.java
  18. 20
      sop-common/sop-gateway-common/src/main/java/com/gitee/sop/gatewaycommon/secret/SecretContext.java
  19. 18
      sop-common/sop-gateway-common/src/main/java/com/gitee/sop/gatewaycommon/zuul/configuration/BaseZuulConfiguration.java
  20. 4
      sop-common/sop-service-common/pom.xml
  21. 2
      sop-example/sop-book/sop-book-web/pom.xml
  22. 2
      sop-example/sop-easyopen/pom.xml
  23. 2
      sop-example/sop-springmvc/pom.xml
  24. 2
      sop-example/sop-story/sop-story-web/pom.xml
  25. 2
      sop-gateway/pom.xml
  26. 25
      sop-gateway/src/main/java/com/gitee/sop/gateway/config/GatewayConfig.java
  27. 36
      sop-gateway/src/main/java/com/gitee/sop/gateway/config/ZuulConfig.java
  28. 5
      sop-gateway/src/main/java/com/gitee/sop/gateway/entity/IsvInfo.java
  29. 9
      sop-gateway/src/main/java/com/gitee/sop/gateway/manager/DbIsvManager.java
  30. 1
      sop-gateway/src/main/java/com/gitee/sop/gateway/manager/DbIsvRoutePermissionManager.java
  31. 2
      sop-gateway/src/main/java/com/gitee/sop/gateway/manager/DbRouteConfigManager.java
  32. 35
      sop-gateway/src/main/java/com/gitee/sop/gateway/manager/ManagerInitializer.java
  33. 47
      sop.sql

@ -2,6 +2,11 @@
## 1.4.0 ## 1.4.0
- admin新增signType字段
- 修复easyopen接入无法访问BUG
## 1.4.0
- 新增文档分组显示 - 新增文档分组显示
- 支持easyopen文档注解 - 支持easyopen文档注解
- BUG修复 - BUG修复

@ -49,11 +49,8 @@ public class SopConfig extends EasyopenServiceConfiguration {
```java ```java
@Configuration @Configuration
public class ZuulConfig extends EasyopenZuulConfiguration { public class ZuulConfig extends EasyopenZuulConfiguration {
{ static {
Map<String, String> appSecretStore = new HashMap(); new ManagerInitializer();
// 秘钥键值对
appSecretStore.put("easyopen_test", "G9w0BAQEFAAOCAQ8AMIIBCgKCA");
ApiContext.getApiConfig().addAppSecret(appSecretStore);
} }
} }
``` ```

@ -0,0 +1,3 @@
ALTER TABLE `sop`.`isv_info` ADD COLUMN `sign_type` TINYINT NOT NULL DEFAULT 1 COMMENT '签名类型,1:RSA2,2:MD5' AFTER `status`;
update isv_info set sign_type=2 where secret <> '';

@ -8,6 +8,10 @@ lib.use(['element', 'table', 'form'], function () {
'1': '<span class="x-green">已启用</span>' '1': '<span class="x-green">已启用</span>'
,'2': '<span class="x-red">已禁用</span>' ,'2': '<span class="x-red">已禁用</span>'
} }
var SIGN_TYPE_ENUM = {
'1': 'RSA2'
,'2': 'MD5'
}
// 渲染表格 // 渲染表格
var renderTable = function (postData) { var renderTable = function (postData) {
@ -29,10 +33,21 @@ lib.use(['element', 'table', 'form'], function () {
{field: 'id', title: 'id', width: 80} {field: 'id', title: 'id', width: 80}
, {field: 'appKey', title: 'appKey', width: 250} , {field: 'appKey', title: 'appKey', width: 250}
, {field: 'secret', title: 'secret', width: 80, templet: function (row) { , {field: 'secret', title: 'secret', width: 80, templet: function (row) {
if (row.signType == 2) {
return '<button class="layui-btn layui-btn-xs" onclick="View.secret(\'' + row.secret + '\')">查看</button>'; return '<button class="layui-btn layui-btn-xs" onclick="View.secret(\'' + row.secret + '\')">查看</button>';
} else {
return '';
}
}} }}
, {field: '', title: '公私钥', width: 80, templet: function (row) { , {field: '', title: '公私钥', width: 80, templet: function (row) {
if (row.signType == 1) {
return '<button class="layui-btn layui-btn-xs" onclick="View.pubPriKey(\'' + row.pubKey + '\', \'' + row.priKey + '\')">查看</button>'; return '<button class="layui-btn layui-btn-xs" onclick="View.pubPriKey(\'' + row.pubKey + '\', \'' + row.priKey + '\')">查看</button>';
} else {
return '';
}
}}
, {field: 'signType', title: '签名类型', width: 80, templet: function (row) {
return SIGN_TYPE_ENUM[row.signType+''] || 'unknown';
}} }}
, {field: 'roleList', title: '角色', templet: function (row) { , {field: 'roleList', title: '角色', templet: function (row) {
var html = []; var html = [];

@ -51,6 +51,7 @@ import java.util.stream.Collectors;
@Slf4j @Slf4j
public class IsvApi { public class IsvApi {
public static final int SIGN_TYPE_RSA2 = 1;
@Autowired @Autowired
IsvInfoMapper isvInfoMapper; IsvInfoMapper isvInfoMapper;
@ -159,7 +160,7 @@ public class IsvApi {
} }
private void formatForm(IsvInfoForm form) { private void formatForm(IsvInfoForm form) {
if (form.getSignType() == 1) { if (form.getSignType() == SIGN_TYPE_RSA2) {
form.setSecret(""); form.setSecret("");
} else { } else {
form.setPubKey(""); form.setPubKey("");

@ -4,7 +4,7 @@ import com.gitee.easyopen.doc.annotation.ApiDocField;
import lombok.Data; import lombok.Data;
import org.hibernate.validator.constraints.Length; import org.hibernate.validator.constraints.Length;
import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotNull;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
@ -14,7 +14,8 @@ import java.util.List;
@Data @Data
public class IsvInfoForm { public class IsvInfoForm {
private int signType = 1; @NotNull(message = "signType不能为null")
private Byte signType;
/** secret, 数据库字段:secret */ /** secret, 数据库字段:secret */
@ApiDocField(description = "secret") @ApiDocField(description = "secret")
@ -22,13 +23,11 @@ public class IsvInfoForm {
private String secret = ""; private String secret = "";
/** 公钥, 数据库字段:pub_key */ /** 公钥, 数据库字段:pub_key */
@ApiDocField(description = "pubKey", required = true) @ApiDocField(description = "pubKey")
@NotBlank(message = "pubKey不能为空")
private String pubKey; private String pubKey;
/** 私钥, 数据库字段:pri_key */ /** 私钥, 数据库字段:pri_key */
@ApiDocField(description = "priKey", required = true) @ApiDocField(description = "priKey")
@NotBlank(message = "priKey不能为空")
private String priKey; private String priKey;
/** 0启用,1禁用, 数据库字段:status */ /** 0启用,1禁用, 数据库字段:status */

@ -35,6 +35,9 @@ public class IsvVO {
@ApiDocField(description = "状态:0启用,1禁用") @ApiDocField(description = "状态:0启用,1禁用")
private Byte status; private Byte status;
@ApiDocField(description = "签名类型:1:RSA2,2:MD5")
private Byte signType;
/** 数据库字段:gmt_create */ /** 数据库字段:gmt_create */
@ApiDocField(description = "添加时间") @ApiDocField(description = "添加时间")
private Date gmtCreate; private Date gmtCreate;

@ -2,13 +2,12 @@ package com.gitee.sop.adminserver.entity;
import lombok.Data; import lombok.Data;
import java.util.Date;
import javax.persistence.Column; import javax.persistence.Column;
import javax.persistence.GeneratedValue; import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType; import javax.persistence.GenerationType;
import javax.persistence.Id; import javax.persistence.Id;
import javax.persistence.Table; import javax.persistence.Table;
import java.util.Date;
/** /**
@ -38,9 +37,12 @@ public class IsvInfo {
/** 私钥, 数据库字段:pri_key */ /** 私钥, 数据库字段:pri_key */
private String priKey; private String priKey;
/** 0启用,1禁用, 数据库字段:status */ /** 1启用,2禁用, 数据库字段:status */
private Byte status; private Byte status;
/** 1:RSA2,2:MD5, 数据库字段:sign_type */
private Byte signType;
/** 数据库字段:gmt_create */ /** 数据库字段:gmt_create */
private Date gmtCreate; private Date gmtCreate;

@ -5,7 +5,7 @@
<modelVersion>4.0.0</modelVersion> <modelVersion>4.0.0</modelVersion>
<groupId>com.gitee.sop</groupId> <groupId>com.gitee.sop</groupId>
<artifactId>sop-common</artifactId> <artifactId>sop-common</artifactId>
<version>1.4.0-SNAPSHOT</version> <version>1.5.0-SNAPSHOT</version>
<packaging>pom</packaging> <packaging>pom</packaging>
<properties> <properties>

@ -5,11 +5,11 @@
<parent> <parent>
<groupId>com.gitee.sop</groupId> <groupId>com.gitee.sop</groupId>
<artifactId>sop-common</artifactId> <artifactId>sop-common</artifactId>
<version>1.4.0-SNAPSHOT</version> <version>1.5.0-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath> <relativePath>../pom.xml</relativePath>
</parent> </parent>
<artifactId>sop-gateway-common</artifactId> <artifactId>sop-gateway-common</artifactId>
<version>1.4.0-SNAPSHOT</version> <version>1.5.0-SNAPSHOT</version>
<packaging>jar</packaging> <packaging>jar</packaging>
<name>sop-gateway-common</name> <name>sop-gateway-common</name>

@ -0,0 +1,8 @@
package com.gitee.sop.gatewaycommon.bean;
/**
* @author tanghc
*/
public interface BeanInitializer {
void load();
}

@ -3,6 +3,7 @@ package com.gitee.sop.gatewaycommon.easyopen;
import com.gitee.sop.gatewaycommon.bean.ApiConfig; import com.gitee.sop.gatewaycommon.bean.ApiConfig;
import com.gitee.sop.gatewaycommon.bean.ApiContext; import com.gitee.sop.gatewaycommon.bean.ApiContext;
import com.gitee.sop.gatewaycommon.param.ParamNames; import com.gitee.sop.gatewaycommon.param.ParamNames;
import com.gitee.sop.gatewaycommon.secret.SecretContext;
import com.gitee.sop.gatewaycommon.zuul.configuration.BaseZuulConfiguration; import com.gitee.sop.gatewaycommon.zuul.configuration.BaseZuulConfiguration;
/** /**
@ -10,6 +11,10 @@ import com.gitee.sop.gatewaycommon.zuul.configuration.BaseZuulConfiguration;
*/ */
public class EasyopenZuulConfiguration extends BaseZuulConfiguration { public class EasyopenZuulConfiguration extends BaseZuulConfiguration {
static {
SecretContext.setSecretGetter((isvDefinition)-> isvDefinition.getSecret());
}
public EasyopenZuulConfiguration() { public EasyopenZuulConfiguration() {
ApiConfig apiConfig = ApiContext.getApiConfig(); ApiConfig apiConfig = ApiContext.getApiConfig();
if (compatibilityModel()) { if (compatibilityModel()) {

@ -1,8 +1,12 @@
package com.gitee.sop.gatewaycommon.manager; package com.gitee.sop.gatewaycommon.manager;
import com.gitee.sop.gatewaycommon.bean.ApiContext; import com.gitee.sop.gatewaycommon.bean.ApiContext;
import com.gitee.sop.gatewaycommon.bean.BeanInitializer;
import com.gitee.sop.gatewaycommon.message.ErrorFactory; import com.gitee.sop.gatewaycommon.message.ErrorFactory;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.core.env.Environment; import org.springframework.core.env.Environment;
import javax.annotation.PostConstruct; import javax.annotation.PostConstruct;
@ -10,13 +14,20 @@ import javax.annotation.PostConstruct;
/** /**
* @author tanghc * @author tanghc
*/ */
public class AbstractConfiguration { public class AbstractConfiguration implements ApplicationContextAware {
@Autowired @Autowired
protected Environment environment; protected Environment environment;
@Autowired @Autowired
protected RouteManager apiMetaManager; protected RouteManager apiMetaManager;
protected ApplicationContext applicationContext;
@Override
public void setApplicationContext(ApplicationContext ctx) throws BeansException {
applicationContext = ctx;
}
@PostConstruct @PostConstruct
public final void after() { public final void after() {
if (RouteRepositoryContext.getRouteRepository() == null) { if (RouteRepositoryContext.getRouteRepository() == null) {
@ -26,8 +37,20 @@ public class AbstractConfiguration {
ZookeeperContext.setEnvironment(environment); ZookeeperContext.setEnvironment(environment);
initMessage(); initMessage();
initBeanInitializer();
apiMetaManager.refresh(); apiMetaManager.refresh();
doAfter(); doAfter();
}
protected void initBeanInitializer() {
String[] beanNames = applicationContext.getBeanNamesForType(BeanInitializer.class);
if (beanNames != null) {
for (String beanName : beanNames) {
BeanInitializer beanInitializer = applicationContext.getBean(beanName, BeanInitializer.class);
beanInitializer.load();
}
}
} }
protected void doAfter() { protected void doAfter() {

@ -1,16 +1,12 @@
package com.gitee.sop.gatewaycommon.manager; package com.gitee.sop.gatewaycommon.manager;
import com.gitee.sop.gatewaycommon.bean.BeanInitializer;
import com.gitee.sop.gatewaycommon.bean.IsvRoutePermission; import com.gitee.sop.gatewaycommon.bean.IsvRoutePermission;
/** /**
* @author tanghc * @author tanghc
*/ */
public interface IsvRoutePermissionManager { public interface IsvRoutePermissionManager extends BeanInitializer {
/**
* 加载路由权限信息
*/
void load();
/** /**
* 加载权限 * 加载权限

@ -1,5 +1,6 @@
package com.gitee.sop.gatewaycommon.manager; package com.gitee.sop.gatewaycommon.manager;
import com.gitee.sop.gatewaycommon.bean.BeanInitializer;
import com.gitee.sop.gatewaycommon.bean.RouteConfig; import com.gitee.sop.gatewaycommon.bean.RouteConfig;
import com.gitee.sop.gatewaycommon.bean.RouteConfigDto; import com.gitee.sop.gatewaycommon.bean.RouteConfigDto;
@ -7,12 +8,7 @@ import com.gitee.sop.gatewaycommon.bean.RouteConfigDto;
* 路由配置管理 * 路由配置管理
* @author tanghc * @author tanghc
*/ */
public interface RouteConfigManager { public interface RouteConfigManager extends BeanInitializer {
/**
* 加载
*/
void load();
/** /**
* 更新路由配置 * 更新路由配置
* @param routeConfigDto 路由配置 * @param routeConfigDto 路由配置

@ -4,8 +4,6 @@ import com.gitee.sop.gatewaycommon.bean.IsvDefinition;
import java.util.Map; import java.util.Map;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
import java.util.function.Function;
import java.util.function.Supplier;
/** /**
* @author tanghc * @author tanghc
@ -18,7 +16,7 @@ public class CacheIsvManager implements IsvManager<IsvDefinition> {
private Map<String, IsvDefinition> isvCache = new ConcurrentHashMap<>(64); private Map<String, IsvDefinition> isvCache = new ConcurrentHashMap<>(64);
@Override @Override
public void load(Function<Object, String> secretGetter) { public void load() {
} }

@ -1,19 +1,13 @@
package com.gitee.sop.gatewaycommon.secret; package com.gitee.sop.gatewaycommon.secret;
import com.gitee.sop.gatewaycommon.bean.BeanInitializer;
import com.gitee.sop.gatewaycommon.bean.Isv; import com.gitee.sop.gatewaycommon.bean.Isv;
import java.util.function.Function;
/** /**
* Isv管理 * Isv管理
* @author tanghc * @author tanghc
*/ */
public interface IsvManager<T extends Isv> { public interface IsvManager<T extends Isv> extends BeanInitializer {
/**
* 加载isv信息
* @param secretGetter secret获取
*/
void load(Function<Object, String> secretGetter);
void update(T t); void update(T t);

@ -0,0 +1,20 @@
package com.gitee.sop.gatewaycommon.secret;
import com.gitee.sop.gatewaycommon.bean.IsvDefinition;
import java.util.function.Function;
/**
* @author tanghc
*/
public class SecretContext {
private static volatile Function<IsvDefinition, String> secretGetter = (isv) -> isv.getPubKey();
public static Function<IsvDefinition, String> getSecretGetter() {
return secretGetter;
}
public static void setSecretGetter(Function<IsvDefinition, String> secretGetter) {
SecretContext.secretGetter = secretGetter;
}
}

@ -1,8 +1,12 @@
package com.gitee.sop.gatewaycommon.zuul.configuration; package com.gitee.sop.gatewaycommon.zuul.configuration;
import com.gitee.sop.gatewaycommon.bean.ApiConfig;
import com.gitee.sop.gatewaycommon.bean.ApiContext; import com.gitee.sop.gatewaycommon.bean.ApiContext;
import com.gitee.sop.gatewaycommon.manager.AbstractConfiguration; import com.gitee.sop.gatewaycommon.manager.AbstractConfiguration;
import com.gitee.sop.gatewaycommon.manager.IsvRoutePermissionManager;
import com.gitee.sop.gatewaycommon.manager.RouteConfigManager;
import com.gitee.sop.gatewaycommon.manager.RouteRepositoryContext; import com.gitee.sop.gatewaycommon.manager.RouteRepositoryContext;
import com.gitee.sop.gatewaycommon.secret.IsvManager;
import com.gitee.sop.gatewaycommon.zuul.filter.ErrorFilter; import com.gitee.sop.gatewaycommon.zuul.filter.ErrorFilter;
import com.gitee.sop.gatewaycommon.zuul.filter.PostResultFilter; import com.gitee.sop.gatewaycommon.zuul.filter.PostResultFilter;
import com.gitee.sop.gatewaycommon.zuul.filter.PreLimitFilter; import com.gitee.sop.gatewaycommon.zuul.filter.PreLimitFilter;
@ -116,4 +120,18 @@ public class BaseZuulConfiguration extends AbstractConfiguration {
return ApiContext.getApiConfig().getZuulErrorController(); return ApiContext.getApiConfig().getZuulErrorController();
} }
@Bean
IsvManager isvManager() {
return ApiConfig.getInstance().getIsvManager();
}
@Bean
IsvRoutePermissionManager isvRoutePermissionManager() {
return ApiConfig.getInstance().getIsvRoutePermissionManager();
}
@Bean
RouteConfigManager routeConfigManager() {
return ApiConfig.getInstance().getRouteConfigManager();
}
} }

@ -6,11 +6,11 @@
<parent> <parent>
<groupId>com.gitee.sop</groupId> <groupId>com.gitee.sop</groupId>
<artifactId>sop-common</artifactId> <artifactId>sop-common</artifactId>
<version>1.4.0-SNAPSHOT</version> <version>1.5.0-SNAPSHOT</version>
<relativePath>../pom.xml</relativePath> <relativePath>../pom.xml</relativePath>
</parent> </parent>
<artifactId>sop-service-common</artifactId> <artifactId>sop-service-common</artifactId>
<version>1.4.0-SNAPSHOT</version> <version>1.5.0-SNAPSHOT</version>
<packaging>jar</packaging> <packaging>jar</packaging>
<name>sop-service-common</name> <name>sop-service-common</name>

@ -23,7 +23,7 @@
<dependency> <dependency>
<groupId>com.gitee.sop</groupId> <groupId>com.gitee.sop</groupId>
<artifactId>sop-service-common</artifactId> <artifactId>sop-service-common</artifactId>
<version>1.4.0-SNAPSHOT</version> <version>1.5.0-SNAPSHOT</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>com.gitee.sop</groupId> <groupId>com.gitee.sop</groupId>

@ -29,7 +29,7 @@
<dependency> <dependency>
<groupId>com.gitee.sop</groupId> <groupId>com.gitee.sop</groupId>
<artifactId>sop-service-common</artifactId> <artifactId>sop-service-common</artifactId>
<version>1.4.0-SNAPSHOT</version> <version>1.5.0-SNAPSHOT</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>org.springframework.cloud</groupId> <groupId>org.springframework.cloud</groupId>

@ -20,7 +20,7 @@
<dependency> <dependency>
<groupId>com.gitee.sop</groupId> <groupId>com.gitee.sop</groupId>
<artifactId>sop-service-common</artifactId> <artifactId>sop-service-common</artifactId>
<version>1.4.0-SNAPSHOT</version> <version>1.5.0-SNAPSHOT</version>
</dependency> </dependency>
<!-- eureka 服务发现 --> <!-- eureka 服务发现 -->
<dependency> <dependency>

@ -23,7 +23,7 @@
<dependency> <dependency>
<groupId>com.gitee.sop</groupId> <groupId>com.gitee.sop</groupId>
<artifactId>sop-service-common</artifactId> <artifactId>sop-service-common</artifactId>
<version>1.4.0-SNAPSHOT</version> <version>1.5.0-SNAPSHOT</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>com.gitee.sop</groupId> <groupId>com.gitee.sop</groupId>

@ -23,7 +23,7 @@
<dependency> <dependency>
<groupId>com.gitee.sop</groupId> <groupId>com.gitee.sop</groupId>
<artifactId>sop-gateway-common</artifactId> <artifactId>sop-gateway-common</artifactId>
<version>1.4.0-SNAPSHOT</version> <version>1.5.0-SNAPSHOT</version>
</dependency> </dependency>
<!-- ↓↓↓ 使用spring cloud zuul ↓↓↓ --> <!-- ↓↓↓ 使用spring cloud zuul ↓↓↓ -->

@ -1,18 +1,7 @@
package com.gitee.sop.gateway.config; package com.gitee.sop.gateway.config;
import com.gitee.sop.gateway.entity.IsvInfo;
import com.gitee.sop.gateway.manager.ManagerInitializer; import com.gitee.sop.gateway.manager.ManagerInitializer;
import com.gitee.sop.gatewaycommon.bean.ApiConfig;
import com.gitee.sop.gatewaycommon.bean.ApiContext;
import com.gitee.sop.gatewaycommon.gateway.configuration.AlipayGatewayConfiguration; import com.gitee.sop.gatewaycommon.gateway.configuration.AlipayGatewayConfiguration;
import com.gitee.sop.gatewaycommon.manager.IsvRoutePermissionManager;
import com.gitee.sop.gatewaycommon.secret.IsvManager;
import com.gitee.sop.gatewaycommon.zuul.configuration.AlipayZuulConfiguration;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import java.util.HashMap;
import java.util.Map;
/** /**
@ -31,18 +20,8 @@ import java.util.Map;
//@Configuration //@Configuration
public class GatewayConfig extends AlipayGatewayConfiguration { public class GatewayConfig extends AlipayGatewayConfiguration {
{ static {
Map<String, String> appSecretStore = new HashMap(); new ManagerInitializer();
appSecretStore.put("2019032617262200001", "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAlyb9aUBaljQP/vjmBFe1mF8HsWSvyfC2NTlpT/V9E+sBxTr8TSkbzJCeeeOEm4LCaVXL0Qz63MZoT24v7AIXTuMdj4jyiM/WJ4tjrWAgnmohNOegfntTto16C3l234vXz4ryWZMR/7W+MXy5B92wPGQEJ0LKFwNEoLspDEWZ7RdE53VH7w6y6sIZUfK+YkXWSwehfKPKlx+lDw3zRJ3/yvMF+U+BAdW/MfECe1GuBnCFKnlMRh3UKczWyXWkL6ItOpYHHJi/jx85op5BWDje2pY9QowzfN94+0DB3T7UvZeweu3zlP6diwAJDzLaFQX8ULfWhY+wfKxIRgs9NoiSAQIDAQAB");
ApiContext.getApiConfig().addAppSecret(appSecretStore);
}
@Autowired
ManagerInitializer managerInitializer;
@Override
protected void doAfter() {
managerInitializer.init();
} }
} }

@ -7,14 +7,9 @@ package com.gitee.sop.gateway.config;
*/ */
import com.gitee.sop.gateway.manager.ManagerInitializer; import com.gitee.sop.gateway.manager.ManagerInitializer;
import com.gitee.sop.gatewaycommon.bean.ApiContext;
import com.gitee.sop.gatewaycommon.zuul.configuration.AlipayZuulConfiguration; import com.gitee.sop.gatewaycommon.zuul.configuration.AlipayZuulConfiguration;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
import java.util.HashMap;
import java.util.Map;
/** /**
* 开通支付宝开放平台能力 * 开通支付宝开放平台能力
* @author tanghc * @author tanghc
@ -22,21 +17,8 @@ import java.util.Map;
@Configuration @Configuration
public class ZuulConfig extends AlipayZuulConfiguration { public class ZuulConfig extends AlipayZuulConfiguration {
{ static {
Map<String, String> appSecretStore = new HashMap(); new ManagerInitializer();
// 这里存放商户给的公钥,同时商户那边会存对应的私钥
// key:应用ID(app_id):建议个格式为`yyyyMMddHHmmss+自增ID`,如2019032617262200001
// value:公钥
appSecretStore.put("2019032617262200001", "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAlyb9aUBaljQP/vjmBFe1mF8HsWSvyfC2NTlpT/V9E+sBxTr8TSkbzJCeeeOEm4LCaVXL0Qz63MZoT24v7AIXTuMdj4jyiM/WJ4tjrWAgnmohNOegfntTto16C3l234vXz4ryWZMR/7W+MXy5B92wPGQEJ0LKFwNEoLspDEWZ7RdE53VH7w6y6sIZUfK+YkXWSwehfKPKlx+lDw3zRJ3/yvMF+U+BAdW/MfECe1GuBnCFKnlMRh3UKczWyXWkL6ItOpYHHJi/jx85op5BWDje2pY9QowzfN94+0DB3T7UvZeweu3zlP6diwAJDzLaFQX8ULfWhY+wfKxIRgs9NoiSAQIDAQAB");
ApiContext.getApiConfig().addAppSecret(appSecretStore);
}
@Autowired
ManagerInitializer managerInitializer;
@Override
protected void doAfter() {
managerInitializer.init();
} }
} }
@ -47,11 +29,8 @@ public class ZuulConfig extends AlipayZuulConfiguration {
*/ */
//@Configuration //@Configuration
//public class ZuulConfig extends TaobaoZuulConfiguration { //public class ZuulConfig extends TaobaoZuulConfiguration {
// // static {
// { // new ManagerInitializer();
// Map<String, String> appSecretStore = new HashMap();
// appSecretStore.put("taobao_test", "G9w0BAQEFAAOCAQ8AMIIBCgKCA");
// ApiContext.getApiConfig().addAppSecret(appSecretStore);
// } // }
//} //}
@ -60,9 +39,8 @@ public class ZuulConfig extends AlipayZuulConfiguration {
*/ */
//@Configuration //@Configuration
//public class ZuulConfig extends EasyopenZuulConfiguration { //public class ZuulConfig extends EasyopenZuulConfiguration {
// { // static {
// Map<String, String> appSecretStore = new HashMap(); // new ManagerInitializer();
// appSecretStore.put("easyopen_test", "G9w0BAQEFAAOCAQ8AMIIBCgKCA");
// ApiContext.getApiConfig().addAppSecret(appSecretStore);
// } // }
//
//} //}

@ -37,9 +37,12 @@ public class IsvInfo {
/** 私钥, 数据库字段:pri_key */ /** 私钥, 数据库字段:pri_key */
private String priKey; private String priKey;
/** 0启用,1禁用, 数据库字段:status */ /** 1启用,2禁用, 数据库字段:status */
private Byte status; private Byte status;
/** 1:RSA2,2:MD5, 数据库字段:sign_type */
private Byte signType;
/** 数据库字段:gmt_create */ /** 数据库字段:gmt_create */
private Date gmtCreate; private Date gmtCreate;

@ -8,11 +8,11 @@ import com.gitee.sop.gatewaycommon.bean.ChannelMsg;
import com.gitee.sop.gatewaycommon.bean.IsvDefinition; import com.gitee.sop.gatewaycommon.bean.IsvDefinition;
import com.gitee.sop.gatewaycommon.manager.ZookeeperContext; import com.gitee.sop.gatewaycommon.manager.ZookeeperContext;
import com.gitee.sop.gatewaycommon.secret.CacheIsvManager; import com.gitee.sop.gatewaycommon.secret.CacheIsvManager;
import com.gitee.sop.gatewaycommon.secret.SecretContext;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils; import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.env.Environment; import org.springframework.core.env.Environment;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct; import javax.annotation.PostConstruct;
import java.util.List; import java.util.List;
@ -21,7 +21,6 @@ import java.util.function.Function;
/** /**
* @author tanghc * @author tanghc
*/ */
@Component
@Slf4j @Slf4j
public class DbIsvManager extends CacheIsvManager { public class DbIsvManager extends CacheIsvManager {
@ -31,14 +30,16 @@ public class DbIsvManager extends CacheIsvManager {
@Autowired @Autowired
Environment environment; Environment environment;
@Override @Override
public void load(Function<Object, String> secretGetter) { public void load() {
List<IsvInfo> isvInfoList = isvInfoMapper.list(new Query()); List<IsvInfo> isvInfoList = isvInfoMapper.list(new Query());
Function<IsvDefinition, String> secretGetter = SecretContext.getSecretGetter();
isvInfoList.stream() isvInfoList.stream()
.forEach(isvInfo -> { .forEach(isvInfo -> {
IsvDefinition isvDefinition = new IsvDefinition(); IsvDefinition isvDefinition = new IsvDefinition();
BeanUtils.copyProperties(isvInfo, isvDefinition); BeanUtils.copyProperties(isvInfo, isvDefinition);
String secret = secretGetter.apply(isvInfo); String secret = secretGetter.apply(isvDefinition);
isvDefinition.setSecret(secret); isvDefinition.setSecret(secret);
this.getIsvCache().put(isvDefinition.getAppKey(), isvDefinition); this.getIsvCache().put(isvDefinition.getAppKey(), isvDefinition);
}); });

@ -35,7 +35,6 @@ import static java.util.stream.Collectors.toList;
* *
* @author tanghc * @author tanghc
*/ */
@Component
@Slf4j @Slf4j
public class DbIsvRoutePermissionManager extends DefaultIsvRoutePermissionManager { public class DbIsvRoutePermissionManager extends DefaultIsvRoutePermissionManager {

@ -15,7 +15,6 @@ import com.gitee.sop.gatewaycommon.manager.ZookeeperContext;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.env.Environment; import org.springframework.core.env.Environment;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct; import javax.annotation.PostConstruct;
import java.util.Collection; import java.util.Collection;
@ -23,7 +22,6 @@ import java.util.Collection;
/** /**
* @author tanghc * @author tanghc
*/ */
@Component
@Slf4j @Slf4j
public class DbRouteConfigManager extends DefaultRouteConfigManager { public class DbRouteConfigManager extends DefaultRouteConfigManager {

@ -1,43 +1,16 @@
package com.gitee.sop.gateway.manager; package com.gitee.sop.gateway.manager;
import com.gitee.sop.gateway.entity.IsvInfo;
import com.gitee.sop.gatewaycommon.bean.ApiConfig; import com.gitee.sop.gatewaycommon.bean.ApiConfig;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
/** /**
* @author tanghc * @author tanghc
*/ */
@Component
@Slf4j
public class ManagerInitializer { public class ManagerInitializer {
@Autowired
DbIsvManager dbIsvManager;
@Autowired public ManagerInitializer() {
DbIsvRoutePermissionManager dbIsvRoutePermissionManager;
@Autowired
DbRouteConfigManager dbRouteConfigManager;
public void init() {
ApiConfig apiConfig = ApiConfig.getInstance(); ApiConfig apiConfig = ApiConfig.getInstance();
apiConfig.setIsvManager(dbIsvManager); apiConfig.setIsvManager(new DbIsvManager());
apiConfig.setIsvRoutePermissionManager(dbIsvRoutePermissionManager); apiConfig.setIsvRoutePermissionManager(new DbIsvRoutePermissionManager());
apiConfig.setRouteConfigManager(dbRouteConfigManager); apiConfig.setRouteConfigManager(new DbRouteConfigManager());
// 从数据库加载isv信息
log.debug("从数据库加载isv信息");
dbIsvManager.load((isvInfoObj) -> {
IsvInfo isvInfo = (IsvInfo)isvInfoObj;
return isvInfo.getPubKey();
});
log.debug("从数据库加载路由权限信息");
dbIsvRoutePermissionManager.load();
log.debug("从数据库加载路由配置信息");
dbRouteConfigManager.load();
} }
} }

@ -1,10 +1,3 @@
#
# SQL Export
# Created by Querious (201048)
# Created: 2019年4月15日 GMT+8 下午8:09:15
# Encoding: Unicode (UTF-8)
#
CREATE DATABASE IF NOT EXISTS `sop` DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci; CREATE DATABASE IF NOT EXISTS `sop` DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;
USE `sop`; USE `sop`;
@ -45,7 +38,7 @@ CREATE TABLE `config_route_base` (
`gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`), PRIMARY KEY (`id`),
UNIQUE KEY `uk_routeid` (`route_id`) USING BTREE UNIQUE KEY `uk_routeid` (`route_id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 COMMENT='路由配置表'; ) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8 COMMENT='路由配置表';
CREATE TABLE `config_route_limit` ( CREATE TABLE `config_route_limit` (
@ -72,11 +65,12 @@ CREATE TABLE `isv_info` (
`pub_key` text COMMENT '公钥', `pub_key` text COMMENT '公钥',
`pri_key` text COMMENT '私钥', `pri_key` text COMMENT '私钥',
`status` tinyint(4) unsigned NOT NULL DEFAULT '0' COMMENT '1启用,2禁用', `status` tinyint(4) unsigned NOT NULL DEFAULT '0' COMMENT '1启用,2禁用',
`sign_type` tinyint(4) NOT NULL DEFAULT '1' COMMENT '1:RSA2,2:MD5',
`gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
`gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`), PRIMARY KEY (`id`),
UNIQUE KEY `uk_app_key` (`app_key`) UNIQUE KEY `uk_app_key` (`app_key`)
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8 COMMENT='isv信息表'; ) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8 COMMENT='isv信息表';
CREATE TABLE `perm_isv_role` ( CREATE TABLE `perm_isv_role` (
@ -87,7 +81,7 @@ CREATE TABLE `perm_isv_role` (
`gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`), PRIMARY KEY (`id`),
UNIQUE KEY `uk_user_role` (`isv_id`,`role_code`) UNIQUE KEY `uk_user_role` (`isv_id`,`role_code`)
) ENGINE=InnoDB AUTO_INCREMENT=37 DEFAULT CHARSET=utf8 COMMENT='isv角色'; ) ENGINE=InnoDB AUTO_INCREMENT=41 DEFAULT CHARSET=utf8 COMMENT='isv角色';
CREATE TABLE `perm_role` ( CREATE TABLE `perm_role` (
@ -109,7 +103,7 @@ CREATE TABLE `perm_role_permission` (
`gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, `gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`), PRIMARY KEY (`id`),
UNIQUE KEY `uk_role_perm` (`role_code`,`route_id`) USING BTREE UNIQUE KEY `uk_role_perm` (`role_code`,`route_id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8 COMMENT='角色权限表'; ) ENGINE=InnoDB AUTO_INCREMENT=16 DEFAULT CHARSET=utf8 COMMENT='角色权限表';
@ -133,8 +127,10 @@ LOCK TABLES `config_route_base` WRITE;
ALTER TABLE `config_route_base` DISABLE KEYS; ALTER TABLE `config_route_base` DISABLE KEYS;
INSERT INTO `config_route_base` (`id`, `route_id`, `status`, `gmt_create`, `gmt_modified`) VALUES INSERT INTO `config_route_base` (`id`, `route_id`, `status`, `gmt_create`, `gmt_modified`) VALUES
(1,'story.get1.1',1,'2019-04-09 19:15:58','2019-04-09 19:16:54'), (1,'story.get1.1',1,'2019-04-09 19:15:58','2019-04-09 19:16:54'),
(2,'alipay.story.get1.0',1,'2019-04-09 19:19:57','2019-04-11 09:35:26'), (2,'alipay.story.get1.0',1,'2019-04-09 19:19:57','2019-04-19 14:45:33'),
(3,'alipay.story.find1.0',1,'2019-04-11 09:29:55','2019-04-11 09:35:02'); (3,'alipay.story.find1.0',1,'2019-04-11 09:29:55','2019-04-11 09:35:02'),
(4,'alipay.book.story.get1.0',1,'2019-04-16 10:23:44','2019-04-16 10:23:44'),
(5,'spirngmvc.goods.get1.0',2,'2019-04-16 10:24:08','2019-04-16 10:24:08');
ALTER TABLE `config_route_base` ENABLE KEYS; ALTER TABLE `config_route_base` ENABLE KEYS;
UNLOCK TABLES; UNLOCK TABLES;
@ -151,14 +147,15 @@ UNLOCK TABLES;
LOCK TABLES `isv_info` WRITE; LOCK TABLES `isv_info` WRITE;
ALTER TABLE `isv_info` DISABLE KEYS; ALTER TABLE `isv_info` DISABLE KEYS;
INSERT INTO `isv_info` (`id`, `app_key`, `secret`, `pub_key`, `pri_key`, `status`, `gmt_create`, `gmt_modified`) VALUES INSERT INTO `isv_info` (`id`, `app_key`, `secret`, `pub_key`, `pri_key`, `status`, `sign_type`, `gmt_create`, `gmt_modified`) VALUES
(1,'2019032617262200001','','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',1,'2019-03-27 10:10:34','2019-04-01 20:54:01'), (1,'2019032617262200001','','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',1,1,'2019-03-27 10:10:34','2019-04-19 19:21:40'),
(3,'asdfasdf','','333','4444',2,'2019-03-27 11:01:11','2019-04-14 23:30:17'), (3,'asdfasdf','','333','4444',2,1,'2019-03-27 11:01:11','2019-04-14 23:30:17'),
(5,'20190331562013861008375808','29864b93427447f5ac6c44df746f84ef','MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC4aMIx2q8rCVu5z6dgNQQSX2vwhvIcRb7FaqSk0ZK8AV9qQeE1TvfFVlAzOHlysE1yTRb0Mb6W2aw7IAS7Bkc3onYBQR4zNQYjYoDBzLukjF8o84hoVFRnh7sV8zszid2vb5H/YQr3M+5sYhlXY8KfILk3vhdbWpHM/umplcrxlwIDAQAB','MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBALhowjHarysJW7nPp2A1BBJfa/CG8hxFvsVqpKTRkrwBX2pB4TVO98VWUDM4eXKwTXJNFvQxvpbZrDsgBLsGRzeidgFBHjM1BiNigMHMu6SMXyjziGhUVGeHuxXzOzOJ3a9vkf9hCvcz7mxiGVdjwp8guTe+F1takcz+6amVyvGXAgMBAAECgYBj40LFVGoryp7n0CYeg7kX5p4GJGKCk/jY4IIcUPTFZ4zydorxoDuvpag9hmqqh/r7XeyAC23sMi4LvLUzRRxPh+7PuwL6nLce7vytsMCZQTPpBgz7dUfbi2HAxsuMOLjH3sVGycutARJsz6bT+9PyBEuVtUqwBrDGpFvwT0z6yQJBAOANC8nysb+O4rn/fbJtHIhtQoV74yu00mLnfwv8/J1+WyAEc32WZ4KYINqCe8ft1UknhPQx9UV6JaPCnlpF6w0CQQDStJhd38uQ7dVUQZHGP24xS/K38AYiSheEr7uewhkJfC2cKqE/lBk3oEG4s7asjhwlFLWLWSBLVM/Ta9Yj0hYzAkBe82hxl1bY9bcEWFBu02rqLlOouk4V8bXPkIf5DqgIHsqDkR9Ys+r+H3ac4/uNSS/ApuzjiGCHpzJYalwtqb/pAkEAvAKlSm5dCC8QAaSYXJtQyfAI3hPwhTwzjBP6iAiNqqcBU62+QCr37Wiz/Alv4LzVZEj8TSDz7gP5hZ9dbo0RfQJBALJ7NhTaeMN4jxBJ6Xg4rNZPb4yhAXuFxCp+a+FyXTsbWnW/ar8KJ3LHox0GOao6wne4qN3h7eqLOrYnnvOSFl0=',1,'2019-03-31 20:34:12','2019-03-31 22:07:50'), (5,'20190331562013861008375808','29864b93427447f5ac6c44df746f84ef','MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC4aMIx2q8rCVu5z6dgNQQSX2vwhvIcRb7FaqSk0ZK8AV9qQeE1TvfFVlAzOHlysE1yTRb0Mb6W2aw7IAS7Bkc3onYBQR4zNQYjYoDBzLukjF8o84hoVFRnh7sV8zszid2vb5H/YQr3M+5sYhlXY8KfILk3vhdbWpHM/umplcrxlwIDAQAB','MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBALhowjHarysJW7nPp2A1BBJfa/CG8hxFvsVqpKTRkrwBX2pB4TVO98VWUDM4eXKwTXJNFvQxvpbZrDsgBLsGRzeidgFBHjM1BiNigMHMu6SMXyjziGhUVGeHuxXzOzOJ3a9vkf9hCvcz7mxiGVdjwp8guTe+F1takcz+6amVyvGXAgMBAAECgYBj40LFVGoryp7n0CYeg7kX5p4GJGKCk/jY4IIcUPTFZ4zydorxoDuvpag9hmqqh/r7XeyAC23sMi4LvLUzRRxPh+7PuwL6nLce7vytsMCZQTPpBgz7dUfbi2HAxsuMOLjH3sVGycutARJsz6bT+9PyBEuVtUqwBrDGpFvwT0z6yQJBAOANC8nysb+O4rn/fbJtHIhtQoV74yu00mLnfwv8/J1+WyAEc32WZ4KYINqCe8ft1UknhPQx9UV6JaPCnlpF6w0CQQDStJhd38uQ7dVUQZHGP24xS/K38AYiSheEr7uewhkJfC2cKqE/lBk3oEG4s7asjhwlFLWLWSBLVM/Ta9Yj0hYzAkBe82hxl1bY9bcEWFBu02rqLlOouk4V8bXPkIf5DqgIHsqDkR9Ys+r+H3ac4/uNSS/ApuzjiGCHpzJYalwtqb/pAkEAvAKlSm5dCC8QAaSYXJtQyfAI3hPwhTwzjBP6iAiNqqcBU62+QCr37Wiz/Alv4LzVZEj8TSDz7gP5hZ9dbo0RfQJBALJ7NhTaeMN4jxBJ6Xg4rNZPb4yhAXuFxCp+a+FyXTsbWnW/ar8KJ3LHox0GOao6wne4qN3h7eqLOrYnnvOSFl0=',1,2,'2019-03-31 20:34:12','2019-04-19 17:30:09'),
(6,'20190331562037310372184064','d6b2a6603236491f87eed958292be136','MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCcZTAaR5K7mk1epfLwK6XRrBiakiwIJK3wtUd8EzpcAnS7Yr8uq5U4yJKZQqu5BtFiWmTFFmAm4aBQKXH1u+6kfcRduYZDLC0cfBPA7IfLnumdrR8uiCgQgGSF71Q4NhebrOqzTAftxZ1vYMCDay1DY2BQxEiGICoCQ0abtvrfNQIDAQAB','MIICeQIBADANBgkqhkiG9w0BAQEFAASCAmMwggJfAgEAAoGBAJxlMBpHkruaTV6l8vArpdGsGJqSLAgkrfC1R3wTOlwCdLtivy6rlTjIkplCq7kG0WJaZMUWYCbhoFApcfW77qR9xF25hkMsLRx8E8Dsh8ue6Z2tHy6IKBCAZIXvVDg2F5us6rNMB+3FnW9gwINrLUNjYFDESIYgKgJDRpu2+t81AgMBAAECgYEAiu/FzQLakvkgVL4eVUihVeSKMv86SL21HMsex1YZmVXBOBsgdqiNt1VQDwFQpt4sszBUp1Yac1Ar6Cr5h3G+LVS17n517MjVeEihrmxK6VL1bUoC9Mpj4ZwuLQ0jeFYVBWEhESV/O59O8YRvk0YpIzUUaLj0+qEQBsPKLPSp8MECQQDY3A9Z+i19fPpd5hBl5x7cyzx9KeX2aru0kUMMmm3JeL1dSPSUuqmnTFdtveQrIUab9OYdJgxLtKoh3J8YqDqFAkEAuJ9jn1VNCIpXF8xsI4w1U5QFdXKnGGZ8PePHqWG1B8A9afj2o7T6gDW/xzX/k8g/2belAR3y4nXGo0EikMso8QJBANXWqYygFZtYUcmlwyW48cXm4o7Jcem69bzoQKV84iV42cHS3tqJ9iDyNoQQa53cAjRnGUJE8nr0e49IbdlyicECQQCz8vdhJ/1ro5t8IM4OX+ziR9aCQXxItivHDytfF1Mh+OhjUDzmF9JKARmqDCHOY1KI3QzBZ/WDcZRpL2WHh92hAkEAyetUnYn1F5zVJWxo+yC9PH6WYssZahNy22GdBcZblmDc/YQWw+sa9d55/5aMoYWn6AVO9Tb2gsMW2W0jM2/zCw==',2,'2019-03-31 22:07:20','2019-03-31 22:07:26'), (6,'20190331562037310372184064','d6b2a6603236491f87eed958292be136','MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCcZTAaR5K7mk1epfLwK6XRrBiakiwIJK3wtUd8EzpcAnS7Yr8uq5U4yJKZQqu5BtFiWmTFFmAm4aBQKXH1u+6kfcRduYZDLC0cfBPA7IfLnumdrR8uiCgQgGSF71Q4NhebrOqzTAftxZ1vYMCDay1DY2BQxEiGICoCQ0abtvrfNQIDAQAB','MIICeQIBADANBgkqhkiG9w0BAQEFAASCAmMwggJfAgEAAoGBAJxlMBpHkruaTV6l8vArpdGsGJqSLAgkrfC1R3wTOlwCdLtivy6rlTjIkplCq7kG0WJaZMUWYCbhoFApcfW77qR9xF25hkMsLRx8E8Dsh8ue6Z2tHy6IKBCAZIXvVDg2F5us6rNMB+3FnW9gwINrLUNjYFDESIYgKgJDRpu2+t81AgMBAAECgYEAiu/FzQLakvkgVL4eVUihVeSKMv86SL21HMsex1YZmVXBOBsgdqiNt1VQDwFQpt4sszBUp1Yac1Ar6Cr5h3G+LVS17n517MjVeEihrmxK6VL1bUoC9Mpj4ZwuLQ0jeFYVBWEhESV/O59O8YRvk0YpIzUUaLj0+qEQBsPKLPSp8MECQQDY3A9Z+i19fPpd5hBl5x7cyzx9KeX2aru0kUMMmm3JeL1dSPSUuqmnTFdtveQrIUab9OYdJgxLtKoh3J8YqDqFAkEAuJ9jn1VNCIpXF8xsI4w1U5QFdXKnGGZ8PePHqWG1B8A9afj2o7T6gDW/xzX/k8g/2belAR3y4nXGo0EikMso8QJBANXWqYygFZtYUcmlwyW48cXm4o7Jcem69bzoQKV84iV42cHS3tqJ9iDyNoQQa53cAjRnGUJE8nr0e49IbdlyicECQQCz8vdhJ/1ro5t8IM4OX+ziR9aCQXxItivHDytfF1Mh+OhjUDzmF9JKARmqDCHOY1KI3QzBZ/WDcZRpL2WHh92hAkEAyetUnYn1F5zVJWxo+yC9PH6WYssZahNy22GdBcZblmDc/YQWw+sa9d55/5aMoYWn6AVO9Tb2gsMW2W0jM2/zCw==',2,2,'2019-03-31 22:07:20','2019-04-19 17:30:09'),
(7,'20190401562373672858288128','','MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCOgSo6GfwM8a+rUT4m61nZa7q5cJpjL7luxQKuJvkMl/QydVrzRPinCh6zqgBJDa7YY2X6z5TyTkjYuDkYMrdyHcYvCDuJ0NpRPZMR+QDE70yp9wJ+kOqTa8bepJtxzuCYLxFz+wRsIFt0nIxC6ttCaM9OEw/Bflhws3xczw4uqQIDAQAB','MIICdQIBADANBgkqhkiG9w0BAQEFAASCAl8wggJbAgEAAoGBAI6BKjoZ/Azxr6tRPibrWdlrurlwmmMvuW7FAq4m+QyX9DJ1WvNE+KcKHrOqAEkNrthjZfrPlPJOSNi4ORgyt3Idxi8IO4nQ2lE9kxH5AMTvTKn3An6Q6pNrxt6km3HO4JgvEXP7BGwgW3ScjELq20Joz04TD8F+WHCzfFzPDi6pAgMBAAECgYA/zuQ6ieILZbjUDBe5U46yxQMh/6KRoQ/14m81zauckPm+EkA8R3jTSru+lPN1wpO0vqUuLf6ylI0XxT2DcUokOgY07ZdE54pu5XAsyY0eanFwt6C1LrHYpORV3Mp9XuI3fXrxYqVlxLuj1N7MGinXUuW7aZCHaEuSnZ55OL9dkQJBANKOeFiYDISSuIFHSrndSgr+a8E44jS/2/7lE49p5l3WVOFTHh0IZQNTs/IKsKJkUnYDE4W/Ab7NTnWZpXYeM30CQQCtQrtxPEzLl4dtupPOBJJoApj2lq7Q6tIGx178K6wS9Rz3GEvkA7fz1Tpm+nmPZflWZ9mVmEaVuMTMpl3HN/edAkBylyzx8lYltIALg5QskT1hvFNChkW9tYjyMROzIkxIV4Q8WPLzlAT9iYlOOfkld/nU1hnC2VAG2k9P+z2sigU1AkBAl1AptsEqZSMn1RalBy9NdypvQ12IpQIHZOwUNnO/3YEe3P/t0TUSwbs0CMyomOuLOsvy6QHnbypu4Na1HjhBAkAWjtdhuvU15HAa5jMgiUVfQM3YFuz2k3QkRagtZZ33bqnYs4wNxEZqB5t+vEj+8r3fmSN0BpNR1VW71j53Ir0H',1,'2019-04-01 20:24:01','2019-04-01 20:27:33'), (7,'20190401562373672858288128','','MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCOgSo6GfwM8a+rUT4m61nZa7q5cJpjL7luxQKuJvkMl/QydVrzRPinCh6zqgBJDa7YY2X6z5TyTkjYuDkYMrdyHcYvCDuJ0NpRPZMR+QDE70yp9wJ+kOqTa8bepJtxzuCYLxFz+wRsIFt0nIxC6ttCaM9OEw/Bflhws3xczw4uqQIDAQAB','MIICdQIBADANBgkqhkiG9w0BAQEFAASCAl8wggJbAgEAAoGBAI6BKjoZ/Azxr6tRPibrWdlrurlwmmMvuW7FAq4m+QyX9DJ1WvNE+KcKHrOqAEkNrthjZfrPlPJOSNi4ORgyt3Idxi8IO4nQ2lE9kxH5AMTvTKn3An6Q6pNrxt6km3HO4JgvEXP7BGwgW3ScjELq20Joz04TD8F+WHCzfFzPDi6pAgMBAAECgYA/zuQ6ieILZbjUDBe5U46yxQMh/6KRoQ/14m81zauckPm+EkA8R3jTSru+lPN1wpO0vqUuLf6ylI0XxT2DcUokOgY07ZdE54pu5XAsyY0eanFwt6C1LrHYpORV3Mp9XuI3fXrxYqVlxLuj1N7MGinXUuW7aZCHaEuSnZ55OL9dkQJBANKOeFiYDISSuIFHSrndSgr+a8E44jS/2/7lE49p5l3WVOFTHh0IZQNTs/IKsKJkUnYDE4W/Ab7NTnWZpXYeM30CQQCtQrtxPEzLl4dtupPOBJJoApj2lq7Q6tIGx178K6wS9Rz3GEvkA7fz1Tpm+nmPZflWZ9mVmEaVuMTMpl3HN/edAkBylyzx8lYltIALg5QskT1hvFNChkW9tYjyMROzIkxIV4Q8WPLzlAT9iYlOOfkld/nU1hnC2VAG2k9P+z2sigU1AkBAl1AptsEqZSMn1RalBy9NdypvQ12IpQIHZOwUNnO/3YEe3P/t0TUSwbs0CMyomOuLOsvy6QHnbypu4Na1HjhBAkAWjtdhuvU15HAa5jMgiUVfQM3YFuz2k3QkRagtZZ33bqnYs4wNxEZqB5t+vEj+8r3fmSN0BpNR1VW71j53Ir0H',1,1,'2019-04-01 20:24:01','2019-04-01 20:27:33'),
(8,'20190401562373796095328256','','MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCbxn0En2cj29t8i+m1dT7seF9XQx3cEaoClXFTlmc78Y1ZuQFbyY99VSwv8JbtpGxPvBSVD9SPmXWNBRBbSHT+gxStcdXD9QeD3knGFy/1V+z3E2Rj/6LIlFmgTlGh1fmEgttPjsUW1Dj704/ydyIrw+CAyAMKQyrFg0wYmNW+UQIDAQAB','MIICdQIBADANBgkqhkiG9w0BAQEFAASCAl8wggJbAgEAAoGBAJvGfQSfZyPb23yL6bV1Pux4X1dDHdwRqgKVcVOWZzvxjVm5AVvJj31VLC/wlu2kbE+8FJUP1I+ZdY0FEFtIdP6DFK1x1cP1B4PeScYXL/VX7PcTZGP/osiUWaBOUaHV+YSC20+OxRbUOPvTj/J3IivD4IDIAwpDKsWDTBiY1b5RAgMBAAECgYAE27/ycPZKjATgcYyseCeqQGbY1eMMhhCDXB3YuYwmtnXuInMEZdjv08Q5CovqhYJLSlZp/8BlaifcahgEgNIFQXmxAF0U0HsNC6W4Dk1gGgQaVmYaZv5ex7uIcFB1qFvlO60kWf82YeRnO5KsFBODOJ1XSNwqjL2GeLSHBSVyQQJBAOsvDmClBsETSdiNSFMz+D9WCnCh1Ip4AoCzA/yG+PRSwYjZDdceP2DXieiZXPlxTFZ7MIXxAafgeyeQA2hpkQUCQQCpkCUSbrZ+nd4BYdnxZOSf0//cUT0o6+3kROX7gsXV7zRAWWxojT6DkGVlduDLZM/hjWeHRjWUxKC/jgbzvundAkBckhUSrWJPNQxoFJRXS6l3JKLPWqOSLVKu3ce/6lCrurc66lSsS9eegrhhuZwDAzmNAMhEsGx6a72OAP2WZ5cRAkBd8cT4X2qw4BpePa6YdcPNYZHCqSfvgje9XwbkwGGH1A3pESJlEsxt7BShkKmfRu1+E/AmHJoXIJHHT5M+fKnpAkA+VfyAAviKeCwUSq+5oUa0B+ozEA3frp/40cKQP7k02aamocAQCDRaC1ZlWffeQqYMnYe1/Mjr/SdX/Ut3X0CC',1,'2019-04-01 20:24:25','2019-04-01 20:24:48'), (8,'20190401562373796095328256','','MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCbxn0En2cj29t8i+m1dT7seF9XQx3cEaoClXFTlmc78Y1ZuQFbyY99VSwv8JbtpGxPvBSVD9SPmXWNBRBbSHT+gxStcdXD9QeD3knGFy/1V+z3E2Rj/6LIlFmgTlGh1fmEgttPjsUW1Dj704/ydyIrw+CAyAMKQyrFg0wYmNW+UQIDAQAB','MIICdQIBADANBgkqhkiG9w0BAQEFAASCAl8wggJbAgEAAoGBAJvGfQSfZyPb23yL6bV1Pux4X1dDHdwRqgKVcVOWZzvxjVm5AVvJj31VLC/wlu2kbE+8FJUP1I+ZdY0FEFtIdP6DFK1x1cP1B4PeScYXL/VX7PcTZGP/osiUWaBOUaHV+YSC20+OxRbUOPvTj/J3IivD4IDIAwpDKsWDTBiY1b5RAgMBAAECgYAE27/ycPZKjATgcYyseCeqQGbY1eMMhhCDXB3YuYwmtnXuInMEZdjv08Q5CovqhYJLSlZp/8BlaifcahgEgNIFQXmxAF0U0HsNC6W4Dk1gGgQaVmYaZv5ex7uIcFB1qFvlO60kWf82YeRnO5KsFBODOJ1XSNwqjL2GeLSHBSVyQQJBAOsvDmClBsETSdiNSFMz+D9WCnCh1Ip4AoCzA/yG+PRSwYjZDdceP2DXieiZXPlxTFZ7MIXxAafgeyeQA2hpkQUCQQCpkCUSbrZ+nd4BYdnxZOSf0//cUT0o6+3kROX7gsXV7zRAWWxojT6DkGVlduDLZM/hjWeHRjWUxKC/jgbzvundAkBckhUSrWJPNQxoFJRXS6l3JKLPWqOSLVKu3ce/6lCrurc66lSsS9eegrhhuZwDAzmNAMhEsGx6a72OAP2WZ5cRAkBd8cT4X2qw4BpePa6YdcPNYZHCqSfvgje9XwbkwGGH1A3pESJlEsxt7BShkKmfRu1+E/AmHJoXIJHHT5M+fKnpAkA+VfyAAviKeCwUSq+5oUa0B+ozEA3frp/40cKQP7k02aamocAQCDRaC1ZlWffeQqYMnYe1/Mjr/SdX/Ut3X0CC',1,1,'2019-04-01 20:24:25','2019-04-01 20:24:48'),
(9,'201904035630907729292csharp','','MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5+OvJxeSzf44NxQ/cl7Ii+BzPg2k6sRcvH4ffOtU5Dzq1/oEvg02nxIhmwOHBZmjbmuUu0aLsfglUTAwqfXftfAKZidshsgj9NNh0/kxk0avRZ1UoljWGz/FxVZA0ogbxxhohPZ9jWcD+eBQcIwF2DtHfAJqWWZrYFnCMeHD8mPzxo2kwXSvDzi0vf9I2tKiYvNG26a9FqeYtPOoi81sdS3+70HOMdxP8ejXtyfnKpKz7Dx506LCIRS5moWS3Q5eTLV3NGX/1CSJ8wpQA2DAQTjVhX5eVu7Yqz12t8W+sjWM/tHUR6cgwYYR10p7tSCeCPzkigjGxKm4cYXWtATQJQIDAQAB','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',1,'2019-04-03 19:54:05','2019-04-03 20:11:58'); (9,'201904035630907729292csharp','','MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5+OvJxeSzf44NxQ/cl7Ii+BzPg2k6sRcvH4ffOtU5Dzq1/oEvg02nxIhmwOHBZmjbmuUu0aLsfglUTAwqfXftfAKZidshsgj9NNh0/kxk0avRZ1UoljWGz/FxVZA0ogbxxhohPZ9jWcD+eBQcIwF2DtHfAJqWWZrYFnCMeHD8mPzxo2kwXSvDzi0vf9I2tKiYvNG26a9FqeYtPOoi81sdS3+70HOMdxP8ejXtyfnKpKz7Dx506LCIRS5moWS3Q5eTLV3NGX/1CSJ8wpQA2DAQTjVhX5eVu7Yqz12t8W+sjWM/tHUR6cgwYYR10p7tSCeCPzkigjGxKm4cYXWtATQJQIDAQAB','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',1,1,'2019-04-03 19:54:05','2019-04-03 20:11:58'),
(10,'easyopen_test','G9w0BAQEFAAOCAQ8AMIIBCgKCA','','',1,2,'2019-04-19 17:19:34','2019-04-19 17:30:09');
ALTER TABLE `isv_info` ENABLE KEYS; ALTER TABLE `isv_info` ENABLE KEYS;
UNLOCK TABLES; UNLOCK TABLES;
@ -170,8 +167,10 @@ INSERT INTO `perm_isv_role` (`id`, `isv_id`, `role_code`, `gmt_create`, `gmt_mod
(17,6,'vip','2019-03-31 22:07:26','2019-03-31 22:07:26'), (17,6,'vip','2019-03-31 22:07:26','2019-03-31 22:07:26'),
(18,5,'normal','2019-03-31 22:07:50','2019-03-31 22:07:50'), (18,5,'normal','2019-03-31 22:07:50','2019-03-31 22:07:50'),
(32,7,'normal','2019-04-01 20:27:33','2019-04-01 20:27:33'), (32,7,'normal','2019-04-01 20:27:33','2019-04-01 20:27:33'),
(33,1,'normal','2019-04-01 20:54:01','2019-04-01 20:54:01'), (36,9,'normal','2019-04-03 20:11:58','2019-04-03 20:11:58'),
(36,9,'normal','2019-04-03 20:11:58','2019-04-03 20:11:58'); (37,10,'normal','2019-04-19 17:19:34','2019-04-19 17:19:34'),
(38,10,'vip','2019-04-19 17:19:34','2019-04-19 17:19:34'),
(40,1,'normal','2019-04-19 19:21:40','2019-04-19 19:21:40');
ALTER TABLE `perm_isv_role` ENABLE KEYS; ALTER TABLE `perm_isv_role` ENABLE KEYS;
UNLOCK TABLES; UNLOCK TABLES;
@ -188,7 +187,7 @@ UNLOCK TABLES;
LOCK TABLES `perm_role_permission` WRITE; LOCK TABLES `perm_role_permission` WRITE;
ALTER TABLE `perm_role_permission` DISABLE KEYS; ALTER TABLE `perm_role_permission` DISABLE KEYS;
INSERT INTO `perm_role_permission` (`id`, `role_code`, `route_id`, `gmt_create`, `gmt_modified`) VALUES INSERT INTO `perm_role_permission` (`id`, `role_code`, `route_id`, `gmt_create`, `gmt_modified`) VALUES
(11,'normal','permission.story.get1.0','2019-04-03 10:09:35','2019-04-03 10:09:35'); (15,'normal','permission.story.get1.0','2019-04-19 19:17:39','2019-04-19 19:17:39');
ALTER TABLE `perm_role_permission` ENABLE KEYS; ALTER TABLE `perm_role_permission` ENABLE KEYS;
UNLOCK TABLES; UNLOCK TABLES;

Loading…
Cancel
Save