GM 页改版:加回满疲劳/赞助页,去掉背包与邮件页和重复标题

- 角色页新增「回满疲劳」,走 POST /dnf/gm/characters/{id}/fatigue/refill(需角色下线)
- 新增「赞助」页:支付宝 / 微信收款码占位,图放 gmweb/qr/ 下即显示
- 删除背包页与邮件页(发到邮箱按钮保留在发物品页)
- 去掉页头「GM 控制台」文字(窗口标题栏已画标题,重复),页头只留连接状态
- serve.py 补 jpg/jpeg/gif/webp/bmp/svg 的 MIME
- 控制台宽度 1040 -> 920
This commit is contained in:
hanfuit committed 2026-11-05 14:15:41 +08:00
1 parent 7f41f9797a
commit 06558415da
6 files changed
+91 -103

No files matched your search

+31 -79
View File
@@ -4,7 +4,7 @@
'use strict';
var S = {
charId: '', charName: '', chars: [], bagRows: [],
charId: '', charName: '', chars: [],
itemId: 0, itemName: '', picked: null, items: [],
page: 1, pageSize: 20, total: 0
};
@@ -66,7 +66,6 @@
for (var j = 0; j < panes.length; j++) {
panes[j].className = 'pane' + (panes[j].id === 'pane-' + name ? ' on' : '');
}
if (name === 'bag') { loadBag(0); }
}
function bindTabs() {
@@ -156,6 +155,17 @@
return true;
}
/* 一键回满疲劳:直接把库里 fatigue 写回上限。
服务端要求角色已下线(在线时写库会被下一个存档覆盖),所以在线角色会报错。 */
function refillFatigue() {
if (!requireChar()) { return; }
api('/dnf/gm/characters/' + S.charId + '/fatigue/refill', 'POST', {}, function (d) {
if (!d) { return; }
log('已回满 ' + S.charName + ' 的疲劳值', 'ok');
loadChars();
});
}
/* ---------------------------------------------------------------- 物品 */
/* 装备类型标签:PVF 里是 "[weapon]" 这种,去掉括号后映射成中文。 */
@@ -384,10 +394,7 @@
var data = d.data || {};
log('已发 ' + S.itemName + ' ×' + n + optText(o) +
(data.slot != null ? ',格位 ' + data.list_type + ':' + data.slot : ''), 'ok');
// 发完立刻切到背包页并高亮这一行:到底有没有进包,玩家要看得见
switchTab('bag');
loadBag(S.itemId);
setTimeout(function () { loadBag(S.itemId); }, 600);
// 回游戏里看背包即可(客户端会自动刷新),这里不再切页打断操作
});
}
@@ -406,78 +413,22 @@
});
}
/* ---------------------------------------------------------------- 背包 */
/* ---------------------------------------------------------------- 赞助 */
/* 背包 / 穿戴的实时快照。GM 发完东西,玩家第一件事就是看它到底进没进包,
所以这里按服务端实际存的行来列,不做任何本地猜测。 */
function loadBag(highlightItemId) {
if (!S.charId) {
$('bag-list').innerHTML = '<div class="empty">先在「角色」页选一个角色</div>';
$('bag-info').innerHTML = '-';
return;
}
api('/local/dnf-gm/inventory/list?character_id=' + encodeURIComponent(S.charId),
'GET', null, function (d) {
if (!d) { return; }
var data = d.data || {};
S.bagRows = data.rows || [];
renderBag(highlightItemId || 0);
});
}
function renderBag(highlightItemId) {
var box = $('bag-list');
var rows = S.bagRows || [];
var bagCount = 0, wearCount = 0, i;
for (i = 0; i < rows.length; i++) {
if (rows[i].collection === 'wear') { wearCount++; } else { bagCount++; }
}
$('bag-info').innerHTML = '背包 ' + bagCount + ' 件 · 穿戴 ' + wearCount + ' 件';
if (!rows.length) {
box.innerHTML = '<div class="empty">背包是空的</div>';
return;
}
// 刚发进去的排在最前面,其余保持服务端顺序
var ordered = [];
if (highlightItemId) {
for (i = 0; i < rows.length; i++) {
if (rows[i].item_id === highlightItemId) { ordered.push(rows[i]); }
}
}
for (i = 0; i < rows.length; i++) {
if (!highlightItemId || rows[i].item_id !== highlightItemId) { ordered.push(rows[i]); }
}
var h = [];
for (i = 0; i < ordered.length; i++) {
var r = ordered[i];
var isNew = highlightItemId && r.item_id === highlightItemId;
h.push('<div class="li' + (isNew ? ' on' : '') + '">' +
'<span class="nm">' + esc(r.item_name || ('物品 ' + r.item_id)) +
(isNew ? ' <em class="new">新</em>' : '') + '</span>' +
'<span class="meta">' + (r.collection === 'wear' ? '穿戴' : '背包') +
' · ' + esc(r.entry_key) + ' · id ' + esc(r.item_id) +
(r.count > 1 ? ' ×' + esc(r.count) : '') + '</span></div>');
}
box.innerHTML = h.join('');
}
/* ---------------------------------------------------------------- 邮件 */
function sendMail() {
if (!requireChar()) { return; }
var gold = parseInt($('in-goldmail').value, 10) || 0;
api('/local/dnf-gm/mail', 'POST', {
character_name: S.charName,
title: $('in-title').value || 'GM 邮件',
body: $('in-body').value || '',
gold: gold,
attachments: []
}, function (d) {
if (d) { log('邮件已发送给 ' + S.charName, 'ok'); }
});
/* 收款码图片是可选的:放了就显示,没放(404)就把占位提示顶上来。 */
function bindQr(id) {
var img = $(id);
if (!img) { return; }
img.onerror = function () {
var box = this.parentNode;
if (box) { box.className = 'qr-box miss'; }
this.style.display = 'none';
};
img.onload = function () {
var box = this.parentNode;
if (box) { box.className = 'qr-box'; }
this.style.display = '';
};
}
/* ---------------------------------------------------------------- 启动 */
@@ -515,9 +466,8 @@
bind('btn-prev', function () { if (S.page > 1) { loadItems(S.page - 1); } });
bind('btn-next', function () { loadItems(S.page + 1); });
bind('btn-grant', grantItem);
bind('btn-bag', function () { loadBag(0); });
bind('btn-mailitem', mailItem);
bind('btn-mail', sendMail);
bind('btn-fatigue', refillFatigue);
$('in-page-size').onchange = function () { loadItems(1); };
$('in-group').onchange = function () { fillTypeOptions(); loadItems(1); };
@@ -549,6 +499,8 @@
};
fillTypeOptions();
bindQr('qr-alipay');
bindQr('qr-wechat');
renderPicked();
forceIME();