diff --git a/orion-ops-framework/orion-ops-spring-boot-starter-mybatis/src/main/java/com/orion/ops/framework/mybatis/core/generator/CodeGenerators.java b/orion-ops-framework/orion-ops-spring-boot-starter-mybatis/src/main/java/com/orion/ops/framework/mybatis/core/generator/CodeGenerators.java index b6bd90d1..c6ae7dee 100644 --- a/orion-ops-framework/orion-ops-spring-boot-starter-mybatis/src/main/java/com/orion/ops/framework/mybatis/core/generator/CodeGenerators.java +++ b/orion-ops-framework/orion-ops-spring-boot-starter-mybatis/src/main/java/com/orion/ops/framework/mybatis/core/generator/CodeGenerators.java @@ -45,11 +45,9 @@ public class CodeGenerators { // .color("blue", "gray", "red", "green", "white") // .valueUseFields() // .build(), - Template.create("exec_template", "执行模板", "exec") + Template.create("exec_log", "执行日志", "exec") .disableUnitTest() - .cache("exec:template:list", "执行模板列表") - .expire(1, TimeUnit.DAYS) - .vue("exec", "exec-template") + .vue("exec", "exec-log") .enableDrawerForm() .build(), }; diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/controller/ExecLogController.http b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/controller/ExecLogController.http new file mode 100644 index 00000000..a3eb7d06 --- /dev/null +++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/controller/ExecLogController.http @@ -0,0 +1,93 @@ +### 创建执行日志 +POST {{baseUrl}}/asset/exec-log/create +Content-Type: application/json +Authorization: {{token}} + +{ + "userId": "", + "source": "", + "sourceId": "", + "desc": "", + "command": "", + "status": "", + "startTime": "", + "finishTime": "" +} + + +### 更新执行日志 +PUT {{baseUrl}}/asset/exec-log/update +Content-Type: application/json +Authorization: {{token}} + +{ + "id": "", + "userId": "", + "source": "", + "sourceId": "", + "desc": "", + "command": "", + "status": "", + "startTime": "", + "finishTime": "" +} + + +### 查询执行日志 +GET {{baseUrl}}/asset/exec-log/get?id=1 +Authorization: {{token}} + + +### 批量查询执行日志 +GET {{baseUrl}}/asset/exec-log/batch-get?idList=1,2,3 +Authorization: {{token}} + + +### 查询全部执行日志 +POST {{baseUrl}}/asset/exec-log/list +Content-Type: application/json +Authorization: {{token}} + +{ + "id": "", + "userId": "", + "source": "", + "sourceId": "", + "desc": "", + "command": "", + "status": "", + "startTime": "", + "finishTime": "" +} + + +### 分页查询执行日志 +POST {{baseUrl}}/asset/exec-log/query +Content-Type: application/json +Authorization: {{token}} + +{ + "page": 1, + "limit": 10, + "id": "", + "userId": "", + "source": "", + "sourceId": "", + "desc": "", + "command": "", + "status": "", + "startTime": "", + "finishTime": "" +} + + +### 删除执行日志 +DELETE {{baseUrl}}/asset/exec-log/delete?id=1 +Authorization: {{token}} + + +### 批量删除执行日志 +DELETE {{baseUrl}}/asset/exec-log/batch-delete?idList=1,2,3 +Authorization: {{token}} + +### diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/controller/ExecLogController.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/controller/ExecLogController.java new file mode 100644 index 00000000..bb8dba57 --- /dev/null +++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/controller/ExecLogController.java @@ -0,0 +1,79 @@ +package com.orion.ops.module.asset.controller; + +import com.orion.lang.define.wrapper.DataGrid; +import com.orion.ops.framework.biz.operator.log.core.annotation.OperatorLog; +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.ExecLogOperatorType; +import com.orion.ops.module.asset.entity.request.exec.ExecLogQueryRequest; +import com.orion.ops.module.asset.entity.vo.ExecLogVO; +import com.orion.ops.module.asset.service.ExecLogService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.Parameter; +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 javax.annotation.Resource; +import java.util.List; + +/** + * 执行日志 api + * + * @author Jiahang Li + * @version 1.0.1 + * @since 2024-3-11 11:31 + */ +@Tag(name = "asset - 执行日志服务") +@Slf4j +@Validated +@RestWrapper +@RestController +@RequestMapping("/asset/exec-log") +@SuppressWarnings({"ELValidationInJSP", "SpringElInspection"}) +public class ExecLogController { + + @Resource + private ExecLogService execLogService; + + @IgnoreLog(IgnoreLogMode.RET) + @GetMapping("/get") + @Operation(summary = "查询执行日志") + @Parameter(name = "id", description = "id", required = true) + @PreAuthorize("@ss.hasPermission('asset:exec-log:query')") + public ExecLogVO getExecLog(@RequestParam("id") Long id) { + return execLogService.getExecLogById(id); + } + + @IgnoreLog(IgnoreLogMode.RET) + @PostMapping("/query") + @Operation(summary = "分页查询执行日志") + @PreAuthorize("@ss.hasPermission('asset:exec-log:query')") + public DataGrid getExecLogPage(@Validated(Page.class) @RequestBody ExecLogQueryRequest request) { + return execLogService.getExecLogPage(request); + } + + @OperatorLog(ExecLogOperatorType.DELETE) + @DeleteMapping("/delete") + @Operation(summary = "删除执行日志") + @Parameter(name = "id", description = "id", required = true) + @PreAuthorize("@ss.hasPermission('asset:exec-log:delete')") + public Integer deleteExecLog(@RequestParam("id") Long id) { + return execLogService.deleteExecLogById(id); + } + + @OperatorLog(ExecLogOperatorType.DELETE) + @DeleteMapping("/batch-delete") + @Operation(summary = "批量删除执行日志") + @Parameter(name = "idList", description = "idList", required = true) + @PreAuthorize("@ss.hasPermission('asset:exec-log:delete')") + public Integer batchDeleteExecLog(@RequestParam("idList") List idList) { + return execLogService.deleteExecLogByIdList(idList); + } + +} + diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/convert/ExecLogConvert.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/convert/ExecLogConvert.java new file mode 100644 index 00000000..11185bc1 --- /dev/null +++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/convert/ExecLogConvert.java @@ -0,0 +1,29 @@ +package com.orion.ops.module.asset.convert; + +import com.orion.ops.module.asset.entity.domain.ExecLogDO; +import com.orion.ops.module.asset.entity.request.exec.ExecLogQueryRequest; +import com.orion.ops.module.asset.entity.vo.ExecLogVO; +import org.mapstruct.Mapper; +import org.mapstruct.factory.Mappers; + +import java.util.List; + +/** + * 执行日志 内部对象转换器 + * + * @author Jiahang Li + * @version 1.0.1 + * @since 2024-3-11 11:31 + */ +@Mapper +public interface ExecLogConvert { + + ExecLogConvert MAPPER = Mappers.getMapper(ExecLogConvert.class); + + ExecLogDO to(ExecLogQueryRequest request); + + ExecLogVO to(ExecLogDO domain); + + List to(List list); + +} diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/dao/ExecLogDAO.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/dao/ExecLogDAO.java new file mode 100644 index 00000000..443c1f6c --- /dev/null +++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/dao/ExecLogDAO.java @@ -0,0 +1,17 @@ +package com.orion.ops.module.asset.dao; + +import com.orion.ops.framework.mybatis.core.mapper.IMapper; +import com.orion.ops.module.asset.entity.domain.ExecLogDO; +import org.apache.ibatis.annotations.Mapper; + +/** + * 执行日志 Mapper 接口 + * + * @author Jiahang Li + * @version 1.0.1 + * @since 2024-3-11 11:31 + */ +@Mapper +public interface ExecLogDAO extends IMapper { + +} diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/define/operator/ExecLogOperatorType.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/define/operator/ExecLogOperatorType.java new file mode 100644 index 00000000..881d0bec --- /dev/null +++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/define/operator/ExecLogOperatorType.java @@ -0,0 +1,28 @@ +package com.orion.ops.module.asset.define.operator; + +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; + +/** + * 执行日志 操作日志类型 + * + * @author Jiahang Li + * @version 1.0.1 + * @since 2024-3-11 11:31 + */ +@Module("asset:exec-log") +public class ExecLogOperatorType extends InitializingOperatorTypes { + + public static final String DELETE = "exec-log:delete"; + + @Override + public OperatorType[] types() { + return new OperatorType[]{ + new OperatorType(H, DELETE, "删除执行日志"), + }; + } + +} diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/domain/ExecLogDO.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/domain/ExecLogDO.java new file mode 100644 index 00000000..d1a1b3d9 --- /dev/null +++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/domain/ExecLogDO.java @@ -0,0 +1,67 @@ +package com.orion.ops.module.asset.entity.domain; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.orion.ops.framework.mybatis.core.domain.BaseDO; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; + +import java.util.Date; + +/** + * 执行日志 实体对象 + * + * @author Jiahang Li + * @version 1.0.1 + * @since 2024-3-11 11:31 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +@EqualsAndHashCode(callSuper = true) +@TableName(value = "exec_log", autoResultMap = true) +@Schema(name = "ExecLogDO", description = "执行日志 实体对象") +public class ExecLogDO extends BaseDO { + + private static final long serialVersionUID = 1L; + + @Schema(description = "id") + @TableId(value = "id", type = IdType.AUTO) + private Long id; + + @Schema(description = "执行用户id") + @TableField("user_id") + private Long userId; + + @Schema(description = "执行来源") + @TableField("source") + private String source; + + @Schema(description = "执行来源id") + @TableField("source_id") + private Long sourceId; + + @Schema(description = "执行描述") + @TableField("desc") + private String desc; + + @Schema(description = "执行命令") + @TableField("command") + private String command; + + @Schema(description = "执行状态") + @TableField("status") + private String status; + + @Schema(description = "执行开始时间") + @TableField("start_time") + private Date startTime; + + @Schema(description = "执行完成时间") + @TableField("finish_time") + private Date finishTime; + +} diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/request/exec/ExecLogQueryRequest.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/request/exec/ExecLogQueryRequest.java new file mode 100644 index 00000000..ab58cfea --- /dev/null +++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/request/exec/ExecLogQueryRequest.java @@ -0,0 +1,54 @@ +package com.orion.ops.module.asset.entity.request.exec; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.orion.ops.framework.common.entity.PageRequest; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.*; + +import javax.validation.constraints.Size; +import java.util.Date; + +/** + * 执行日志 查询请求对象 + * + * @author Jiahang Li + * @version 1.0.1 + * @since 2024-3-11 11:31 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +@EqualsAndHashCode(callSuper = true) +@Schema(name = "ExecLogQueryRequest", description = "执行日志 查询请求对象") +public class ExecLogQueryRequest extends PageRequest { + + @Schema(description = "id") + private Long id; + + @Schema(description = "执行用户id") + private Long userId; + + @Size(max = 12) + @Schema(description = "执行来源") + private String source; + + @Schema(description = "执行来源id") + private Long sourceId; + + @Size(max = 128) + @Schema(description = "执行描述") + private String desc; + + @Schema(description = "执行命令") + private String command; + + @Size(max = 12) + @Schema(description = "执行状态") + private String status; + + @Schema(description = "开始时间-区间") + @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + private Date[] startTimeRange; + +} diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/vo/ExecLogVO.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/vo/ExecLogVO.java new file mode 100644 index 00000000..9a8e7457 --- /dev/null +++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/entity/vo/ExecLogVO.java @@ -0,0 +1,55 @@ +package com.orion.ops.module.asset.entity.vo; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; +import java.util.Date; + +/** + * 执行日志 视图响应对象 + * + * @author Jiahang Li + * @version 1.0.1 + * @since 2024-3-11 11:31 + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +@Schema(name = "ExecLogVO", description = "执行日志 视图响应对象") +public class ExecLogVO implements Serializable { + + private static final long serialVersionUID = 1L; + + @Schema(description = "id") + private Long id; + + @Schema(description = "执行用户id") + private Long userId; + + @Schema(description = "执行来源") + private String source; + + @Schema(description = "执行来源id") + private Long sourceId; + + @Schema(description = "执行描述") + private String desc; + + @Schema(description = "执行命令") + private String command; + + @Schema(description = "执行状态") + private String status; + + @Schema(description = "执行开始时间") + private Date startTime; + + @Schema(description = "执行完成时间") + private Date finishTime; + +} diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/service/ExecLogService.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/service/ExecLogService.java new file mode 100644 index 00000000..d0b9e1c5 --- /dev/null +++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/service/ExecLogService.java @@ -0,0 +1,50 @@ +package com.orion.ops.module.asset.service; + +import com.orion.lang.define.wrapper.DataGrid; +import com.orion.ops.module.asset.entity.request.exec.ExecLogQueryRequest; +import com.orion.ops.module.asset.entity.vo.ExecLogVO; + +import java.util.List; + +/** + * 执行日志 服务类 + * + * @author Jiahang Li + * @version 1.0.1 + * @since 2024-3-11 11:31 + */ +public interface ExecLogService { + + /** + * 查询执行日志 + * + * @param id id + * @return row + */ + ExecLogVO getExecLogById(Long id); + + /** + * 分页查询执行日志 + * + * @param request request + * @return rows + */ + DataGrid getExecLogPage(ExecLogQueryRequest request); + + /** + * 删除执行日志 + * + * @param id id + * @return effect + */ + Integer deleteExecLogById(Long id); + + /** + * 批量删除执行日志 + * + * @param idList idList + * @return effect + */ + Integer deleteExecLogByIdList(List idList); + +} diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/service/impl/ExecLogServiceImpl.java b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/service/impl/ExecLogServiceImpl.java new file mode 100644 index 00000000..ef4aae05 --- /dev/null +++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/java/com/orion/ops/module/asset/service/impl/ExecLogServiceImpl.java @@ -0,0 +1,93 @@ +package com.orion.ops.module.asset.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.orion.lang.define.wrapper.DataGrid; +import com.orion.lang.utils.Arrays1; +import com.orion.ops.framework.common.constant.ErrorMessage; +import com.orion.ops.framework.common.utils.Valid; +import com.orion.ops.module.asset.convert.ExecLogConvert; +import com.orion.ops.module.asset.dao.ExecLogDAO; +import com.orion.ops.module.asset.entity.domain.ExecLogDO; +import com.orion.ops.module.asset.entity.request.exec.ExecLogQueryRequest; +import com.orion.ops.module.asset.entity.vo.ExecLogVO; +import com.orion.ops.module.asset.service.ExecLogService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.List; + +/** + * 执行日志 服务实现类 + * + * @author Jiahang Li + * @version 1.0.1 + * @since 2024-3-11 11:31 + */ +@Slf4j +@Service +public class ExecLogServiceImpl implements ExecLogService { + + @Resource + private ExecLogDAO execLogDAO; + + @Override + public ExecLogVO getExecLogById(Long id) { + // 查询 + ExecLogDO record = execLogDAO.selectById(id); + Valid.notNull(record, ErrorMessage.DATA_ABSENT); + // 转换 + return ExecLogConvert.MAPPER.to(record); + } + + @Override + public DataGrid getExecLogPage(ExecLogQueryRequest request) { + // 条件 + LambdaQueryWrapper wrapper = this.buildQueryWrapper(request); + // 查询 + return execLogDAO.of(wrapper) + .page(request) + .dataGrid(ExecLogConvert.MAPPER::to); + } + + @Override + public Integer deleteExecLogById(Long id) { + log.info("ExecLogService-deleteExecLogById id: {}", id); + // 检查数据是否存在 + ExecLogDO record = execLogDAO.selectById(id); + Valid.notNull(record, ErrorMessage.DATA_ABSENT); + // 删除 + int effect = execLogDAO.deleteById(id); + log.info("ExecLogService-deleteExecLogById id: {}, effect: {}", id, effect); + return effect; + } + + @Override + public Integer deleteExecLogByIdList(List idList) { + log.info("ExecLogService-deleteExecLogByIdList idList: {}", idList); + int effect = execLogDAO.deleteBatchIds(idList); + log.info("ExecLogService-deleteExecLogByIdList effect: {}", effect); + return effect; + } + + /** + * 构建查询 wrapper + * + * @param request request + * @return wrapper + */ + private LambdaQueryWrapper buildQueryWrapper(ExecLogQueryRequest request) { + return execLogDAO.wrapper() + .eq(ExecLogDO::getId, request.getId()) + .eq(ExecLogDO::getUserId, request.getUserId()) + .eq(ExecLogDO::getSource, request.getSource()) + .eq(ExecLogDO::getSourceId, request.getSourceId()) + .eq(ExecLogDO::getDesc, request.getDesc()) + .eq(ExecLogDO::getCommand, request.getCommand()) + .eq(ExecLogDO::getStatus, request.getStatus()) + .ge(ExecLogDO::getStartTime, Arrays1.getIfPresent(request.getStartTimeRange(), 0)) + .le(ExecLogDO::getStartTime, Arrays1.getIfPresent(request.getStartTimeRange(), 1)) + .orderByDesc(ExecLogDO::getId); + } + +} diff --git a/orion-ops-module-asset/orion-ops-module-asset-service/src/main/resources/mapper/ExecLogMapper.xml b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/resources/mapper/ExecLogMapper.xml new file mode 100644 index 00000000..a2332936 --- /dev/null +++ b/orion-ops-module-asset/orion-ops-module-asset-service/src/main/resources/mapper/ExecLogMapper.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + id, user_id, source, source_id, desc, command, status, start_time, finish_time, create_time, update_time, creator, updater, deleted + + +