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

@@ -22,6 +22,7 @@ const adminMenus = computed(() => [
{ path: '/cashback', label: t('nav.cashback') },
{ path: '/bets', label: t('nav.bets') },
{ path: '/contents', label: t('nav.contents') },
{ path: '/media', label: t('nav.media') },
{ path: '/audit', label: t('nav.audit') },
{ path: '/smoke-tests', label: t('nav.smoke_tests') },
]);
@@ -175,6 +176,7 @@ watch(() => route.path, () => {
</nav>
<span v-else class="topbar-page-label">{{ currentLabel }}</span>
</div>
<div id="topbar-page-actions" class="topbar-page-actions" />
</div>
<div class="topbar-right">
<div class="user-chip">
@@ -390,6 +392,17 @@ watch(() => route.path, () => {
box-shadow: 0 0 8px rgba(47, 181, 106, 0.45);
}
.topbar-page-actions {
display: flex;
align-items: center;
gap: 8px;
flex-shrink: 0;
margin-left: 8px;
}
.topbar-page-actions:empty {
display: none;
}
.topbar-right {
display: flex; align-items: center; gap: 12px;
flex-shrink: 0;