From 7f331faf04cf6427dcb8156634792ddfd893b561 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=90=9D=E5=8D=9C?= Date: Mon, 16 Mar 2026 01:55:22 +0800 Subject: [PATCH] chore(admin-ui): add admin pagination template and styles --- app/Providers/AppServiceProvider.php | 5 ++ public/css/admin-components.css | 69 +++++++++++++++++++ resources/views/admin/plans/index.blade.php | 2 +- .../admin/platform_orders/index.blade.php | 2 +- .../admin/site_subscriptions/index.blade.php | 2 +- resources/views/pagination/admin.blade.php | 44 ++++++++++++ ...onViewShouldRenderWithAdminClassesTest.php | 41 +++++++++++ 7 files changed, 162 insertions(+), 3 deletions(-) create mode 100644 resources/views/pagination/admin.blade.php create mode 100644 tests/Feature/AdminPaginationViewShouldRenderWithAdminClassesTest.php diff --git a/app/Providers/AppServiceProvider.php b/app/Providers/AppServiceProvider.php index 4c86a22..ae31625 100644 --- a/app/Providers/AppServiceProvider.php +++ b/app/Providers/AppServiceProvider.php @@ -3,6 +3,7 @@ namespace App\Providers; use App\Models\SystemConfig; +use Illuminate\Pagination\Paginator; use Illuminate\Support\Facades\Schema; use Illuminate\Support\ServiceProvider; @@ -21,6 +22,10 @@ class AppServiceProvider extends ServiceProvider */ public function boot(): void { + // Admin: unify pagination view for back-office pages. + // 说明:不改变业务逻辑,仅统一分页 HTML 结构与样式基线(Ant Design Pro-ish)。 + Paginator::defaultView('pagination.admin'); + // 从数据库 system_configs 自动注入可配置项到 config(),用于“总台可治理/可配置”的运营闭环。 // // 安全阀: diff --git a/public/css/admin-components.css b/public/css/admin-components.css index 9b3d9da..18a2dde 100644 --- a/public/css/admin-components.css +++ b/public/css/admin-components.css @@ -133,6 +133,75 @@ padding:0; } +/* 可复用:Pagination(中后台分页,参考 Ant Design Pro) */ +.adm-pagination{ + margin-top:16px; +} + +.adm-pagination-inner{ + display:flex; + align-items:center; + justify-content:space-between; + gap:12px; + flex-wrap:wrap; +} + +.adm-page-list{ + display:flex; + align-items:center; + gap:6px; + flex-wrap:wrap; +} + +.adm-page-btn, +.adm-page-num, +.adm-page-ellipsis{ + display:inline-flex; + align-items:center; + justify-content:center; + min-width:32px; + height:32px; + padding:0 10px; + border-radius:10px; + border:1px solid var(--adm-border-color, #e5e7eb); + background:var(--adm-bg-container, #ffffff); + color:var(--adm-text, #0f172a); + text-decoration:none; + box-shadow:var(--adm-shadow-sm, 0 1px 2px rgba(15, 23, 42, 0.06)); +} + +.adm-page-ellipsis{ + border-color:transparent; + background:transparent; + box-shadow:none; + min-width:auto; + padding:0 6px; + color:var(--adm-text-muted, #94a3b8); +} + +.adm-page-num.is-active{ + border-color:rgba(22, 119, 255, .45); + background:rgba(22, 119, 255, .08); + color:var(--adm-text, #0f172a); + font-weight:700; +} + +.adm-page-btn:hover, +.adm-page-num:hover{ + text-decoration:none; + border-color:rgba(22, 119, 255, .35); + background:rgba(22, 119, 255, .06); +} + +.adm-page-btn.is-disabled{ + opacity:.55; + cursor:not-allowed; +} + +.adm-page-meta{ + margin-left:auto; +} + .list-card-header{ padding:14px 16px; display:flex; diff --git a/resources/views/admin/plans/index.blade.php b/resources/views/admin/plans/index.blade.php index 3cd6d54..ee42e97 100644 --- a/resources/views/admin/plans/index.blade.php +++ b/resources/views/admin/plans/index.blade.php @@ -312,5 +312,5 @@ -
{{ $plans->links() }}
+
{{ $plans->links('pagination.admin') }}
@endsection diff --git a/resources/views/admin/platform_orders/index.blade.php b/resources/views/admin/platform_orders/index.blade.php index 21af385..cb2247b 100644 --- a/resources/views/admin/platform_orders/index.blade.php +++ b/resources/views/admin/platform_orders/index.blade.php @@ -1553,5 +1553,5 @@ -
{{ $orders->links() }}
+
{{ $orders->links('pagination.admin') }}
@endsection diff --git a/resources/views/admin/site_subscriptions/index.blade.php b/resources/views/admin/site_subscriptions/index.blade.php index 238eedb..e4378fa 100644 --- a/resources/views/admin/site_subscriptions/index.blade.php +++ b/resources/views/admin/site_subscriptions/index.blade.php @@ -414,5 +414,5 @@ -
{{ $subscriptions->links() }}
+
{{ $subscriptions->links('pagination.admin') }}
@endsection diff --git a/resources/views/pagination/admin.blade.php b/resources/views/pagination/admin.blade.php new file mode 100644 index 0000000..371d432 --- /dev/null +++ b/resources/views/pagination/admin.blade.php @@ -0,0 +1,44 @@ +@if ($paginator->hasPages()) + +@endif diff --git a/tests/Feature/AdminPaginationViewShouldRenderWithAdminClassesTest.php b/tests/Feature/AdminPaginationViewShouldRenderWithAdminClassesTest.php new file mode 100644 index 0000000..8e52fbf --- /dev/null +++ b/tests/Feature/AdminPaginationViewShouldRenderWithAdminClassesTest.php @@ -0,0 +1,41 @@ +seed(); + + $this->post('/admin/login', [ + 'email' => 'platform.admin@demo.local', + 'password' => 'Platform@123456', + ])->assertRedirect('/admin'); + } + + public function test_admin_pagination_view_should_render_with_admin_classes(): void + { + $this->loginAsPlatformAdmin(); + + // 构造一个简单的分页器,直接渲染 links(),避免依赖 seed 数据量。 + $p = new \Illuminate\Pagination\LengthAwarePaginator( + collect([1, 2, 3, 4, 5, 6]), + 6, + 2, + 2, + ['path' => '/admin/products'] + ); + + $html = (string) $p->links(); + + // 护栏:自定义分页模板必须输出统一的 admin pagination class。 + $this->assertStringContainsString('adm-pagination', $html); + $this->assertStringContainsString('adm-page-num', $html); + } +}