统一用户信息付费查看

This commit is contained in:
2026-04-26 11:31:46 +08:00
parent f0269c7c17
commit af772350c9
13 changed files with 987 additions and 36 deletions
+88 -1
View File
@@ -222,6 +222,76 @@ export function bankShowMsg(message, success) {
}, 3000);
}
/**
* 确认是否扣费查看别人银行存款。
*
* @param {number} cost 查看费用
* @returns {Promise<boolean>}
*/
async function confirmRevealBankBalance(cost) {
const message = `查看 TA 的银行存款需扣除 ${Number(cost || 0).toLocaleString()} 金币,是否继续?`;
if (typeof window.chatDialog?.confirm === "function") {
return Boolean(await window.chatDialog.confirm(message, "信息查看付费", "#d97706", "扣费查看", "取消"));
}
return window.confirm(message);
}
/**
* 付费查看排行榜里的指定用户存款,并只更新当前行展示。
*
* @param {HTMLElement} trigger 触发查看的按钮
* @returns {Promise<void>}
*/
async function revealRankingBankBalance(trigger) {
const userId = Number.parseInt(trigger.getAttribute("data-bank-reveal-user-id") || "0", 10);
const cost = Number.parseInt(trigger.getAttribute("data-bank-reveal-cost") || "1000", 10);
if (!userId || trigger.getAttribute("aria-disabled") === "true") {
return;
}
const confirmed = await confirmRevealBankBalance(cost);
if (!confirmed) {
return;
}
trigger.setAttribute("aria-disabled", "true");
try {
const response = await fetch("/user/reveal-info", {
method: "POST",
headers: {
"X-CSRF-TOKEN": csrf(),
"Content-Type": "application/json",
Accept: "application/json",
},
body: JSON.stringify({ user_id: userId, asset: "bank_jjb" }),
});
const data = await response.json();
if (data.status !== "success") {
await window.chatDialog?.alert?.(data.message || "查看失败,请稍后重试。", "查看失败", "#cc4444");
return;
}
const valueWrap = trigger.closest(".bank-rank-val");
if (valueWrap) {
valueWrap.innerHTML = `🏦 ${Number(data.value || 0).toLocaleString()}`;
}
if (window.chatContext && data.jjb !== undefined) {
// 同步流通金币缓存,避免后续购买或游戏继续使用扣费前余额。
window.chatContext.myGold = data.jjb;
}
bankShowMsg(data.message || "存款金额已显示。", true);
} catch (error) {
await window.chatDialog?.alert?.("网络异常,请稍后重试。", "查看失败", "#cc4444");
} finally {
trigger.removeAttribute("aria-disabled");
}
}
/**
* 切换排行榜排序并回到第一页。
*
@@ -330,6 +400,16 @@ function renderRankingRow(user, index) {
const username = escapeHtml(user.username || "");
const sexSymbol = user.sex === "女" ? "♀" : "♂";
const bankBalanceHtml = user.can_reveal
? `<button type="button"
data-bank-reveal-user-id="${escapeHtml(user.id)}"
data-bank-reveal-cost="${escapeHtml(user.reveal_cost || 1000)}"
title="点击查看存款,需扣除 ${Number(user.reveal_cost || 1000).toLocaleString()} 金币"
style="border:none;background:transparent;color:#059669;font-weight:bold;cursor:pointer;padding:0;">
****** 👁️
</button>`
: `🏦 ${Number(user.bank_jjb || 0).toLocaleString()}`;
return `<div class="bank-rank-item">
<div class="bank-rank-num ${rankClass}">${absoluteRank}</div>
<img src="${avatarUrl}" onerror="this.src='/images/headface/1.gif'" style="width:32px; height:32px; border-radius:50%; object-fit:cover; border:1px solid #d0e4f5;">
@@ -337,7 +417,7 @@ function renderRankingRow(user, index) {
<div style="font-weight:bold; color:#1e3a8a;">${username} <span style="font-size:12px;">${sexSymbol}</span></div>
</div>
<div class="bank-rank-val">
🏦 ${Number(user.bank_jjb || 0).toLocaleString()}
${bankBalanceHtml}
</div>
</div>`;
}
@@ -412,6 +492,13 @@ export function bindBankControls() {
return;
}
const revealButton = event.target.closest("[data-bank-reveal-user-id]");
if (revealButton instanceof HTMLElement) {
event.preventDefault();
void revealRankingBankBalance(revealButton);
return;
}
const pageButton = event.target.closest("[data-bank-rank-page-delta]");
if (pageButton) {
event.preventDefault();