@@ -1,97 +1,10 @@ | |||
<p align="center"> | |||
<img alt="logo" src="https://oscimg.oschina.net/oscnet/up-d3d0a9303e11d522a06cd263f3079027715.png"> | |||
</p> | |||
<h1 align="center" style="margin: 30px 0 30px; font-weight: bold;">RuoYi v3.8.5</h1> | |||
<h4 align="center">基于SpringBoot+Vue前后端分离的Java快速开发框架</h4> | |||
<p align="center"> | |||
<a href="https://gitee.com/y_project/RuoYi-Vue/stargazers"><img src="https://gitee.com/y_project/RuoYi-Vue/badge/star.svg?theme=dark"></a> | |||
<a href="https://gitee.com/y_project/RuoYi-Vue"><img src="https://img.shields.io/badge/RuoYi-v3.8.5-brightgreen.svg"></a> | |||
<a href="https://gitee.com/y_project/RuoYi-Vue/blob/master/LICENSE"><img src="https://img.shields.io/github/license/mashape/apistatus.svg"></a> | |||
</p> | |||
## 代理中心 | |||
### NSGK@2023 | |||
## 平台简介 | |||
#### RuoYi v3.8.5 | |||
若依是一套全部开源的快速开发平台,毫无保留给个人及企业免费使用。 | |||
> [打包脚本](bin/package.bat ':include') | |||
* 前端采用Vue、Element UI。 | |||
* 后端采用Spring Boot、Spring Security、Redis & Jwt。 | |||
* 权限认证使用Jwt,支持多终端认证系统。 | |||
* 支持加载动态权限菜单,多方式轻松权限控制。 | |||
* 高效率开发,使用代码生成器可以一键生成前后端代码。 | |||
* 提供了技术栈([Vue3](https://v3.cn.vuejs.org) [Element Plus](https://element-plus.org/zh-CN) [Vite](https://cn.vitejs.dev))版本[RuoYi-Vue3](https://github.com/yangzongzhuan/RuoYi-Vue3),保持同步更新。 | |||
* 提供了单应用版本[RuoYi-Vue-fast](https://github.com/yangzongzhuan/RuoYi-Vue-fast),Oracle版本[RuoYi-Vue-Oracle](https://github.com/yangzongzhuan/RuoYi-Vue-Oracle),保持同步更新。 | |||
* 不分离版本,请移步[RuoYi](https://gitee.com/y_project/RuoYi),微服务版本,请移步[RuoYi-Cloud](https://gitee.com/y_project/RuoYi-Cloud) | |||
* 特别鸣谢:[element](https://github.com/ElemeFE/element),[vue-element-admin](https://github.com/PanJiaChen/vue-element-admin),[eladmin-web](https://github.com/elunez/eladmin-web)。 | |||
* 阿里云折扣场:[点我进入](http://aly.ruoyi.vip),腾讯云秒杀场:[点我进入](http://txy.ruoyi.vip) | |||
* 阿里云优惠券:[点我领取](https://www.aliyun.com/minisite/goods?userCode=brki8iof&share_source=copy_link),腾讯云优惠券:[点我领取](https://cloud.tencent.com/redirect.php?redirect=1025&cps_key=198c8df2ed259157187173bc7f4f32fd&from=console) | |||
> [SDK打包脚本](agentcenter-sdk/build.bat ':include') | |||
## 内置功能 | |||
1. 用户管理:用户是系统操作者,该功能主要完成系统用户配置。 | |||
2. 部门管理:配置系统组织机构(公司、部门、小组),树结构展现支持数据权限。 | |||
3. 岗位管理:配置系统用户所属担任职务。 | |||
4. 菜单管理:配置系统菜单,操作权限,按钮权限标识等。 | |||
5. 角色管理:角色菜单权限分配、设置角色按机构进行数据范围权限划分。 | |||
6. 字典管理:对系统中经常使用的一些较为固定的数据进行维护。 | |||
7. 参数管理:对系统动态配置常用参数。 | |||
8. 通知公告:系统通知公告信息发布维护。 | |||
9. 操作日志:系统正常操作日志记录和查询;系统异常信息日志记录和查询。 | |||
10. 登录日志:系统登录日志记录查询包含登录异常。 | |||
11. 在线用户:当前系统中活跃用户状态监控。 | |||
12. 定时任务:在线(添加、修改、删除)任务调度包含执行结果日志。 | |||
13. 代码生成:前后端代码的生成(java、html、xml、sql)支持CRUD下载 。 | |||
14. 系统接口:根据业务代码自动生成相关的api接口文档。 | |||
15. 服务监控:监视当前系统CPU、内存、磁盘、堆栈等相关信息。 | |||
16. 缓存监控:对系统的缓存信息查询,命令统计等。 | |||
17. 在线构建器:拖动表单元素生成相应的HTML代码。 | |||
18. 连接池监视:监视当前系统数据库连接池状态,可进行分析SQL找出系统性能瓶颈。 | |||
## 在线体验 | |||
- admin/admin123 | |||
- 陆陆续续收到一些打赏,为了更好的体验已用于演示服务器升级。谢谢各位小伙伴。 | |||
演示地址:http://vue.ruoyi.vip | |||
文档地址:http://doc.ruoyi.vip | |||
## 演示图 | |||
<table> | |||
<tr> | |||
<td><img src="https://oscimg.oschina.net/oscnet/cd1f90be5f2684f4560c9519c0f2a232ee8.jpg"/></td> | |||
<td><img src="https://oscimg.oschina.net/oscnet/1cbcf0e6f257c7d3a063c0e3f2ff989e4b3.jpg"/></td> | |||
</tr> | |||
<tr> | |||
<td><img src="https://oscimg.oschina.net/oscnet/up-8074972883b5ba0622e13246738ebba237a.png"/></td> | |||
<td><img src="https://oscimg.oschina.net/oscnet/up-9f88719cdfca9af2e58b352a20e23d43b12.png"/></td> | |||
</tr> | |||
<tr> | |||
<td><img src="https://oscimg.oschina.net/oscnet/up-39bf2584ec3a529b0d5a3b70d15c9b37646.png"/></td> | |||
<td><img src="https://oscimg.oschina.net/oscnet/up-936ec82d1f4872e1bc980927654b6007307.png"/></td> | |||
</tr> | |||
<tr> | |||
<td><img src="https://oscimg.oschina.net/oscnet/up-b2d62ceb95d2dd9b3fbe157bb70d26001e9.png"/></td> | |||
<td><img src="https://oscimg.oschina.net/oscnet/up-d67451d308b7a79ad6819723396f7c3d77a.png"/></td> | |||
</tr> | |||
<tr> | |||
<td><img src="https://oscimg.oschina.net/oscnet/5e8c387724954459291aafd5eb52b456f53.jpg"/></td> | |||
<td><img src="https://oscimg.oschina.net/oscnet/644e78da53c2e92a95dfda4f76e6d117c4b.jpg"/></td> | |||
</tr> | |||
<tr> | |||
<td><img src="https://oscimg.oschina.net/oscnet/up-8370a0d02977eebf6dbf854c8450293c937.png"/></td> | |||
<td><img src="https://oscimg.oschina.net/oscnet/up-49003ed83f60f633e7153609a53a2b644f7.png"/></td> | |||
</tr> | |||
<tr> | |||
<td><img src="https://oscimg.oschina.net/oscnet/up-d4fe726319ece268d4746602c39cffc0621.png"/></td> | |||
<td><img src="https://oscimg.oschina.net/oscnet/up-c195234bbcd30be6927f037a6755e6ab69c.png"/></td> | |||
</tr> | |||
<tr> | |||
<td><img src="https://oscimg.oschina.net/oscnet/b6115bc8c31de52951982e509930b20684a.jpg"/></td> | |||
<td><img src="https://oscimg.oschina.net/oscnet/up-5e4daac0bb59612c5038448acbcef235e3a.png"/></td> | |||
</tr> | |||
</table> | |||
## 若依前后端分离交流群 | |||
QQ群: [](https://jq.qq.com/?_wv=1027&k=5bVB1og) [](https://jq.qq.com/?_wv=1027&k=5eiA4DH) [](https://jq.qq.com/?_wv=1027&k=5AxMKlC) [](https://jq.qq.com/?_wv=1027&k=51G72yr) [](https://jq.qq.com/?_wv=1027&k=VvjN2nvu) [](https://jq.qq.com/?_wv=1027&k=5vYAqA05) [](https://jq.qq.com/?_wv=1027&k=kOIINEb5) [](https://jq.qq.com/?_wv=1027&k=UKtX5jhs) [](https://jq.qq.com/?_wv=1027&k=EI9an8lJ) [](https://jq.qq.com/?_wv=1027&k=SWCtLnMz) [](https://jq.qq.com/?_wv=1027&k=96Dkdq0k) [](https://jq.qq.com/?_wv=1027&k=0fsNiYZt) [](https://jq.qq.com/?_wv=1027&k=7xw4xUG1) [](https://jq.qq.com/?_wv=1027&k=eCx8eyoJ) 点击按钮入群。 | |||
> 客户端手动导入: ```mvn install:install-file -Dfile=agentcenter-sdk-1.0.0nsgk1.jar -DgroupId=com.nsgk -DartifactId=agentcenter-sdk -Dversion=1.0.0nsgk1 -Dpackaging=jar``` |
@@ -0,0 +1,14 @@ | |||
@echo off | |||
echo. | |||
echo Build NSGK-agentcenter-SDK | |||
echo. | |||
%~d0 | |||
cd %~dp0 | |||
call mvn clean package -Dmaven.test.skip=true | |||
echo Open folder | |||
start "" %cd%\target | |||
pause |
@@ -9,7 +9,9 @@ | |||
<version>1.0.0nsgk1</version> | |||
<packaging>jar</packaging> | |||
<name>NSGK agentcenter-sdk</name> | |||
<description>NS代理中心SDK</description> | |||
<url>https://www.nongshen.net</url> | |||
<properties> | |||
<lombok.version>1.16.18</lombok.version> | |||
@@ -11,8 +11,8 @@ public final class NSMain | |||
{ | |||
public static void main(String[] args) throws Exception | |||
{ | |||
//Test(); | |||
Test_reflect(); | |||
Test(); | |||
//Test_reflect(); | |||
} | |||
public static void Test_reflect() throws InstantiationException, IllegalAccessException | |||
@@ -43,7 +43,7 @@ public final class NSMain | |||
NSContractionEntity entity; | |||
NSApiResult result; | |||
NSSDK.InitClient("http://localhost", (short) 8081, "test", "MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAKoR8mX0rGKLqzcWmOzbfj64K8ZIgOdHnzkXSOVOZbFu/TJhZ7rFAN+eaGkl3C4buccQd/EjEsj9ir7ijT7h96MCAwEAAQ=="); | |||
NSSDK.InitClient("http://localhost", (short) 8081, "test", "MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAKoR8mX0rGKLqzcWmOzbfj64K8ZIgOdHnzkXSOVOZbFu/TJhZ7rFAN+eaGkl3C4buccQd/EjEsj9ir7ijT7h96MCAwEAAQ==", 0); | |||
client = NSSDK.InstanceClient(); | |||
entity = new NSContractionEntity(); | |||
@@ -53,6 +53,7 @@ public final class NSMain | |||
.setBookId(166L) | |||
.setOutId(999L) | |||
; | |||
entity.Set("buildingTime", "2000-12-23"); | |||
result = client.Send(NSProtocol.NS_PROTOCOL_CONTRACTION, entity); | |||
System.err.println(result); | |||
} | |||
@@ -9,14 +9,15 @@ public final class NSSDK | |||
private static final ThreadLocal<String> _host = new ThreadLocal<>(); | |||
private static final ThreadLocal<Short> _port = new ThreadLocal<>(); | |||
private static final ThreadLocal<String> _identifier = new ThreadLocal<>(); | |||
private static final ThreadLocal<Boolean> _clientInit = new ThreadLocal<>(); | |||
private static final ThreadLocal<String> _publicKey = new ThreadLocal<>(); | |||
private static final ThreadLocal<Integer> _timeout = new ThreadLocal<>(); | |||
private static final ThreadLocal<Boolean> _clientInit = new ThreadLocal<>(); | |||
// server | |||
private static final ThreadLocal<String> _privateKey = new ThreadLocal<>(); | |||
private static final ThreadLocal<Boolean> _serverInit = new ThreadLocal<>(); | |||
public static boolean InitClient(String host, short port, String identifier, String publicKey) | |||
public static boolean InitClient(String host, short port, String identifier, String publicKey, int timeout) | |||
{ | |||
if(NSConv.FALSE(_clientInit.get())) | |||
return false; | |||
@@ -24,6 +25,7 @@ public final class NSSDK | |||
_port.set(port); | |||
_identifier.set(identifier); | |||
_publicKey.set(publicKey); | |||
_timeout.set(timeout); | |||
_clientInit.set(true); | |||
return true; | |||
} | |||
@@ -36,6 +38,7 @@ public final class NSSDK | |||
_port.remove(); | |||
_identifier.remove(); | |||
_publicKey.remove(); | |||
_timeout.set(0); | |||
_clientInit.set(false); | |||
return true; | |||
} | |||
@@ -59,7 +62,7 @@ public final class NSSDK | |||
{ | |||
if(!NSConv.FALSE(_clientInit.get())) | |||
return null; | |||
return new NSSDKClient(_host.get(), _port.get(), _identifier.get(), _publicKey.get()); | |||
return new NSSDKClient(_host.get(), _port.get(), _identifier.get(), _publicKey.get(), _timeout.get()); | |||
} | |||
@@ -11,9 +11,8 @@ import com.nsgk.agentcentersdk.network.NSNetworkManager; | |||
import com.nsgk.agentcentersdk.network.NSNetworkRequest; | |||
import com.nsgk.agentcentersdk.network.NSNetworkResponse; | |||
import com.nsgk.agentcentersdk.utility.NSCrypto; | |||
import com.nsgk.agentcentersdk.utility.NSStr; | |||
import java.util.Objects; | |||
import lombok.Data; | |||
import lombok.experimental.Accessors; | |||
// SDK客户端 | |||
/* | |||
@@ -28,19 +27,23 @@ import java.util.Objects; | |||
timestamp: | |||
data: "" // 加密json | |||
*/ | |||
@Data | |||
@Accessors(chain = true) | |||
public final class NSSDKClient | |||
{ | |||
private final String host; | |||
private final short port; | |||
private final String identifier; | |||
private final String publicKey; | |||
private int timeout; | |||
NSSDKClient(String host, short port, String identifier, String publicKey) | |||
NSSDKClient(String host, short port, String identifier, String publicKey, int timeout) | |||
{ | |||
this.host = host; | |||
this.port = port; | |||
this.identifier = identifier; | |||
this.publicKey = publicKey; | |||
this.timeout = timeout; | |||
} | |||
// 发送请求 | |||
@@ -57,6 +60,7 @@ public final class NSSDKClient | |||
reportObject = new NSReportObject<>(identifier, protocol, object); | |||
request = new NSNetworkRequest(); | |||
request.setUrl(BuildUrl(url)); | |||
request.setTimeout(timeout); | |||
WriteDataObject(request, reportObject); | |||
NSNetworkResponse response = NSNetworkManager.Post(request); | |||
NSErrGlobal.ASSERT(response.IsSuccess(), NSErrno.ERRNO_SYS_HTTP); | |||
@@ -15,5 +15,4 @@ public class NSContractionEntity extends NSEntityBase | |||
/** 签订日期 */ | |||
private String buildingTime; | |||
} |
@@ -1,17 +1,21 @@ | |||
package com.nsgk.agentcentersdk.entity; | |||
import com.nsgk.agentcentersdk.err.NSErrGlobal; | |||
import com.nsgk.agentcentersdk.err.NSErrno; | |||
import com.nsgk.agentcentersdk.utility.NSArr; | |||
import com.nsgk.agentcentersdk.utility.NSReflect; | |||
import lombok.Data; | |||
import lombok.experimental.Accessors; | |||
import java.io.Serializable; | |||
import java.lang.reflect.Field; | |||
import java.util.LinkedHashMap; | |||
import java.util.Map; | |||
// 基本实体 | |||
@Data | |||
@Accessors(chain = true) | |||
public abstract class NSEntityBase implements Serializable | |||
public class NSEntityBase implements Serializable | |||
{ | |||
private static final long serialVersionUID = 1L; | |||
@@ -65,4 +69,48 @@ public abstract class NSEntityBase implements Serializable | |||
return def; | |||
return (T)parms.getOrDefault(name, def); | |||
} | |||
// Set函数为了兼容SDK | |||
// 不检查类型 | |||
public <T> boolean Set(String name, T val) | |||
{ | |||
Field field; | |||
try | |||
{ | |||
field = NSReflect.FindField(getClass(), name); | |||
if(null != field) | |||
{ | |||
if(!field.isAccessible()) | |||
field.setAccessible(true); | |||
field.set(this, val); | |||
return true; | |||
} | |||
} | |||
catch(Exception e) | |||
{ | |||
e.printStackTrace(); | |||
} | |||
return NSErrGlobal.ThrowAndReturn(NSErrno.ERRNO_SYS_INVALID_FIELD, false); | |||
} | |||
// 检查类型 | |||
public boolean Set_s(String name, Object val) | |||
{ | |||
Field field; | |||
try | |||
{ | |||
field = getClass().getField(name); | |||
if(field.getType().isAssignableFrom(val.getClass())) | |||
{ | |||
return Set(name, val); | |||
} | |||
} | |||
catch(Exception e) | |||
{ | |||
e.printStackTrace(); | |||
} | |||
return NSErrGlobal.ThrowAndReturn(NSErrno.ERRNO_SYS_INVALID_FIELD, false); | |||
} | |||
} |
@@ -13,6 +13,7 @@ public final class NSErrno | |||
public static final int ERRNO_SYS_INVALID_PROTOCOL = 0x01004; | |||
public static final int ERRNO_SYS_SIGN_FAIL = 0x01005; | |||
public static final int ERRNO_SYS_HTTP = 0x01006; | |||
public static final int ERRNO_SYS_INVALID_FIELD = 0x01007; | |||
public static final int ERRNO_CLI_PARAMETER_MISSING = 0x03001; | |||
public static final int ERRNO_CLI_DATA_MISSING = 0x03002; | |||
@@ -32,6 +33,7 @@ public final class NSErrno | |||
case ERRNO_SYS_INVALID_PROTOCOL: return "无效协议"; | |||
case ERRNO_SYS_SIGN_FAIL: return "签名失败"; | |||
case ERRNO_SYS_HTTP: return "Http请求错误"; | |||
case ERRNO_SYS_INVALID_FIELD: return "无效字段"; | |||
case ERRNO_CLI_PARAMETER_MISSING: return "参数缺失"; | |||
case ERRNO_CLI_DATA_MISSING: return "数据缺失"; | |||
@@ -18,6 +18,8 @@ public final class NSNetworkManager | |||
network = CreateRequest(NSHttp.BuildUrl(req.getUrl(), req.getQuery()), "post"); | |||
req.getHeaders().forEach(network::header); | |||
network.body(req.getData()); | |||
network.setConnectionTimeout(req.getTimeout()); | |||
network.setReadTimeout(req.getTimeout()); | |||
execute = network.execute(); | |||
response = new NSNetworkResponse(); | |||
response.setData(execute.body()); | |||
@@ -10,4 +10,5 @@ import lombok.experimental.Accessors; | |||
@Accessors(chain = true) | |||
public class NSNetworkRequest extends NSNetworkTransport | |||
{ | |||
private int timeout = 0; | |||
} |
@@ -11,7 +11,7 @@ import java.util.Map; | |||
// Http传输 | |||
@Data | |||
@Accessors(chain = true) | |||
public class NSNetworkTransport | |||
public abstract class NSNetworkTransport | |||
{ | |||
private String url; | |||
private final Map<String, String> headers = new LinkedHashMap<>(); | |||
@@ -1,8 +1,11 @@ | |||
package com.nsgk.agentcentersdk.utility; | |||
import java.lang.reflect.Field; | |||
import java.lang.reflect.Method; | |||
import java.util.ArrayList; | |||
import java.util.Arrays; | |||
import java.util.List; | |||
import java.util.Optional; | |||
// 反射工具 | |||
public final class NSReflect | |||
@@ -140,5 +143,59 @@ public final class NSReflect | |||
} | |||
} | |||
// find first: 不检查类型 | |||
public static Field FindField(Class<?> clazz, String name) | |||
{ | |||
Field[] declaredFields; | |||
Optional<Field> first; | |||
Class<?> superclass; | |||
declaredFields = clazz.getDeclaredFields(); | |||
first = Arrays.stream(declaredFields).filter((x) -> x.getName().equals(name)).findFirst(); | |||
if(first.isPresent()) | |||
return first.get(); | |||
superclass = clazz.getSuperclass(); | |||
if(null != superclass) | |||
return FindField(superclass, name); | |||
return null; | |||
} | |||
// find first: 检查类型, 仅匹配 | |||
public static Field FindField_s(Class<?> clazz, String name, Class<?> fieldClazz) | |||
{ | |||
Field[] declaredFields; | |||
Optional<Field> first; | |||
Class<?> superclass; | |||
declaredFields = clazz.getDeclaredFields(); | |||
first = Arrays.stream(declaredFields).filter((x) -> x.getName().equals(name) && x.getType().isAssignableFrom(fieldClazz)).findFirst(); | |||
if(first.isPresent()) | |||
return first.get(); | |||
superclass = clazz.getSuperclass(); | |||
if(null != superclass) | |||
return FindField(superclass, name); | |||
return null; | |||
} | |||
// find first: 检查类型, 严格 | |||
public static Field FindField_ss(Class<?> clazz, String name, Class<?> fieldClazz) | |||
{ | |||
Field[] declaredFields; | |||
Optional<Field> first; | |||
Class<?> superclass; | |||
declaredFields = clazz.getDeclaredFields(); | |||
first = Arrays.stream(declaredFields).filter((x) -> x.getName().equals(name) && x.getType().equals(fieldClazz)).findFirst(); | |||
if(first.isPresent()) | |||
return first.get(); | |||
superclass = clazz.getSuperclass(); | |||
if(null != superclass) | |||
return FindField(superclass, name); | |||
return null; | |||
} | |||
private NSReflect() {} | |||
} |
@@ -1,6 +1,6 @@ | |||
@echo off | |||
echo. | |||
echo [信息] 打包Web工程,生成war/jar包文件。 | |||
echo [锟斤拷息] 锟斤拷锟絎eb锟斤拷锟教o拷锟斤拷锟斤拷war/jar锟斤拷锟侥硷拷锟斤拷 | |||
echo. | |||
%~d0 | |||
@@ -9,4 +9,7 @@ cd %~dp0 | |||
cd .. | |||
call mvn clean package -Dmaven.test.skip=true | |||
echo 锟斤拷目锟斤拷锟侥硷拷锟斤拷 | |||
start "" %cd%\ruoyi-admin\target | |||
pause |
@@ -212,6 +212,7 @@ | |||
</dependencyManagement> | |||
<modules> | |||
<module>agentcenter-sdk</module> | |||
<module>ruoyi-admin</module> | |||
<module>ruoyi-framework</module> | |||
<module>ruoyi-system</module> | |||
@@ -236,10 +237,10 @@ | |||
<groupId>com.google.guava</groupId> | |||
<artifactId>guava</artifactId> | |||
</dependency> | |||
<dependency> | |||
<!--<dependency> | |||
<groupId>com.nsgk</groupId> | |||
<artifactId>agentcenter-sdk</artifactId> | |||
</dependency> | |||
</dependency>--> | |||
</dependencies> | |||
<build> | |||
@@ -8,7 +8,7 @@ | |||
<version>3.8.5</version> | |||
</parent> | |||
<modelVersion>4.0.0</modelVersion> | |||
<packaging>jar</packaging> | |||
<packaging>war</packaging> | |||
<artifactId>ruoyi-admin</artifactId> | |||
<description> | |||
@@ -23,8 +23,8 @@ | |||
<artifactId>ruoyi-common</artifactId> | |||
</dependency> | |||
<dependency> | |||
<groupId>com.ruoyi</groupId> | |||
<artifactId>ruoyi-common</artifactId> | |||
<groupId>com.nsgk</groupId> | |||
<artifactId>agentcenter-sdk</artifactId> | |||
</dependency> | |||
</dependencies> | |||