diff --git a/orion-ops-framework/orion-ops-framework-common/src/main/java/com/orion/ops/framework/common/constant/FilterOrderConst.java b/orion-ops-framework/orion-ops-framework-common/src/main/java/com/orion/ops/framework/common/constant/FilterOrderConst.java index 24910615..112fee6e 100644 --- a/orion-ops-framework/orion-ops-framework-common/src/main/java/com/orion/ops/framework/common/constant/FilterOrderConst.java +++ b/orion-ops-framework/orion-ops-framework-common/src/main/java/com/orion/ops/framework/common/constant/FilterOrderConst.java @@ -13,6 +13,4 @@ public interface FilterOrderConst { int CORS_FILTER = Integer.MIN_VALUE + 2000; - int MYBATIS_CACHE_CLEAR_FILTER = Integer.MIN_VALUE + 100000; - } diff --git a/orion-ops-framework/orion-ops-spring-boot-starter-mybatis/src/main/java/com/orion/ops/framework/mybatis/configuration/OrionMybatisAutoConfiguration.java b/orion-ops-framework/orion-ops-spring-boot-starter-mybatis/src/main/java/com/orion/ops/framework/mybatis/configuration/OrionMybatisAutoConfiguration.java index 0b51e0ee..4a331acb 100644 --- a/orion-ops-framework/orion-ops-spring-boot-starter-mybatis/src/main/java/com/orion/ops/framework/mybatis/configuration/OrionMybatisAutoConfiguration.java +++ b/orion-ops-framework/orion-ops-spring-boot-starter-mybatis/src/main/java/com/orion/ops/framework/mybatis/configuration/OrionMybatisAutoConfiguration.java @@ -4,17 +4,13 @@ import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler; import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor; import com.orion.ops.framework.common.constant.AutoConfigureOrderConst; -import com.orion.ops.framework.common.constant.FilterOrderConst; -import com.orion.ops.framework.common.web.filter.FilterCreator; import com.orion.ops.framework.common.security.SecurityHolder; -import com.orion.ops.framework.mybatis.core.cache.CacheClearFilter; import com.orion.ops.framework.mybatis.core.handler.FieldFillHandler; import com.orion.ops.framework.mybatis.core.utils.DomainFillUtils; import org.apache.ibatis.annotations.Mapper; import org.mybatis.spring.annotation.MapperScan; import org.springframework.boot.autoconfigure.AutoConfiguration; import org.springframework.boot.autoconfigure.AutoConfigureOrder; -import org.springframework.boot.web.servlet.FilterRegistrationBean; import org.springframework.context.annotation.Bean; /** @@ -51,12 +47,4 @@ public class OrionMybatisAutoConfiguration { return interceptor; } - /** - * @return mybatis 缓存清理过滤器 - */ - @Bean - public FilterRegistrationBean rowCacheClearFilterBean() { - return FilterCreator.create(new CacheClearFilter(), FilterOrderConst.MYBATIS_CACHE_CLEAR_FILTER); - } - } diff --git a/orion-ops-framework/orion-ops-spring-boot-starter-mybatis/src/main/java/com/orion/ops/framework/mybatis/core/cache/CacheClearFilter.java b/orion-ops-framework/orion-ops-spring-boot-starter-mybatis/src/main/java/com/orion/ops/framework/mybatis/core/cache/CacheClearFilter.java deleted file mode 100644 index 9b2f8989..00000000 --- a/orion-ops-framework/orion-ops-spring-boot-starter-mybatis/src/main/java/com/orion/ops/framework/mybatis/core/cache/CacheClearFilter.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.orion.ops.framework.mybatis.core.cache; - -import org.springframework.web.filter.OncePerRequestFilter; - -import javax.servlet.FilterChain; -import javax.servlet.ServletException; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import java.io.IOException; - -/** - * mybatis 缓存清理过滤器 - * - * @author Jiahang Li - * @version 1.0.0 - * @since 2023/6/25 15:14 - */ -public class CacheClearFilter extends OncePerRequestFilter { - - @Override - protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { - try { - // 执行请求 - filterChain.doFilter(request, response); - } finally { - // 清理缓存 - CacheHolder.remove(); - } - } - -} diff --git a/orion-ops-framework/orion-ops-spring-boot-starter-mybatis/src/main/java/com/orion/ops/framework/mybatis/core/cache/CacheHolder.java b/orion-ops-framework/orion-ops-spring-boot-starter-mybatis/src/main/java/com/orion/ops/framework/mybatis/core/cache/CacheHolder.java deleted file mode 100644 index 6773b6da..00000000 --- a/orion-ops-framework/orion-ops-spring-boot-starter-mybatis/src/main/java/com/orion/ops/framework/mybatis/core/cache/CacheHolder.java +++ /dev/null @@ -1,61 +0,0 @@ -package com.orion.ops.framework.mybatis.core.cache; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.orion.lang.define.collect.MultiHashMap; -import com.orion.lang.define.wrapper.Ref; - -import java.io.Serializable; - -/** - * 缓存行持有者 - * - * @author Jiahang Li - * @version 1.0.0 - * @since 2023/6/25 14:21 - */ -public class CacheHolder { - - private CacheHolder() { - } - - /** - * 缓存 - *

- * key: mapper - * value: id > row - */ - private static final ThreadLocal, Serializable, Ref>> HOLDER = ThreadLocal.withInitial(MultiHashMap::new); - - /** - * 获取缓存 - * - * @param mapper mapper - * @param id id - * @param domain - * @return cacheWrapper - */ - @SuppressWarnings("unchecked") - public static Ref get(BaseMapper mapper, Serializable id) { - return (Ref) HOLDER.get().get(mapper, id); - } - - /** - * 设置缓存 - * - * @param mapper mapper - * @param id id - * @param row row - * @param domainClass - */ - public static void set(BaseMapper mapper, Serializable id, T row) { - HOLDER.get().put(mapper, id, new Ref<>(row)); - } - - /** - * 清空缓存 - */ - public static void remove() { - HOLDER.remove(); - } - -} diff --git a/orion-ops-framework/orion-ops-spring-boot-starter-mybatis/src/main/java/com/orion/ops/framework/mybatis/core/mapper/IMapper.java b/orion-ops-framework/orion-ops-spring-boot-starter-mybatis/src/main/java/com/orion/ops/framework/mybatis/core/mapper/IMapper.java index a4f35734..fba5bcec 100644 --- a/orion-ops-framework/orion-ops-spring-boot-starter-mybatis/src/main/java/com/orion/ops/framework/mybatis/core/mapper/IMapper.java +++ b/orion-ops-framework/orion-ops-spring-boot-starter-mybatis/src/main/java/com/orion/ops/framework/mybatis/core/mapper/IMapper.java @@ -3,11 +3,9 @@ package com.orion.ops.framework.mybatis.core.mapper; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.toolkit.Db; -import com.orion.ops.framework.mybatis.core.query.CacheQuery; import com.orion.ops.framework.mybatis.core.query.Conditions; import com.orion.ops.framework.mybatis.core.query.DataQuery; -import java.io.Serializable; import java.util.Collection; /** @@ -56,25 +54,6 @@ public interface IMapper extends BaseMapper { return DataQuery.of(this, wrapper); } - /** - * 获取 CacheQuery 对象 - * - * @return CacheQuery - */ - default CacheQuery cache() { - return CacheQuery.of(this); - } - - /** - * 获取 CacheQuery 对象 - * - * @param id id - * @return CacheQuery - */ - default CacheQuery cache(Serializable id) { - return CacheQuery.of(this, id); - } - /** * 批量插入 * diff --git a/orion-ops-framework/orion-ops-spring-boot-starter-mybatis/src/main/java/com/orion/ops/framework/mybatis/core/query/CacheQuery.java b/orion-ops-framework/orion-ops-spring-boot-starter-mybatis/src/main/java/com/orion/ops/framework/mybatis/core/query/CacheQuery.java deleted file mode 100644 index c9c413fd..00000000 --- a/orion-ops-framework/orion-ops-spring-boot-starter-mybatis/src/main/java/com/orion/ops/framework/mybatis/core/query/CacheQuery.java +++ /dev/null @@ -1,95 +0,0 @@ -package com.orion.ops.framework.mybatis.core.query; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.orion.lang.define.wrapper.Ref; -import com.orion.lang.utils.Valid; -import com.orion.ops.framework.mybatis.core.cache.CacheHolder; - -import java.io.Serializable; -import java.util.Optional; -import java.util.function.Function; - -/** - * 缓存查询器 - *

- * 查询会存入缓存 - * - * @author Jiahang Li - * @version 1.0.0 - * @since 2023/6/25 13:05 - */ -public class CacheQuery { - - private final BaseMapper dao; - - private Serializable id; - - private boolean force; - - private CacheQuery(BaseMapper dao, Serializable id) { - this.dao = dao; - this.id = id; - } - - public static CacheQuery of(BaseMapper dao) { - Valid.notNull(dao, "dao is null"); - return new CacheQuery<>(dao, null); - } - - public static CacheQuery of(BaseMapper dao, Serializable id) { - Valid.notNull(dao, "dao is null"); - Valid.notNull(id, "id is null"); - return new CacheQuery<>(dao, id); - } - - /** - * 设置 id - * - * @param id id - * @return this - */ - public CacheQuery id(Serializable id) { - this.id = id; - return this; - } - - /** - * 强制查询 - * - * @param id id - * @return this - */ - public CacheQuery force(Serializable id) { - this.force = true; - this.id = id; - return this; - } - - public Optional optional(Function mapper) { - Valid.notNull(mapper, "convert function is null"); - return Optional.ofNullable(this.get()) - .map(mapper); - } - - public Optional optional() { - return Optional.ofNullable(this.get()); - } - - public T get() { - // 不查询缓存 - if (!force) { - // 从缓存中获取 - Ref ref = CacheHolder.get(dao, id); - // 命中直接返回 - if (ref != null) { - return ref.get(); - } - } - // 查询 - T row = dao.selectById(id); - // 设置缓存 - CacheHolder.set(dao, id, row); - return row; - } - -} diff --git a/orion-ops-framework/orion-ops-spring-boot-starter-mybatis/src/main/resources/templates/orion-sql-dict.sql.vm b/orion-ops-framework/orion-ops-spring-boot-starter-mybatis/src/main/resources/templates/orion-sql-dict.sql.vm index 97811b54..d9c5ae93 100644 --- a/orion-ops-framework/orion-ops-spring-boot-starter-mybatis/src/main/resources/templates/orion-sql-dict.sql.vm +++ b/orion-ops-framework/orion-ops-spring-boot-starter-mybatis/src/main/resources/templates/orion-sql-dict.sql.vm @@ -7,20 +7,18 @@ SELECT @MODULE_KEY_ID:= id FROM dict_key WHERE key_name = 'operatorLogModule' AN SELECT @MODULE_KEY_MAX_SORT:= IFNULL(MAX(sort), 0) FROM dict_value where key_id = @MODULE_KEY_ID AND deleted = 0; -- 类型 key id SELECT @TYPE_KEY_ID:= id FROM dict_key WHERE key_name = 'operatorLogType' AND deleted = 0; --- 类型 key 排序 -SELECT @TYPE_KEY_MAX_SORT:= IFNULL(MAX(sort), 0) FROM dict_value WHERE key_id = @TYPE_KEY_ID AND deleted = 0; -- 插入类型 INSERT INTO dict_value (`key_id`, `key_name`, `value`, `label`, `extra`, `sort`, `create_time`, `update_time`, `creator`, `updater`, `deleted`) VALUES (@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}', '{}', @TYPE_KEY_MAX_SORT + 10, now(), now(), '1', '1', 0), - (@TYPE_KEY_ID, 'operatorLogType', '${typeHyphen}:update', '更新$!{table.comment}', '{}', @TYPE_KEY_MAX_SORT + 20, 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), #if($meta.enableExport) - (@TYPE_KEY_ID, 'operatorLogType', '${typeHyphen}:delete', '删除$!{table.comment}', '{}', @TYPE_KEY_MAX_SORT + 30, now(), now(), '1', '1', 0), - (@TYPE_KEY_ID, 'operatorLogType', '${typeHyphen}:export', '导出$!{table.comment}', '{}', @TYPE_KEY_MAX_SORT + 40, now(), now(), '1', '1', 0); + (@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}', '{}', @TYPE_KEY_MAX_SORT + 30, now(), now(), '1', '1', 0); + (@TYPE_KEY_ID, 'operatorLogType', '${typeHyphen}:delete', '删除$!{table.comment}', '{}', 30, now(), now(), '1', '1', 0); #end #end diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/controller/ExecCommandController.http b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/controller/ExecCommandController.http index b3cb0647..d7d38ceb 100644 --- a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/controller/ExecCommandController.http +++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/controller/ExecCommandController.http @@ -20,14 +20,5 @@ Authorization: {{token}} "logId": 1 } -### 中断执行命令 -POST {{baseUrl}}/asset/exec-command/interrupt -Content-Type: application/json -Authorization: {{token}} - -{ - "logId": 7 -} - ### diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/controller/ExecCommandController.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/controller/ExecCommandController.java index c8790fa7..27d6b07a 100644 --- a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/controller/ExecCommandController.java +++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/controller/ExecCommandController.java @@ -1,24 +1,22 @@ package com.orion.ops.module.asset.controller; -import com.orion.lang.define.wrapper.HttpWrapper; import com.orion.ops.framework.biz.operator.log.core.annotation.OperatorLog; import com.orion.ops.framework.biz.operator.log.core.enums.ReturnType; -import com.orion.ops.framework.common.utils.Valid; import com.orion.ops.framework.web.core.annotation.RestWrapper; import com.orion.ops.module.asset.define.operator.ExecCommandOperatorType; import com.orion.ops.module.asset.entity.request.exec.ExecCommandRequest; -import com.orion.ops.module.asset.entity.request.exec.ExecInterruptRequest; import com.orion.ops.module.asset.entity.request.exec.ReExecCommandRequest; import com.orion.ops.module.asset.entity.vo.ExecLogVO; -import com.orion.ops.module.asset.enums.ExecSourceEnum; import com.orion.ops.module.asset.service.ExecCommandService; -import com.orion.ops.module.asset.service.ExecLogService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.extern.slf4j.Slf4j; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; import javax.annotation.Resource; @@ -38,14 +36,9 @@ import javax.annotation.Resource; @SuppressWarnings({"ELValidationInJSP", "SpringElInspection"}) public class ExecCommandController { - private static final String SOURCE = ExecSourceEnum.BATCH.name(); - @Resource private ExecCommandService execCommandService; - @Resource - private ExecLogService execLogService; - @OperatorLog(value = ExecCommandOperatorType.EXEC, ret = ReturnType.IGNORE) @PostMapping("/exec") @Operation(summary = "批量执行命令") @@ -62,24 +55,4 @@ public class ExecCommandController { return execCommandService.reExecCommand(request.getLogId()); } - @OperatorLog(ExecCommandOperatorType.INTERRUPT_EXEC) - @PutMapping("/interrupt") - @Operation(summary = "中断执行命令") - @PreAuthorize("@ss.hasPermission('asset:exec-command:interrupt')") - public HttpWrapper interruptExecCommand(@RequestBody ExecInterruptRequest request) { - Long logId = Valid.notNull(request.getLogId()); - execLogService.interruptExec(logId, SOURCE); - return HttpWrapper.ok(); - } - - @OperatorLog(ExecCommandOperatorType.INTERRUPT_HOST) - @PutMapping("/interrupt-host") - @Operation(summary = "中断执行主机命令") - @PreAuthorize("@ss.hasPermission('asset:exec-command:interrupt')") - public HttpWrapper interruptHostExecCommand(@RequestBody ExecInterruptRequest request) { - Long hostLogId = Valid.notNull(request.getHostLogId()); - execLogService.interruptHostExec(hostLogId, SOURCE); - return HttpWrapper.ok(); - } - } diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/controller/ExecCommandLogController.http b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/controller/ExecCommandLogController.http index feadcd05..d142f9d1 100644 --- a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/controller/ExecCommandLogController.http +++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/controller/ExecCommandLogController.http @@ -40,9 +40,19 @@ Authorization: {{token}} } -### 下载执行日志文件 +### 下载批量执行日志文件 GET {{baseUrl}}/asset/exec-command-log/download?id=83 Authorization: {{token}} +### 中断批量执行命令 +POST {{baseUrl}}/asset/exec-command-log/interrupt +Content-Type: application/json +Authorization: {{token}} + +{ + "logId": 7 +} + + ### diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/controller/ExecCommandLogController.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/controller/ExecCommandLogController.java index 01c86921..925b5162 100644 --- a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/controller/ExecCommandLogController.java +++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/controller/ExecCommandLogController.java @@ -1,13 +1,17 @@ package com.orion.ops.module.asset.controller; import com.orion.lang.define.wrapper.DataGrid; +import com.orion.lang.define.wrapper.HttpWrapper; import com.orion.ops.framework.biz.operator.log.core.annotation.OperatorLog; +import com.orion.ops.framework.common.utils.Valid; import com.orion.ops.framework.common.validator.group.Page; import com.orion.ops.framework.log.core.annotation.IgnoreLog; import com.orion.ops.framework.log.core.enums.IgnoreLogMode; import com.orion.ops.framework.security.core.utils.SecurityUtils; import com.orion.ops.framework.web.core.annotation.RestWrapper; import com.orion.ops.module.asset.define.operator.ExecCommandLogOperatorType; +import com.orion.ops.module.asset.define.operator.ExecCommandOperatorType; +import com.orion.ops.module.asset.entity.request.exec.ExecInterruptRequest; import com.orion.ops.module.asset.entity.request.exec.ExecLogQueryRequest; import com.orion.ops.module.asset.entity.request.exec.ExecLogTailRequest; import com.orion.ops.module.asset.entity.vo.ExecHostLogVO; @@ -156,5 +160,25 @@ public class ExecCommandLogController { execLogService.downloadLogFile(id, SOURCE, response); } + @OperatorLog(ExecCommandLogOperatorType.INTERRUPT) + @PutMapping("/interrupt") + @Operation(summary = "中断批量执行命令") + @PreAuthorize("@ss.hasPermission('asset:exec-command-log:interrupt')") + public HttpWrapper interruptExecCommand(@RequestBody ExecInterruptRequest request) { + Long logId = Valid.notNull(request.getLogId()); + execLogService.interruptExec(logId, SOURCE); + return HttpWrapper.ok(); + } + + @OperatorLog(ExecCommandLogOperatorType.INTERRUPT_HOST) + @PutMapping("/interrupt-host") + @Operation(summary = "中断批量执行主机命令") + @PreAuthorize("@ss.hasPermission('asset:exec-command-log:interrupt')") + public HttpWrapper interruptHostExecCommand(@RequestBody ExecInterruptRequest request) { + Long hostLogId = Valid.notNull(request.getHostLogId()); + execLogService.interruptHostExec(hostLogId, SOURCE); + return HttpWrapper.ok(); + } + } diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/controller/ExecJobController.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/controller/ExecJobController.java index 31280676..ea012df0 100644 --- a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/controller/ExecJobController.java +++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/controller/ExecJobController.java @@ -20,6 +20,7 @@ import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; +import java.util.List; /** * 计划任务 api @@ -73,6 +74,14 @@ public class ExecJobController { return execJobService.getExecJobById(id); } + @IgnoreLog(IgnoreLogMode.RET) + @GetMapping("/list") + @Operation(summary = "查询全部计划任务") + @PreAuthorize("@ss.hasPermission('asset:exec-job:query')") + public List getExecJobList() { + return execJobService.getExecJobList(); + } + @IgnoreLog(IgnoreLogMode.RET) @PostMapping("/query") @Operation(summary = "分页查询计划任务") diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/controller/ExecJobLogController.http b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/controller/ExecJobLogController.http index 3b62f862..8474b5c8 100644 --- a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/controller/ExecJobLogController.http +++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/controller/ExecJobLogController.http @@ -30,7 +30,7 @@ DELETE {{baseUrl}}/asset/exec-job-log/batch-delete?idList=1,2,3 Authorization: {{token}} -### 查看执行日志 +### 查看计划任务日志 POST {{baseUrl}}/asset/exec-job-log/tail Content-Type: application/json Authorization: {{token}} @@ -40,9 +40,18 @@ Authorization: {{token}} } -### 下载执行日志文件 +### 下载计划任务日志文件 GET {{baseUrl}}/asset/exec-job-log/download?id=83 Authorization: {{token}} +### 中断计划任务命令 +POST {{baseUrl}}/asset/exec-command-log/interrupt +Content-Type: application/json +Authorization: {{token}} + +{ + "logId": 7 +} + ### diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/controller/ExecJobLogController.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/controller/ExecJobLogController.java index 7f2e4e27..f2d14c63 100644 --- a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/controller/ExecJobLogController.java +++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/controller/ExecJobLogController.java @@ -1,12 +1,16 @@ package com.orion.ops.module.asset.controller; import com.orion.lang.define.wrapper.DataGrid; +import com.orion.lang.define.wrapper.HttpWrapper; import com.orion.ops.framework.biz.operator.log.core.annotation.OperatorLog; +import com.orion.ops.framework.common.utils.Valid; import com.orion.ops.framework.common.validator.group.Page; import com.orion.ops.framework.log.core.annotation.IgnoreLog; import com.orion.ops.framework.log.core.enums.IgnoreLogMode; import com.orion.ops.framework.web.core.annotation.RestWrapper; +import com.orion.ops.module.asset.define.operator.ExecCommandLogOperatorType; import com.orion.ops.module.asset.define.operator.ExecJobLogOperatorType; +import com.orion.ops.module.asset.entity.request.exec.ExecInterruptRequest; import com.orion.ops.module.asset.entity.request.exec.ExecLogQueryRequest; import com.orion.ops.module.asset.entity.request.exec.ExecLogTailRequest; import com.orion.ops.module.asset.entity.vo.ExecHostLogVO; @@ -145,5 +149,25 @@ public class ExecJobLogController { execLogService.downloadLogFile(id, SOURCE, response); } + @OperatorLog(ExecJobLogOperatorType.INTERRUPT) + @PutMapping("/interrupt") + @Operation(summary = "中断计划任务命令") + @PreAuthorize("@ss.hasPermission('asset:exec-job-log:interrupt')") + public HttpWrapper interruptExecCommand(@RequestBody ExecInterruptRequest request) { + Long logId = Valid.notNull(request.getLogId()); + execLogService.interruptExec(logId, SOURCE); + return HttpWrapper.ok(); + } + + @OperatorLog(ExecJobLogOperatorType.INTERRUPT_HOST) + @PutMapping("/interrupt-host") + @Operation(summary = "中断计划任务主机命令") + @PreAuthorize("@ss.hasPermission('asset:exec-job-log:interrupt')") + public HttpWrapper interruptHostExecCommand(@RequestBody ExecInterruptRequest request) { + Long hostLogId = Valid.notNull(request.getHostLogId()); + execLogService.interruptHostExec(hostLogId, SOURCE); + return HttpWrapper.ok(); + } + } diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/define/operator/ExecCommandLogOperatorType.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/define/operator/ExecCommandLogOperatorType.java index f285ef0d..fc4d2d8d 100644 --- a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/define/operator/ExecCommandLogOperatorType.java +++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/define/operator/ExecCommandLogOperatorType.java @@ -4,8 +4,7 @@ import com.orion.ops.framework.biz.operator.log.core.annotation.Module; import com.orion.ops.framework.biz.operator.log.core.factory.InitializingOperatorTypes; import com.orion.ops.framework.biz.operator.log.core.model.OperatorType; -import static com.orion.ops.framework.biz.operator.log.core.enums.OperatorRiskLevel.H; -import static com.orion.ops.framework.biz.operator.log.core.enums.OperatorRiskLevel.L; +import static com.orion.ops.framework.biz.operator.log.core.enums.OperatorRiskLevel.*; /** * 批量执行日志 操作记录类型 @@ -25,6 +24,10 @@ public class ExecCommandLogOperatorType extends InitializingOperatorTypes { public static final String DOWNLOAD = "exec-command-log:download"; + public static final String INTERRUPT = "exec-command-log:interrupt"; + + public static final String INTERRUPT_HOST = "exec-command-log:interrupt-host"; + @Override public OperatorType[] types() { return new OperatorType[]{ @@ -32,6 +35,8 @@ public class ExecCommandLogOperatorType extends InitializingOperatorTypes { new OperatorType(H, DELETE_HOST, "删除批量执行主机日志 ${logId} ${hostName}"), new OperatorType(H, CLEAR, "清理批量执行日志 ${count} 条"), new OperatorType(L, DOWNLOAD, "下载批量执行日志 ${logId} ${hostName}"), + new OperatorType(M, INTERRUPT, "中断批量执行命令"), + new OperatorType(M, INTERRUPT_HOST, "中断批量执行主机命令 ${logId} ${hostName}"), }; } diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/define/operator/ExecCommandOperatorType.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/define/operator/ExecCommandOperatorType.java index b4b28c9a..399363fa 100644 --- a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/define/operator/ExecCommandOperatorType.java +++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/define/operator/ExecCommandOperatorType.java @@ -18,16 +18,10 @@ public class ExecCommandOperatorType extends InitializingOperatorTypes { public static final String EXEC = "exec-command:exec"; - public static final String INTERRUPT_EXEC = "exec-command:interrupt-exec"; - - public static final String INTERRUPT_HOST = "exec-command:interrupt-host"; - @Override public OperatorType[] types() { return new OperatorType[]{ new OperatorType(M, EXEC, "执行主机命令"), - new OperatorType(M, INTERRUPT_EXEC, "中断执行命令"), - new OperatorType(M, INTERRUPT_HOST, "中断主机执行命令 ${logId} ${hostName}"), }; } diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/define/operator/ExecJobLogOperatorType.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/define/operator/ExecJobLogOperatorType.java index 1b9064e6..e6d79590 100644 --- a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/define/operator/ExecJobLogOperatorType.java +++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/define/operator/ExecJobLogOperatorType.java @@ -4,8 +4,7 @@ import com.orion.ops.framework.biz.operator.log.core.annotation.Module; import com.orion.ops.framework.biz.operator.log.core.factory.InitializingOperatorTypes; import com.orion.ops.framework.biz.operator.log.core.model.OperatorType; -import static com.orion.ops.framework.biz.operator.log.core.enums.OperatorRiskLevel.H; -import static com.orion.ops.framework.biz.operator.log.core.enums.OperatorRiskLevel.L; +import static com.orion.ops.framework.biz.operator.log.core.enums.OperatorRiskLevel.*; /** * 计划任务执行日志 操作记录类型 @@ -25,6 +24,10 @@ public class ExecJobLogOperatorType extends InitializingOperatorTypes { public static final String DOWNLOAD = "exec-job-log:download"; + public static final String INTERRUPT = "exec-job-log:interrupt"; + + public static final String INTERRUPT_HOST = "exec-job-log:interrupt-host"; + @Override public OperatorType[] types() { return new OperatorType[]{ @@ -32,6 +35,8 @@ public class ExecJobLogOperatorType extends InitializingOperatorTypes { new OperatorType(H, DELETE_HOST, "删除计划任务执行主机日志 ${logId} ${hostName}"), new OperatorType(H, CLEAR, "清理计划任务执行日志 ${count} 条"), new OperatorType(L, DOWNLOAD, "下载计划任务执行日志 ${logId} ${hostName}"), + new OperatorType(M, INTERRUPT, "中断计划任务执行命令"), + new OperatorType(M, INTERRUPT_HOST, "中断计划任务执行主机命令 ${logId} ${hostName}"), }; } diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/service/ExecJobService.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/service/ExecJobService.java index 9946dc5e..cbe2bf30 100644 --- a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/service/ExecJobService.java +++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/service/ExecJobService.java @@ -4,6 +4,8 @@ import com.orion.lang.define.wrapper.DataGrid; import com.orion.ops.module.asset.entity.request.exec.*; import com.orion.ops.module.asset.entity.vo.ExecJobVO; +import java.util.List; + /** * 计划任务 服务类 * @@ -45,6 +47,13 @@ public interface ExecJobService { */ ExecJobVO getExecJobById(Long id); + /** + * 查询全部计划任务 + * + * @return rows + */ + List getExecJobList(); + /** * 分页查询计划任务 * diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/service/impl/ExecCommandServiceImpl.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/service/impl/ExecCommandServiceImpl.java index 8328cae9..d4063294 100644 --- a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/service/impl/ExecCommandServiceImpl.java +++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/service/impl/ExecCommandServiceImpl.java @@ -221,6 +221,7 @@ public class ExecCommandServiceImpl implements ExecCommandService { // 添加内置参数 params.put("userId", request.getUserId()); params.put("username", request.getUsername()); + params.put("source", request.getSourceId()); params.put("sourceId", request.getSourceId()); params.put("seq", request.getExecSeq()); params.put("execId", execId); diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/service/impl/ExecJobServiceImpl.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/service/impl/ExecJobServiceImpl.java index 9430ac9c..ba922ef5 100644 --- a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/service/impl/ExecJobServiceImpl.java +++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/service/impl/ExecJobServiceImpl.java @@ -164,6 +164,15 @@ public class ExecJobServiceImpl implements ExecJobService { return vo; } + @Override + public List getExecJobList() { + return execJobDAO.of() + .createWrapper() + .select(ExecJobDO::getId, ExecJobDO::getName) + .then() + .list(ExecJobConvert.MAPPER::to); + } + @Override public DataGrid getExecJobPage(ExecJobQueryRequest request) { // 条件 diff --git a/orion-ops-ui/src/api/exec/exec-command-log.ts b/orion-ops-ui/src/api/exec/exec-command-log.ts index 21ee1808..3473e397 100644 --- a/orion-ops-ui/src/api/exec/exec-command-log.ts +++ b/orion-ops-ui/src/api/exec/exec-command-log.ts @@ -1,105 +1,41 @@ -import type { DataGrid, Pagination } from '@/types/global'; -import type { TableData } from '@arco-design/web-vue/es/table/interface'; +import type { DataGrid } from '@/types/global'; +import type { + ExecHostLogQueryResponse, + ExecLogInterruptRequest, + ExecLogQueryRequest, + ExecLogQueryResponse, + ExecLogStatusResponse, + ExecLogTailRequest +} from './exec-log'; import axios from 'axios'; import qs from 'query-string'; -/** - * 批量执行日志查询请求 - */ -export interface ExecCommandLogQueryRequest extends Pagination { - id?: number; - userId?: number; - description?: string; - command?: string; - status?: string; - startTimeRange?: string[]; -} - -/** - * 批量执行日志查询响应 - */ -export interface ExecCommandLogQueryResponse extends TableData, ExecCommandLogQueryExtraResponse { - id: number; - userId: number; - username: string; - description: string; - command: string; - parameterSchema: string; - timeout: number; - status: string; - startTime: number; - finishTime: number; - hostIdList: Array; - hosts: Array; -} - -/** - * 批量执行日志查询响应 拓展 - */ -export interface ExecCommandLogQueryExtraResponse { - hosts: Array; -} - -/** - * 主机批量执行日志查询响应 - */ -export interface ExecCommandHostLogQueryResponse extends TableData { - id: number; - logId: number; - hostId: number; - hostName: string; - hostAddress: string; - status: string; - command: string; - parameter: string; - exitStatus: number; - errorMessage: string; - startTime: number; - finishTime: number; -} - -/** - * 批量执行状态查询响应 - */ -export interface ExecCommandLogStatusResponse { - logList: Array; - hostList: Array; -} - -/** - * 批量执行日志 tail 请求 - */ -export interface ExecCommandLogTailRequest { - execId?: number; - hostExecIdList?: Array; -} - /** * 分页查询批量执行日志 */ -export function getExecCommandLogPage(request: ExecCommandLogQueryRequest) { - return axios.post>('/asset/exec-command-log/query', request); +export function getExecCommandLogPage(request: ExecLogQueryRequest) { + return axios.post>('/asset/exec-command-log/query', request); } /** * 查询批量执行日志 */ export function getExecCommandLog(id: number) { - return axios.get('/asset/exec-command-log/get', { params: { id } }); + return axios.get('/asset/exec-command-log/get', { params: { id } }); } /** * 查询主机批量执行日志 */ export function getExecCommandHostLogList(logId: number) { - return axios.get>('/asset/exec-command-log/host-list', { params: { logId } }); + return axios.get>('/asset/exec-command-log/host-list', { params: { logId } }); } /** * 查询命令执行状态 */ export function getExecCommandLogStatus(idList: Array) { - return axios.get('/asset/exec-command-log/status', { + return axios.get('/asset/exec-command-log/status', { params: { idList }, paramsSerializer: params => { return qs.stringify(params, { arrayFormat: 'comma' }); @@ -111,7 +47,7 @@ export function getExecCommandLogStatus(idList: Array) { * 查询历史批量执行日志 */ export function getExecCommandLogHistory(limit: number) { - return axios.get>('/asset/exec-command-log/history', { params: { page: 1, limit } }); + return axios.get>('/asset/exec-command-log/history', { params: { page: 1, limit } }); } /** @@ -143,21 +79,21 @@ export function deleteExecCommandHostLog(id: number) { /** * 查询批量执行日志数量 */ -export function getExecCommandLogCount(request: ExecCommandLogQueryRequest) { +export function getExecCommandLogCount(request: ExecLogQueryRequest) { return axios.post('/asset/exec-command-log/query-count', request); } /** * 清空批量执行日志 */ -export function clearExecCommandLog(request: ExecCommandLogQueryRequest) { +export function clearExecCommandLog(request: ExecLogQueryRequest) { return axios.post('/asset/exec-command-log/clear', request); } /** * 查看批量执行日志 */ -export function getExecCommandLogTailToken(request: ExecCommandLogTailRequest) { +export function getExecCommandLogTailToken(request: ExecLogTailRequest) { return axios.post('/asset/exec-command-log/tail', request); } @@ -167,3 +103,17 @@ export function getExecCommandLogTailToken(request: ExecCommandLogTailRequest) { export function downloadExecCommandLogFile(id: number) { return axios.get('/asset/exec-command-log/download', { unwrap: true, params: { id } }); } + +/** + * 中断执行命令 + */ +export function interruptExecCommand(request: ExecLogInterruptRequest) { + return axios.put('/asset/exec-command-log/interrupt', request); +} + +/** + * 中断执行主机命令 + */ +export function interruptHostExecCommand(request: ExecLogInterruptRequest) { + return axios.put('/asset/exec-command-log/interrupt-host', request); +} diff --git a/orion-ops-ui/src/api/exec/exec-command.ts b/orion-ops-ui/src/api/exec/exec-command.ts index 9c3b6568..6c59840c 100644 --- a/orion-ops-ui/src/api/exec/exec-command.ts +++ b/orion-ops-ui/src/api/exec/exec-command.ts @@ -1,4 +1,4 @@ -import type { ExecCommandLogQueryResponse } from './exec-command-log'; +import type { ExecLogQueryResponse } from './exec-log'; import axios from 'axios'; /** @@ -13,38 +13,16 @@ export interface ExecCommandRequest { hostIdList?: Array; } -/** - * 中断命令请求 - */ -export interface ExecCommandInterruptRequest { - logId?: number; - hostLogId?: number; -} - /** * 批量执行命令 */ export function batchExecCommand(request: ExecCommandRequest) { - return axios.post('/asset/exec-command/exec', request); + return axios.post('/asset/exec-command/exec', request); } /** * 重新执行命令 */ export function reExecCommand(request: ExecCommandRequest) { - return axios.post('/asset/exec-command/re-exec', request); -} - -/** - * 中断执行命令 - */ -export function interruptExecCommand(request: ExecCommandInterruptRequest) { - return axios.put('/asset/exec-command/interrupt', request); -} - -/** - * 中断执行主机命令 - */ -export function interruptHostExecCommand(request: ExecCommandInterruptRequest) { - return axios.put('/asset/exec-command/interrupt-host', request); + return axios.post('/asset/exec-command/re-exec', request); } diff --git a/orion-ops-ui/src/api/exec/exec-job-log.ts b/orion-ops-ui/src/api/exec/exec-job-log.ts index 650511ef..d7ed05e1 100644 --- a/orion-ops-ui/src/api/exec/exec-job-log.ts +++ b/orion-ops-ui/src/api/exec/exec-job-log.ts @@ -1,105 +1,41 @@ -import type { DataGrid, Pagination } from '@/types/global'; -import type { TableData } from '@arco-design/web-vue/es/table/interface'; +import type { DataGrid } from '@/types/global'; +import type { + ExecHostLogQueryResponse, + ExecLogQueryRequest, + ExecLogQueryResponse, + ExecLogStatusResponse, + ExecLogTailRequest, + ExecLogInterruptRequest +} from './exec-log'; import axios from 'axios'; import qs from 'query-string'; -/** - * 计划任务日志查询请求 - */ -export interface ExecJobLogQueryRequest extends Pagination { - id?: number; - userId?: number; - description?: string; - command?: string; - status?: string; - startTimeRange?: string[]; -} - -/** - * 计划任务日志查询响应 - */ -export interface ExecJobLogQueryResponse extends TableData, ExecJobLogQueryExtraResponse { - id: number; - userId: number; - username: string; - description: string; - command: string; - parameterSchema: string; - timeout: number; - status: string; - startTime: number; - finishTime: number; - hostIdList: Array; - hosts: Array; -} - -/** - * 计划任务日志查询响应 拓展 - */ -export interface ExecJobLogQueryExtraResponse { - hosts: Array; -} - -/** - * 主机计划任务日志查询响应 - */ -export interface ExecJobHostLogQueryResponse extends TableData { - id: number; - logId: number; - hostId: number; - hostName: string; - hostAddress: string; - status: string; - command: string; - parameter: string; - exitStatus: number; - errorMessage: string; - startTime: number; - finishTime: number; -} - -/** - * 计划任务状态查询响应 - */ -export interface ExecJobLogStatusResponse { - logList: Array; - hostList: Array; -} - -/** - * 计划任务日志 tail 请求 - */ -export interface ExecJobLogTailRequest { - execId?: number; - hostExecIdList?: Array; -} - /** * 分页查询计划任务日志 */ -export function getExecJobLogPage(request: ExecJobLogQueryRequest) { - return axios.post>('/asset/exec-job-log/query', request); +export function getExecJobLogPage(request: ExecLogQueryRequest) { + return axios.post>('/asset/exec-job-log/query', request); } /** * 查询计划任务日志 */ export function getExecJobLog(id: number) { - return axios.get('/asset/exec-job-log/get', { params: { id } }); + return axios.get('/asset/exec-job-log/get', { params: { id } }); } /** * 查询主机计划任务日志 */ export function getExecJobHostLogList(logId: number) { - return axios.get>('/asset/exec-job-log/host-list', { params: { logId } }); + return axios.get>('/asset/exec-job-log/host-list', { params: { logId } }); } /** * 查询命令执行状态 */ export function getExecJobLogStatus(idList: Array) { - return axios.get('/asset/exec-job-log/status', { + return axios.get('/asset/exec-job-log/status', { params: { idList }, paramsSerializer: params => { return qs.stringify(params, { arrayFormat: 'comma' }); @@ -136,21 +72,21 @@ export function deleteExecJobHostLog(id: number) { /** * 查询计划任务日志数量 */ -export function getExecJobLogCount(request: ExecJobLogQueryRequest) { +export function getExecJobLogCount(request: ExecLogQueryRequest) { return axios.post('/asset/exec-job-log/query-count', request); } /** * 清空计划任务日志 */ -export function clearExecJobLog(request: ExecJobLogQueryRequest) { +export function clearExecJobLog(request: ExecLogQueryRequest) { return axios.post('/asset/exec-job-log/clear', request); } /** * 查看计划任务日志 */ -export function getExecJobLogTailToken(request: ExecJobLogTailRequest) { +export function getExecJobLogTailToken(request: ExecLogTailRequest) { return axios.post('/asset/exec-job-log/tail', request); } @@ -160,3 +96,17 @@ export function getExecJobLogTailToken(request: ExecJobLogTailRequest) { export function downloadExecJobLogFile(id: number) { return axios.get('/asset/exec-job-log/download', { unwrap: true, params: { id } }); } + +/** + * 中断计划任务执行 + */ +export function interruptExecJob(request: ExecLogInterruptRequest) { + return axios.put('/asset/exec-job-log/interrupt', request); +} + +/** + * 中断计划任务执行主机 + */ +export function interruptHostExecJob(request: ExecLogInterruptRequest) { + return axios.put('/asset/exec-job-log/interrupt-host', request); +} diff --git a/orion-ops-ui/src/api/exec/exec-job.ts b/orion-ops-ui/src/api/exec/exec-job.ts index d8641c92..818226c8 100644 --- a/orion-ops-ui/src/api/exec/exec-job.ts +++ b/orion-ops-ui/src/api/exec/exec-job.ts @@ -89,6 +89,13 @@ export function getExecJob(id: number) { return axios.get('/asset/exec-job/get', { params: { id } }); } +/** + * 查询全部计划任务 + */ +export function getExecJobList() { + return axios.get>('/asset/exec-job/list'); +} + /** * 分页查询计划任务 */ diff --git a/orion-ops-ui/src/api/exec/exec-log.ts b/orion-ops-ui/src/api/exec/exec-log.ts new file mode 100644 index 00000000..6c1fe8e5 --- /dev/null +++ b/orion-ops-ui/src/api/exec/exec-log.ts @@ -0,0 +1,83 @@ +import type { Pagination } from '@/types/global'; +import type { TableData } from '@arco-design/web-vue/es/table/interface'; + +/** + * 执行日志查询请求 + */ +export interface ExecLogQueryRequest extends Pagination { + id?: number; + userId?: number; + sourceId?: number; + description?: string; + command?: string; + status?: string; + startTimeRange?: string[]; +} + +/** + * 执行日志查询响应 + */ +export interface ExecLogQueryResponse extends TableData, ExecLogQueryExtraResponse { + id: number; + userId: number; + username: string; + description: string; + execSeq: number; + command: string; + parameterSchema: string; + timeout: number; + status: string; + startTime: number; + finishTime: number; + hostIdList: Array; + hosts: Array; +} + +/** + * 执行日志查询响应 拓展 + */ +export interface ExecLogQueryExtraResponse { + hosts: Array; +} + +/** + * 主机执行日志查询响应 + */ +export interface ExecHostLogQueryResponse extends TableData { + id: number; + logId: number; + hostId: number; + hostName: string; + hostAddress: string; + status: string; + command: string; + parameter: string; + exitStatus: number; + errorMessage: string; + startTime: number; + finishTime: number; +} + +/** + * 执行状态查询响应 + */ +export interface ExecLogStatusResponse { + logList: Array; + hostList: Array; +} + +/** + * 执行日志 tail 请求 + */ +export interface ExecLogTailRequest { + execId?: number; + hostExecIdList?: Array; +} + +/** + * 执行中断命令请求 + */ +export interface ExecLogInterruptRequest { + logId?: number; + hostLogId?: number; +} diff --git a/orion-ops-ui/src/components/exec/job/selector/index.vue b/orion-ops-ui/src/components/exec/job/selector/index.vue new file mode 100644 index 00000000..73f9ac71 --- /dev/null +++ b/orion-ops-ui/src/components/exec/job/selector/index.vue @@ -0,0 +1,80 @@ + + + + + + + diff --git a/orion-ops-ui/src/components/exec/log/const.ts b/orion-ops-ui/src/components/exec/log/const.ts new file mode 100644 index 00000000..a7c908a3 --- /dev/null +++ b/orion-ops-ui/src/components/exec/log/const.ts @@ -0,0 +1,39 @@ +// 执行类型 +export type ExecType = 'BATCH' | 'JOB'; + +// 批量执行状态 +export const execStatus = { + // 等待中 + WAITING: 'WAITING', + // 运行中 + RUNNING: 'RUNNING', + // 执行完成 + COMPLETED: 'COMPLETED', + // 执行失败 + FAILED: 'FAILED', +}; + +// 主机执行状态 +export const execHostStatus = { + // 等待中 + WAITING: 'WAITING', + // 运行中 + RUNNING: 'RUNNING', + // 执行完成 + COMPLETED: 'COMPLETED', + // 执行失败 + FAILED: 'FAILED', + // 执行超时 + TIMEOUT: 'TIMEOUT', + // 已中断 + INTERRUPTED: 'INTERRUPTED', +}; + +// 执行状态 字典项 +export const execStatusKey = 'execStatus'; + +// 执行状态 字典项 +export const execHostStatusKey = 'execHostStatus'; + +// 加载的字典值 +export const dictKeys = [execStatusKey, execHostStatusKey]; diff --git a/orion-ops-ui/src/components/exec/log/panel-modal/index.vue b/orion-ops-ui/src/components/exec/log/panel-modal/index.vue index 39c41077..7102c94a 100644 --- a/orion-ops-ui/src/components/exec/log/panel-modal/index.vue +++ b/orion-ops-ui/src/components/exec/log/panel-modal/index.vue @@ -16,7 +16,9 @@ :loading="loading">

- +
@@ -29,12 +31,18 @@ diff --git a/orion-ops-ui/src/views/exec/exec-command/components/exec-command-panel-history.vue b/orion-ops-ui/src/views/exec/exec-command/components/exec-command-panel-history.vue index 2c071b3c..ce29e346 100644 --- a/orion-ops-ui/src/views/exec/exec-command/components/exec-command-panel-history.vue +++ b/orion-ops-ui/src/views/exec/exec-command/components/exec-command-panel-history.vue @@ -43,7 +43,7 @@ + + + + diff --git a/orion-ops-ui/src/views/exec/exec-job-log/components/exec-job-host-log-table.vue b/orion-ops-ui/src/views/exec/exec-job-log/components/exec-job-host-log-table.vue new file mode 100644 index 00000000..04ae1ef7 --- /dev/null +++ b/orion-ops-ui/src/views/exec/exec-job-log/components/exec-job-host-log-table.vue @@ -0,0 +1,171 @@ + + + + + + + diff --git a/orion-ops-ui/src/views/exec/exec-job-log/components/exec-job-log-clear-modal.vue b/orion-ops-ui/src/views/exec/exec-job-log/components/exec-job-log-clear-modal.vue new file mode 100644 index 00000000..af70c336 --- /dev/null +++ b/orion-ops-ui/src/views/exec/exec-job-log/components/exec-job-log-clear-modal.vue @@ -0,0 +1,158 @@ + + + + + + + diff --git a/orion-ops-ui/src/views/exec/exec-job-log/components/exec-job-log-table.vue b/orion-ops-ui/src/views/exec/exec-job-log/components/exec-job-log-table.vue new file mode 100644 index 00000000..3c22b096 --- /dev/null +++ b/orion-ops-ui/src/views/exec/exec-job-log/components/exec-job-log-table.vue @@ -0,0 +1,392 @@ + + + + + + + diff --git a/orion-ops-ui/src/views/exec/exec-job-log/index.vue b/orion-ops-ui/src/views/exec/exec-job-log/index.vue new file mode 100644 index 00000000..c681f840 --- /dev/null +++ b/orion-ops-ui/src/views/exec/exec-job-log/index.vue @@ -0,0 +1,97 @@ + + + + + + + diff --git a/orion-ops-ui/src/views/exec/exec-job-log/types/const.ts b/orion-ops-ui/src/views/exec/exec-job-log/types/const.ts new file mode 100644 index 00000000..e69de29b diff --git a/orion-ops-ui/src/views/exec/exec-job-log/types/table.columns.ts b/orion-ops-ui/src/views/exec/exec-job-log/types/table.columns.ts new file mode 100644 index 00000000..080dfaa7 --- /dev/null +++ b/orion-ops-ui/src/views/exec/exec-job-log/types/table.columns.ts @@ -0,0 +1,45 @@ +import type { TableColumnData } from '@arco-design/web-vue/es/table/interface'; + +const columns = [ + { + title: 'id', + dataIndex: 'id', + slotName: 'id', + width: 70, + align: 'left', + fixed: 'left', + }, { + title: '任务名称', + dataIndex: 'description', + slotName: 'description', + align: 'left', + width: 188, + ellipsis: true, + }, { + title: '执行命令', + dataIndex: 'command', + slotName: 'command', + align: 'left', + ellipsis: true, + }, { + title: '执行状态', + dataIndex: 'status', + slotName: 'status', + align: 'left', + width: 118, + }, { + title: '执行时间', + dataIndex: 'startTime', + slotName: 'startTime', + align: 'left', + width: 190, + }, { + title: '操作', + slotName: 'handle', + width: 218, + align: 'center', + fixed: 'right', + }, +] as TableColumnData[]; + +export default columns; diff --git a/orion-ops-ui/src/views/exec/exec-job/components/exec-job-form-drawer.vue b/orion-ops-ui/src/views/exec/exec-job/components/exec-job-form-drawer.vue index 4cb921ea..c4ec3c4d 100644 --- a/orion-ops-ui/src/views/exec/exec-job/components/exec-job-form-drawer.vue +++ b/orion-ops-ui/src/views/exec/exec-job/components/exec-job-form-drawer.vue @@ -69,11 +69,20 @@ - + + import type { ExecJobUpdateRequest } from '@/api/exec/exec-job'; + import type { ExecTemplateQueryResponse } from '@/api/exec/exec-template'; import { onUnmounted, ref } from 'vue'; import useLoading from '@/hooks/loading'; import useVisible from '@/hooks/visible'; @@ -104,7 +114,7 @@ import { useDictStore } from '@/store'; import ExecEditor from '@/components/view/exec-editor/index.vue'; - const emits = defineEmits(['added', 'updated', 'openHost', 'testCron']); + const emits = defineEmits(['added', 'updated', 'openHost', 'openTemplate', 'testCron']); const { visible, setVisible } = useVisible(); const { loading, setLoading } = useLoading(); @@ -170,7 +180,13 @@ formModel.value.hostIdList = hosts; }; - defineExpose({ openAdd, openUpdate, setSelectedHost }); + // 通过模板设置 + const setWithTemplate = (template: ExecTemplateQueryResponse) => { + formModel.value.command = template.command; + formModel.value.timeout = template.timeout; + }; + + defineExpose({ openAdd, openUpdate, setSelectedHost, setWithTemplate }); // 打开选择主机 const openSelectHost = () => { @@ -249,6 +265,14 @@ } } + .command-item { + :deep(.arco-form-item-extra) { + margin-top: -18px; + width: 100%; + text-align: end; + } + } + .command-editor { width: 100%; height: calc(100vh - 264px); diff --git a/orion-ops-ui/src/views/exec/exec-job/index.vue b/orion-ops-ui/src/views/exec/exec-job/index.vue index 015610be..9b1945d5 100644 --- a/orion-ops-ui/src/views/exec/exec-job/index.vue +++ b/orion-ops-ui/src/views/exec/exec-job/index.vue @@ -11,11 +11,15 @@ @added="modalAddCallback" @updated="modalUpdateCallback" @open-host="(e) => hostModal.open(e)" + @open-template="() => templateModal.open()" @test-cron="openNextCron" /> - + + + @@ -37,12 +41,14 @@ import ExecJobDetailDrawer from './components/exec-job-detail-drawer.vue'; import AuthorizedHostModal from '@/components/asset/host/authorized-host-modal/index.vue'; import NextCronModal from '@/components/meta/expression/next-cron-modal/index.vue'; + import ExecTemplateModal from '@/components/exec/template/modal/index.vue'; const render = ref(false); const table = ref(); const drawer = ref(); const detail = ref(); const nextCron = ref(); + const templateModal = ref(); const hostModal = ref(); // 添加回调 diff --git a/orion-ops-ui/src/views/system/dict-value/components/dict-value-form-modal.vue b/orion-ops-ui/src/views/system/dict-value/components/dict-value-form-modal.vue index 3c6584b0..283822ff 100644 --- a/orion-ops-ui/src/views/system/dict-value/components/dict-value-form-modal.vue +++ b/orion-ops-ui/src/views/system/dict-value/components/dict-value-form-modal.vue @@ -88,6 +88,7 @@