Compare commits

...

23 Commits

Author SHA1 Message Date
李佳航
387ed53328 Merge pull request #22 from lijiahangmax/dev
Dev
2024-06-11 13:20:15 +08:00
lijiahang
c9cbc5fd55 🔖 升级版本. 2024-06-11 12:50:42 +08:00
lijiahang
ae03460a33 优化会话关闭处理逻辑. 2024-06-11 12:31:16 +08:00
lijiahang
4b060a864a 登录历史参数化. 2024-06-11 12:28:24 +08:00
李佳航
07e8e63ee6 Merge pull request #21 from lijiahangmax/main
merge
2024-06-11 11:28:39 +08:00
lijiahang
ab1d4ed97f 🔨 规范化配置. 2024-06-11 11:12:44 +08:00
lijiahang
2bd7dfd5b8 🔨 规范化注释. 2024-06-07 16:05:26 +08:00
lijiahang
c39049e5f5 🔨 规范化包结构. 2024-06-07 15:41:52 +08:00
李佳航
5113aa63bd Merge pull request #20 from lijiahangmax/dev
Dev
2024-06-06 13:00:36 +08:00
lijiahang
518fd8c839 🔖 升级版本. 2024-06-06 12:02:35 +08:00
lijiahang
a046faaa07 🔨 清理后提示. 2024-06-05 10:27:06 +08:00
lijiahangmax
dcf25392ff ⬆️ 升级 stylelint 版本. 2024-06-04 21:49:51 +08:00
lijiahang
7f24948efa 修改下载文件逻辑. 2024-06-04 20:01:05 +08:00
lijiahang
59d9739f36 优化文件下载方式. 2024-06-04 18:34:19 +08:00
lijiahang
26a6d08d96 🔨 修改 redisson 配置. 2024-06-04 11:33:09 +08:00
lijiahang
cd59c51344 升级依赖版本. 2024-06-04 10:47:32 +08:00
李佳航
8dec98406d Merge pull request #19 from lijiahangmax/dev
Dev
2024-06-03 13:33:14 +08:00
lijiahang
9386bfc5c1 📝 升级文档. 2024-06-03 13:12:50 +08:00
lijiahang
370272ca43 🔖 升级版本. 2024-06-03 11:53:53 +08:00
lijiahang
5c6758c8e7 批量删除前端. 2024-06-03 10:49:05 +08:00
lijiahang
11606e25bb 批量删除后端服务. 2024-06-03 10:19:48 +08:00
lijiahang
285f0532d3 🎨 修改代码格式. 2024-05-31 16:32:45 +08:00
lijiahang
7bfa8a73be 💄 修改样式. 2024-05-31 13:36:49 +08:00
274 changed files with 3930 additions and 1969 deletions

View File

@@ -51,12 +51,13 @@
## 演示环境 ## 演示环境
演示地址: http://101.43.254.243:1081/ * 🔗 演示地址: http://101.43.254.243:1081/
演示账号: admin/admin * 🔏 演示账号: admin/admin
* ⭐ 体验后可以点一下 `star` 这对我很重要! [github](https://github.com/lijiahangmax/orion-visor) [gitee](https://gitee.com/lijiahangmax/orion-visor)
⭐ 体验后可以点一下 `star` 这对我很重要! * 🌈 如果本项目对你有帮助请帮忙推广一下 让更多的人知道此项目!
🌈 如果本项目对你有帮助请帮忙推广一下 让更多的人知道此项目! * 🎭 演示环境部分功能不可用, 完整功能请本地部署!
[github](https://github.com/lijiahangmax/orion-visor) [gitee](https://gitee.com/lijiahangmax/orion-visor) * 📛 演示环境请不要随便删除数据!
* 📧 如果演示环境不可用请联系我!
## 快速开始 ## 快速开始
@@ -66,16 +67,16 @@ git clone https://github.com/lijiahangmax/orion-visor
cd orion-visor cd orion-visor
# 启动 # 启动
docker compose up -d docker compose up -d
# 等待后端服务启动后 (2min±) 访问 http://localhost:1081/
``` ```
## 项目文档 ## 项目文档
* [文档地址](https://lijiahangmax.github.io/orion-visor/#/) * [文档地址](https://lijiahangmax.github.io/open-orion/orion-visor/)
* [docker安装](https://lijiahangmax.github.io/orion-visor/#/quickstart/docker-install) * [安装文档](https://lijiahangmax.github.io/open-orion/orion-visor/quickstart/docker.html)
* [普通安装](https://lijiahangmax.github.io/orion-visor/#/quickstart/install) * [更新日志](https://lijiahangmax.github.io/open-orion/orion-visor/update/change-log.html)
* [更新日志](https://lijiahangmax.github.io/orion-visor/#/about/change-log) * [操作手册](https://lijiahangmax.github.io/open-orion/orion-visor/operator/asset.html)
* [操作手册](https://lijiahangmax.github.io/orion-visor/#/operator/asset) * [常见问题](https://lijiahangmax.github.io/open-orion/orion-visor/support/faq.html)
* [常见问题](https://lijiahangmax.github.io/orion-visor/#/quickstart/faq)
## 技术栈 ## 技术栈

View File

@@ -1,7 +1,7 @@
version: '3.3' version: '3.3'
services: services:
orion-visor-service: orion-visor-service:
image: registry.cn-hangzhou.aliyuncs.com/lijiahangmax/orion-visor-service:2.0.3 image: registry.cn-hangzhou.aliyuncs.com/lijiahangmax/orion-visor-service:2.0.6
ports: ports:
- 1081:80 - 1081:80
environment: environment:
@@ -20,7 +20,7 @@ services:
- orion-visor-mysql - orion-visor-mysql
- orion-visor-redis - orion-visor-redis
orion-visor-mysql: orion-visor-mysql:
image: registry.cn-hangzhou.aliyuncs.com/lijiahangmax/orion-visor-mysql:2.0.3 image: registry.cn-hangzhou.aliyuncs.com/lijiahangmax/orion-visor-mysql:2.0.6
privileged: true privileged: true
ports: ports:
- 3307:3306 - 3307:3306
@@ -34,7 +34,7 @@ services:
- /data/orion-visor-space/docker-volumes/orion-visor-mysql/var-lib-mysql-files:/var/lib/mysql-files - /data/orion-visor-space/docker-volumes/orion-visor-mysql/var-lib-mysql-files:/var/lib/mysql-files
- /data/orion-visor-space/docker-volumes/orion-visor-mysql/etc-mysql:/etc/mysql - /data/orion-visor-space/docker-volumes/orion-visor-mysql/etc-mysql:/etc/mysql
orion-visor-redis: orion-visor-redis:
image: registry.cn-hangzhou.aliyuncs.com/lijiahangmax/orion-visor-redis:2.0.3 image: registry.cn-hangzhou.aliyuncs.com/lijiahangmax/orion-visor-redis:2.0.6
privileged: true privileged: true
ports: ports:
- 6380:6379 - 6380:6379

View File

@@ -1,5 +1,5 @@
#/bin/bash #/bin/bash
version=2.0.3 version=2.0.6
cp -r ../../sql ./sql cp -r ../../sql ./sql
docker build -t orion-visor-mysql:${version} . docker build -t orion-visor-mysql:${version} .
rm -rf ./sql rm -rf ./sql

View File

@@ -1,5 +1,5 @@
#/bin/bash #/bin/bash
version=2.0.3 version=2.0.6
docker build -t orion-visor-redis:${version} . docker build -t orion-visor-redis:${version} .
docker tag orion-visor-redis:${version} registry.cn-hangzhou.aliyuncs.com/lijiahangmax/orion-visor-redis:${version} docker tag orion-visor-redis:${version} registry.cn-hangzhou.aliyuncs.com/lijiahangmax/orion-visor-redis:${version}
docker push registry.cn-hangzhou.aliyuncs.com/lijiahangmax/orion-visor-redis:${version} docker push registry.cn-hangzhou.aliyuncs.com/lijiahangmax/orion-visor-redis:${version}

View File

@@ -1,5 +1,5 @@
#/bin/bash #/bin/bash
version=2.0.3 version=2.0.6
mv ../../orion-visor-launch/target/orion-visor-launch.jar ./orion-visor-launch.jar mv ../../orion-visor-launch/target/orion-visor-launch.jar ./orion-visor-launch.jar
mv ../../orion-visor-ui/dist ./dist mv ../../orion-visor-ui/dist ./dist
docker build -t orion-visor-service:${version} . docker build -t orion-visor-service:${version} .

View File

@@ -40,6 +40,12 @@
------------------------------ ------------------------------
<p><b>⛔⛔此页面已不再维护, 请跳转至
<a target="_blank" href="https://lijiahangmax.github.io/open-orion/orion-visor">这里</a>
查看最新文档 ❗</b></p>
------------------------------
**`orion-visor`** 提供一站式服务器运维解决方案。 **`orion-visor`** 提供一站式服务器运维解决方案。
* **资产管理**:支持对资产进行分组,实现对主机、密钥和身份的统一管理和授权。 * **资产管理**:支持对资产进行分组,实现对主机、密钥和身份的统一管理和授权。
@@ -70,9 +76,8 @@ docker compose up -d
## 项目文档 ## 项目文档
* [文档地址](https://lijiahangmax.github.io/orion-visor/#/) * [文档地址](/)
* [docker安装](/quickstart/docker-install) * [安装文档](/quickstart/docker-install)
* [普通安装](/quickstart/install)
* [更新日志](/about/change-log) * [更新日志](/about/change-log)
* [操作手册](/operator/asset) * [操作手册](/operator/asset)
* [常见问题](/quickstart/faq) * [常见问题](/quickstart/faq)

View File

@@ -1,4 +1,4 @@
# orion-visor <small>2.0.3</small> # orion-visor
> 一款高颜值、现代化的智能运维&轻量堡垒机平台。 > 一款高颜值、现代化的智能运维&轻量堡垒机平台。

View File

@@ -14,11 +14,11 @@
<url>https://github.com/lijiahangmax/orion-visor</url> <url>https://github.com/lijiahangmax/orion-visor</url>
<properties> <properties>
<revision>2.0.3</revision> <revision>2.0.6</revision>
<spring.boot.version>2.7.17</spring.boot.version> <spring.boot.version>2.7.17</spring.boot.version>
<spring.boot.admin.version>2.7.15</spring.boot.admin.version> <spring.boot.admin.version>2.7.15</spring.boot.admin.version>
<flatten.maven.plugin.version>1.5.0</flatten.maven.plugin.version> <flatten.maven.plugin.version>1.5.0</flatten.maven.plugin.version>
<orion.kit.revision>1.0.7</orion.kit.revision> <orion.kit.version>1.0.7</orion.kit.version>
<aspectj.version>1.9.7</aspectj.version> <aspectj.version>1.9.7</aspectj.version>
<lombok.version>1.18.26</lombok.version> <lombok.version>1.18.26</lombok.version>
<springdoc.version>1.6.15</springdoc.version> <springdoc.version>1.6.15</springdoc.version>
@@ -50,7 +50,7 @@
<dependency> <dependency>
<groupId>io.github.lijiahangmax</groupId> <groupId>io.github.lijiahangmax</groupId>
<artifactId>orion-all</artifactId> <artifactId>orion-all</artifactId>
<version>${orion.kit.revision}</version> <version>${orion.kit.version}</version>
<exclusions> <exclusions>
<exclusion> <exclusion>
<artifactId>orion-log</artifactId> <artifactId>orion-log</artifactId>

View File

@@ -0,0 +1,17 @@
package com.orion.visor.framework.common.annotation;
import java.lang.annotation.*;
/**
* 保留
*
* @author Jiahang Li
* @version 1.0.0
* @since 2024/6/6 15:26
*/
@Target({ElementType.TYPE, ElementType.FIELD, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Keep {
}

View File

@@ -14,7 +14,7 @@ public interface AppConst extends OrionConst {
/** /**
* 同 ${orion.version} 迭代时候需要手动更改 * 同 ${orion.version} 迭代时候需要手动更改
*/ */
String VERSION = "2.0.3"; String VERSION = "2.0.6";
String ORION_VISOR = "orion-visor"; String ORION_VISOR = "orion-visor";

View File

@@ -25,8 +25,6 @@ public interface Const extends com.orion.lang.constant.Const, FieldConst, CnCons
Integer DEFAULT_SORT = 10; Integer DEFAULT_SORT = 10;
int LOGIN_HISTORY_COUNT = 30;
Long NONE_ID = -1L; Long NONE_ID = -1L;
Integer DEFAULT_VERSION = 1; Integer DEFAULT_VERSION = 1;

View File

@@ -97,4 +97,6 @@ public interface ErrorMessage {
String PLEASE_CHECK_HOST_SSH = "请检查主机 {} 是否存在/权限/SSH配置"; String PLEASE_CHECK_HOST_SSH = "请检查主机 {} 是否存在/权限/SSH配置";
String CLIENT_ABORT = "手动中断";
} }

View File

@@ -14,13 +14,19 @@ import lombok.Getter;
@AllArgsConstructor @AllArgsConstructor
public enum MovePosition { public enum MovePosition {
// 拖拽到目标元素上 /**
* 拖拽到目标元素上
*/
TOP(-1), TOP(-1),
// 拖拽到目标元素中 /**
* 拖拽到目标元素中
*/
IN(0), IN(0),
// 拖拽到目标元素下 /**
* 拖拽到目标元素下
*/
BOTTOM(1), BOTTOM(1),
; ;

View File

@@ -36,24 +36,47 @@ public class BannerApplicationRunner implements ApplicationRunner {
@Value("${management.endpoints.web.base-path:''}") @Value("${management.endpoints.web.base-path:''}")
private String managementEndpoints; private String managementEndpoints;
@Value("${springdoc.api-docs.enabled}")
private Boolean apiDocsEnabled;
@Value("${spring.datasource.druid.stat-view-servlet.enabled}")
private Boolean druidConsoleEnabled;
@Value("#{'${management.endpoints.web.exposure.include}' != 'shutdown'}")
private Boolean springBootActuatorEnabled;
@Value("${spring.boot.admin.client.enabled}")
private Boolean springBootAdminClientEnabled;
@Override @Override
public void run(ApplicationArguments args) { public void run(ApplicationArguments args) {
String line = AnsiAppender.create() AnsiAppender appender = AnsiAppender.create()
.append(AnsiForeground.BRIGHT_GREEN, ":: orion-visor-launch v" + version + " 服务已启动(" + env + ") ::\n") .append(AnsiForeground.BRIGHT_GREEN, ":: orion-visor-launch v" + version + " 服务已启动(" + env + ") ::\n");
.append(AnsiForeground.BRIGHT_GREEN, ":: swagger 文档 ") // swagger 地址
.append(AnsiForeground.BRIGHT_BLUE, "http://127.0.0.1:" + port + "/doc.html\n") if (apiDocsEnabled) {
.append(AnsiForeground.BRIGHT_GREEN, ":: druid console ") appender.append(AnsiForeground.BRIGHT_GREEN, ":: swagger 文档 ")
.append(AnsiForeground.BRIGHT_BLUE, "http://127.0.0.1:" + port + "/druid/index.html\n") .append(AnsiForeground.BRIGHT_BLUE, "http://127.0.0.1:" + port + "/doc.html\n");
.append(AnsiForeground.BRIGHT_GREEN, ":: actuator endpoint ") }
.append(AnsiForeground.BRIGHT_BLUE, "http://127.0.0.1:" + port + managementEndpoints + "\n") // druid 控制台
.append(AnsiForeground.BRIGHT_GREEN, ":: admin console ") if (druidConsoleEnabled) {
.append(AnsiForeground.BRIGHT_BLUE, "http://127.0.0.1:" + port + adminSeverContextPath + "\n") appender.append(AnsiForeground.BRIGHT_GREEN, ":: druid console ")
.append(AnsiForeground.BRIGHT_GREEN, ":: server 健康检测 ") .append(AnsiForeground.BRIGHT_BLUE, "http://127.0.0.1:" + port + "/druid/index.html\n");
.append(AnsiForeground.BRIGHT_BLUE, "curl -X GET --location \"http://127.0.0.1:" + port + apiPrefix + "/server/bootstrap/health\"") }
.toString(); // admin actuator 端点
if (springBootActuatorEnabled) {
appender.append(AnsiForeground.BRIGHT_GREEN, ":: actuator endpoint ")
.append(AnsiForeground.BRIGHT_BLUE, "http://127.0.0.1:" + port + managementEndpoints + "\n");
}
// admin server 控制台
if (springBootAdminClientEnabled) {
appender.append(AnsiForeground.BRIGHT_GREEN, ":: admin console ")
.append(AnsiForeground.BRIGHT_BLUE, "http://127.0.0.1:" + port + adminSeverContextPath + "\n");
}
appender.append(AnsiForeground.BRIGHT_GREEN, ":: server 健康检测 ")
.append(AnsiForeground.BRIGHT_BLUE, "curl -X GET --location \"http://127.0.0.1:" + port + apiPrefix + "/server/bootstrap/health\"");
Threads.start(() -> { Threads.start(() -> {
Threads.sleep(1000L); Threads.sleep(1000L);
System.out.println(line); System.out.println(appender);
}); });
} }

View File

@@ -8,4 +8,5 @@ ${AnsiColor.BRIGHT_GREEN}:: Application Name ${AnsiColor.BLUE}${spring.appli
${AnsiColor.BRIGHT_GREEN}:: Application Version ${AnsiColor.BLUE}${orion.version} ${AnsiColor.BRIGHT_GREEN}:: Application Version ${AnsiColor.BLUE}${orion.version}
${AnsiColor.BRIGHT_GREEN}:: SpringBoot Version ${AnsiColor.BLUE}${spring-boot.version} ${AnsiColor.BRIGHT_GREEN}:: SpringBoot Version ${AnsiColor.BLUE}${spring-boot.version}
${AnsiColor.BRIGHT_GREEN}:: Active Profile ${AnsiColor.BLUE}${spring.profiles.active} ${AnsiColor.BRIGHT_GREEN}:: Active Profile ${AnsiColor.BLUE}${spring.profiles.active}
${AnsiColor.BRIGHT_GREEN}:: Demo Mode ${AnsiColor.BLUE}${orion.demo}
${AnsiColor.DEFAULT} ${AnsiColor.DEFAULT}

View File

@@ -72,9 +72,9 @@ public class PrettyLogPrinterInterceptor extends AbstractLogPrinterInterceptor {
} }
Method method = invocation.getMethod(); Method method = invocation.getMethod();
// 方法签名 // 方法签名
requestLog.append("\tmethodSign: ").append(method.getDeclaringClass().getName()).append('#') // requestLog.append("\tmethodSign: ").append(method.getDeclaringClass().getName()).append('#')
.append(method.getName()).append("\n"); // .append(method.getName()).append("\n");
// 参数 // 方法参数
requestLog.append("\tparameter: ").append(this.requestToString(method, invocation.getArguments())); requestLog.append("\tparameter: ").append(this.requestToString(method, invocation.getArguments()));
log.info(requestLog.toString()); log.info(requestLog.toString());
} }

View File

@@ -73,8 +73,8 @@ public class RowLogPrinterInterceptor extends AbstractLogPrinterInterceptor impl
} }
Method method = invocation.getMethod(); Method method = invocation.getMethod();
// 方法签名 // 方法签名
fields.put(METHOD_SIGN, method.getDeclaringClass().getName() + "#" + method.getName()); // fields.put(METHOD_SIGN, method.getDeclaringClass().getName() + "#" + method.getName());
// 参数 // 方法参数
fields.put(PARAMETER, this.requestToString(method, invocation.getArguments())); fields.put(PARAMETER, this.requestToString(method, invocation.getArguments()));
log.info("api请求-开始 {}", JSON.toJSONString(fields)); log.info("api请求-开始 {}", JSON.toJSONString(fields));
fields.clear(); fields.clear();

View File

@@ -62,10 +62,6 @@ public class CustomFileFilter {
if (!table.isEnableCache()) { if (!table.isEnableCache()) {
files.removeIf(file -> isServerCacheFile(file.getTemplatePath())); files.removeIf(file -> isServerCacheFile(file.getTemplatePath()));
} }
// 不生成导出文件
if (!table.isEnableExport()) {
files.removeIf(file -> isExportFile(file.getTemplatePath()));
}
// 不生成操作日志文件 // 不生成操作日志文件
if (!table.isEnableOperatorLog()) { if (!table.isEnableOperatorLog()) {
files.removeIf(file -> isOperatorLogFile(file.getTemplatePath())); files.removeIf(file -> isOperatorLogFile(file.getTemplatePath()));

View File

@@ -73,16 +73,6 @@ public class ServerTemplate extends Template {
return this; return this;
} }
// /**
// * 生成导出
// *
// * @return this
// */
// public ServerTemplate enableExport() {
// table.enableExport = true;
// return this;
// }
/** /**
* 不生成单元测试 * 不生成单元测试
* *

View File

@@ -43,11 +43,6 @@ public class Table {
*/ */
protected boolean enableUnitTest; protected boolean enableUnitTest;
/**
* 是否生成导出
*/
protected boolean enableExport;
/** /**
* 是否可缓存 * 是否可缓存
*/ */

View File

@@ -17,6 +17,7 @@ public class VueTemplate extends Template {
public VueTemplate(Table table, String module, String feature) { public VueTemplate(Table table, String module, String feature) {
super(table); super(table);
table.enableVue = true; table.enableVue = true;
table.enableRowSelection = true;
table.module = module; table.module = module;
table.feature = feature; table.feature = feature;
} }
@@ -54,12 +55,12 @@ public class VueTemplate extends Template {
} }
/** /**
* 列表可多选 * 关闭列表可多选
* *
* @return this * @return this
*/ */
public VueTemplate enableRowSelection() { public VueTemplate disableRowSelection() {
table.enableRowSelection = true; table.enableRowSelection = false;
return this; return this;
} }

View File

@@ -68,19 +68,5 @@ Authorization: {{token}}
${httpComment} ${apiComment.batchDelete} ${httpComment} ${apiComment.batchDelete}
DELETE {{baseUrl}}/${package.ModuleName}/${typeHyphen}/batch-delete?idList=1,2,3 DELETE {{baseUrl}}/${package.ModuleName}/${typeHyphen}/batch-delete?idList=1,2,3
Authorization: {{token}} Authorization: {{token}}
#if($meta.enableExport)
${httpComment} ${apiComment.export}
POST {{baseUrl}}/${package.ModuleName}/${typeHyphen}/export
Content-Type: application/json
Authorization: {{token}}
{
#foreach($field in ${table.fields})
"${field.propertyName}": ""#if($foreach.hasNext),#end
#end
}
#end
${httpComment} ${httpComment}

View File

@@ -141,19 +141,6 @@ public class ${table.controllerName} {
public Integer batchDelete${type}(@RequestParam("idList") List<Long> idList) { public Integer batchDelete${type}(@RequestParam("idList") List<Long> idList) {
return ${typeLower}Service.delete${type}ByIdList(idList); return ${typeLower}Service.delete${type}ByIdList(idList);
} }
#if($meta.enableExport)
#if($meta.enableOperatorLog)
@OperatorLog(${type}OperatorType.EXPORT)
#end
@PostMapping("/export")
@Operation(summary = "${apiComment.export}")
@PreAuthorize("@ss.hasPermission('${package.ModuleName}:${typeHyphen}:export')")
public void export${type}(@Validated @RequestBody ${type}QueryRequest request,
HttpServletResponse response) throws IOException {
${typeLower}Service.export${type}(request, response);
}
#end
} }

View File

@@ -28,10 +28,6 @@ public interface ${type}Convert {
${type}DO to(${type}QueryRequest request); ${type}DO to(${type}QueryRequest request);
${type}VO to(${type}DO domain); ${type}VO to(${type}DO domain);
#if($meta.enableExport)
${type}Export toExport(${type}DO domain);
#end
List<${type}VO> to(List<${type}DO> list); List<${type}VO> to(List<${type}DO> list);

View File

@@ -21,10 +21,6 @@ public class ${type}OperatorType extends InitializingOperatorTypes {
public static final String UPDATE = "${typeHyphen}:update"; public static final String UPDATE = "${typeHyphen}:update";
public static final String DELETE = "${typeHyphen}:delete"; public static final String DELETE = "${typeHyphen}:delete";
#if($meta.enableExport)
public static final String EXPORT = "${typeHyphen}:export";
#end
@Override @Override
public OperatorType[] types() { public OperatorType[] types() {
@@ -32,9 +28,6 @@ public class ${type}OperatorType extends InitializingOperatorTypes {
new OperatorType(L, CREATE, "创建$!{table.comment}"), new OperatorType(L, CREATE, "创建$!{table.comment}"),
new OperatorType(M, UPDATE, "更新$!{table.comment}"), new OperatorType(M, UPDATE, "更新$!{table.comment}"),
new OperatorType(H, DELETE, "删除$!{table.comment}"), new OperatorType(H, DELETE, "删除$!{table.comment}"),
#if($meta.enableExport)
new OperatorType(M, EXPORT, "导出$!{table.comment}"),
#end
}; };
} }

View File

@@ -5,13 +5,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.orion.lang.define.wrapper.DataGrid; import com.orion.lang.define.wrapper.DataGrid;
import com.orion.lang.utils.Strings; import com.orion.lang.utils.Strings;
import com.orion.lang.utils.collect.Lists; import com.orion.lang.utils.collect.Lists;
#if($meta.enableExport)
import com.orion.office.excel.writer.exporting.ExcelExport;
#end
import com.orion.visor.framework.common.constant.ErrorMessage; import com.orion.visor.framework.common.constant.ErrorMessage;
#if($meta.enableExport)
import com.orion.visor.framework.common.utils.FileNames;
#end
import com.orion.visor.framework.common.utils.Valid; import com.orion.visor.framework.common.utils.Valid;
#if($meta.enableCache) #if($meta.enableCache)
import com.orion.visor.framework.redis.core.utils.RedisMaps; import com.orion.visor.framework.redis.core.utils.RedisMaps;
@@ -23,18 +17,11 @@ import ${pkg}.*;
import ${package.Entity}.${entity}; import ${package.Entity}.${entity};
import ${package.Mapper}.${table.mapperName}; import ${package.Mapper}.${table.mapperName};
import ${package.Service}.${table.serviceName}; import ${package.Service}.${table.serviceName};
#if($meta.enableExport)
import com.orion.web.servlet.web.Servlets;
#end
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource; import javax.annotation.Resource;
#if($meta.enableExport)
import javax.servlet.http.HttpServletResponse;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
#end
import java.util.Comparator; import java.util.Comparator;
import java.util.List; import java.util.List;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@@ -54,6 +41,7 @@ public class ${table.serviceImplName} implements ${table.serviceName} {
private ${type}DAO ${typeLower}DAO; private ${type}DAO ${typeLower}DAO;
@Override @Override
@Transactional(rollbackFor = Exception.class)
public Long create${type}(${type}CreateRequest request) { public Long create${type}(${type}CreateRequest request) {
log.info("${type}Service-create${type} request: {}", JSON.toJSONString(request)); log.info("${type}Service-create${type} request: {}", JSON.toJSONString(request));
// 转换 // 转换
@@ -72,6 +60,7 @@ public class ${table.serviceImplName} implements ${table.serviceName} {
} }
@Override @Override
@Transactional(rollbackFor = Exception.class)
public Integer update${type}ById(${type}UpdateRequest request) { public Integer update${type}ById(${type}UpdateRequest request) {
Long id = Valid.notNull(request.getId(), ErrorMessage.ID_MISSING); Long id = Valid.notNull(request.getId(), ErrorMessage.ID_MISSING);
log.info("${type}Service-update${type}ById id: {}, request: {}", id, JSON.toJSONString(request)); log.info("${type}Service-update${type}ById id: {}, request: {}", id, JSON.toJSONString(request));
@@ -93,6 +82,7 @@ public class ${table.serviceImplName} implements ${table.serviceName} {
} }
@Override @Override
@Transactional(rollbackFor = Exception.class)
public Integer update${type}(${type}QueryRequest query, ${type}UpdateRequest update) { public Integer update${type}(${type}QueryRequest query, ${type}UpdateRequest update) {
log.info("${type}Service.update${type} query: {}, update: {}", JSON.toJSONString(query), JSON.toJSONString(update)); log.info("${type}Service.update${type} query: {}, update: {}", JSON.toJSONString(query), JSON.toJSONString(update));
// 条件 // 条件
@@ -179,6 +169,7 @@ public class ${table.serviceImplName} implements ${table.serviceName} {
} }
@Override @Override
@Transactional(rollbackFor = Exception.class)
public Integer delete${type}ById(Long id) { public Integer delete${type}ById(Long id) {
log.info("${type}Service-delete${type}ById id: {}", id); log.info("${type}Service-delete${type}ById id: {}", id);
// 检查数据是否存在 // 检查数据是否存在
@@ -195,6 +186,7 @@ public class ${table.serviceImplName} implements ${table.serviceName} {
} }
@Override @Override
@Transactional(rollbackFor = Exception.class)
public Integer delete${type}ByIdList(List<Long> idList) { public Integer delete${type}ByIdList(List<Long> idList) {
log.info("${type}Service-delete${type}ByIdList idList: {}", idList); log.info("${type}Service-delete${type}ByIdList idList: {}", idList);
int effect = ${typeLower}DAO.deleteBatchIds(idList); int effect = ${typeLower}DAO.deleteBatchIds(idList);
@@ -207,6 +199,7 @@ public class ${table.serviceImplName} implements ${table.serviceName} {
} }
@Override @Override
@Transactional(rollbackFor = Exception.class)
public Integer delete${type}(${type}QueryRequest request) { public Integer delete${type}(${type}QueryRequest request) {
log.info("${type}Service.delete${type} request: {}", JSON.toJSONString(request)); log.info("${type}Service.delete${type} request: {}", JSON.toJSONString(request));
// 条件 // 条件
@@ -220,26 +213,6 @@ public class ${table.serviceImplName} implements ${table.serviceName} {
#end #end
return effect; return effect;
} }
#if($meta.enableExport)
@Override
public void export${type}(${type}QueryRequest request, HttpServletResponse response) throws IOException {
log.info("${type}Service.export${type} request: {}", JSON.toJSONString(request));
// 条件
LambdaQueryWrapper<${type}DO> wrapper = this.buildQueryWrapper(request);
// 查询
List<${type}Export> rows = ${typeLower}DAO.of(wrapper).list(${type}Convert.MAPPER::toExport);
log.info("${type}Service.export${type} size: {}", rows.size());
// 导出
ByteArrayOutputStream out = new ByteArrayOutputStream();
ExcelExport.create(${type}Export.class)
.addRows(rows)
.write(out)
.close();
// 传输
Servlets.transfer(response, out.toByteArray(), FileNames.exportName(${type}Export.TITLE));
}
#end
/** /**
* 检查对象是否存在 * 检查对象是否存在

View File

@@ -115,16 +115,5 @@ public interface ${table.serviceName} {
* @return effect * @return effect
*/ */
Integer delete${type}(${type}QueryRequest request); Integer delete${type}(${type}QueryRequest request);
#if($meta.enableExport)
/**
* ${apiComment.export}
*
* @param request request
* @param response response
* @throws IOException IOException
*/
void export${type}(${type}QueryRequest request, HttpServletResponse response) throws IOException;
#end
} }

View File

@@ -14,12 +14,7 @@ VALUES
(@MODULE_KEY_ID, 'operatorLogModule', '${package.ModuleName}:${typeHyphen}', '$!{table.comment}', '{}', @MODULE_KEY_MAX_SORT + 10, now(), now(), '1', '1', 0), (@MODULE_KEY_ID, 'operatorLogModule', '${package.ModuleName}:${typeHyphen}', '$!{table.comment}', '{}', @MODULE_KEY_MAX_SORT + 10, now(), now(), '1', '1', 0),
(@TYPE_KEY_ID, 'operatorLogType', '${typeHyphen}:create', '创建$!{table.comment}', '{}', 10, now(), now(), '1', '1', 0), (@TYPE_KEY_ID, 'operatorLogType', '${typeHyphen}:create', '创建$!{table.comment}', '{}', 10, now(), now(), '1', '1', 0),
(@TYPE_KEY_ID, 'operatorLogType', '${typeHyphen}:update', '更新$!{table.comment}', '{}', 20, now(), now(), '1', '1', 0), (@TYPE_KEY_ID, 'operatorLogType', '${typeHyphen}:update', '更新$!{table.comment}', '{}', 20, now(), now(), '1', '1', 0),
#if($meta.enableExport)
(@TYPE_KEY_ID, 'operatorLogType', '${typeHyphen}:delete', '删除$!{table.comment}', '{}', 30, now(), now(), '1', '1', 0),
(@TYPE_KEY_ID, 'operatorLogType', '${typeHyphen}:export', '导出$!{table.comment}', '{}', 40, now(), now(), '1', '1', 0);
#else
(@TYPE_KEY_ID, 'operatorLogType', '${typeHyphen}:delete', '删除$!{table.comment}', '{}', 30, now(), now(), '1', '1', 0); (@TYPE_KEY_ID, 'operatorLogType', '${typeHyphen}:delete', '删除$!{table.comment}', '{}', 30, now(), now(), '1', '1', 0);
#end
#end #end
#if($dictMap.entrySet().size() > 0) #if($dictMap.entrySet().size() > 0)

View File

@@ -133,12 +133,4 @@ export function batchDelete${vue.featureEntity}(idList: Array<number>) {
} }
}); });
} }
#if($meta.enableExport)
/**
* $apiComment.export
*/
export function export${vue.featureEntity}(request: ${vue.featureEntity}QueryRequest) {
return axios.post('/${package.ModuleName}/${typeHyphen}/export', request);
}
#end

View File

@@ -79,12 +79,16 @@
</div> </div>
</template> </template>
<!-- table --> <!-- table -->
#if($vue.enableRowSelection)
<a-table v-model:selected-keys="selectedKeys"
row-key="id"
#else
<a-table row-key="id" <a-table row-key="id"
#end
ref="tableRef" ref="tableRef"
:loading="loading" :loading="loading"
:columns="columns" :columns="columns"
#if($vue.enableRowSelection) #if($vue.enableRowSelection)
v-model:selected-keys="selectedKeys"
:row-selection="rowSelection" :row-selection="rowSelection"
#end #end
:data="tableRenderData" :data="tableRenderData"

View File

@@ -6,7 +6,7 @@ const columns = [
title: 'id', title: 'id',
dataIndex: 'id', dataIndex: 'id',
slotName: 'id', slotName: 'id',
width: 70, width: 100,
align: 'left', align: 'left',
fixed: 'left', fixed: 'left',
}, #foreach($field in ${table.fields})#if("$!field.propertyName" != "id"){ }, #foreach($field in ${table.fields})#if("$!field.propertyName" != "id"){

View File

@@ -7,6 +7,7 @@ import com.orion.visor.framework.redis.configuration.config.RedissonConfig;
import com.orion.visor.framework.redis.core.lock.RedisLocker; import com.orion.visor.framework.redis.core.lock.RedisLocker;
import com.orion.visor.framework.redis.core.utils.RedisUtils; import com.orion.visor.framework.redis.core.utils.RedisUtils;
import org.redisson.api.RedissonClient; import org.redisson.api.RedissonClient;
import org.redisson.config.SingleServerConfig;
import org.redisson.spring.starter.RedissonAutoConfigurationCustomizer; import org.redisson.spring.starter.RedissonAutoConfigurationCustomizer;
import org.springframework.boot.autoconfigure.AutoConfiguration; import org.springframework.boot.autoconfigure.AutoConfiguration;
import org.springframework.boot.autoconfigure.AutoConfigureOrder; import org.springframework.boot.autoconfigure.AutoConfigureOrder;
@@ -14,6 +15,7 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean
import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Lazy; import org.springframework.context.annotation.Lazy;
import org.springframework.context.annotation.Primary;
import org.springframework.data.redis.connection.RedisConnectionFactory; import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.RedisSerializer; import org.springframework.data.redis.serializer.RedisSerializer;
@@ -35,6 +37,7 @@ public class OrionRedisAutoConfiguration {
* @param redisConnectionFactory factory * @param redisConnectionFactory factory
* @return RedisTemplate * @return RedisTemplate
*/ */
@Primary
@Bean @Bean
public RedisTemplate<String, String> redisTemplate(RedisConnectionFactory redisConnectionFactory) { public RedisTemplate<String, String> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
RedisTemplate<String, String> redisTemplate = new RedisTemplate<>(); RedisTemplate<String, String> redisTemplate = new RedisTemplate<>();
@@ -58,6 +61,9 @@ public class OrionRedisAutoConfiguration {
return config -> { return config -> {
config.setThreads(redissonConfig.getThreads()); config.setThreads(redissonConfig.getThreads());
config.setNettyThreads(redissonConfig.getNettyThreads()); config.setNettyThreads(redissonConfig.getNettyThreads());
// 单机配置
SingleServerConfig single = config.useSingleServer();
single.setConnectionMinimumIdleSize(redissonConfig.getMinimumIdleSize());
}; };
} }

View File

@@ -24,9 +24,15 @@ public class RedissonConfig {
*/ */
private Integer nettyThreads; private Integer nettyThreads;
/**
* 最小空闲连接数
*/
private Integer minimumIdleSize;
public RedissonConfig() { public RedissonConfig() {
this.threads = 16; this.threads = 16;
this.nettyThreads = 16; this.nettyThreads = 16;
this.minimumIdleSize = 16;
} }
} }

View File

@@ -18,6 +18,12 @@
"type": "java.lang.Integer", "type": "java.lang.Integer",
"description": "netty 线程数.", "description": "netty 线程数.",
"defaultValue": "16" "defaultValue": "16"
},
{
"name": "spring.redisson.minimum-idle-size",
"type": "java.lang.Integer",
"description": "最小空闲连接数.",
"defaultValue": "16"
} }
] ]
} }

View File

@@ -23,7 +23,6 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Profile;
import org.springframework.http.HttpHeaders; import org.springframework.http.HttpHeaders;
import java.util.HashMap; import java.util.HashMap;
@@ -38,10 +37,9 @@ import java.util.Optional;
* @version 1.0.0 * @version 1.0.0
* @since 2022/6/21 11:22 * @since 2022/6/21 11:22
*/ */
@Profile({"dev"})
@ConditionalOnClass({OpenAPI.class}) @ConditionalOnClass({OpenAPI.class})
@EnableConfigurationProperties(SwaggerConfig.class) @EnableConfigurationProperties(SwaggerConfig.class)
@ConditionalOnProperty(prefix = "springdoc.api-docs", name = "enabled", havingValue = "true", matchIfMissing = true) @ConditionalOnProperty(name = "springdoc.api-docs.enabled", havingValue = "true")
@AutoConfiguration @AutoConfiguration
@AutoConfigureOrder(AutoConfigureOrderConst.FRAMEWORK_SWAGGER) @AutoConfigureOrder(AutoConfigureOrderConst.FRAMEWORK_SWAGGER)
public class OrionSwaggerAutoConfiguration { public class OrionSwaggerAutoConfiguration {

View File

@@ -1,5 +1,8 @@
package com.orion.visor.launch; package com.orion.visor.launch;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.beans.factory.support.BeanNameGenerator;
import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder; import org.springframework.boot.builder.SpringApplicationBuilder;
@@ -14,7 +17,19 @@ import org.springframework.boot.builder.SpringApplicationBuilder;
public class LaunchApplication { public class LaunchApplication {
public static void main(String[] args) { public static void main(String[] args) {
new SpringApplicationBuilder(LaunchApplication.class).run(args); new SpringApplicationBuilder(LaunchApplication.class)
.beanNameGenerator(new CustomBeanNameGenerator())
.run(args);
}
/**
* 自定义 bean 名称生成器
*/
public static class CustomBeanNameGenerator implements BeanNameGenerator {
@Override
public String generateBeanName(BeanDefinition definition, BeanDefinitionRegistry registry) {
return definition.getBeanClassName();
}
} }
} }

View File

@@ -7,6 +7,8 @@ spring:
initial-size: 0 initial-size: 0
min-idle: 1 min-idle: 1
max-active: 5 max-active: 5
stat-view-servlet:
enabled: false
redis: redis:
host: 127.0.0.1 host: 127.0.0.1
port: 6379 port: 6379
@@ -14,6 +16,20 @@ spring:
redisson: redisson:
threads: 2 threads: 2
netty-threads: 2 netty-threads: 2
minimum-idle-size: 2
boot:
admin:
client:
enabled: false
server:
enabled: false
management:
endpoints:
enabled-by-default: false
web:
exposure:
include: shutdown
mybatis-plus: mybatis-plus:
configuration: configuration:

View File

@@ -10,10 +10,13 @@ spring:
min-idle: 5 min-idle: 5
# 最大连接池数量 # 最大连接池数量
max-active: 20 max-active: 20
web-stat-filter: # 控制台
enabled: true
stat-view-servlet: stat-view-servlet:
enabled: true enabled: true
login-username: ${DRUID_USERNAME:admin}
login-password: ${DRUID_PASSWORD:admin}
web-stat-filter:
enabled: true
filter: filter:
stat: stat:
enabled: true enabled: true
@@ -24,12 +27,23 @@ spring:
redisson: redisson:
threads: 4 threads: 4
netty-threads: 4 netty-threads: 4
minimum-idle-size: 4
quartz: quartz:
properties: properties:
org: org:
quartz: quartz:
threadPool: threadPool:
threadCount: 10 threadCount: 10
boot:
admin:
client:
enabled: true
server:
enabled: true
management:
endpoints:
enabled-by-default: true
springdoc: springdoc:
api-docs: api-docs:
@@ -39,6 +53,7 @@ springdoc:
knife4j: knife4j:
enable: false enable: false
production: true
orion: orion:
# 是否为演示模式 # 是否为演示模式

View File

@@ -19,6 +19,9 @@ spring:
mvc: mvc:
pathmatch: pathmatch:
matching-strategy: ANT_PATH_MATCHER matching-strategy: ANT_PATH_MATCHER
async:
# 异步请求时间 30min
request-timeout: 1800000
datasource: datasource:
druid: druid:
driver-class-name: com.mysql.cj.jdbc.Driver driver-class-name: com.mysql.cj.jdbc.Driver
@@ -37,13 +40,14 @@ spring:
# 最大生存的时间 # 最大生存的时间
max-evictable-idle-time-millis: 900000 max-evictable-idle-time-millis: 900000
validation-query: SELECT 1 validation-query: SELECT 1
web-stat-filter: # 控制台
enabled: true
stat-view-servlet: stat-view-servlet:
enabled: true enabled: true
url-pattern: /druid/* url-pattern: /druid/*
login-username: login-username:
login-password: login-password:
web-stat-filter:
enabled: true
filter: filter:
stat: stat:
enabled: true enabled: true
@@ -85,7 +89,7 @@ spring:
misfireThreshold: 60000 misfireThreshold: 60000
clusterCheckinInterval: 5000 clusterCheckinInterval: 5000
isClustered: true isClustered: true
#连接池 # 连接池
threadPool: threadPool:
class: org.quartz.simpl.SimpleThreadPool class: org.quartz.simpl.SimpleThreadPool
threadCount: 5 threadCount: 5
@@ -95,12 +99,16 @@ spring:
admin: admin:
context-path: /admin context-path: /admin
client: client:
enabled: true
url: http://127.0.0.1:${server.port}/${spring.boot.admin.context-path} url: http://127.0.0.1:${server.port}/${spring.boot.admin.context-path}
instance: instance:
service-host-type: IP service-host-type: IP
server:
enabled: true
management: management:
endpoints: endpoints:
enabled-by-default: true
web: web:
base-path: /actuator base-path: /actuator
exposure: exposure:
@@ -195,7 +203,7 @@ orion:
api: api:
# 公共 api 前缀 # 公共 api 前缀
prefix: /orion-visor/api prefix: /orion-visor/api
# 是否开启跨域 # 是否允许跨域
cors: true cors: true
websocket: websocket:
# 公共 websocket 前缀 # 公共 websocket 前缀

View File

@@ -0,0 +1,22 @@
package com.orion.visor.module.infra.api;
import java.util.List;
/**
* 命令片段 对外服务类
*
* @author Jiahang Li
* @version 1.0.0
* @since 2024/6/3 11:07
*/
public interface CommandSnippetApi {
/**
* 通过 userId 删除
*
* @param userIdList userIdList
* @return effect
*/
Integer deleteByUserIdList(List<Long> userIdList);
}

View File

@@ -0,0 +1,22 @@
package com.orion.visor.module.infra.api;
import java.util.List;
/**
* 路径标签 对外服务类
*
* @author Jiahang Li
* @version 1.0.0
* @since 2024/6/3 11:07
*/
public interface PathBookmarkApi {
/**
* 通过 userId 删除
*
* @param userIdList userIdList
* @return effect
*/
Integer deleteByUserIdList(List<Long> userIdList);
}

View File

@@ -0,0 +1,30 @@
package com.orion.visor.module.asset.api.impl;
import com.orion.visor.module.asset.service.CommandSnippetService;
import com.orion.visor.module.infra.api.CommandSnippetApi;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.List;
/**
* 命令片段 对外服务实现类
*
* @author Jiahang Li
* @version 1.0.0
* @since 2024/6/3 11:11
*/
@Slf4j
@Service
public class CommandSnippetApiImpl implements CommandSnippetApi {
@Resource
private CommandSnippetService commandSnippetService;
@Override
public Integer deleteByUserIdList(List<Long> userIdList) {
return commandSnippetService.deleteByUserIdList(userIdList);
}
}

View File

@@ -0,0 +1,30 @@
package com.orion.visor.module.asset.api.impl;
import com.orion.visor.module.asset.service.PathBookmarkService;
import com.orion.visor.module.infra.api.PathBookmarkApi;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.List;
/**
* 路径标签 对外服务实现类
*
* @author Jiahang Li
* @version 1.0.0
* @since 2024/6/3 11:11
*/
@Slf4j
@Service
public class PathBookmarkApiImpl implements PathBookmarkApi {
@Resource
private PathBookmarkService pathBookmarkService;
@Override
public Integer deleteByUserIdList(List<Long> userIdList) {
return pathBookmarkService.deleteByUserIdList(userIdList);
}
}

View File

@@ -98,6 +98,15 @@ public class ExecJobController {
return execJobService.deleteExecJobById(id); return execJobService.deleteExecJobById(id);
} }
@OperatorLog(ExecJobOperatorType.DELETE)
@DeleteMapping("/batch-delete")
@Operation(summary = "批量删除计划任务")
@Parameter(name = "idList", description = "idList", required = true)
@PreAuthorize("@ss.hasPermission('asset:exec-job:delete')")
public Integer batchDeleteExecJob(@RequestParam("idList") List<Long> idList) {
return execJobService.deleteExecJobByIdList(idList);
}
@OperatorLog(ExecJobOperatorType.TRIGGER) @OperatorLog(ExecJobOperatorType.TRIGGER)
@PostMapping("/trigger") @PostMapping("/trigger")
@Operation(summary = "手动触发计划任务") @Operation(summary = "手动触发计划任务")

View File

@@ -21,6 +21,7 @@ import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource; import javax.annotation.Resource;
import java.util.List;
/** /**
* 执行模板 api * 执行模板 api
@@ -92,5 +93,14 @@ public class ExecTemplateController {
return execTemplateService.deleteExecTemplateById(id); return execTemplateService.deleteExecTemplateById(id);
} }
@OperatorLog(ExecTemplateOperatorType.DELETE)
@DeleteMapping("/batch-delete")
@Operation(summary = "批量删除执行模板")
@Parameter(name = "idList", description = "idList", required = true)
@PreAuthorize("@ss.hasPermission('asset:exec-template:delete')")
public Integer batchDeleteExecTemplate(@RequestParam("idList") List<Long> idList) {
return execTemplateService.deleteExecTemplateByIdList(idList);
}
} }

View File

@@ -96,5 +96,15 @@ public class HostController {
return hostService.deleteHostById(id); return hostService.deleteHostById(id);
} }
@DemoDisableApi
@OperatorLog(HostOperatorType.DELETE)
@DeleteMapping("/batch-delete")
@Operation(summary = "批量删除主机")
@Parameter(name = "idList", description = "idList", required = true)
@PreAuthorize("@ss.hasPermission('asset:host:delete')")
public Integer batchDeleteHost(@RequestParam("idList") List<Long> idList) {
return hostService.deleteHostByIdList(idList);
}
} }

View File

@@ -97,5 +97,15 @@ public class HostIdentityController {
return hostIdentityService.deleteHostIdentityById(id); return hostIdentityService.deleteHostIdentityById(id);
} }
@DemoDisableApi
@OperatorLog(HostIdentityOperatorType.DELETE)
@DeleteMapping("/batch-delete")
@Operation(summary = "批量删除主机身份")
@Parameter(name = "idList", description = "idList", required = true)
@PreAuthorize("@ss.hasPermission('asset:host-identity:delete')")
public Integer batchDeleteHostIdentity(@RequestParam("idList") List<Long> idList) {
return hostIdentityService.deleteHostIdentityByIdList(idList);
}
} }

View File

@@ -96,5 +96,15 @@ public class HostKeyController {
return hostKeyService.deleteHostKeyById(id); return hostKeyService.deleteHostKeyById(id);
} }
@DemoDisableApi
@OperatorLog(HostKeyOperatorType.DELETE)
@DeleteMapping("/batch-delete")
@Operation(summary = "批量删除主机密钥")
@Parameter(name = "idList", description = "idList", required = true)
@PreAuthorize("@ss.hasPermission('asset:host-key:delete')")
public Integer batchDeleteHostKey(@RequestParam("idList") List<Long> idList) {
return hostKeyService.deleteHostKeyByIdList(idList);
}
} }

View File

@@ -1,5 +1,5 @@
### 分页查询 SFTP 操作日志 ### 分页查询 SFTP 操作日志
POST {{baseUrl}}/asset/host-sftp-log/query POST {{baseUrl}}/asset/host-sftp/query-log
Content-Type: application/json Content-Type: application/json
Authorization: {{token}} Authorization: {{token}}
@@ -10,8 +10,12 @@ Authorization: {{token}}
### 删除 SFTP 操作日志 ### 删除 SFTP 操作日志
DELETE {{baseUrl}}/asset/host-sftp-log/delete?idList=1,2,3 DELETE {{baseUrl}}/asset/host-sftp/delete-log?idList=1,2,3
Authorization: {{token}} Authorization: {{token}}
### 下载文件
GET {{baseUrl}}/asset/host-sftp/download?channelId=123&transferToken=123
### ###

View File

@@ -5,11 +5,12 @@ import com.orion.visor.framework.biz.operator.log.core.annotation.OperatorLog;
import com.orion.visor.framework.common.validator.group.Page; import com.orion.visor.framework.common.validator.group.Page;
import com.orion.visor.framework.log.core.annotation.IgnoreLog; import com.orion.visor.framework.log.core.annotation.IgnoreLog;
import com.orion.visor.framework.log.core.enums.IgnoreLogMode; import com.orion.visor.framework.log.core.enums.IgnoreLogMode;
import com.orion.visor.framework.web.core.annotation.IgnoreWrapper;
import com.orion.visor.framework.web.core.annotation.RestWrapper; import com.orion.visor.framework.web.core.annotation.RestWrapper;
import com.orion.visor.module.asset.define.operator.HostTerminalOperatorType; import com.orion.visor.module.asset.define.operator.HostTerminalOperatorType;
import com.orion.visor.module.asset.entity.request.host.HostSftpLogQueryRequest; import com.orion.visor.module.asset.entity.request.host.HostSftpLogQueryRequest;
import com.orion.visor.module.asset.entity.vo.HostSftpLogVO; import com.orion.visor.module.asset.entity.vo.HostSftpLogVO;
import com.orion.visor.module.asset.service.HostSftpLogService; import com.orion.visor.module.asset.service.HostSftpService;
import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag; import io.swagger.v3.oas.annotations.tags.Tag;
@@ -17,44 +18,60 @@ import lombok.extern.slf4j.Slf4j;
import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.mvc.method.annotation.StreamingResponseBody;
import javax.annotation.Resource; import javax.annotation.Resource;
import javax.annotation.security.PermitAll;
import javax.servlet.http.HttpServletResponse;
import java.util.List; import java.util.List;
/** /**
* SFTP 操作日志服务 api * SFTP 操作服务 api
* *
* @author Jiahang Li * @author Jiahang Li
* @version 1.0.0 * @version 1.0.0
* @since 2023-12-26 22:09 * @since 2023-12-26 22:09
*/ */
@Tag(name = "asset - SFTP 操作日志服务") @Tag(name = "asset - SFTP 操作服务")
@Slf4j @Slf4j
@Validated @Validated
@RestWrapper @RestWrapper
@RestController @RestController
@RequestMapping("/asset/host-sftp-log") @RequestMapping("/asset/host-sftp")
@SuppressWarnings({"ELValidationInJSP", "SpringElInspection"}) @SuppressWarnings({"ELValidationInJSP", "SpringElInspection"})
public class HostSftpLogController { public class HostSftpLogController {
@Resource @Resource
private HostSftpLogService hostSftpLogService; private HostSftpService hostSftpService;
@IgnoreLog(IgnoreLogMode.RET) @IgnoreLog(IgnoreLogMode.RET)
@PostMapping("/query") @PostMapping("/query-log")
@Operation(summary = "分页查询 SFTP 操作日志") @Operation(summary = "分页查询 SFTP 操作日志")
@PreAuthorize("@ss.hasAnyPermission('infra:operator-log:query', 'asset:host-sftp-log:management:query')") @PreAuthorize("@ss.hasAnyPermission('infra:operator-log:query', 'asset:host-sftp-log:management:query')")
public DataGrid<HostSftpLogVO> getHostSftpLogPage(@Validated(Page.class) @RequestBody HostSftpLogQueryRequest request) { public DataGrid<HostSftpLogVO> getHostSftpLogPage(@Validated(Page.class) @RequestBody HostSftpLogQueryRequest request) {
return hostSftpLogService.getHostSftpLogPage(request); return hostSftpService.getHostSftpLogPage(request);
} }
@OperatorLog(HostTerminalOperatorType.DELETE_SFTP_LOG) @OperatorLog(HostTerminalOperatorType.DELETE_SFTP_LOG)
@DeleteMapping("/delete") @DeleteMapping("/delete-log")
@Operation(summary = "删除 SFTP 操作日志") @Operation(summary = "删除 SFTP 操作日志")
@Parameter(name = "idList", description = "idList", required = true) @Parameter(name = "idList", description = "idList", required = true)
@PreAuthorize("@ss.hasAnyPermission('infra:operator-log:delete', 'asset:host-sftp-log:management:delete')") @PreAuthorize("@ss.hasAnyPermission('infra:operator-log:delete', 'asset:host-sftp-log:management:delete')")
public Integer deleteHostSftpLog(@RequestParam("idList") List<Long> idList) { public Integer deleteHostSftpLog(@RequestParam("idList") List<Long> idList) {
return hostSftpLogService.deleteHostSftpLog(idList); return hostSftpService.deleteHostSftpLog(idList);
}
@PermitAll
@IgnoreWrapper
@IgnoreLog(IgnoreLogMode.RET)
@GetMapping("/download")
@Operation(summary = "下载文件")
@Parameter(name = "channelId", description = "channelId", required = true)
@Parameter(name = "transferToken", description = "transferToken", required = true)
public StreamingResponseBody downloadWithTransferToken(@RequestParam("channelId") String channelId,
@RequestParam("transferToken") String transferToken,
HttpServletResponse response) {
return hostSftpService.downloadWithTransferToken(channelId, transferToken, response);
} }
} }

View File

@@ -7,6 +7,8 @@ import com.orion.visor.framework.mybatis.core.mapper.IMapper;
import com.orion.visor.module.asset.entity.domain.CommandSnippetDO; import com.orion.visor.module.asset.entity.domain.CommandSnippetDO;
import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Mapper;
import java.util.List;
/** /**
* 命令片段 Mapper 接口 * 命令片段 Mapper 接口
* *
@@ -42,4 +44,16 @@ public interface CommandSnippetDAO extends IMapper<CommandSnippetDO> {
return this.delete(wrapper); return this.delete(wrapper);
} }
/**
* 通过 userId 删除
*
* @param userIdList userIdList
* @return effect
*/
default int deleteByUserIdList(List<Long> userIdList) {
LambdaQueryWrapper<CommandSnippetDO> wrapper = this.lambda()
.in(CommandSnippetDO::getUserId, userIdList);
return this.delete(wrapper);
}
} }

View File

@@ -44,6 +44,18 @@ public interface ExecJobHostDAO extends IMapper<ExecJobHostDO> {
return this.delete(wrapper); return this.delete(wrapper);
} }
/**
* 通过 jobId 删除
*
* @param jobIdList jobIdList
* @return effect
*/
default Integer deleteByJobIdList(List<Long> jobIdList) {
LambdaQueryWrapper<ExecJobHostDO> wrapper = this.wrapper()
.in(ExecJobHostDO::getJobId, jobIdList);
return this.delete(wrapper);
}
/** /**
* 通过 hostId 删除 * 通过 hostId 删除
* *
@@ -56,4 +68,16 @@ public interface ExecJobHostDAO extends IMapper<ExecJobHostDO> {
return this.delete(wrapper); return this.delete(wrapper);
} }
/**
* 通过 hostId 删除
*
* @param hostIdList hostIdList
* @return effect
*/
default Integer deleteByHostIdList(List<Long> hostIdList) {
LambdaQueryWrapper<ExecJobHostDO> wrapper = this.wrapper()
.in(ExecJobHostDO::getHostId, hostIdList);
return this.delete(wrapper);
}
} }

View File

@@ -95,17 +95,17 @@ public interface HostConfigDAO extends IMapper<HostConfigDO> {
/** /**
* 设置 keyId 为 NULL * 设置 keyId 为 NULL
* *
* @param keyId keyId * @param keyIdList keyIdList
* @return effect * @return effect
*/ */
int setKeyIdWithNull(@Param("keyId") Long keyId); int setKeyIdWithNull(@Param("keyIdList") List<Long> keyIdList);
/** /**
* 设置 identityId 为 NULL * 设置 identityId 为 NULL
* *
* @param identityId identityId * @param identityIdList identityIdList
* @return effect * @return effect
*/ */
int setIdentityIdWithNull(@Param("identityId") Long identityId); int setIdentityIdWithNull(@Param("identityIdList") List<Long> identityIdList);
} }

View File

@@ -5,7 +5,8 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.orion.visor.framework.mybatis.core.mapper.IMapper; import com.orion.visor.framework.mybatis.core.mapper.IMapper;
import com.orion.visor.module.asset.entity.domain.HostIdentityDO; import com.orion.visor.module.asset.entity.domain.HostIdentityDO;
import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/** /**
* 主机身份 Mapper 接口 * 主机身份 Mapper 接口
@@ -20,13 +21,13 @@ public interface HostIdentityDAO extends IMapper<HostIdentityDO> {
/** /**
* 设置 keyId 为 null * 设置 keyId 为 null
* *
* @param keyId keyId * @param keyIdList keyIdList
* @return effect * @return effect
*/ */
default int setKeyWithNull(@Param("keyId") Long keyId) { default int setKeyWithNull(List<Long> keyIdList) {
LambdaUpdateWrapper<HostIdentityDO> updateWrapper = Wrappers.<HostIdentityDO>lambdaUpdate() LambdaUpdateWrapper<HostIdentityDO> updateWrapper = Wrappers.<HostIdentityDO>lambdaUpdate()
.set(HostIdentityDO::getKeyId, null) .set(HostIdentityDO::getKeyId, null)
.eq(HostIdentityDO::getKeyId, keyId); .in(HostIdentityDO::getKeyId, keyIdList);
return this.update(null, updateWrapper); return this.update(null, updateWrapper);
} }

View File

@@ -7,6 +7,8 @@ import com.orion.visor.framework.mybatis.core.mapper.IMapper;
import com.orion.visor.module.asset.entity.domain.PathBookmarkDO; import com.orion.visor.module.asset.entity.domain.PathBookmarkDO;
import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Mapper;
import java.util.List;
/** /**
* 路径标签 Mapper 接口 * 路径标签 Mapper 接口
* *
@@ -42,4 +44,16 @@ public interface PathBookmarkDAO extends IMapper<PathBookmarkDO> {
return this.delete(wrapper); return this.delete(wrapper);
} }
/**
* 通过 userId 删除
*
* @param userIdList userIdList
* @return effect
*/
default int deleteByUserIdList(List<Long> userIdList) {
LambdaQueryWrapper<PathBookmarkDO> wrapper = this.lambda()
.in(PathBookmarkDO::getUserId, userIdList);
return this.delete(wrapper);
}
} }

View File

@@ -2,7 +2,6 @@ package com.orion.visor.module.asset.handler.host.config.model;
import com.orion.visor.framework.common.handler.data.model.GenericsDataModel; import com.orion.visor.framework.common.handler.data.model.GenericsDataModel;
import com.orion.visor.framework.common.security.UpdatePasswordAction; import com.orion.visor.framework.common.security.UpdatePasswordAction;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Builder; import lombok.Builder;
import lombok.Data; import lombok.Data;
@@ -24,61 +23,86 @@ import javax.validation.constraints.Size;
@Builder @Builder
@NoArgsConstructor @NoArgsConstructor
@AllArgsConstructor @AllArgsConstructor
@Schema(name = "HostSftpConfig", description = "主机 SSH 配置")
public class HostSshConfigModel implements GenericsDataModel, UpdatePasswordAction { public class HostSshConfigModel implements GenericsDataModel, UpdatePasswordAction {
/**
* ssh 端口
*/
@NotNull @NotNull
@Range(min = 1, max = 65535) @Range(min = 1, max = 65535)
@Schema(description = "ssh 端口")
private Integer port; private Integer port;
/**
* 用户名
*/
@Size(max = 128) @Size(max = 128)
@Schema(description = "用户名")
private String username; private String username;
/**
* 认证方式
*/
@NotBlank @NotBlank
@Size(max = 12) @Size(max = 12)
@Schema(description = "认证方式")
private String authType; private String authType;
/**
* 系统类型
*/
@NotBlank @NotBlank
@Size(max = 12) @Size(max = 12)
@Schema(description = "系统类型")
private String osType; private String osType;
@Schema(description = "密码") /**
* 密码
*/
private String password; private String password;
@Schema(description = "身份id") /**
* 身份id
*/
private Long identityId; private Long identityId;
@Schema(description = "密钥id") /**
* 密钥id
*/
private Long keyId; private Long keyId;
/**
* 连接超时时间
*/
@NotNull @NotNull
@Range(min = 0, max = 100000) @Range(min = 0, max = 100000)
@Schema(description = "连接超时时间")
private Integer connectTimeout; private Integer connectTimeout;
/**
* SSH输出编码
*/
@NotBlank @NotBlank
@Size(max = 12) @Size(max = 12)
@Schema(description = "SSH输出编码")
private String charset; private String charset;
/**
* 文件名称编码
*/
@NotBlank @NotBlank
@Size(max = 12) @Size(max = 12)
@Schema(description = "文件名称编码")
private String fileNameCharset; private String fileNameCharset;
/**
* 文件内容编码
*/
@NotBlank @NotBlank
@Size(max = 12) @Size(max = 12)
@Schema(description = "文件内容编码")
private String fileContentCharset; private String fileContentCharset;
@Schema(description = "是否使用新密码 仅参数") /**
* 是否使用新密码 仅参数
*/
private Boolean useNewPassword; private Boolean useNewPassword;
@Schema(description = "是否已设置密码 仅返回") /**
* 是否已设置密码 仅返回
*/
private Boolean hasPassword; private Boolean hasPassword;
} }

View File

@@ -1,8 +1,8 @@
package com.orion.visor.module.asset.handler.host.exec.command; package com.orion.visor.module.asset.handler.host.exec.command;
import com.orion.visor.module.asset.define.AssetThreadPools; import com.orion.visor.module.asset.define.AssetThreadPools;
import com.orion.visor.module.asset.handler.host.exec.command.dto.ExecCommandDTO;
import com.orion.visor.module.asset.handler.host.exec.command.handler.ExecTaskHandler; import com.orion.visor.module.asset.handler.host.exec.command.handler.ExecTaskHandler;
import com.orion.visor.module.asset.handler.host.exec.command.model.ExecCommandDTO;
/** /**
* 批量执行命令执行器 * 批量执行命令执行器

View File

@@ -1,56 +0,0 @@
package com.orion.visor.module.asset.handler.host.exec.command.dto;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* 批量执行启动主机对象
*
* @author Jiahang Li
* @version 1.0.0
* @since 2024/3/11 15:46
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Schema(name = "ExecCommandHostDTO", description = "批量执行启动主机对象")
public class ExecCommandHostDTO {
@Schema(description = "hostLogId")
private Long hostLogId;
@Schema(description = "hostId")
private Long hostId;
@Schema(description = "主机名称")
private String hostName;
@Schema(description = "主机地址")
private String hostAddress;
@Schema(description = "日志文件路径")
private String logPath;
@Schema(description = "脚本路径")
private String scriptPath;
@Schema(description = "执行命令")
private String command;
@Schema(description = "主机用户")
private String username;
@Schema(description = "命令编码")
private String charset;
@Schema(description = "文件名称编码")
private String fileNameCharset;
@Schema(description = "文件内容编码")
private String fileContentCharset;
}

View File

@@ -20,8 +20,8 @@ import com.orion.visor.framework.common.file.FileClient;
import com.orion.visor.module.asset.dao.ExecHostLogDAO; import com.orion.visor.module.asset.dao.ExecHostLogDAO;
import com.orion.visor.module.asset.entity.domain.ExecHostLogDO; import com.orion.visor.module.asset.entity.domain.ExecHostLogDO;
import com.orion.visor.module.asset.enums.ExecHostStatusEnum; import com.orion.visor.module.asset.enums.ExecHostStatusEnum;
import com.orion.visor.module.asset.handler.host.exec.command.dto.ExecCommandDTO; import com.orion.visor.module.asset.handler.host.exec.command.model.ExecCommandDTO;
import com.orion.visor.module.asset.handler.host.exec.command.dto.ExecCommandHostDTO; import com.orion.visor.module.asset.handler.host.exec.command.model.ExecCommandHostDTO;
import com.orion.visor.module.asset.handler.host.exec.log.manager.ExecLogManager; import com.orion.visor.module.asset.handler.host.exec.log.manager.ExecLogManager;
import com.orion.visor.module.asset.service.HostTerminalService; import com.orion.visor.module.asset.service.HostTerminalService;
import lombok.Getter; import lombok.Getter;

View File

@@ -9,8 +9,8 @@ import com.orion.lang.utils.time.Dates;
import com.orion.net.host.ssh.ExitCode; import com.orion.net.host.ssh.ExitCode;
import com.orion.visor.framework.common.constant.Const; import com.orion.visor.framework.common.constant.Const;
import com.orion.visor.module.asset.enums.ExecHostStatusEnum; import com.orion.visor.module.asset.enums.ExecHostStatusEnum;
import com.orion.visor.module.asset.handler.host.exec.command.dto.ExecCommandDTO; import com.orion.visor.module.asset.handler.host.exec.command.model.ExecCommandDTO;
import com.orion.visor.module.asset.handler.host.exec.command.dto.ExecCommandHostDTO; import com.orion.visor.module.asset.handler.host.exec.command.model.ExecCommandHostDTO;
/** /**
* 命令执行器 ansi 日志输出 * 命令执行器 ansi 日志输出

View File

@@ -2,8 +2,8 @@ package com.orion.visor.module.asset.handler.host.exec.command.handler;
import com.orion.lang.support.timeout.TimeoutChecker; import com.orion.lang.support.timeout.TimeoutChecker;
import com.orion.lang.support.timeout.TimeoutEndpoint; import com.orion.lang.support.timeout.TimeoutEndpoint;
import com.orion.visor.module.asset.handler.host.exec.command.dto.ExecCommandDTO; import com.orion.visor.module.asset.handler.host.exec.command.model.ExecCommandDTO;
import com.orion.visor.module.asset.handler.host.exec.command.dto.ExecCommandHostDTO; import com.orion.visor.module.asset.handler.host.exec.command.model.ExecCommandHostDTO;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
/** /**

View File

@@ -18,9 +18,9 @@ import com.orion.visor.module.asset.define.message.ExecMessageDefine;
import com.orion.visor.module.asset.entity.domain.ExecLogDO; import com.orion.visor.module.asset.entity.domain.ExecLogDO;
import com.orion.visor.module.asset.enums.ExecHostStatusEnum; import com.orion.visor.module.asset.enums.ExecHostStatusEnum;
import com.orion.visor.module.asset.enums.ExecStatusEnum; import com.orion.visor.module.asset.enums.ExecStatusEnum;
import com.orion.visor.module.asset.handler.host.exec.command.dto.ExecCommandDTO;
import com.orion.visor.module.asset.handler.host.exec.command.dto.ExecCommandHostDTO;
import com.orion.visor.module.asset.handler.host.exec.command.manager.ExecTaskManager; import com.orion.visor.module.asset.handler.host.exec.command.manager.ExecTaskManager;
import com.orion.visor.module.asset.handler.host.exec.command.model.ExecCommandDTO;
import com.orion.visor.module.asset.handler.host.exec.command.model.ExecCommandHostDTO;
import com.orion.visor.module.infra.api.SystemMessageApi; import com.orion.visor.module.infra.api.SystemMessageApi;
import com.orion.visor.module.infra.entity.dto.message.SystemMessageDTO; import com.orion.visor.module.infra.entity.dto.message.SystemMessageDTO;
import lombok.Getter; import lombok.Getter;

View File

@@ -1,6 +1,5 @@
package com.orion.visor.module.asset.handler.host.exec.command.dto; package com.orion.visor.module.asset.handler.host.exec.command.model;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Builder; import lombok.Builder;
import lombok.Data; import lombok.Data;
@@ -19,31 +18,46 @@ import java.util.List;
@Builder @Builder
@NoArgsConstructor @NoArgsConstructor
@AllArgsConstructor @AllArgsConstructor
@Schema(name = "ExecCommandDTO", description = "批量执行启动对象")
public class ExecCommandDTO { public class ExecCommandDTO {
@Schema(description = "logId") /**
* logId
*/
private Long logId; private Long logId;
@Schema(description = "用户id") /**
* 用户id
*/
private Long userId; private Long userId;
@Schema(description = "用户名") /**
* 用户名
*/
private String username; private String username;
@Schema(description = "执行描述") /**
* 执行描述
*/
private String description; private String description;
@Schema(description = "执行序列") /**
* 执行序列
*/
private Integer execSeq; private Integer execSeq;
@Schema(description = "超时时间") /**
* 超时时间
*/
private Integer timeout; private Integer timeout;
@Schema(description = "是否使用脚本执行") /**
* 是否使用脚本执行
*/
private Boolean scriptExec; private Boolean scriptExec;
@Schema(description = "执行主机") /**
* 执行主机
*/
private List<ExecCommandHostDTO> hosts; private List<ExecCommandHostDTO> hosts;
} }

View File

@@ -0,0 +1,76 @@
package com.orion.visor.module.asset.handler.host.exec.command.model;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* 批量执行启动主机对象
*
* @author Jiahang Li
* @version 1.0.0
* @since 2024/3/11 15:46
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class ExecCommandHostDTO {
/**
* hostLogId
*/
private Long hostLogId;
/**
* hostId
*/
private Long hostId;
/**
* 主机名称
*/
private String hostName;
/**
* 主机地址
*/
private String hostAddress;
/**
* 日志文件路径
*/
private String logPath;
/**
* 脚本路径
*/
private String scriptPath;
/**
* 执行命令
*/
private String command;
/**
* 主机用户
*/
private String username;
/**
* 命令编码
*/
private String charset;
/**
* 文件名称编码
*/
private String fileNameCharset;
/**
* 文件内容编码
*/
private String fileContentCharset;
}

View File

@@ -1,5 +1,6 @@
package com.orion.visor.module.asset.handler.host.exec.log; package com.orion.visor.module.asset.handler.host.exec.log;
import com.orion.visor.framework.common.annotation.Keep;
import com.orion.visor.framework.common.constant.ExtraFieldConst; import com.orion.visor.framework.common.constant.ExtraFieldConst;
import com.orion.visor.framework.common.file.FileClient; import com.orion.visor.framework.common.file.FileClient;
import com.orion.visor.framework.websocket.core.utils.WebSockets; import com.orion.visor.framework.websocket.core.utils.WebSockets;
@@ -29,6 +30,7 @@ import javax.annotation.Resource;
@Component @Component
public class ExecLogTailHandler extends AbstractWebSocketHandler { public class ExecLogTailHandler extends AbstractWebSocketHandler {
@Keep
@Resource @Resource
private FileClient logsFileClient; private FileClient logsFileClient;

View File

@@ -1,7 +1,6 @@
package com.orion.visor.module.asset.handler.host.extra.model; package com.orion.visor.module.asset.handler.host.extra.model;
import com.orion.visor.framework.common.handler.data.model.GenericsDataModel; import com.orion.visor.framework.common.handler.data.model.GenericsDataModel;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Builder; import lombok.Builder;
import lombok.Data; import lombok.Data;
@@ -18,13 +17,16 @@ import lombok.NoArgsConstructor;
@Builder @Builder
@NoArgsConstructor @NoArgsConstructor
@AllArgsConstructor @AllArgsConstructor
@Schema(name = "HostLabelExtraModel", description = "主机拓展信息 - 标签模型")
public class HostLabelExtraModel implements GenericsDataModel { public class HostLabelExtraModel implements GenericsDataModel {
@Schema(description = "别名") /**
* 别名
*/
private String alias; private String alias;
@Schema(description = "颜色") /**
* 颜色
*/
private String color; private String color;
} }

View File

@@ -1,7 +1,6 @@
package com.orion.visor.module.asset.handler.host.extra.model; package com.orion.visor.module.asset.handler.host.extra.model;
import com.orion.visor.framework.common.handler.data.model.GenericsDataModel; import com.orion.visor.framework.common.handler.data.model.GenericsDataModel;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Builder; import lombok.Builder;
import lombok.Data; import lombok.Data;
@@ -18,19 +17,26 @@ import lombok.NoArgsConstructor;
@Builder @Builder
@NoArgsConstructor @NoArgsConstructor
@AllArgsConstructor @AllArgsConstructor
@Schema(name = "HostExtraSshModel", description = "主机拓展信息 - ssh 模型")
public class HostSshExtraModel implements GenericsDataModel { public class HostSshExtraModel implements GenericsDataModel {
@Schema(description = "认证方式") /**
* 认证方式
*/
private String authType; private String authType;
@Schema(description = "认证方式") /**
* 认证方式
*/
private String username; private String username;
@Schema(description = "主机密钥") /**
* 主机密钥
*/
private Long keyId; private Long keyId;
@Schema(description = "主机身份") /**
* 主机身份
*/
private Long identityId; private Long identityId;
} }

View File

@@ -2,7 +2,7 @@ package com.orion.visor.module.asset.handler.host.terminal;
import com.orion.visor.module.asset.define.AssetThreadPools; import com.orion.visor.module.asset.define.AssetThreadPools;
import com.orion.visor.module.asset.handler.host.terminal.enums.InputTypeEnum; import com.orion.visor.module.asset.handler.host.terminal.enums.InputTypeEnum;
import com.orion.visor.module.asset.handler.host.terminal.manager.TerminalManager; import com.orion.visor.module.asset.handler.host.terminal.manager.HostTerminalManager;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import org.springframework.web.socket.CloseStatus; import org.springframework.web.socket.CloseStatus;
@@ -24,7 +24,7 @@ import javax.annotation.Resource;
public class TerminalMessageDispatcher extends AbstractWebSocketHandler { public class TerminalMessageDispatcher extends AbstractWebSocketHandler {
@Resource @Resource
private TerminalManager terminalManager; private HostTerminalManager hostTerminalManager;
@Override @Override
protected void handleTextMessage(WebSocketSession session, TextMessage message) { protected void handleTextMessage(WebSocketSession session, TextMessage message) {
@@ -65,7 +65,7 @@ public class TerminalMessageDispatcher extends AbstractWebSocketHandler {
String id = session.getId(); String id = session.getId();
log.info("TerminalMessageDispatcher-afterConnectionClosed id: {}, code: {}, reason: {}", id, status.getCode(), status.getReason()); log.info("TerminalMessageDispatcher-afterConnectionClosed id: {}, code: {}, reason: {}", id, status.getCode(), status.getReason());
// 关闭会话 // 关闭会话
terminalManager.closeSession(id); hostTerminalManager.closeSession(id);
} }
} }

View File

@@ -7,7 +7,7 @@ import com.orion.visor.framework.biz.operator.log.core.utils.OperatorLogs;
import com.orion.visor.framework.common.constant.ErrorMessage; import com.orion.visor.framework.common.constant.ErrorMessage;
import com.orion.visor.framework.websocket.core.utils.WebSockets; import com.orion.visor.framework.websocket.core.utils.WebSockets;
import com.orion.visor.module.asset.handler.host.terminal.enums.OutputTypeEnum; import com.orion.visor.module.asset.handler.host.terminal.enums.OutputTypeEnum;
import com.orion.visor.module.asset.handler.host.terminal.manager.TerminalManager; import com.orion.visor.module.asset.handler.host.terminal.manager.HostTerminalManager;
import com.orion.visor.module.asset.handler.host.terminal.model.TerminalBasePayload; import com.orion.visor.module.asset.handler.host.terminal.model.TerminalBasePayload;
import com.orion.visor.module.asset.handler.host.terminal.model.TerminalConfig; import com.orion.visor.module.asset.handler.host.terminal.model.TerminalConfig;
import com.orion.visor.module.asset.handler.host.terminal.session.ITerminalSession; import com.orion.visor.module.asset.handler.host.terminal.session.ITerminalSession;
@@ -27,7 +27,7 @@ import java.util.Map;
public abstract class AbstractTerminalHandler<T extends TerminalBasePayload> implements ITerminalHandler<T> { public abstract class AbstractTerminalHandler<T extends TerminalBasePayload> implements ITerminalHandler<T> {
@Resource @Resource
protected TerminalManager terminalManager; protected HostTerminalManager hostTerminalManager;
@Resource @Resource
private OperatorLogFrameworkService operatorLogFrameworkService; private OperatorLogFrameworkService operatorLogFrameworkService;
@@ -75,7 +75,7 @@ public abstract class AbstractTerminalHandler<T extends TerminalBasePayload> imp
String channelId = channel.getId(); String channelId = channel.getId();
String sessionId = payload.getSessionId(); String sessionId = payload.getSessionId();
// 获取会话并且设置参数 // 获取会话并且设置参数
ITerminalSession session = terminalManager.getSession(channelId, sessionId); ITerminalSession session = hostTerminalManager.getSession(channelId, sessionId);
if (session != null) { if (session != null) {
TerminalConfig config = session.getConfig(); TerminalConfig config = session.getConfig();
extra.put(OperatorLogs.HOST_ID, config.getHostId()); extra.put(OperatorLogs.HOST_ID, config.getHostId());

View File

@@ -30,7 +30,7 @@ public class SftpChangeModHandler extends AbstractTerminalHandler<SftpChangeModR
long startTime = System.currentTimeMillis(); long startTime = System.currentTimeMillis();
// 获取会话 // 获取会话
String sessionId = payload.getSessionId(); String sessionId = payload.getSessionId();
ISftpSession session = terminalManager.getSession(channel.getId(), sessionId); ISftpSession session = hostTerminalManager.getSession(channel.getId(), sessionId);
String path = payload.getPath(); String path = payload.getPath();
Integer mod = payload.getMod(); Integer mod = payload.getMod();
log.info("SftpChangeModHandler-handle start sessionId: {}, path: {}, mod: {}", sessionId, path, mod); log.info("SftpChangeModHandler-handle start sessionId: {}, path: {}, mod: {}", sessionId, path, mod);

View File

@@ -30,7 +30,7 @@ public class SftpDownloadFlatDirectoryHandler extends AbstractTerminalHandler<Sf
public void handle(WebSocketSession channel, SftpDownloadFlatDirectoryRequest payload) { public void handle(WebSocketSession channel, SftpDownloadFlatDirectoryRequest payload) {
// 获取会话 // 获取会话
String sessionId = payload.getSessionId(); String sessionId = payload.getSessionId();
ISftpSession session = terminalManager.getSession(channel.getId(), sessionId); ISftpSession session = hostTerminalManager.getSession(channel.getId(), sessionId);
String[] paths = payload.getPath().split("\\|"); String[] paths = payload.getPath().split("\\|");
log.info("SftpDownloadFlatDirectoryHandler-handle start sessionId: {}, paths: {}", sessionId, Arrays.toString(paths)); log.info("SftpDownloadFlatDirectoryHandler-handle start sessionId: {}, paths: {}", sessionId, Arrays.toString(paths));
Exception ex = null; Exception ex = null;

View File

@@ -25,7 +25,7 @@ public class SftpGetContentHandler extends AbstractTerminalHandler<SftpBaseReque
public void handle(WebSocketSession channel, SftpBaseRequest payload) { public void handle(WebSocketSession channel, SftpBaseRequest payload) {
// 获取会话 // 获取会话
String sessionId = payload.getSessionId(); String sessionId = payload.getSessionId();
ISftpSession session = terminalManager.getSession(channel.getId(), sessionId); ISftpSession session = hostTerminalManager.getSession(channel.getId(), sessionId);
String path = payload.getPath(); String path = payload.getPath();
log.info("SftpGetContentHandler-handle start sessionId: {}, path: {}", sessionId, path); log.info("SftpGetContentHandler-handle start sessionId: {}, path: {}", sessionId, path);
String content = Const.EMPTY; String content = Const.EMPTY;

View File

@@ -31,7 +31,7 @@ public class SftpListHandler extends AbstractTerminalHandler<SftpListRequest> {
public void handle(WebSocketSession channel, SftpListRequest payload) { public void handle(WebSocketSession channel, SftpListRequest payload) {
// 获取会话 // 获取会话
String sessionId = payload.getSessionId(); String sessionId = payload.getSessionId();
ISftpSession session = terminalManager.getSession(channel.getId(), sessionId); ISftpSession session = hostTerminalManager.getSession(channel.getId(), sessionId);
String path = payload.getPath(); String path = payload.getPath();
log.info("SftpListHandler-handle start sessionId: {}, path: {}", sessionId, path); log.info("SftpListHandler-handle start sessionId: {}, path: {}", sessionId, path);
Exception ex = null; Exception ex = null;

View File

@@ -30,7 +30,7 @@ public class SftpMakeDirectoryHandler extends AbstractTerminalHandler<SftpBaseRe
long startTime = System.currentTimeMillis(); long startTime = System.currentTimeMillis();
// 获取会话 // 获取会话
String sessionId = payload.getSessionId(); String sessionId = payload.getSessionId();
ISftpSession session = terminalManager.getSession(channel.getId(), sessionId); ISftpSession session = hostTerminalManager.getSession(channel.getId(), sessionId);
String path = payload.getPath(); String path = payload.getPath();
log.info("SftpMakeDirectoryHandler-handle start sessionId: {}, path: {}", sessionId, path); log.info("SftpMakeDirectoryHandler-handle start sessionId: {}, path: {}", sessionId, path);
Exception ex = null; Exception ex = null;

View File

@@ -30,7 +30,7 @@ public class SftpMoveHandler extends AbstractTerminalHandler<SftpMoveRequest> {
long startTime = System.currentTimeMillis(); long startTime = System.currentTimeMillis();
// 获取会话 // 获取会话
String sessionId = payload.getSessionId(); String sessionId = payload.getSessionId();
ISftpSession session = terminalManager.getSession(channel.getId(), sessionId); ISftpSession session = hostTerminalManager.getSession(channel.getId(), sessionId);
String path = payload.getPath(); String path = payload.getPath();
String target = payload.getTarget(); String target = payload.getTarget();
log.info("SftpMoveHandler-handle start sessionId: {}, path: {}, target: {}", sessionId, path, target); log.info("SftpMoveHandler-handle start sessionId: {}, path: {}, target: {}", sessionId, path, target);

View File

@@ -31,7 +31,7 @@ public class SftpRemoveHandler extends AbstractTerminalHandler<SftpBaseRequest>
long startTime = System.currentTimeMillis(); long startTime = System.currentTimeMillis();
// 获取会话 // 获取会话
String sessionId = payload.getSessionId(); String sessionId = payload.getSessionId();
ISftpSession session = terminalManager.getSession(channel.getId(), sessionId); ISftpSession session = hostTerminalManager.getSession(channel.getId(), sessionId);
String[] paths = payload.getPath().split("\\|"); String[] paths = payload.getPath().split("\\|");
log.info("SftpRemoveHandler-handle start sessionId: {}, path: {}", sessionId, Arrays.toString(paths)); log.info("SftpRemoveHandler-handle start sessionId: {}, path: {}", sessionId, Arrays.toString(paths));
Exception ex = null; Exception ex = null;

View File

@@ -30,7 +30,7 @@ public class SftpSetContentHandler extends AbstractTerminalHandler<SftpSetConten
long startTime = System.currentTimeMillis(); long startTime = System.currentTimeMillis();
// 获取会话 // 获取会话
String sessionId = payload.getSessionId(); String sessionId = payload.getSessionId();
ISftpSession session = terminalManager.getSession(channel.getId(), sessionId); ISftpSession session = hostTerminalManager.getSession(channel.getId(), sessionId);
String path = payload.getPath(); String path = payload.getPath();
log.info("SftpSetContentHandler-handle start sessionId: {}, path: {}", sessionId, path); log.info("SftpSetContentHandler-handle start sessionId: {}, path: {}", sessionId, path);
Exception ex = null; Exception ex = null;

View File

@@ -30,7 +30,7 @@ public class SftpTouchHandler extends AbstractTerminalHandler<SftpBaseRequest> {
long startTime = System.currentTimeMillis(); long startTime = System.currentTimeMillis();
// 获取会话 // 获取会话
String sessionId = payload.getSessionId(); String sessionId = payload.getSessionId();
ISftpSession session = terminalManager.getSession(channel.getId(), sessionId); ISftpSession session = hostTerminalManager.getSession(channel.getId(), sessionId);
String path = payload.getPath(); String path = payload.getPath();
log.info("SftpTouchHandler-handle start sessionId: {}, path: {}", sessionId, path); log.info("SftpTouchHandler-handle start sessionId: {}, path: {}", sessionId, path);
Exception ex = null; Exception ex = null;

View File

@@ -30,7 +30,7 @@ public class SftpTruncateHandler extends AbstractTerminalHandler<SftpBaseRequest
long startTime = System.currentTimeMillis(); long startTime = System.currentTimeMillis();
// 获取会话 // 获取会话
String sessionId = payload.getSessionId(); String sessionId = payload.getSessionId();
ISftpSession session = terminalManager.getSession(channel.getId(), sessionId); ISftpSession session = hostTerminalManager.getSession(channel.getId(), sessionId);
String path = payload.getPath(); String path = payload.getPath();
log.info("SftpTruncateHandler-handle start sessionId: {}, path: {}", sessionId, path); log.info("SftpTruncateHandler-handle start sessionId: {}, path: {}", sessionId, path);
Exception ex = null; Exception ex = null;

View File

@@ -20,7 +20,7 @@ public class SshInputHandler extends AbstractTerminalHandler<SshInputRequest> {
@Override @Override
public void handle(WebSocketSession channel, SshInputRequest payload) { public void handle(WebSocketSession channel, SshInputRequest payload) {
// 获取会话 // 获取会话
ISshSession session = terminalManager.getSession(channel.getId(), payload.getSessionId()); ISshSession session = hostTerminalManager.getSession(channel.getId(), payload.getSessionId());
// 处理输入 // 处理输入
session.write(payload.getCommand()); session.write(payload.getCommand());
} }

View File

@@ -20,7 +20,7 @@ public class SshResizeHandler extends AbstractTerminalHandler<SshResizeRequest>
@Override @Override
public void handle(WebSocketSession channel, SshResizeRequest payload) { public void handle(WebSocketSession channel, SshResizeRequest payload) {
// 获取会话 // 获取会话
ISshSession session = terminalManager.getSession(channel.getId(), payload.getSessionId()); ISshSession session = hostTerminalManager.getSession(channel.getId(), payload.getSessionId());
// 修改大小 // 修改大小
session.resize(payload.getCols(), payload.getRows()); session.resize(payload.getCols(), payload.getRows());
} }

View File

@@ -117,7 +117,7 @@ public class TerminalCheckHandler extends AbstractTerminalHandler<TerminalCheckR
* @return 是否存在 * @return 是否存在
*/ */
private boolean checkSession(WebSocketSession channel, TerminalCheckRequest payload) { private boolean checkSession(WebSocketSession channel, TerminalCheckRequest payload) {
ITerminalSession session = terminalManager.getSession(channel.getId(), payload.getSessionId()); ITerminalSession session = hostTerminalManager.getSession(channel.getId(), payload.getSessionId());
if (session != null) { if (session != null) {
this.sendCheckFailedMessage(channel, payload, ErrorMessage.SESSION_PRESENT); this.sendCheckFailedMessage(channel, payload, ErrorMessage.SESSION_PRESENT);
return true; return true;

View File

@@ -20,7 +20,7 @@ public class TerminalCloseHandler extends AbstractTerminalHandler<TerminalBasePa
public void handle(WebSocketSession channel, TerminalBasePayload payload) { public void handle(WebSocketSession channel, TerminalBasePayload payload) {
log.info("TerminalCloseHandler-handle start sessionId: {}", payload.getSessionId()); log.info("TerminalCloseHandler-handle start sessionId: {}", payload.getSessionId());
// 关闭会话 // 关闭会话
terminalManager.closeSession(channel.getId(), payload.getSessionId()); hostTerminalManager.closeSession(channel.getId(), payload.getSessionId());
} }
} }

View File

@@ -72,7 +72,7 @@ public class TerminalConnectHandler extends AbstractTerminalHandler<TerminalConn
// 连接主机 // 连接主机
ITerminalSession session = this.connect(sessionId, connect, channel, payload); ITerminalSession session = this.connect(sessionId, connect, channel, payload);
// 添加会话到 manager // 添加会话到 manager
terminalManager.addSession(session); hostTerminalManager.addSession(session);
} catch (Exception e) { } catch (Exception e) {
ex = e; ex = e;
// 修改连接状态为失败 // 修改连接状态为失败

View File

@@ -26,7 +26,7 @@ public class TerminalPingHandler extends AbstractTerminalHandler<TerminalBasePay
// 发送 pong // 发送 pong
this.send(channel, OutputTypeEnum.PONG.getType()); this.send(channel, OutputTypeEnum.PONG.getType());
// 活跃 terminal // 活跃 terminal
Map<String, ITerminalSession> sessions = terminalManager.getSession(channel.getId()); Map<String, ITerminalSession> sessions = hostTerminalManager.getSession(channel.getId());
if (!Maps.isEmpty(sessions)) { if (!Maps.isEmpty(sessions)) {
for (ITerminalSession session : sessions.values()) { for (ITerminalSession session : sessions.values()) {
session.keepAlive(); session.keepAlive();

View File

@@ -10,14 +10,14 @@ import java.util.Map;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
/** /**
* 终端管理器 * 主机终端管理器
* *
* @author Jiahang Li * @author Jiahang Li
* @version 1.0.0 * @version 1.0.0
* @since 2024/1/3 11:35 * @since 2024/1/3 11:35
*/ */
@Component @Component
public class TerminalManager { public class HostTerminalManager {
/** /**
* 会话存储器 * 会话存储器

View File

@@ -1,6 +1,5 @@
package com.orion.visor.module.asset.handler.host.terminal.model; package com.orion.visor.module.asset.handler.host.terminal.model;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Data; import lombok.Data;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
@@ -17,13 +16,16 @@ import lombok.experimental.SuperBuilder;
@SuperBuilder @SuperBuilder
@NoArgsConstructor @NoArgsConstructor
@AllArgsConstructor @AllArgsConstructor
@Schema(name = "TerminalBasePayload", description = "终端基础 payload")
public class TerminalBasePayload { public class TerminalBasePayload {
@Schema(description = "会话id") /**
* 会话id
*/
private String sessionId; private String sessionId;
@Schema(description = "消息类型") /**
* 消息类型
*/
private String type; private String type;
} }

View File

@@ -1,7 +1,5 @@
package com.orion.visor.module.asset.handler.host.terminal.model; package com.orion.visor.module.asset.handler.host.terminal.model;
import com.orion.visor.framework.desensitize.core.annotation.DesensitizeObject;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Builder; import lombok.Builder;
import lombok.Data; import lombok.Data;
@@ -18,35 +16,51 @@ import lombok.NoArgsConstructor;
@Builder @Builder
@NoArgsConstructor @NoArgsConstructor
@AllArgsConstructor @AllArgsConstructor
@DesensitizeObject
@Schema(name = "TerminalConfig", description = "主机终端连接参数")
public class TerminalConfig { public class TerminalConfig {
@Schema(description = "logId") /**
* logId
*/
private Long logId; private Long logId;
@Schema(description = "主机id") /**
* 主机id
*/
private Long hostId; private Long hostId;
@Schema(description = "主机名称") /**
* 主机名称
*/
private String hostName; private String hostName;
@Schema(description = "主机地址") /**
* 主机地址
*/
private String address; private String address;
@Schema(description = "cols") /**
* cols
*/
private Integer cols; private Integer cols;
@Schema(description = "rows") /**
* rows
*/
private Integer rows; private Integer rows;
@Schema(description = "SSH输出编码") /**
* SSH输出编码
*/
private String charset; private String charset;
@Schema(description = "文件名称编码") /**
* 文件名称编码
*/
private String fileNameCharset; private String fileNameCharset;
@Schema(description = "文件内容编码") /**
* 文件内容编码
*/
private String fileContentCharset; private String fileContentCharset;
} }

View File

@@ -1,7 +1,6 @@
package com.orion.visor.module.asset.handler.host.terminal.model.request; package com.orion.visor.module.asset.handler.host.terminal.model.request;
import com.orion.visor.module.asset.handler.host.terminal.model.TerminalBasePayload; import com.orion.visor.module.asset.handler.host.terminal.model.TerminalBasePayload;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
@@ -20,10 +19,11 @@ import lombok.experimental.SuperBuilder;
@NoArgsConstructor @NoArgsConstructor
@AllArgsConstructor @AllArgsConstructor
@EqualsAndHashCode(callSuper = true) @EqualsAndHashCode(callSuper = true)
@Schema(name = "SftpBaseRequest", description = "sftp 基础请求 实体对象")
public class SftpBaseRequest extends TerminalBasePayload { public class SftpBaseRequest extends TerminalBasePayload {
@Schema(description = "path") /**
* path
*/
private String path; private String path;
} }

View File

@@ -1,6 +1,5 @@
package com.orion.visor.module.asset.handler.host.terminal.model.request; package com.orion.visor.module.asset.handler.host.terminal.model.request;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
@@ -21,10 +20,11 @@ import lombok.experimental.SuperBuilder;
@NoArgsConstructor @NoArgsConstructor
@AllArgsConstructor @AllArgsConstructor
@EqualsAndHashCode(callSuper = true) @EqualsAndHashCode(callSuper = true)
@Schema(name = "SftpChangeModRequest", description = "sftp 修改文件权限 实体对象")
public class SftpChangeModRequest extends SftpBaseRequest { public class SftpChangeModRequest extends SftpBaseRequest {
@Schema(description = "10进制的8进制 权限") /**
* 10进制的8进制 权限
*/
private Integer mod; private Integer mod;
} }

View File

@@ -1,6 +1,5 @@
package com.orion.visor.module.asset.handler.host.terminal.model.request; package com.orion.visor.module.asset.handler.host.terminal.model.request;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
@@ -21,10 +20,11 @@ import lombok.experimental.SuperBuilder;
@NoArgsConstructor @NoArgsConstructor
@AllArgsConstructor @AllArgsConstructor
@EqualsAndHashCode(callSuper = true) @EqualsAndHashCode(callSuper = true)
@Schema(name = "SftpDownloadDirectoryFlatRequest", description = "sftp 下载文件夹展开文件 实体对象")
public class SftpDownloadFlatDirectoryRequest extends SftpBaseRequest { public class SftpDownloadFlatDirectoryRequest extends SftpBaseRequest {
@Schema(description = "当前路径") /**
* 当前路径
*/
private String currentPath; private String currentPath;
} }

View File

@@ -1,6 +1,5 @@
package com.orion.visor.module.asset.handler.host.terminal.model.request; package com.orion.visor.module.asset.handler.host.terminal.model.request;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
@@ -21,10 +20,11 @@ import lombok.experimental.SuperBuilder;
@NoArgsConstructor @NoArgsConstructor
@AllArgsConstructor @AllArgsConstructor
@EqualsAndHashCode(callSuper = true) @EqualsAndHashCode(callSuper = true)
@Schema(name = "SftpListRequest", description = "sftp 列表请求 实体对象")
public class SftpListRequest extends SftpBaseRequest { public class SftpListRequest extends SftpBaseRequest {
@Schema(description = "是否显示隐藏文件") /**
* 是否显示隐藏文件
*/
private Integer showHiddenFile; private Integer showHiddenFile;
} }

View File

@@ -1,6 +1,5 @@
package com.orion.visor.module.asset.handler.host.terminal.model.request; package com.orion.visor.module.asset.handler.host.terminal.model.request;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
@@ -21,10 +20,11 @@ import lombok.experimental.SuperBuilder;
@NoArgsConstructor @NoArgsConstructor
@AllArgsConstructor @AllArgsConstructor
@EqualsAndHashCode(callSuper = true) @EqualsAndHashCode(callSuper = true)
@Schema(name = "SftpMoveRequest", description = "sftp 移动文件 实体对象")
public class SftpMoveRequest extends SftpBaseRequest { public class SftpMoveRequest extends SftpBaseRequest {
@Schema(description = "target") /**
* target
*/
private String target; private String target;
} }

View File

@@ -1,6 +1,5 @@
package com.orion.visor.module.asset.handler.host.terminal.model.request; package com.orion.visor.module.asset.handler.host.terminal.model.request;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
@@ -21,10 +20,11 @@ import lombok.experimental.SuperBuilder;
@NoArgsConstructor @NoArgsConstructor
@AllArgsConstructor @AllArgsConstructor
@EqualsAndHashCode(callSuper = true) @EqualsAndHashCode(callSuper = true)
@Schema(name = "SftpSetContentRequest", description = "sftp 设置文件内容 实体对象")
public class SftpSetContentRequest extends SftpBaseRequest { public class SftpSetContentRequest extends SftpBaseRequest {
@Schema(description = "content") /**
* content
*/
private String content; private String content;
} }

View File

@@ -1,7 +1,6 @@
package com.orion.visor.module.asset.handler.host.terminal.model.request; package com.orion.visor.module.asset.handler.host.terminal.model.request;
import com.orion.visor.module.asset.handler.host.terminal.model.TerminalBasePayload; import com.orion.visor.module.asset.handler.host.terminal.model.TerminalBasePayload;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
@@ -22,10 +21,11 @@ import lombok.experimental.SuperBuilder;
@NoArgsConstructor @NoArgsConstructor
@AllArgsConstructor @AllArgsConstructor
@EqualsAndHashCode(callSuper = true) @EqualsAndHashCode(callSuper = true)
@Schema(name = "SshInputRequest", description = "ssh 输入请求 实体对象")
public class SshInputRequest extends TerminalBasePayload { public class SshInputRequest extends TerminalBasePayload {
@Schema(description = "command") /**
* command
*/
private String command; private String command;
} }

View File

@@ -1,7 +1,6 @@
package com.orion.visor.module.asset.handler.host.terminal.model.request; package com.orion.visor.module.asset.handler.host.terminal.model.request;
import com.orion.visor.module.asset.handler.host.terminal.model.TerminalBasePayload; import com.orion.visor.module.asset.handler.host.terminal.model.TerminalBasePayload;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
@@ -22,13 +21,16 @@ import lombok.experimental.SuperBuilder;
@NoArgsConstructor @NoArgsConstructor
@AllArgsConstructor @AllArgsConstructor
@EqualsAndHashCode(callSuper = true) @EqualsAndHashCode(callSuper = true)
@Schema(name = "SshResizeRequest", description = "ssh 修改大小请求 实体对象")
public class SshResizeRequest extends TerminalBasePayload { public class SshResizeRequest extends TerminalBasePayload {
@Schema(description = "列数") /**
* 列数
*/
private Integer cols; private Integer cols;
@Schema(description = "行数") /**
* 行数
*/
private Integer rows; private Integer rows;
} }

View File

@@ -1,7 +1,6 @@
package com.orion.visor.module.asset.handler.host.terminal.model.request; package com.orion.visor.module.asset.handler.host.terminal.model.request;
import com.orion.visor.module.asset.handler.host.terminal.model.TerminalBasePayload; import com.orion.visor.module.asset.handler.host.terminal.model.TerminalBasePayload;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
@@ -22,13 +21,16 @@ import lombok.experimental.SuperBuilder;
@NoArgsConstructor @NoArgsConstructor
@AllArgsConstructor @AllArgsConstructor
@EqualsAndHashCode(callSuper = true) @EqualsAndHashCode(callSuper = true)
@Schema(name = "TerminalConnectRequest", description = "主机连接检查请求 实体对象")
public class TerminalCheckRequest extends TerminalBasePayload { public class TerminalCheckRequest extends TerminalBasePayload {
@Schema(description = "主机id") /**
* 主机id
*/
private Long hostId; private Long hostId;
@Schema(description = "连接类型") /**
* 连接类型
*/
private String connectType; private String connectType;
} }

View File

@@ -1,7 +1,6 @@
package com.orion.visor.module.asset.handler.host.terminal.model.request; package com.orion.visor.module.asset.handler.host.terminal.model.request;
import com.orion.visor.module.asset.handler.host.terminal.model.TerminalBasePayload; import com.orion.visor.module.asset.handler.host.terminal.model.TerminalBasePayload;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
@@ -22,16 +21,21 @@ import lombok.experimental.SuperBuilder;
@NoArgsConstructor @NoArgsConstructor
@AllArgsConstructor @AllArgsConstructor
@EqualsAndHashCode(callSuper = true) @EqualsAndHashCode(callSuper = true)
@Schema(name = "TerminalConnectRequest", description = "终端连接请求 实体对象")
public class TerminalConnectRequest extends TerminalBasePayload { public class TerminalConnectRequest extends TerminalBasePayload {
@Schema(description = "伪终端类型") /**
* 伪终端类型
*/
private String terminalType; private String terminalType;
@Schema(description = "列数") /**
* 列数
*/
private Integer cols; private Integer cols;
@Schema(description = "行数") /**
* 行数
*/
private Integer rows; private Integer rows;
} }

View File

@@ -1,7 +1,6 @@
package com.orion.visor.module.asset.handler.host.terminal.model.response; package com.orion.visor.module.asset.handler.host.terminal.model.response;
import com.orion.visor.module.asset.handler.host.terminal.model.TerminalBasePayload; import com.orion.visor.module.asset.handler.host.terminal.model.TerminalBasePayload;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
@@ -20,13 +19,16 @@ import lombok.experimental.SuperBuilder;
@NoArgsConstructor @NoArgsConstructor
@AllArgsConstructor @AllArgsConstructor
@EqualsAndHashCode(callSuper = true) @EqualsAndHashCode(callSuper = true)
@Schema(name = "SftpBaseResponse", description = "sftp 基础响应 实体对象")
public class SftpBaseResponse extends TerminalBasePayload { public class SftpBaseResponse extends TerminalBasePayload {
@Schema(description = "结果") /**
* 结果
*/
private Integer result; private Integer result;
@Schema(description = "消息") /**
* 消息
*/
private String msg; private String msg;
} }

View File

@@ -1,6 +1,5 @@
package com.orion.visor.module.asset.handler.host.terminal.model.response; package com.orion.visor.module.asset.handler.host.terminal.model.response;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
@@ -19,13 +18,16 @@ import lombok.experimental.SuperBuilder;
@NoArgsConstructor @NoArgsConstructor
@AllArgsConstructor @AllArgsConstructor
@EqualsAndHashCode(callSuper = true) @EqualsAndHashCode(callSuper = true)
@Schema(name = "SftpDownloadFlatDirectoryResponse", description = "sftp 下载文件夹展开文件 实体对象")
public class SftpDownloadFlatDirectoryResponse extends SftpBaseResponse { public class SftpDownloadFlatDirectoryResponse extends SftpBaseResponse {
@Schema(description = "currentPath") /**
* currentPath
*/
private String currentPath; private String currentPath;
@Schema(description = "body") /**
* body
*/
private String body; private String body;
} }

Some files were not shown because too many files have changed in this diff Show More