repository = $repository; $this->validator = $validator; } public function index($course_id) { $this->repository->pushCriteria(VideoCriteria::class); $courseVideos = $this->repository->where('course_id', $course_id)->paginate(request('per_page', self::PAGE_NUM)); return Response::success($this->repository->parserResult($courseVideos)); } public function store(Request $request, $course_id) { $this->validate($request, $this->validator->getRules(ValidatorInterface::RULE_CREATE)); try { $data = $request->only(array_keys($this->validator->getRules(ValidatorInterface::RULE_CREATE))); $data['course_id'] = $course_id; $data['admin_id'] = login_admin_id(); $data['slug'] = arr2str(Pinyin::permalink($data['title']), '_'); if (!in_array('published_at', $data) || empty($data['published_at'])) { $data['published_at'] = Carbon::now(); } $courseVideo = $this->repository->create($data); return Response::success($courseVideo); } catch (\Exception $e) { return $this->errorStore($e); } } public function show($course_id, $id) { $courseVideo = $this->repository->where('course_id', $course_id)->find($id); $courseVideo = $this->repository->parserResult($courseVideo); return Response::success($courseVideo); } public function update(Request $request, $id) { $this->validate($request, $this->validator->getRules(ValidatorInterface::RULE_UPDATE)); try { $data = $request->only(array_keys($this->validator->getRules(ValidatorInterface::RULE_UPDATE))); $data['slug'] = arr2str(Pinyin::permalink($data['title']), '_'); if (!in_array('published_at', $data) || empty($data['published_at'])) { $data['published_at'] = Carbon::now(); } $courseVideo = $this->repository->update($data, $id); return Response::success($courseVideo); } catch (\Exception $e) { $this->errorStore($e); } } public function destroy($id) { try { $this->repository->delete($id); return Response::success(null, T('successfully delete.')); } catch (\Exception $exception) { return Response::fail(T('Delete failed.'), ResponseCodeEnum::SERVICE_UPDATE_DATA_ERROR); } } /** * 视频详情(用户) * @param $id * @return \Illuminate\Http\JsonResponse|\Illuminate\Http\Resources\Json\JsonResource * Author: Mead */ public function viewShow($id) { $video = $this->repository->where('status', ModelStatusEnum::OK)->where('published_at', '<', Carbon::now())->find($id); $comments = $video->comments()->with(['user'])->limit(self::PAGE_NUM)->orderByDesc('id')->get(); $attaches = $video->attaches()->with(['path_resource'])->where('status', ModelStatusEnum::OK)->get(['name', 'id', 'path', 'download_times']); $video->view_num++; $video->save(); $user_video_watch_record = UserVideoWatchRecord::query()->firstOrCreate([ 'video_id' => $video->id, 'user_id' => login_admin_id() ], [ 'course_id' => $video->course_id, 'watch_seconds' => 0, 'is_watched' => VideoWatchEnum::NO, 'progress' => 0 ]); $video = $this->repository->parserResult($video); return Response::success(compact('video', 'comments', 'attaches', 'user_video_watch_record')); } public function lookRecord(Request $request) { $this->validate($request, [ 'course_id' => 'required', 'video_id' => 'required', 'watch_seconds' => 'required', 'is_watched' => 'required', ]); $course_id = $request->get('course_id'); $video_id = $request->get('video_id'); $watch_seconds = $request->get('watch_seconds', 10); $is_watched = $request->get('is_watched', VideoWatchEnum::NO); $total_seconds = Video::query()->where('id', $video_id)->value('duration'); $progress = 0; if ($total_seconds > 0) { $progress = bcdiv($watch_seconds, $total_seconds, 2) * 100; } if ($progress >= 98) { $is_watched = VideoWatchEnum::OK; } UserVideoWatchRecord::query()->where('video_id', $video_id)->where('user_id', login_admin_id())->update([ 'is_watched' => $is_watched, 'watch_seconds' => $watch_seconds, 'watched_at' => Carbon::now(), 'progress' => $progress ]); if ($is_watched == VideoWatchEnum::OK) { $video_over_nums = UserVideoWatchRecord::query()->where('course_id', $course_id)->where('is_watched', VideoWatchEnum::OK)->count(); $video_total_nums = Video::query()->where('course_id', $course_id)->count(); $course_progress = bcdiv($video_over_nums, $video_total_nums, 2) * 100; $course_over_status = VideoWatchEnum::NO; if ($course_progress >= 98) { $course_over_status = VideoWatchEnum::OK; } UserRecord::query()->where('course_id', $course_id)->where('user_id', login_admin_id())->update(['progress' => $course_progress, 'is_watched' => $course_over_status, 'watched_at' => Carbon::now()]); } return Response::success(null); } }