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)); + } +}