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', ]); } }