From bf02865de5e73b11b218686fddd9141e955ed733 Mon Sep 17 00:00:00 2001 From: DELL Date: Mon, 13 Mar 2023 11:56:16 +0800 Subject: [PATCH 01/20] =?UTF-8?q?=E6=9B=B4=E6=96=B0docker=E6=89=93?= =?UTF-8?q?=E5=8C=85=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Dockerfile | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 Dockerfile diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 00000000..6c84d591 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,14 @@ +FROM openjdk:8-jdk-alpine +#同步时间 +RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories && \ + apk update && apk add wget unzip vim && apk add -U tzdata && \ + ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' >/etc/timezone +RUN mkdir -p /root/neutrino-proxy/neutrino-proxy-admin +WORKDIR /root/neutrino-proxy +COPY neutrino-proxy-server/target/neutrino-proxy-server.jar /root/neutrino-proxy/neutrino-proxy-server.jar +COPY neutrino-proxy-admin/dist /root/neutrino-proxy/neutrino-proxy-admin/dist +#VOLUME ["/root/neutrino-proxy"] +ENTRYPOINT ["java","-jar","neutrino-proxy-server.jar"] + +#docker run -it -p 9000-9200:9000-9200/tcp -p 8888:8888 -v /root/neutrino-proxy:/root/neutrino-proxy -d --restart=always --name neutrino neutrino:v1 +#docker run -it -p 9000-9200:9000-9200/tcp -p 8888:8888 -d --name neutrino registry.cn-hangzhou.aliyuncs.com/asgc/aoshiguchen-docker-images:1.64 \ No newline at end of file From 7316d3b1d59fd81f324e71bd4e51d2191b3ae33f Mon Sep 17 00:00:00 2001 From: DELL Date: Mon, 13 Mar 2023 15:57:44 +0800 Subject: [PATCH 02/20] =?UTF-8?q?=E6=9B=B4=E6=96=B0docker=E6=89=93?= =?UTF-8?q?=E5=8C=85=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Dockerfile | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/Dockerfile b/Dockerfile index 6c84d591..533a797c 100644 --- a/Dockerfile +++ b/Dockerfile @@ -3,12 +3,13 @@ FROM openjdk:8-jdk-alpine RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories && \ apk update && apk add wget unzip vim && apk add -U tzdata && \ ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' >/etc/timezone +RUN mkdir -p /root/neutrino-proxy/config RUN mkdir -p /root/neutrino-proxy/neutrino-proxy-admin WORKDIR /root/neutrino-proxy COPY neutrino-proxy-server/target/neutrino-proxy-server.jar /root/neutrino-proxy/neutrino-proxy-server.jar +COPY neutrino-proxy-server/src/main/resources/app.yml /root/neutrino-proxy/config COPY neutrino-proxy-admin/dist /root/neutrino-proxy/neutrino-proxy-admin/dist #VOLUME ["/root/neutrino-proxy"] -ENTRYPOINT ["java","-jar","neutrino-proxy-server.jar"] +ENTRYPOINT ["java","-jar","neutrino-proxy-server.jar","config=./config/app.yml"] -#docker run -it -p 9000-9200:9000-9200/tcp -p 8888:8888 -v /root/neutrino-proxy:/root/neutrino-proxy -d --restart=always --name neutrino neutrino:v1 -#docker run -it -p 9000-9200:9000-9200/tcp -p 8888:8888 -d --name neutrino registry.cn-hangzhou.aliyuncs.com/asgc/aoshiguchen-docker-images:1.64 \ No newline at end of file +#docker run -it -p 9000-9200:9000-9200/tcp -p 8888:8888 -v /root/neutrino-proxy/config:/root/neutrino-proxy/config -d --restart=always --name neutrino registry.cn-hangzhou.aliyuncs.com/asgc/aoshiguchen-docker-images:1.7 \ No newline at end of file From a5a55dc9c171f4afeef806e6d48f358f9c7b3bcb Mon Sep 17 00:00:00 2001 From: aoshiguchen <1052045476@qq.com> Date: Mon, 13 Mar 2023 16:03:52 +0800 Subject: [PATCH 03/20] =?UTF-8?q?=E6=9B=B4=E6=96=B0gitgnore?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 5fb1825a..60a727db 100644 --- a/.gitignore +++ b/.gitignore @@ -50,4 +50,6 @@ hs_err_pid* **/gifs/ **/deploy/ -**/app-**.yml \ No newline at end of file +**/app-**.yml + +**/memo/** \ No newline at end of file From 69e5fb10d8a40380a41a7711409fa950fbd3957b Mon Sep 17 00:00:00 2001 From: aoshiguchen <1052045476@qq.com> Date: Mon, 13 Mar 2023 19:24:49 +0800 Subject: [PATCH 04/20] =?UTF-8?q?=E6=96=B0=E5=A2=9Eneutrino-proxy-vuepress?= =?UTF-8?q?=E7=9B=AE=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- neutrino-proxy-vuepress/.keep | 1 + 1 file changed, 1 insertion(+) create mode 100644 neutrino-proxy-vuepress/.keep diff --git a/neutrino-proxy-vuepress/.keep b/neutrino-proxy-vuepress/.keep new file mode 100644 index 00000000..4287ca86 --- /dev/null +++ b/neutrino-proxy-vuepress/.keep @@ -0,0 +1 @@ +# \ No newline at end of file From 7fd6fd5313228d05d104f6bc7d279b0768e5235b Mon Sep 17 00:00:00 2001 From: aoshiguchen <1052045476@qq.com> Date: Wed, 15 Mar 2023 12:01:49 +0800 Subject: [PATCH 05/20] =?UTF-8?q?=E7=BA=BF=E7=A8=8B=E6=B1=A0=E8=B0=83?= =?UTF-8?q?=E6=95=B4.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../asgc/neutrino/proxy/client/config/ProxyConfig.java | 1 + .../neutrino/proxy/client/core/ProxyClientService.java | 2 +- neutrino-proxy-client/src/main/resources/app.yml | 1 + .../neutrino/proxy/server/base/proxy/ProxyConfig.java | 2 ++ .../proxy/server/base/proxy/ProxyConfiguration.java | 8 ++++---- neutrino-proxy-server/src/main/resources/app.yml | 2 ++ 6 files changed, 11 insertions(+), 5 deletions(-) diff --git a/neutrino-proxy-client/src/main/java/fun/asgc/neutrino/proxy/client/config/ProxyConfig.java b/neutrino-proxy-client/src/main/java/fun/asgc/neutrino/proxy/client/config/ProxyConfig.java index b5bf5b4d..7d30a0b9 100644 --- a/neutrino-proxy-client/src/main/java/fun/asgc/neutrino/proxy/client/config/ProxyConfig.java +++ b/neutrino-proxy-client/src/main/java/fun/asgc/neutrino/proxy/client/config/ProxyConfig.java @@ -38,5 +38,6 @@ public class ProxyConfig { private Boolean sslEnable; private Integer obtainLicenseInterval; private String licenseKey; + private Integer threadCount; } } diff --git a/neutrino-proxy-client/src/main/java/fun/asgc/neutrino/proxy/client/core/ProxyClientService.java b/neutrino-proxy-client/src/main/java/fun/asgc/neutrino/proxy/client/core/ProxyClientService.java index 7a1ec2a6..0e28496c 100644 --- a/neutrino-proxy-client/src/main/java/fun/asgc/neutrino/proxy/client/core/ProxyClientService.java +++ b/neutrino-proxy-client/src/main/java/fun/asgc/neutrino/proxy/client/core/ProxyClientService.java @@ -66,7 +66,7 @@ public class ProxyClientService { public void init() { this.reconnectExecutor.scheduleWithFixedDelay(this::reconnect, 0, RECONNECT_INTERVAL_SECONDS, TimeUnit.SECONDS); - NioEventLoopGroup workerGroup = new NioEventLoopGroup(); + NioEventLoopGroup workerGroup = new NioEventLoopGroup(proxyConfig.getClient().getThreadCount()); realServerBootstrap.group(workerGroup); realServerBootstrap.channel(NioSocketChannel.class); realServerBootstrap.handler(new ChannelInitializer() { diff --git a/neutrino-proxy-client/src/main/resources/app.yml b/neutrino-proxy-client/src/main/resources/app.yml index 3ded7f75..d4eec9a5 100644 --- a/neutrino-proxy-client/src/main/resources/app.yml +++ b/neutrino-proxy-client/src/main/resources/app.yml @@ -13,6 +13,7 @@ neutrino: write-idle-time: 8 all-idle-time-seconds: 0 client: + thread-count: 50 key-store-password: 123456 jks-path: classpath:/test.jks server-ip: localhost diff --git a/neutrino-proxy-server/src/main/java/fun/asgc/neutrino/proxy/server/base/proxy/ProxyConfig.java b/neutrino-proxy-server/src/main/java/fun/asgc/neutrino/proxy/server/base/proxy/ProxyConfig.java index 4b18c1f4..cc336c4b 100644 --- a/neutrino-proxy-server/src/main/java/fun/asgc/neutrino/proxy/server/base/proxy/ProxyConfig.java +++ b/neutrino-proxy-server/src/main/java/fun/asgc/neutrino/proxy/server/base/proxy/ProxyConfig.java @@ -42,6 +42,8 @@ public class ProxyConfig { private String keyStorePassword; private String keyManagerPassword; private String jksPath; + private Integer bossThreadCount; + private Integer workThreadCount; } } diff --git a/neutrino-proxy-server/src/main/java/fun/asgc/neutrino/proxy/server/base/proxy/ProxyConfiguration.java b/neutrino-proxy-server/src/main/java/fun/asgc/neutrino/proxy/server/base/proxy/ProxyConfiguration.java index 328de66c..30e9977a 100644 --- a/neutrino-proxy-server/src/main/java/fun/asgc/neutrino/proxy/server/base/proxy/ProxyConfiguration.java +++ b/neutrino-proxy-server/src/main/java/fun/asgc/neutrino/proxy/server/base/proxy/ProxyConfiguration.java @@ -35,13 +35,13 @@ public class ProxyConfiguration implements LifecycleBean { } @Bean("serverBossGroup") - public NioEventLoopGroup serverBossGroup() { - return new NioEventLoopGroup(); + public NioEventLoopGroup serverBossGroup(@Inject ProxyConfig proxyConfig) { + return new NioEventLoopGroup(proxyConfig.getServer().getBossThreadCount()); } @Bean("serverWorkerGroup") - public NioEventLoopGroup serverWorkerGroup() { - return new NioEventLoopGroup(); + public NioEventLoopGroup serverWorkerGroup(@Inject ProxyConfig proxyConfig) { + return new NioEventLoopGroup(proxyConfig.getServer().getWorkThreadCount()); } } diff --git a/neutrino-proxy-server/src/main/resources/app.yml b/neutrino-proxy-server/src/main/resources/app.yml index 076fff32..4cca73c3 100644 --- a/neutrino-proxy-server/src/main/resources/app.yml +++ b/neutrino-proxy-server/src/main/resources/app.yml @@ -13,6 +13,8 @@ neutrino: write-idle-time: 10 all-idle-time-seconds: 0 server: + boss-thread-count: 10 + work-thread-count: 60 port: 9000 ssl-port: 9002 key-store-password: 123456 From c70baad0f69b9449aad093504511a35cac64e532 Mon Sep 17 00:00:00 2001 From: aoshiguchen <1052045476@qq.com> Date: Wed, 15 Mar 2023 12:22:13 +0800 Subject: [PATCH 06/20] =?UTF-8?q?=E6=89=93=E5=8C=85=E8=84=9A=E6=9C=AC?= =?UTF-8?q?=E8=B0=83=E6=95=B4.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bin/admin_build.sh | 2 +- bin/client_build.sh | 2 +- bin/server_build.sh | 3 ++- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/bin/admin_build.sh b/bin/admin_build.sh index b843861a..720e814e 100644 --- a/bin/admin_build.sh +++ b/bin/admin_build.sh @@ -17,7 +17,6 @@ export NVM_DIR="$HOME/.nvm" #初始化文件夹 cd .. -rm -rf $adminDeployDir if [ ! -d "$deployDir" ];then mkdir $deployDir fi @@ -27,6 +26,7 @@ fi if [ ! -d "$adminDeployDir" ];then mkdir $adminDeployDir fi +rm -rf $adminDeployDir #切node版本 nvm use $nodeVersion #进入admin项目目录 diff --git a/bin/client_build.sh b/bin/client_build.sh index d6df7fcd..d7e2312e 100644 --- a/bin/client_build.sh +++ b/bin/client_build.sh @@ -11,13 +11,13 @@ clientDeployDir=$deployDir"/client" #切到项目根目录 cd .. #初始化文件夹 -rm -rf $clientDeployDir if [ ! -d "$deployDir" ];then mkdir $deployDir fi if [ ! -d "$clientDeployDir" ];then mkdir $clientDeployDir fi +rm -rf $clientDeployDir/neutrino-proxy-client.jar #客户端打包 mvn clean install -U -pl neutrino-proxy-client -am -Dmaven.test.skip=true # 拷贝到deploy目录下 diff --git a/bin/server_build.sh b/bin/server_build.sh index 15bb8f32..875e8ff9 100644 --- a/bin/server_build.sh +++ b/bin/server_build.sh @@ -11,13 +11,14 @@ serverDeployDir=$deployDir"/server" #切到项目根目录 cd .. #初始化文件夹 -rm -rf $serverDeployDir if [ ! -d "$deployDir" ];then mkdir $deployDir fi if [ ! -d "$serverDeployDir" ];then mkdir $serverDeployDir fi +rm -rf $serverDeployDir/neutrino-proxy-server.jar + #客户端打包 mvn clean install -U -pl neutrino-proxy-server -am -Dmaven.test.skip=true # 拷贝到deploy目录下 From db64f8b31d8cb8c8880d22949096f11884c8f98f Mon Sep 17 00:00:00 2001 From: aoshiguchen <1052045476@qq.com> Date: Wed, 15 Mar 2023 12:51:21 +0800 Subject: [PATCH 07/20] =?UTF-8?q?=E6=89=93=E5=8C=85=E8=84=9A=E6=9C=AC?= =?UTF-8?q?=E8=B0=83=E6=95=B4.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bin/admin_build.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/bin/admin_build.sh b/bin/admin_build.sh index 720e814e..12469361 100644 --- a/bin/admin_build.sh +++ b/bin/admin_build.sh @@ -17,6 +17,7 @@ export NVM_DIR="$HOME/.nvm" #初始化文件夹 cd .. +rm -rf $adminDeployDir if [ ! -d "$deployDir" ];then mkdir $deployDir fi @@ -26,7 +27,6 @@ fi if [ ! -d "$adminDeployDir" ];then mkdir $adminDeployDir fi -rm -rf $adminDeployDir #切node版本 nvm use $nodeVersion #进入admin项目目录 @@ -39,4 +39,4 @@ npm i npm run build:$env #拷贝 cd .. -cp -rf ./neutrino-proxy-admin/dist $adminDeployDir +cp -rf ./neutrino-proxy-admin/dist $adminDeployDir/ From 917ce765e5be8d56c43368125cf95e128eeec825 Mon Sep 17 00:00:00 2001 From: aoshiguchen <1052045476@qq.com> Date: Wed, 15 Mar 2023 15:34:53 +0800 Subject: [PATCH 08/20] =?UTF-8?q?=E6=9B=B4=E6=96=B0README?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 0e7e3921..16d6713d 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ # 1、简介 - 中微子代理(neutrino-proxy)是一个基于netty的、开源的java内网穿透项目。 -- 技术栈:Solon、MybatisPlus +- 技术栈:Solon、MybatisPlus、Netty - 遵循MIT许可,因此您可以对它进行复制、修改、传播并用于任何个人或商业行为。 # 2、名称由来 From 5341f0d33a1a7512cda10f459f37b1ccd4d62866 Mon Sep 17 00:00:00 2001 From: aoshiguchen <1052045476@qq.com> Date: Wed, 15 Mar 2023 16:01:49 +0800 Subject: [PATCH 09/20] =?UTF-8?q?admin=E5=88=86=E9=A1=B5=E5=8F=82=E6=95=B0?= =?UTF-8?q?=E8=B0=83=E6=95=B4.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- neutrino-proxy-admin/src/views/log/clientConnectLog.vue | 8 ++++---- neutrino-proxy-admin/src/views/log/jobLog.vue | 8 ++++---- neutrino-proxy-admin/src/views/log/loginLog.vue | 8 ++++---- neutrino-proxy-admin/src/views/proxy/license.vue | 8 ++++---- neutrino-proxy-admin/src/views/proxy/portMapping.vue | 8 ++++---- neutrino-proxy-admin/src/views/system/jobManager.vue | 8 ++++---- neutrino-proxy-admin/src/views/system/portPool.vue | 8 ++++---- neutrino-proxy-admin/src/views/system/user.vue | 8 ++++---- 8 files changed, 32 insertions(+), 32 deletions(-) diff --git a/neutrino-proxy-admin/src/views/log/clientConnectLog.vue b/neutrino-proxy-admin/src/views/log/clientConnectLog.vue index dea91b46..45d3731f 100644 --- a/neutrino-proxy-admin/src/views/log/clientConnectLog.vue +++ b/neutrino-proxy-admin/src/views/log/clientConnectLog.vue @@ -48,8 +48,8 @@
- +
@@ -80,8 +80,8 @@ export default { total: null, listLoading: false, listQuery: { - currentPage: 1, - pageSize: 10, + current: 1, + size: 10, jobId: undefined }, dialogVisible: false, diff --git a/neutrino-proxy-admin/src/views/log/jobLog.vue b/neutrino-proxy-admin/src/views/log/jobLog.vue index 76dffcc2..33b9182b 100644 --- a/neutrino-proxy-admin/src/views/log/jobLog.vue +++ b/neutrino-proxy-admin/src/views/log/jobLog.vue @@ -46,8 +46,8 @@ -->
- +
@@ -79,8 +79,8 @@ export default { total: null, listLoading: false, listQuery: { - currentPage: 1, - pageSize: 10, + current: 1, + size: 10, jobId: undefined }, jobList: [], diff --git a/neutrino-proxy-admin/src/views/log/loginLog.vue b/neutrino-proxy-admin/src/views/log/loginLog.vue index 9ea21d1b..d4ace377 100644 --- a/neutrino-proxy-admin/src/views/log/loginLog.vue +++ b/neutrino-proxy-admin/src/views/log/loginLog.vue @@ -28,8 +28,8 @@
- +
@@ -51,8 +51,8 @@ export default { total: null, listLoading: false, listQuery: { - currentPage: 1, - pageSize: 10, + current: 1, + size: 10, jobId: undefined } } diff --git a/neutrino-proxy-admin/src/views/proxy/license.vue b/neutrino-proxy-admin/src/views/proxy/license.vue index 620a8b17..5c8d89a4 100644 --- a/neutrino-proxy-admin/src/views/proxy/license.vue +++ b/neutrino-proxy-admin/src/views/proxy/license.vue @@ -60,8 +60,8 @@
- +
@@ -132,8 +132,8 @@ total: null, listLoading: true, listQuery: { - currentPage: 1, - pageSize: 10, + current: 1, + size: 10, importance: undefined, title: undefined, type: undefined diff --git a/neutrino-proxy-admin/src/views/proxy/portMapping.vue b/neutrino-proxy-admin/src/views/proxy/portMapping.vue index 2654131b..e322c736 100644 --- a/neutrino-proxy-admin/src/views/proxy/portMapping.vue +++ b/neutrino-proxy-admin/src/views/proxy/portMapping.vue @@ -65,8 +65,8 @@
- +
@@ -171,8 +171,8 @@ total: null, listLoading: true, listQuery: { - currentPage: 1, - pageSize: 10, + current: 1, + size: 10, importance: undefined, title: undefined, type: undefined diff --git a/neutrino-proxy-admin/src/views/system/jobManager.vue b/neutrino-proxy-admin/src/views/system/jobManager.vue index ace4f5bc..d1854138 100644 --- a/neutrino-proxy-admin/src/views/system/jobManager.vue +++ b/neutrino-proxy-admin/src/views/system/jobManager.vue @@ -51,8 +51,8 @@
- +
@@ -114,8 +114,8 @@ total: null, listLoading: true, listQuery: { - currentPage: 1, - pageSize: 10, + current: 1, + size: 10, importance: undefined, title: undefined, type: undefined diff --git a/neutrino-proxy-admin/src/views/system/portPool.vue b/neutrino-proxy-admin/src/views/system/portPool.vue index e449ad88..108cfa35 100644 --- a/neutrino-proxy-admin/src/views/system/portPool.vue +++ b/neutrino-proxy-admin/src/views/system/portPool.vue @@ -43,8 +43,8 @@
- +
@@ -107,8 +107,8 @@ total: null, listLoading: true, listQuery: { - currentPage: 1, - pageSize: 10, + current: 1, + size: 10, importance: undefined, title: undefined, type: undefined diff --git a/neutrino-proxy-admin/src/views/system/user.vue b/neutrino-proxy-admin/src/views/system/user.vue index 9903bd23..2b195210 100644 --- a/neutrino-proxy-admin/src/views/system/user.vue +++ b/neutrino-proxy-admin/src/views/system/user.vue @@ -50,8 +50,8 @@
- +
@@ -128,8 +128,8 @@ total: null, listLoading: true, listQuery: { - currentPage: 1, - pageSize: 10, + current: 1, + size: 10, importance: undefined, title: undefined, type: undefined From ecf0b97493769cb7fad33c78bb10a3ae20191cd4 Mon Sep 17 00:00:00 2001 From: aoshiguchen <1052045476@qq.com> Date: Wed, 15 Mar 2023 16:06:11 +0800 Subject: [PATCH 10/20] =?UTF-8?q?logo=E8=B5=84=E6=BA=90=E8=B0=83=E6=95=B4.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- neutrino-proxy-admin/favicon.ico | Bin 11870 -> 3222 bytes 1 file changed, 0 insertions(+), 0 deletions(-) mode change 100644 => 100755 neutrino-proxy-admin/favicon.ico diff --git a/neutrino-proxy-admin/favicon.ico b/neutrino-proxy-admin/favicon.ico old mode 100644 new mode 100755 index 4b526ba9be57865ba11d9e8ab59a3c006d924d06..f7240fb6280f7cfc9cd9e19615090783dd7bdffb GIT binary patch literal 3222 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 CA2$U6 literal 11870 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
& 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 Xy;8YVgVVrY*9K{*=qgtzT0Q(< Date: Wed, 15 Mar 2023 18:34:08 +0800 Subject: [PATCH 11/20] =?UTF-8?q?=E7=AB=AF=E5=8F=A3=E6=98=A0=E5=B0=84?= =?UTF-8?q?=E9=85=8D=E7=BD=AE=E4=BC=98=E5=8C=96=EF=BC=8C=E4=B8=8D=E9=85=8D?= =?UTF-8?q?=E7=BD=AE=E6=97=B6=EF=BC=8C=E9=BB=98=E8=AE=A4=E4=B8=BA127.0.0.1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- neutrino-proxy-admin/src/views/proxy/portMapping.vue | 2 +- .../proxy/server/controller/PortMappingController.java | 6 +++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/neutrino-proxy-admin/src/views/proxy/portMapping.vue b/neutrino-proxy-admin/src/views/proxy/portMapping.vue index e322c736..67e84497 100644 --- a/neutrino-proxy-admin/src/views/proxy/portMapping.vue +++ b/neutrino-proxy-admin/src/views/proxy/portMapping.vue @@ -293,7 +293,7 @@ licenseId: undefined, licenseName: undefined, serverPort: undefined, - clientIp: undefined, + clientIp: '127.0.0.1', clientPort: undefined } }, diff --git a/neutrino-proxy-server/src/main/java/fun/asgc/neutrino/proxy/server/controller/PortMappingController.java b/neutrino-proxy-server/src/main/java/fun/asgc/neutrino/proxy/server/controller/PortMappingController.java index 6868bb1e..34ec8978 100644 --- a/neutrino-proxy-server/src/main/java/fun/asgc/neutrino/proxy/server/controller/PortMappingController.java +++ b/neutrino-proxy-server/src/main/java/fun/asgc/neutrino/proxy/server/controller/PortMappingController.java @@ -6,6 +6,7 @@ import fun.asgc.neutrino.proxy.server.controller.req.*; import fun.asgc.neutrino.proxy.server.controller.res.*; import fun.asgc.neutrino.proxy.server.service.PortMappingService; import fun.asgc.neutrino.proxy.server.util.ParamCheckUtil; +import org.apache.commons.lang3.StringUtils; import org.noear.solon.annotation.*; /** @@ -33,8 +34,11 @@ public class PortMappingController { ParamCheckUtil.checkNotNull(req, "req"); ParamCheckUtil.checkNotNull(req.getLicenseId(), "licenseId"); ParamCheckUtil.checkNotNull(req.getServerPort(), "serverPort"); - ParamCheckUtil.checkNotEmpty(req.getClientIp(), "clientIp"); ParamCheckUtil.checkNotNull(req.getClientPort(), "clientPort"); + if (StringUtils.isBlank(req.getClientIp())) { + // 没传客户端ip,默认为127.0.0.1 + req.setClientIp("127.0.0.1"); + } return portMappingService.create(req); } From dffcf2932c1191d15d6f4658cc8de9b86d74d585 Mon Sep 17 00:00:00 2001 From: "Chunping.Li" Date: Fri, 17 Mar 2023 11:56:10 +0800 Subject: [PATCH 12/20] =?UTF-8?q?https://gitee.com/dromara/neutrino-proxy/?= =?UTF-8?q?issues/I6NGHP=20License=E7=AE=A1=E7=90=86=E9=A1=B5=E9=9D=A2?= =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/views/proxy/license.vue | 35 +++++++++++++++---- .../server/controller/req/LicenseListReq.java | 3 ++ .../proxy/server/service/LicenseService.java | 5 ++- 3 files changed, 36 insertions(+), 7 deletions(-) diff --git a/neutrino-proxy-admin/src/views/proxy/license.vue b/neutrino-proxy-admin/src/views/proxy/license.vue index 5c8d89a4..306ad48d 100644 --- a/neutrino-proxy-admin/src/views/proxy/license.vue +++ b/neutrino-proxy-admin/src/views/proxy/license.vue @@ -1,6 +1,15 @@ + + +