Files
SMANAGE/backup/Manage/T4/WL3T.html
T

414 lines
18 KiB
HTML

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="/css/font.css">
<link rel="stylesheet" href="/css/xadmin.css">
<link rel="stylesheet" href="/css/win10ui.css">
<link rel="stylesheet" href="/css/theme.css">
<link rel="stylesheet" href="/lib/layui/css/layui.css">
<link rel="stylesheet" href="/T4/css/task.css">
<link rel="stylesheet" href="/T4/css/hardware.css">
<link rel="stylesheet" href="/T4/css/font.css">
<link rel="stylesheet" href="/T4/css/chart.css">
<link rel="stylesheet" href="/T4/css/cmd.css">
<script type="text/javascript" src="/lib/layui/layui.js" charset="utf-8"></script>
<script type="text/javascript" src="/js/xadmin.js"></script>
<script src="/assets/js/socket/Socket.IO.js"></script>
<script src="/assets/js/core/echarts.min.js"></script>
<script>window.breadcrumbs = [{ name: "首页", url: "" }, { name: "Termination4", url: "" }, { name: "L3T" }];</script>
<script src="/js/address.bar.js"></script>
<style>
.layui-card {
margin: 15px;
}
.layui-table-cell {
height: auto;
white-space: normal;
}
.time-type-select {
width: 100%;
}
/* 调整表单标签宽度 */
.layui-form-label {
width: 120px;
}
.layui-input-block {
margin-left: 150px;
}
/* 调整弹窗宽度 */
.layui-layer-page .layui-layer-content {
padding: 20px;
}
</style>
</head>
<body>
<div class="layui-fluid">
<div class="layui-row layui-col-space15">
<div class="layui-col-md12">
<div class="layui-card">
<div class="layui-card-header">L3T<button class="layui-btn" onclick="socket.emit('T4CMDL3TGetL3T', { PCMachineGUID: PCMachineGUID });" style="margin-left: 30px;">刷新</button></div>
<script type="text/html" id="TPL-Task">
<div class="layui-btn-container">
<button class="layui-btn" lay-event="btnAddTask">新增任务</button>
<button class="layui-btn layui-btn-danger" lay-event="btnDeleteSelected">删除选中</button>
</div>
</script>
<div class="layui-card-body">
<table id="taskTable" lay-filter="taskTable"></table>
</div>
</div>
</div>
</div>
</div>
<!-- 新增/编辑任务表单 -->
<div id="taskForm" style="display: none; padding: 20px;">
<form class="layui-form" lay-filter="taskForm">
<input type="text" name="TaskUUID" style="display: none;">
<div class="layui-form-item">
<label class="layui-form-label">任务名称</label>
<div class="layui-input-block">
<input type="text" name="TaskName" required lay-verify="required" placeholder="请输入任务名称"
autocomplete="off" class="layui-input">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">生效时间类型</label>
<div class="layui-input-block">
<select name="ETimeType" lay-filter="ETimeType" class="time-type-select">
<option value="1">具体时间</option>
<option value="2">每日执行时间</option>
<option value="3">每周循环时间</option>
<option value="4">月循环时间</option>
<option value="5">间隔时间</option>
<option value="6">开机时执行</option>
</select>
</div>
</div>
<div class="layui-form-item" id="ETimeContainer">
<label class="layui-form-label">生效时间</label>
<div class="layui-input-block">
<input type="text" name="ETime" placeholder="请输入生效时间" autocomplete="off" class="layui-input">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">执行时间类型</label>
<div class="layui-input-block">
<select name="RTimeType" lay-filter="RTimeType" class="time-type-select">
<option value="1">具体时间</option>
<option value="2">每日执行时间</option>
<option value="3">每周循环时间</option>
<option value="4">月循环时间</option>
<option value="5">间隔时间</option>
<option value="6">开机时执行</option>
</select>
</div>
</div>
<div class="layui-form-item" id="RTimeContainer">
<label class="layui-form-label">执行时间</label>
<div class="layui-input-block">
<input type="text" name="RTime" placeholder="请输入执行时间" autocomplete="off" class="layui-input">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">执行代码类型</label>
<div class="layui-input-block">
<select name="RType" lay-filter="RType">
<option value="1">Python脚本</option>
<option value="2">Shell脚本</option>
</select>
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">执行代码</label>
<div class="layui-input-block">
<textarea name="RCode" placeholder="请输入执行代码" class="layui-textarea"
style="min-height: 150px;"></textarea>
</div>
</div>
<div class="layui-form-item">
<div class="layui-input-block">
<button class="layui-btn" lay-submit lay-filter="submitTask">提交</button>
<button type="reset" class="layui-btn layui-btn-primary">重置</button>
</div>
</div>
<input type="hidden" name="TaskUUID">
</form>
</div>
<script>
socket = io("/Termination4SocketIOSpace");
socket.on(PCMachineGUID + 'CMDRL3TRELOAD', (message) => {
location.reload();
});
layui.use(['table', 'form', 'layer', 'laydate'], function () {
var table = layui.table;
var form = layui.form;
var layer = layui.layer;
var laydate = layui.laydate;
var $ = layui.$;
socket.on(PCMachineGUID + 'CMDRL3T', (message) => {
console.log("CMDRL3T", message.L3T)
table.render({
elem: '#taskTable',
data: message.L3T,
toolbar: '#TPL-Task',
cols: [[
{ type: 'checkbox' },
{ field: 'TaskName', title: '任务名称', width: 150 },
{ field: 'TaskUUID', title: '任务UUID', width: 250 },
{
field: 'ETimeType', title: '生效时间类型', width: 150, templet: function (d) {
return getTimeTypeName(d.ETimeType);
}
},
{ field: 'ETime', title: '生效时间', width: 180 },
{
field: 'RTimeType', title: '执行时间类型', width: 150, templet: function (d) {
return getTimeTypeName(d.RTimeType);
}
},
{ field: 'RTime', title: '执行时间', width: 180 },
{
field: 'RType', title: '执行代码类型', width: 120, templet: function (d) {
return getCodeTypeName(d.RType);
}
},
{ field: 'RCode', title: '执行代码', width: 200 },
{ fixed: 'right', title: '操作', width: 150, align: 'center', toolbar: '#bar' }
]],
page: false
});
});
table.on("toolbar(taskTable)", function (obj) {
var config = obj.config;
var tableId = config.id;
var status = table.checkStatus(tableId);
console.log(obj);
// 新增任务按钮点击事件
if (obj.event === "btnAddTask") {
layer.open({
type: 1,
title: '新增任务',
area: ['800px', '700px'],
content: $('#taskForm'),
success: function () {
form.val('taskForm', {
TaskUUID: '',
TaskName: '',
ETimeType: '1',
ETime: '',
RTimeType: '1',
RTime: '',
RType: '1',
RCode: '',
TaskUUID: ''
});
// 初始化时间输入框
updateTimeInput('ETime', '1');
updateTimeInput('RTime', '1');
}
});
}
if (obj.event === "btnDeleteSelected") {
var checkStatus = table.checkStatus('taskTable');
var data = checkStatus.data;
if (data.length === 0) {
layer.msg('请至少选择一条数据', { icon: 2 });
return;
}
layer.confirm('确定删除选中的 ' + data.length + ' 条数据吗?', function (index) {
var uuids = data.map(function (item) { return item.TaskUUID; });
// 这里应该发送AJAX请求批量删除数据
// $.ajax({
// url: '/api/tasks/batchDelete',
// type: 'POST',
// data: {uuids: uuids},
// success: function(res) {
// if(res.code === 0) {
// layer.msg('删除成功', {icon: 1});
// table.reload('taskTable');
// } else {
// layer.msg(res.msg || '删除失败', {icon: 2});
// }
// }
// });
// 演示用,直接重新加载表格
layer.msg('已选择删除 ' + data.length + ' 条数据', { icon: 1 });
table.reload('taskTable');
layer.close(index);
});
}
});
// 时间类型名称映射
function getTimeTypeName(type) {
var types = {
'1': '具体时间',
'2': '每日执行时间',
'3': '每周循环时间',
'4': '月循环时间',
'5': '间隔时间',
'6': '开机时执行'
};
return types[type] || '未知';
}
// 代码类型名称映射
function getCodeTypeName(type) {
var types = {
'1': 'Shell脚本',
'2': 'Python脚本'
};
return types[type] || '未知';
}
form.on('select(ETimeType)', function (data) {
updateTimeInput('ETime', data.value);
});
form.on('select(RTimeType)', function (data) {
updateTimeInput('RTime', data.value);
});
function updateTimeInput(prefix, type) {
var container = $('#' + prefix + 'Container');
var input = container.find('input');
// Reset input field state
input.val('');
input.prop('disabled', false);
input.attr('placeholder', '');
switch (type) {
case '1': // Specific time
input.attr('placeholder', '请输入具体时间 (yyyy-MM-dd HH:mm:ss)');
break;
case '2': // Daily execution time
input.attr('placeholder', '请输入每日执行时间 (HH:mm:ss)');
break;
case '3': // Weekly cycle time
input.attr('placeholder', '请输入每周循环时间 (X HH:mm:ss, X=1-7)');
break;
case '4': // Monthly cycle time
input.attr('placeholder', '请输入月循环时间 (X HH:mm:ss, X=1-31)');
break;
case '5': // Interval time
input.attr('placeholder', '请输入间隔时间 (HH:mm:ss)');
break;
case '6': // Execute on startup
input.attr('placeholder', '开机时执行无需输入时间');
input.val('开机时执行');
input.prop('disabled', true);
break;
}
form.render();
}
// 表单提交
form.on('submit(submitTask)', function (data) {
if (data.field.TaskUUID) {
socket.emit('T4CMDL3TChangeL3T', { PCMachineGUID: PCMachineGUID, 'Command': data.field });
} else {
socket.emit('T4CMDL3TAddL3T', { PCMachineGUID: PCMachineGUID, 'Command': data.field });
}
layer.closeAll();
return false;
});
// 表格工具栏事件
table.on('tool(taskTable)', function (obj) {
var data = obj.data;
var layEvent = obj.event;
if (layEvent === 'edit') {
layer.open({
type: 1,
title: '编辑任务',
area: ['800px', '700px'],
content: $('#taskForm'),
success: function () {
// First update the time input fields based on their types
updateTimeInput('ETime', data.ETimeType);
updateTimeInput('RTime', data.RTimeType);
// Then set the form values
form.val('taskForm', {
TaskUUID: data.TaskUUID,
TaskName: data.TaskName,
ETimeType: data.ETimeType,
ETime: data.ETime,
RTimeType: data.RTimeType,
RTime: data.RTime,
RType: data.RType,
RCode: data.RCode,
TaskUUID: data.TaskUUID
});
form.render();
}
});
} else if (layEvent === 'del') {
layer.confirm('确定删除此任务吗?', function (index) {
// 这里应该发送AJAX请求删除数据
// $.ajax({
// url: '/api/tasks/delete',
// type: 'POST',
// data: {TaskUUID: data.TaskUUID},
// success: function(res) {
// if(res.code === 0) {
// layer.msg('删除成功', {icon: 1});
// table.reload('taskTable');
// } else {
// layer.msg(res.msg || '删除失败', {icon: 2});
// }
// }
// });
socket.emit('T4CMDL3TDelL3T', { PCMachineGUID: PCMachineGUID, 'Command': data.TaskUUID });
// 演示用,直接删除表格中的行
//obj.del();
layer.close(index);
//layer.msg('删除成功', {icon: 1});
});
}
});
});
window.addEventListener('load', function() {
socket.emit('T4CMDL3TGetL3T', { PCMachineGUID: PCMachineGUID });
});
</script>
<script type="text/html" id="bar">
<div class="layui-btn-container">
<button class="layui-btn" lay-event="edit">查看</button>
<button class="layui-btn layui-btn-danger" lay-event="del">删除</button>
</div>
</script>
</body>
</html>