From 759fb6deae07f39e69b7c6f533c636e061bf5786 Mon Sep 17 00:00:00 2001 From: lkddi Date: Sun, 1 Mar 2026 16:47:34 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8A=9F=E8=83=BD=EF=BC=9A=E5=90=8E=E5=8F=B0?= =?UTF-8?q?=E6=96=B0=E5=A2=9E=E5=95=86=E5=BA=97=E7=AE=A1=E7=90=86=E9=A1=B5?= =?UTF-8?q?=E9=9D=A2=EF=BC=88=E7=AB=99=E9=95=BF=E8=8F=9C=E5=8D=95=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 路由:GET/POST/PUT/PATCH/DELETE /admin/shop - 控制器:Admin/ShopItemController(index/store/update/toggle/destroy) - 视图:admin/shop/index.blade.php - 表格展示所有商品(名称/类型色标/价格/有效期/排序/状态) - Alpine.js 弹窗新增/编辑(支持全字段) - 上下架一键切换(PATCH toggle) - 删除按键(含二次确认) - 侧边栏:VIP 下方新增「🛒 商店管理」链接 - 权限:superlevel 可查看/编辑;id=1 可新增/删除 --- .../Controllers/Admin/ShopItemController.php | 113 ++++++ resources/views/admin/layouts/app.blade.php | 4 + resources/views/admin/shop/index.blade.php | 351 ++++++++++++++++++ routes/web.php | 7 + 4 files changed, 475 insertions(+) create mode 100644 app/Http/Controllers/Admin/ShopItemController.php create mode 100644 resources/views/admin/shop/index.blade.php diff --git a/app/Http/Controllers/Admin/ShopItemController.php b/app/Http/Controllers/Admin/ShopItemController.php new file mode 100644 index 0000000..eda5470 --- /dev/null +++ b/app/Http/Controllers/Admin/ShopItemController.php @@ -0,0 +1,113 @@ +orderBy('id')->get(); + + return view('admin.shop.index', compact('items')); + } + + /** + * 新增商品(仅 id=1 超级站长) + */ + public function store(Request $request): RedirectResponse + { + abort_unless(Auth::id() === 1, 403); + + $data = $this->validateItem($request); + ShopItem::create($data); + + return redirect()->route('admin.shop.index')->with('success', '商品「'.$data['name'].'」创建成功!'); + } + + /** + * 更新商品信息 + * + * @param ShopItem $shopItem 路由模型自动注入 + */ + public function update(Request $request, ShopItem $shopItem): RedirectResponse + { + $data = $this->validateItem($request, $shopItem); + $shopItem->update($data); + + return redirect()->route('admin.shop.index')->with('success', '商品「'.$shopItem->name.'」更新成功!'); + } + + /** + * 切换商品上下架状态 + * + * @param ShopItem $shopItem 路由模型自动注入 + */ + public function toggle(ShopItem $shopItem): RedirectResponse + { + $shopItem->update(['is_active' => ! $shopItem->is_active]); + $status = $shopItem->is_active ? '上架' : '下架'; + + return redirect()->route('admin.shop.index')->with('success', "「{$shopItem->name}」已{$status}。"); + } + + /** + * 删除商品(仅 id=1 超级站长) + * + * @param ShopItem $shopItem 路由模型自动注入 + */ + public function destroy(ShopItem $shopItem): RedirectResponse + { + abort_unless(Auth::id() === 1, 403); + + $name = $shopItem->name; + $shopItem->delete(); + + return redirect()->route('admin.shop.index')->with('success', "「{$name}」已删除。"); + } + + /** + * 统一验证商品表单(新增/编辑共用) + * + * @return array + */ + private function validateItem(Request $request, ?ShopItem $item = null): array + { + return $request->validate([ + 'name' => 'required|string|max:100', + 'slug' => ['required', 'string', 'max:100', + \Illuminate\Validation\Rule::unique('shop_items', 'slug')->ignore($item?->id), + ], + 'icon' => 'required|string|max:20', + 'description' => 'nullable|string|max:500', + 'price' => 'required|integer|min:0', + 'type' => 'required|in:instant,duration,one_time,ring,auto_fishing', + 'duration_days' => 'nullable|integer|min:0', + 'duration_minutes' => 'nullable|integer|min:0', + 'intimacy_bonus' => 'nullable|integer|min:0', + 'charm_bonus' => 'nullable|integer|min:0', + 'sort_order' => 'required|integer|min:0', + 'is_active' => 'boolean', + ]); + } +} diff --git a/resources/views/admin/layouts/app.blade.php b/resources/views/admin/layouts/app.blade.php index 51d7e49..01238c1 100644 --- a/resources/views/admin/layouts/app.blade.php +++ b/resources/views/admin/layouts/app.blade.php @@ -67,6 +67,10 @@ class="block px-4 py-3 rounded-md transition {{ request()->routeIs('admin.vip.*') ? 'bg-indigo-600 font-bold' : 'hover:bg-white/10' }}"> {!! '👑 VIP 会员等级' . $ro !!} + + {!! '🛒 商店管理' . $ro !!} + {!! '💒 婚姻管理' . $ro !!} diff --git a/resources/views/admin/shop/index.blade.php b/resources/views/admin/shop/index.blade.php new file mode 100644 index 0000000..3c3ad0b --- /dev/null +++ b/resources/views/admin/shop/index.blade.php @@ -0,0 +1,351 @@ +{{-- + 文件功能:后台商店商品管理页面(站长功能) + 支持查看、新增、编辑、上下架切换、删除商品。 + 字段:名称、Slug、图标、描述、价格、类型、有效期、排序、状态 + + @author ChatRoom Laravel + @version 1.0.0 +--}} + +@extends('admin.layouts.app') + +@section('title', '🛒 商店商品管理') + +@section('content') + + @php + $typeLabels = [ + 'instant' => ['label' => '即时特效', 'color' => 'bg-blue-100 text-blue-700'], + 'duration' => ['label' => '周卡/时效', 'color' => 'bg-purple-100 text-purple-700'], + 'one_time' => ['label' => '一次性道具', 'color' => 'bg-yellow-100 text-yellow-700'], + 'ring' => ['label' => '求婚戒指', 'color' => 'bg-rose-100 text-rose-700'], + 'auto_fishing' => ['label' => '自动钓鱼卡', 'color' => 'bg-emerald-100 text-emerald-700'], + ]; + $isSuperAdmin = Auth::id() === 1; + @endphp + +
+ + {{-- 头部操作栏 --}} +
+
+

商店商品列表

+

管理聊天室商店内所有可出售商品,支持上下架控制。

+
+ @if ($isSuperAdmin) + + @endif +
+ + {{-- 商品列表表格 --}} +
+ + + + + + + + + + + + + + @forelse ($items as $item) + @php $tl = $typeLabels[$item->type] ?? ['label' => $item->type, 'color' => 'bg-gray-100 text-gray-600']; @endphp + + {{-- 商品信息 --}} + + {{-- 类型 --}} + + {{-- 价格 --}} + + {{-- 有效期 --}} + + {{-- 排序 --}} + + {{-- 状态 --}} + + {{-- 操作 --}} + + + @empty + + + + @endforelse + +
商品类型价格有效期排序状态操作
+
+ {{ $item->icon }} +
+

{{ $item->name }}

+

{{ $item->slug }}

+ @if ($item->description) +

+ {{ $item->description }}

+ @endif +
+
+
+ + {{ $tl['label'] }} + + + {{ number_format($item->price) }} 金 + + @if ($item->duration_minutes > 0) + {{ $item->duration_minutes >= 60 ? floor($item->duration_minutes / 60) . '小时' : $item->duration_minutes . '分钟' }} + @elseif ($item->duration_days > 0) + {{ $item->duration_days }} 天 + @else + — + @endif + {{ $item->sort_order }} +
+ @csrf @method('PATCH') + +
+
+
+ + @if ($isSuperAdmin) +
+ @csrf @method('DELETE') + +
+ @endif +
+
暂无商品数据
+
+ + {{-- 新增/编辑 抽屉弹窗 --}} +
+
+ + {{-- 弹窗头部 --}} +
+

+ +
+ + {{-- 表单 --}} +
+ @csrf + + + {{-- 基本信息 --}} +
+
+ + +
+
+ + +
+
+ + +
+
+ +
+ + +
+ +
+
+ + +
+
+ + +
+
+ +
+
+ + +
+
+ + +
+
+ + +
+
+ +
+
+ + +
+
+ + +
+
+ +
+ + + +
+ + {{-- 弹窗底部按钮 --}} +
+ + +
+
+
+
+ +
+@endsection diff --git a/routes/web.php b/routes/web.php index fa47e77..8a19cb8 100644 --- a/routes/web.php +++ b/routes/web.php @@ -254,6 +254,13 @@ Route::middleware(['chat.auth', 'chat.has_position'])->prefix('admin')->name('ad Route::put('/vip/{vip}', [\App\Http\Controllers\Admin\VipController::class, 'update'])->name('vip.update'); Route::delete('/vip/{vip}', [\App\Http\Controllers\Admin\VipController::class, 'destroy'])->name('vip.destroy'); + // 🛒 商店商品管理(查看/编辑所有 superlevel 可用,新增/删除仅 id=1) + Route::get('/shop', [\App\Http\Controllers\Admin\ShopItemController::class, 'index'])->name('shop.index'); + Route::post('/shop', [\App\Http\Controllers\Admin\ShopItemController::class, 'store'])->name('shop.store'); + Route::put('/shop/{shopItem}', [\App\Http\Controllers\Admin\ShopItemController::class, 'update'])->name('shop.update'); + Route::patch('/shop/{shopItem}/toggle', [\App\Http\Controllers\Admin\ShopItemController::class, 'toggle'])->name('shop.toggle'); + Route::delete('/shop/{shopItem}', [\App\Http\Controllers\Admin\ShopItemController::class, 'destroy'])->name('shop.destroy'); + // 💒 婚姻管理(superlevel 及以上) Route::prefix('marriages')->name('marriages.')->group(function () { // 总览统计