feat:實作 API 效能優化 — Redis 快取、分頁、DB 索引
- 引入 Redis(predis)快取層:Admin Stats(5分鐘)、課程列表(3分鐘,tag-based 失效)、評價分布(10分鐘) - ReviewController::publicList 改為 paginate + eager load votes,消除 N+1 - AdminReviewController::index 加入分頁(預設 20,最大 100) - 新增 notifications / diving_offers 效能索引 migration - 新增 docker-compose.override.yml 本機開發 port mapping 機制(不進 git) Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -10,23 +10,34 @@ use Illuminate\Support\Facades\DB;
|
||||
|
||||
class AdminReviewController extends Controller
|
||||
{
|
||||
public function index()
|
||||
public function index(Request $request)
|
||||
{
|
||||
$reviews = Review::with(['divingOffer', 'member'])
|
||||
$perPage = min((int) $request->query('per_page', 20), 100);
|
||||
$paginator = Review::with(['divingOffer', 'member'])
|
||||
->orderByDesc('created_at')
|
||||
->get()
|
||||
->map(fn($r) => [
|
||||
'id' => $r->id,
|
||||
'offer_title' => $r->divingOffer?->title,
|
||||
'member_email'=> $r->member?->email,
|
||||
'rating' => $r->rating,
|
||||
'comment' => mb_strimwidth($r->comment, 0, 50, '...'),
|
||||
'is_edited' => $r->is_edited,
|
||||
'helpful_count'=> $r->helpful_count,
|
||||
'created_at' => $r->created_at?->toISOString(),
|
||||
]);
|
||||
->paginate($perPage);
|
||||
|
||||
return response()->json(['status' => true, 'data' => $reviews]);
|
||||
$reviews = $paginator->getCollection()->map(fn($r) => [
|
||||
'id' => $r->id,
|
||||
'offer_title' => $r->divingOffer?->title,
|
||||
'member_email' => $r->member?->email,
|
||||
'rating' => $r->rating,
|
||||
'comment' => mb_strimwidth($r->comment, 0, 50, '...'),
|
||||
'is_edited' => $r->is_edited,
|
||||
'helpful_count'=> $r->helpful_count,
|
||||
'created_at' => $r->created_at?->toISOString(),
|
||||
]);
|
||||
|
||||
return response()->json([
|
||||
'status' => true,
|
||||
'data' => $reviews,
|
||||
'meta' => [
|
||||
'current_page' => $paginator->currentPage(),
|
||||
'last_page' => $paginator->lastPage(),
|
||||
'per_page' => $paginator->perPage(),
|
||||
'total' => $paginator->total(),
|
||||
],
|
||||
]);
|
||||
}
|
||||
|
||||
public function destroy(int $id)
|
||||
|
||||
Reference in New Issue
Block a user