From 8c455e50240c371871f46ef3b6fb6ae14ac217cc Mon Sep 17 00:00:00 2001 From: suxiang <2585546823@qq.com> Date: Mon, 22 Jul 2024 23:20:15 +0800 Subject: [PATCH 01/41] =?UTF-8?q?=E5=9F=9F=E5=90=8D=E7=AE=A1=E7=90=86?= =?UTF-8?q?=E5=89=8D=E7=AB=AF=E9=A1=B5=E9=9D=A2=E5=88=9D=E6=AD=A5=E8=AE=BE?= =?UTF-8?q?=E8=AE=A1=EF=BC=9A=E6=94=AF=E6=8C=81=E5=9F=9F=E5=90=8D=E6=90=9C?= =?UTF-8?q?=E7=B4=A2=E3=80=81=E6=B7=BB=E5=8A=A0=E3=80=81=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- neutrino-proxy-admin/src/api/domain.js | 34 ++ neutrino-proxy-admin/src/lang/zh.js | 2 + neutrino-proxy-admin/src/router/index.js | 5 +- .../src/views/proxy/domain.vue | 428 ++++++++++++++++++ 4 files changed, 467 insertions(+), 2 deletions(-) create mode 100644 neutrino-proxy-admin/src/views/proxy/domain.vue diff --git a/neutrino-proxy-admin/src/api/domain.js b/neutrino-proxy-admin/src/api/domain.js index d3a9f7fd..a313b265 100644 --- a/neutrino-proxy-admin/src/api/domain.js +++ b/neutrino-proxy-admin/src/api/domain.js @@ -7,3 +7,37 @@ export function domainNameBindInfo(query) { params: query }) } +export function fetchList(query) { + return request({ + url: '/domain/page', + method: 'get', + params: query + }) +} + +export function updateEnableStatus(id, enable) { + return request({ + url: '/domain/update/enable-status', + method: 'post', + data: { + id: id, + enable: enable + } + }).use +} + +export function createDomain(data) { + return request({ + url: '/domain/create', + method: 'post', + data + }) +} + +export function updateDomain(data) { + return request({ + url: '/domain/update', + method: 'post', + data + }) +} diff --git a/neutrino-proxy-admin/src/lang/zh.js b/neutrino-proxy-admin/src/lang/zh.js index 998795df..f57909e7 100644 --- a/neutrino-proxy-admin/src/lang/zh.js +++ b/neutrino-proxy-admin/src/lang/zh.js @@ -55,6 +55,7 @@ export default { proxy: '代理配置', license: 'License管理', portMapping: '端口映射', + domainManagement: '域名管理', jobManager: '调度管理', jobLog: '调度日志', log: '日志管理', @@ -128,6 +129,7 @@ export default { deleteBatch: '批量删除', cancel: '取 消', confirm: '确 定', + domain: '域名', userId: '用户ID', userName: '用户名', name: '名称', diff --git a/neutrino-proxy-admin/src/router/index.js b/neutrino-proxy-admin/src/router/index.js index 47a870f2..8b2b4a87 100644 --- a/neutrino-proxy-admin/src/router/index.js +++ b/neutrino-proxy-admin/src/router/index.js @@ -61,7 +61,8 @@ export const asyncRouterMap = [ }, children: [ { path: 'license', component: _import('proxy/license'), name: 'license', meta: { title: 'license' }}, - { path: 'portMapping', component: _import('proxy/portMapping'), name: 'portMapping', meta: { title: 'portMapping' }} + { path: 'portMapping', component: _import('proxy/portMapping'), name: 'portMapping', meta: { title: 'portMapping' }}, + { path: 'domainManagement', component: _import('proxy/domain'), name: 'domainManagement', meta: { title: 'domainManagement' }} ] }, { @@ -78,7 +79,7 @@ export const asyncRouterMap = [ { path: 'portGroup', component: _import('system/portGroup'), name: 'portGroup', meta: { title: 'portGroup' }}, { path: 'portPool', component: _import('system/portPool'), name: 'portPool', meta: { title: 'portPool' }}, { path: 'securityGroup', component: _import('system/securityGroup'), name: 'securityGroup', meta: { title: 'securityGroup' }}, - { path: 'securityRule', component: _import('system/securityRule'), name: 'securityRule', meta: { title: 'securityRule' }, hidden: true}, + { path: 'securityRule', component: _import('system/securityRule'), name: 'securityRule', meta: { title: 'securityRule' }, hidden: true }, { path: 'protocal', component: _import('system/protocal'), name: 'protocal', meta: { title: 'protocal' }}, { path: 'jobManager', component: _import('system/jobManager'), name: 'jobManager', meta: { title: 'jobManager' }} ] diff --git a/neutrino-proxy-admin/src/views/proxy/domain.vue b/neutrino-proxy-admin/src/views/proxy/domain.vue new file mode 100644 index 00000000..e1a3d243 --- /dev/null +++ b/neutrino-proxy-admin/src/views/proxy/domain.vue @@ -0,0 +1,428 @@ + + + From dcb59975da0d1c509b5accdfcd956484f217f82a Mon Sep 17 00:00:00 2001 From: suxiang <2585546823@qq.com> Date: Mon, 22 Jul 2024 23:20:51 +0800 Subject: [PATCH 02/41] =?UTF-8?q?=E7=BB=B4=E6=8A=A4=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E5=BA=93=E8=A1=A8=E7=BB=93=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/resources/sql/h2/init-structure.sql | 15 +++++++++++++++ .../resources/sql/mysql/domain_name.data.sql | 3 +++ .../main/resources/sql/mysql/init-structure.sql | 16 ++++++++++++++++ 3 files changed, 34 insertions(+) create mode 100644 neutrino-proxy-server/src/main/resources/sql/mysql/domain_name.data.sql diff --git a/neutrino-proxy-server/src/main/resources/sql/h2/init-structure.sql b/neutrino-proxy-server/src/main/resources/sql/h2/init-structure.sql index bfeaeda7..2841cf46 100644 --- a/neutrino-proxy-server/src/main/resources/sql/h2/init-structure.sql +++ b/neutrino-proxy-server/src/main/resources/sql/h2/init-structure.sql @@ -114,6 +114,21 @@ CREATE TABLE IF NOT EXISTS `port_mapping` ( ); CREATE UNIQUE INDEX IF NOT EXISTS I_port_mapping_server_port ON port_mapping (server_port ASC); +#域名表 +CREATE TABLE IF NOT EXISTS `domain_name` ( + `id` INTEGER NOT NULL PRIMARY KEY AUTO_INCREMENT, + `domain` VARCHAR(50) NOT NULL, + `user_id` INTEGER NOT NULL, + `jks` BLOB DEFAULT NULL, + `key_store_password` varchar(255) DEFAULT NULL, + `is_default` INTEGER(2) NOT NULL, + `force_https` INTEGER(2) NOT NULL, + `enable` INTEGER(2) NOT NULL, + `create_time` TIMESTAMP NOT NULL, + `update_time` TIMESTAMP NOT NULL +); +CREATE UNIQUE INDEX IF NOT EXISTS I_domain_name_domain ON domain_name (`domain` ASC); + #############################日志管理相关表############################# #用户登录记录表 CREATE TABLE IF NOT EXISTS `user_login_record` ( diff --git a/neutrino-proxy-server/src/main/resources/sql/mysql/domain_name.data.sql b/neutrino-proxy-server/src/main/resources/sql/mysql/domain_name.data.sql new file mode 100644 index 00000000..e8e65699 --- /dev/null +++ b/neutrino-proxy-server/src/main/resources/sql/mysql/domain_name.data.sql @@ -0,0 +1,3 @@ +#域名表 +INSERT INTO domain_name(`id`, `domain`, `user_id`, `jks`, `key_store_password`, `is_default`, `force_https`, `enable`,`create_time`, `update_time`) VALUES +(1, 'default.fun', 1, null, null, 1, 2, 1, now(), now()); diff --git a/neutrino-proxy-server/src/main/resources/sql/mysql/init-structure.sql b/neutrino-proxy-server/src/main/resources/sql/mysql/init-structure.sql index d61fb9ac..620c7740 100644 --- a/neutrino-proxy-server/src/main/resources/sql/mysql/init-structure.sql +++ b/neutrino-proxy-server/src/main/resources/sql/mysql/init-structure.sql @@ -97,6 +97,22 @@ CREATE TABLE IF NOT EXISTS `license` ( KEY `I_license_key` (`key`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; +#域名表 +CREATE TABLE IF NOT EXISTS `domain_name` ( + `id` int NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `domain` varchar(50) NOT NULL COMMENT '域名', + `user_id` int NOT NULL COMMENT '用户ID', + `jks` BLOB DEFAULT NULL COMMENT 'SSL证书文件', + `key_store_password` varchar(255) DEFAULT NULL COMMENT 'KeyStore密码', + `is_default` int NOT NULL COMMENT '是否是默认域名(1、是 2、否)', + `force_https` int NOT NULL COMMENT '强制使用https(1、是 2、否)', + `enable` int NOT NULL COMMENT '是否启用(1、启用 2、禁用)', + `create_time` datetime(3) NOT NULL COMMENT '创建时间', + `update_time` datetime(3) NOT NULL COMMENT '更新时间', + PRIMARY KEY (`id`) USING BTREE, + KEY `I_domain_name_domain` (`domain`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; + #端口映射表 CREATE TABLE IF NOT EXISTS `port_mapping` ( `id` int NOT NULL AUTO_INCREMENT COMMENT '主键ID', From 6b5597514dc4bf19d5e364912d552ba837296289 Mon Sep 17 00:00:00 2001 From: suxiang <2585546823@qq.com> Date: Mon, 22 Jul 2024 23:21:05 +0800 Subject: [PATCH 03/41] =?UTF-8?q?=E5=9F=9F=E5=90=8D=E7=AE=A1=E7=90=86?= =?UTF-8?q?=E6=9C=8D=E5=8A=A1=E7=AB=AF=E5=88=9D=E6=AD=A5=E8=AE=BE=E8=AE=A1?= =?UTF-8?q?=EF=BC=9A=E6=94=AF=E6=8C=81=E5=9F=9F=E5=90=8D=E6=90=9C=E7=B4=A2?= =?UTF-8?q?=E3=80=81=E6=B7=BB=E5=8A=A0=E3=80=81=E4=BF=AE=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../constant/DefaultDomainStatusEnum.java | 19 +++ .../server/constant/ExceptionConstant.java | 4 +- .../server/constant/HttpsStatusEnum.java | 19 +++ .../server/controller/DomainController.java | 54 +++++++ .../controller/req/proxy/DomainCreateReq.java | 29 ++++ .../controller/req/proxy/DomainListReq.java | 21 +++ .../controller/req/proxy/DomainUpdateReq.java | 25 ++++ .../controller/res/proxy/DomainListRes.java | 65 +++++++++ .../server/dal/DomainMapper.java | 28 ++++ .../server/dal/entity/DomainNameDO.java | 106 ++++++++++++++ .../server/service/DomainService.java | 137 ++++++++++++++++++ 11 files changed, 505 insertions(+), 2 deletions(-) create mode 100644 neutrino-proxy-server/src/main/java/org/dromara/neutrinoproxy/server/constant/DefaultDomainStatusEnum.java create mode 100644 neutrino-proxy-server/src/main/java/org/dromara/neutrinoproxy/server/constant/HttpsStatusEnum.java create mode 100644 neutrino-proxy-server/src/main/java/org/dromara/neutrinoproxy/server/controller/DomainController.java create mode 100644 neutrino-proxy-server/src/main/java/org/dromara/neutrinoproxy/server/controller/req/proxy/DomainCreateReq.java create mode 100644 neutrino-proxy-server/src/main/java/org/dromara/neutrinoproxy/server/controller/req/proxy/DomainListReq.java create mode 100644 neutrino-proxy-server/src/main/java/org/dromara/neutrinoproxy/server/controller/req/proxy/DomainUpdateReq.java create mode 100644 neutrino-proxy-server/src/main/java/org/dromara/neutrinoproxy/server/controller/res/proxy/DomainListRes.java create mode 100644 neutrino-proxy-server/src/main/java/org/dromara/neutrinoproxy/server/dal/DomainMapper.java create mode 100644 neutrino-proxy-server/src/main/java/org/dromara/neutrinoproxy/server/dal/entity/DomainNameDO.java create mode 100644 neutrino-proxy-server/src/main/java/org/dromara/neutrinoproxy/server/service/DomainService.java diff --git a/neutrino-proxy-server/src/main/java/org/dromara/neutrinoproxy/server/constant/DefaultDomainStatusEnum.java b/neutrino-proxy-server/src/main/java/org/dromara/neutrinoproxy/server/constant/DefaultDomainStatusEnum.java new file mode 100644 index 00000000..65608f78 --- /dev/null +++ b/neutrino-proxy-server/src/main/java/org/dromara/neutrinoproxy/server/constant/DefaultDomainStatusEnum.java @@ -0,0 +1,19 @@ +package org.dromara.neutrinoproxy.server.constant; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 默认域名状态枚举 + * @author Mirac + * @date 21/7/2024 + */ +@Getter +@AllArgsConstructor +public enum DefaultDomainStatusEnum { + ENABLE(1, "默认域名"), + DISABLE(2, "关闭"); + + private Integer status; + private String desc; +} diff --git a/neutrino-proxy-server/src/main/java/org/dromara/neutrinoproxy/server/constant/ExceptionConstant.java b/neutrino-proxy-server/src/main/java/org/dromara/neutrinoproxy/server/constant/ExceptionConstant.java index ed149c80..e66cd7a3 100644 --- a/neutrino-proxy-server/src/main/java/org/dromara/neutrinoproxy/server/constant/ExceptionConstant.java +++ b/neutrino-proxy-server/src/main/java/org/dromara/neutrinoproxy/server/constant/ExceptionConstant.java @@ -60,7 +60,6 @@ public enum ExceptionConstant { PORT_CANNOT_REPEAT_MAPPING(14001, "服务端口[{}]不能重复映射"), AN_UNSUPPORTED_PROTOCOL(14002, "不支持的协议[{}]!"), PORT_MAPPING_SUBDONAME_CONNOT_REPEAT(14003, "子域名不能重复使用!"), - // 调度管理(15000) JOB_INFO_NOT_EXIST(15000, "调度管理记录不存在"), SYSTEM_ERROR(500, "系统异常"), @@ -72,7 +71,8 @@ public enum ExceptionConstant { // 安全组管理(17000) SECURITY_GROUP_NOT_EXIST(17000, "安全组不存在"), SECURITY_RULE_NOT_EXIST(17001, "安全规则不存在"), - + // 域名映射管理(18000) + DOMAIN_NAME_CANNOT_REPEAT(18000, "域名不能重复"), ; private int code; diff --git a/neutrino-proxy-server/src/main/java/org/dromara/neutrinoproxy/server/constant/HttpsStatusEnum.java b/neutrino-proxy-server/src/main/java/org/dromara/neutrinoproxy/server/constant/HttpsStatusEnum.java new file mode 100644 index 00000000..ab1c5981 --- /dev/null +++ b/neutrino-proxy-server/src/main/java/org/dromara/neutrinoproxy/server/constant/HttpsStatusEnum.java @@ -0,0 +1,19 @@ +package org.dromara.neutrinoproxy.server.constant; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * 仅Https状态枚举 + * @author Mirac + * @date 21/7/2024 + */ +@Getter +@AllArgsConstructor +public enum HttpsStatusEnum { + ONLY_HTTPS(1, "仅HTTPS"), + DISABLE_ONLY_HTTPS(2, "关闭仅HTTPS"); + + private Integer status; + private String desc; +} diff --git a/neutrino-proxy-server/src/main/java/org/dromara/neutrinoproxy/server/controller/DomainController.java b/neutrino-proxy-server/src/main/java/org/dromara/neutrinoproxy/server/controller/DomainController.java new file mode 100644 index 00000000..a8110314 --- /dev/null +++ b/neutrino-proxy-server/src/main/java/org/dromara/neutrinoproxy/server/controller/DomainController.java @@ -0,0 +1,54 @@ +package org.dromara.neutrinoproxy.server.controller; + +import cn.hutool.core.util.StrUtil; +import org.dromara.neutrinoproxy.server.base.page.PageInfo; +import org.dromara.neutrinoproxy.server.base.page.PageQuery; +import org.dromara.neutrinoproxy.server.base.rest.Authorization; +import org.dromara.neutrinoproxy.server.controller.req.proxy.DomainCreateReq; +import org.dromara.neutrinoproxy.server.controller.req.proxy.DomainListReq; +import org.dromara.neutrinoproxy.server.controller.req.proxy.DomainUpdateReq; +import org.dromara.neutrinoproxy.server.controller.req.proxy.PortMappingCreateReq; +import org.dromara.neutrinoproxy.server.controller.res.proxy.DomainListRes; +import org.dromara.neutrinoproxy.server.util.ParamCheckUtil; +import org.noear.solon.annotation.*; +import org.dromara.neutrinoproxy.server.service.DomainService; +import org.noear.solon.core.handle.Context; +import org.noear.solon.core.handle.UploadedFile; +import org.noear.solon.lang.Nullable; + +import javax.sound.midi.Soundbank; +import java.io.IOException; + +/** + * @author Mirac + * @date 21/7/2024 + */ +@Mapping("/domain") +@Controller +public class DomainController { + @Inject + private DomainService domainService; + + @Mapping("/page") + public PageInfo page(PageQuery pageQuery, DomainListReq req) { + return domainService.page(pageQuery, req); + } + + @Post + @Mapping(path = "/create") + @Authorization(onlyAdmin = true) + public void create(DomainCreateReq req, UploadedFile jks) throws IOException { + ParamCheckUtil.checkNotNull(req, "req"); + ParamCheckUtil.checkNotEmpty(req.getDomain(), "domain"); + domainService.create(req, jks); + } + + @Post + @Mapping(path = "/update") + @Authorization(onlyAdmin = true) + public void update(DomainUpdateReq req, UploadedFile jks) throws IOException { + ParamCheckUtil.checkNotNull(req, "req"); + ParamCheckUtil.checkNotEmpty(req.getDomain(), "domain"); + domainService.update(req, jks); + } +} diff --git a/neutrino-proxy-server/src/main/java/org/dromara/neutrinoproxy/server/controller/req/proxy/DomainCreateReq.java b/neutrino-proxy-server/src/main/java/org/dromara/neutrinoproxy/server/controller/req/proxy/DomainCreateReq.java new file mode 100644 index 00000000..a3d92884 --- /dev/null +++ b/neutrino-proxy-server/src/main/java/org/dromara/neutrinoproxy/server/controller/req/proxy/DomainCreateReq.java @@ -0,0 +1,29 @@ +package org.dromara.neutrinoproxy.server.controller.req.proxy; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import lombok.Data; +import org.dromara.neutrinoproxy.server.constant.DefaultDomainStatusEnum; +import org.dromara.neutrinoproxy.server.constant.EnableStatusEnum; +import org.dromara.neutrinoproxy.server.constant.HttpsStatusEnum; +import org.noear.solon.core.handle.UploadedFile; +import org.noear.solon.lang.Nullable; + +import java.util.Date; + +/** + * @author Mirac + * @date 21/7/2024 + */ +@Data +public class DomainCreateReq { + /** + * 主域名 + */ + private String domain; + + /** + * KeyStore密码 + */ + private String keyStorePassword; +} diff --git a/neutrino-proxy-server/src/main/java/org/dromara/neutrinoproxy/server/controller/req/proxy/DomainListReq.java b/neutrino-proxy-server/src/main/java/org/dromara/neutrinoproxy/server/controller/req/proxy/DomainListReq.java new file mode 100644 index 00000000..e4f6964a --- /dev/null +++ b/neutrino-proxy-server/src/main/java/org/dromara/neutrinoproxy/server/controller/req/proxy/DomainListReq.java @@ -0,0 +1,21 @@ +package org.dromara.neutrinoproxy.server.controller.req.proxy; + +import lombok.Data; +import org.dromara.neutrinoproxy.server.constant.EnableStatusEnum; + +/** + * @author Mirac + * @date 21/7/2024 + */ +@Data +public class DomainListReq { + /** + * 用户ID + */ + private Integer userId; + /** + * 启用状态 + * {@link EnableStatusEnum} + */ + private Integer enable; +} diff --git a/neutrino-proxy-server/src/main/java/org/dromara/neutrinoproxy/server/controller/req/proxy/DomainUpdateReq.java b/neutrino-proxy-server/src/main/java/org/dromara/neutrinoproxy/server/controller/req/proxy/DomainUpdateReq.java new file mode 100644 index 00000000..588c33b4 --- /dev/null +++ b/neutrino-proxy-server/src/main/java/org/dromara/neutrinoproxy/server/controller/req/proxy/DomainUpdateReq.java @@ -0,0 +1,25 @@ +package org.dromara.neutrinoproxy.server.controller.req.proxy; + +import lombok.Data; + +/** + * @author Mirac + * @date 21/7/2024 + */ +@Data +public class DomainUpdateReq { + /** + * id + */ + private Integer id; + + /** + * 主域名 + */ + private String domain; + + /** + * KeyStore密码 + */ + private String keyStorePassword; +} diff --git a/neutrino-proxy-server/src/main/java/org/dromara/neutrinoproxy/server/controller/res/proxy/DomainListRes.java b/neutrino-proxy-server/src/main/java/org/dromara/neutrinoproxy/server/controller/res/proxy/DomainListRes.java new file mode 100644 index 00000000..22947e07 --- /dev/null +++ b/neutrino-proxy-server/src/main/java/org/dromara/neutrinoproxy/server/controller/res/proxy/DomainListRes.java @@ -0,0 +1,65 @@ +package org.dromara.neutrinoproxy.server.controller.res.proxy; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import lombok.Data; +import lombok.experimental.Accessors; +import org.dromara.neutrinoproxy.server.constant.DefaultDomainStatusEnum; +import org.dromara.neutrinoproxy.server.constant.EnableStatusEnum; +import org.dromara.neutrinoproxy.server.constant.HttpsStatusEnum; + +import java.util.Date; + +/** + * @author Mirac + * @date 21/7/2024 + */ +@Accessors(chain = true) +@Data +public class DomainListRes { + @TableId(type = IdType.AUTO) + private Integer id; + + /** + * 主域名 + */ + private String domain; + + /** + * 用户ID + */ + private Integer userId; + + /** + * 用户名 + */ + private String userName; + + /** + * 是否是默认域名(1、是 2、否) + * {@link DefaultDomainStatusEnum} + */ + private Integer isDefault; + + /** + * 强制使用HTTPS(1、是 2、否) + * {@link HttpsStatusEnum} + */ + private Integer forceHttps; + + /** + * 启用状态 + * {@link EnableStatusEnum} + */ + private Integer enable; + + /** + * 创建时间 + */ + private Date createTime; + + /** + * 更新时间 + */ + private Date updateTime; +} diff --git a/neutrino-proxy-server/src/main/java/org/dromara/neutrinoproxy/server/dal/DomainMapper.java b/neutrino-proxy-server/src/main/java/org/dromara/neutrinoproxy/server/dal/DomainMapper.java new file mode 100644 index 00000000..f1e25998 --- /dev/null +++ b/neutrino-proxy-server/src/main/java/org/dromara/neutrinoproxy/server/dal/DomainMapper.java @@ -0,0 +1,28 @@ +package org.dromara.neutrinoproxy.server.dal; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import org.apache.ibatis.annotations.Mapper; +import org.dromara.neutrinoproxy.server.controller.req.system.PortGroupListReq; +import org.dromara.neutrinoproxy.server.controller.res.system.PortGroupListRes; +import org.dromara.neutrinoproxy.server.dal.entity.DomainNameDO; +import org.dromara.neutrinoproxy.server.dal.entity.PortGroupDO; + +import java.util.Date; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + + +@Mapper +public interface DomainMapper extends BaseMapper { + default DomainNameDO checkRepeat(String domain, Set excludeIds) { + return this.selectOne(new LambdaQueryWrapper() + .eq(DomainNameDO::getDomain, domain) + .notIn(DomainNameDO::getId, excludeIds) + .last("limit 1") + ); + } +} diff --git a/neutrino-proxy-server/src/main/java/org/dromara/neutrinoproxy/server/dal/entity/DomainNameDO.java b/neutrino-proxy-server/src/main/java/org/dromara/neutrinoproxy/server/dal/entity/DomainNameDO.java new file mode 100644 index 00000000..c01b153f --- /dev/null +++ b/neutrino-proxy-server/src/main/java/org/dromara/neutrinoproxy/server/dal/entity/DomainNameDO.java @@ -0,0 +1,106 @@ +/** + * Copyright (c) 2022 aoshiguchen + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +package org.dromara.neutrinoproxy.server.dal.entity; + +import cn.hutool.core.bean.BeanUtil; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import lombok.Data; +import lombok.ToString; +import lombok.experimental.Accessors; +import org.dromara.neutrinoproxy.server.constant.DefaultDomainStatusEnum; +import org.dromara.neutrinoproxy.server.constant.EnableStatusEnum; +import org.dromara.neutrinoproxy.server.constant.HttpsStatusEnum; +import org.dromara.neutrinoproxy.server.constant.OnlineStatusEnum; +import org.dromara.neutrinoproxy.server.controller.res.proxy.DomainListRes; +import org.dromara.neutrinoproxy.server.controller.res.proxy.PortMappingListRes; + +import java.util.Date; + +/** + * 域名 + * @author: Mirac + * @date: 2024/7/21 + */ +@ToString +@Accessors(chain = true) +@Data +@TableName("domain_name") +public class DomainNameDO { + @TableId(type = IdType.AUTO) + private Integer id; + + /** + * 主域名 + */ + private String domain; + + /** + * 用户ID + */ + private Integer userId; + + /** + * SSL证书文件内容 + */ + private byte[] jks; + + /** + * KeyStore密码 + */ + private String keyStorePassword; + + /** + * 是否是默认域名(1、是 2、否) + * {@link DefaultDomainStatusEnum} + */ + private Integer isDefault; + + /** + * 强制使用HTTPS(1、是 2、否) + * {@link HttpsStatusEnum} + */ + private Integer forceHttps; + + /** + * 启用状态 + * {@link EnableStatusEnum} + */ + private Integer enable; + + /** + * 创建时间 + */ + private Date createTime; + + /** + * 更新时间 + */ + private Date updateTime; + + public DomainListRes toRes() { + DomainListRes res = new DomainListRes(); + BeanUtil.copyProperties(this, res); + return res; + } +} diff --git a/neutrino-proxy-server/src/main/java/org/dromara/neutrinoproxy/server/service/DomainService.java b/neutrino-proxy-server/src/main/java/org/dromara/neutrinoproxy/server/service/DomainService.java new file mode 100644 index 00000000..5cf91441 --- /dev/null +++ b/neutrino-proxy-server/src/main/java/org/dromara/neutrinoproxy/server/service/DomainService.java @@ -0,0 +1,137 @@ +package org.dromara.neutrinoproxy.server.service; + +import cn.hutool.core.bean.BeanUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.baomidou.mybatisplus.core.metadata.OrderItem; +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.solon.plugins.pagination.Page; +import com.google.common.collect.Sets; +import lombok.extern.slf4j.Slf4j; +import org.apache.ibatis.solon.annotation.Db; +import org.dromara.neutrinoproxy.server.base.page.PageInfo; +import org.dromara.neutrinoproxy.server.base.page.PageQuery; +import org.dromara.neutrinoproxy.server.base.rest.SystemContextHolder; +import org.dromara.neutrinoproxy.server.constant.DefaultDomainStatusEnum; +import org.dromara.neutrinoproxy.server.constant.EnableStatusEnum; +import org.dromara.neutrinoproxy.server.constant.ExceptionConstant; +import org.dromara.neutrinoproxy.server.constant.HttpsStatusEnum; +import org.dromara.neutrinoproxy.server.controller.req.proxy.DomainCreateReq; +import org.dromara.neutrinoproxy.server.controller.req.proxy.DomainListReq; +import org.dromara.neutrinoproxy.server.controller.req.proxy.DomainUpdateReq; +import org.dromara.neutrinoproxy.server.controller.res.proxy.DomainListRes; +import org.dromara.neutrinoproxy.server.dal.DomainMapper; +import org.dromara.neutrinoproxy.server.dal.UserMapper; +import org.dromara.neutrinoproxy.server.dal.entity.DomainNameDO; +import org.dromara.neutrinoproxy.server.dal.entity.UserDO; +import org.dromara.neutrinoproxy.server.util.ParamCheckUtil; +import org.h2.schema.Domain; +import org.noear.solon.annotation.Component; +import org.noear.solon.core.handle.UploadedFile; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.util.*; +import java.util.function.Function; +import java.util.stream.Collectors; + +/** + * @author Mirac + * @date 21/7/2024 + */ +@Slf4j +@Component +public class DomainService { + @Db + private DomainMapper domainMapper; + @Db + private UserMapper userMapper; + + public PageInfo page(PageQuery pageQuery, DomainListReq req) { +// Page page = new Page<>(pageQuery.getCurrent(), pageQuery.getSize()); +// LambdaQueryWrapper queryWrapper = Wrappers.lambdaQuery() +// .eq(req.getEnable() != null, DomainNameDO::getEnable, req.getEnable()) +// .eq(req.getUserId() != null, DomainNameDO::getUserId, req.getUserId()); +// Page page = domainMapper.selectPage(page, queryWrapper); + Page page = domainMapper.selectPage(new Page<>(pageQuery.getCurrent(), pageQuery.getSize()), new LambdaQueryWrapper() + .eq(req.getEnable() != null, DomainNameDO::getEnable, req.getEnable()) + .eq(req.getUserId() != null, DomainNameDO::getUserId, req.getUserId()) + .orderByAsc(Arrays.asList(DomainNameDO::getUserId, DomainNameDO::getId)) + ); + List resList = page.getRecords().stream().map(DomainNameDO::toRes).collect(Collectors.toList()); + if (CollectionUtils.isEmpty(page.getRecords())) { + return PageInfo.of(resList, page); + } + Set userIds = resList.stream().map(DomainListRes::getUserId).collect(Collectors.toSet()); + List userDOList = userMapper.findByIds(userIds); + Map userMap = userDOList.stream().collect(Collectors.toMap(UserDO::getId, c -> c)); + for (DomainListRes item : resList) { + UserDO userDO = userMap.get(item.getUserId()); + if (null != userDO) { + item.setUserName(userDO.getName()); + } + } + return PageInfo.of(resList, page); + } + + /** + * 创建域名 + * @param req + */ + public void create(DomainCreateReq req, UploadedFile jks) throws IOException { + DomainNameDO domainNameDO = new DomainNameDO(); + if (null != jks) { + ParamCheckUtil.checkNotEmpty(req.getKeyStorePassword(), "keyStorePassword"); + + InputStream content = jks.getContent(); + byte[] byteArray = toByteArray(content); + domainNameDO.setJks(byteArray); + domainNameDO.setKeyStorePassword(req.getKeyStorePassword()); + } + Integer userId = SystemContextHolder.getUserId(); + Date now = new Date(); + domainNameDO.setDomain(req.getDomain()); + domainNameDO.setIsDefault(DefaultDomainStatusEnum.DISABLE.getStatus()); + domainNameDO.setForceHttps(HttpsStatusEnum.DISABLE_ONLY_HTTPS.getStatus()); + domainNameDO.setUserId(userId); + domainNameDO.setEnable(EnableStatusEnum.ENABLE.getStatus()); + domainNameDO.setCreateTime(now); + domainNameDO.setUpdateTime(now); + domainMapper.insert(domainNameDO); + } + + /** + * 将 InputStream 转换为 byte[] + */ + private byte[] toByteArray(InputStream input) throws IOException { + ByteArrayOutputStream buffer = new ByteArrayOutputStream(); + int nRead; + byte[] data = new byte[1024]; + while ((nRead = input.read(data, 0, data.length)) != -1) { + buffer.write(data, 0, nRead); + } + buffer.flush(); + return buffer.toByteArray(); + } + + public void update(DomainUpdateReq req, UploadedFile jks) throws IOException { + DomainNameDO domainNameCheck = domainMapper.checkRepeat(req.getDomain(), Sets.newHashSet(req.getId())); + ParamCheckUtil.checkMustNull(domainNameCheck, ExceptionConstant.DOMAIN_NAME_CANNOT_REPEAT); + LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>(); + updateWrapper.eq(DomainNameDO::getId, req.getId()); + if (null != jks) { + ParamCheckUtil.checkNotEmpty(req.getKeyStorePassword(), "keyStorePassword"); + + InputStream content = jks.getContent(); + byte[] byteArray = toByteArray(content); + updateWrapper.set(DomainNameDO::getKeyStorePassword, req.getKeyStorePassword()); + updateWrapper.set(DomainNameDO::getJks, byteArray); + } + updateWrapper.set(DomainNameDO::getDomain, req.getDomain()); + updateWrapper.set(DomainNameDO::getUpdateTime, new Date()); + int update = domainMapper.update(updateWrapper); + System.out.println(update); + } +} From f70eb85419195cec8160a1d9c8ac3ce0908f286e Mon Sep 17 00:00:00 2001 From: suxiang <2585546823@qq.com> Date: Mon, 22 Jul 2024 23:23:40 +0800 Subject: [PATCH 04/41] =?UTF-8?q?add=20TODO:=20jks=E5=AF=86=E7=A0=81?= =?UTF-8?q?=E4=B8=8D=E4=B8=BA=E7=A9=BA=E4=BB=8D=E6=97=A0=E6=B3=95=E9=80=9A?= =?UTF-8?q?=E8=BF=87=E9=AA=8C=E8=AF=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- neutrino-proxy-admin/src/views/proxy/domain.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/neutrino-proxy-admin/src/views/proxy/domain.vue b/neutrino-proxy-admin/src/views/proxy/domain.vue index e1a3d243..f94ba630 100644 --- a/neutrino-proxy-admin/src/views/proxy/domain.vue +++ b/neutrino-proxy-admin/src/views/proxy/domain.vue @@ -190,7 +190,7 @@ ], filePassword: [ { required: false, message: 'jks密码不能为空', trigger: 'blur' } - ] + ]// TODO jks密码不为空仍无法通过验证 }, downloadLoading: false, selectObj: { From 571152b58afa886bed1811a6a47a310979d5ded8 Mon Sep 17 00:00:00 2001 From: suxiang <2585546823@qq.com> Date: Tue, 23 Jul 2024 12:07:12 +0800 Subject: [PATCH 05/41] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E5=9F=9F=E5=90=8D?= =?UTF-8?q?=E7=8A=B6=E6=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- neutrino-proxy-admin/src/api/domain.js | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/neutrino-proxy-admin/src/api/domain.js b/neutrino-proxy-admin/src/api/domain.js index a313b265..ca9100cd 100644 --- a/neutrino-proxy-admin/src/api/domain.js +++ b/neutrino-proxy-admin/src/api/domain.js @@ -23,7 +23,7 @@ export function updateEnableStatus(id, enable) { id: id, enable: enable } - }).use + }) } export function createDomain(data) { @@ -41,3 +41,24 @@ export function updateDomain(data) { data }) } + +export function deleteDomain(id) { + return request({ + url: '/domain/delete', + method: 'post', + params: { + id: id + } + }) +} + +export function updateDefaultStatus(id, isDefault) { + return request({ + url: '/domain/update/default-status', + method: 'post', + data: { + id: id, + isDefault: isDefault + } + }) +} From 1145467c11e40453a2dcb06f85fbec612f459fa5 Mon Sep 17 00:00:00 2001 From: suxiang <2585546823@qq.com> Date: Tue, 23 Jul 2024 12:08:14 +0800 Subject: [PATCH 06/41] =?UTF-8?q?=E5=9F=9F=E5=90=8D=E7=AE=A1=E7=90=86?= =?UTF-8?q?=EF=BC=9A=E6=9B=B4=E6=96=B0=E5=9F=9F=E5=90=8D=E7=8A=B6=E6=80=81?= =?UTF-8?q?&=E8=AE=BE=E7=BD=AE=E9=BB=98=E8=AE=A4=E5=9F=9F=E5=90=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/views/proxy/domain.vue | 17 +++++++- .../server/controller/DomainController.java | 37 ++++++++++++++-- .../controller/req/proxy/DomainDeleteReq.java | 15 +++++++ .../proxy/DomainUpdateDefaultStatusReq.java | 22 ++++++++++ .../proxy/DomainUpdateEnableStatusReq.java | 21 ++++++++++ .../proxy/DomainUpdateDefaultStatusRes.java | 8 ++++ .../proxy/DomainUpdateEnableStatusRes.java | 8 ++++ .../server/dal/DomainMapper.java | 8 ++++ .../server/service/DomainService.java | 42 +++++++++++++++++-- 9 files changed, 170 insertions(+), 8 deletions(-) create mode 100644 neutrino-proxy-server/src/main/java/org/dromara/neutrinoproxy/server/controller/req/proxy/DomainDeleteReq.java create mode 100644 neutrino-proxy-server/src/main/java/org/dromara/neutrinoproxy/server/controller/req/proxy/DomainUpdateDefaultStatusReq.java create mode 100644 neutrino-proxy-server/src/main/java/org/dromara/neutrinoproxy/server/controller/req/proxy/DomainUpdateEnableStatusReq.java create mode 100644 neutrino-proxy-server/src/main/java/org/dromara/neutrinoproxy/server/controller/res/proxy/DomainUpdateDefaultStatusRes.java create mode 100644 neutrino-proxy-server/src/main/java/org/dromara/neutrinoproxy/server/controller/res/proxy/DomainUpdateEnableStatusRes.java diff --git a/neutrino-proxy-admin/src/views/proxy/domain.vue b/neutrino-proxy-admin/src/views/proxy/domain.vue index f94ba630..a5a273b2 100644 --- a/neutrino-proxy-admin/src/views/proxy/domain.vue +++ b/neutrino-proxy-admin/src/views/proxy/domain.vue @@ -55,6 +55,8 @@