From 9971fa18415982cc4e8c1924e95c60aae09e33bf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=90=9D=E5=8D=9C?= Date: Fri, 13 Mar 2026 23:51:34 +0000 Subject: [PATCH] =?UTF-8?q?=E8=AE=A2=E9=98=85=E5=88=97=E8=A1=A8=EF=BC=9A?= =?UTF-8?q?=E5=BF=AB=E6=8D=B7=E7=AD=9B=E9=80=89=E4=BB=85=E4=BF=9D=E7=95=99?= =?UTF-8?q?=E4=B8=8A=E4=B8=8B=E6=96=87=E5=AD=97=E6=AE=B5=E9=81=BF=E5=85=8D?= =?UTF-8?q?=E4=BA=92=E6=96=A5=E5=8F=A0=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../admin/site_subscriptions/index.blade.php | 51 ++++++++++++-- ...onIndexQuickFilterLinksKeepContextTest.php | 66 +++++++++++++++++++ 2 files changed, 111 insertions(+), 6 deletions(-) create mode 100644 tests/Feature/AdminSiteSubscriptionIndexQuickFilterLinksKeepContextTest.php diff --git a/resources/views/admin/site_subscriptions/index.blade.php b/resources/views/admin/site_subscriptions/index.blade.php index b6304a6..10db8d7 100644 --- a/resources/views/admin/site_subscriptions/index.blade.php +++ b/resources/views/admin/site_subscriptions/index.blade.php @@ -52,18 +52,57 @@

快捷筛选

用于运营快速定位需要处理的订阅集合(口径基于筛选条件组合)。
+ + @php + // 快捷筛选:仅保留“上下文”字段(站点/套餐/back/关键词),避免把其它筛选条件叠加导致空结果 + $buildQuickFilterUrl = function (array $overrides) { + $path = '/' . ltrim(request()->path(), '/'); + + $contextKeys = [ + 'merchant_id' => 1, + 'plan_id' => 1, + 'back' => 1, + 'keyword' => 1, + ]; + + $q = array_intersect_key(request()->query(), $contextKeys); + + foreach ($overrides as $k => $v) { + if ($v === null) { + unset($q[$k]); + continue; + } + $q[$k] = $v; + } + + if (count($q) === 0) { + return $path; + } + + return $path . '?' . \Illuminate\Support\Arr::query($q); + }; + + // “全部”:清空筛选,但保留 back(用于返回来源页) + $incomingBack = (string) request()->query('back', ''); + $safeBack = str_starts_with($incomingBack, '/') ? $incomingBack : ''; + $allUrl = '/admin/site-subscriptions'; + if ($safeBack !== '') { + $allUrl .= '?' . \Illuminate\Support\Arr::query(['back' => $safeBack]); + } + @endphp +
- 全部 + 全部 - 已生效 + 已生效 - 待生效 + 待生效 - 已取消 + 已取消 - 已过期 + 已过期 - 7天内到期 + 7天内到期
diff --git a/tests/Feature/AdminSiteSubscriptionIndexQuickFilterLinksKeepContextTest.php b/tests/Feature/AdminSiteSubscriptionIndexQuickFilterLinksKeepContextTest.php new file mode 100644 index 0000000..835c235 --- /dev/null +++ b/tests/Feature/AdminSiteSubscriptionIndexQuickFilterLinksKeepContextTest.php @@ -0,0 +1,66 @@ +seed(); + + $this->post('/admin/login', [ + 'email' => 'platform.admin@demo.local', + 'password' => 'Platform@123456', + ])->assertRedirect('/admin'); + } + + public function test_quick_filter_links_should_keep_context_and_drop_other_filters(): void + { + $this->loginAsPlatformAdmin(); + + $res = $this->get('/admin/site-subscriptions?merchant_id=2&plan_id=3&back=%2Fadmin%2Fplatform-orders&keyword=abc&page=9&status=pending&expiry=expired'); + $res->assertOk(); + + $html = (string) $res->getContent(); + preg_match_all('/href="([^"]+)"/', $html, $m); + $hrefs = $m[1] ?? []; + $this->assertGreaterThan(0, count($hrefs)); + + // 找到“已生效”快捷筛选链接(status=activated) + $activatedLinks = array_values(array_filter($hrefs, fn ($u) => str_contains($u, '/admin/site-subscriptions') && str_contains($u, 'status=activated'))); + $this->assertGreaterThanOrEqual(1, count($activatedLinks)); + + $parts = parse_url($activatedLinks[0]); + parse_str($parts['query'] ?? '', $q); + + // 保留上下文:merchant/plan/back/keyword + $this->assertSame('2', (string) ($q['merchant_id'] ?? '')); + $this->assertSame('3', (string) ($q['plan_id'] ?? '')); + $this->assertSame('/admin/platform-orders', (string) ($q['back'] ?? '')); + $this->assertSame('abc', (string) ($q['keyword'] ?? '')); + + // 覆盖/清理:status=activated,且不应带 expiry/page + $this->assertSame('activated', (string) ($q['status'] ?? '')); + $this->assertArrayNotHasKey('expiry', $q); + $this->assertArrayNotHasKey('page', $q); + + // “全部”应清空筛选,仅保留 back + $allLinks = array_values(array_filter($hrefs, function ($u) { + if (!str_starts_with($u, '/admin/site-subscriptions')) { + return false; + } + + $p = parse_url($u); + parse_str($p['query'] ?? '', $q2); + + return (($q2['back'] ?? null) === '/admin/platform-orders') && (count($q2) === 1); + })); + + $this->assertGreaterThanOrEqual(1, count($allLinks)); + } +}