@extends('admin.layouts.app') @section('title', '订阅管理') @section('page_title', '订阅管理') @section('content') @php // back 参数用于“返回上一页(保留上下文)”,但 back 本身不应再包含 back(避免无限嵌套导致 URL 膨胀) // 注意:使用相对路径而非绝对 URL,避免不同 APP_URL 环境影响,以及 show 页 back 安全校验(要求以 / 开头) $selfWithoutBack = \App\Support\BackUrl::selfWithoutBack(); $currentQuery = request()->query(); unset($currentQuery['back']); $back = $selfWithoutBack; // 用于构建“保留当前筛选上下文”的站内跳转链接(且不透传 back,避免嵌套/污染) $buildSelfUrl = function (array $overrides = []) use ($currentQuery) { $q = $currentQuery; foreach ($overrides as $k => $v) { if ($v === null) { unset($q[$k]); } else { $q[$k] = $v; } } $url = '/' . ltrim(request()->path(), '/'); if (count($q) > 0) { $url .= '?' . \Illuminate\Support\Arr::query($q); } return $url; }; // back 安全护栏(全页通用): // - 仅允许站内相对路径(/ 开头) // - 拒绝引号/尖括号(由于本页大量 href 采用 `{!! !!}` 原样输出,必须严控注入风险) // - 拒绝 nested back=(避免 URL 膨胀/绕过) $incomingBack = (string) request()->query('back', ''); $safeBackForLinks = \App\Support\BackUrl::sanitizeForLinks($incomingBack); @endphp

这里是总台视角的订阅目录页,承接“套餐 -> 订阅 -> 平台订单”的收费主链中间层。

当前阶段先做到:可访问列表、可筛选、统计摘要;后续再接:订阅激活服务 / 续费 / 取消 / 对账。

@if($safeBackForLinks !== '')
← 返回上一页(保留上下文)
@endif

快捷筛选

用于运营快速定位需要处理的订阅集合(口径基于筛选条件组合)。
@php // 快捷筛选:仅保留“上下文”字段(站点/套餐/keyword/安全 back),避免把其它筛选条件叠加导致空结果 $buildQuickFilterUrl = function (array $overrides) use ($safeBackForLinks) { return \App\Support\BackUrl::currentPathQuickFilter(['merchant_id', 'plan_id', 'keyword'], $overrides, $safeBackForLinks); }; // “全部”:清空筛选,但保留安全 back(用于返回来源页) $allUrl = \App\Support\BackUrl::withBack('/admin/site-subscriptions', $safeBackForLinks); @endphp
全部 已生效 待生效 已取消 已过期 7天内到期

筛选条件

@if($safeBackForLinks !== '') @endif

订阅总数

{{ $summaryStats['total_subscriptions'] ?? 0 }}

已生效

{{ $summaryStats['activated_subscriptions'] ?? 0 }}

待生效

{{ $summaryStats['pending_subscriptions'] ?? 0 }}

已取消

{{ $summaryStats['cancelled_subscriptions'] ?? 0 }}

已过期(按到期时间)

{{ $summaryStats['expired_subscriptions'] ?? 0 }}

7天内到期

{{ $summaryStats['expiring_7d_subscriptions'] ?? 0 }}

工具

@php $q = [ 'order_type' => 'renewal', 'back' => $selfWithoutBack, ]; if ((int) ($filters['merchant_id'] ?? 0) > 0) { $q['merchant_id'] = (int) $filters['merchant_id']; } if ((int) ($filters['plan_id'] ?? 0) > 0) { $q['plan_id'] = (int) $filters['plan_id']; } $createOrderFromSubIndexUrl = '/admin/platform-orders/create?' . \Illuminate\Support\Arr::query($q); @endphp 创建续费订单(带当前筛选)
用于运营从订阅目录快速补单/续费:会把当前 merchant_id/plan_id/site_subscription_id 作为默认值带到下单页。

订阅列表

@forelse($subscriptions as $subscription) @empty @endforelse
ID 订阅号 站点 套餐 状态 计费周期 周期(月) 金额 开始时间 到期时间 到期状态 关联订单数 生效时间
{{ $subscription->id }} @php $subShowUrl = '/admin/site-subscriptions/' . $subscription->id . '?' . \Illuminate\Support\Arr::query([ 'back' => $back, ]); @endphp {{ $subscription->subscription_no }} @php $remarkPrefix = (string) config('saasshop.platform_orders.renewal_order_remark_prefix', '来自订阅:'); $q = [ 'order_type' => 'renewal', 'site_subscription_id' => $subscription->id, 'quantity' => 1, 'remark' => $remarkPrefix . $subscription->subscription_no, 'back' => $back, ]; if ((int) ($subscription->merchant_id ?? 0) > 0) { $q['merchant_id'] = (int) $subscription->merchant_id; } if ((int) ($subscription->plan_id ?? 0) > 0) { $q['plan_id'] = (int) $subscription->plan_id; } $renewOrderUrl = '/admin/platform-orders/create?' . \Illuminate\Support\Arr::query($q); @endphp @if($subscription->merchant) {{ $subscription->merchant->name }} @else 未关联站点 @endif @if($subscription->plan) {{ $subscription->plan_name ?: $subscription->plan->name }} @else {{ $subscription->plan_name ?: '未设置' }} @endif {{ ($statusLabels[$subscription->status] ?? $subscription->status) }} ({{ $subscription->status }}) {{ $subscription->billing_cycle ?: '-' }} {{ $subscription->period_months }} ¥{{ number_format((float) $subscription->amount, 2) }} {{ optional($subscription->starts_at)->format('Y-m-d H:i:s') ?: '-' }} {{ optional($subscription->ends_at)->format('Y-m-d H:i:s') ?: '-' }} @php $endsAt = $subscription->ends_at; $expiryLabel = '无到期'; if ($endsAt) { if ($endsAt->lt(now())) { $expiryLabel = '已过期'; } elseif ($endsAt->lt(now()->addDays(7))) { $expiryLabel = '7天内到期'; } else { $expiryLabel = '未到期'; } } @endphp {{ $expiryLabel }} @php $cnt = (int) ($subscription->platform_orders_count ?? 0); @endphp @if($cnt > 0) @php $platformOrdersUrl = '/admin/platform-orders?' . \Illuminate\Support\Arr::query([ 'site_subscription_id' => $subscription->id, 'back' => $back, ]); @endphp {{ $cnt }} @else 0 @endif {{ optional($subscription->activated_at)->format('Y-m-d H:i:s') ?: '-' }}
暂无订阅数据,当前阶段先把订阅主表与总台目录立起来,后续再接订阅创建/激活/续费链路。
{{ $subscriptions->links() }}
@endsection