💄 修改表单宽度.

This commit is contained in:
lijiahang
2024-03-13 17:23:42 +08:00
parent 81ae46c181
commit 149e5bc40c
19 changed files with 131 additions and 92 deletions

View File

@@ -10,7 +10,6 @@ import com.orion.ops.framework.mybatis.core.generator.template.Table;
import com.orion.ops.framework.mybatis.core.generator.template.Template;
import java.io.File;
import java.util.concurrent.TimeUnit;
/**
* 代码生成器
@@ -45,10 +44,28 @@ public class CodeGenerators {
// .color("blue", "gray", "red", "green", "white")
// .valueUseFields()
// .build(),
Template.create("exec_host_log", "批量执行主机日志", "exec")
Template.create("exec_log", "执行记录", "exec")
.disableUnitTest()
.vue("exec", "exec-log-exec")
.enableDrawerForm()
.vue("exec", "exec-log")
.enableRowSelection()
.dict("execLogStatus", "status")
.keyName("execStatus")
.field("execStatus")
.fields("WAITING", "RUNNING", "COMPLETED", "FAILED")
.labels("等待中", "运行中", "执行完成", "执行失败")
.color("gray", "green", "arcoblue", "red")
.valueUseFields()
.build(),
Template.create("exec_host_log", "主机执行记录", "exec")
.disableUnitTest()
.vue("exec", "exec-host-log")
.dict("execHostLogStatus", "status")
.keyName("execHostStatus")
.field("execHostStatus")
.fields("WAITING", "RUNNING", "COMPLETED", "FAILED", "INTERRUPTED")
.labels("等待中", "运行中", "执行完成", "执行失败", "已中断")
.color("gray", "green", "arcoblue", "red", "purple")
.valueUseFields()
.build(),
};
// jdbc 配置 - 使用配置文件

View File

@@ -8,7 +8,7 @@
@keyup.enter="() => fetchTableData()">
#foreach($field in ${table.fields})
<!-- $field.comment -->
<a-form-item field="${field.propertyName}" label="${field.comment}" label-col-flex="50px">
<a-form-item field="${field.propertyName}" label="${field.comment}">
#if(${dictMap.containsKey(${field.propertyName})})
<a-select v-model="formModel.${field.propertyName}"
:options="toOptions($dictMap.get(${field.propertyName}).keyField)"
@@ -96,7 +96,7 @@
#if(${dictMap.containsKey(${field.propertyName})})
<!-- $field.comment -->
<template #${field.propertyName}="{ record }">
{{ getDictValue($dictMap.get(${field.propertyName}).keyField, record.${field.propertyName}}) }}
{{ getDictValue($dictMap.get(${field.propertyName}).keyField, record.${field.propertyName}) }}
</template>
#end
#end

View File

@@ -8,7 +8,7 @@ import static com.orion.ops.framework.biz.operator.log.core.enums.OperatorRiskLe
import static com.orion.ops.framework.biz.operator.log.core.enums.OperatorRiskLevel.M;
/**
* 批量执行 操作日志类型
* 批量执行 操作记录类型
*
* @author Jiahang Li
* @version 1.0.1
@@ -35,9 +35,9 @@ public class ExecOperatorType extends InitializingOperatorTypes {
new OperatorType(M, EXEC_COMMAND, "执行主机命令"),
new OperatorType(M, INTERRUPT_EXEC, "中断执行命令"),
new OperatorType(M, INTERRUPT_HOST, "中断主机执行命令 ${logId} ${hostName}"),
new OperatorType(H, DELETE_HOST_LOG, "删除主机执行日志 ${logId} ${hostName}"),
new OperatorType(H, DELETE_LOG, "删除执行日志 ${count} 条"),
new OperatorType(H, CLEAR_LOG, "清理执行日志 ${count} 条"),
new OperatorType(H, DELETE_HOST_LOG, "删除主机执行记录 ${logId} ${hostName}"),
new OperatorType(H, DELETE_LOG, "删除执行记录 ${count} 条"),
new OperatorType(H, CLEAR_LOG, "清理执行记录 ${count} 条"),
};
}

View File

@@ -72,7 +72,10 @@ public class ExecLogServiceImpl implements ExecLogService {
// 查询执行状态
List<ExecLogVO> logList = execLogDAO.of()
.createWrapper()
.select(ExecLogDO::getId, ExecLogDO::getStatus, ExecLogDO::getFinishTime)
.select(ExecLogDO::getId,
ExecLogDO::getStatus,
ExecLogDO::getStartTime,
ExecLogDO::getFinishTime)
.in(ExecLogDO::getId, idList)
.then()
.list(ExecLogConvert.MAPPER::to);
@@ -81,6 +84,7 @@ public class ExecLogServiceImpl implements ExecLogService {
.createWrapper()
.select(ExecHostLogDO::getId,
ExecHostLogDO::getStatus,
ExecHostLogDO::getStartTime,
ExecHostLogDO::getFinishTime,
ExecHostLogDO::getExitStatus,
ExecHostLogDO::getErrorMessage)
@@ -167,8 +171,8 @@ public class ExecLogServiceImpl implements ExecLogService {
.eq(ExecLogDO::getUsername, request.getUsername())
.eq(ExecLogDO::getSource, request.getSource())
.eq(ExecLogDO::getSourceId, request.getSourceId())
.eq(ExecLogDO::getDescription, request.getDescription())
.eq(ExecLogDO::getCommand, request.getCommand())
.like(ExecLogDO::getDescription, request.getDescription())
.like(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))

View File

@@ -32,17 +32,13 @@
</template>
<template #description>
<div>
<a-typography-paragraph
:ellipsis="{
<a-typography-paragraph :ellipsis="{
rows: 1,
}"
>{{ item.content }}
</a-typography-paragraph
>
<a-typography-text
v-if="item.type === 'message'"
class="time-text"
>
}">
{{ item.content }}
</a-typography-paragraph>
<a-typography-text v-if="item.type === 'message'"
class="time-text">
{{ item.time }}
</a-typography-text>
</div>
@@ -51,11 +47,9 @@
</div>
</a-list-item>
<template #footer>
<a-space
fill
:size="0"
:class="{ 'add-border-top': renderList.length < showMax }"
>
<a-space fill
:size="0"
:class="{ 'add-border-top': renderList.length < showMax }">
<div class="footer-wrap">
<a-link @click="allRead">全部已读</a-link>
</div>
@@ -64,10 +58,9 @@
</div>
</a-space>
</template>
<div
v-if="renderList.length && renderList.length < 3"
:style="{ height: (showMax - renderList.length) * 86 + 'px' }"
></div>
<div v-if="renderList.length && renderList.length < 3"
:style="{ height: (showMax - renderList.length) * 86 + 'px' }">
</div>
</a-list>
</template>

View File

@@ -98,6 +98,31 @@ export function formatSecond(second: number, p = 'HH:mm') {
return dateFormat(new Date(~~second * 1000), p);
}
/**
* 格式化持续时间
* @param start
* @param end
*/
export function formatDuration(start: number, end?: number): string {
if (!end) {
return '';
}
const duration = (end - start) / 1000;
const minutes = Math.floor(duration / 60);
const seconds = Math.floor(duration % 60);
let result = '';
if (minutes > 0) {
result += `${minutes}min`;
if (seconds > 0) {
result += ' ';
}
}
if (seconds > 0) {
result += `${seconds}s`;
}
return result;
}
/**
* 格式化数字为 ,分割
*/
@@ -163,7 +188,7 @@ export const resetObject = (obj: any, ignore: string[] = []) => {
export const objectTruthKeyCount = (obj: any, ignore: string[] = []) => {
return Object.keys(obj)
.filter(s => !ignore.includes(s))
.reduce(function (acc, curr) {
.reduce(function(acc, curr) {
const currVal = obj[curr];
return acc + ~~(currVal !== undefined && currVal !== null && currVal?.length !== 0 && currVal !== '');
}, 0);
@@ -196,7 +221,7 @@ export function detectZoom() {
* 获取唯一的 UUID
*/
export function getUUID() {
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
const r = Math.random() * 16 | 0;
const v = c === 'x' ? r : (r & 0x3 | 0x8);
return v.toString(16);

View File

@@ -52,7 +52,6 @@
<!-- 开始时间 -->
<a-form-item field="startTimeRange" label="开始时间">
<a-range-picker v-model="formModel.startTimeRange"
style="width: 100%"
:time-picker-props="{ defaultValue: ['00:00:00', '23:59:59'] }"
show-time
format="YYYY-MM-DD HH:mm:ss" />

View File

@@ -8,39 +8,38 @@
@reset="fetchTableData"
@keyup.enter="() => fetchTableData()">
<!-- 连接用户 -->
<a-form-item field="userId" label="连接用户" label-col-flex="50px">
<a-form-item field="userId" label="连接用户">
<user-selector v-model="formModel.userId"
placeholder="请选择用户"
allow-clear />
</a-form-item>
<!-- 连接主机 -->
<a-form-item field="hostId" label="连接主机" label-col-flex="50px">
<a-form-item field="hostId" label="连接主机">
<host-selector v-model="formModel.hostId"
placeholder="请选择主机"
allow-clear />
</a-form-item>
<!-- 主机地址 -->
<a-form-item field="hostAddress" label="主机地址" label-col-flex="50px">
<a-form-item field="hostAddress" label="主机地址">
<a-input v-model="formModel.hostAddress" placeholder="请输入主机地址" allow-clear />
</a-form-item>
<!-- 状态 -->
<a-form-item field="status" label="状态" label-col-flex="50px">
<a-form-item field="status" label="状态">
<a-select v-model="formModel.status"
placeholder="请选择状态"
:options="toOptions(connectStatusKey)"
allow-clear />
</a-form-item>
<!-- 类型 -->
<a-form-item field="type" label="类型" label-col-flex="50px">
<a-form-item field="type" label="类型">
<a-select v-model="formModel.type"
placeholder="请选择类型"
:options="toOptions(connectTypeKey)"
allow-clear />
</a-form-item>
<!-- 开始时间 -->
<a-form-item field="startTimeRange" label="开始时间" label-col-flex="50px">
<a-form-item field="startTimeRange" label="开始时间">
<a-range-picker v-model="formModel.startTimeRange"
style="width: 100%"
:time-picker-props="{ defaultValue: ['00:00:00', '23:59:59'] }"
show-time
format="YYYY-MM-DD HH:mm:ss" />

View File

@@ -8,35 +8,34 @@
@reset="fetchTableData"
@keyup.enter="() => fetchTableData()">
<!-- 操作用户 -->
<a-form-item field="userId" label="操作用户" label-col-flex="50px">
<a-form-item field="userId" label="操作用户">
<user-selector v-model="formModel.userId"
placeholder="请选择用户"
allow-clear />
</a-form-item>
<!-- 操作主机 -->
<a-form-item field="hostId" label="操作主机" label-col-flex="50px">
<a-form-item field="hostId" label="操作主机">
<host-selector v-model="formModel.hostId"
placeholder="请选择主机"
allow-clear />
</a-form-item>
<!-- 操作类型 -->
<a-form-item field="type" label="操作类型" label-col-flex="50px">
<a-form-item field="type" label="操作类型">
<a-select v-model="formModel.type"
placeholder="请选择类型"
:options="toOptions(sftpOperatorTypeKey)"
allow-clear />
</a-form-item>
<!-- 执行结果 -->
<a-form-item field="result" label="执行结果" label-col-flex="50px">
<a-form-item field="result" label="执行结果">
<a-select v-model="formModel.result"
placeholder="请选择执行结果"
:options="toOptions(sftpOperatorResultKey)"
allow-clear />
</a-form-item>
<!-- 开始时间 -->
<a-form-item field="startTimeRange" label="开始时间" label-col-flex="50px">
<a-form-item field="startTimeRange" label="开始时间">
<a-range-picker v-model="formModel.startTimeRange"
style="width: 100%"
:time-picker-props="{ defaultValue: ['00:00:00', '23:59:59'] }"
show-time
format="YYYY-MM-DD HH:mm:ss" />

View File

@@ -7,22 +7,22 @@
@reset="fetchTableData"
@keyup.enter="() => fetchTableData()">
<!-- id -->
<a-form-item field="id" label="id" label-col-flex="50px">
<a-form-item field="id" label="id">
<a-input-number v-model="formModel.id"
placeholder="请输入id"
allow-clear
hide-button />
</a-form-item>
<!-- 名称 -->
<a-form-item field="name" label="名称" label-col-flex="50px">
<a-form-item field="name" label="名称">
<a-input v-model="formModel.name" placeholder="请输入名称" allow-clear />
</a-form-item>
<!-- 用户名 -->
<a-form-item field="username" label="用户名" label-col-flex="50px">
<a-form-item field="username" label="用户名">
<a-input v-model="formModel.username" placeholder="请输入用户名" allow-clear />
</a-form-item>
<!-- 主机秘钥 -->
<a-form-item field="keyId" label="主机秘钥" label-col-flex="50px">
<a-form-item field="keyId" label="主机秘钥">
<host-key-selector v-model="formModel.keyId" allow-clear />
</a-form-item>
</query-header>

View File

@@ -7,14 +7,14 @@
@reset="fetchTableData"
@keyup.enter="() => fetchTableData()">
<!-- id -->
<a-form-item field="id" label="id" label-col-flex="30px">
<a-form-item field="id" label="id">
<a-input-number v-model="formModel.id"
placeholder="请输入id"
allow-clear
hide-button />
</a-form-item>
<!-- 名称 -->
<a-form-item field="name" label="名称" label-col-flex="30px">
<a-form-item field="name" label="名称">
<a-input v-model="formModel.name" placeholder="请输入名称" allow-clear />
</a-form-item>
</query-header>

View File

@@ -7,26 +7,26 @@
@reset="fetchTableData"
@keyup.enter="() => fetchTableData()">
<!-- id -->
<a-form-item field="id" label="主机id" label-col-flex="50px">
<a-form-item field="id" label="主机id">
<a-input-number v-model="formModel.id"
placeholder="请输入主机id"
allow-clear
hide-button />
</a-form-item>
<!-- 主机名称 -->
<a-form-item field="name" label="主机名称" label-col-flex="50px">
<a-form-item field="name" label="主机名称">
<a-input v-model="formModel.name" placeholder="请输入主机名称" allow-clear />
</a-form-item>
<!-- 主机编码 -->
<a-form-item field="code" label="主机编码" label-col-flex="50px">
<a-form-item field="code" label="主机编码">
<a-input v-model="formModel.code" placeholder="请输入主机编码" allow-clear />
</a-form-item>
<!-- 主机地址 -->
<a-form-item field="address" label="主机地址" label-col-flex="50px">
<a-form-item field="address" label="主机地址">
<a-input v-model="formModel.address" placeholder="请输入主机地址" allow-clear />
</a-form-item>
<!-- 主机标签 -->
<a-form-item field="tags" label="主机标签" label-col-flex="50px">
<a-form-item field="tags" label="主机标签">
<tag-multi-selector v-model="formModel.tags"
ref="tagSelector"
:allowCreate="false"

View File

@@ -7,20 +7,20 @@
@reset="fetchTableData"
@keyup.enter="() => fetchTableData()">
<!-- id -->
<a-form-item field="id" label="id" label-col-flex="50px">
<a-form-item field="id" label="id">
<a-input-number v-model="formModel.id"
placeholder="请输入id"
allow-clear
hide-button />
</a-form-item>
<!-- 模板名称 -->
<a-form-item field="name" label="模板名称" label-col-flex="50px">
<a-form-item field="name" label="模板名称">
<a-input v-model="formModel.name"
placeholder="请输入模板名称"
allow-clear />
</a-form-item>
<!-- 模板命令 -->
<a-form-item field="command" label="模板命令" label-col-flex="50px">
<a-form-item field="command" label="模板命令">
<a-input v-model="formModel.command"
placeholder="请输入模板命令"
allow-clear />

View File

@@ -7,12 +7,16 @@
@reset="fetchTableData"
@keyup.enter="() => fetchTableData()">
<!-- 配置项 -->
<a-form-item field="keyName" label="配置项" label-col-flex="50px">
<a-input v-model="formModel.keyName" placeholder="请输入配置项" allow-clear />
<a-form-item field="keyName" label="配置项">
<a-input v-model="formModel.keyName"
placeholder="请输入配置项"
allow-clear />
</a-form-item>
<!-- 配置描述 -->
<a-form-item field="description" label="配置描述" label-col-flex="50px">
<a-input v-model="formModel.description" placeholder="请输入配置描述" allow-clear />
<a-form-item field="description" label="配置描述">
<a-input v-model="formModel.description"
placeholder="请输入配置描述"
allow-clear />
</a-form-item>
</query-header>
</a-card>

View File

@@ -7,18 +7,18 @@
@reset="resetForm"
@keyup.enter="() => fetchTableData()">
<!-- 配置项 -->
<a-form-item field="keyId" label="配置项" label-col-flex="50px">
<a-form-item field="keyId" label="配置项">
<dict-key-selector v-model="formModel.keyId"
@change="changeKey"
allow-create
allow-clear />
</a-form-item>
<!-- 配置值 -->
<a-form-item field="value" label="配置值" label-col-flex="50px">
<a-form-item field="value" label="配置值">
<a-input v-model="formModel.value" placeholder="请输入配置值" allow-clear />
</a-form-item>
<!-- 配置描述 -->
<a-form-item field="label" label="配置描述" label-col-flex="50px">
<a-form-item field="label" label="配置描述">
<a-input v-model="formModel.label" placeholder="请输入配置描述" allow-clear />
</a-form-item>
</query-header>

View File

@@ -18,9 +18,7 @@
:label-col-props="{ span: 5 }"
:wrapper-col-props="{ span: 18 }">
<!-- 操作用户 -->
<a-form-item field="userId"
label="操作用户"
>
<a-form-item field="userId" label="操作用户">
<user-selector v-model="formModel.userId"
placeholder="请选择操作用户"
allow-clear />
@@ -60,7 +58,6 @@
<!-- 执行时间 -->
<a-form-item field="startTimeRange" label="执行时间">
<a-range-picker v-model="formModel.startTimeRange"
style="width: 100%"
:time-picker-props="{ defaultValue: ['00:00:00', '23:59:59'] }"
show-time
format="YYYY-MM-DD HH:mm:ss" />

View File

@@ -8,14 +8,13 @@
<!-- 操作用户 -->
<a-form-item v-if="visibleUser"
field="userId"
label="操作用户"
label-col-flex="50px">
label="操作用户">
<user-selector v-model="formModel.userId"
placeholder="请选择操作用户"
allow-clear />
</a-form-item>
<!-- 操作模块 -->
<a-form-item field="module" label="操作模块" label-col-flex="50px">
<a-form-item field="module" label="操作模块">
<a-select v-model="formModel.module"
:options="toOptions(operatorLogModuleKey)"
:allow-search="true"
@@ -24,7 +23,7 @@
allow-clear />
</a-form-item>
<!-- 操作类型 -->
<a-form-item field="type" label="操作类型" label-col-flex="50px">
<a-form-item field="type" label="操作类型">
<a-select v-model="formModel.type"
:options="typeOptions"
:allow-search="true"
@@ -33,23 +32,22 @@
allow-clear />
</a-form-item>
<!-- 风险等级 -->
<a-form-item field="riskLevel" label="风险等级" label-col-flex="50px">
<a-form-item field="riskLevel" label="风险等级">
<a-select v-model="formModel.riskLevel"
:options="toOptions(operatorRiskLevelKey)"
placeholder="请选择风险等级"
allow-clear />
</a-form-item>
<!-- 执行结果 -->
<a-form-item field="result" label="执行结果" label-col-flex="50px">
<a-form-item field="result" label="执行结果">
<a-select v-model="formModel.result"
:options="toOptions(operatorLogResultKey)"
placeholder="请选择执行结果"
allow-clear />
</a-form-item>
<!-- 执行时间 -->
<a-form-item field="startTimeRange" label="执行时间" label-col-flex="50px">
<a-form-item field="startTimeRange" label="执行时间">
<a-range-picker v-model="formModel.startTimeRange"
style="width: 100%"
:time-picker-props="{ defaultValue: ['00:00:00', '23:59:59'] }"
show-time
format="YYYY-MM-DD HH:mm:ss" />

View File

@@ -7,15 +7,19 @@
@reset="fetchTableData"
@keyup.enter="() => fetchTableData()">
<!-- 角色名称 -->
<a-form-item field="name" label="角色名称" label-col-flex="50px">
<a-input v-model="formModel.name" placeholder="请输入角色名称" allow-clear />
<a-form-item field="name" label="角色名称">
<a-input v-model="formModel.name"
placeholder="请输入角色名称"
allow-clear />
</a-form-item>
<!-- 角色编码 -->
<a-form-item field="code" label="角色编码" label-col-flex="50px">
<a-input v-model="formModel.code" placeholder="请输入角色编码" allow-clear />
<a-form-item field="code" label="角色编码">
<a-input v-model="formModel.code"
placeholder="请输入角色编码"
allow-clear />
</a-form-item>
<!-- 角色状态 -->
<a-form-item field="status" label="角色状态" label-col-flex="50px">
<a-form-item field="status" label="角色状态">
<a-select v-model="formModel.status"
placeholder="请选择角色状态"
:options="toOptions(roleStatusKey)"

View File

@@ -7,33 +7,33 @@
@reset="fetchTableData"
@keyup.enter="() => fetchTableData()">
<!-- id -->
<a-form-item field="id" label="id" label-col-flex="50px">
<a-form-item field="id" label="id">
<a-input-number v-model="formModel.id"
placeholder="请输入id"
allow-clear
hide-button />
</a-form-item>
<!-- 用户名 -->
<a-form-item field="username" label="用户名" label-col-flex="50px">
<a-form-item field="username" label="用户名">
<a-input v-model="formModel.username" placeholder="请输入用户名" allow-clear />
</a-form-item>
<!-- 花名 -->
<a-form-item field="nickname" label="花名" label-col-flex="50px">
<a-form-item field="nickname" label="花名">
<a-input v-model="formModel.nickname" placeholder="请输入花名" allow-clear />
</a-form-item>
<!-- 用户状态 -->
<a-form-item field="status" label="用户状态" label-col-flex="50px">
<a-form-item field="status" label="用户状态">
<a-select v-model="formModel.status"
:options="toOptions(userStatusKey)"
placeholder="请选择用户状态"
allow-clear />
</a-form-item>
<!-- 手机号 -->
<a-form-item field="mobile" label="手机号" label-col-flex="50px">
<a-form-item field="mobile" label="手机号">
<a-input v-model="formModel.mobile" placeholder="请输入手机号" allow-clear />
</a-form-item>
<!-- 邮箱 -->
<a-form-item field="email" label="邮箱" label-col-flex="50px">
<a-form-item field="email" label="邮箱">
<a-input v-model="formModel.email" placeholder="请输入邮箱" allow-clear />
</a-form-item>
</query-header>