diff --git a/README.md b/README.md
index d1234866..2c14eb9b 100644
--- a/README.md
+++ b/README.md
@@ -1,144 +1,113 @@
# SOP(Simple Open Platform)
-
-一个开放平台解决方案项目,基于Spring Cloud实现,目标让用户快速搭建自己的开放平台。
+一个开放平台解决方案项目,基于dubbo实现,目标让用户快速搭建自己的开放平台。
通过简单的配置后,你的项目就具备了和支付宝开放平台的一样的接口提供能力。
SOP封装了开放平台大部分功能包括:签名验证、统一异常处理、统一返回内容 、业务参数验证(JSR-303)、秘钥管理等,未来还会实现更多功能。
-## 项目特点
-- 接入方式简单,与老项目不冲突,老项目注册到注册中心,然后在方法上加上注解即可。
-- 架构松耦合,业务代码实现在各自微服务上,SOP不参与业务实现,这也是Spring Cloud微服务体系带来的好处。
-- 扩展简单,开放平台对应的功能各自独立,可以自定义实现自己的需求,如:更改参数,更改签名规则等。
+## 项目特点
++ 接入方式简单,与老项目不冲突,老项目注册到注册中心,然后在方法上加上注解即可。
++ 架构松耦合,业务代码实现在各自微服务上,SOP不参与业务实现,这也是dubbo微服务体系带来的好处。
++ 扩展简单,开放平台对应的功能各自独立,可以自定义实现自己的需求,如:更改参数,更改签名规则等。
## 谁可以使用这个项目
-
-- 有现成的项目,想改造成开放平台供他人调用
-- 有现成的项目,想暴露其中几个接口并通过开放平台供他人调用
-- 想搭一个开放平台新项目,并结合微服务的方式去维护
-- 对开放平台感兴趣的朋友
++ 有现成的项目,想改造成开放平台供他人调用
++ 有现成的项目,想暴露其中几个接口并通过开放平台供他人调用
++ 想搭一个开放平台新项目,并结合微服务的方式去维护
++ 对开放平台感兴趣的朋友
以上情况都可以考虑使用SOP
## 例子
+开放接口定义
```java
-// 加一个注解即可
-@Open("story.get")
-@RequestMapping("/get")
-public StoryResult get() {
- StoryResult result = new StoryResult();
- result.setId(1L);
- result.setName("海底小纵队");
- return result;
+/**
+ * 支付接口
+ *
+ * @author 六如
+ */
+@Api("支付接口")
+public interface OpenPayment {
+
+ @ApiOperation(
+ value = "alipay.trade.wap.pay(手机网站支付接口2.0)",
+ notes = "该接口是页面跳转接口,用于生成用户访问支付宝的跳转链接。" +
+ "请在服务端执行支付宝SDK中pageExecute方法,读取响应中的body()结果。" +
+ "该结果用于跳转到支付宝页面,返回到用户浏览器渲染或重定向跳转到支付宝页面。" +
+ "具体使用方法请参考 接入指南"
+ )
+ @Open(value = "alipay.trade.wap.pay", version = "2.0")
+ AlipayTradeWapPayResponse tradeWapPay(AlipayTradeWapPayRequest request);
+
}
```
+
+
+接口实现
+
+```java
+/**
+ * 开放接口实现
+ *
+ * @author 六如
+ */
+@DubboService(validation = "true")
+public class OpenPaymentImpl implements OpenPayment {
+
+ @Override
+ public AlipayTradeWapPayResponse tradeWapPay(AlipayTradeWapPayRequest request) {
+ AlipayTradeWapPayResponse alipayTradeWapPayResponse = new AlipayTradeWapPayResponse();
+ alipayTradeWapPayResponse.setPageRedirectionData(UUID.randomUUID().toString());
+ return alipayTradeWapPayResponse;
+ }
+}
+
+```
+
调用:
```java
-// 公共请求参数
-Map params = new HashMap();
-params.put("app_id", appId);
-params.put("method", "story.get");
-params.put("format", "json");
-params.put("charset", "utf-8");
-params.put("sign_type", "RSA2");
-params.put("timestamp", new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
-params.put("version", "1.0");
+ @Test
+ public void testGet() throws Exception {
-// 业务参数
-Map bizContent = new HashMap<>();
-bizContent.put("id", "1");
-bizContent.put("name", "葫芦娃");
+ // 公共请求参数
+ Map params = new HashMap();
+ params.put("app_id", appId);
+ params.put("method", "alipay.trade.wap.pay");
+ params.put("format", "json");
+ params.put("charset", "utf-8");
+ params.put("sign_type", "RSA2");
+ params.put("timestamp", new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
+ params.put("version", "2.0");
-params.put("biz_content", JSON.toJSONString(bizContent));
+ // 业务参数
+ Map bizContent = new HashMap<>();
+ bizContent.put("out_trade_no", "70501111111S001111119");
+ bizContent.put("total_amount", "9.00");
+ bizContent.put("subject", "衣服");
+ bizContent.put("product_code", "QUICK_WAP_WAY");
-System.out.println("----------- 请求信息 -----------");
-System.out.println("请求参数:" + buildParamQuery(params));
-System.out.println("商户秘钥:" + privateKey);
-String content = AlipaySignature.getSignContent(params);
-System.out.println("待签名内容:" + content);
-String sign = AlipaySignature.rsa256Sign(content, privateKey, "utf-8");
-System.out.println("签名(sign):" + sign);
+ params.put("biz_content", JSON.toJSONString(bizContent));
+ String content = AlipaySignature.getSignContent(params);
+ String sign = AlipaySignature.rsa256Sign(content, privateKey, "utf-8");
+ params.put("sign", sign);
-params.put("sign", sign);
-System.out.println("URL参数:" + buildUrlQuery(params));
+ System.out.println("----------- 请求信息 -----------");
+ System.out.println("请求参数:" + buildParamQuery(params));
+ System.out.println("商户秘钥:" + privateKey);
+ System.out.println("待签名内容:" + content);
+ System.out.println("签名(sign):" + sign);
+ System.out.println("URL参数:" + buildUrlQuery(params));
-System.out.println("----------- 返回结果 -----------");
-String responseData = get(url, params);// 发送请求
-System.out.println(responseData);
+ System.out.println("----------- 返回结果 -----------");
+ String responseData = postJson(url, params);// 发送请求
+ System.out.println(responseData);
+ }
```
-## 架构图
+## 整体架构
+
-
-
-> 如上图所示,整个系统运行后,开发者只需关注微服务中的业务代码,接口变更后重新部署微服务应用即可
-
-
-## 已完成列表
-
-- 签名验证
-- 统一异常处理
-- 统一返回内容
-- session管理
-- 秘钥管理
-- 微服务端自动验证(JSR-303)
-- Admin管理平台,统一管理微服务配置,管理路由管理,微服务上下线
-- 门户网站,提供用户注册账号
-- 接入方管理+秘钥管理
-- 接口权限分配
-- 文件上传/下载
-- 提供基础SDK(含:Java,C++,C#,Python,Go,Rust,Nodejs)
-- 接口限流
-- 文档整合
-- 应用授权
-- 监控日志
-- 注册中心支持nacos/eureka
-- 网关动态修改参数
-- 预发布/灰度环境切换
-
-## 界面预览
-
-
-
-
-
-
-
-
-
-- 门户网站
-
-
-
-
-
-## 工程说明
-
-> 运行环境:JDK8,Maven3,[Nacos](https://nacos.io/zh-cn/docs/what-is-nacos.html),Mysql
-
-- doc:开发文档
-- sop-common:公共模块,封装常用功能,包含签名校验、错误处理、限流等功能
-- sop-gateway:网关,统一访问入口,含`Spring Cloud Zuul`和`Spring Cloud Gateway`实现
-- sop-example:微服务示例,含springboot,springmvc示例
-- sop-website:开放平台对应网站,提供文档API、沙箱测试等内容
-- sop-auth:应用授权服务示例
-- sop-admin:后台管理
-- sop-sdk:基础sdk,含Java、C#版本
-- sop-test:接口调用测试用例
-
-## 分支说明
-
-- master:发版分支
-- develop:日常开发分支
-- eureka:使用eureka注册中心
-- pr:接受PR的分支,提交PR请提交到此分支
-
-[更新说明](./changelog.md)
-
-## 相关文档
-
-[开发文档](http://durcframework.gitee.io/sop)
diff --git a/asset/arc.jpg b/asset/arc.jpg
new file mode 100644
index 00000000..e27db1b0
Binary files /dev/null and b/asset/arc.jpg differ
diff --git a/pom.xml b/pom.xml
index dfbcde4c..915b99c0 100644
--- a/pom.xml
+++ b/pom.xml
@@ -14,18 +14,13 @@
5.0.0-SNAPSHOT
pom
一个开放平台解决方案项目,基于Spring Cloud实现,目标是能够让用户快速得搭建起自己的开放平台
-
doc
-
-
sop-example
sop-admin
-
sop-test
sop-sdk
-
sop-gateway
sop-registry
sop-support
diff --git a/sop-5.x.sql b/sop-5.x.sql
deleted file mode 100644
index 9aed078c..00000000
--- a/sop-5.x.sql
+++ /dev/null
@@ -1,155 +0,0 @@
-CREATE DATABASE IF NOT EXISTS `sop` DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;
-USE `sop`;
-
-DROP TABLE IF EXISTS `api_info`;
-CREATE TABLE `api_info` (
- `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'id',
- `application` varchar(64) NOT NULL DEFAULT '' COMMENT '应用名称',
- `api_name` varchar(128) NOT NULL DEFAULT '' COMMENT '接口名称',
- `api_version` varchar(16) NOT NULL DEFAULT '1.0' COMMENT '版本号',
- `description` varchar(64) DEFAULT '' COMMENT '接口描述',
- `remark` text COMMENT '备注',
- `interface_class_name` varchar(128) NOT NULL DEFAULT '' COMMENT '接口class',
- `method_name` varchar(128) NOT NULL DEFAULT '' COMMENT '方法名称',
- `param_info` text COMMENT '参数信息',
- `is_permission` tinyint(4) NOT NULL DEFAULT '0' COMMENT '接口是否需要授权访问',
- `is_need_Token` tinyint(4) NOT NULL DEFAULT '0' COMMENT '是否需要appAuthToken',
- `reg_source` tinyint(4) NOT NULL DEFAULT '1' COMMENT '注册来源,1-系统注册,2-手动注册',
- `status` tinyint(4) NOT NULL DEFAULT '1' COMMENT '1启用,0禁用',
- `add_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '添加时间',
- `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
- PRIMARY KEY (`id`),
- UNIQUE KEY `uk_apiname_version` (`api_name`,`api_version`) USING BTREE
-) ENGINE=InnoDB AUTO_INCREMENT=16 DEFAULT CHARSET=utf32 COMMENT='接口信息表';
-
-DROP TABLE IF EXISTS `isv_info`;
-CREATE TABLE `isv_info` (
- `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'id',
- `app_id` varchar(100) NOT NULL COMMENT 'appKey',
- `status` tinyint(4) unsigned NOT NULL DEFAULT '0' COMMENT '1启用,2禁用',
- `remark` varchar(512) DEFAULT NULL COMMENT '备注',
- `add_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '添加时间',
- `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
- PRIMARY KEY (`id`),
- UNIQUE KEY `uk_appid` (`app_id`)
-) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf32 COMMENT='isv信息表';
-
-DROP TABLE IF EXISTS `isv_keys`;
-CREATE TABLE `isv_keys` (
- `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'id',
- `isv_id` bigint(20) NOT NULL DEFAULT '0' COMMENT 'isv_info.id',
- `key_format` tinyint(4) NOT NULL DEFAULT '1' COMMENT '秘钥格式,1:PKCS8(JAVA适用),2:PKCS1(非JAVA适用)',
- `public_key_isv` text NOT NULL COMMENT '开发者生成的公钥',
- `private_key_isv` text NOT NULL COMMENT '开发者生成的私钥(交给开发者)',
- `public_key_platform` text NOT NULL COMMENT '平台生成的公钥(交给开发者)',
- `private_key_platform` text NOT NULL COMMENT '平台生成的私钥',
- `add_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '添加时间',
- `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
- PRIMARY KEY (`id`),
- UNIQUE KEY `uk_appid` (`isv_id`) USING BTREE
-) ENGINE=InnoDB AUTO_INCREMENT=20 DEFAULT CHARSET=utf8 COMMENT='ISV秘钥管理';
-
-DROP TABLE IF EXISTS `perm_group`;
-CREATE TABLE `perm_group` (
- `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'id',
- `group_name` varchar(64) NOT NULL COMMENT '分组描述',
- `is_deleted` tinyint(4) DEFAULT '0' COMMENT '是否删除',
- `add_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '添加时间',
- `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
- PRIMARY KEY (`id`)
-) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf32 COMMENT='分组表';
-
-DROP TABLE IF EXISTS `perm_group_permission`;
-CREATE TABLE `perm_group_permission` (
- `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'id',
- `group_id` bigint(20) NOT NULL DEFAULT '0' COMMENT 'perm_group.id',
- `api_id` varchar(64) NOT NULL COMMENT 'api_info.id',
- `add_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '添加时间',
- `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
- PRIMARY KEY (`id`),
- UNIQUE KEY `uk_code_apiid` (`group_id`,`api_id`) USING BTREE
-) ENGINE=InnoDB DEFAULT CHARSET=utf32 COMMENT='组权限表';
-
-DROP TABLE IF EXISTS `perm_isv_group`;
-CREATE TABLE `perm_isv_group` (
- `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
- `isv_id` bigint(20) NOT NULL COMMENT 'isv_info表id',
- `group_id` bigint(20) NOT NULL DEFAULT '0' COMMENT 'perm_group.id',
- `add_time` datetime DEFAULT CURRENT_TIMESTAMP,
- `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
- PRIMARY KEY (`id`),
- UNIQUE KEY `uk_user_role` (`isv_id`,`group_id`)
-) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf32 COMMENT='isv分组';
-
-DROP TABLE IF EXISTS `sys_admin_user`;
-CREATE TABLE `sys_admin_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 '用户名',
- `email` varchar(128) NOT NULL DEFAULT '' COMMENT '邮箱',
- `avatar` varchar(128) NOT NULL DEFAULT '' COMMENT '头像',
- `status` tinyint(4) unsigned NOT NULL DEFAULT '1' COMMENT '状态,1:启用,2:禁用',
- `reg_type` varchar(32) NOT NULL DEFAULT '1' COMMENT '注册类型,1-系统,2-手动',
- `add_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '添加时间',
- `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
- PRIMARY KEY (`id`),
- UNIQUE KEY `uk_username` (`username`) USING BTREE
-) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf32 COMMENT='系统用户表';
-
-DROP TABLE IF EXISTS `sys_config`;
-CREATE TABLE `sys_config` (
- `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
- `config_key` varchar(64) NOT NULL DEFAULT '',
- `config_value` varchar(256) NOT NULL DEFAULT '',
- `remark` varchar(128) NOT NULL DEFAULT '',
- `is_deleted` tinyint(4) NOT NULL DEFAULT '0',
- `add_time` datetime DEFAULT CURRENT_TIMESTAMP,
- `update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
- PRIMARY KEY (`id`) USING BTREE,
- UNIQUE KEY `uk_configkey` (`config_key`) USING BTREE
-) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf32 COMMENT='系统配置表';
-
--- insert
-
-
-INSERT INTO `api_info` (`id`, `application`, `api_name`, `api_version`, `description`, `remark`, `interface_class_name`, `method_name`, `param_info`, `is_permission`, `is_need_Token`, `reg_source`, `status`, `add_time`, `update_time`) 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, '2024-09-10 18:34:05', '2024-10-09 09:12:07'),
- (2, 'story-service', 'story.save', '1.0', '', '', 'com.gitee.sop.storyweb.open.OpenStory', 'save', '[{\"name\":\"storySaveDTO\",\"type\":\"com.gitee.sop.storyweb.open.req.StorySaveDTO\"}]', 0, 0, 1, 1, '2024-09-10 18:34:05', '2024-10-18 20:06:07'),
- (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, '2024-09-10 18:38:27', '2024-10-09 09:12:07'),
- (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, '2024-09-10 18:44:51', '2024-09-10 18:44:51'),
- (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, '2024-09-10 18:49:14', '2024-09-10 18:49:14'),
- (6, 'story-service', 'story.update', '1.0', '', '', 'com.gitee.sop.storyweb.open.OpenStory', 'update', '[{\"name\":\"id\",\"type\":\"java.lang.Integer\"},{\"name\":\"storySaveDTO\",\"type\":\"com.gitee.sop.storyweb.open.req.StorySaveDTO\"}]', 0, 0, 1, 1, '2024-09-10 23:00:07', '2024-10-09 09:12:07'),
- (7, 'story-service', 'story.upload', '1.0', '', '', 'com.gitee.sop.storyweb.open.OpenStory', 'upload', '[{\"name\":\"storySaveDTO\",\"type\":\"com.gitee.sop.storyweb.open.req.StorySaveDTO\"},{\"name\":\"file\",\"type\":\"com.gitee.sop.support.dto.FileData\"}]', 0, 0, 1, 1, '2024-09-13 09:14:03', '2024-10-09 09:12:07'),
- (8, 'story-service', 'story.upload.more', '1.0', '', '', 'com.gitee.sop.storyweb.open.OpenStory', 'upload2', '[{\"name\":\"storySaveDTO\",\"type\":\"com.gitee.sop.storyweb.open.req.StorySaveDTO\"},{\"name\":\"idCardFront\",\"type\":\"com.gitee.sop.support.dto.FileData\"},{\"name\":\"idCardBack\",\"type\":\"com.gitee.sop.support.dto.FileData\"}]', 0, 0, 1, 1, '2024-09-13 09:22:05', '2024-10-09 09:12:07'),
- (9, 'story-service', 'story.upload.list', '1.0', '', '', 'com.gitee.sop.storyweb.open.OpenStory', 'upload3', '[{\"name\":\"storySaveDTO\",\"type\":\"com.gitee.sop.storyweb.open.req.StorySaveDTO\"},{\"actualType\":\"com.gitee.sop.support.dto.FileData\",\"name\":\"files\",\"type\":\"java.util.List\"}]', 0, 0, 1, 1, '2024-09-13 09:28:01', '2024-10-09 09:12:07'),
- (10, 'story-service', 'story.get', '2.0', '', '', 'com.gitee.sop.storyweb.open.OpenStory', 'getByIdV2', '[{\"name\":\"id\",\"type\":\"java.lang.Long\"}]', 0, 0, 1, 1, '2024-09-14 10:40:13', '2024-10-09 09:12:07'),
- (11, 'story-service', 'story.download', '1.0', '', '', 'com.gitee.sop.storyweb.open.OpenStory', 'download', '[{\"name\":\"id\",\"type\":\"java.lang.Integer\"}]', 0, 0, 2, 1, '2024-09-16 20:56:09', '2024-10-18 20:06:07'),
- (14, 'q1', 'q11', 'q', 'q1', '备注,内容有点长内容有点长内容有点长内容有点长内容有点长内容有点长', '', '', NULL, 1, 0, 1, 1, '2024-10-06 09:51:47', '2024-10-19 11:47:54'),
- (15, 'server', 'goods.get', '1.0', '1111', '2222225555', '', '', NULL, 0, 0, 2, 2, '2024-10-10 10:38:59', '2024-10-20 15:51:09');
-
-INSERT INTO `isv_info` (`id`, `app_id`, `status`, `remark`, `add_time`, `update_time`) VALUES
- (1, '2019032617262200001', 1, NULL, '2024-09-10 09:23:43', '2024-10-14 11:32:58'),
- (2, '224', 1, '334', '2024-10-10 10:48:40', '2024-10-10 10:50:39'),
- (3, '202410111294229455501262848', 1, '杭州限行公司', '2024-10-11 09:17:28', '2024-10-15 09:32:35'),
- (4, '202410191297295138816524288', 1, 'xx公司', '2024-10-19 20:19:24', '2024-10-21 14:09:42');
-
-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`) VALUES
- (16, 1, 1, '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', '2024-09-10 09:26:33', '2024-10-19 20:00:37'),
- (17, 3, 1, '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', '', '', '2024-10-11 09:17:28', '2024-10-11 09:17:28'),
- (18, 2, 1, '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', '2024-10-19 20:08:11', '2024-10-19 20:08:11'),
- (19, 4, 1, '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', '2024-10-19 20:23:38', '2024-10-19 20:23:38');
-
-INSERT INTO `perm_group` (`id`, `group_name`, `is_deleted`, `add_time`, `update_time`) VALUES
- (1, 'VIP', 0, '2024-10-20 16:23:31', '2024-10-22 09:21:07'),
- (2, 'VIP2', 1, '2024-10-20 16:25:11', '2024-10-21 14:13:41');
-
-INSERT INTO `perm_isv_group` (`id`, `isv_id`, `group_id`, `add_time`, `update_time`) VALUES
- (8, 4, 1, '2024-10-21 14:10:18', '2024-10-21 14:10:18');
-
-INSERT INTO `sys_admin_user` (`id`, `username`, `password`, `nickname`, `email`, `avatar`, `status`, `reg_type`, `add_time`, `update_time`) VALUES
- (1, 'admin', '$2a$10$6LWUuQQ8V/rszLo50.qrsuBlNmbYY/q2KSC1BmrxxN5czvOxmF3qK', 'admin', '', '', 1, 'backend', '2024-10-03 08:37:03', '2024-10-03 19:08:48');
-
-INSERT INTO `sys_config` (`id`, `config_key`, `config_value`, `remark`, `is_deleted`, `add_time`, `update_time`) VALUES
- (1, 'admin.jwt.secret', 'UXJC8R3NmAvj9kFKWwBgYu6y3naXh7', '', 0, '2024-10-02 21:20:41', '2024-10-02 21:20:41'),
- (2, 'admin.password-salt', 'Khq9RnXZCGsWz', '', 0, '2024-10-02 21:20:41', '2024-10-02 21:20:41');
diff --git a/sop-admin/sop-admin-server/.gitignore b/sop-admin/sop-admin-server/.gitignore
deleted file mode 100644
index 18ccf36e..00000000
--- a/sop-admin/sop-admin-server/.gitignore
+++ /dev/null
@@ -1,25 +0,0 @@
-target/
-!.mvn/wrapper/maven-wrapper.jar
-
-### STS ###
-.apt_generated
-.classpath
-.factorypath
-.project
-.settings
-.springBeans
-
-### IntelliJ IDEA ###
-.idea
-*.iws
-*.iml
-*.ipr
-
-### NetBeans ###
-nbproject/private/
-build/
-nbbuild/
-dist/
-nbdist/
-.nb-gradle/
-/local-config/
diff --git a/sop-admin/sop-admin-server/pom.xml b/sop-admin/sop-admin-server/pom.xml
deleted file mode 100644
index 4a8a9b0f..00000000
--- a/sop-admin/sop-admin-server/pom.xml
+++ /dev/null
@@ -1,124 +0,0 @@
-
-
-
-
- com.gitee.sop
- sop-parent
- 5.0.0-SNAPSHOT
- ../../pom.xml
-
-
- 4.0.0
- sop-admin-server
- jar
-
-
- 1.8
- UTF-8
- UTF-8
-
-
-
-
-
-
- net.oschina.durcframework
- easyopen-spring-boot-starter
-
-
-
- net.oschina.durcframework
- fastmybatis-spring-boot-starter
-
-
-
- com.squareup.okhttp3
- okhttp
-
-
-
- mysql
- mysql-connector-java
- runtime
-
-
-
- org.springframework.boot
- spring-boot-starter-web
-
-
-
- org.springframework.boot
- spring-boot-starter-thymeleaf
-
-
-
- org.apache.commons
- commons-lang3
-
-
-
- com.github.pagehelper
- pagehelper
-
-
-
-
- com.alibaba.nacos
- nacos-client
- true
-
-
-
- org.springframework.boot
- spring-boot-starter-test
- test
-
-
-
- junit
- junit
- 4.13
- test
-
-
-
- org.projectlombok
- lombok
- 1.18.4
- provided
-
-
-
-
-
-
- org.springframework.boot
- spring-boot-maven-plugin
-
-
-
- org.apache.maven.plugins
- maven-surefire-plugin
-
- true
-
-
-
-
-
-
-
- spring-milestones
- Spring Milestones
- https://repo.spring.io/milestone
-
-
- maven2
- maven2
- https://repo1.maven.org/maven2
-
-
-
-
diff --git a/sop-admin/sop-admin-server/readme.md b/sop-admin/sop-admin-server/readme.md
deleted file mode 100644
index 947b5486..00000000
--- a/sop-admin/sop-admin-server/readme.md
+++ /dev/null
@@ -1,22 +0,0 @@
-# sop admin服务端
-
-# 使用步骤
-
-- 打开`application-dev.yml`,修改数据库`username/password`,指定nacos地址
-- 运行`SopAdminServerApplication.java`
-- 访问:`http://localhost:8082`
-
-登录账号:admin/123456
-
-后台用户表:admin_user_info
-
-- 密码保存规则:`md5(username + md5(password) + username)`
-
-```text
-username: admin
-password: 123456
-即
-md5("admin" + md5(123456) + "admin")
-```
-
-详见:com.gitee.sop.adminserver.AccountTest
diff --git a/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/SopAdminServerApplication.java b/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/SopAdminServerApplication.java
deleted file mode 100644
index e388660d..00000000
--- a/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/SopAdminServerApplication.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package com.gitee.sop.adminserver;
-
-import org.springframework.boot.SpringApplication;
-import org.springframework.boot.autoconfigure.SpringBootApplication;
-
-@SpringBootApplication
-public class SopAdminServerApplication {
-
- public static void main(String[] args) {
- SpringApplication.run(SopAdminServerApplication.class, args);
- }
-}
diff --git a/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/api/IdParam.java b/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/api/IdParam.java
deleted file mode 100644
index acfaad30..00000000
--- a/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/api/IdParam.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package com.gitee.sop.adminserver.api;
-
-import com.gitee.easyopen.doc.annotation.ApiDocField;
-import lombok.Getter;
-import lombok.Setter;
-
-import javax.validation.constraints.NotNull;
-
-/**
- * @author 六如
- */
-@Getter
-@Setter
-public class IdParam {
- @NotNull(message = "id不能为空")
- @ApiDocField(description = "id")
- private Long id;
-}
diff --git a/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/api/demo/GoodsApi.java b/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/api/demo/GoodsApi.java
deleted file mode 100644
index 91f96375..00000000
--- a/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/api/demo/GoodsApi.java
+++ /dev/null
@@ -1,51 +0,0 @@
-package com.gitee.sop.adminserver.api.demo;
-
-import com.gitee.easyopen.annotation.Api;
-import com.gitee.easyopen.annotation.ApiService;
-import com.gitee.easyopen.doc.annotation.ApiDoc;
-import com.gitee.easyopen.doc.annotation.ApiDocField;
-import com.gitee.easyopen.doc.annotation.ApiDocMethod;
-import com.gitee.sop.adminserver.api.demo.param.GoodsParam;
-import com.gitee.sop.adminserver.api.demo.result.Goods;
-
-import java.math.BigDecimal;
-import java.util.Arrays;
-import java.util.List;
-
-/**
- * 业务类
- *
- * @author 六如
- *
- */
-@ApiService
-@ApiDoc("商品模块")
-public class GoodsApi {
-
- @Api(name = "goods.get")
- @ApiDocMethod(description = "获取商品")
- public Goods getGoods(GoodsParam param) {
- Goods goods = new Goods();
- goods.setId(1L);
- goods.setGoods_name("苹果iPhoneX");
- goods.setPrice(new BigDecimal(8000));
- return goods;
- }
-
- @Api(name = "goods.list", version = "2.0")
- @ApiDocMethod(description = "获取商品列表", results = {
- @ApiDocField(description = "商品列表", name = "list", elementClass = Goods.class) })
- public List listGoods(GoodsParam param) {
- Goods goods = new Goods();
- goods.setId(1L);
- goods.setGoods_name("iPhoneX");
- goods.setPrice(new BigDecimal(8000));
-
- Goods goods2 = new Goods();
- goods2.setId(2L);
- goods2.setGoods_name("三星");
- goods2.setPrice(new BigDecimal(7000));
- return Arrays.asList(goods, goods2);
- }
-
-}
diff --git a/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/api/demo/param/GoodsParam.java b/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/api/demo/param/GoodsParam.java
deleted file mode 100644
index d5f099e4..00000000
--- a/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/api/demo/param/GoodsParam.java
+++ /dev/null
@@ -1,23 +0,0 @@
-package com.gitee.sop.adminserver.api.demo.param;
-
-import com.gitee.easyopen.doc.annotation.ApiDocField;
-import org.hibernate.validator.constraints.Length;
-
-import javax.validation.constraints.NotEmpty;
-
-public class GoodsParam {
-
- @ApiDocField(description = "商品名称", required = true, example = "iphoneX")
- @NotEmpty(message = "商品名称不能为空")
- @Length(min = 3, max = 20, message = "{goods.name.length}=3,20")
- private String goods_name;
-
- public String getGoods_name() {
- return goods_name;
- }
-
- public void setGoods_name(String goods_name) {
- this.goods_name = goods_name;
- }
-
-}
diff --git a/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/api/demo/result/Goods.java b/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/api/demo/result/Goods.java
deleted file mode 100644
index 80134e5a..00000000
--- a/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/api/demo/result/Goods.java
+++ /dev/null
@@ -1,48 +0,0 @@
-package com.gitee.sop.adminserver.api.demo.result;
-
-import com.gitee.easyopen.doc.DataType;
-import com.gitee.easyopen.doc.annotation.ApiDocField;
-import com.thoughtworks.xstream.annotations.XStreamAlias;
-
-import java.math.BigDecimal;
-
-@XStreamAlias("goods")
-public class Goods {
-
- @ApiDocField(description = "id")
- private Long id;
- @ApiDocField(description = "商品名称")
- private String goods_name;
- @ApiDocField(description = "价格", dataType = DataType.FLOAT)
- private BigDecimal price;
-
- public Long getId() {
- return id;
- }
-
- public void setId(Long id) {
- this.id = id;
- }
-
- public String getGoods_name() {
- return goods_name;
- }
-
- public void setGoods_name(String goods_name) {
- this.goods_name = goods_name;
- }
-
- public BigDecimal getPrice() {
- return price;
- }
-
- public void setPrice(BigDecimal price) {
- this.price = price;
- }
-
- @Override
- public String toString() {
- return "Goods [id=" + id + ", goods_name=" + goods_name + ", price=" + price + "]";
- }
-
-}
diff --git a/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/api/isv/IsvApi.java b/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/api/isv/IsvApi.java
deleted file mode 100644
index 36d5cbae..00000000
--- a/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/api/isv/IsvApi.java
+++ /dev/null
@@ -1,298 +0,0 @@
-package com.gitee.sop.adminserver.api.isv;
-
-import com.gitee.easyopen.annotation.Api;
-import com.gitee.easyopen.annotation.ApiService;
-import com.gitee.easyopen.doc.DataType;
-import com.gitee.easyopen.doc.annotation.ApiDoc;
-import com.gitee.easyopen.doc.annotation.ApiDocField;
-import com.gitee.easyopen.doc.annotation.ApiDocMethod;
-import com.gitee.easyopen.util.CopyUtil;
-import com.gitee.fastmybatis.core.PageInfo;
-import com.gitee.fastmybatis.core.query.Query;
-import com.gitee.fastmybatis.core.query.Sort;
-import com.gitee.fastmybatis.core.util.MapperUtil;
-import com.gitee.sop.adminserver.api.IdParam;
-import com.gitee.sop.adminserver.api.isv.param.IsvInfoFormAdd;
-import com.gitee.sop.adminserver.api.isv.param.IsvInfoFormUpdate;
-import com.gitee.sop.adminserver.api.isv.param.IsvKeysFormUpdate;
-import com.gitee.sop.adminserver.api.isv.param.IsvKeysGen;
-import com.gitee.sop.adminserver.api.isv.param.IsvPageParam;
-import com.gitee.sop.adminserver.api.isv.result.IsvDetailDTO;
-import com.gitee.sop.adminserver.api.isv.result.IsvInfoVO;
-import com.gitee.sop.adminserver.api.isv.result.IsvKeysGenVO;
-import com.gitee.sop.adminserver.api.isv.result.IsvKeysVO;
-import com.gitee.sop.adminserver.api.isv.result.RoleVO;
-import com.gitee.sop.adminserver.bean.ChannelMsg;
-import com.gitee.sop.adminserver.bean.NacosConfigs;
-import com.gitee.sop.adminserver.common.BizException;
-import com.gitee.sop.adminserver.common.ChannelOperation;
-import com.gitee.sop.adminserver.common.IdGen;
-import com.gitee.sop.adminserver.common.RSATool;
-import com.gitee.sop.adminserver.entity.IsvInfo;
-import com.gitee.sop.adminserver.entity.IsvKeys;
-import com.gitee.sop.adminserver.entity.PermIsvRole;
-import com.gitee.sop.adminserver.entity.PermRole;
-import com.gitee.sop.adminserver.mapper.IsvInfoMapper;
-import com.gitee.sop.adminserver.mapper.IsvKeysMapper;
-import com.gitee.sop.adminserver.mapper.PermIsvRoleMapper;
-import com.gitee.sop.adminserver.mapper.PermRoleMapper;
-import com.gitee.sop.adminserver.service.ConfigPushService;
-import com.gitee.sop.adminserver.service.RoutePermissionService;
-import lombok.extern.slf4j.Slf4j;
-import org.apache.commons.collections.CollectionUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.transaction.annotation.Transactional;
-
-import javax.validation.constraints.NotBlank;
-import java.text.SimpleDateFormat;
-import java.util.Collections;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.stream.Collectors;
-
-/**
- * @author 六如
- */
-@ApiService
-@ApiDoc("ISV管理")
-@Slf4j
-public class IsvApi {
-
- public static final byte SIGN_TYPE_RSA = 1;
- public static final byte SIGN_TYPE_MD5 = 2;
-
- static Map SIGN_TYPE_MAP = new HashMap<>();
- static {
- SIGN_TYPE_MAP.put("rsa", (byte) SIGN_TYPE_RSA);
- SIGN_TYPE_MAP.put("md5", (byte) SIGN_TYPE_MD5);
- }
-
- @Autowired
- IsvInfoMapper isvInfoMapper;
-
- @Autowired
- IsvKeysMapper isvKeysMapper;
-
- @Autowired
- PermIsvRoleMapper permIsvRoleMapper;
-
- @Autowired
- PermRoleMapper permRoleMapper;
-
- @Autowired
- RoutePermissionService routePermissionService;
-
- @Autowired
- private ConfigPushService configPushService;
-
- @Value("${sop.sign-type}")
- private String sopSignType;
-
- @Api(name = "isv.info.page")
- @ApiDocMethod(description = "isv列表", results = {
- @ApiDocField(name = "pageIndex", description = "第几页", dataType = DataType.INT, example = "1"),
- @ApiDocField(name = "pageSize", description = "每页几条数据", dataType = DataType.INT, example = "10"),
- @ApiDocField(name = "total", description = "每页几条数据", dataType = DataType.LONG, example = "100"),
- @ApiDocField(name = "rows", description = "数据", dataType = DataType.ARRAY, elementClass = IsvInfoVO.class)
- })
- PageInfo pageIsv(IsvPageParam param) {
- Query query = Query.build(param);
- query.orderby("id", Sort.DESC);
- PageInfo pageInfo = MapperUtil.query(isvInfoMapper, query);
- List list = pageInfo.getList();
-
- List retList = list.stream()
- .map(isvInfo -> {
- return buildIsvVO(isvInfo);
- })
- .collect(Collectors.toList());
-
- PageInfo pageInfoRet = new PageInfo<>();
- pageInfoRet.setTotal(pageInfo.getTotal());
- pageInfoRet.setList(retList);
-
- return pageInfoRet;
- }
-
- @Api(name = "isv.info.get")
- @ApiDocMethod(description = "获取isv")
- IsvInfoVO getIsvVO(IdParam param) {
- IsvInfo isvInfo = isvInfoMapper.getById(param.getId());
- return buildIsvVO(isvInfo);
- }
-
- @Api(name = "isv.keys.get")
- @ApiDocMethod(description = "获取isv2")
- IsvKeysVO getIsvKeys(@NotBlank(message = "appKey不能为空")
- @ApiDocField(description = "appKey")
- String appKey) {
- IsvKeys isvKeys = isvKeysMapper.getByColumn("app_key", appKey);
- IsvKeysVO isvDetailVO = new IsvKeysVO();
- if (isvKeys != null) {
- CopyUtil.copyProperties(isvKeys, isvDetailVO);
- }
- isvDetailVO.setAppKey(appKey);
- isvDetailVO.setSignType(getSignType());
- return isvDetailVO;
- }
-
- private IsvInfoVO buildIsvVO(IsvInfo isvInfo) {
- if (isvInfo == null) {
- return null;
- }
- IsvInfoVO vo = new IsvInfoVO();
- CopyUtil.copyProperties(isvInfo, vo);
- vo.setRoleList(this.buildIsvRole(isvInfo));
- return vo;
- }
-
- /**
- * 构建ISV拥有的角色
- *
- * @param permClient
- * @return
- */
- List buildIsvRole(IsvInfo permClient) {
- List roleCodeList = routePermissionService.listClientRoleCode(permClient.getId());
- if (CollectionUtils.isEmpty(roleCodeList)) {
- return Collections.emptyList();
- }
- List list = permRoleMapper.list(new Query().in("role_code", roleCodeList));
-
- return list.stream()
- .map(permRole -> {
- RoleVO vo = new RoleVO();
- CopyUtil.copyProperties(permRole, vo);
- return vo;
- })
- .collect(Collectors.toList());
- }
-
- @Api(name = "isv.info.add")
- @ApiDocMethod(description = "添加isv")
- @Transactional(rollbackFor = Exception.class)
- public void addIsv(IsvInfoFormAdd param) throws Exception {
- String appKey = new SimpleDateFormat("yyyyMMdd").format(new Date()) + IdGen.nextId();
- IsvInfo rec = new IsvInfo();
- rec.setAppKey(appKey);
- CopyUtil.copyPropertiesIgnoreNull(param, rec);
- isvInfoMapper.saveIgnoreNull(rec);
- if (CollectionUtils.isNotEmpty(param.getRoleCode())) {
- this.saveIsvRole(rec, param.getRoleCode());
- }
- IsvKeysGenVO isvKeysGenVO = this.createIsvKeys();
- IsvKeys isvKeys = new IsvKeys();
- isvKeys.setAppKey(appKey);
- isvKeys.setSignType(getSignType());
- CopyUtil.copyPropertiesIgnoreNull(isvKeysGenVO, isvKeys);
- isvKeysMapper.saveIgnoreNull(isvKeys);
-
- this.sendChannelMsg(rec.getAppKey());
- }
-
- private byte getSignType() {
- return SIGN_TYPE_MAP.getOrDefault(sopSignType, SIGN_TYPE_RSA);
- }
-
- @Api(name = "isv.info.update")
- @ApiDocMethod(description = "修改isv")
- @Transactional(rollbackFor = Exception.class)
- public void updateIsv(IsvInfoFormUpdate param) {
- IsvInfo rec = isvInfoMapper.getById(param.getId());
- CopyUtil.copyPropertiesIgnoreNull(param, rec);
- isvInfoMapper.updateIgnoreNull(rec);
- this.saveIsvRole(rec, param.getRoleCode());
-
- this.sendChannelMsg(rec.getAppKey());
- }
-
- @Api(name = "isv.keys.update")
- @ApiDocMethod(description = "修改isv")
- public void updateIsvKeys(IsvKeysFormUpdate param) {
- IsvKeys isvKeys = isvKeysMapper.getByColumn("app_key", param.getAppKey());
- if (isvKeys == null) {
- isvKeys = new IsvKeys();
- CopyUtil.copyPropertiesIgnoreNull(param, isvKeys);
- isvKeys.setSignType(getSignType());
- isvKeysMapper.saveIgnoreNull(isvKeys);
- } else {
- CopyUtil.copyPropertiesIgnoreNull(param, isvKeys);
- isvKeysMapper.updateIgnoreNull(isvKeys);
- }
-
- this.sendChannelMsg(isvKeys.getAppKey());
- }
-
- private void sendChannelMsg(String appKey) {
- IsvDetailDTO isvDetail = isvInfoMapper.getIsvDetail(appKey);
- if (isvDetail == null) {
- return;
- }
- ChannelMsg channelMsg = new ChannelMsg(ChannelOperation.ISV_INFO_UPDATE, isvDetail);
- configPushService.publishConfig(NacosConfigs.DATA_ID_ISV, NacosConfigs.GROUP_CHANNEL, channelMsg);
- }
-
- private IsvKeysGenVO createIsvKeys() throws Exception {
- IsvKeysGenVO isvFormVO = new IsvKeysGenVO();
- String secret = IdGen.uuid();
-
- isvFormVO.setSecret(secret);
-
- RSATool rsaToolIsv = new RSATool(RSATool.KeyFormat.PKCS8, RSATool.KeyLength.LENGTH_2048);
- RSATool.KeyStore keyStoreIsv = rsaToolIsv.createKeys();
- isvFormVO.setPublicKeyIsv(keyStoreIsv.getPublicKey());
- isvFormVO.setPrivateKeyIsv(keyStoreIsv.getPrivateKey());
-
- isvFormVO.setPublicKeyPlatform("");
- isvFormVO.setPrivateKeyPlatform("");
- return isvFormVO;
- }
-
- @Api(name = "isv.keys.gen")
- @ApiDocMethod(description = "生成公私钥")
- RSATool.KeyStore createPubPriKey(IsvKeysGen param) throws Exception {
- RSATool.KeyFormat format = RSATool.KeyFormat.PKCS8;
- Byte keyFormat = param.getKeyFormat();
- if (keyFormat != null && keyFormat == 2) {
- format = RSATool.KeyFormat.PKCS1;
- }
- RSATool rsaTool = new RSATool(format, RSATool.KeyLength.LENGTH_2048);
- return rsaTool.createKeys();
- }
-
- @Api(name = "isv.secret.gen")
- @ApiDocMethod(description = "生成MD秘钥")
- String createSecret() throws Exception {
- return IdGen.uuid();
- }
-
- void saveIsvRole(IsvInfo isvInfo, List roleCodeList) {
- Query query = new Query();
- Long isvId = isvInfo.getId();
- query.eq("isv_id", isvId);
- permIsvRoleMapper.deleteByQuery(query);
-
- List tobeSaveList = roleCodeList.stream()
- .map(roleCode -> {
- PermIsvRole rec = new PermIsvRole();
- rec.setIsvId(isvId);
- rec.setRoleCode(roleCode);
- return rec;
- })
- .collect(Collectors.toList());
-
- if (CollectionUtils.isNotEmpty(tobeSaveList)) {
- permIsvRoleMapper.saveBatch(tobeSaveList);
- }
-
- try {
- routePermissionService.sendIsvRolePermissionMsg(isvInfo.getAppKey(), roleCodeList);
- } catch (Exception e) {
- log.error("同步角色失败,isvInfo:{}, roleCodeList:{}", isvInfo, roleCodeList);
- throw new BizException("同步角色失败,请查看网关日志");
- }
- }
-}
diff --git a/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/api/isv/RoleApi.java b/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/api/isv/RoleApi.java
deleted file mode 100644
index 8e6b502b..00000000
--- a/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/api/isv/RoleApi.java
+++ /dev/null
@@ -1,87 +0,0 @@
-package com.gitee.sop.adminserver.api.isv;
-
-import com.gitee.easyopen.annotation.Api;
-import com.gitee.easyopen.annotation.ApiService;
-import com.gitee.easyopen.doc.annotation.ApiDoc;
-import com.gitee.easyopen.doc.annotation.ApiDocMethod;
-import com.gitee.easyopen.util.CopyUtil;
-import com.gitee.fastmybatis.core.query.Query;
-import com.gitee.fastmybatis.core.query.Sort;
-import com.gitee.fastmybatis.core.support.PageEasyui;
-import com.gitee.fastmybatis.core.util.MapperUtil;
-import com.gitee.sop.adminserver.api.isv.param.RoleForm;
-import com.gitee.sop.adminserver.api.isv.param.RolePageParam;
-import com.gitee.sop.adminserver.api.isv.result.RoleVO;
-import com.gitee.sop.adminserver.common.BizException;
-import com.gitee.sop.adminserver.entity.PermRole;
-import com.gitee.sop.adminserver.entity.PermRolePermission;
-import com.gitee.sop.adminserver.mapper.PermRoleMapper;
-import com.gitee.sop.adminserver.mapper.PermRolePermissionMapper;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.beans.factory.annotation.Autowired;
-
-import java.util.List;
-import java.util.stream.Collectors;
-
-/**
- * @author 六如
- */
-@ApiService
-@ApiDoc("ISV管理")
-@Slf4j
-public class RoleApi {
-
- @Autowired
- PermRoleMapper permRoleMapper;
-
- @Autowired
- PermRolePermissionMapper permRolePermissionMapper;
-
- @Api(name = "role.listall")
- List roleListall() {
- Query query = new Query();
- query.orderby("id", Sort.ASC);
- return permRoleMapper.list(query).stream()
- .map(permRole -> {
- RoleVO vo = new RoleVO();
- CopyUtil.copyProperties(permRole, vo);
- return vo;
- })
- .collect(Collectors.toList());
- }
-
- @ApiDocMethod(description = "获取角色,分页")
- @Api(name = "role.page")
- PageEasyui pageRole(RolePageParam rolePage) {
- Query query = Query.build(rolePage);
- return MapperUtil.queryForEasyuiDatagrid(permRoleMapper, query, RoleVO.class);
- }
-
- @Api(name = "role.add")
- void addRole(RoleForm roleForm) {
- PermRole rec = permRoleMapper.getByColumn("role_code", roleForm.getRoleCode());
- if (rec != null) {
- throw new BizException("角色码已存在");
- }
- PermRole permRole = new PermRole();
- CopyUtil.copyPropertiesIgnoreNull(roleForm, permRole);
- permRoleMapper.saveIgnoreNull(permRole);
- }
-
- @Api(name = "role.update")
- void updateRole(RoleForm roleForm) {
- PermRole rec = permRoleMapper.getById(roleForm.getId());
- rec.setDescription(roleForm.getDescription());
- permRoleMapper.updateIgnoreNull(rec);
- }
-
- @Api(name = "role.del")
- void delRole(long id) {
- PermRole rec = permRoleMapper.getById(id);
- PermRolePermission rolePermission = permRolePermissionMapper.getByColumn("role_code", rec.getRoleCode());
- if (rolePermission != null) {
- throw new BizException("该角色已使用,无法删除");
- }
- permRoleMapper.deleteById(id);
- }
-}
diff --git a/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/api/isv/param/IsvInfoForm.java b/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/api/isv/param/IsvInfoForm.java
deleted file mode 100644
index 2d59e45d..00000000
--- a/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/api/isv/param/IsvInfoForm.java
+++ /dev/null
@@ -1,26 +0,0 @@
-package com.gitee.sop.adminserver.api.isv.param;
-
-import com.gitee.easyopen.doc.annotation.ApiDocField;
-import lombok.Data;
-import org.hibernate.validator.constraints.Length;
-
-import java.util.Collections;
-import java.util.List;
-
-/**
- * @author 六如
- */
-@Data
-public class IsvInfoForm {
-
- /** 0启用,1禁用, 数据库字段:status */
- @ApiDocField(description = "状态:0:启用,1:禁用")
- private Byte status = 0;
-
- @ApiDocField(description = "备注")
- @Length(max = 100, message = "长度不得唱过100")
- private String remark;
-
- @ApiDocField(description = "roleCode数组", elementClass = String.class)
- private List roleCode = Collections.emptyList();
-}
diff --git a/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/api/isv/param/IsvInfoFormAdd.java b/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/api/isv/param/IsvInfoFormAdd.java
deleted file mode 100644
index dc7cd3fb..00000000
--- a/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/api/isv/param/IsvInfoFormAdd.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package com.gitee.sop.adminserver.api.isv.param;
-
-import lombok.Getter;
-import lombok.Setter;
-
-/**
- * @author 六如
- */
-@Getter
-@Setter
-public class IsvInfoFormAdd extends IsvInfoForm {
-}
diff --git a/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/api/isv/param/IsvInfoFormUpdate.java b/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/api/isv/param/IsvInfoFormUpdate.java
deleted file mode 100644
index 0b48eef3..00000000
--- a/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/api/isv/param/IsvInfoFormUpdate.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package com.gitee.sop.adminserver.api.isv.param;
-
-import com.gitee.easyopen.doc.annotation.ApiDocField;
-import lombok.Getter;
-import lombok.Setter;
-
-import javax.validation.constraints.NotNull;
-
-/**
- * @author 六如
- */
-@Getter
-@Setter
-public class IsvInfoFormUpdate extends IsvInfoForm {
- @ApiDocField(description = "id")
- @NotNull(message = "id不能为空")
- private Long id;
-}
diff --git a/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/api/isv/param/IsvKeysFormUpdate.java b/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/api/isv/param/IsvKeysFormUpdate.java
deleted file mode 100644
index 5a7b6148..00000000
--- a/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/api/isv/param/IsvKeysFormUpdate.java
+++ /dev/null
@@ -1,39 +0,0 @@
-package com.gitee.sop.adminserver.api.isv.param;
-
-import com.gitee.easyopen.doc.annotation.ApiDocField;
-import lombok.Data;
-import org.hibernate.validator.constraints.Length;
-
-import javax.validation.constraints.Max;
-import javax.validation.constraints.Min;
-import javax.validation.constraints.NotBlank;
-
-/**
- * @author 六如
- */
-@Data
-public class IsvKeysFormUpdate {
- /** appKey, 数据库字段:app_key */
- @ApiDocField(description = "appKey", example = "aaaa")
- @NotBlank(message = "appKey不能为空")
- @Length(max = 100,message = "appKey长度不能超过100")
- private String appKey;
-
- /** secret, 数据库字段:secret */
- @ApiDocField(description = "secret", example = "bbbb")
- private String secret;
-
- /** 秘钥格式,1:PKCS8(JAVA适用),2:PKCS1(非JAVA适用), 数据库字段:key_format */
- @ApiDocField(description = "秘钥格式,1:PKCS8(JAVA适用),2:PKCS1(非JAVA适用)", example = "1")
- @Min(value = 1, message = "秘钥格式错误")
- @Max(value = 2, message = "秘钥格式错误")
- private Byte keyFormat;
-
- /** 平台生成的公钥(交给开发者), 数据库字段:public_key_platform */
- @ApiDocField(description = "平台生成的公钥")
- private String publicKeyPlatform;
-
- /** 平台生成的私钥, 数据库字段:private_key_platform */
- @ApiDocField(description = "平台生成的私钥")
- private String privateKeyPlatform;
-}
diff --git a/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/api/isv/param/IsvKeysGen.java b/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/api/isv/param/IsvKeysGen.java
deleted file mode 100644
index 84130a54..00000000
--- a/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/api/isv/param/IsvKeysGen.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package com.gitee.sop.adminserver.api.isv.param;
-
-import com.gitee.easyopen.doc.annotation.ApiDocField;
-import lombok.Data;
-
-import javax.validation.constraints.Max;
-import javax.validation.constraints.Min;
-
-/**
- * @author 六如
- */
-@Data
-public class IsvKeysGen {
- @ApiDocField(description = "秘钥格式,1:PKCS8(JAVA适用),2:PKCS1(非JAVA适用)", example = "1")
- @Min(value = 1, message = "秘钥格式错误")
- @Max(value = 2, message = "秘钥格式错误")
- private Byte keyFormat;
-}
diff --git a/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/api/isv/param/IsvPageParam.java b/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/api/isv/param/IsvPageParam.java
deleted file mode 100644
index 4dd218a4..00000000
--- a/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/api/isv/param/IsvPageParam.java
+++ /dev/null
@@ -1,24 +0,0 @@
-package com.gitee.sop.adminserver.api.isv.param;
-
-import com.gitee.easyopen.doc.DataType;
-import com.gitee.easyopen.doc.annotation.ApiDocBean;
-import com.gitee.easyopen.doc.annotation.ApiDocField;
-import com.gitee.fastmybatis.core.query.annotation.Condition;
-import com.gitee.fastmybatis.core.query.param.PageParam;
-import lombok.Getter;
-import lombok.Setter;
-
-/**
- * @author 六如
- */
-@Getter
-@Setter
-@ApiDocBean(fields = {
- @ApiDocField(name = "pageIndex", description = "第几页", dataType = DataType.INT, example = "1"),
- @ApiDocField(name = "pageSize", description = "每页几条数据", dataType = DataType.INT, example = "10"),
-})
-public class IsvPageParam extends PageParam {
- @ApiDocField(name = "appKey", description = "appKey", dataType = DataType.STRING, example = "111111")
- @Condition(ignoreEmptyString = true)
- private String appKey;
-}
diff --git a/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/api/isv/param/RoleForm.java b/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/api/isv/param/RoleForm.java
deleted file mode 100644
index 9420b264..00000000
--- a/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/api/isv/param/RoleForm.java
+++ /dev/null
@@ -1,24 +0,0 @@
-package com.gitee.sop.adminserver.api.isv.param;
-
-import com.gitee.easyopen.doc.annotation.ApiDocField;
-import lombok.Data;
-import org.hibernate.validator.constraints.Length;
-
-import javax.validation.constraints.NotBlank;
-
-/**
- * @author 六如
- */
-@Data
-public class RoleForm {
- @ApiDocField(description = "id")
- private Long id;
-
- @ApiDocField(description = "角色码")
- @NotBlank(message = "roleCode不能为空")
- @Length(max = 64)
- private String roleCode;
-
- @ApiDocField(description = "描述")
- private String description;
-}
diff --git a/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/api/isv/param/RolePageParam.java b/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/api/isv/param/RolePageParam.java
deleted file mode 100644
index 09c55cf8..00000000
--- a/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/api/isv/param/RolePageParam.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package com.gitee.sop.adminserver.api.isv.param;
-
-import com.gitee.easyopen.doc.annotation.ApiDocField;
-import com.gitee.fastmybatis.core.query.Operator;
-import com.gitee.fastmybatis.core.query.annotation.Condition;
-import com.gitee.fastmybatis.core.query.param.PageParam;
-import lombok.Getter;
-import lombok.Setter;
-
-/**
- * @author 六如
- */
-@Getter
-@Setter
-public class RolePageParam extends PageParam {
- @ApiDocField(description = "角色码")
- @Condition(operator = Operator.like)
- private String roleCode;
-}
diff --git a/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/api/isv/result/IsvAppKeyGenVO.java b/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/api/isv/result/IsvAppKeyGenVO.java
deleted file mode 100644
index 7bcec721..00000000
--- a/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/api/isv/result/IsvAppKeyGenVO.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package com.gitee.sop.adminserver.api.isv.result;
-
-import lombok.Data;
-
-/**
- * @author 六如
- */
-@Data
-public class IsvAppKeyGenVO {
- private String appKey;
-}
diff --git a/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/api/isv/result/IsvDetailDTO.java b/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/api/isv/result/IsvDetailDTO.java
deleted file mode 100644
index 022f7ac1..00000000
--- a/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/api/isv/result/IsvDetailDTO.java
+++ /dev/null
@@ -1,34 +0,0 @@
-package com.gitee.sop.adminserver.api.isv.result;
-
-import com.gitee.easyopen.doc.annotation.ApiDocField;
-import lombok.Data;
-
-/**
- * @author 六如
- */
-@Data
-public class IsvDetailDTO {
-
- /** appKey, 数据库字段:app_key */
- @ApiDocField(description = "appKey", example = "aaaa")
- private String appKey;
-
- /** 0启用,1禁用, 数据库字段:status */
- @ApiDocField(description = "状态:0启用,1禁用")
- private Byte status;
-
- /** secret, 数据库字段:secret */
- @ApiDocField(description = "secret", example = "bbbb")
- private String secret;
-
- /** 开发者生成的公钥, 数据库字段:public_key_isv */
- @ApiDocField(description = "开发者生成的公钥")
- private String publicKeyIsv;
-
- /** 平台生成的私钥, 数据库字段:private_key_platform */
- @ApiDocField(description = "平台生成的私钥")
- private String privateKeyPlatform;
-
- @ApiDocField(description = "签名类型:1:RSA2,2:MD5")
- private Byte signType;
-}
diff --git a/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/api/isv/result/IsvInfoVO.java b/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/api/isv/result/IsvInfoVO.java
deleted file mode 100644
index a28b4e68..00000000
--- a/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/api/isv/result/IsvInfoVO.java
+++ /dev/null
@@ -1,44 +0,0 @@
-package com.gitee.sop.adminserver.api.isv.result;
-
-import com.gitee.easyopen.doc.annotation.ApiDocField;
-import lombok.Data;
-
-import java.util.Date;
-import java.util.List;
-
-/**
- * @author 六如
- */
-@Data
-public class IsvInfoVO {
- /** 数据库字段:id */
- @ApiDocField(description = "id", example = "1")
- private Long id;
-
- /** appKey, 数据库字段:app_key */
- @ApiDocField(description = "appKey", example = "aaaa")
- private String appKey;
-
- /** 0启用,1禁用, 数据库字段:status */
- @ApiDocField(description = "状态:0启用,1禁用")
- private Byte status;
-
- @ApiDocField(description = "签名类型:1:RSA2,2:MD5")
- private Byte signType;
-
- @ApiDocField(description = "备注")
- private String remark;
-
- private Long userId;
-
- /** 数据库字段:gmt_create */
- @ApiDocField(description = "添加时间")
- private Date gmtCreate;
-
- /** 数据库字段:gmt_modified */
- @ApiDocField(description = "修改时间")
- private Date gmtModified;
-
- @ApiDocField(description = "角色列表")
- private List roleList;
-}
diff --git a/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/api/isv/result/IsvKeysGenVO.java b/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/api/isv/result/IsvKeysGenVO.java
deleted file mode 100644
index e23967c6..00000000
--- a/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/api/isv/result/IsvKeysGenVO.java
+++ /dev/null
@@ -1,25 +0,0 @@
-package com.gitee.sop.adminserver.api.isv.result;
-
-import lombok.Data;
-
-/**
- * @author 六如
- */
-@Data
-public class IsvKeysGenVO {
- /** secret, 数据库字段:secret */
- private String secret;
-
- /** 开发者生成的公钥, 数据库字段:public_key_isv */
- private String publicKeyIsv;
-
- /** 开发者生成的私钥(交给开发者), 数据库字段:private_key_isv */
- private String privateKeyIsv;
-
- /** 平台生成的公钥(交给开发者), 数据库字段:public_key_platform */
- private String publicKeyPlatform;
-
- /** 平台生成的私钥, 数据库字段:private_key_platform */
- private String privateKeyPlatform;
-
-}
diff --git a/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/api/isv/result/IsvKeysVO.java b/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/api/isv/result/IsvKeysVO.java
deleted file mode 100644
index 1243fb3f..00000000
--- a/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/api/isv/result/IsvKeysVO.java
+++ /dev/null
@@ -1,38 +0,0 @@
-package com.gitee.sop.adminserver.api.isv.result;
-
-import com.gitee.easyopen.doc.annotation.ApiDocField;
-import lombok.Data;
-
-/**
- * @author 六如
- */
-@Data
-public class IsvKeysVO {
-
- /** appKey, 数据库字段:app_key */
- @ApiDocField(description = "appKey", example = "aaaa")
- private String appKey;
-
- /** secret, 数据库字段:secret */
- @ApiDocField(description = "secret", example = "bbbb")
- private String secret;
-
- /** 秘钥格式,1:PKCS8(JAVA适用),2:PKCS1(非JAVA适用), 数据库字段:key_format */
- private Byte keyFormat = 1;
-
- /** 开发者生成的公钥, 数据库字段:public_key_isv */
- private String publicKeyIsv;
-
- /** 开发者生成的私钥(交给开发者), 数据库字段:private_key_isv */
- private String privateKeyIsv;
-
- /** 平台生成的公钥(交给开发者), 数据库字段:public_key_platform */
- private String publicKeyPlatform;
-
- /** 平台生成的私钥, 数据库字段:private_key_platform */
- private String privateKeyPlatform;
-
- @ApiDocField(description = "签名类型:1:RSA2,2:MD5")
- private Byte signType = 1;
-
-}
diff --git a/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/api/isv/result/RoleVO.java b/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/api/isv/result/RoleVO.java
deleted file mode 100644
index 91b277c7..00000000
--- a/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/api/isv/result/RoleVO.java
+++ /dev/null
@@ -1,27 +0,0 @@
-package com.gitee.sop.adminserver.api.isv.result;
-
-import com.gitee.easyopen.doc.annotation.ApiDocField;
-import lombok.Data;
-
-import java.util.Date;
-
-/**
- * @author 六如
- */
-@Data
-public class RoleVO {
- @ApiDocField(description = "id")
- private Long id;
-
- @ApiDocField(description = "角色码")
- private String roleCode;
-
- @ApiDocField(description = "描述")
- private String description;
-
- @ApiDocField(description = "创建时间")
- private Date gmtCreate;
-
- @ApiDocField(description = "修改时间")
- private Date gmtModified;
-}
diff --git a/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/api/service/IPBlacklistApi.java b/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/api/service/IPBlacklistApi.java
deleted file mode 100644
index 2a893ce4..00000000
--- a/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/api/service/IPBlacklistApi.java
+++ /dev/null
@@ -1,94 +0,0 @@
-package com.gitee.sop.adminserver.api.service;
-
-import com.gitee.easyopen.annotation.Api;
-import com.gitee.easyopen.annotation.ApiService;
-import com.gitee.easyopen.doc.annotation.ApiDoc;
-import com.gitee.easyopen.doc.annotation.ApiDocMethod;
-import com.gitee.easyopen.util.CopyUtil;
-import com.gitee.fastmybatis.core.query.Query;
-import com.gitee.fastmybatis.core.query.Sort;
-import com.gitee.fastmybatis.core.support.PageEasyui;
-import com.gitee.fastmybatis.core.util.MapperUtil;
-import com.gitee.sop.adminserver.api.service.param.ConfigIpBlackForm;
-import com.gitee.sop.adminserver.api.service.param.ConfigIpBlacklistPageParam;
-import com.gitee.sop.adminserver.api.service.result.ConfigIpBlacklistVO;
-import com.gitee.sop.adminserver.bean.ChannelMsg;
-import com.gitee.sop.adminserver.bean.NacosConfigs;
-import com.gitee.sop.adminserver.common.BizException;
-import com.gitee.sop.adminserver.common.ChannelOperation;
-import com.gitee.sop.adminserver.entity.ConfigIpBlacklist;
-import com.gitee.sop.adminserver.mapper.ConfigIpBlacklistMapper;
-import com.gitee.sop.adminserver.service.ConfigPushService;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.beans.factory.annotation.Autowired;
-
-/**
- * @author 六如
- */
-@ApiService
-@ApiDoc("IP黑名单管理")
-@Slf4j
-public class IPBlacklistApi {
-
- @Autowired
- ConfigIpBlacklistMapper configIpBlacklistMapper;
-
- @Autowired
- private ConfigPushService configPushService;
-
- @ApiDocMethod(description = "获取IP黑名单,分页")
- @Api(name = "ip.blacklist.page")
- PageEasyui page(ConfigIpBlacklistPageParam form) {
- Query query = Query.build(form);
- query.orderby("id", Sort.DESC);
- return MapperUtil.queryForEasyuiDatagrid(configIpBlacklistMapper, query, ConfigIpBlacklistVO.class);
- }
-
- @ApiDocMethod(description = "IP黑名单--新增")
- @Api(name = "ip.blacklist.add")
- void add(ConfigIpBlackForm form) {
- ConfigIpBlacklist rec = configIpBlacklistMapper.getByColumn("ip", form.getIp());
- if (rec != null) {
- throw new BizException("IP已添加");
- }
- rec = new ConfigIpBlacklist();
- CopyUtil.copyPropertiesIgnoreNull(form, rec);
- configIpBlacklistMapper.saveIgnoreNull(rec);
- try {
- this.sendIpBlacklistMsg(rec, ChannelOperation.BLACKLIST_ADD);
- } catch (Exception e) {
- log.error("推送IP黑名单失败, rec:{}",rec, e);
- throw new BizException("推送IP黑名单失败");
- }
- }
-
- @ApiDocMethod(description = "IP黑名单--修改")
- @Api(name = "ip.blacklist.update")
- void update(ConfigIpBlackForm form) {
- ConfigIpBlacklist rec = configIpBlacklistMapper.getById(form.getId());
- CopyUtil.copyPropertiesIgnoreNull(form, rec);
- configIpBlacklistMapper.updateIgnoreNull(rec);
- }
-
- @ApiDocMethod(description = "IP黑名单--删除")
- @Api(name = "ip.blacklist.del")
- void del(long id) {
- ConfigIpBlacklist rec = configIpBlacklistMapper.getById(id);
- if (rec == null) {
- return;
- }
- configIpBlacklistMapper.deleteById(id);
- try {
- this.sendIpBlacklistMsg(rec, ChannelOperation.BLACKLIST_DELETE);
- } catch (Exception e) {
- log.error("推送IP黑名单失败, rec:{}",rec, e);
- throw new BizException("推送IP黑名单失败");
- }
- }
-
- public void sendIpBlacklistMsg(ConfigIpBlacklist configIpBlacklist, ChannelOperation channelOperation) {
- ChannelMsg channelMsg = new ChannelMsg(channelOperation, configIpBlacklist);
- configPushService.publishConfig(NacosConfigs.DATA_ID_IP_BLACKLIST, NacosConfigs.GROUP_CHANNEL, channelMsg);
- }
-
-}
diff --git a/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/api/service/LimitNewApi.java b/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/api/service/LimitNewApi.java
deleted file mode 100644
index eac81ccf..00000000
--- a/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/api/service/LimitNewApi.java
+++ /dev/null
@@ -1,95 +0,0 @@
-package com.gitee.sop.adminserver.api.service;
-
-import com.gitee.easyopen.annotation.Api;
-import com.gitee.easyopen.annotation.ApiService;
-import com.gitee.easyopen.doc.annotation.ApiDoc;
-import com.gitee.easyopen.doc.annotation.ApiDocMethod;
-import com.gitee.easyopen.util.CopyUtil;
-import com.gitee.fastmybatis.core.PageInfo;
-import com.gitee.fastmybatis.core.query.Query;
-import com.gitee.fastmybatis.core.query.Sort;
-import com.gitee.fastmybatis.core.util.MapperUtil;
-import com.gitee.sop.adminserver.api.service.param.LimitNewAddParam;
-import com.gitee.sop.adminserver.api.service.param.LimitNewParam;
-import com.gitee.sop.adminserver.api.service.param.LimitNewUpdateParam;
-import com.gitee.sop.adminserver.api.service.result.LimitNewVO;
-import com.gitee.sop.adminserver.bean.ConfigLimitDto;
-import com.gitee.sop.adminserver.common.BizException;
-import com.gitee.sop.adminserver.entity.ConfigLimit;
-import com.gitee.sop.adminserver.mapper.ConfigLimitMapper;
-import com.gitee.sop.adminserver.service.RouteConfigService;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.transaction.annotation.Transactional;
-
-/**
- * 限流
- *
- * @author 六如
- */
-@ApiService
-@ApiDoc("服务管理-限流管理")
-@Slf4j
-public class LimitNewApi {
-
- @Autowired
- RouteConfigService routeConfigService;
-
- @Autowired
- ConfigLimitMapper configLimitMapper;
-
- @Api(name = "config.limit.list")
- @ApiDocMethod(description = "限流列表(新)", elementClass = LimitNewVO.class)
- PageInfo listLimit(LimitNewParam param) {
- Query query = Query.build(param);
- query.orderby("route_id", Sort.ASC)
- .orderby("app_key", Sort.ASC)
- .orderby("order_index", Sort.ASC);
- PageInfo pageInfo = MapperUtil.query(configLimitMapper, query);
- return pageInfo;
- }
-
- @Api(name = "config.limit.add")
- @ApiDocMethod(description = "新增限流(新)")
- @Transactional(rollbackFor = Exception.class)
- public void createLimtit(LimitNewAddParam param) {
- ConfigLimit configLimit = new ConfigLimit();
- CopyUtil.copyPropertiesIgnoreNull(param, configLimit);
- configLimitMapper.save(configLimit);
- ConfigLimitDto configLimitDto = buildConfigLimitDto(configLimit);
- try {
- routeConfigService.sendLimitConfigMsg(configLimitDto);
- } catch (Exception e) {
- log.error("推送限流消息错误, param:{}", param, e);
- throw new BizException("新增失败,请查看日志");
- }
- }
-
- @Api(name = "config.limit.update")
- @ApiDocMethod(description = "修改限流(新)")
- @Transactional(rollbackFor = Exception.class)
- public void updateLimtit(LimitNewUpdateParam param) {
- ConfigLimit configLimit = configLimitMapper.getById(param.getId());
- if (configLimit == null) {
- configLimit = new ConfigLimit();
- CopyUtil.copyPropertiesIgnoreNull(param, configLimit);
- configLimitMapper.save(configLimit);
- } else {
- CopyUtil.copyPropertiesIgnoreNull(param, configLimit);
- configLimitMapper.update(configLimit);
- }
- ConfigLimitDto configLimitDto = buildConfigLimitDto(configLimit);
- try {
- routeConfigService.sendLimitConfigMsg(configLimitDto);
- } catch (Exception e) {
- log.error("推送限流消息错误, param:{}", param, e);
- throw new BizException("修改失败,请查看日志");
- }
- }
-
- private ConfigLimitDto buildConfigLimitDto(ConfigLimit configLimit) {
- ConfigLimitDto configLimitDto = new ConfigLimitDto();
- CopyUtil.copyPropertiesIgnoreNull(configLimit, configLimitDto);
- return configLimitDto;
- }
-}
diff --git a/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/api/service/LogApi.java b/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/api/service/LogApi.java
deleted file mode 100644
index eb1fdc14..00000000
--- a/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/api/service/LogApi.java
+++ /dev/null
@@ -1,173 +0,0 @@
-package com.gitee.sop.adminserver.api.service;
-
-import com.alibaba.fastjson.JSON;
-import com.alibaba.fastjson.JSONObject;
-import com.gitee.easyopen.annotation.Api;
-import com.gitee.easyopen.annotation.ApiService;
-import com.gitee.easyopen.doc.annotation.ApiDoc;
-import com.gitee.easyopen.doc.annotation.ApiDocMethod;
-import com.gitee.easyopen.verify.DefaultMd5Verifier;
-import com.gitee.fastmybatis.core.query.Query;
-import com.gitee.sop.adminserver.api.service.param.LogMonitorInstanceAddParam;
-import com.gitee.sop.adminserver.api.service.result.LogMonitorInstanceVO;
-import com.gitee.sop.adminserver.common.BizException;
-import com.gitee.sop.adminserver.common.QueryUtil;
-import com.gitee.sop.adminserver.entity.ConfigCommon;
-import com.gitee.sop.adminserver.mapper.ConfigCommonMapper;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.http.HttpStatus;
-import org.springframework.http.ResponseEntity;
-import org.springframework.web.client.RestTemplate;
-
-import javax.validation.constraints.NotNull;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.stream.Collectors;
-
-/**
- * @author 六如
- */
-@ApiService
-@ApiDoc("服务管理-日志监控")
-@Slf4j
-public class LogApi {
-
- public static final String LOG_MONITOR_INSTANCE = "log.monitor.instance";
- public static final String CODE_SUCCESS = "10000";
- private static final String CODE_KEY = "code";
- public static final String SOP_LIST_ERRORS_PATH = "/sop/listErrors";
- public static final String SOP_CLEAR_ERRORS_PATH = "/sop/clearErrors";
-
- @Autowired
- ConfigCommonMapper configCommonMapper;
-
- RestTemplate restTemplate = new RestTemplate();
-
- @Value("${sop.secret}")
- private String secret;
-
- @Api(name = "monitor.log.list")
- @ApiDocMethod(description = "获取监控日志")
- List listLog() {
- List configCommonList = configCommonMapper.listByColumn("config_group", LOG_MONITOR_INSTANCE);
- List ret = new ArrayList<>();
- int id = 1;
- for (ConfigCommon configCommon : configCommonList) {
- int pid = id++;
- String ipPort = configCommon.getConfigKey();
- // 父节点
- LogMonitorInstanceVO logMonitorInstanceVOParent = new LogMonitorInstanceVO();
- logMonitorInstanceVOParent.setRawId(configCommon.getId());
- logMonitorInstanceVOParent.setTreeId(pid);
- logMonitorInstanceVOParent.setMonitorName(configCommon.getContent());
- ret.add(logMonitorInstanceVOParent);
- try {
- String logData = this.requestLogServer(ipPort, SOP_LIST_ERRORS_PATH);
- JSONObject jsonObject = JSON.parseObject(logData);
- if (CODE_SUCCESS.equals(jsonObject.getString("code"))) {
- int errorTotal = 0;
- List data = JSON.parseArray(jsonObject.getString("data"), LogMonitorInstanceVO.class);
- for (LogMonitorInstanceVO instanceVO : data) {
- instanceVO.setTreeId(id++);
- instanceVO.setParentId(pid);
- errorTotal += instanceVO.getCount();
- }
- ret.addAll(data);
- logMonitorInstanceVOParent.setCount(errorTotal);
- }
- } catch (Exception e) {
- log.error("获取日志信息出错", e);
- logMonitorInstanceVOParent.setMonitorName(logMonitorInstanceVOParent.getMonitorName() + "(请求出错)");
- }
- }
- Collections.sort(ret, Comparator.comparing(LogMonitorInstanceVO::getCount));
- return ret;
- }
-
- @Api(name = "monitor.log.clear")
- @ApiDocMethod(description = "清空日志")
- void clearLog(@NotNull(message = "id不能为空") Long id) {
- ConfigCommon configCommon = configCommonMapper.getById(id);
- if (configCommon == null) {
- return;
- }
- try {
- String ipPort = configCommon.getConfigKey();
- this.requestLogServer(ipPort, SOP_CLEAR_ERRORS_PATH);
- } catch (Exception e) {
- throw new BizException("清除失败");
- }
- }
-
- @Api(name = "monitor.instance.list")
- @ApiDocMethod(description = "获取已添加的监控实例")
- List listServiceInstance() {
- List configCommonList = configCommonMapper.listByColumn("config_group", LOG_MONITOR_INSTANCE);
- return configCommonList.stream()
- .map(ConfigCommon::getConfigKey)
- .collect(Collectors.toList());
- }
-
- @Api(name = "monitor.instance.add")
- @ApiDocMethod(description = "添加监控实例")
- void addServiceInstance(LogMonitorInstanceAddParam param) {
- String ipPort = param.getIpPort();
- this.checkInstance(ipPort);
-
- Query query = new Query();
- query.eq("config_group", LOG_MONITOR_INSTANCE)
- .eq("config_key", ipPort);
- ConfigCommon rec = configCommonMapper.getByQuery(query);
- if (rec != null) {
- throw new BizException("该实例已添加");
- }
- ConfigCommon configCommon = new ConfigCommon();
- configCommon.setConfigGroup(LOG_MONITOR_INSTANCE);
- configCommon.setConfigKey(ipPort);
- configCommon.setContent(param.getServiceId() + "(" + ipPort + ")");
- configCommonMapper.saveIgnoreNull(configCommon);
- }
-
- private void checkInstance(String ipPort) {
- try {
- String json = this.requestLogServer(ipPort, SOP_LIST_ERRORS_PATH);
- JSONObject jsonObject = JSON.parseObject(json);
- if (!CODE_SUCCESS.equals(jsonObject.getString(CODE_KEY))) {
- log.error("请求结果:{}", json);
- throw new BizException("添加失败");
- }
- } catch (Exception e) {
- log.error("添加失败", e);
- throw new BizException("添加失败");
- }
- }
-
- private String requestLogServer(String ipPort, String path) throws Exception {
- DefaultMd5Verifier md5Verifier = new DefaultMd5Verifier();
- Map params = new HashMap<>(16);
- params.put("time", System.currentTimeMillis());
- String sign = md5Verifier.buildSign(params, secret);
- params.put("sign", sign);
- String query = QueryUtil.buildQueryString(params);
- path = path.startsWith("/") ? path.substring(1) : path;
- String url = "http://" + ipPort + "/" + path + "?" + query;
- ResponseEntity entity = restTemplate.getForEntity(url, String.class);
- if (entity.getStatusCode() != HttpStatus.OK) {
- throw new IllegalAccessException("无权访问");
- }
- return entity.getBody();
- }
-
- @Api(name = "monitor.instance.del")
- @ApiDocMethod(description = "删除监控实例")
- void delServiceInstance(@NotNull(message = "id不能为空") Long id) {
- configCommonMapper.deleteById(id);
- }
-
-}
diff --git a/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/api/service/MonitorApi.java b/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/api/service/MonitorApi.java
deleted file mode 100644
index 242f6b1d..00000000
--- a/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/api/service/MonitorApi.java
+++ /dev/null
@@ -1,166 +0,0 @@
-package com.gitee.sop.adminserver.api.service;
-
-import com.alibaba.fastjson.JSON;
-import com.alibaba.fastjson.JSONObject;
-import com.gitee.easyopen.annotation.Api;
-import com.gitee.easyopen.annotation.ApiService;
-import com.gitee.easyopen.doc.annotation.ApiDoc;
-import com.gitee.easyopen.doc.annotation.ApiDocMethod;
-import com.gitee.easyopen.exception.ApiException;
-import com.gitee.sop.adminserver.api.service.param.RouteParam;
-import com.gitee.sop.adminserver.api.service.param.RouteSearchParam;
-import com.gitee.sop.adminserver.api.service.param.ServiceSearchParam;
-import com.gitee.sop.adminserver.api.service.result.MonitorInfoVO;
-import com.gitee.sop.adminserver.api.service.result.MonitorResult;
-import com.gitee.sop.adminserver.api.service.result.ServiceInstanceVO;
-import com.gitee.sop.adminserver.common.QueryUtil;
-import com.gitee.sop.adminserver.service.ServerService;
-import lombok.extern.slf4j.Slf4j;
-import org.apache.commons.lang.StringUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Value;
-
-import java.util.ArrayList;
-import java.util.Comparator;
-import java.util.List;
-import java.util.Set;
-import java.util.concurrent.atomic.AtomicInteger;
-import java.util.stream.Collectors;
-
-/**
- * @author 六如
- * @deprecated use com.gitee.sop.adminserver.api.service.MonitorNewApi
- * @see MonitorNewApi
- */
-@Deprecated
-//@ApiService
-@ApiDoc("服务管理-监控")
-@Slf4j
-public class MonitorApi {
-
- private static final String GATEWAY_MONITOR_PATH = "/sop/getMonitorData";
-
- @Autowired
- private ServerService serverService;
-
- @Value("${sop.secret}")
- private String secret;
-
- @Api(name = "monitor.data.list")
- @ApiDocMethod(description = "获取监控数据")
- public MonitorResult listMonitorData(RouteParam param) {
- ServiceSearchParam serviceSearchParam = new ServiceSearchParam();
- serviceSearchParam.setServiceId("sop-gateway");
- String searchRouteId = param.getRouteId();
- List monitorInfoList = new ArrayList<>();
- List serviceInstanceVOS = serverService.listService(serviceSearchParam);
- for (ServiceInstanceVO serviceInstanceVO : serviceInstanceVOS) {
- if (StringUtils.isBlank(serviceInstanceVO.getInstanceId())) {
- continue;
- }
- String ipPort = serviceInstanceVO.getIpPort();
- try {
- String data = QueryUtil.requestServer(ipPort, GATEWAY_MONITOR_PATH, secret);
- JSONObject jsonObject = JSON.parseObject(data);
- List monitorInfoVOList = this.buildMonitorInfoVO(serviceInstanceVO, jsonObject.getJSONObject("data"));
- List newList = monitorInfoVOList.stream()
- .filter(monitorInfoVO -> StringUtils.isBlank(searchRouteId)
- || StringUtils.containsIgnoreCase(monitorInfoVO.getRouteId(), searchRouteId))
- .collect(Collectors.toList());
- monitorInfoList.addAll(newList);
- } catch (Exception e) {
- log.error("请求服务失败, ipPort:{}, path:{}", ipPort, GATEWAY_MONITOR_PATH, e);
- throw new ApiException("请求数据失败");
- }
- }
-
- MonitorResult monitorResult = new MonitorResult();
- List monitorInfoTreeData = this.buildTreeData(monitorInfoList);
- monitorResult.setMonitorInfoData(monitorInfoTreeData);
- return monitorResult;
- }
-
- private List buildTreeData(List monitorInfoList) {
- AtomicInteger id = new AtomicInteger();
- List treeData = new ArrayList<>(8);
- monitorInfoList.stream()
- .collect(Collectors.groupingBy(MonitorInfoVO::getRouteId))
- .forEach((routeId, items) -> {
- MonitorInfoVO monitorInfoVOTotal = getStatistics(items, id);
- monitorInfoVOTotal.setId(id.incrementAndGet());
- treeData.add(monitorInfoVOTotal);
- });
-
- Comparator comparator = Comparator
- // 根据错误次数降序
- .comparing(MonitorInfoVO::getErrorCount).reversed()
- // 然后根据请求耗时降序
- .thenComparing(Comparator.comparing(MonitorInfoVO::getAvgTime).reversed());
- treeData.sort(comparator);
- return treeData;
- }
-
- private MonitorInfoVO getStatistics(List children, AtomicInteger id) {
- long totalRequestDataSize = 0;
- long totalResponseDataSize = 0;
- long maxTime = 0;
- long minTime = 0;
- long totalTime = 0;
- long totalCount = 0;
- long successCount = 0;
- long errorCount = 0;
- List errorMsgList = new ArrayList<>();
-
- String name = null,version = null, serviceId = null;
-
- for (MonitorInfoVO child : children) {
- name = child.getName();
- version = child.getVersion();
- serviceId = child.getServiceId();
-
- child.setId(id.incrementAndGet());
- totalRequestDataSize += child.getTotalRequestDataSize();
- totalResponseDataSize += child.getTotalResponseDataSize();
- if (minTime == 0 || child.getMinTime() < minTime) {
- minTime = child.getMinTime();
- }
- if (child.getMaxTime() > maxTime) {
- maxTime = child.getMaxTime();
- }
- totalTime += child.getTotalTime();
- totalCount += child.getTotalCount();
- successCount += child.getSuccessCount();
- errorCount += child.getErrorCount();
- errorMsgList.addAll(child.getErrorMsgList());
- }
-
- MonitorInfoVO total = new MonitorInfoVO();
- total.setName(name);
- total.setVersion(version);
- total.setServiceId(serviceId);
- total.setErrorCount(errorCount);
- total.setMaxTime(maxTime);
- total.setMinTime(minTime);
- total.setSuccessCount(successCount);
- total.setTotalCount(totalCount);
- total.setTotalRequestDataSize(totalRequestDataSize);
- total.setTotalResponseDataSize(totalResponseDataSize);
- total.setTotalTime(totalTime);
- total.setChildren(children);
- total.setErrorMsgList(errorMsgList);
- return total;
- }
-
- private List buildMonitorInfoVO(ServiceInstanceVO serviceInstanceVO, JSONObject monitorData) {
- Set routeIdList = monitorData.keySet();
- List ret = new ArrayList<>(routeIdList.size());
- routeIdList.forEach(routeId -> {
- JSONObject monitorInfo = monitorData.getJSONObject(routeId);
- MonitorInfoVO monitorInfoVO = monitorInfo.toJavaObject(MonitorInfoVO.class);
- monitorInfoVO.setInstanceId(serviceInstanceVO.getIpPort());
- ret.add(monitorInfoVO);
- });
- return ret;
- }
-
-}
diff --git a/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/api/service/MonitorNewApi.java b/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/api/service/MonitorNewApi.java
deleted file mode 100644
index a048cee7..00000000
--- a/sop-admin/sop-admin-server/src/main/java/com/gitee/sop/adminserver/api/service/MonitorNewApi.java
+++ /dev/null
@@ -1,80 +0,0 @@
-package com.gitee.sop.adminserver.api.service;
-
-import com.gitee.easyopen.annotation.Api;
-import com.gitee.easyopen.annotation.ApiService;
-import com.gitee.fastmybatis.core.query.Query;
-import com.gitee.fastmybatis.core.query.Sort;
-import com.gitee.fastmybatis.core.support.PageEasyui;
-import com.gitee.fastmybatis.core.util.MapperUtil;
-import com.gitee.sop.adminserver.api.service.param.InstanceMonitorSearchParam;
-import com.gitee.sop.adminserver.api.service.param.MonitorErrorMsgParam;
-import com.gitee.sop.adminserver.api.service.param.MonitorInfoErrorSolveParam;
-import com.gitee.sop.adminserver.api.service.param.MonitorSearchParam;
-import com.gitee.sop.adminserver.bean.RouteErrorCount;
-import com.gitee.sop.adminserver.entity.MonitorInfoError;
-import com.gitee.sop.adminserver.entity.MonitorSummary;
-import com.gitee.sop.adminserver.mapper.MonitorInfoErrorMapper;
-import com.gitee.sop.adminserver.mapper.MonitorInfoMapper;
-import com.github.pagehelper.PageHelper;
-import com.github.pagehelper.PageInfo;
-import org.springframework.beans.factory.annotation.Autowired;
-
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.stream.Collectors;
-
-/**
- * 路由监控
- * @author 六如
- */
-@ApiService
-public class MonitorNewApi {
-
- @Autowired
- private MonitorInfoMapper monitorInfoMapper;
-
- @Autowired
- private MonitorInfoErrorMapper monitorInfoErrorMapper;
-
- @Api(name = "monitornew.data.page")
- PageInfo