This commit is contained in:
2026-04-11 13:34:15 +08:00
parent 6af789dd83
commit 632c9e5a93
@@ -255,7 +255,8 @@
} }
}).then(r => r.json()).then(m => { }).then(r => r.json()).then(m => {
this.targetMarriage = m.marriage ?? null; this.targetMarriage = m.marriage ?? null;
}).catch(() => {}).finally(() => { }).catch(() => {
}).finally(() => {
this.marriageLoading = false; this.marriageLoading = false;
}); });
} }
@@ -626,19 +627,9 @@
<div x-show="userInfo.vip?.Name || userInfo.position_name" <div x-show="userInfo.vip?.Name || userInfo.position_name"
style="margin-top: 6px;"> style="margin-top: 6px;">
<span style="display: inline-flex; <span style="display: inline-flex;align-items: center;gap: 6px;padding: 2px 10px;
align-items: center; border-radius: 999px;white-space: nowrap;width: fit-content;max-width: 100%;
gap: 6px; font-size: 11px;font-weight: bold;background: #faf5ff;border: 1px solid #d8b4fe;color: #7c3aed;">
padding: 2px 10px;
border-radius: 999px;
white-space: nowrap;
width: fit-content;
max-width: 100%;
font-size: 11px;
font-weight: bold;
background: #faf5ff;
border: 1px solid #d8b4fe;
color: #7c3aed;">
{{-- VIP --}} {{-- VIP --}}
<template x-if="userInfo.vip?.Name"> <template x-if="userInfo.vip?.Name">
@@ -657,7 +648,8 @@
<template x-if="userInfo.position_name"> <template x-if="userInfo.position_name">
<span style="display: inline-flex; align-items: center; gap: 4px; color: #7c3aed;"> <span style="display: inline-flex; align-items: center; gap: 4px; color: #7c3aed;">
<span x-text="userInfo.position_icon || '🎖️'" style="font-size: 12px;"></span> <span x-text="userInfo.position_icon || '🎖️'" style="font-size: 12px;"></span>
<span x-text="(userInfo.department_name ? userInfo.department_name + ' · ' : '') + userInfo.position_name"></span> <span
x-text="(userInfo.department_name ? userInfo.department_name + ' · ' : '') + userInfo.position_name"></span>
</span> </span>
</template> </template>
@@ -744,19 +736,24 @@
style="display: none; padding: 8px 10px; background: #fff5f5; border: 1px dashed #fca5a5; style="display: none; padding: 8px 10px; background: #fff5f5; border: 1px dashed #fca5a5;
border-top: none; border-radius: 0 0 8px 8px; font-size: 11px; color: #991b1b;"> border-top: none; border-radius: 0 0 8px 8px; font-size: 11px; color: #991b1b;">
<div style="display: flex; flex-direction: column; gap: 3px;"> <div style="display: flex; flex-direction: column; gap: 3px;">
<div><span style="opacity: 0.8;">首次IP</span><span x-text="userInfo.first_ip || '无'"></span> <div><span style="opacity: 0.8;">首次IP</span><span
x-text="userInfo.first_ip || '无'"></span>
</div> </div>
<div><span style="opacity: 0.8;">上次IP</span><span x-text="userInfo.last_ip || '无'"></span> <div><span style="opacity: 0.8;">上次IP</span><span
x-text="userInfo.last_ip || '无'"></span>
</div> </div>
<div><span style="opacity: 0.8;">本次IP</span><span x-text="userInfo.login_ip || '无'"></span> <div><span style="opacity: 0.8;">本次IP</span><span
x-text="userInfo.login_ip || '无'"></span>
</div> </div>
<div><span style="opacity: 0.8;">归属地:</span><span x-text="userInfo.location || '未知'"></span> <div><span style="opacity: 0.8;">归属地:</span><span
x-text="userInfo.location || '未知'"></span>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
<div class="profile-detail" x-text="userInfo.sign || '这家伙很懒,什么也没留下'" style="margin-top: 12px;"></div> <div class="profile-detail" x-text="userInfo.sign || '这家伙很懒,什么也没留下'"
style="margin-top: 12px;"></div>
{{-- 职务履历时间轴(有任职记录才显示,可折叠) --}} {{-- 职务履历时间轴(有任职记录才显示,可折叠) --}}
<div x-show="userInfo.position_history && userInfo.position_history.length > 0" <div x-show="userInfo.position_history && userInfo.position_history.length > 0"
@@ -777,7 +774,8 @@
{{-- 线 --}} {{-- 线 --}}
<div <div
style="display: flex; flex-direction: column; align-items: center; width: 18px; flex-shrink: 0;"> style="display: flex; flex-direction: column; align-items: center; width: 18px; flex-shrink: 0;">
<div style="width: 10px; height: 10px; border-radius: 50%; flex-shrink: 0; margin-top: 2px;" <div
style="width: 10px; height: 10px; border-radius: 50%; flex-shrink: 0; margin-top: 2px;"
:style="h.is_active ? 'background: #7c3aed; box-shadow: 0 0 0 3px #ede9fe;' : :style="h.is_active ? 'background: #7c3aed; box-shadow: 0 0 0 3px #ede9fe;' :
'background: #d1d5db;'"> 'background: #d1d5db;'">
</div> </div>
@@ -808,7 +806,8 @@
</div> </div>
{{-- 操作按钮区:加好友 + 送礼物 + 送金币(有职务且有奖励权限时显示) --}} {{-- 操作按钮区:加好友 + 送礼物 + 送金币(有职务且有奖励权限时显示) --}}
<div x-data="{ showGiftPanel: false, showGiftGoldPanel: false, giftGoldAmount: '', giftGoldSending: false }" x-show="userInfo.username !== window.chatContext.username"> <div x-data="{ showGiftPanel: false, showGiftGoldPanel: false, giftGoldAmount: '', giftGoldSending: false }"
x-show="userInfo.username !== window.chatContext.username">
<div class="modal-actions" style="margin-bottom: 0; display: flex; gap: 6px;"> <div class="modal-actions" style="margin-bottom: 0; display: flex; gap: 6px;">
{{-- 加好友 / 删好友 --}} {{-- 加好友 / 删好友 --}}
@@ -862,7 +861,8 @@
</div> </div>
{{-- 对方已婚时显示提示(非伴侣) --}} {{-- 对方已婚时显示提示(非伴侣) --}}
<div x-show="!marriageLoading && targetMarriage && targetMarriage.status === 'married' && !targetMarriage.is_my_partner" <div
x-show="!marriageLoading && targetMarriage && targetMarriage.status === 'married' && !targetMarriage.is_my_partner"
:title="'与 ' + (targetMarriage?.partner_name || '—') + ' 已婚'" :title="'与 ' + (targetMarriage?.partner_name || '—') + ' 已婚'"
style="flex:1; display:flex; align-items:center; justify-content:center; style="flex:1; display:flex; align-items:center; justify-content:center;
padding:7px 10px; border-radius:5px; font-size:12px; background:#fff1f2; padding:7px 10px; border-radius:5px; font-size:12px; background:#fff1f2;
@@ -884,11 +884,16 @@
<div x-show="showGiftGoldPanel" x-transition <div x-show="showGiftGoldPanel" x-transition
style="display: none; padding: 12px 16px; background: #fffbeb; border-top: 1px solid #fde68a;"> style="display: none; padding: 12px 16px; background: #fffbeb; border-top: 1px solid #fde68a;">
<div style="display:flex; justify-content:space-between; align-items:center; margin-bottom:8px;"> <div style="display:flex; justify-content:space-between; align-items:center; margin-bottom:8px;">
<span style="font-size:13px; color:#92400e; font-weight:bold;">💰 赠送金币给 <span x-text="userInfo.username"></span></span> <span style="font-size:13px; color:#92400e; font-weight:bold;">💰 赠送金币给 <span
x-text="userInfo.username"></span></span>
<button x-on:click="showGiftGoldPanel = false" <button x-on:click="showGiftGoldPanel = false"
style="background:none; border:none; color:#92400e; cursor:pointer; font-size:18px; line-height:1; opacity:.6;">×</button> style="background:none; border:none; color:#92400e; cursor:pointer; font-size:18px; line-height:1; opacity:.6;">
×
</button>
</div>
<div style="font-size:11px; color:#b45309; margin-bottom:8px;">您当前余额:<b
x-text="window.chatContext.myGold ?? '—'"></b> 金币
</div> </div>
<div style="font-size:11px; color:#b45309; margin-bottom:8px;">您当前余额:<b x-text="window.chatContext.myGold ?? '—'"></b> 金币</div>
<div style="display:flex; gap:8px; align-items:center;"> <div style="display:flex; gap:8px; align-items:center;">
<input type="number" x-model.number="giftGoldAmount" min="1" max="999999" <input type="number" x-model.number="giftGoldAmount" min="1" max="999999"
placeholder="输入金额" placeholder="输入金额"
@@ -938,7 +943,9 @@
style="display: flex; justify-content: space-between; align-items: center; margin-bottom: 10px;"> style="display: flex; justify-content: space-between; align-items: center; margin-bottom: 10px;">
<span style="font-size: 13px; color: #334155; font-weight: bold;">🎁 选择礼物</span> <span style="font-size: 13px; color: #334155; font-weight: bold;">🎁 选择礼物</span>
<button x-on:click="showGiftPanel = false" <button x-on:click="showGiftPanel = false"
style="background: none; border: none; color: #94a3b8; cursor: pointer; font-size: 18px; line-height: 1;">×</button> style="background: none; border: none; color: #94a3b8; cursor: pointer; font-size: 18px; line-height: 1;">
×
</button>
</div> </div>
{{-- 礼物选择列表 --}} {{-- 礼物选择列表 --}}
@@ -953,7 +960,8 @@
<img :src="'/images/gifts/' + g.image" <img :src="'/images/gifts/' + g.image"
style="width: 36px; height: 36px; object-fit: contain; margin-bottom: 4px;" style="width: 36px; height: 36px; object-fit: contain; margin-bottom: 4px;"
:alt="g.name"> :alt="g.name">
<div style="font-size: 11px; color: #1e293b; font-weight: 600; white-space: nowrap; overflow: hidden; text-overflow: ellipsis;" <div
style="font-size: 11px; color: #1e293b; font-weight: 600; white-space: nowrap; overflow: hidden; text-overflow: ellipsis;"
x-text="g.name"></div> x-text="g.name"></div>
<div style="font-size: 10px; color: #e11d48;" x-text="g.cost + ' 💰'"></div> <div style="font-size: 10px; color: #e11d48;" x-text="g.cost + ' 💰'"></div>
</div> </div>
@@ -1005,34 +1013,40 @@
@if ($myLevel >= $levelWarn || $room->master == Auth::user()->username) @if ($myLevel >= $levelWarn || $room->master == Auth::user()->username)
<div x-show="userInfo.user_level <= {{ $myLevel }}"> <div x-show="userInfo.user_level <= {{ $myLevel }}">
<div style="font-size: 10px; color: #9ca3af; margin-bottom: 4px; padding-left: 2px;"> <div style="font-size: 10px; color: #9ca3af; margin-bottom: 4px; padding-left: 2px;">
管理员操作</div> 管理员操作
</div>
<div style="display: flex; gap: 6px; flex-wrap: wrap; margin-bottom: 8px;"> <div style="display: flex; gap: 6px; flex-wrap: wrap; margin-bottom: 8px;">
@if ($myLevel >= $levelWarn) @if ($myLevel >= $levelWarn)
<button <button
style="flex:1; padding: 5px; border-radius: 4px; font-size: 11px; background: #fef3c7; border: 1px solid #f59e0b; cursor: pointer;" style="flex:1; padding: 5px; border-radius: 4px; font-size: 11px; background: #fef3c7; border: 1px solid #f59e0b; cursor: pointer;"
x-on:click="warnUser()">⚠️ 警告</button> x-on:click="warnUser()">⚠️ 警告
</button>
@endif @endif
@if ($myLevel >= $levelKick) @if ($myLevel >= $levelKick)
<button <button
style="flex:1; padding: 5px; border-radius: 4px; font-size: 11px; background: #fee2e2; border: 1px solid #ef4444; cursor: pointer;" style="flex:1; padding: 5px; border-radius: 4px; font-size: 11px; background: #fee2e2; border: 1px solid #ef4444; cursor: pointer;"
x-on:click="kickUser()">🚫 踢出</button> x-on:click="kickUser()">🚫 踢出
</button>
@endif @endif
@if ($myLevel >= $levelMute) @if ($myLevel >= $levelMute)
<button <button
style="flex:1; padding: 5px; border-radius: 4px; font-size: 11px; background: #e0e7ff; border: 1px solid #6366f1; cursor: pointer;" style="flex:1; padding: 5px; border-radius: 4px; font-size: 11px; background: #e0e7ff; border: 1px solid #6366f1; cursor: pointer;"
x-on:click="isMuting = !isMuting">🔇 禁言</button> x-on:click="isMuting = !isMuting">🔇 禁言
</button>
@endif @endif
@if ($myLevel >= $levelFreeze) @if ($myLevel >= $levelFreeze)
<button <button
style="flex:1; padding: 5px; border-radius: 4px; font-size: 11px; background: #dbeafe; border: 1px solid #3b82f6; cursor: pointer;" style="flex:1; padding: 5px; border-radius: 4px; font-size: 11px; background: #dbeafe; border: 1px solid #3b82f6; cursor: pointer;"
x-on:click="freezeUser()">🧊 冻结</button> x-on:click="freezeUser()">🧊 冻结
</button>
@endif @endif
{{-- 职务奖励金币(凭空产生),仅有在职职务且 max_reward != 0 的人可见 --}} {{-- 职务奖励金币(凭空产生),仅有在职职务且 max_reward != 0 的人可见 --}}
@if (Auth::user()->activePosition || $myLevel >= $superLevel) @if (Auth::user()->activePosition || $myLevel >= $superLevel)
<button x-show="window.chatContext?.myMaxReward !== 0" <button x-show="window.chatContext?.myMaxReward !== 0"
style="flex:1; padding: 5px; border-radius: 4px; font-size: 11px; background: #fef3c7; border: 1px solid #f59e0b; cursor: pointer;" style="flex:1; padding: 5px; border-radius: 4px; font-size: 11px; background: #fef3c7; border: 1px solid #f59e0b; cursor: pointer;"
x-on:click="openRewardModal(userInfo.username)">💰 奖励金币</button> x-on:click="openRewardModal(userInfo.username)">💰 奖励金币
</button>
@endif @endif
</div> </div>
</div> </div>
@@ -1041,17 +1055,22 @@
@if (Auth::user()->activePosition || $myLevel >= $superLevel) @if (Auth::user()->activePosition || $myLevel >= $superLevel)
<div> <div>
<div style="font-size: 10px; color: #9ca3af; margin-bottom: 4px; padding-left: 2px;"> <div style="font-size: 10px; color: #9ca3af; margin-bottom: 4px; padding-left: 2px;">
职务操作</div> 职务操作
</div>
<div style="display: flex; gap: 6px; flex-wrap: wrap;"> <div style="display: flex; gap: 6px; flex-wrap: wrap;">
<template x-if="!userInfo.position_name"> <template x-if="!userInfo.position_name">
<button x-on:click="showAppointPanel = !showAppointPanel" <button x-on:click="showAppointPanel = !showAppointPanel"
style="flex:1; padding: 5px; border-radius: 4px; font-size: 11px; background: #f3e8ff; border: 1px solid #a855f7; cursor: pointer;"> style="flex:1; padding: 5px; border-radius: 4px; font-size: 11px; background: #f3e8ff; border: 1px solid #a855f7; cursor: pointer;">
任命职务</button>
任命职务
</button>
</template> </template>
<template x-if="userInfo.position_name"> <template x-if="userInfo.position_name">
<button x-on:click="doRevoke()" :disabled="appointLoading" <button x-on:click="doRevoke()" :disabled="appointLoading"
style="flex:1; padding: 5px; border-radius: 4px; font-size: 11px; background: #fef9c3; border: 1px solid #eab308; cursor: pointer;">🔧 style="flex:1; padding: 5px; border-radius: 4px; font-size: 11px; background: #fef9c3; border: 1px solid #eab308; cursor: pointer;">
撤销职务</button> 🔧
撤销职务
</button>
</template> </template>
</div> </div>
<div x-show="showAppointPanel" x-transition <div x-show="showAppointPanel" x-transition
@@ -1073,7 +1092,9 @@
<span x-text="appointLoading?'处理中...':'✅ 确认任命'"></span> <span x-text="appointLoading?'处理中...':'✅ 确认任命'"></span>
</button> </button>
<button x-on:click="showAppointPanel=false" <button x-on:click="showAppointPanel=false"
style="padding:5px 10px; background:#fff; border:1px solid #ccc; border-radius:4px; font-size:11px; cursor:pointer;">取消</button> style="padding:5px 10px; background:#fff; border:1px solid #ccc; border-radius:4px; font-size:11px; cursor:pointer;">
取消
</button>
</div> </div>
</div> </div>
</div> </div>
@@ -1089,7 +1110,9 @@
style="width:60px; padding:4px; border:1px solid #ccc; border-radius:3px; font-size:11px;"> style="width:60px; padding:4px; border:1px solid #ccc; border-radius:3px; font-size:11px;">
<span style="font-size:11px; color:#b86e00;">分钟</span> <span style="font-size:11px; color:#b86e00;">分钟</span>
<button x-on:click="muteUser()" <button x-on:click="muteUser()"
style="padding:4px 12px; background:#6366f1; color:#fff; border:none; border-radius:3px; font-size:11px; cursor:pointer;">执行</button> style="padding:4px 12px; background:#6366f1; color:#fff; border:none; border-radius:3px; font-size:11px; cursor:pointer;">
执行
</button>
</div> </div>
</div> </div>
@@ -1116,9 +1139,16 @@
{{-- 头像原图全屏大图预览灯箱 --}} {{-- 头像原图全屏大图预览灯箱 --}}
<template x-if="userInfo"> <template x-if="userInfo">
<div x-show="showOriginalLightbox" style="display: none; z-index: 10000; background: rgba(0,0,0,0.85); backdrop-filter: blur(5px);" class="modal-overlay" x-on:click.self="showOriginalLightbox = false" x-transition.opacity> <div x-show="showOriginalLightbox"
<div style="position: absolute; top: 20px; right: 26px; color: rgba(255,255,255,0.7); font-size: 36px; cursor: pointer; transition: color 0.2s;" x-on:click="showOriginalLightbox = false" onmouseover="this.style.color='white'" onmouseout="this.style.color='rgba(255,255,255,0.7)'">&times;</div> style="display: none; z-index: 10000; background: rgba(0,0,0,0.85); backdrop-filter: blur(5px);"
<img :src="userInfo.headface_original ? userInfo.headface_original : ((userInfo.headface || '1.gif').startsWith('storage/') ? '/' + (userInfo.headface || '1.gif') : '/images/headface/' + (userInfo.headface || '1.gif'))" class="modal-overlay" x-on:click.self="showOriginalLightbox = false" x-transition.opacity>
<div
style="position: absolute; top: 20px; right: 26px; color: rgba(255,255,255,0.7); font-size: 36px; cursor: pointer; transition: color 0.2s;"
x-on:click="showOriginalLightbox = false" onmouseover="this.style.color='white'"
onmouseout="this.style.color='rgba(255,255,255,0.7)'">&times;
</div>
<img
:src="userInfo.headface_original ? userInfo.headface_original : ((userInfo.headface || '1.gif').startsWith('storage/') ? '/' + (userInfo.headface || '1.gif') : '/images/headface/' + (userInfo.headface || '1.gif'))"
style="position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); max-width: 90vw; max-height: 90vh; object-fit: contain; border-radius: 8px; box-shadow: 0 10px 40px rgba(0,0,0,0.5);"> style="position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); max-width: 90vw; max-height: 90vh; object-fit: contain; border-radius: 8px; box-shadow: 0 10px 40px rgba(0,0,0,0.5);">
</div> </div>
</template> </template>
@@ -1212,7 +1242,8 @@
<div style="color:#fde68a; font-size:13px; font-weight:bold; letter-spacing:3px; margin-bottom:12px;"> <div style="color:#fde68a; font-size:13px; font-weight:bold; letter-spacing:3px; margin-bottom:12px;">
══ 发放奖励金币 ══ ══ 发放奖励金币 ══
</div> </div>
<div style="color:white; font-size:20px; font-weight:900; text-shadow:0 2px 8px rgba(0,0,0,0.3); margin-bottom:20px;"> <div
style="color:white; font-size:20px; font-weight:900; text-shadow:0 2px 8px rgba(0,0,0,0.3); margin-bottom:20px;">
发给:<span x-text="targetUsername"></span> 发给:<span x-text="targetUsername"></span>
</div> </div>
@@ -1222,21 +1253,28 @@
</div> </div>
<div x-show="!loading"> <div x-show="!loading">
<div style="display:grid; grid-template-columns:repeat(4,1fr); gap:8px; margin-bottom:20px;"> <div style="display:grid; grid-template-columns:repeat(4,1fr); gap:8px; margin-bottom:20px;">
<div style="background:rgba(255,255,255,0.15); border:1px solid rgba(255,255,255,0.2); border-radius:10px; padding:10px 4px;"> <div
style="background:rgba(255,255,255,0.15); border:1px solid rgba(255,255,255,0.2); border-radius:10px; padding:10px 4px;">
<div style="font-size:10px; color:rgba(255,255,255,0.7); margin-bottom:4px;">单次上限</div> <div style="font-size:10px; color:rgba(255,255,255,0.7); margin-bottom:4px;">单次上限</div>
<div style="font-size:13px; font-weight:bold; color:#fff;" x-text="fmt(quota.max_once)"></div> <div style="font-size:13px; font-weight:bold; color:#fff;" x-text="fmt(quota.max_once)"></div>
</div> </div>
<div style="background:rgba(255,255,255,0.15); border:1px solid rgba(255,255,255,0.2); border-radius:10px; padding:10px 4px;"> <div
style="background:rgba(255,255,255,0.15); border:1px solid rgba(255,255,255,0.2); border-radius:10px; padding:10px 4px;">
<div style="font-size:10px; color:rgba(255,255,255,0.7); margin-bottom:4px;">单日上限</div> <div style="font-size:10px; color:rgba(255,255,255,0.7); margin-bottom:4px;">单日上限</div>
<div style="font-size:13px; font-weight:bold; color:#fff;" x-text="fmt(quota.daily_limit)"></div> <div style="font-size:13px; font-weight:bold; color:#fff;"
x-text="fmt(quota.daily_limit)"></div>
</div> </div>
<div style="background:rgba(20,184,166,0.25); border:1px solid rgba(255,255,255,0.3); border-radius:10px; padding:10px 4px;"> <div
style="background:rgba(20,184,166,0.25); border:1px solid rgba(255,255,255,0.3); border-radius:10px; padding:10px 4px;">
<div style="font-size:10px; color:#a7f3d0; margin-bottom:4px;">今日已发</div> <div style="font-size:10px; color:#a7f3d0; margin-bottom:4px;">今日已发</div>
<div style="font-size:13px; font-weight:bold; color:#fff;" x-text="quota.today_sent.toLocaleString()"></div> <div style="font-size:13px; font-weight:bold; color:#fff;"
x-text="quota.today_sent.toLocaleString()"></div>
</div> </div>
<div style="background:rgba(20,184,166,0.25); border:1px solid rgba(255,255,255,0.3); border-radius:10px; padding:10px 4px;"> <div
style="background:rgba(20,184,166,0.25); border:1px solid rgba(255,255,255,0.3); border-radius:10px; padding:10px 4px;">
<div style="font-size:10px; color:#a7f3d0; margin-bottom:4px;">剩余额度</div> <div style="font-size:10px; color:#a7f3d0; margin-bottom:4px;">剩余额度</div>
<div style="font-size:13px; font-weight:bold; color:#fff;" x-text="fmt(quota.daily_remaining)"></div> <div style="font-size:13px; font-weight:bold; color:#fff;"
x-text="fmt(quota.daily_remaining)"></div>
</div> </div>
</div> </div>
</div> </div>
@@ -1284,7 +1322,8 @@
{{-- 最近 10 条记录 --}} {{-- 最近 10 条记录 --}}
<div style="background:rgba(0,0,0,0.15); border-radius:12px; padding:12px 14px; text-align:left;"> <div style="background:rgba(0,0,0,0.15); border-radius:12px; padding:12px 14px; text-align:left;">
<div style="color:rgba(255,255,255,0.7); font-size:11px; font-weight:bold; margin-bottom:8px; display:flex; align-items:center; justify-content:space-between;"> <div
style="color:rgba(255,255,255,0.7); font-size:11px; font-weight:bold; margin-bottom:8px; display:flex; align-items:center; justify-content:space-between;">
<span>📋 最近发放记录</span> <span>📋 最近发放记录</span>
<span x-show="loading">加载中…</span> <span x-show="loading">加载中…</span>
</div> </div>
@@ -1292,7 +1331,8 @@
style="font-size:12px; color:rgba(255,255,255,0.5); text-align:center; padding:10px 0;"> style="font-size:12px; color:rgba(255,255,255,0.5); text-align:center; padding:10px 0;">
暂无发放记录 暂无发放记录
</div> </div>
<div x-show="!loading" style="max-height:120px; overflow-y:auto; display:flex; flex-direction:column; gap:6px; padding-right:4px;"> <div x-show="!loading"
style="max-height:120px; overflow-y:auto; display:flex; flex-direction:column; gap:6px; padding-right:4px;">
<template x-for="(r, i) in quota.recent_rewards" :key="i"> <template x-for="(r, i) in quota.recent_rewards" :key="i">
<div style="display:flex; align-items:center; justify-content:space-between; <div style="display:flex; align-items:center; justify-content:space-between;
padding:6px 10px; border-radius:8px; background:rgba(255,255,255,0.1);"> padding:6px 10px; border-radius:8px; background:rgba(255,255,255,0.1);">
@@ -1381,6 +1421,7 @@
} }
}); });
} }
document.addEventListener('DOMContentLoaded', setupFriendNotification); document.addEventListener('DOMContentLoaded', setupFriendNotification);
// ── BannerNotification:通用大卡片通知监听 ────────────────── // ── BannerNotification:通用大卡片通知监听 ──────────────────
@@ -1417,6 +1458,7 @@
}); });
} }
} }
document.addEventListener('DOMContentLoaded', setupBannerNotification); document.addEventListener('DOMContentLoaded', setupBannerNotification);
/** /**
@@ -1479,7 +1521,7 @@
* @param {string} username 目标用户名 * @param {string} username 目标用户名
* @param {HTMLElement} el 被点击的 <a> 元素,用于更新显示状态 * @param {HTMLElement} el 被点击的 <a> 元素,用于更新显示状态
*/ */
window.quickFriendAction = async function(act, username, el) { window.quickFriendAction = async function (act, username, el) {
if (el.dataset.done) { if (el.dataset.done) {
return; return;
} }