feat: refactor agent manager, media library, and player UX

- Split admin users page into player/tier-1/tier-2 tabs with affiliation labels and context-specific create dialogs

- Add media library with uploaded_files migration, list/delete unused files API, and admin nav route

- Enforce player username format (alphanumeric 3-32) on frontend and backend via shared package

- Improve admin dialog/panel styling; refine player parlay and match bet card kickoff display

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-06-09 17:56:28 +08:00
parent d5e7c8edb3
commit df20444be9
27 changed files with 2136 additions and 563 deletions

View File

@@ -67,6 +67,8 @@ const subtitle = computed(() => {
return props.bet.pickLabel || props.bet.leagueName || '';
});
const stakeAmount = computed(() => formatMoney(props.bet.stake, locale.value));
const returnAmount = computed(() => {
if (statusKey.value === 'won') return formatMoney(props.bet.actualReturn, locale.value);
if (statusKey.value === 'pending') return formatMoney(props.bet.potentialReturn, locale.value);
@@ -94,6 +96,9 @@ function goDetail() {
<span class="subtitle">{{ subtitle }} · {{ placedDate }}</span>
</div>
<div class="card-right">
<span class="stake-amt">
{{ t('history.stake') }} {{ stakeAmount }}
</span>
<span class="return-amt" :class="{ highlight: returnHighlight, pending: returnPending, lost: returnLost }">
{{ returnAmount }}
</span>
@@ -176,6 +181,12 @@ function goDetail() {
gap: 4px;
}
.stake-amt {
font-size: 11px;
color: #666;
font-weight: 600;
}
.return-amt {
font-size: 15px;
font-weight: 900;