Files
NetworkAuth/web/template/admin/login_logs.html
2026-03-18 21:51:17 +08:00

172 lines
6.1 KiB
HTML

{{ define "login_logs.html" }}
<section>
<h2>登录日志</h2>
<div class="layui-panel" style="margin-top:12px">
<h3 style="margin: 0; padding: 15px 20px; border-bottom: 1px solid var(--lay-color-border-2); padding-bottom: 10px; margin-bottom: 15px;">筛选</h3>
<div style="padding: 20px;">
<form class="layui-form layui-form-pane" id="loginLogFilterForm" lay-filter="loginLogFilterForm">
<div class="layui-form-item">
<div class="layui-inline">
<label class="layui-form-label">日期范围</label>
<div class="layui-input-inline" style="width: 200px;">
<input type="text" class="layui-input" id="loginTimeRange" placeholder=" - " autocomplete="off">
<input type="hidden" name="login_start_time" id="login_start_time">
<input type="hidden" name="login_end_time" id="login_end_time">
</div>
</div>
<div class="layui-inline">
<label class="layui-form-label">状态</label>
<div class="layui-input-inline">
<select name="status">
<option value="">全部</option>
<option value="1">成功</option>
<option value="0">失败</option>
</select>
</div>
</div>
<div class="layui-inline">
<label class="layui-form-label">用户名</label>
<div class="layui-input-inline">
<input type="text" name="username" placeholder="请输入用户名" autocomplete="off" class="layui-input">
</div>
</div>
<div class="layui-inline">
<label class="layui-form-label">登录IP</label>
<div class="layui-input-inline">
<input type="text" name="ip" placeholder="请输入IP地址" autocomplete="off" class="layui-input">
</div>
</div>
<div class="layui-inline">
<button type="button" class="layui-btn" id="btnSearchLoginLogs">搜索</button>
<button type="button" class="layui-btn layui-btn-primary" id="btnResetLoginLogs">重置</button>
</div>
</div>
</form>
</div>
</div>
<div class="layui-panel" style="margin-top:12px">
<h3 style="margin: 0; padding: 15px 20px; border-bottom: 1px solid var(--lay-color-border-2); padding-bottom: 10px; margin-bottom: 15px;">日志列表</h3>
<div style="padding: 20px;">
<script type="text/html" id="loginLogsToolbar">
<div class="layui-btn-container">
<button class="layui-btn layui-btn-sm layui-btn-danger" lay-event="clearLogs">
<i class="layui-icon layui-icon-delete"></i>
</button>
</div>
</script>
<table id="loginLogsTable" lay-filter="loginLogsTableFilter"></table>
</div>
</div>
</section>
<script>
layui.use(['table', 'form', 'laydate', 'util', 'jquery'], function(){
var table = layui.table;
var form = layui.form;
var laydate = layui.laydate;
var util = layui.util;
var $ = layui.jquery;
// 日期范围选择器
laydate.render({
elem: '#loginTimeRange',
range: true,
type: 'datetime',
format: 'yyyy-MM-dd HH:mm:ss',
done: function(value, date, endDate){
if(value) {
const dates = value.split(' - ');
$('#login_start_time').val(dates[0]);
$('#login_end_time').val(dates[1]);
} else {
$('#login_start_time').val('');
$('#login_end_time').val('');
}
}
});
// 渲染表格
var loginLogsTable = table.render({
elem: '#loginLogsTable',
url: '/admin/api/login_logs',
toolbar: '#loginLogsToolbar',
page: true,
limit: 20,
limits: [10, 20, 50, 100],
cols: [[
{field: 'username', title: '用户名', width: 150},
{field: 'ip', title: '登录IP', width: 150},
{field: 'status', title: '状态', width: 100, align: 'center', templet: function(d){
return d.status === 1 ?
'<span class="layui-badge layui-bg-green">成功</span>' :
'<span class="layui-badge layui-bg-red">失败</span>';
}},
{field: 'message', title: '详情', minWidth: 150},
{field: 'user_agent', title: 'User Agent', minWidth: 200, templet: function(d){
return '<div title="'+d.user_agent+'" style="white-space: nowrap; overflow: hidden; text-overflow: ellipsis;">'+d.user_agent+'</div>';
}},
{field: 'created_at', title: '登录时间', width: 180, templet: function(d){
return util.toDateString(d.created_at);
}}
]],
response: {
statusCode: 0
},
parseData: function(res){
return {
"code": res.code,
"msg": res.msg,
"count": res.data ? res.data.total : 0,
"data": res.data ? res.data.list : []
};
}
});
// 搜索按钮
$('#btnSearchLoginLogs').on('click', function(){
const formData = form.val('loginLogFilterForm');
loginLogsTable.reload({
where: {
status: formData.status,
username: formData.username,
ip: formData.ip,
start_time: $('#login_start_time').val(),
end_time: $('#login_end_time').val()
},
page: {curr: 1}
});
});
// 头工具栏事件
table.on('toolbar(loginLogsTableFilter)', function(obj){
switch(obj.event){
case 'clearLogs':
layer.confirm('确定要清空所有登录日志吗?此操作不可恢复!', {icon: 3, title:'警告'}, function(index){
$.post('/admin/api/login_logs/clear', function(res){
if(res.code === 0){
layer.msg('登录日志已清空', {icon: 1});
loginLogsTable.reload({page: {curr: 1}});
} else {
layer.msg(res.msg || '清空失败', {icon: 2});
}
});
layer.close(index);
});
break;
};
});
// 重置按钮
$('#btnResetLoginLogs').on('click', function(){
$('#loginLogFilterForm')[0].reset();
$('#login_start_time').val('');
$('#login_end_time').val('');
$('#loginTimeRange').val('');
form.render('select');
$('#btnSearchLoginLogs').click();
});
});
</script>
{{ end }}