better-staridc-MNBT
1<?php
2if (!defined('IN_CRONLITE')) exit;
3mnbt_theme_include('head');
4global $yhc, $DB;
5$user = $yhc['user'] ?? '';
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 <header class="card-header">
14 <div class="card-title"><i class="mdi mdi-history"></i> 部署记录</div>
15 </header>
16 <div class="card-body">
17 <div class="mb-3">
18 <button class="btn btn-sm btn-outline-primary" id="btn-load">加载记录</button>
19 <button class="btn btn-sm btn-outline-secondary ml-2" id="btn-refresh">刷新</button>
20 </div>
21 <div id="ad-loading" style="display:none; text-align:center; padding:20px;">
22 <div class="spinner-border text-primary"></div><p>加载中...</p>
23 </div>
24 <div id="ad-table"></div>
25 <div id="ad-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(s) {
35 return String(s).replace(/[&<>"']/g, function (c) {
36 return { '&': '&', '<': '<', '>': '>', '"': '"', "'": ''' }[c];
37 });
38}
39var currentPage = 1;
40
41function loadHistory(page) {
42 page = page || 1;
43 currentPage = page;
44 $('#ad-loading').show();
45 $('#ad-table').empty();
46 $('#ad-pager').empty();
47
48 $.post('ajax.php', {gn: 'p_auto_deploy_history', page: page}, function (res) {
49 $('#ad-loading').hide();
50 var d = parseRes(res);
51 if (d.qk != 1 && !d.success) {
52 $('#ad-table').html('<p class="text-danger">加载失败</p>');
53 return;
54 }
55 var rows = d.rows || [];
56 if (!rows.length) {
57 $('#ad-table').html('<p class="text-muted text-center py-4">暂无部署记录</p>');
58 return;
59 }
60 var html = '<div class="table-responsive"><table class="table table-sm table-bordered table-hover">';
61 html += '<thead class="thead-light"><tr>';
62 html += '<th>ID</th><th>时间</th><th>节点</th><th>软件包</th><th>目标网站</th><th>结果</th><th>详情</th>';
63 html += '</tr></thead><tbody>';
64 $.each(rows, function (i, r) {
65 var badge = r.result === 'success'
66 ? '<span class="badge badge-success">成功</span>'
67 : '<span class="badge badge-danger">失败</span>';
68 var detailText = '';
69 if (r.admin_username) detailText += '账号: ' + r.admin_username + '\n';
70 if (r.admin_password) detailText += '密码: ' + r.admin_password + '\n';
71 if (r.success_url) detailText += '入口: ' + r.success_url;
72 var detailBtn = detailText ? '<button class="btn btn-sm btn-outline-info ad-detail-btn" data-detail="' + escHtml(detailText) + '">查看</button>' : '-';
73 html += '<tr>';
74 html += '<td>' + (r.id || '') + '</td>';
75 html += '<td>' + escHtml(r.created_at || '') + '</td>';
76 html += '<td>' + escHtml(r.node_name || r.node_id || '') + '</td>';
77 html += '<td><code>' + escHtml(r.dname || '') + '</code></td>';
78 html += '<td>' + escHtml(r.site_name || '') + '</td>';
79 html += '<td>' + badge + '</td>';
80 html += '<td>' + detailBtn + '</td>';
81 html += '</tr>';
82 });
83 html += '</tbody></table></div>';
84 $('#ad-table').html(html);
85
86 var pager = '';
87 if (d.pages > 1) {
88 pager += '<nav><ul class="pagination pagination-sm">';
89 for (var i = 1; i <= d.pages; i++) {
90 pager += '<li class="page-item' + (i === d.page ? ' active' : '') + '"><a class="page-link ad-page-link" href="#" data-page="' + i + '">' + i + '</a></li>';
91 }
92 pager += '</ul></nav>';
93 pager += '<small class="text-muted">共 ' + d.total + ' 条记录</small>';
94 }
95 $('#ad-pager').html(pager);
96 });
97}
98
99$(document).on('click', '.ad-page-link', function (e) {
100 e.preventDefault();
101 loadHistory(parseInt($(this).data('page')));
102});
103$(document).on('click', '.ad-detail-btn', function () {
104 alert($(this).data('detail'));
105});
106
107$('#btn-load').on('click', function () { loadHistory(1); });
108$('#btn-refresh').on('click', function () { loadHistory(currentPage); });
109
110loadHistory(1);
111</script>