From 5e7d6bc23f9039827eb1b2360d809132b59224a0 Mon Sep 17 00:00:00 2001 From: Mars <3361409208a@gmail.com> Date: Mon, 22 Jun 2026 16:51:36 +0800 Subject: [PATCH] =?UTF-8?q?sync(admin):=20=E4=BB=8E=20main=20=E5=90=8C?= =?UTF-8?q?=E6=AD=A5=E5=88=97=E8=A1=A8=E5=B8=83=E5=B1=80=E3=80=81=E6=BB=9A?= =?UTF-8?q?=E5=8A=A8=E5=9B=BA=E5=AE=9A=E4=B8=8E=E4=BE=A7=E6=A0=8F=E9=80=89?= =?UTF-8?q?=E4=B8=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit checkout main: App.vue, ManageLayout, AgentManager, Matches, LeagueMatches*, AgentDirectPlayersView --- apps/admin/src/App.vue | 94 +++++++++++++++++-- apps/admin/src/layouts/ManageLayout.vue | 32 +++---- apps/admin/src/views/AgentManager.vue | 44 +-------- apps/admin/src/views/Matches.vue | 12 +-- .../views/agent/AgentDirectPlayersView.vue | 2 +- .../src/views/matches/LeagueMatchesPage.vue | 9 ++ .../src/views/matches/LeagueMatchesPanel.vue | 40 ++++++-- 7 files changed, 149 insertions(+), 84 deletions(-) diff --git a/apps/admin/src/App.vue b/apps/admin/src/App.vue index 6dc29bc..2d0df54 100644 --- a/apps/admin/src/App.vue +++ b/apps/admin/src/App.vue @@ -65,7 +65,7 @@ body::-webkit-scrollbar { height: 100%; min-height: 0; overflow: hidden; - gap: 14px; + gap: 18px; } .admin-list-page > .page-toolbar, .admin-list-page > .filter-card, @@ -244,7 +244,48 @@ body::-webkit-scrollbar { .admin-list-page > .list-panel { border: 1px solid var(--border); background: var(--bg-card); - padding: 0 10px 10px; + padding: 14px 16px 16px; +} + +/* Tabs / 筛选壳内的 list-panel 不再套第二层卡片,避免顶边重叠 */ +.admin-list-page > .mgr-tabs-shell .list-panel, +.admin-list-page .el-tab-pane > .list-panel, +.list-chrome > .list-panel { + border: none; + box-shadow: none; + background: transparent; + padding: 0; + border-radius: 0; + overflow: visible; +} + +/* 代理管理等 Tabs 页:外层壳作为唯一卡片 */ +.admin-list-page > .mgr-tabs-shell { + flex: 1; + min-height: 0; + border: 1px solid var(--border); + border-radius: 10px; + background: #ffffff; + box-shadow: var(--shadow); + padding: 14px 16px 16px; +} + +.admin-list-page > .mgr-tabs-shell .mgr-top-tabs .el-tabs__header { + margin-bottom: 14px; +} + +.admin-list-page > .filter-card .el-card__body { + padding: 16px 18px 18px; +} + +.admin-list-page > .filter-card .el-tabs__header { + margin-bottom: 14px; +} + +.list-chrome__row + .list-hint { + margin-top: 2px; + padding-top: 4px; + padding-bottom: 0; } .admin-list-page > .data-card .el-card__body { flex: 1; @@ -285,10 +326,43 @@ body::-webkit-scrollbar { .admin-list-page .list-hint { flex-shrink: 0; margin: 0; - padding: 6px 0 8px; + padding: 4px 0 12px; font-size: 11px; color: var(--text-muted); - line-height: 1.4; + line-height: 1.45; +} + +.admin-list-page .list-panel-toolbar + .list-hint { + padding-top: 0; + margin-top: -2px; +} + +.admin-list-page .list-panel-toolbar { + flex-shrink: 0; + align-items: flex-start; + justify-content: space-between; + gap: 12px; + padding: 2px 0 14px; + margin-bottom: 2px; + border-bottom: 1px solid var(--border-soft); + --list-chrome-control-h: 32px; + --el-component-size: 32px; +} + +.admin-list-page .list-panel-toolbar :deep(.el-form-item) { + margin-bottom: 0 !important; + margin-right: 12px; +} + +.admin-list-page .list-panel-toolbar :deep(.el-input__wrapper), +.admin-list-page .list-panel-toolbar :deep(.el-select__wrapper) { + height: var(--list-chrome-control-h) !important; + min-height: var(--list-chrome-control-h) !important; +} + +.admin-list-page .list-panel-toolbar :deep(.el-button:not(.is-link)) { + height: var(--list-chrome-control-h) !important; + min-height: var(--list-chrome-control-h) !important; } .admin-list-page .pager { flex-shrink: 0; @@ -1250,7 +1324,7 @@ input:-webkit-autofill:focus { .admin-list-page { display: flex; flex-direction: column; - gap: 16px; + gap: 18px; color: var(--text); } @@ -1281,8 +1355,11 @@ input:-webkit-autofill:focus { .list-toolbar + .table-wrap, .filter-bar + .table-wrap, .filters + .table-wrap, -.list-panel-toolbar + .table-wrap { - margin-top: 2px; +.list-panel-toolbar + .table-wrap, +.list-panel-toolbar + .admin-table-wrap, +.list-hint + .table-wrap, +.list-hint + .admin-table-wrap { + margin-top: 0; } .table-wrap, @@ -1301,8 +1378,9 @@ input:-webkit-autofill:focus { .list-chrome > .admin-table-wrap, .list-chrome > .table-panel, .list-chrome > .list-panel { - border-color: var(--border-soft); + border: none; box-shadow: none; + background: transparent; } .table-scroll, diff --git a/apps/admin/src/layouts/ManageLayout.vue b/apps/admin/src/layouts/ManageLayout.vue index 14e9233..3ae6e2a 100644 --- a/apps/admin/src/layouts/ManageLayout.vue +++ b/apps/admin/src/layouts/ManageLayout.vue @@ -77,7 +77,7 @@ const adminMenus = computed(() => { const items: AdminMenuItem[] = [ { key: 'dashboard', path: '/', label: t('nav.dashboard'), icon: 'dashboard', matchPrefix: true, permissions: [AdminPerm.reports], excludeRoles: ['SUPPORT'] }, { key: 'matches', path: '/matches', label: t('nav.matches'), icon: 'matches', matchPrefix: true, permissions: [AdminPerm.matches] }, - { key: 'users', path: '/users', label: t('nav.agents_players'), icon: 'users', permissions: [AdminPerm.usersView, AdminPerm.agentsView] }, + { key: 'users', path: '/users', label: t('nav.agents_players'), icon: 'users', matchPrefix: true, permissions: [AdminPerm.usersView, AdminPerm.agentsView] }, { key: 'finance-logs', path: '/finance-logs', label: t('nav.finance_logs'), icon: 'finance', permissions: [AdminPerm.reports], excludeRoles: ['MATCH_ADMIN'] }, { key: 'deposit', path: '/deposit', label: t('nav.deposit_manage'), icon: 'deposit', matchPrefix: true, permissions: [AdminPerm.depositManage, AdminPerm.depositReview] }, { key: 'cashback', path: '/cashback', label: t('nav.cashback'), icon: 'cashback', permissions: [AdminPerm.cashback], excludeRoles: ['MATCH_ADMIN', 'SUPPORT'] }, @@ -117,15 +117,17 @@ function isDepositSectionPath(path: string) { return path === '/deposit' || path === '/deposit-orders' || path === '/payment-methods'; } +function isMenuActive(menu: { path: string; matchPrefix?: boolean }, path: string) { + if (path === menu.path) return true; + if (!menu.matchPrefix) return false; + if (menu.path === '/') return isDashboardSectionPath(path); + if (menu.path === '/deposit') return isDepositSectionPath(path); + if (menu.path === '/matches') return isMatchesSectionPath(path); + return path.startsWith(`${menu.path}/`); +} + const currentLabel = computed(() => { - const hit = menus.value.find((m) => { - if ('matchPrefix' in m && m.matchPrefix) { - if (m.path === '/') return isDashboardSectionPath(route.path); - if (m.path === '/deposit') return isDepositSectionPath(route.path); - return isMatchesSectionPath(route.path); - } - return route.path === m.path; - }); + const hit = menus.value.find((m) => isMenuActive(m, route.path)); return hit?.label ?? ''; }); @@ -226,17 +228,7 @@ watch(() => route.path, () => { { } .agent-direct-players-page :deep(.admin-subnav) { - margin-bottom: 10px; + margin-bottom: 14px; } .agent-direct-players-page .list-panel { diff --git a/apps/admin/src/views/matches/LeagueMatchesPage.vue b/apps/admin/src/views/matches/LeagueMatchesPage.vue index cfaf449..f2eb289 100644 --- a/apps/admin/src/views/matches/LeagueMatchesPage.vue +++ b/apps/admin/src/views/matches/LeagueMatchesPage.vue @@ -192,12 +192,21 @@ watch(leagueId, () => { min-height: 0; } +.league-matches-page :deep(.admin-subnav) { + flex-shrink: 0; + margin-bottom: 14px; +} + .league-matches-page .list-panel { flex: 1; min-height: 0; display: flex; flex-direction: column; overflow: hidden; + border: none; + background: transparent; + padding: 0; + box-shadow: none; } .team-country-select { diff --git a/apps/admin/src/views/matches/LeagueMatchesPanel.vue b/apps/admin/src/views/matches/LeagueMatchesPanel.vue index 60bcaf0..4eec792 100644 --- a/apps/admin/src/views/matches/LeagueMatchesPanel.vue +++ b/apps/admin/src/views/matches/LeagueMatchesPanel.vue @@ -466,7 +466,8 @@ defineExpose({ reload: load }); - +
+ - -

{{ t('match.no_fixtures') }}

+ +

{{ t('match.no_fixtures') }}

+
+
.league-matches-panel { + display: flex; + flex-direction: column; + flex: 1; + min-height: 0; + height: 100%; width: min(100%, calc(100vw - 272px)); max-width: calc(100vw - 272px); - padding: 10px 12px 12px; - overflow-x: auto; - overflow-y: visible; + padding: 14px 14px 14px; + overflow: hidden; background: #fbfaf7; } .nested-panel-toolbar { + flex-shrink: 0; display: flex; flex-wrap: wrap; align-items: flex-start; justify-content: space-between; gap: 10px 16px; - margin-bottom: 10px; - padding: 8px 12px; + margin: 2px 0 12px; + padding: 10px 14px; background: #ffffff; border: 1px solid var(--border-soft, #eaeaea); border-radius: 6px; @@ -677,10 +685,26 @@ defineExpose({ reload: load }); color: var(--text-muted); white-space: nowrap; } +.nested-table-wrap { + flex: 1; + min-height: 0; + overflow: auto; + border: 1px solid var(--border-soft, #eaeaea); + border-radius: 6px; + background: #ffffff; +} +.nested-table-wrap :deep(.el-table__header-wrapper) { + position: sticky; + top: 0; + z-index: 2; + background: var(--el-table-header-bg-color, #fafafa); +} .nested-pager { + flex-shrink: 0; display: flex; justify-content: flex-end; padding-top: 8px; + background: #fbfaf7; } .actions-col-header { display: inline-flex;