| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906 |
- <?php
- namespace App\Http\Controllers\Api;
- use App\Http\Controllers\Controller;
- use App\Services\MistakeBookService;
- use Illuminate\Http\Request;
- use Illuminate\Http\JsonResponse;
- use Illuminate\Support\Facades\Log;
- class MistakeBookController extends Controller
- {
- protected MistakeBookService $mistakeBookService;
- public function __construct(MistakeBookService $mistakeBookService)
- {
- $this->mistakeBookService = $mistakeBookService;
- }
- /**
- * 获取错题列表
- *
- * @param Request $request
- * @return JsonResponse
- */
- public function listMistakes(Request $request): JsonResponse
- {
- try {
- $params = $request->only([
- 'student_id',
- 'start_time',
- 'end_time',
- 'kp_ids',
- 'skill_ids',
- 'error_types',
- 'time_range',
- 'page',
- 'per_page',
- 'sort_by'
- ]);
- // 设置默认值
- $params['page'] = (int) ($params['page'] ?? 1);
- $params['per_page'] = (int) ($params['per_page'] ?? 20);
- $params['sort_by'] = $params['sort_by'] ?? 'created_at_desc';
- // 调用服务层获取错题列表
- $result = $this->mistakeBookService->listMistakes($params);
- Log::info('获取错题列表成功', [
- 'student_id' => $params['student_id'] ?? 'N/A',
- 'page' => $params['page'],
- 'per_page' => $params['per_page'],
- 'total' => $result['meta']['total'] ?? 0
- ]);
- return response()->json([
- 'success' => true,
- 'data' => $result['data'] ?? [],
- 'meta' => $result['meta'] ?? [],
- 'statistics' => $result['statistics'] ?? null
- ]);
- } catch (\Exception $e) {
- Log::error('获取错题列表失败', [
- 'error' => $e->getMessage(),
- 'trace' => $e->getTraceAsString(),
- 'params' => $request->all()
- ]);
- return response()->json([
- 'success' => false,
- 'message' => '获取错题列表失败: ' . $e->getMessage(),
- 'data' => [],
- 'meta' => [
- 'total' => 0,
- 'page' => (int) ($request->get('page', 1)),
- 'per_page' => (int) ($request->get('per_page', 20))
- ]
- ], 500);
- }
- }
- /**
- * 新增错题
- */
- public function addMistake(Request $request): JsonResponse
- {
- $payload = $request->only([
- 'student_id',
- 'question_id',
- 'my_answer',
- 'correct_answer',
- 'source',
- 'happened_at',
- 'idempotency_key',
- ]);
- if (empty($payload['student_id']) || empty($payload['question_id'])) {
- return response()->json([
- 'success' => false,
- 'message' => '缺少必要参数:student_id, question_id',
- ], 400);
- }
- try {
- $result = $this->mistakeBookService->createMistake($payload);
- return response()->json([
- 'success' => true,
- 'data' => $result,
- 'duplicate' => $result['duplicate'] ?? false,
- ]);
- } catch (\Exception $e) {
- Log::error('新增错题失败', [
- 'error' => $e->getMessage(),
- 'payload' => $payload,
- ]);
- return response()->json([
- 'success' => false,
- 'message' => '新增错题失败: ' . $e->getMessage(),
- ], 500);
- }
- }
- /**
- * 获取单条错题详情
- *
- * @param string $mistakeId
- * @param Request $request
- * @return JsonResponse
- */
- public function getMistakeDetail(string $mistakeId, Request $request): JsonResponse
- {
- try {
- $studentId = $request->get('student_id');
- $mistake = $this->mistakeBookService->getMistakeDetail($mistakeId, $studentId);
- if (empty($mistake)) {
- return response()->json([
- 'success' => false,
- 'message' => '错题记录不存在'
- ], 404);
- }
- Log::info('获取错题详情成功', [
- 'mistake_id' => $mistakeId,
- 'student_id' => $studentId ?? 'N/A'
- ]);
- return response()->json([
- 'success' => true,
- 'data' => $mistake
- ]);
- } catch (\Exception $e) {
- Log::error('获取错题详情失败', [
- 'mistake_id' => $mistakeId,
- 'error' => $e->getMessage(),
- 'trace' => $e->getTraceAsString()
- ]);
- return response()->json([
- 'success' => false,
- 'message' => '获取错题详情失败: ' . $e->getMessage()
- ], 500);
- }
- }
- /**
- * 获取错题统计概要
- *
- * @param Request $request
- * @return JsonResponse
- */
- public function getSummary(Request $request): JsonResponse
- {
- try {
- $studentId = $request->get('student_id');
- if (!$studentId) {
- return response()->json([
- 'success' => false,
- 'message' => '缺少必要参数:student_id'
- ], 400);
- }
- $startTime = $request->get('start_time');
- $endTime = $request->get('end_time');
- // 构建查询参数
- $params = ['student_id' => $studentId];
- if ($startTime) {
- $params['start_time'] = $startTime;
- }
- if ($endTime) {
- $params['end_time'] = $endTime;
- }
- // 获取错题列表(用于计算统计信息)
- $mistakesResult = $this->mistakeBookService->listMistakes($params);
- // 获取概要统计
- $summary = $this->mistakeBookService->summarize($studentId);
- Log::info('获取错题概要统计成功', [
- 'student_id' => $studentId,
- 'total_mistakes' => $summary['total'] ?? 0
- ]);
- return response()->json([
- 'success' => true,
- 'data' => [
- 'total' => $summary['total'] ?? 0,
- 'this_week' => $summary['this_week'] ?? 0,
- 'pending_review' => $summary['pending_review'] ?? 0,
- 'mastery_rate' => $summary['mastery_rate'] ?? 0.0,
- 'statistics' => $mistakesResult['statistics'] ?? null
- ]
- ]);
- } catch (\Exception $e) {
- Log::error('获取错题概要统计失败', [
- 'student_id' => $request->get('student_id'),
- 'error' => $e->getMessage(),
- 'trace' => $e->getTraceAsString()
- ]);
- return response()->json([
- 'success' => false,
- 'message' => '获取错题概要统计失败: ' . $e->getMessage()
- ], 500);
- }
- }
- /**
- * 获取错误模式分析
- *
- * @param Request $request
- * @return JsonResponse
- */
- public function getMistakePatterns(Request $request): JsonResponse
- {
- try {
- $studentId = $request->get('student_id');
- if (!$studentId) {
- return response()->json([
- 'success' => false,
- 'message' => '缺少必要参数:student_id'
- ], 400);
- }
- $patterns = $this->mistakeBookService->getMistakePatterns($studentId);
- Log::info('获取错误模式分析成功', [
- 'student_id' => $studentId,
- 'top_kps_count' => count($patterns['top_kps'] ?? [])
- ]);
- return response()->json([
- 'success' => true,
- 'data' => $patterns
- ]);
- } catch (\Exception $e) {
- Log::error('获取错误模式分析失败', [
- 'student_id' => $request->get('student_id'),
- 'error' => $e->getMessage(),
- 'trace' => $e->getTraceAsString()
- ]);
- return response()->json([
- 'success' => false,
- 'message' => '获取错误模式分析失败: ' . $e->getMessage()
- ], 500);
- }
- }
- /**
- * 收藏/取消收藏错题
- *
- * @param string $mistakeId
- * @param Request $request
- * @return JsonResponse
- */
- public function toggleFavorite(string $mistakeId, Request $request): JsonResponse
- {
- try {
- $data = $request->only(['favorite']);
- $favorite = $data['favorite'] ?? true;
- $result = $this->mistakeBookService->toggleFavorite($mistakeId, $favorite);
- Log::info(($favorite ? '收藏' : '取消收藏') . '错题', [
- 'mistake_id' => $mistakeId,
- 'favorite' => $favorite,
- 'result' => $result
- ]);
- return response()->json([
- 'success' => $result,
- 'message' => $result ? '操作成功' : '操作失败',
- 'data' => [
- 'mistake_id' => $mistakeId,
- 'favorite' => $favorite
- ]
- ]);
- } catch (\Exception $e) {
- Log::error('收藏错题失败', [
- 'mistake_id' => $mistakeId,
- 'error' => $e->getMessage(),
- 'trace' => $e->getTraceAsString()
- ]);
- return response()->json([
- 'success' => false,
- 'message' => '收藏错题失败: ' . $e->getMessage()
- ], 500);
- }
- }
- /**
- * 标记错题已复习
- *
- * @param string $mistakeId
- * @return JsonResponse
- */
- public function markReviewed(string $mistakeId): JsonResponse
- {
- try {
- $result = $this->mistakeBookService->markReviewed($mistakeId);
- Log::info('标记错题已复习', [
- 'mistake_id' => $mistakeId,
- 'result' => $result
- ]);
- return response()->json([
- 'success' => $result,
- 'message' => $result ? '操作成功' : '操作失败',
- 'data' => [
- 'mistake_id' => $mistakeId,
- 'reviewed' => $result,
- 'reviewed_at' => $result ? now()->toISOString() : null
- ]
- ]);
- } catch (\Exception $e) {
- Log::error('标记错题已复习失败', [
- 'mistake_id' => $mistakeId,
- 'error' => $e->getMessage(),
- 'trace' => $e->getTraceAsString()
- ]);
- return response()->json([
- 'success' => false,
- 'message' => '标记错题已复习失败: ' . $e->getMessage()
- ], 500);
- }
- }
- /**
- * 加入重练清单
- *
- * @param string $mistakeId
- * @return JsonResponse
- */
- public function addToRetryList(string $mistakeId): JsonResponse
- {
- try {
- $result = $this->mistakeBookService->addToRetryList($mistakeId);
- Log::info('加入重练清单', [
- 'mistake_id' => $mistakeId,
- 'result' => $result
- ]);
- return response()->json([
- 'success' => $result,
- 'message' => $result ? '操作成功' : '操作失败',
- 'data' => [
- 'mistake_id' => $mistakeId,
- 'added' => $result
- ]
- ]);
- } catch (\Exception $e) {
- Log::error('加入重练清单失败', [
- 'mistake_id' => $mistakeId,
- 'error' => $e->getMessage(),
- 'trace' => $e->getTraceAsString()
- ]);
- return response()->json([
- 'success' => false,
- 'message' => '加入重练清单失败: ' . $e->getMessage()
- ], 500);
- }
- }
- /**
- * 获取题目正确率
- *
- * @param string $questionId
- * @return JsonResponse
- */
- public function getQuestionAccuracy(string $questionId): JsonResponse
- {
- try {
- $accuracy = $this->mistakeBookService->getQuestionAccuracy($questionId);
- Log::info('获取题目正确率成功', [
- 'question_id' => $questionId,
- 'accuracy' => $accuracy
- ]);
- return response()->json([
- 'success' => true,
- 'data' => [
- 'question_id' => $questionId,
- 'accuracy' => $accuracy,
- 'correct_attempts' => null // LearningAnalytics不返回具体次数
- ]
- ]);
- } catch (\Exception $e) {
- Log::error('获取题目正确率失败', [
- 'question_id' => $questionId,
- 'error' => $e->getMessage(),
- 'trace' => $e->getTraceAsString()
- ]);
- return response()->json([
- 'success' => false,
- 'message' => '获取题目正确率失败: ' . $e->getMessage()
- ], 500);
- }
- }
- /**
- * 推荐练习题
- *
- * @param Request $request
- * @return JsonResponse
- */
- public function recommendPractice(Request $request): JsonResponse
- {
- try {
- $studentId = $request->get('student_id');
- $kpIds = $request->get('kp_ids', []);
- $skillIds = $request->get('skill_ids', []);
- if (!$studentId) {
- return response()->json([
- 'success' => false,
- 'message' => '缺少必要参数:student_id'
- ], 400);
- }
- $recommendations = $this->mistakeBookService->recommendPractice(
- $studentId,
- $kpIds,
- $skillIds
- );
- Log::info('获取推荐练习题成功', [
- 'student_id' => $studentId,
- 'kp_ids' => $kpIds,
- 'recommendations_count' => count($recommendations['data'] ?? [])
- ]);
- return response()->json([
- 'success' => true,
- 'data' => $recommendations['data'] ?? []
- ]);
- } catch (\Exception $e) {
- Log::error('获取推荐练习题失败', [
- 'student_id' => $request->get('student_id'),
- 'error' => $e->getMessage(),
- 'trace' => $e->getTraceAsString()
- ]);
- return response()->json([
- 'success' => false,
- 'message' => '获取推荐练习题失败: ' . $e->getMessage()
- ], 500);
- }
- }
- /**
- * 获取错题本快照数据(用于仪表板)
- *
- * @param Request $request
- * @return JsonResponse
- */
- public function getSnapshot(Request $request): JsonResponse
- {
- try {
- $studentId = $request->get('student_id');
- $limit = (int) ($request->get('limit', 5));
- if (!$studentId) {
- return response()->json([
- 'success' => false,
- 'message' => '缺少必要参数:student_id'
- ], 400);
- }
- $snapshot = $this->mistakeBookService->getPanelSnapshot($studentId, $limit);
- Log::info('获取错题本快照数据成功', [
- 'student_id' => $studentId,
- 'limit' => $limit,
- 'recent_count' => count($snapshot['recent'] ?? [])
- ]);
- return response()->json([
- 'success' => true,
- 'data' => $snapshot
- ]);
- } catch (\Exception $e) {
- Log::error('获取错题本快照数据失败', [
- 'student_id' => $request->get('student_id'),
- 'error' => $e->getMessage(),
- 'trace' => $e->getTraceAsString()
- ]);
- return response()->json([
- 'success' => false,
- 'message' => '获取错题本快照数据失败: ' . $e->getMessage()
- ], 500);
- }
- }
- /**
- * 修改错题复习状态
- */
- public function updateReviewStatus(Request $request, string $mistakeId): JsonResponse
- {
- try {
- $validated = $request->validate([
- 'action' => 'required|in:increment,reset,mastered',
- 'force_review' => 'boolean',
- ]);
- $action = $validated['action'];
- $forceReview = $validated['force_review'] ?? false;
- $result = $this->mistakeBookService->updateReviewStatus($mistakeId, $action, $forceReview);
- if ($result['success'] ?? false) {
- return response()->json([
- 'success' => true,
- 'data' => $result,
- 'message' => $result['message'] ?? '复习状态更新成功',
- ]);
- }
- return response()->json([
- 'success' => false,
- 'message' => $result['error'] ?? '更新复习状态失败',
- ], 400);
- } catch (\Throwable $e) {
- Log::error('Update review status error', [
- 'mistake_id' => $mistakeId,
- 'error' => $e->getMessage(),
- ]);
- return response()->json([
- 'success' => false,
- 'message' => '更新复习状态失败',
- 'error' => $e->getMessage(),
- ], 500);
- }
- }
- /**
- * 获取错题复习状态
- */
- public function getReviewStatus(string $mistakeId): JsonResponse
- {
- try {
- $result = $this->mistakeBookService->getReviewStatus($mistakeId);
- if ($result['success'] ?? false) {
- return response()->json([
- 'success' => true,
- 'data' => $result,
- ]);
- }
- return response()->json([
- 'success' => false,
- 'message' => $result['error'] ?? '获取复习状态失败',
- ], 400);
- } catch (\Throwable $e) {
- Log::error('Get review status error', [
- 'mistake_id' => $mistakeId,
- 'error' => $e->getMessage(),
- ]);
- return response()->json([
- 'success' => false,
- 'message' => '获取复习状态失败',
- 'error' => $e->getMessage(),
- ], 500);
- }
- }
- /**
- * 增加复习次数
- */
- public function incrementReview(Request $request, string $mistakeId): JsonResponse
- {
- try {
- $validated = $request->validate([
- 'force_review' => 'boolean',
- ]);
- $forceReview = $validated['force_review'] ?? false;
- $result = $this->mistakeBookService->incrementReviewCount($mistakeId, $forceReview);
- if ($result['success'] ?? false) {
- return response()->json([
- 'success' => true,
- 'data' => $result,
- 'message' => $result['message'] ?? '复习次数增加成功',
- ]);
- }
- return response()->json([
- 'success' => false,
- 'message' => $result['error'] ?? '增加复习次数失败',
- ], 400);
- } catch (\Throwable $e) {
- Log::error('Increment review count error', [
- 'mistake_id' => $mistakeId,
- 'error' => $e->getMessage(),
- ]);
- return response()->json([
- 'success' => false,
- 'message' => '增加复习次数失败',
- 'error' => $e->getMessage(),
- ], 500);
- }
- }
- /**
- * 重置为强制复习状态
- */
- public function resetReview(string $mistakeId): JsonResponse
- {
- try {
- $result = $this->mistakeBookService->resetReviewStatus($mistakeId);
- if ($result['success'] ?? false) {
- return response()->json([
- 'success' => true,
- 'data' => $result,
- 'message' => $result['message'] ?? '复习状态重置成功',
- ]);
- }
- return response()->json([
- 'success' => false,
- 'message' => $result['error'] ?? '重置复习状态失败',
- ], 400);
- } catch (\Throwable $e) {
- Log::error('Reset review status error', [
- 'mistake_id' => $mistakeId,
- 'error' => $e->getMessage(),
- ]);
- return response()->json([
- 'success' => false,
- 'message' => '重置复习状态失败',
- 'error' => $e->getMessage(),
- ], 500);
- }
- }
- /**
- * 批量操作错题
- */
- public function batchOperation(Request $request): JsonResponse
- {
- try {
- $validated = $request->validate([
- 'mistake_ids' => 'required|array|min:1',
- 'mistake_ids.*' => 'string',
- 'operation' => 'required|string|in:favorite,reviewed,mastered,retry_list,remove_retry_list,set_error_type,set_importance',
- 'params' => 'array',
- ]);
- $mistakeIds = $validated['mistake_ids'];
- $operation = $validated['operation'];
- $params = $validated['params'] ?? [];
- $result = $this->mistakeBookService->batchOperation($mistakeIds, $operation, $params);
- if ($result['success'] ?? false) {
- return response()->json([
- 'success' => true,
- 'data' => $result,
- 'message' => "批量操作成功,成功处理 {$result['success_count']} 条记录",
- ]);
- }
- return response()->json([
- 'success' => false,
- 'message' => $result['error'] ?? '批量操作失败',
- ], 400);
- } catch (\Throwable $e) {
- Log::error('Batch operation error', [
- 'error' => $e->getMessage(),
- 'request' => $request->all(),
- ]);
- return response()->json([
- 'success' => false,
- 'message' => '批量操作失败',
- 'error' => $e->getMessage(),
- ], 500);
- }
- }
- /**
- * 批量标记为已复习
- */
- public function batchMarkReviewed(Request $request): JsonResponse
- {
- $validated = $request->validate([
- 'mistake_ids' => 'required|array|min:1',
- 'mistake_ids.*' => 'string',
- ]);
- $result = $this->mistakeBookService->batchOperation(
- $validated['mistake_ids'],
- 'reviewed'
- );
- return response()->json([
- 'success' => $result['success'] ?? false,
- 'data' => $result,
- 'message' => $result['success'] ?? false
- ? "已标记 {$result['success_count']} 道题为已复习"
- : ($result['error'] ?? '操作失败'),
- ]);
- }
- /**
- * 批量标记为已掌握
- */
- public function batchMarkMastered(Request $request): JsonResponse
- {
- $validated = $request->validate([
- 'mistake_ids' => 'required|array|min:1',
- 'mistake_ids.*' => 'string',
- ]);
- $result = $this->mistakeBookService->batchOperation(
- $validated['mistake_ids'],
- 'mastered'
- );
- return response()->json([
- 'success' => $result['success'] ?? false,
- 'data' => $result,
- 'message' => $result['success'] ?? false
- ? "已标记 {$result['success_count']} 道题为已掌握"
- : ($result['error'] ?? '操作失败'),
- ]);
- }
- /**
- * 批量加入重练清单
- */
- public function batchAddToRetryList(Request $request): JsonResponse
- {
- $validated = $request->validate([
- 'mistake_ids' => 'required|array|min:1',
- 'mistake_ids.*' => 'string',
- ]);
- $result = $this->mistakeBookService->batchOperation(
- $validated['mistake_ids'],
- 'retry_list'
- );
- return response()->json([
- 'success' => $result['success'] ?? false,
- 'data' => $result,
- 'message' => $result['success'] ?? false
- ? "已加入 {$result['success_count']} 道题到重练清单"
- : ($result['error'] ?? '操作失败'),
- ]);
- }
- /**
- * 批量从重练清单移除
- */
- public function batchRemoveFromRetryList(Request $request): JsonResponse
- {
- $validated = $request->validate([
- 'mistake_ids' => 'required|array|min:1',
- 'mistake_ids.*' => 'string',
- ]);
- $result = $this->mistakeBookService->batchOperation(
- $validated['mistake_ids'],
- 'remove_retry_list'
- );
- return response()->json([
- 'success' => $result['success'] ?? false,
- 'data' => $result,
- 'message' => $result['success'] ?? false
- ? "已从重练清单移除 {$result['success_count']} 道题"
- : ($result['error'] ?? '操作失败'),
- ]);
- }
- /**
- * 批量设置错误类型
- */
- public function batchSetErrorType(Request $request): JsonResponse
- {
- $validated = $request->validate([
- 'mistake_ids' => 'required|array|min:1',
- 'mistake_ids.*' => 'string',
- 'error_type' => 'required|string|in:concept,calculation,careless,logic,other',
- ]);
- $result = $this->mistakeBookService->batchOperation(
- $validated['mistake_ids'],
- 'set_error_type',
- ['error_type' => $validated['error_type']]
- );
- return response()->json([
- 'success' => $result['success'] ?? false,
- 'data' => $result,
- 'message' => $result['success'] ?? false
- ? "已为 {$result['success_count']} 道题设置错误类型"
- : ($result['error'] ?? '操作失败'),
- ]);
- }
- /**
- * 批量设置重要程度
- */
- public function batchSetImportance(Request $request): JsonResponse
- {
- $validated = $request->validate([
- 'mistake_ids' => 'required|array|min:1',
- 'mistake_ids.*' => 'string',
- 'importance' => 'required|integer|min:1|max:10',
- ]);
- $result = $this->mistakeBookService->batchOperation(
- $validated['mistake_ids'],
- 'set_importance',
- ['importance' => $validated['importance']]
- );
- return response()->json([
- 'success' => $result['success'] ?? false,
- 'data' => $result,
- 'message' => $result['success'] ?? false
- ? "已为 {$result['success_count']} 道题设置重要程度"
- : ($result['error'] ?? '操作失败'),
- ]);
- }
- /**
- * 批量切换收藏状态
- */
- public function batchToggleFavorite(Request $request): JsonResponse
- {
- $validated = $request->validate([
- 'mistake_ids' => 'required|array|min:1',
- 'mistake_ids.*' => 'string',
- ]);
- $result = $this->mistakeBookService->batchOperation(
- $validated['mistake_ids'],
- 'favorite'
- );
- return response()->json([
- 'success' => $result['success'] ?? false,
- 'data' => $result,
- 'message' => $result['success'] ?? false
- ? "已为 {$result['success_count']} 道题切换收藏状态"
- : ($result['error'] ?? '操作失败'),
- ]);
- }
- }
|