diff --git a/agentcenter-sdk/pom.xml b/agentcenter-sdk/pom.xml
new file mode 100644
index 0000000..5642c37
--- /dev/null
+++ b/agentcenter-sdk/pom.xml
@@ -0,0 +1,107 @@
+
+
+ 4.0.0
+
+ com.nsgk
+ agentcenter-sdk
+ 1.0.0nsgk1
+ jar
+
+ NS代理中心SDK
+
+
+ 1.16.18
+ 5.5.4
+ 2.0.23
+ 1.8
+ UTF-8
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+
+ ${java.version}
+ ${java.version}
+ ${project.sourceEncoding}
+
+
+
+
+
+
+
+
+
+ org.projectlombok
+ lombok
+ ${lombok.version}
+
+
+
+
+ cn.hutool
+ hutool-all
+ ${hutool.version}
+
+
+
+
+ com.alibaba.fastjson2
+ fastjson2
+ ${fastjson.version}
+
+
+
+
+
+
+ org.projectlombok
+ lombok
+
+
+ cn.hutool
+ hutool-all
+
+
+ com.alibaba.fastjson2
+ fastjson2
+
+
+ javax.servlet
+ javax.servlet-api
+ 4.0.1
+ compile
+
+
+
+
+
+ public
+ aliyun nexus
+ https://maven.aliyun.com/repository/public
+
+ true
+
+
+
+
+
+
+ public
+ aliyun nexus
+ https://maven.aliyun.com/repository/public
+
+ true
+
+
+ false
+
+
+
+
+
\ No newline at end of file
diff --git a/agentcenter-sdk/src/main/java/com/nsgk/agentcentersdk/NSMain.java b/agentcenter-sdk/src/main/java/com/nsgk/agentcentersdk/NSMain.java
new file mode 100644
index 0000000..112e98a
--- /dev/null
+++ b/agentcenter-sdk/src/main/java/com/nsgk/agentcentersdk/NSMain.java
@@ -0,0 +1,29 @@
+package com.nsgk.agentcentersdk;
+
+import com.nsgk.agentcentersdk.api.NSApiResult;
+import com.nsgk.agentcentersdk.api.NSSDK;
+import com.nsgk.agentcentersdk.api.NSSDKClient;
+import com.nsgk.agentcentersdk.core.NSProtocol;
+import com.nsgk.agentcentersdk.entity.NSContractionEntity;
+
+public final class NSMain
+{
+ public static void main(String[] args)
+ {
+ NSSDKClient client;
+ NSContractionEntity entity;
+ NSApiResult result;
+
+ NSSDK.InitClient("http://localhost", (short) 8081, "test", "MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAKoR8mX0rGKLqzcWmOzbfj64K8ZIgOdHnzkXSOVOZbFu/TJhZ7rFAN+eaGkl3C4buccQd/EjEsj9ir7ijT7h96MCAwEAAQ==");
+ client = NSSDK.InstanceClient();
+
+ entity = new NSContractionEntity();
+ entity.setBuildingTime("2000-12-23")
+ .setName("测试合同")
+ .setDeptId(187L)
+ .setBookId(166L)
+ ;
+ result = client.Send(NSProtocol.NS_PROTOCOL_CONTRACTION, entity);
+ System.err.println(result);
+ }
+}
diff --git a/agentcenter-sdk/src/main/java/com/nsgk/agentcentersdk/api/NSApi.java b/agentcenter-sdk/src/main/java/com/nsgk/agentcentersdk/api/NSApi.java
new file mode 100644
index 0000000..6b4d5c2
--- /dev/null
+++ b/agentcenter-sdk/src/main/java/com/nsgk/agentcentersdk/api/NSApi.java
@@ -0,0 +1,10 @@
+package com.nsgk.agentcentersdk.api;
+
+// 接口
+public final class NSApi
+{
+ public static final String NS_API_TEST = "/agentcenter/api/test";
+ public static final String NS_API_REPORT = "/agentcenter/api/report";
+
+ private NSApi() {}
+}
diff --git a/agentcenter-sdk/src/main/java/com/nsgk/agentcentersdk/api/NSApiResult.java b/agentcenter-sdk/src/main/java/com/nsgk/agentcentersdk/api/NSApiResult.java
new file mode 100644
index 0000000..f55a99f
--- /dev/null
+++ b/agentcenter-sdk/src/main/java/com/nsgk/agentcentersdk/api/NSApiResult.java
@@ -0,0 +1,30 @@
+package com.nsgk.agentcentersdk.api;
+
+import com.alibaba.fastjson2.JSON;
+import com.alibaba.fastjson2.JSONObject;
+import lombok.Data;
+
+// 服务端返回对象
+@Data
+public class NSApiResult
+{
+ public final int code;
+ public final String msg;
+ public final Object data;
+ public final long timestamp = System.currentTimeMillis();
+
+ NSApiResult(int code, String msg, Object data)
+ {
+ this.code = code;
+ this.msg = msg;
+ this.data = data;
+ }
+
+ static NSApiResult FromJSON(String str)
+ {
+ JSONObject jsonObject;
+
+ jsonObject = JSON.parseObject(str);
+ return new NSApiResult(jsonObject.getInteger("code"), jsonObject.getString("msg"), jsonObject.get("data"));
+ }
+}
diff --git a/agentcenter-sdk/src/main/java/com/nsgk/agentcentersdk/api/NSSDK.java b/agentcenter-sdk/src/main/java/com/nsgk/agentcentersdk/api/NSSDK.java
new file mode 100644
index 0000000..9ebc413
--- /dev/null
+++ b/agentcenter-sdk/src/main/java/com/nsgk/agentcentersdk/api/NSSDK.java
@@ -0,0 +1,90 @@
+package com.nsgk.agentcentersdk.api;
+
+import com.nsgk.agentcentersdk.utility.NSConv;
+
+// SDK全局环境
+public final class NSSDK
+{
+ // client
+ private static final ThreadLocal _host = new ThreadLocal<>();
+ private static final ThreadLocal _port = new ThreadLocal<>();
+ private static final ThreadLocal _identifier = new ThreadLocal<>();
+ private static final ThreadLocal _clientInit = new ThreadLocal<>();
+ private static final ThreadLocal _publicKey = new ThreadLocal<>();
+
+ // server
+ private static final ThreadLocal _privateKey = new ThreadLocal<>();
+ private static final ThreadLocal _serverInit = new ThreadLocal<>();
+
+ public static boolean InitClient(String host, short port, String identifier, String publicKey)
+ {
+ if(NSConv.FALSE(_clientInit.get()))
+ return false;
+ _host.set(host);
+ _port.set(port);
+ _identifier.set(identifier);
+ _publicKey.set(publicKey);
+ _clientInit.set(true);
+ return true;
+ }
+
+ public static boolean ShutdownClient()
+ {
+ if(NSConv.FALSE(_clientInit.get()))
+ return false;
+ _host.remove();
+ _port.remove();
+ _identifier.remove();
+ _publicKey.remove();
+ _clientInit.set(false);
+ return true;
+ }
+
+ public static String Host()
+ {
+ return _host.get();
+ }
+
+ public static short Port()
+ {
+ return _port.get();
+ }
+
+ public static String Identifier()
+ {
+ return _identifier.get();
+ }
+
+ public static NSSDKClient InstanceClient()
+ {
+ if(!NSConv.FALSE(_clientInit.get()))
+ return null;
+ return new NSSDKClient(_host.get(), _port.get(), _identifier.get(), _publicKey.get());
+ }
+
+
+ public static boolean InitServer(String privateKey)
+ {
+ if(NSConv.FALSE(_serverInit.get()))
+ return false;
+ _privateKey.set(privateKey);
+ _serverInit.set(true);
+ return true;
+ }
+
+ public static boolean ShutdownServer()
+ {
+ if(NSConv.FALSE(_serverInit.get()))
+ return false;
+ _privateKey.remove();
+ _serverInit.set(false);
+ return true;
+ }
+
+ public static NSSDKServer InstanceServer()
+ {
+ if(!NSConv.FALSE(_serverInit.get()))
+ return null;
+ return new NSSDKServer(_privateKey.get());
+ }
+}
diff --git a/agentcenter-sdk/src/main/java/com/nsgk/agentcentersdk/api/NSSDKClient.java b/agentcenter-sdk/src/main/java/com/nsgk/agentcentersdk/api/NSSDKClient.java
new file mode 100644
index 0000000..4aa0ae4
--- /dev/null
+++ b/agentcenter-sdk/src/main/java/com/nsgk/agentcentersdk/api/NSSDKClient.java
@@ -0,0 +1,59 @@
+package com.nsgk.agentcentersdk.api;
+
+import cn.hutool.core.util.URLUtil;
+import com.nsgk.agentcentersdk.core.NSReportObject;
+import com.nsgk.agentcentersdk.entity.NSEntityBase;
+import com.nsgk.agentcentersdk.network.NSNetworkManager;
+import com.nsgk.agentcentersdk.network.NSNetworkRequest;
+import com.nsgk.agentcentersdk.network.NSNetworkResponse;
+
+// SDK客户端
+/*
+请求:
+ :/?identifier=&protocol=×tamp=
+ header: sign
+ body: 加密json
+响应:
+ body:
+ code: 200
+ msg: ""
+ timestamp:
+ data: "" // 加密json
+ */
+public final class NSSDKClient
+{
+ private final String host;
+ private final short port;
+ private final String identifier;
+ private final String publicKey;
+
+ NSSDKClient(String host, short port, String identifier, String publicKey)
+ {
+ this.host = host;
+ this.port = port;
+ this.identifier = identifier;
+ this.publicKey = publicKey;
+ }
+
+ // 发送请求
+ public NSApiResult Send(int protocol, T object)
+ {
+ String url;
+ NSReportObject reportObject;
+ NSNetworkRequest request;
+
+ url = NSApi.NS_API_REPORT;
+ reportObject = new NSReportObject<>(identifier, protocol, object);
+ request = new NSNetworkRequest();
+ request.setUrl(BuildUrl(url));
+ request.WriteDataObject(reportObject, publicKey);
+ NSNetworkResponse response = NSNetworkManager.Post(request);
+ String json = response.getData();
+ return NSApiResult.FromJSON(json);
+ }
+
+ private String BuildUrl(String url)
+ {
+ return URLUtil.completeUrl(host + ":" + port, url);
+ }
+}
diff --git a/agentcenter-sdk/src/main/java/com/nsgk/agentcentersdk/api/NSSDKServer.java b/agentcenter-sdk/src/main/java/com/nsgk/agentcentersdk/api/NSSDKServer.java
new file mode 100644
index 0000000..600c8e4
--- /dev/null
+++ b/agentcenter-sdk/src/main/java/com/nsgk/agentcentersdk/api/NSSDKServer.java
@@ -0,0 +1,50 @@
+package com.nsgk.agentcentersdk.api;
+
+import com.nsgk.agentcentersdk.core.NSReportObject;
+import com.nsgk.agentcentersdk.entity.NSEntityBase;
+import com.nsgk.agentcentersdk.utility.NSArr;
+import com.nsgk.agentcentersdk.utility.NSCrypto;
+import com.nsgk.agentcentersdk.utility.NSHttp;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.Map;
+
+// SDK服务端
+public final class NSSDKServer
+{
+ private final String privateKey;
+
+ public NSSDKServer(String privateKey)
+ {
+ this.privateKey = privateKey;
+ }
+
+ // 解析请求
+ public NSReportObject Recv(HttpServletRequest request, Class clazz)
+ {
+ NSReportObject res;
+ String sign;
+ String data;
+
+ sign = request.getHeader("sign");
+ data = NSHttp.GetRequestBody(request);
+ res = new NSReportObject<>();
+ res.SetTimestampStr(request.getParameter("timestamp"))
+ .setIdentifier(request.getParameter("identifier"))
+ .SetProtocolStr(request.getParameter("protocol"))
+ .SetDataStr(NSCrypto.RSADecrypt(data, privateKey), clazz)
+ ;
+ if(!res.CheckSign(sign))
+ {
+ return null;
+ }
+ res.setSign(sign);
+ return res;
+ }
+
+ // 响应客户端
+ public NSApiResult Resp(int code, String msg, Object...data)
+ {
+ return new NSApiResult(code, msg, NSArr.DefParms(data));
+ }
+}
diff --git a/agentcenter-sdk/src/main/java/com/nsgk/agentcentersdk/core/NSProtocol.java b/agentcenter-sdk/src/main/java/com/nsgk/agentcentersdk/core/NSProtocol.java
new file mode 100644
index 0000000..40be408
--- /dev/null
+++ b/agentcenter-sdk/src/main/java/com/nsgk/agentcentersdk/core/NSProtocol.java
@@ -0,0 +1,17 @@
+package com.nsgk.agentcentersdk.core;
+
+// 协议常量
+public final class NSProtocol
+{
+ public static final int NS_PROTOCOL_INVALID = 0;
+ public static final int NS_PROTOCOL_TEST = 0x00001;
+ public static final int NS_PROTOCOL_CONTRACTION = 0x10001;
+
+ public static int FromString(String str)
+ {
+ int i = Integer.parseInt(str);
+ return Math.abs(i);
+ }
+
+ private NSProtocol() {}
+}
diff --git a/agentcenter-sdk/src/main/java/com/nsgk/agentcentersdk/core/NSReportObject.java b/agentcenter-sdk/src/main/java/com/nsgk/agentcentersdk/core/NSReportObject.java
new file mode 100644
index 0000000..4d080fd
--- /dev/null
+++ b/agentcenter-sdk/src/main/java/com/nsgk/agentcentersdk/core/NSReportObject.java
@@ -0,0 +1,93 @@
+package com.nsgk.agentcentersdk.core;
+
+import cn.hutool.core.bean.BeanUtil;
+import com.alibaba.fastjson2.JSON;
+import com.nsgk.agentcentersdk.utility.NSSignTool;
+import com.nsgk.agentcentersdk.utility.NSStr;
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+import java.util.Map;
+
+// 封装对象
+@Data
+@Accessors(chain = true)
+public class NSReportObject
+{
+ protected static final String[] SIGN_FIELDS = {
+ "identifier", "protocol", "timestamp", "dataLength",
+ };
+ private String identifier; // 识别ID
+ private String sign; // 签名
+ private int protocol = NSProtocol.NS_PROTOCOL_INVALID; // 协议
+ private Long timestamp; // 客户端时间戳
+ private T data;
+ private String dataStr = "";
+
+ public NSReportObject setData(T d)
+ {
+ data = d;
+ dataStr = "";
+ if(null != data)
+ dataStr = JSON.toJSONString(data);
+ return this;
+ }
+
+ public NSReportObject SetDataStr(String str, Class clazz)
+ {
+ data = JSON.parseObject(str, clazz);
+ dataStr = str;
+ return this;
+ }
+
+ public NSReportObject()
+ {
+ }
+
+ public NSReportObject(String identifier, int protocol)
+ {
+ this(identifier, protocol, null);
+ }
+
+ public NSReportObject(String identifier, int protocol, T data)
+ {
+ this.identifier = identifier;
+ this.protocol = protocol;
+ timestamp = System.currentTimeMillis();
+ setData(data);
+ sign = Sign();
+ }
+
+ public boolean IsValid()
+ {
+ return NSStr.IsNotEmpty(identifier) && null != timestamp && protocol > 0;
+ }
+
+ public String Sign()
+ {
+ Map map;
+
+ map = BeanUtil.beanToMap(this);
+ map.put("dataLength", NSStr.Length(dataStr));
+ return NSSignTool.Sign(map, SIGN_FIELDS);
+ }
+
+ public boolean CheckSign(String src)
+ {
+ if(!IsValid())
+ return false;
+ return src.equals(Sign());
+ }
+
+ public NSReportObject SetTimestampStr(String str)
+ {
+ timestamp = Long.parseLong(str);
+ return this;
+ }
+
+ public NSReportObject SetProtocolStr(String str)
+ {
+ protocol = NSProtocol.FromString(str);
+ return this;
+ }
+}
diff --git a/agentcenter-sdk/src/main/java/com/nsgk/agentcentersdk/entity/NSContractionEntity.java b/agentcenter-sdk/src/main/java/com/nsgk/agentcentersdk/entity/NSContractionEntity.java
new file mode 100644
index 0000000..5533be8
--- /dev/null
+++ b/agentcenter-sdk/src/main/java/com/nsgk/agentcentersdk/entity/NSContractionEntity.java
@@ -0,0 +1,19 @@
+package com.nsgk.agentcentersdk.entity;
+
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+// 合同实体
+@Data
+@Accessors(chain = true)
+public class NSContractionEntity extends NSEntityBase
+{
+ private static final long serialVersionUID = 1L;
+
+ /** 合同名称 */
+ private String name;
+
+ /** 签订日期 */
+ private String buildingTime;
+
+}
diff --git a/agentcenter-sdk/src/main/java/com/nsgk/agentcentersdk/entity/NSEntityBase.java b/agentcenter-sdk/src/main/java/com/nsgk/agentcentersdk/entity/NSEntityBase.java
new file mode 100644
index 0000000..1c61528
--- /dev/null
+++ b/agentcenter-sdk/src/main/java/com/nsgk/agentcentersdk/entity/NSEntityBase.java
@@ -0,0 +1,23 @@
+package com.nsgk.agentcentersdk.entity;
+
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+
+// 基本实体
+@Data
+@Accessors(chain = true)
+public abstract class NSEntityBase implements Serializable
+{
+ private static final long serialVersionUID = 1L;
+
+ /** 账套ID */
+ protected Long bookId;
+
+ /** 部门id */
+ protected Long deptId;
+
+ /** 外部ID */
+ private Long outId;
+}
diff --git a/agentcenter-sdk/src/main/java/com/nsgk/agentcentersdk/network/NSNetworkManager.java b/agentcenter-sdk/src/main/java/com/nsgk/agentcentersdk/network/NSNetworkManager.java
new file mode 100644
index 0000000..5d61045
--- /dev/null
+++ b/agentcenter-sdk/src/main/java/com/nsgk/agentcentersdk/network/NSNetworkManager.java
@@ -0,0 +1,34 @@
+package com.nsgk.agentcentersdk.network;
+
+import cn.hutool.http.HttpRequest;
+import cn.hutool.http.HttpResponse;
+import cn.hutool.http.HttpUtil;
+import cn.hutool.http.Method;
+import com.nsgk.agentcentersdk.utility.NSHttp;
+
+// Http网络
+public final class NSNetworkManager
+{
+ public static NSNetworkResponse Post(NSNetworkRequest req)
+ {
+ HttpRequest network;
+ HttpResponse execute;
+ NSNetworkResponse response;
+
+ network = CreateRequest(NSHttp.BuildUrl(req.getUrl(), req.getQuery()), "post");
+ req.getHeaders().forEach(network::header);
+ network.body(req.getData());
+ execute = network.execute();
+ response = new NSNetworkResponse();
+ response.setData(execute.body());
+ response.setUrl(req.getUrl());
+ execute.headers().forEach(response::AddHeader);
+ response.setStatusCode(execute.getStatus());
+ return response;
+ }
+
+ private static HttpRequest CreateRequest(String url, String method)
+ {
+ return HttpUtil.createRequest(Method.valueOf(method.toUpperCase()), url);
+ }
+}
diff --git a/agentcenter-sdk/src/main/java/com/nsgk/agentcentersdk/network/NSNetworkRequest.java b/agentcenter-sdk/src/main/java/com/nsgk/agentcentersdk/network/NSNetworkRequest.java
new file mode 100644
index 0000000..79c07f8
--- /dev/null
+++ b/agentcenter-sdk/src/main/java/com/nsgk/agentcentersdk/network/NSNetworkRequest.java
@@ -0,0 +1,25 @@
+package com.nsgk.agentcentersdk.network;
+
+import com.nsgk.agentcentersdk.core.NSReportObject;
+import com.nsgk.agentcentersdk.utility.NSCrypto;
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+// Http请求
+@Data
+@Accessors(chain = true)
+public class NSNetworkRequest extends NSNetworkTransport
+{
+ public void WriteDataObject(NSReportObject object, String publicKey)
+ {
+ String dataStr;
+
+ ClearHeaders().AddHeader("sign", object.getSign());
+ ClearQueries().AddQuery("identifier", object.getIdentifier())
+ .AddQuery("protocol", object.getProtocol())
+ .AddQuery("timestamp", object.getTimestamp())
+ ;
+ dataStr = object.getDataStr();
+ setData(NSCrypto.RSAEncrypt(dataStr, publicKey));
+ }
+}
diff --git a/agentcenter-sdk/src/main/java/com/nsgk/agentcentersdk/network/NSNetworkResponse.java b/agentcenter-sdk/src/main/java/com/nsgk/agentcentersdk/network/NSNetworkResponse.java
new file mode 100644
index 0000000..040ef08
--- /dev/null
+++ b/agentcenter-sdk/src/main/java/com/nsgk/agentcentersdk/network/NSNetworkResponse.java
@@ -0,0 +1,19 @@
+package com.nsgk.agentcentersdk.network;
+
+import cn.hutool.http.HttpStatus;
+import com.nsgk.agentcentersdk.core.NSReportObject;
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+// Http响应
+@Data
+@Accessors(chain = true)
+public class NSNetworkResponse extends NSNetworkTransport
+{
+ private Integer statusCode;
+
+ public boolean IsSuccess()
+ {
+ return null != statusCode && statusCode == HttpStatus.HTTP_OK;
+ }
+}
diff --git a/agentcenter-sdk/src/main/java/com/nsgk/agentcentersdk/network/NSNetworkTransport.java b/agentcenter-sdk/src/main/java/com/nsgk/agentcentersdk/network/NSNetworkTransport.java
new file mode 100644
index 0000000..420adfc
--- /dev/null
+++ b/agentcenter-sdk/src/main/java/com/nsgk/agentcentersdk/network/NSNetworkTransport.java
@@ -0,0 +1,62 @@
+package com.nsgk.agentcentersdk.network;
+
+import com.nsgk.agentcentersdk.utility.NSArr;
+import com.nsgk.agentcentersdk.utility.NSStr;
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+import java.util.HashMap;
+import java.util.LinkedHashMap;
+import java.util.Map;
+
+// Http传输
+@Data
+@Accessors(chain = true)
+public class NSNetworkTransport
+{
+ private String url;
+ private final Map headers = new LinkedHashMap<>();
+ private final Map query = new LinkedHashMap<>();
+ private String data;
+
+ public NSNetworkTransport() {}
+
+ public NSNetworkTransport(String url)
+ {
+ this.url = url;
+ }
+
+ public NSNetworkTransport ClearHeaders()
+ {
+ headers.clear();
+ return this;
+ }
+
+ public NSNetworkTransport AddHeader(String name, Object value)
+ {
+ headers.put(name, NSStr.ToString(value));
+ return this;
+ }
+
+ public String Header(String name, String...value)
+ {
+ return headers.getOrDefault(name, NSArr.DefParms(value));
+ }
+
+ public NSNetworkTransport ClearQueries()
+ {
+ query.clear();
+ return this;
+ }
+
+ public NSNetworkTransport AddQuery(String name, Object value)
+ {
+ query.put(name, value);
+ return this;
+ }
+
+ public Object Query(String name, Object...value)
+ {
+ return query.getOrDefault(name, NSArr.DefParms(value));
+ }
+}
diff --git a/agentcenter-sdk/src/main/java/com/nsgk/agentcentersdk/utility/NSArr.java b/agentcenter-sdk/src/main/java/com/nsgk/agentcentersdk/utility/NSArr.java
new file mode 100644
index 0000000..4ee0415
--- /dev/null
+++ b/agentcenter-sdk/src/main/java/com/nsgk/agentcentersdk/utility/NSArr.java
@@ -0,0 +1,14 @@
+package com.nsgk.agentcentersdk.utility;
+
+// 数组工具
+public final class NSArr
+{
+ public static T DefParms(T...args)
+ {
+ if(null == args || args.length == 0)
+ return null;
+ return args[0];
+ }
+
+ private NSArr() {}
+}
diff --git a/agentcenter-sdk/src/main/java/com/nsgk/agentcentersdk/utility/NSConv.java b/agentcenter-sdk/src/main/java/com/nsgk/agentcentersdk/utility/NSConv.java
new file mode 100644
index 0000000..ce012ba
--- /dev/null
+++ b/agentcenter-sdk/src/main/java/com/nsgk/agentcentersdk/utility/NSConv.java
@@ -0,0 +1,17 @@
+package com.nsgk.agentcentersdk.utility;
+
+// 转换工具
+public final class NSConv
+{
+ public static boolean FALSE(Boolean b)
+ {
+ return null != b ? b : false;
+ }
+
+ public static boolean TRUE(Boolean b)
+ {
+ return null != b ? b : true;
+ }
+
+ private NSConv() {}
+}
diff --git a/agentcenter-sdk/src/main/java/com/nsgk/agentcentersdk/utility/NSCrypto.java b/agentcenter-sdk/src/main/java/com/nsgk/agentcentersdk/utility/NSCrypto.java
new file mode 100644
index 0000000..ba63146
--- /dev/null
+++ b/agentcenter-sdk/src/main/java/com/nsgk/agentcentersdk/utility/NSCrypto.java
@@ -0,0 +1,37 @@
+package com.nsgk.agentcentersdk.utility;
+
+import cn.hutool.core.codec.Base64;
+import cn.hutool.core.util.StrUtil;
+import cn.hutool.crypto.SecureUtil;
+import cn.hutool.crypto.asymmetric.KeyType;
+import cn.hutool.crypto.asymmetric.RSA;
+
+import java.nio.charset.StandardCharsets;
+
+// 加密工具
+public final class NSCrypto
+{
+ // RSA公钥加密(客户端) raw -> base64
+ public static String RSAEncrypt(String rawData, String publicKey_base64)
+ {
+ RSA rsa;
+
+ if(NSStr.IsEmpty(rawData) || NSStr.IsEmpty(publicKey_base64))
+ return "";
+ rsa = SecureUtil.rsa(null, publicKey_base64);
+ return rsa.encryptBase64(rawData, KeyType.PublicKey);
+ }
+
+ // RSA私钥解密(服务端) base64 -> raw
+ public static String RSADecrypt(String encryptBase64Data, String privateKey_base64)
+ {
+ RSA rsa;
+
+ if(NSStr.IsEmpty(encryptBase64Data) || NSStr.IsEmpty(privateKey_base64))
+ return "";
+ rsa = SecureUtil.rsa(privateKey_base64, null);
+ return StrUtil.str(rsa.decrypt(Base64.decode(encryptBase64Data), KeyType.PrivateKey), StandardCharsets.UTF_8);
+ }
+
+ private NSCrypto() {}
+}
diff --git a/agentcenter-sdk/src/main/java/com/nsgk/agentcentersdk/utility/NSHttp.java b/agentcenter-sdk/src/main/java/com/nsgk/agentcentersdk/utility/NSHttp.java
new file mode 100644
index 0000000..0ccb558
--- /dev/null
+++ b/agentcenter-sdk/src/main/java/com/nsgk/agentcentersdk/utility/NSHttp.java
@@ -0,0 +1,61 @@
+package com.nsgk.agentcentersdk.utility;
+
+import cn.hutool.core.collection.CollectionUtil;
+import cn.hutool.core.io.IoUtil;
+import cn.hutool.core.net.url.UrlQuery;
+import cn.hutool.core.util.URLUtil;
+
+import javax.servlet.ServletInputStream;
+import javax.servlet.http.HttpServletRequest;
+import java.io.BufferedReader;
+import java.nio.charset.StandardCharsets;
+import java.util.LinkedHashMap;
+import java.util.Map;
+
+// Http工具
+public final class NSHttp
+{
+ public static Map ParseQuery(String str)
+ {
+ Map map;
+ Map queryMap;
+
+ map = new LinkedHashMap<>();
+ if(NSStr.IsEmpty(str))
+ return map;
+
+ queryMap = UrlQuery.of(str, StandardCharsets.UTF_8).getQueryMap();
+ queryMap.forEach((k, v) -> map.put(k.toString(), NSStr.ToString(v)));
+ return map;
+ }
+
+ public static String GetRequestBody(HttpServletRequest request)
+ {
+ ServletInputStream reader;
+
+ reader = null;
+ try
+ {
+ reader = request.getInputStream();
+ return IoUtil.read(reader, StandardCharsets.UTF_8);
+ }
+ catch(Exception e)
+ {
+ e.printStackTrace();
+ return "";
+ }
+ finally
+ {
+ IoUtil.close(reader);
+ }
+ }
+
+ public static String BuildUrl(String url, Map query)
+ {
+ if(CollectionUtil.isEmpty(query))
+ return url;
+ return url + "?" + URLUtil.buildQuery(query, StandardCharsets.UTF_8);
+ }
+
+ private NSHttp() {}
+}
diff --git a/agentcenter-sdk/src/main/java/com/nsgk/agentcentersdk/utility/NSSignTool.java b/agentcenter-sdk/src/main/java/com/nsgk/agentcentersdk/utility/NSSignTool.java
new file mode 100644
index 0000000..3b4b3a0
--- /dev/null
+++ b/agentcenter-sdk/src/main/java/com/nsgk/agentcentersdk/utility/NSSignTool.java
@@ -0,0 +1,37 @@
+package com.nsgk.agentcentersdk.utility;
+
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.crypto.SecureUtil;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+// 签名工具
+public final class NSSignTool
+{
+ public static String Sign(Object object, String...signFields)
+ {
+ return Sign(BeanUtil.beanToMap(object), signFields);
+ }
+
+ public static String Sign(Map map, String...signFields)
+ {
+ List fields;
+ StringBuilder sb;
+
+ fields = Arrays.stream(signFields).sorted(String::compareTo).collect(Collectors.toList());
+ sb = new StringBuilder();
+ for(int i = 0; i < fields.size(); i++)
+ {//dataLength=69&identifier=test&protocol=1×tamp=1683442648774
+ if(i > 0)
+ sb.append("&");
+ String key = fields.get(i);
+ sb.append(fields.get(i)).append("=").append(map.getOrDefault(key, ""));
+ }
+ return SecureUtil.md5(sb.toString());
+ }
+
+ private NSSignTool() {}
+}
diff --git a/agentcenter-sdk/src/main/java/com/nsgk/agentcentersdk/utility/NSStr.java b/agentcenter-sdk/src/main/java/com/nsgk/agentcentersdk/utility/NSStr.java
new file mode 100644
index 0000000..c6e83d4
--- /dev/null
+++ b/agentcenter-sdk/src/main/java/com/nsgk/agentcentersdk/utility/NSStr.java
@@ -0,0 +1,29 @@
+package com.nsgk.agentcentersdk.utility;
+
+// 字符串工具
+public final class NSStr
+{
+ public static boolean IsEmpty(String str)
+ {
+ if(null == str || str.isEmpty())
+ return true;
+ return str.trim().isEmpty();
+ }
+
+ public static boolean IsNotEmpty(String str)
+ {
+ return !IsEmpty(str);
+ }
+
+ public static String ToString(Object obj)
+ {
+ return null != obj ? obj.toString() : "";
+ }
+
+ public static int Length(String str)
+ {
+ return null != str ? str.length() : 0;
+ }
+
+ private NSStr() {}
+}
diff --git a/pom.xml b/pom.xml
index 959b969..d940d59 100644
--- a/pom.xml
+++ b/pom.xml
@@ -33,6 +33,8 @@
1.16.18
5.5.4
+ 31.1-jre
+ 1.0.0nsgk1
@@ -194,6 +196,18 @@
${ruoyi.version}
+
+ com.google.guava
+ guava
+ ${guava.version}
+
+
+
+ com.nsgk
+ agentcenter-sdk
+ ${agentcentersdk.version}
+
+
@@ -218,6 +232,14 @@
cn.hutool
hutool-all
+
+ com.google.guava
+ guava
+
+
+ com.nsgk
+ agentcenter-sdk
+
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/RuoYiApplication.java b/ruoyi-admin/src/main/java/com/ruoyi/RuoYiApplication.java
index 32eb6f1..5ff3adb 100644
--- a/ruoyi-admin/src/main/java/com/ruoyi/RuoYiApplication.java
+++ b/ruoyi-admin/src/main/java/com/ruoyi/RuoYiApplication.java
@@ -17,14 +17,16 @@ public class RuoYiApplication
// System.setProperty("spring.devtools.restart.enabled", "false");
SpringApplication.run(RuoYiApplication.class, args);
System.out.println("(♥◠‿◠)ノ゙ 若依启动成功 ლ(´ڡ`ლ)゙ \n" +
- " .-------. ____ __ \n" +
- " | _ _ \\ \\ \\ / / \n" +
- " | ( ' ) | \\ _. / ' \n" +
- " |(_ o _) / _( )_ .' \n" +
- " | (_,_).' __ ___(_ o _)' \n" +
- " | |\\ \\ | || |(_,_)' \n" +
- " | | \\ `' /| `-' / \n" +
- " | | \\ / \\ / \n" +
- " ''-' `'-' `-..-' ");
+ "\n" +
+ "__/\\\\\\\\\\_____/\\\\\\______________/\\\\\\\\\\\\\\\\\\\\\\________________/\\\\\\\\\\\\\\\\\\\\\\\\___________/\\\\\\________/\\\\\\_ \n" +
+ " _\\/\\\\\\\\\\\\___\\/\\\\\\____________/\\\\\\/////////\\\\\\____________/\\\\\\//////////___________\\/\\\\\\_____/\\\\\\//__ \n" +
+ " _\\/\\\\\\/\\\\\\__\\/\\\\\\___________\\//\\\\\\______\\///____________/\\\\\\______________________\\/\\\\\\__/\\\\\\//_____ \n" +
+ " _\\/\\\\\\//\\\\\\_\\/\\\\\\____________\\////\\\\\\__________________\\/\\\\\\____/\\\\\\\\\\\\\\__________\\/\\\\\\\\\\\\//\\\\\\_____ \n" +
+ " _\\/\\\\\\\\//\\\\\\\\/\\\\\\_______________\\////\\\\\\_______________\\/\\\\\\___\\/////\\\\\\__________\\/\\\\\\//_\\//\\\\\\____ \n" +
+ " _\\/\\\\\\_\\//\\\\\\/\\\\\\__________________\\////\\\\\\____________\\/\\\\\\_______\\/\\\\\\__________\\/\\\\\\____\\//\\\\\\___ \n" +
+ " _\\/\\\\\\__\\//\\\\\\\\\\\\___________/\\\\\\______\\//\\\\\\___________\\/\\\\\\_______\\/\\\\\\__________\\/\\\\\\_____\\//\\\\\\__ \n" +
+ " _\\/\\\\\\___\\//\\\\\\\\\\__________\\///\\\\\\\\\\\\\\\\\\\\\\/____________\\//\\\\\\\\\\\\\\\\\\\\\\\\/___________\\/\\\\\\______\\//\\\\\\_ \n" +
+ " _\\///_____\\/////_____________\\///////////_______________\\////////////_____________\\///________\\///__\n"
+ );
}
}
diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/agentcenter/AgentCenterController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/agentcenter/AgentCenterController.java
new file mode 100644
index 0000000..09d4624
--- /dev/null
+++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/agentcenter/AgentCenterController.java
@@ -0,0 +1,50 @@
+package com.ruoyi.web.controller.agentcenter;
+
+import com.nsgk.agentcentersdk.api.NSApiResult;
+import com.nsgk.agentcentersdk.api.NSSDK;
+import com.nsgk.agentcentersdk.api.NSSDKServer;
+import com.nsgk.agentcentersdk.core.NSReportObject;
+import com.nsgk.agentcentersdk.entity.NSContractionEntity;
+import com.ruoyi.common.config.RuoYiConfig;
+import com.ruoyi.common.core.controller.BaseController;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.servlet.http.HttpServletRequest;
+
+/**
+ * 上报接口Controller
+ *
+ * @author zhao
+ */
+@RestController
+@RequestMapping("/agentcenter/api")
+public class AgentCenterController extends BaseController
+{
+ @PostMapping("/test")
+ public NSApiResult test(HttpServletRequest request)
+ {
+ NSSDKServer server;
+ NSReportObject recv;
+
+ NSSDK.InitServer(RuoYiConfig.Secret.privateKey);
+ server = NSSDK.InstanceServer();
+ recv = server.Recv(request, NSContractionEntity.class);
+
+ return server.Resp(200, "测试成功", recv.getDataStr());
+ }
+
+ @PostMapping("/report")
+ public NSApiResult report(HttpServletRequest request)
+ {
+ NSSDKServer server;
+ NSReportObject recv;
+
+ NSSDK.InitServer(RuoYiConfig.Secret.privateKey);
+ server = NSSDK.InstanceServer();
+ recv = server.Recv(request, NSContractionEntity.class);
+
+ return server.Resp(200, "上报成功", recv.getDataStr());
+ }
+}
diff --git a/ruoyi-admin/src/main/resources/application.yml b/ruoyi-admin/src/main/resources/application.yml
index 411383f..9b6bd2c 100644
--- a/ruoyi-admin/src/main/resources/application.yml
+++ b/ruoyi-admin/src/main/resources/application.yml
@@ -129,3 +129,11 @@ xss:
excludes: /system/notice
# 匹配链接
urlPatterns: /system/*,/monitor/*,/tool/*
+
+
+secret:
+ disabled: false # UNUSED
+ # 客户端公钥
+ publicKey: MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAKoR8mX0rGKLqzcWmOzbfj64K8ZIgOdHnzkXSOVOZbFu/TJhZ7rFAN+eaGkl3C4buccQd/EjEsj9ir7ijT7h96MCAwEAAQ==
+ # 服务端私钥
+ privateKey: MIIBVAIBADANBgkqhkiG9w0BAQEFAASCAT4wggE6AgEAAkEAqhHyZfSsYourNxaY7Nt+PrgrxkiA50efORdI5U5lsW79MmFnusUA355oaSXcLhu5xxB38SMSyP2KvuKNPuH3owIDAQABAkAfoiLyL+Z4lf4Myxk6xUDgLaWGximj20CUf+5BKKnlrK+Ed8gAkM0HqoTt2UZwA5E2MzS4EI2gjfQhz5X28uqxAiEA3wNFxfrCZlSZHb0gn2zDpWowcSxQAgiCstxGUoOqlW8CIQDDOerGKH5OmCJ4Z21v+F25WaHYPxCFMvwxpcw99EcvDQIgIdhDTIqD2jfYjPTY8Jj3EDGPbH2HHuffvflECt3Ek60CIQCFRlCkHpi7hthhYhovyloRYsM+IS9h/0BzlEAuO0ktMQIgSPT3aFAgJYwKpqRYKlLDVcflZFCKY7u3UP8iWi1Qw0Y=
\ No newline at end of file
diff --git a/ruoyi-agentcenter/pom.xml b/ruoyi-agentcenter/pom.xml
index c86d850..429385a 100644
--- a/ruoyi-agentcenter/pom.xml
+++ b/ruoyi-agentcenter/pom.xml
@@ -22,6 +22,10 @@
com.ruoyi
ruoyi-common
+
+ com.ruoyi
+ ruoyi-common
+
diff --git a/ruoyi-agentcenter/src/main/java/com/ruoyi/agentcenter/listener/TestListener.java b/ruoyi-agentcenter/src/main/java/com/ruoyi/agentcenter/listener/TestListener.java
new file mode 100644
index 0000000..7fa25a3
--- /dev/null
+++ b/ruoyi-agentcenter/src/main/java/com/ruoyi/agentcenter/listener/TestListener.java
@@ -0,0 +1,26 @@
+package com.ruoyi.agentcenter.listener;
+
+import com.google.common.eventbus.AllowConcurrentEvents;
+import com.google.common.eventbus.Subscribe;
+import com.ruoyi.common.object.Message;
+import com.ruoyi.common.utils.EventBusEngine;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.PostConstruct;
+
+@Component
+public class TestListener
+{
+ @PostConstruct
+ public void init()
+ {
+ EventBusEngine.Register(this);
+ }
+
+ @Subscribe
+ //@AllowConcurrentEvents
+ public void handle(Message msg)
+ {
+ System.err.println("LLL " + msg.data + " " + Thread.currentThread().getId());
+ }
+}
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/config/RuoYiConfig.java b/ruoyi-common/src/main/java/com/ruoyi/common/config/RuoYiConfig.java
index 00f70f6..af36816 100644
--- a/ruoyi-common/src/main/java/com/ruoyi/common/config/RuoYiConfig.java
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/config/RuoYiConfig.java
@@ -3,6 +3,8 @@ package com.ruoyi.common.config;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
+import java.nio.charset.StandardCharsets;
+
/**
* 读取项目相关配置
*
@@ -132,4 +134,29 @@ public class RuoYiConfig
{
return getProfile() + "/upload";
}
+
+
+ @Component
+ @ConfigurationProperties(prefix = "secret")
+ public static class Secret {
+ public static Boolean disabled;
+ public static String publicKey;
+ public static String privateKey;
+
+ public void setDisabled(Boolean disabled) {
+ Secret.disabled = disabled;
+ }
+
+ public void setPublicKey(String publicKey) {
+ Secret.publicKey = publicKey;
+ }
+
+ public void setPrivateKey(String privateKey) {
+ Secret.privateKey = privateKey;
+ }
+
+ public static boolean isDisabled() {
+ return null != Secret.disabled /*默认加密*/ && Secret.disabled;
+ }
+ }
}
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/object/Message.java b/ruoyi-common/src/main/java/com/ruoyi/common/object/Message.java
new file mode 100644
index 0000000..3654714
--- /dev/null
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/object/Message.java
@@ -0,0 +1,14 @@
+package com.ruoyi.common.object;
+
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+@Data
+@Accessors(chain = true)
+public final class Message
+{
+ public static final int PROTOCOL_INVALID = 0;
+
+ public int protocol = PROTOCOL_INVALID;
+ public Object data;
+}
diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/EventBusEngine.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/EventBusEngine.java
new file mode 100644
index 0000000..77e33bb
--- /dev/null
+++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/EventBusEngine.java
@@ -0,0 +1,71 @@
+package com.ruoyi.common.utils;
+
+import com.google.common.eventbus.EventBus;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.PreDestroy;
+import java.util.ArrayList;
+import java.util.List;
+
+@Component
+public final class EventBusEngine
+{
+ private static final Logger logger = LoggerFactory.getLogger("EventBusEngine" );
+ private static EventBus _eventBus;
+ private static final List