log-search-ui/index.html

1125 lines
49 KiB
HTML
Raw Normal View History

2024-12-12 14:26:05 +08:00
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>LogSearch-Web</title>
<!-- 你引入的 layui.js 建议是通过官网首页下载的。当然也可以由 github 或 gitee clone -->
<script src="./res/layui/layui.js"></script>
<script src="./res/layui/treeTable.js"></script>
<script src="./res/jquery-3.7.1.min.js"></script>
<!-- 引入 layui.css -->
<link rel="stylesheet" href="./res/layui/css/layui.css">
<script src="./main.js"></script>
<style>
.layui-input {
height:27px;
max-height: 27px;
line-height: 27px;
font-size: 12px;
}
.layui-input-inline {
padding-top: 4px;
}
.layui-form-item {
margin-bottom: 0px;
}
.custom-btn {
height:27px;
max-height: 27px;
line-height: 27px;
}
.layui-table-cell {
padding: 0 5px;
}
.layui-table-view .layui-table td {
padding:0;
}
.layui-table td, .layui-table th, .layui-table-col-set, .layui-table-fixed-r, .layui-table-grid-down, .layui-table-header, .layui-table-page, .layui-table-tips-main, .layui-table-tool, .layui-table-total, .layui-table-view, .layui-table[lay-skin=line], .layui-table[lay-skin=row] {
border-color:#bbb1b1;
}
/* 设置选中行的背景颜色 */
.layui-table-tr-selected {
background-color: #a30b0b;
}
.layui-table-view .layui-table tr:hover {
background-color: #53a4caed;
color:black;
}
.layui-input{
border-radius: 0;
}
.layui-btn{
border-radius: 0;
}
.single-line {
white-space: nowrap; /* 不换行 */
overflow: hidden; /* 隐藏超出部分 */
text-overflow: ellipsis; /* 显示省略号 */
cursor: pointer;
width:330px;
}
.single-line:hover {
background-color: #C9C5C5;
}
</style>
</head>
<body onload="init()" style="background-color: #fbfbfb;">
<div class="layui-fluid" style="padding-top: 5px;">
<div class="layui-panel" id="headContent" >
<form class="layui-form " style="background-color: #ebebeb7a;" lay-size="sm" action="" lay-filter="search-form" id="search-form">
<div class="layui-form-item">
<div class="layui-inline">
<label class="layui-form-label">ES数据源</label>
<div class="layui-input-inline" style="width: 220px;">
<select name="quiz" id="dataSourceSelect" required lay-verify="required" lay-filter="dataSourceSelect">
<option value="">请选择数据源</option>
</select>
</div>
<div class="layui-input-inline" style="width: 40px;">
&nbsp;
</div>
</div>
<div class="layui-inline">
<label class="layui-form-label">日期选择</label>
<div class="layui-input-inline" style="width: 220px;">
<input type="text" name="date1" id="date1" required lay-verify="required" autocomplete="off" class="layui-input">
<input type="hidden" id="startTime" />
<input type="hidden" id="endTime" />
</div>
<div class="layui-input-inline" style="width: 120px;">
<button class="layui-btn layui-btn-primary layui-btn-sm custom-btn" id="timeFastBtn">
选择<i class="layui-icon layui-icon-down layui-font-12"></i>
</button>
</div>
</div>
<div class="layui-inline"><label class="layui-form-label">程序</label>
<div class="layui-input-inline" style="width: 220px;">
<input type="text" name="logger" id="logger" placeholder="请输入或点击选择" autocomplete="on" class="layui-input">
</div>
<div class="layui-input-inline" style="margin-left: -10px;width: 50px;">
<button style="border-left-width: 0;" type="button" onclick="javascript:$('#logger').val('');" class="layui-btn layui-btn-primary layui-btn-sm custom-btn" >清除</button>
</div>
<div class="layui-input-inline" style="width: 120px;">
<button type="button" onclick="showTreeFix()" class="layui-btn layui-btn-primary layui-btn-sm custom-btn">选择</button>
</div>
</div>
</div>
<div class="layui-form-item">
<div class="layui-inline">
<label class="layui-form-label">线程ID</label>
<div class="layui-input-inline" style="width: 220px;">
<input type="text" name="thread" id="thread" placeholder="请输入线程号" autocomplete="on" class="layui-input">
</div>
<div class="layui-input-inline" style="margin-left: -10px;width: 50px;">
<button style="border-left-width: 0;" type="button" onclick="javascript:$('#thread').val('');" class="layui-btn layui-btn-primary layui-btn-sm custom-btn" >清除</button>
</div>
</div>
<div class="layui-inline">
<label class="layui-form-label">消息类型</label>
<div class="layui-input-block">
<input type="checkbox" name="error" title="错误" lay-skin="primary" checked>
<input type="checkbox" name="info" title="信息" lay-skin="primary" checked>
<input type="checkbox" name="time" title="耗时" lay-skin="primary">
<input type="checkbox" name="debug" title="调试" lay-skin="primary">
<input type="checkbox" name="trace" title="追踪" lay-skin="primary">
</div>
</div>
</div>
<div class="layui-form-item">
<div class="layui-inline">
<label class="layui-form-label">检索内容</label>
<div class="layui-input-inline" style="width: 220px;">
<input type="text" name="msg" id="msg"
placeholder="请输入内容" autocomplete="on" class="layui-input">
</div>
<div class="layui-input-inline" style="margin-left: -10px;width: 50px;">
<button style="border-left-width: 0;" type="button" onclick="javascript:$('#msg').val('');" class="layui-btn layui-btn-primary layui-btn-sm custom-btn" >清除</button>
</div>
<div class="layui-input-inline" style="width: 120px;">
<div style="width: 120px;margin-top: -5px;">
<input type="checkbox" name="overMatchSelected" title="全词匹配" lay-skin="primary" checked>
</div>
</div>
<div class="layui-input-inline" style="width: 120px;">
<div style="width: 120px;margin-top: -5px;">
<input type="checkbox" name="similaritySelected" title="匹配度排序" lay-skin="primary">
</div>
</div>
</div>
<div class="layui-inline">
<div class="layui-input-block">
<button type="button" onclick="resetForm()" class="layui-btn layui-btn-primary layui-btn-sm custom-btn"><i class="layui-icon">&#xe639;</i>重置</button>
<button class="layui-btn layui-btn-normal layui-btn-sm custom-btn" lay-submit lay-filter="esQuery"><i class="layui-icon">&#xe615;</i>查询</button>
</div>
</div>
</div>
</form>
</div>
<div class="layui-panel">
<!--移动6/12 | 平板6/12 | 桌面4/12-->
<div class="layui-col-xs12 layui-col-sm12 layui-col-md12">
<table id="msgTable" lay-filter="msgTable" lay-size="sm"></table>
</div>
</div>
<div id="bottomContent">
<!--移动6/12 | 平板6/12 | 桌面4/12-->
<div class="layui-col-xs12 layui-col-sm12 layui-col-md12">
<span class="layui-badge-rim">总条数: <span id="total">0</span></span>
<span class="layui-badge-rim">已加载: <span id="already">0</span></span>
<span class="layui-badge-rim">每次加载数量: <input id="size" value="100" style="width:50px;border-color: #ccc;border-width: 1px;"/></span>
<i onclick="help()" class="layui-icon " style="width: 24px;height: 24px;cursor: pointer;">&#xe607;</i>
<!-- <span class="layui-badge layui-bg-blue" style="cursor: pointer;" onclick="next()">加载更多</span>-->
</div>
</div>
</div>
<div id="detailContent" style="display: none;">
<form class="layui-form" lay-size="sm" action="" lay-filter="detail-form">
<div class="layui-form-item">
<div class="layui-inline">
<label class="layui-form-label">程序</label>
<div class="layui-input-inline" style="width: 220px;">
<input type="text" id="loggerStr2" name="loggerStr2" autocomplete="off" class="layui-input">
</div>
</div>
<div class="layui-inline">
<label class="layui-form-label">类路径</label>
<div class="layui-input-inline" style="min-width: 220px;">
<input type="text" name="logger2" id="logger2" autocomplete="off" class="layui-input">
</div>
</div>
</div>
<div class="layui-form-item">
<div class="layui-inline">
<label class="layui-form-label">时间</label>
<div class="layui-input-inline" style="width: 220px;">
<input type="text" id="createTimeStr2" name="createTimeStr2" autocomplete="off" class="layui-input">
</div>
</div>
<div class="layui-inline">
<label class="layui-form-label">消息类型</label>
<div class="layui-input-inline" style="width: 220px;">
<input type="text" id="level2" name="level2" autocomplete="off" class="layui-input">
</div>
</div>
<div class="layui-inline"><label class="layui-form-label">线程ID</label>
<div class="layui-input-inline" style="width: 220px;">
<input type="text" id="thread2" name="thread2" lay-verify="required" placeholder="请输入标题" autocomplete="off" class="layui-input">
</div>
<div class="layui-input-inline" style="margin-left: -10px;width: 50px;">
<button style="border-left-width: 0;" type="button" onclick="filterThread()" class="layui-btn layui-btn-primary layui-btn-sm custom-btn" >过滤</button>
</div>
</div>
</div>
<div class="layui-form-item">
<div class="layui-inline">
<label class="layui-form-label">用户</label>
<div class="layui-input-inline" style="width: 220px;">
<input type="text" id="userId2" name="userId2" lay-verify="required"
placeholder="请输入标题" autocomplete="off" class="layui-input">
</div>
</div>
<div class="layui-inline">
<div class="layui-input-block">
<button type="button" onclick="fastFilter()" class="layui-btn layui-btn-sm custom-btn" >快速过滤</button>
<button type="button" onclick="copyMsg()" class="layui-btn layui-btn-sm custom-btn " >复制内容</button>
<button type="button" onclick="closeDetail()" class="layui-btn layui-btn-sm custom-btn layui-btn-primary" >关闭</button>
</div>
</div>
</div>
<div class="layui-form-item layui-form-text">
<label class="layui-form-label">内容</label>
<div class="layui-input-block" style="padding-right: 15px;">
<pre class="layui-textarea layui-text layui-code" name="msg2" id="msg2" ></pre>
</div>
<label class="layui-form-label" name="exceptionLabel" id="exceptionLabel">异常</label>
<div class="layui-input-block" style="padding-right: 15px;">
<pre class="layui-textarea layui-text layui-code" name="exception" id="exception" ></pre>
</div>
</div>
</form>
</div>
<table class="layui-table layui-form" id="tree-table" lay-size="sm" style="display: none;"></table>
</body>
<script>
var sourceTemp = {};/*数据源喊出*/
var dataTemp = [];/*已加载的数据*/
var loggerTemp = {};/*程序缓存 ID>OBJ*/
var loggerKeyTemp = {};/*程序缓存 logger>name*/
var tableBodyDom;//表格主题DOM
var treeTable1;/*程序选择*/
var scrollTop = 0;
var click = false;
var size = 100;// 每次加载数量
// 添加窗口大小变化的事件监听器
window.addEventListener('resize', function() {
var headContent = document.getElementById("headContent");
var bottomContent = document.getElementById("bottomContent");
var height = headContent.offsetHeight + (bottomContent.offsetHeight || 35);
var windowHeight = document.documentElement.clientHeight || document.body.clientHeight || window.innerHeight;
var bodyHeight = windowHeight - height;
var tableHeight = bodyHeight < 400 ? 400 : bodyHeight - 55;
// 清空表格数据
layui.table.reload('msgTable', {
height: tableHeight
});
});
function init() {
var headContent = document.getElementById("headContent");
var bottomContent = document.getElementById("bottomContent");
var height = headContent.offsetHeight + (bottomContent.offsetHeight || 35);
var windowHeight = document.documentElement.clientHeight || document.body.clientHeight || window.innerHeight;
var bodyHeight = windowHeight - height;
var tableHeight = bodyHeight < 400 ? 400 : bodyHeight - 55;
// 时间快捷选择
layui.dropdown.render({
elem: '#timeFastBtn' //可绑定在任意元素中,此处以上述按钮为例
,data: [
{title: '今天',id: 1,href: '#'},
{title: '过去15分钟',id: 2,href: '#'},
{title: '过去30分钟',id: 5,href: '#'},
{title: '过去1小时',id: 6,href: '#'},
{title: '过去3小时',id: 7,href: '#'},
{title: '过去12小时',id: 8,href: '#'},
{title: '过去24小时',id: 9,href: '#'},
{title: '过去48小时',id: 10,href: '#'},
{title: '自选',id: 11,href: '#'},
]
,id: 'timeFastBtn'
//菜单被点击的事件
,click: function(obj){
switch(obj.id){
case 1:
setDefaultTime(0,true);
break;
case 2:
setDefaultTime(1000*60*15,false);
break;
case 5:
setDefaultTime(1000*60*30,false);
break;
case 6:
setDefaultTime(1000*60*60,false);
break;
case 7:
setDefaultTime(1000*60*180,false);
break;
case 8:
setDefaultTime(1000*60*720,false);
break;
case 9:
setDefaultTime(1000*60*1440,false);
break;
case 10:
setDefaultTime(1000*60*1440*2,false);
break;
case 11:
$('#date1').click();
break;
}
}
});
//数据表格
layui.table.render({
elem: '#msgTable'
, height: tableHeight
, data: []
, limits: [50]
, limit: 10000
, page: false //开启分页
, cols: [[ //表头
{
field: 'id', title: '序号', width: 50, sort: false, templet: function (d) {
return d.LAY_INDEX
}
}
, {field: 'createTimeStr', title: '时间', width: 160, sort: true}
, {field: 'logger', title: '程序', width: 200, templet: function (d) {
return loggerKeyTemp[d.logger] || showClassName(d.logger);
}
}
, {
field: 'level', title: '消息类型', width: 70, templet: function (d) {
var tempLevel = '<span>' + d.level + '</span>';
switch (d.level) {
case "INFO":
tempLevel = '<span style="color:#666;padding:2px;">' + d.level + '</span>';
break;
case "ERROR":
tempLevel = '<span style="background-color:#c00;color:white;font-size:10px;padding:2px;">' + d.level + '</span>';
break;
case "TIME":
tempLevel = '<span style="background-color:#ffff4d;color:#666;font-size:10px;padding:2px;">' + d.level + '</span>';
break;
case "DEBUG":
tempLevel = '<span style="background-color:#ffffcc;color:#666;font-size:10px;padding:2px;">' + d.level + '</span>';
break;
case "TRACE":
tempLevel = '<span style="background-color:#e6e6cc;color:#666;font-size:10px;padding:2px;">' + d.level + '</span>';
break;
}
return tempLevel;
}
}
, {field: 'thread', title: '线程', width: 180}
, {field: 'msg', title: '日志内容'}
, {field: 'ip', title: '服务端IP', width: 100}
]]
,done: function (res, curr, count) {
if(scrollTop>0){
$('.layui-table-body').scrollTop(scrollTop);
}
var table2 = $('.layui-table-body').find("table")[0];
// 重载表格---保持滚动条位置
$('.layui-table-body').scroll(function () {
var top = $('.layui-table-body').scrollTop();
var tableHeight = $('.layui-table-body').height();
var contentHeight = $(table2).height();
var windowHeight = $(window).height();
scrollTop = top;
//console.log('top:'+top+'-contentHeight:'+contentHeight+'tableHeight:' + tableHeight + '-windowHeight:' + windowHeight);
if(contentHeight>0 && top >= contentHeight - tableHeight-2){
console.log('botttttttm')
if(!click){
click = true;
next();
setTimeout(function () {
click = false;
},2000);
}
}
});
}
// , skin: 'line' //行边框风格
, even: true //开启隔行背景
, size: 'sm' //小尺寸的表格
});
// 程序列表
treeTable1 = layui.treeTable.render({
elem: '#tree-table',
data: [],
id: 'demoId',
icon_key: 'title',
is_checkbox: true,
checked: {
key: 'id',
data: [],
},
end: function(e){
// form.render();
},
cols: [
{
key: 'title',
title: '名称',
width: '180px',
template: function(item){
return item.title || item.name;
}
},
{
key: 'value',
title: '类路径',
align: 'left',
},
{
key: 'type',
title: '类型',
width: '100px',
align: 'left',
},
{
key: 'pinyin',
title: '拼音',
width: '100px',
align: 'left'
},
{
key: 'favourite',
title: '收藏',
width: '100px',
align: 'left'
},
]
});
// 监听checkbox选择
layui.treeTable.on('tree(box)',function(data){
setChooseLogger();
})
//触发行单击事件
layui.table.on('row(msgTable)', function (obj) {
console.log(obj.tr) //得到当前行元素对象
console.log(obj.data) //得到当前行数据
var row = obj.data;
layui.$('#logger2').val(row.logger);
layui.$('#loggerStr2').val(loggerKeyTemp[row.logger] || row.logger);
layui.$('#level2').val(row.level);
layui.$('#thread2').val(row.thread);
layui.$('#userId2').val(row.userId);
layui.$('#createTimeStr2').val(row.createTimeStr);
layui.$('#msg2').html(row.htmlMsg || row.msg);
if ('ERROR' !== row.level) {
$('#exception').hide();
$('#exceptionLabel').hide();
} else {
$('#exception').show();
$('#exceptionLabel').show();
}
layui.$('#exception').html(row.exception);
$(".layui-table-body .layui-table tr").attr({"style":"background:#black"}); //其它tr恢复原样必须在前
$(obj.tr.selector).attr({"style":"background:#FFE48D"}); //改变当前tr颜色必须在后
var windowHeight = window.innerHeight || document.documentElement.clientHeight || document.body.clientHeight;
var windowWight = window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth;
layer.open({
type: 1,
maxmin: true,
area: [windowWight * 0.8 + 'px', windowHeight * 0.8 + 'px'],
content: $("#detailContent"), //这里content是一个DOM注意最好该元素要存放在body最外层否则可能被其它的相对元素所影响
cancel: function (index, layero) {
$("#detailContent").css("display", "none");
layer.close(index)
return true;
}
});
});
// 监听数据源选择器更新事件
layui.form.on('select(dataSourceSelect)', function (data) {
// 切换数据源,删除数据
dataTemp = [];/*已加载的数据*/
loggerTemp = {};/*程序缓存 ID>OBJ*/
loggerKeyTemp = {};/*程序缓存 logger>name*/
// 获取选择的数据源
// 获取选中的数据源
var selectedValue = $('#dataSourceSelect').val();
window.localStorage.setItem('sourceId',selectedValue)
window.localStorage.setItem('source',JSON.stringify(sourceTemp[selectedValue]))
// 清空表格数据
layui.table.reload('msgTable', {
data: dataTemp,
});
// 重新加载程序列表
loadLoggerItems();
// 清空程序选择
$("#logger").val('');
treeTable1.checked = {
key: 'id',
data: [],
};
layui.treeTable.render(treeTable1);
layui.form.render();
});
var options = [];
// 加载下拉数据源
$.ajax({
url: 'http://10.30.35.208:9999//es/es-source',
type: 'GET',
dataType: 'json',
success: function (resp) {
if (resp.success) {
var data = resp.data;
var sourceId = window.localStorage.getItem('sourceId') || '';
var sourceStr = window.localStorage.getItem('source') || '{}';
var source = JSON.parse(sourceStr === 'undefined' ? '{}' : sourceStr);
options.push('<option value="' + (source.id || '') + '">' + (source.name || '请选择') + '</option>')
// 将返回的数据处理成options格式
for (var ceIndex in data) {
var groupName = data[ceIndex].name;
var optionsData = data[ceIndex].children;
var cegroupBefore = '<optgroup label="'+groupName+'"> '
options.push(cegroupBefore);
for(var opIndex in optionsData){
var key = optionsData[opIndex].id;
var option = '<option value="' + optionsData[opIndex].id + '">' + optionsData[opIndex].name + '</option>';
sourceTemp[key] = optionsData[opIndex];
options.push(option);
}
var cegroupBehind = '</optgroup>';
options.push(cegroupBehind);
}
var optionsStr = options.join('');
console.log(optionsStr);
// 更新select的内容
$('#dataSourceSelect').empty();
$('#dataSourceSelect').append(optionsStr);
$('#dataSourceSelect').val(sourceId || data[0].children[0].id);
// 重新初始化select组件
layui.form.render('select');
// 加载程序列表
loadLoggerItems();
}
}
}).then(function (resp) {
console.log(resp);
})
var dateNow = new Date();
var month = dateNow.getMonth() + 1; // 月份从0开始需要加1
var day = dateNow.getDate();
var mmdd = ''+(month>9 ? month : '0' + month) + '-' + (day>9 ? day : '0' + day);
//日期时间范围
layui.laydate.render({
elem: '#date1'
, type: 'datetime'
, range: true
, format: "MM-dd HH:mm:ss"
, value: mmdd+' 00:00:00 - '+mmdd+' 23:59:59'
, btns: ['now', 'clear', 'confirm']
, calendar: true
, done: function (value, date, endDate) {
$("#startTime").val(date.year
+ '-' + (date.month > 9 ? date.month : '0' + date.month)
+ '-' + (date.date > 9 ? date.date : '0' + date.date)
+ ' ' + (date.hours > 9 ? date.hours : '0' + date.hours)
+ ':' + (date.minutes > 9 ? date.minutes : '0' + date.minutes)
+ ':' + (date.seconds > 9 ? date.seconds : '0' + date.seconds))
$("#endTime").val(date.year
+ '-' + (endDate.month > 9 ? endDate.month : '0' + endDate.month)
+ '-' + (endDate.date > 9 ? endDate.date : '0' + endDate.date)
+ ' ' + (endDate.hours > 9 ? endDate.hours : '0' + endDate.hours)
+ ':' + (endDate.minutes > 9 ? endDate.minutes : '0' + endDate.minutes)
+ ':' + (endDate.seconds > 9 ? endDate.seconds : '0' + endDate.seconds))
}
});
setDefaultTime(0,true);
//监听from提交
layui.form.on('submit(esQuery)', function (data) {
// 重置滚动条为0
scrollTop = 0;
$('.layui-table-body').scrollTop(0)
// 重置数量
$("#already").text(0);
$("#total").text(0);
dataTemp = [];
var levels = [];
var overMatchSelected = false;
var similaritySelected = false;
// 关闭弹窗
layer.closeAll();
// 操作记录
saveHistory();
if (data.field.info && data.field.info === 'on') {
levels.push('INFO')
}
if (data.field.error && data.field.error === 'on') {
levels.push('ERROR')
}
if (data.field.debug && data.field.debug === 'on') {
levels.push('DEBUG')
}
if (data.field.time && data.field.time === 'on') {
levels.push('TIME')
}
if (data.field.trace && data.field.trace === 'on') {
levels.push('TRACE')
}
if (data.field.overMatchSelected && data.field.overMatchSelected === 'on') {
overMatchSelected = true
}
if (data.field.similaritySelected && data.field.similaritySelected === 'on') {
similaritySelected = true
}
loadMore(levels, overMatchSelected, similaritySelected);
return false;
});
// 修改size
$("#size").blur(function(){
size = parseInt($("#size").val()) || 100;
console.log(size)
});
// 消息历史记录单机显示
$('#msg').on('click', function(){
var msgHistory = window.localStorage.getItem('msgHistory');
if(msgHistory){
var items = JSON.parse(msgHistory);
var lis = '';
for (var msgHistoryKey in items) {
var item = items[msgHistoryKey];
lis += '<div onclick="setMsgHistory('+msgHistoryKey+')" class="single-line" style="width:240px;color:black;overflow: hidden;">'+item+'</div>';
}
console.log(lis)
layer.tips(lis, '#msg',{tips:[3, '#ffffff']});
}
});
// 线程历史记录单机显示
$('#thread').on('click', function(){
var threadHistory = window.localStorage.getItem('threadHistory');
if(threadHistory){
var items = JSON.parse(threadHistory);
var lis = '';
for (var msgHistoryKey in items) {
var item = items[msgHistoryKey];
lis += '<div onclick="setThreadHistory('+msgHistoryKey+')" class="single-line" style="width:240px;color:black;overflow: hidden;">'+item+'</div>';
}
layer.tips(lis, '#thread',{tips:[3, '#ffffff']});
}
});
}
function setThreadHistory(index){
var threadHistory = window.localStorage.getItem('threadHistory');
if(threadHistory) {
var items = JSON.parse(threadHistory);
$('#thread').val(items[index]+'');
}
layer.closeAll();
};
function setMsgHistory(index){
var msgHistory = window.localStorage.getItem('msgHistory');
if(msgHistory) {
var items = JSON.parse(msgHistory);
$('#msg').val(items[index]+'');
}
layer.closeAll();
};
function showClassName(logger){
if(logger){
return logger.substring(logger.lastIndexOf('.')+1 || 0);
}
return logger;
}
function next(){
if(parseInt($('#already').text()) >= parseInt($('#total').text())){
// layer.msg('已经加载完所有数据!');
return;
}
// 重置数量 form.val('formId');
var data = layui.form.val('search-form');
console.log(data);
var levels = [];
var overMatchSelected = false;
var similaritySelected = false;
if (data.info && data.info === 'on') {
levels.push('INFO')
}
if (data.error && data.error === 'on') {
levels.push('ERROR')
}
if (data.debug && data.debug === 'on') {
levels.push('DEBUG')
}
if (data.time && data.time === 'on') {
levels.push('TIME')
}
if (data.trace && data.trace === 'on') {
levels.push('TRACE')
}
if (data.overMatchSelected && data.overMatchSelected === 'on') {
overMatchSelected = true
}
if (data.similaritySelected && data.similaritySelected === 'on') {
similaritySelected = true
}
loadMore(levels, overMatchSelected, similaritySelected);
}
function setChooseLogger(){
var chooseLoggers = layui.treeTable.checked(treeTable1);
var loggerStr = '';
if(chooseLoggers){
for(var index in chooseLoggers){
if(loggerStr.length > 0){loggerStr += ',';}
var key = chooseLoggers[index];
loggerStr += loggerTemp[key] && loggerTemp[key].value;
}
}
$("#logger").val(loggerStr);
}
function resetForm(){
$("#logger").val('');
$("#thread").val('');
$("#msg").val('');
$("input[name='error']").prop('checked', true);
$("input[name='info']").prop('checked', true);
$("input[name='debug']").prop('checked', false);
$("input[name='time']").prop('checked', false);
$("input[name='trace']").prop('checked', false);
$("input[name='overMatchSelected']").prop('checked', true);
$("input[name='similaritySelected']").prop('checked', false);
// loggers程序重置
treeTable1.checked = {
key: 'id',
data: [],
};
layui.treeTable.render(treeTable1);
layui.form.render();
// 日期重置
setDefaultTime(0,true);
// 重置滚动条为0
scrollTop = 0;
$('.layui-table-body').scrollTop(0)
// 关闭弹窗
layer.closeAll();
}
function setDefaultTime(offset,flag){
var timestamp = Date.now();
var dateNow = new Date(timestamp);
var beforeDate = new Date(timestamp-offset);
// 当前时间年月日时分秒
var behindYear = dateNow.getFullYear();
var behindMonth = dateNow.getMonth() + 1; // 月份从0开始需要加1
var behindDay = dateNow.getDate();
var behindHours = flag ? 23 : dateNow.getHours();
var behindMinutes = flag ? 59 : dateNow.getMinutes();
var behindSeconds = flag ? 59 :dateNow.getSeconds();
// 前面时间年月日时分秒
var beforeYear = beforeDate.getFullYear();
var beforeMonth = beforeDate.getMonth() + 1; // 月份从0开始需要加1
var beforeDay = beforeDate.getDate();
var beforeHours = flag ? 0 : beforeDate.getHours();
var beforeMinutes = flag ? 0 : beforeDate.getMinutes();
var beforeSeconds = flag ? 0 :beforeDate.getSeconds();
var beforeMMddHHmmss = ''+(beforeMonth>9 ? beforeMonth : '0' + beforeMonth) + '-' + (beforeDay>9 ? beforeDay : '0' + beforeDay)
+ ' '+(beforeHours>9 ? beforeHours : '0' + beforeHours)
+ ':' + (beforeMinutes>9 ? beforeMinutes : '0' + beforeMinutes)
+ ':' + (beforeSeconds>9 ? beforeSeconds : '0' + beforeSeconds);;
var beforeyyyyMMddHHmmss = beforeYear+'-'+(beforeMonth>9 ? beforeMonth : '0' + beforeMonth) + '-' + (beforeDay>9 ? beforeDay : '0' + beforeDay)
+ ' '+(beforeHours>9 ? beforeHours : '0' + beforeHours)
+ ':' + (beforeMinutes>9 ? beforeMinutes : '0' + beforeMinutes)
+ ':' + (beforeSeconds>9 ? beforeSeconds : '0' + beforeSeconds);
var behindMMddHHmmss = ''+(behindMonth>9 ? behindMonth : '0' + behindMonth) + '-' + (behindDay>9 ? behindDay : '0' + behindDay)
+ ' '+(behindHours>9 ? behindHours : '0' + behindHours)
+ ':' + (behindMinutes>9 ? behindMinutes : '0' + behindMinutes)
+ ':' + (behindSeconds>9 ? behindSeconds : '0' + behindSeconds);;
var behindyyyyMMddHHmmss = behindYear+'-'+(behindMonth>9 ? behindMonth : '0' + behindMonth) + '-' + (behindDay>9 ? behindDay : '0' + behindDay)
+ ' '+(behindHours>9 ? behindHours : '0' + behindHours)
+ ':' + (behindMinutes>9 ? behindMinutes : '0' + behindMinutes)
+ ':' + (behindSeconds>9 ? behindSeconds : '0' + behindSeconds);
$("#startTime").val(beforeyyyyMMddHHmmss);
$("#endTime").val(behindyyyyMMddHHmmss);
layui.laydate.render({
elem: '#date1'
, value: beforeMMddHHmmss +' - ' + behindMMddHHmmss
});
}
function loadMore(levels,overMatchSelected,similaritySelected){
// 获取选中的数据源
var selectedValue = $('#dataSourceSelect').val();
console.log(selectedValue)
if(!selectedValue){
layer.msg('请先选择数据源');
return;
}
var source = sourceTemp[selectedValue];
var loggers = [];
// 获取选中的loggers
var loggerStr = $("#logger").val();
if(loggerStr){
var strarr = loggerStr.split(',');
for (var strarrIndex in strarr) {
var temp = {
"pinyin": "",
"title": "",
"index": 0,
"favourite": false,
"type": "OTHER",
"value": strarr[strarrIndex],
"children": [],
"pid": 0,
"id": 0
}
loggers.push(temp)
}
}
var index = layer.load(2); //换了种风格
try{
var dataJson = {
source: source,
startTime: $("#startTime").val(),
endTime: $("#endTime").val(),
logger: loggers,
thread: $("#thread").val(),
levels: levels,
msg: $("#msg").val(),
overMatchSelected: overMatchSelected,
similaritySelected: similaritySelected,
from: parseInt($("#already").text()) || 0,
size: size
}
var dataStr = JSON.stringify(dataJson);
$.ajax({
url: "http://10.30.35.208:9999/es/es-query",
type: 'POST',
dataType: 'JSON',
contentType:'application/json', // 指定编码格式
data: dataStr,
success: function (result) {
if(result.code === 200 && result.data.code === 0){
var data = result.data.data;
$("#total").text(result.data.size);
//layer.msg(result.message);
dataTemp = dataTemp.concat(data)
$("#already").text(dataTemp.length);
layui.use('table', function() {
var table = layui.table;
table.reload('msgTable', {
data: dataTemp,
});
});
//关闭
setTimeout(function () {
layer.close(index);
},300);
}else{
layer.msg(result.data.message || result.msg);
//关闭
setTimeout(function () {
layer.close(index);
},300);
}
},
error: function (xhrJson,status,error) {
layer.msg("error:"+JSON.stringify(xhrJson)+status+JSON.stringify(error))
console.log(error)
//关闭
layer.close(index);
// 1. 创建ajax对象异步对象
let xmlHttpRequest = new XMLHttpRequest();
// 2. 创建请求
// xhr.open('请求方法','url地址','是否采用异步处理去访问接口true/false')
xmlHttpRequest.open("POST", "http://10.30.35.208:9999/es/es-query");
// 3. 设置 Content-Type 属性(固定写法)
xmlHttpRequest.setRequestHeader('Content-Type', 'application/json')
// 3. 发送请求
xmlHttpRequest.send(dataStr);
// 4. 监听状态,接收响应
xmlHttpRequest.onreadystatechange = function() {
layer.msg(xmlHttpRequest.readyState+"===>"+xmlHttpRequest.status+"===" + JSON.stringify(xmlHttpRequest.response))
// 4.1 监听 xhr 对象的请求状态 readyState ;与服务器响应的状态 status
if (xmlHttpRequest.readyState === 4&& xmlHttpRequest.status === 200) {
// 4.2 使用xhr.response 获取服务器返回的数据
layer.msg(JSON.stringify(xmlHttpRequest.response));
}
}
}
});
}catch (e){
layer.msg("e:"+JSON.stringify(e))
console.log(e)
//关闭
layer.close(index);
}finally {
console.log(3)
//关闭
setTimeout(function () {
layer.close(index);
},10000);
}
}
function loadLoggerItems() {
// 获取选中的数据源
var selectedValue = $('#dataSourceSelect').val();
if(!selectedValue){
layer.msg('请先选择数据源');
return;
}
var source = sourceTemp[selectedValue];
if(loggerTemp && Object.keys(loggerTemp).length === 0){
$.ajax({
url: "http://10.30.35.208:9999/es/" + source.config,
type: 'GET',
dataType: 'JSON',
contentType:'application/json',
success: function (result) {
//layer.msg("result:"+JSON.stringify(result))
loggerTemp = {};
loggerKeyTemp = {};
var tempData = [];
for(var index in result.data){
var item = result.data[index];
loggerTemp[item.id] = item;
loggerKeyTemp[item.value] = item.title || item.name;
tempData.push(item)
}
treeTable1.data = tempData;
layui.treeTable.render(treeTable1);
},
});
}
}
function showTreeFix(){
var windowHeight = window.innerHeight || document.documentElement.clientHeight || document.body.clientHeight;
var windowWight = window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth;
layer.open({
type: 1,
title: '程序别名',
maxmin: true,
btn: ['确定','关闭','清除选择并关闭'],
area: [windowWight * 0.8 + 'px', windowHeight * 0.8 + 'px'],
content: $("#tree-table"), //这里content是一个DOM注意最好该元素要存放在body最外层否则可能被其它的相对元素所影响
yes: function(index, layero){
setChooseLogger();
$("#tree-table").css("display", "none");
layer.close(index)
return true;
}
,btn2: function(index, layero){
$("#tree-table").css("display", "none");
layer.close(index)
return true;
}
,btn3: function(index, layero){
$("#logger").val('');
treeTable1.checked = {
key: 'id',
data: [],
};
layui.treeTable.render(treeTable1);
layui.form.render();
$("#tree-table").css("display", "none");
layer.close(index)
return true;
},
cancel: function (index, layero) {
$("#tree-table").css("display", "none");
layer.close(index)
return true;
}
});
}
function fastFilter(){
$("#thread").val($("#thread2").val());
$("#logger").val($("#logger2").val());
$("#tree-table").css("display", "none");
$("#detailContent").css("display", "none");
layer.closeAll();
}
function filterThread(){
$("#thread").val($("#thread2").val());
$("#tree-table").css("display", "none");
$("#detailContent").css("display", "none");
layer.closeAll();
}
function closeDetail(){
$("#tree-table").css("display", "none");
$("#detailContent").css("display", "none");
layer.closeAll();
}
function copyMsg(){
var msg = $("#msg2").val();
// HTML元素的id为"myText"
var text = $("#msg2").text(); //获取要复制的文本内容
copyToClipboard(text); //调用函数并传入要复制的文本内容
layer.msg('复制成功');
}
function copyToClipboard(elementId) {
var aux = document.createElement("input");
aux.setAttribute("value", elementId);
document.body.appendChild(aux);
aux.select();
document.execCommand("copy");
document.body.removeChild(aux);
}
function saveHistory(){
// 将输入存入到历史
var msg = $('#msg').val();
var thread = $('#thread').val();
var msgHistory = window.localStorage.getItem('msgHistory');
var threadHistory = window.localStorage.getItem('threadHistory');
if(msg){
if(!msgHistory){// 没有记录
var items = [msg];
window.localStorage.setItem('msgHistory',JSON.stringify(items));
}else{
var items = JSON.parse(msgHistory);
// 判断对象是否存在,存在那么不管
if (items.includes(msg)) {
console.log("数组包含该值");
} else {
// 添加到头
items.unshift(msg);
if(items.length >= 8){
//删除最后一个
items.pop();
}
window.localStorage.setItem('msgHistory',JSON.stringify(items));
}
}
}
if(thread){
if(!threadHistory){// 没有记录
var items = [thread];
window.localStorage.setItem('threadHistory',JSON.stringify(items));
}else{
var items = JSON.parse(threadHistory);
// 判断对象是否存在,存在那么不管
if (items.includes(thread)) {
console.log("数组包含该值");
} else {
// 添加到头
items.unshift(thread);
if(items.length >= 8){
//删除最后一个
items.pop();
}
window.localStorage.setItem('threadHistory',JSON.stringify(items));
}
}
}
}
function help(){
layer.alert('1.勾选匹配度查询时将不会以时间进行排序,而是以文档相似计算得分,得分越高越靠前。<br>' +
'2.数据源选择会暂存到浏览器,下次打开时会默认选择该数据源。<br>' +
'3.日志级别说明:错误:ERROR 信息:INFO 耗时:TIME 调试:DEBUG 追踪:TRACE。<br>' +
'4.网页加载数据比较慢,请不要将加载行数设置过大,以免把服务器搞蹦啦~o(╥﹏╥)o。</br>' +
'5.表格高度是计算的当浏览器宽高变化时请右键刷新或者F5刷新浏览器即可从新计算显示表格高度。</br>', {icon: 3});
}
</script>
</html>