better-staridc-MNBT
1<?php
2if (!defined('IN_CRONLITE')) {
3 exit;
4}
5mnbt_admin_include('head');
6?>
7<style>
8.ad-log-box { max-height: 400px; overflow: auto; background: #1e1e1e; color: #d4d4d4; padding: 12px; border-radius: 4px; font-family: 'Courier New', monospace; font-size: .85rem; white-space: pre-wrap; word-break: break-all; }
9</style>
10
11<div class="container-fluid p-t-15">
12 <div class="card">
13 <div class="card-header">
14 <h4 class="mb-0"><i class="mdi mdi-history text-info"></i> 部署历史</h4>
15 </div>
16 <div class="card-body">
17 <div class="mb-3">
18 <button class="btn btn-sm btn-outline-primary" id="btn-load-history">加载历史</button>
19 <button class="btn btn-sm btn-outline-secondary ml-2" id="btn-refresh-history">刷新</button>
20 </div>
21 <div id="ad-history-loading" style="display:none; text-align:center; padding:20px;">
22 <div class="spinner-border text-primary" style="width:3rem;height:3rem;"></div><p>加载中...</p>
23 </div>
24 <div id="ad-history-table"></div>
25 <div id="ad-history-pager" class="mt-3"></div>
26 </div>
27 </div>
28</div>
29
30<script>
31function parseRes(res) {
32 try { return typeof res === 'string' ? JSON.parse(res) : res; } catch (e) { return {code: res}; }
33}
34function escHtml(str) {
35 if (!str && str !== 0) return '';
36 var div = document.createElement('div');
37 div.appendChild(document.createTextNode(String(str)));
38 return div.innerHTML;
39}
40
41var currentPage = 1;
42
43function loadHistory(page) {
44 page = page || 1;
45 currentPage = page;
46 $('#ad-history-loading').show();
47 $('#ad-history-table').empty();
48 $('#ad-history-pager').empty();
49
50 $.post('ajax.php', {gn: 'p_auto_deploy_history', page: page}, function (res) {
51 $('#ad-history-loading').hide();
52 var d = parseRes(res);
53 if (d.qk != 1 && !d.success) {
54 $('#ad-history-table').html('<p class="text-danger">加载失败:' + escHtml(d.msg || '') + '</p>');
55 return;
56 }
57 var rows = d.rows || [];
58 if (!rows.length) {
59 $('#ad-history-table').html('<p class="text-muted">暂无部署记录</p>');
60 return;
61 }
62 var html = '<div class="table-responsive"><table class="table table-sm table-bordered table-hover">';
63 html += '<thead class="thead-light"><tr>';
64 html += '<th>ID</th><th>时间</th><th>节点</th><th>软件包</th><th>目标网站</th><th>类型</th><th>结果</th><th>管理员</th><th>详情</th>';
65 html += '</tr></thead><tbody>';
66 $.each(rows, function (i, r) {
67 var badge = r.result === 'success'
68 ? '<span class="badge badge-success">成功</span>'
69 : '<span class="badge badge-danger">失败</span>';
70 var details = '';
71 if (r.admin_username) details += '账号: ' + escHtml(r.admin_username) + '\n';
72 if (r.admin_password) details += '密码: ' + escHtml(r.admin_password) + '\n';
73 if (r.success_url) details += '入口: ' + escHtml(r.success_url);
74 var detailHtml = details ? '<button class="btn btn-sm btn-outline-info ad-detail-btn" data-detail="' + escHtml(details) + '">查看</button>' : '-';
75 html += '<tr>';
76 html += '<td>' + (r.id || '') + '</td>';
77 html += '<td>' + escHtml(r.created_at || '') + '</td>';
78 html += '<td>' + escHtml(r.node_name || r.node_id) + '</td>';
79 html += '<td><code>' + escHtml(r.dname || '') + '</code></td>';
80 html += '<td>' + escHtml(r.site_name || '') + '</td>';
81 html += '<td>' + escHtml(r.project_type || 'php') + '</td>';
82 html += '<td>' + badge + '</td>';
83 html += '<td>' + escHtml(r.admin_user || '') + '</td>';
84 html += '<td>' + detailHtml + '</td>';
85 html += '</tr>';
86 });
87 html += '</tbody></table></div>';
88 $('#ad-history-table').html(html);
89
90 // 分页
91 var pager = '';
92 if (d.pages > 1) {
93 pager += '<nav><ul class="pagination pagination-sm">';
94 for (var i = 1; i <= d.pages; i++) {
95 pager += '<li class="page-item' + (i === d.page ? ' active' : '') + '"><a class="page-link ad-page-link" href="#" data-page="' + i + '">' + i + '</a></li>';
96 }
97 pager += '</ul></nav>';
98 pager += '<small class="text-muted">共 ' + d.total + ' 条记录</small>';
99 }
100 $('#ad-history-pager').html(pager);
101 });
102}
103
104$(document).on('click', '.ad-page-link', function (e) {
105 e.preventDefault();
106 loadHistory(parseInt($(this).data('page')));
107});
108
109$(document).on('click', '.ad-detail-btn', function () {
110 var detail = $(this).data('detail');
111 alert(detail);
112});
113
114$('#btn-load-history').on('click', function () { loadHistory(1); });
115$('#btn-refresh-history').on('click', function () { loadHistory(currentPage); });
116
117// 页面加载时自动加载
118loadHistory(1);
119</script>