diff --git a/app/Http/Controllers/Admin/VipController.php b/app/Http/Controllers/Admin/VipController.php
index f1f07c1..1c7bc80 100644
--- a/app/Http/Controllers/Admin/VipController.php
+++ b/app/Http/Controllers/Admin/VipController.php
@@ -13,11 +13,16 @@
namespace App\Http\Controllers\Admin;
use App\Http\Controllers\Controller;
+use App\Models\User;
use App\Models\VipLevel;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\View\View;
+/**
+ * 后台 VIP 会员等级管理控制器
+ * 负责会员等级维护,以及查看各等级下的会员名单。
+ */
class VipController extends Controller
{
/**
@@ -51,7 +56,10 @@ class VipController extends Controller
*/
public function index(): View
{
- $levels = VipLevel::orderBy('sort_order')->get();
+ $levels = VipLevel::query()
+ ->withCount('users')
+ ->orderBy('sort_order')
+ ->get();
return view('admin.vip.index', [
'levels' => $levels,
@@ -60,6 +68,64 @@ class VipController extends Controller
]);
}
+ /**
+ * 查看某个会员等级下的会员名单。
+ *
+ * @param Request $request 当前筛选请求
+ * @param VipLevel $vip 当前会员等级
+ */
+ public function members(Request $request, VipLevel $vip): View
+ {
+ $query = User::query()->where('vip_level_id', $vip->id);
+ $now = now();
+
+ if ($request->filled('keyword')) {
+ $keyword = trim((string) $request->input('keyword'));
+
+ // 支持后台按用户名快速筛选某个等级下的会员。
+ $query->where('username', 'like', '%'.$keyword.'%');
+ }
+
+ if ($request->input('status') === 'active') {
+ // 当前有效会员:永久会员或到期时间仍在未来。
+ $query->where(function ($builder) use ($now): void {
+ $builder->whereNull('hy_time')->orWhere('hy_time', '>', $now);
+ });
+ }
+
+ if ($request->input('status') === 'expired') {
+ // 已过期会员:到期时间存在且已经早于当前时间。
+ $query->whereNotNull('hy_time')->where('hy_time', '<=', $now);
+ }
+
+ $members = $query
+ ->select(['id', 'username', 'sex', 'vip_level_id', 'hy_time', 'created_at'])
+ ->orderByRaw('CASE WHEN hy_time IS NULL THEN 0 WHEN hy_time > ? THEN 1 ELSE 2 END', [$now])
+ ->orderByRaw('hy_time IS NULL DESC')
+ ->orderByDesc('hy_time')
+ ->orderBy('username')
+ ->paginate(20)
+ ->withQueryString();
+
+ $totalAssignedCount = User::query()
+ ->where('vip_level_id', $vip->id)
+ ->count();
+
+ $activeCount = User::query()
+ ->where('vip_level_id', $vip->id)
+ ->where(function ($builder) use ($now): void {
+ $builder->whereNull('hy_time')->orWhere('hy_time', '>', $now);
+ })
+ ->count();
+
+ return view('admin.vip.members', [
+ 'vip' => $vip,
+ 'members' => $members,
+ 'totalAssignedCount' => $totalAssignedCount,
+ 'activeCount' => $activeCount,
+ ]);
+ }
+
/**
* 新增会员等级
*/
diff --git a/resources/views/admin/vip/index.blade.php b/resources/views/admin/vip/index.blade.php
index ccd8d0e..c81dbbd 100644
--- a/resources/views/admin/vip/index.blade.php
+++ b/resources/views/admin/vip/index.blade.php
@@ -125,7 +125,7 @@
当前会员
- {{ $level->users()->count() }} 人
+ {{ $level->users_count }} 人
进场特效
@@ -143,6 +143,10 @@
+
+ 查看会员
+