diff --git a/app/Support/BackUrl.php b/app/Support/BackUrl.php index 846aebe..b92997c 100644 --- a/app/Support/BackUrl.php +++ b/app/Support/BackUrl.php @@ -40,7 +40,6 @@ class BackUrl * 典型用途:列表页里的各种「统计卡/治理入口/快捷链接」需要: * - 保留当前筛选条件 * - 覆盖指定字段 - * - 强制清空 page * - 并且 back 只能保留通过 sanitizeForLinks 的安全值(否则移除) */ public static function currentPathWithQuery(array $overrides = [], string $safeBackForLinks = ''): string @@ -68,4 +67,46 @@ class BackUrl return $url; } + + /** + * 当前路径下的“快捷筛选”链接构造器: + * - 仅保留指定上下文键(例如 merchant_id/plan_id/keyword/lead_id 等) + * - 覆盖 overrides(null 表示移除) + * - 强制清空 page(避免落到空页) + * - back 仅保留安全值(由调用方传入 sanitizeForLinks 产物) + */ + public static function currentPathQuickFilter(array $contextKeys, array $overrides = [], string $safeBackForLinks = ''): string + { + $path = '/' . ltrim(request()->path(), '/'); + + $contextMap = []; + foreach ($contextKeys as $k) { + $contextMap[(string) $k] = 1; + } + + $q = array_intersect_key(request()->query(), $contextMap); + + if ($safeBackForLinks !== '') { + $q['back'] = $safeBackForLinks; + } else { + unset($q['back']); + } + + // 快捷筛选不应继承分页 + unset($q['page']); + + 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); + } } diff --git a/resources/views/admin/plans/index.blade.php b/resources/views/admin/plans/index.blade.php index 92dd3c4..1a1bbae 100644 --- a/resources/views/admin/plans/index.blade.php +++ b/resources/views/admin/plans/index.blade.php @@ -51,31 +51,7 @@ @php // 快捷筛选:仅保留“上下文”字段(back/keyword),避免把其它筛选条件叠加导致空结果 $buildQuickFilterUrl = function (array $overrides) use ($safeBackForLinks) { - $path = '/' . ltrim(request()->path(), '/'); - - $contextKeys = [ - 'keyword' => 1, - ]; - - $q = array_intersect_key(request()->query(), $contextKeys); - - if ($safeBackForLinks !== '') { - $q['back'] = $safeBackForLinks; - } - - 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); + return \App\Support\BackUrl::currentPathQuickFilter(['keyword'], $overrides, $safeBackForLinks); }; // “全部”:清空筛选,但保留安全 back(用于返回来源页) @@ -83,10 +59,6 @@ if ($safeBackForLinks !== '') { $allUrl .= '?' . \Illuminate\Support\Arr::query(['back' => $safeBackForLinks]); } - - if ($safeBackForLinks !== '') { - $allUrl .= '?' . \Illuminate\Support\Arr::query(['back' => $safeBackForLinks]); - } @endphp
diff --git a/resources/views/admin/platform_orders/index.blade.php b/resources/views/admin/platform_orders/index.blade.php index 3f12de7..baa9fa6 100644 --- a/resources/views/admin/platform_orders/index.blade.php +++ b/resources/views/admin/platform_orders/index.blade.php @@ -136,43 +136,7 @@ @php // 快捷筛选:尽量保留当前筛选(站点/套餐/订阅ID/back 等),仅覆盖目标筛选字段,并清空 page。 $buildQuickFilterUrl = function (array $overrides) use ($safeBackForLinks) { - $path = '/' . ltrim(request()->path(), '/'); - - // 快捷筛选的设计原则: - // - 保留“上下文”字段(站点/套餐/订阅/关键词/back) - // - 但:back 必须走全页统一安全护栏(避免把 unsafe back 透传到链接里) - // - 清理其它可能互斥/叠加导致空结果的筛选字段(例如 syncable_only/reconcile_mismatch 等) - // - 并且强制清空 page,避免落到空页 - $contextKeys = [ - 'merchant_id' => 1, - 'plan_id' => 1, - 'site_subscription_id' => 1, - 'keyword' => 1, - // 线索联动:从开通线索跳转来的上下文应保留(避免快捷筛选跳走后丢上下文) - 'lead_id' => 1, - ]; - - $q = array_intersect_key(request()->query(), $contextKeys); - - if ($safeBackForLinks !== '') { - $q['back'] = $safeBackForLinks; - } else { - unset($q['back']); - } - - 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); + return \App\Support\BackUrl::currentPathQuickFilter(['merchant_id', 'plan_id', 'site_subscription_id', 'keyword', 'lead_id'], $overrides, $safeBackForLinks); }; // “全部”:清空筛选,但保留 back(用于返回来源页) diff --git a/resources/views/admin/site_subscriptions/index.blade.php b/resources/views/admin/site_subscriptions/index.blade.php index 7cb0a0f..6b52ba5 100644 --- a/resources/views/admin/site_subscriptions/index.blade.php +++ b/resources/views/admin/site_subscriptions/index.blade.php @@ -59,33 +59,7 @@ @php // 快捷筛选:仅保留“上下文”字段(站点/套餐/keyword/安全 back),避免把其它筛选条件叠加导致空结果 $buildQuickFilterUrl = function (array $overrides) use ($safeBackForLinks) { - $path = '/' . ltrim(request()->path(), '/'); - - $contextKeys = [ - 'merchant_id' => 1, - 'plan_id' => 1, - 'keyword' => 1, - ]; - - $q = array_intersect_key(request()->query(), $contextKeys); - - if ($safeBackForLinks !== '') { - $q['back'] = $safeBackForLinks; - } - - 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); + return \App\Support\BackUrl::currentPathQuickFilter(['merchant_id', 'plan_id', 'keyword'], $overrides, $safeBackForLinks); }; // “全部”:清空筛选,但保留安全 back(用于返回来源页)