仰望星辰工作室

better-staridc-MNBT

better-staridc-MNBT/ templates/default/admin/update.php 11.8 KB · 227 行 原始文件
Z zfhsh first commit 2 天前
1<?php mnbt_admin_include('head'); ?>
2<?php
3// $mnbt_update / $mnbt_upcfg 由 admin/update.php 服务端检查后注入
4$upd_ok = !empty($mnbt_update['ok']);
5$upd_can = !empty($mnbt_update['can_update']);
6$upd_log = trim((string)($mnbt_update['body'] ?? ''));
7$upd_mirror_txt = implode("\n", $mnbt_upcfg['mirrors']);
8$upd_token_set = !empty($mnbt_update['has_token']);
9?>
10<style>
11/* 系统更新页:直角蓝白,不用蓝底色块与装饰竖条 */
12.mn-upd-page { max-width: 900px; margin: 0 auto; padding: 16px 14px 40px; }
13.mn-upd-card { background: #fff; border: 1px solid #e8ecf1; border-radius: 0; margin-bottom: 14px; }
14.mn-upd-hd { padding: 14px 18px; border-bottom: 1px solid #eef1f5; font-size: 15px; font-weight: 600; color: #0f172a; }
15.mn-upd-hd .mdi { color: #2563eb; margin-right: 6px; }
16.mn-upd-bd { padding: 18px; }
17.mn-upd-ver { display: flex; flex-wrap: wrap; gap: 12px; margin-bottom: 16px; }
18.mn-upd-ver-item { flex: 1; min-width: 180px; border: 1px solid #e8ecf1; border-radius: 0; padding: 14px 16px; }
19.mn-upd-ver-num { font-size: 22px; font-weight: 700; color: #1e293b; line-height: 1.2; }
20.mn-upd-ver-num.is-new { color: #2563eb; }
21.mn-upd-ver-label { font-size: 12px; color: #94a3b8; margin-top: 4px; }
22.mn-upd-tip { font-size: 13px; color: #475569; line-height: 1.8; margin-bottom: 14px; }
23.mn-upd-tip.bad { color: #b42318; }
24.mn-upd-kv { width: 100%; border-collapse: collapse; margin-bottom: 6px; }
25.mn-upd-kv td { font-size: 13px; padding: 7px 0; border-bottom: 1px solid #f1f5f9; vertical-align: top; }
26.mn-upd-kv td:first-child { color: #94a3b8; width: 110px; white-space: nowrap; }
27.mn-upd-kv td:last-child { color: #1e293b; word-break: break-all; }
28.mn-upd-log { background: #f8fafc; border: 1px solid #eef1f5; padding: 12px 14px; font-size: 12px; line-height: 1.8; color: #334155; white-space: pre-wrap; word-break: break-word; max-height: 300px; overflow-y: auto; margin: 0; border-radius: 0; }
29.mn-upd-log-title { font-size: 13px; font-weight: 600; color: #334155; margin: 0 0 8px; }
30.mn-upd-actions { margin-top: 16px; display: flex; gap: 10px; }
31.mn-upd-actions .btn { border-radius: 0; font-weight: 500; padding: 9px 18px; }
32.mn-upd-field { margin-bottom: 16px; }
33.mn-upd-field > label { display: block; font-size: 13px; font-weight: 500; color: #334155; margin-bottom: 6px; }
34.mn-upd-field .form-control { border-radius: 0; border-color: #e2e8f0; font-size: 13px; }
35.mn-upd-field .form-control:focus { border-color: #93c5fd; box-shadow: 0 0 0 3px rgba(37, 99, 235, .1); }
36.mn-upd-field small { display: block; margin-top: 6px; font-size: 12px; color: #94a3b8; line-height: 1.7; }
37.mn-upd-row { display: flex; gap: 8px; margin-bottom: 8px; }
38.mn-upd-row .form-control { flex: 1; }
39.mn-upd-row .btn { border-radius: 0; flex-shrink: 0; }
40.mn-upd-note { background: #f8fafc; border: 1px solid #eef1f5; padding: 12px 14px; font-size: 12px; color: #64748b; line-height: 1.8; }
41.mn-upd-note code { background: #fff; padding: 1px 4px; border: 1px solid #e8ecf1; }
42</style>
43
44<div class="mn-upd-page">
45
46 <div class="mn-upd-card">
47 <div class="mn-upd-hd"><i class="mdi mdi-cloud-download"></i>检查更新</div>
48 <div class="mn-upd-bd">
49 <div class="mn-upd-ver">
50 <div class="mn-upd-ver-item">
51 <div class="mn-upd-ver-num"><?=htmlspecialchars($mnbt_update['current'])?></div>
52 <div class="mn-upd-ver-label">当前版本</div>
53 </div>
54 <div class="mn-upd-ver-item">
55 <div class="mn-upd-ver-num <?=($upd_ok && $upd_can) ? 'is-new' : ''?>"><?=htmlspecialchars($upd_ok ? $mnbt_update['latest'] : '—')?></div>
56 <div class="mn-upd-ver-label">最新可用版本<?=($upd_ok && !empty($mnbt_update['published_at'])) ? '(' . htmlspecialchars(substr((string)$mnbt_update['published_at'], 0, 10)) . ')' : ''?></div>
57 </div>
58 </div>
59
60<?php if (!$upd_ok): ?>
61 <div class="mn-upd-tip bad"><i class="mdi mdi-alert-circle-outline"></i> 检查更新失败:<?=htmlspecialchars($mnbt_update['error'])?>(仓库 <?=htmlspecialchars($mnbt_update['repo'])?>)</div>
62<?php elseif ($upd_can): ?>
63 <div class="mn-upd-tip"><i class="mdi mdi-arrow-up-bold-circle"></i> 发现新版本,可执行在线覆盖更新。</div>
64<?php else: ?>
65 <div class="mn-upd-tip"><i class="mdi mdi-bookmark-check"></i> 当前已是最新版本,无需更新。</div>
66<?php endif; ?>
67
68 <table class="mn-upd-kv">
69 <tr><td>更新仓库</td><td><?=htmlspecialchars($mnbt_update['repo'])?></td></tr>
70 <tr><td>包来源</td><td><?=htmlspecialchars($upd_ok ? $mnbt_update['source_label'] : '—')?><?=($upd_ok && !empty($mnbt_update['asset_size'])) ? '(' . number_format($mnbt_update['asset_size'] / 1048576, 1) . ' MB)' : ''?></td></tr>
71 <tr><td>下载通道</td><td>github.com 直连<?=!empty($mnbt_update['mirrors']) ? ',失败后依次尝试:' . htmlspecialchars(implode('、', $mnbt_update['mirrors'])) : ''?></td></tr>
72<?php if ($upd_ok && !empty($mnbt_update['asset_url'])): ?>
73 <tr><td>附件地址</td><td><?=htmlspecialchars($mnbt_update['asset_url'])?></td></tr>
74<?php endif; ?>
75<?php if (!empty($mnbt_update['fallback'])): ?>
76 <tr><td>检查方式</td><td>latest 接口不可用,已改用发布列表取最高版本</td></tr>
77<?php endif; ?>
78 </table>
79
80<?php if ($upd_ok): ?>
81 <div class="mn-upd-actions">
82<?php if ($upd_can): ?>
83 <button class="btn btn-primary" type="button" onclick="up()"><i class="mdi mdi-update"></i> 立刻更新</button>
84<?php endif; ?>
85 <a class="btn btn-outline-secondary" href="update.php?recheck=1"><i class="mdi mdi-refresh"></i> 重新检查</a>
86 </div>
87<?php else: ?>
88 <div class="mn-upd-actions">
89 <a class="btn btn-outline-secondary" href="update.php?recheck=1"><i class="mdi mdi-refresh"></i> 重新检查</a>
90 </div>
91<?php endif; ?>
92 </div>
93 </div>
94
95 <div class="mn-upd-card">
96 <div class="mn-upd-hd"><i class="mdi mdi-text-box-outline"></i>更新日志</div>
97 <div class="mn-upd-bd">
98<?php if ($upd_log !== ''): ?>
99 <pre class="mn-upd-log"><?=htmlspecialchars($upd_log)?></pre>
100<?php else: ?>
101 <p class="mn-upd-tip">该版本发布没有填写更新说明。</p>
102<?php endif; ?>
103 </div>
104 </div>
105
106 <div class="mn-upd-card">
107 <div class="mn-upd-hd"><i class="mdi mdi-cog-outline"></i>更新设置</div>
108 <div class="mn-upd-bd">
109 <div class="mn-upd-field">
110 <label for="upd_repo">GitHub 仓库</label>
111 <input type="text" class="form-control" id="upd_repo" value="<?=htmlspecialchars($mnbt_upcfg['repo'])?>" placeholder="owner/repo" maxlength="140">
112 <small>格式 <code>owner/repo</code>,更新包只能从这个仓库的 Release 里取。</small>
113 </div>
114
115 <div class="mn-upd-field">
116 <label>下载镜像</label>
117 <div id="upd_mirrors">
118<?php foreach ($mnbt_upcfg['mirrors'] as $m): ?>
119 <div class="mn-upd-row">
120 <input type="text" class="form-control upd-mirror-input" value="<?=htmlspecialchars($m)?>" placeholder="https://gh-proxy.com/" maxlength="160">
121 <button class="btn btn-outline-danger" type="button" onclick="updDelMirror(this)"><i class="mdi mdi-close"></i></button>
122 </div>
123<?php endforeach; ?>
124 </div>
125 <button class="btn btn-outline-secondary" type="button" onclick="updAddMirror()"><i class="mdi mdi-plus"></i> 添加镜像</button>
126 <small>按顺序依次尝试:先 github.com 直连,再按上面的顺序走镜像。镜像地址填 <code>https://gh-proxy.com/</code> 这种带协议的形式,会在原地址前面加前缀。</small>
127 </div>
128
129 <div class="mn-upd-field">
130 <label for="upd_token">GitHub Token(可选)</label>
131 <input type="password" class="form-control" id="upd_token" placeholder="<?=($upd_token_set ? '已设置,留空表示不修改' : '仅用于提高 API 速率限制,可留空')?>" autocomplete="new-password" maxlength="128">
132<?php if ($upd_token_set): ?>
133 <div class="mn-upd-row" style="margin-top:8px">
134 <label style="font-size:12px;color:#64748b;font-weight:normal;margin:0;padding-top:8px;">
135 <input type="checkbox" id="upd_clear_token"> 清除已保存的 Token
136 </label>
137 </div>
138<?php endif; ?>
139 <small>Token 只用于调用 GitHub API,不会跟着下载请求发给镜像;页面不会回显明文。</small>
140 </div>
141
142 <div class="mn-upd-actions">
143 <button class="btn btn-primary" type="button" onclick="saveUpdSetting()"><i class="mdi mdi-content-save-outline"></i> 保存更新设置</button>
144 </div>
145
146 <div class="mn-upd-note" style="margin-top:16px;">
147 <b>更新说明:</b>更新会直接用 GitHub Release 的包覆盖站点文件,覆盖前会备份并还原
148 <code>config.php</code>、<code>cf_up.php</code>、<code>MPHX/SQ.php</code>、<code>install/install.lock</code>、<code>api/cookie/</code>;
149 包里 <code>update/update_v*_*.sql</code> 的版本化迁移会按版本号依次执行(仅跑游标 <code>MN_dbver</code> 之后的增量),旧式单文件 <code>update/update.sql</code> 仍兼容。请在维护时段操作,更新过程中不要关闭页面。
150 </div>
151 </div>
152 </div>
153
154</div>
155<script type="text/javascript">
156function updAddMirror() {
157 var box = document.getElementById('upd_mirrors');
158 var div = document.createElement('div');
159 div.className = 'mn-upd-row';
160 div.innerHTML = '<input type="text" class="form-control upd-mirror-input" placeholder="https://gh-proxy.com/" maxlength="160">'
161 + '<button class="btn btn-outline-danger" type="button" onclick="updDelMirror(this)"><i class="mdi mdi-close"></i></button>';
162 box.appendChild(div);
163 div.querySelector('input').focus();
164}
165function updDelMirror(btn) {
166 var row = btn.parentNode;
167 var box = document.getElementById('upd_mirrors');
168 if (box.children.length <= 1) {
169 row.querySelector('input').value = '';
170 return;
171 }
172 box.removeChild(row);
173}
174function saveUpdSetting() {
175 var mirrors = [];
176 var list = document.querySelectorAll('#upd_mirrors .upd-mirror-input');
177 for (var i = 0; i < list.length; i++) {
178 var v = $.trim(list[i].value);
179 if (v !== '' && mirrors.indexOf(v) === -1) mirrors.push(v);
180 }
181 var data = {};
182 data['gn'] = 'upset';
183 data['repo'] = $.trim(document.getElementById('upd_repo').value);
184 data['mirrors'] = mirrors.join('\n');
185 var tk = document.getElementById('upd_token');
186 if (tk && tk.value !== '') data['github_token'] = $.trim(tk.value);
187 var cl = document.getElementById('upd_clear_token');
188 if (cl && cl.checked) data['clear_token'] = '1';
189 msloading();
190 $.post('./ajax.php', data, function (date) {
191 msloadingde();
192 var jsoe = JSON.parse(date);
193 if (jsoe.qk == 1 || jsoe.code == '保存成功') {
194 msalert(1, '保存成功', 2500);
195 setTimeout(function () { window.location.href = 'update.php'; }, 1200);
196 } else {
197 msalert(4, jsoe.code || '保存失败', 4000);
198 }
199 }).fail(function () {
200 msloadingde();
201 msalert(4, '网络错误,保存失败', 3000);
202 });
203}
204function up() {
205 if (!window.confirm('将用 GitHub Release 的包覆盖当前站点文件,过程可能需要几分钟,期间请勿关闭页面。确认开始更新?')) return;
206 msloading();
207 let data = {};
208 data["gn"] = "update";
209 $.post('./ajax.php', data, function (date) {
210 msloadingde();
211 var jsoe = JSON.parse(date);
212 var qk = jsoe.code;
213 if (jsoe.qk == 1 || qk == '更新成功~请手动刷新页面') {
214 var txt = '更新成功~请手动刷新页面';
215 if (jsoe.source) txt += '|' + jsoe.source + (jsoe.via ? '(' + jsoe.via + ')' : '');
216 msalert(1, txt, 6000);
217 } else {
218 msalert(4, qk || '更新失败', 8000);
219 }
220 }).fail(function () {
221 msloadingde();
222 msalert(4, '更新请求中断,请刷新后台确认站点是否正常;本地配置与后台目录在中断时会自动还原', 8000);
223 });
224}
225</script>
226</body>
227</html>