map(fn ($item) => [ 'id' => $item->id, 'name' => $item->name, 'slug' => $item->slug, 'description' => $item->description, 'icon' => $item->icon, 'price' => $item->price, 'type' => $item->type, 'duration_days' => $item->duration_days, ]); return response()->json([ 'items' => $items, 'user_jjb' => $user->jjb ?? 0, 'active_week_effect' => $this->shopService->getActiveWeekEffect($user), 'has_rename_card' => $this->shopService->hasRenameCard($user), ]); } /** * 购买商品 * * @param Request $request 含 item_id */ public function buy(Request $request): JsonResponse { $request->validate(['item_id' => 'required|integer|exists:shop_items,id']); $item = ShopItem::find($request->item_id); if (! $item->is_active) { return response()->json(['status' => 'error', 'message' => '该商品已下架。'], 400); } $result = $this->shopService->buyItem(Auth::user(), $item); if (! $result['ok']) { return response()->json(['status' => 'error', 'message' => $result['message']], 400); } $response = ['status' => 'success', 'message' => $result['message']]; // 单次特效卡:告诉前端立即播放哪个特效 if (isset($result['play_effect'])) { $response['play_effect'] = $result['play_effect']; } // 返回最新金币余额 $response['jjb'] = Auth::user()->fresh()->jjb; return response()->json($response); } /** * 使用改名卡修改昵称 * * @param Request $request 含 new_name */ public function rename(Request $request): JsonResponse { $request->validate([ 'new_name' => 'required|string|min:1|max:10', ]); $result = $this->shopService->useRenameCard(Auth::user(), $request->new_name); if (! $result['ok']) { return response()->json(['status' => 'error', 'message' => $result['message']], 400); } return response()->json(['status' => 'success', 'message' => $result['message']]); } }