Эх сурвалжийг харах

【Add】课后评测数据

liuxiangxin 3 сар өмнө
parent
commit
3565640003
48 өөрчлөгдсөн 2034 нэмэгдсэн , 92 устгасан
  1. 2 2
      app/Http/Controllers/Admin/VideoAnswer.php
  2. 15 7
      app/Http/Controllers/Admin/VideoCourse.php
  3. 126 0
      app/Http/Controllers/Admin/VideoCourseType.php
  4. 68 0
      app/Http/Controllers/Admin/VideoExamAnswer.php
  5. 8 16
      app/Http/Controllers/Admin/VideoExamQuestion.php
  6. 64 0
      app/Http/Controllers/Admin/VideoExamRecord.php
  7. 68 0
      app/Http/Controllers/Admin/VideoLearnAnswer.php
  8. 8 8
      app/Http/Controllers/Admin/VideoLearnQuestion.php
  9. 65 0
      app/Http/Controllers/Admin/VideoLearnRecord.php
  10. 128 0
      app/Http/Controllers/Api/Video/Course.php
  11. 46 0
      app/Http/Controllers/Api/Video/ExamAnswer.php
  12. 59 0
      app/Http/Controllers/Api/Video/ExamQuestion.php
  13. 160 0
      app/Http/Controllers/Api/Video/ExamRecord.php
  14. 132 0
      app/Http/Controllers/Api/Video/LearnAnswer.php
  15. 48 0
      app/Http/Controllers/Api/Video/LearnQuestion.php
  16. 76 0
      app/Http/Controllers/Api/Video/LearnRecord.php
  17. 0 1
      app/Http/Requests/Admin/Video/Course.php
  18. 53 0
      app/Http/Requests/Admin/Video/CourseType.php
  19. 1 1
      app/Http/Requests/Admin/Video/ExamQuestion.php
  20. 1 1
      app/Http/Requests/Admin/Video/LearnQuestion.php
  21. 6 0
      app/Models/Traits/Score/BuyType.php
  22. 7 9
      app/Models/Video/Answer.php
  23. 99 0
      app/Models/Video/CourseType.php
  24. 53 0
      app/Models/Video/ExamAnswer.php
  25. 6 6
      app/Models/Video/ExamQuestion.php
  26. 53 0
      app/Models/Video/ExamRecord.php
  27. 53 0
      app/Models/Video/LearnAnswer.php
  28. 26 6
      app/Models/Video/LearnQuestion.php
  29. 53 0
      app/Models/Video/LearnRecord.php
  30. 1 1
      app/Models/Video/Question.php
  31. 9 1
      resources/views/admin/video_course/add.blade.php
  32. 9 1
      resources/views/admin/video_course/edit.blade.php
  33. 17 5
      resources/views/admin/video_course/index.blade.php
  34. 16 0
      resources/views/admin/video_course_type/add.blade.php
  35. 17 0
      resources/views/admin/video_course_type/edit.blade.php
  36. 71 0
      resources/views/admin/video_course_type/index.blade.php
  37. 84 0
      resources/views/admin/video_exam_answer/index.blade.php
  38. 0 0
      resources/views/admin/video_exam_question/add.blade.php
  39. 0 0
      resources/views/admin/video_exam_question/edit.blade.php
  40. 8 10
      resources/views/admin/video_exam_question/index.blade.php
  41. 78 0
      resources/views/admin/video_exam_record/index.blade.php
  42. 84 0
      resources/views/admin/video_learn_answer/index.blade.php
  43. 0 0
      resources/views/admin/video_learn_question/add.blade.php
  44. 0 0
      resources/views/admin/video_learn_question/edit.blade.php
  45. 10 8
      resources/views/admin/video_learn_question/index.blade.php
  46. 80 0
      resources/views/admin/video_learn_record/index.blade.php
  47. 34 1
      routes/api.php
  48. 32 8
      routes/web.php

+ 2 - 2
app/Http/Controllers/Admin/VideoAnswer.php

@@ -142,11 +142,11 @@ class VideoAnswer extends Auth{
 		// 执行修改
 		$result			= $Model->query()->where([['question_id','=',$oldData['question_id']]])->update(['is_answer'=>0]);
 		// 执行修改
-		$result			= $Model->edit($id,['is_answer'=>$status]);
+		$result			= $Model->edit($id,['is_answer'=>$status,'question_id'=>$oldData['question_id']]);
 		// 提示新增失败
 		if( !$result )	return json_send(['code'=>'error','msg'=>'设置失败']);
 		// 记录行为
-		$this->addAdminHistory(admin('uid'),$Model->getTable(),$id,2,$oldData,['status'=>$status]);
+		$this->addAdminHistory(admin('uid'),$Model->getTable(),$id,2,$oldData,['is_answer'=>$status]);
 		// 告知结果
 		return 			json_send(['code'=>'success','msg'=>'设置成功','path'=>'']);
 	}

+ 15 - 7
app/Http/Controllers/Admin/VideoCourse.php

@@ -3,7 +3,7 @@
 use App\Facades\Servers\Aliyun\Oss;
 use App\Http\Requests\Admin\Video\Course as Request;
 use App\Models\Video\Course as Model;
-
+use App\Models\Video\CourseType;
 /**
  * 课程管理
  *
@@ -22,8 +22,7 @@ class VideoCourse extends Auth{
 	 * 首页列表
 	 * 
 	 * */
-    public function index(Model $Model){
-		
+    public function index(Model $Model,CourseType $CourseType){
 		// 接受参数
 		$name					= request('name','');
 		$status					= request('status');
@@ -40,8 +39,10 @@ class VideoCourse extends Auth{
 		$list					= $Model->query()->where($map)->orderByDesc('id')->paginate(request('limit',config('page_num',10)))->appends(request()->all());
 		// 循环处理数据
 		foreach ($list as $key => $value) {
+			// 类型名称
+			$value['type_name'] = $CourseType->getOne($value['type_id'],'name');
 			// 重组
-			$list[$key]				= $value;
+			$list[$key]			= $value;
 		}
 		// 分配数据
 		$this->assign('empty', '<tr><td colspan="20">~~暂无数据</td></tr>');
@@ -54,7 +55,7 @@ class VideoCourse extends Auth{
 	 * 添加
 	 * 
 	 * */
-	public function add( Request $request, Model $Model){
+	public function add( Request $request, Model $Model,CourseType $CourseType){
 		if( request()->isMethod('post') ){
 			// 验证参数
 			$request->scene('add')->validate();
@@ -65,6 +66,7 @@ class VideoCourse extends Auth{
 			$data['content']		= request('content','');
 			$data['start_time']		= request('start_time','');
 			$data['end_time']		= request('end_time','');
+			$data['type_id']		= request('type_id',0);
 			$data['start_time']		= $data['start_time'] ? strtotime($data['start_time']) : 0;
 			$data['end_time']		= $data['end_time'] ? strtotime($data['end_time']) : 0;
 			$data['status']			= 1;
@@ -77,8 +79,11 @@ class VideoCourse extends Auth{
 			// 告知结果
 			return					json_send(['code'=>'success','msg'=>'新增成功','action'=>'add']);
 		}
+		// 获取类型列表
+		$typeList					= $CourseType->getList();
 		// 分配数据
 		$this->assign('crumbs','新增');
+		$this->assign('typeList',$typeList);
 		// 加载模板
 		return 						$this->fetch();
 	}
@@ -87,7 +92,7 @@ class VideoCourse extends Auth{
 	 * 编辑
 	 * 
 	 * */
-	public function edit( Request $request, Model $Model){
+	public function edit( Request $request, Model $Model,CourseType $CourseType){
 		// 接收参数
 		$id							= request('id',0);
 		// 查询数据
@@ -104,9 +109,9 @@ class VideoCourse extends Auth{
 			$data['content']		= request('content','');
 			$data['start_time']		= request('start_time','');
 			$data['end_time']		= request('end_time','');
+			$data['type_id']		= request('type_id',0);
 			$data['start_time']		= $data['start_time'] ? strtotime($data['start_time']) : 0;
 			$data['end_time']		= $data['end_time'] ? strtotime($data['end_time']) : 0;
-			$data['status']			= 1;
 			// 写入
 			$result					= $Model->edit($id,$data);
 			// 提示新增失败
@@ -120,7 +125,10 @@ class VideoCourse extends Auth{
 		}
 		// 如果是没有数据
 		if( !$oldData ) 			return $this->error('查无数据');
+		// 获取类型列表
+		$typeList					= $CourseType->getList();
 		// 分配数据
+		$this->assign('typeList',$typeList);
 		$this->assign('oldData',$oldData);
 		$this->assign('crumbs','修改');
 		// 加载模板

+ 126 - 0
app/Http/Controllers/Admin/VideoCourseType.php

@@ -0,0 +1,126 @@
+<?php namespace App\Http\Controllers\Admin;
+
+use App\Http\Requests\Admin\Video\CourseType as Request;
+use App\Models\Video\CourseType as Model;
+
+/**
+ * 课程管理
+ *
+ * @author    huanglei
+ *
+ */
+class VideoCourseType extends Auth{
+	
+	protected function _initialize(){
+		parent::_initialize();
+		$this->assign('breadcrumb1','课程管理');
+		$this->assign('breadcrumb2','课程类型');
+	}
+
+	/**
+	 * 首页列表
+	 * 
+	 * */
+    public function index(Model $Model){
+		
+		// 接受参数
+		$name					= request('name','');
+		// 查询条件
+		$map 					= [];
+		// 编码ID
+		if( $name )				$map[] = ['name','LIKE','%'.$name.'%'];
+		// 查询数据
+		$list					= $Model->query()->where($map)->orderByDesc('id')->paginate(request('limit',config('page_num',10)))->appends(request()->all());
+		// 循环处理数据
+		foreach ($list as $key => $value) {
+			// 重组
+			$list[$key]				= $value;
+		}
+		// 分配数据
+		$this->assign('empty', '<tr><td colspan="20">~~暂无数据</td></tr>');
+		$this->assign('list', $list);
+		// 加载模板
+		return					$this->fetch();
+    }
+
+	/**
+	 * 添加
+	 * 
+	 * */
+	public function add( Request $request, Model $Model){
+		if( request()->isMethod('post') ){
+			// 验证参数
+			$request->scene('add')->validate();
+			// 组合数据
+			$data['name']			= request('name','');
+			// 写入
+			$id						= $Model->add($data);
+			// 提示新增失败
+			if( !$id )				return json_send(['code'=>'error','msg'=>'新增失败']);
+			// 记录行为
+			$this->addAdminHistory(admin('uid'),$Model->getTable(),$id,1,[],$data);
+			// 告知结果
+			return					json_send(['code'=>'success','msg'=>'新增成功','action'=>'add']);
+		}
+		// 分配数据
+		$this->assign('crumbs','新增');
+		// 加载模板
+		return 						$this->fetch();
+	}
+	
+	/**
+	 * 编辑
+	 * 
+	 * */
+	public function edit( Request $request, Model $Model){
+		// 接收参数
+		$id							= request('id',0);
+		// 查询数据
+		$oldData					= $Model->where(['id'=>$id])->first();
+		$oldData					= $oldData ? $oldData->toArray() : [];
+		// 修改
+		if(request()->isMethod('post')){
+			// 验证参数
+			$request->scene('edit')->validate();
+			// 组合数据
+			$data['name']			= request('name','');
+			// 写入
+			$result					= $Model->edit($id,$data);
+			// 提示新增失败
+			if( !$result )			return json_send(['code'=>'error','msg'=>'修改失败']);
+			// 删除结果
+			unset($oldData['content']);
+			// 记录行为
+			$this->addAdminHistory(admin('uid'),$Model->getTable(),$id,2,$oldData,$data);
+			// 告知结果
+			return					json_send(['code'=>'success','msg'=>'修改成功','action'=>'edit']);
+		}
+		// 如果是没有数据
+		if( !$oldData ) 			return $this->error('查无数据');
+		// 分配数据
+		$this->assign('oldData',$oldData);
+		$this->assign('crumbs','修改');
+		// 加载模板
+		return 						$this->fetch();
+	}
+
+	/**
+	 * 状态
+	 * 
+	 * */
+	public function set_status( Request $request, Model $Model){
+		// 验证参数
+		
+		$request->scene('set_status')->validate();
+		// 接收参数
+		$id				= request('id',0);
+		$status			= request('status',0);
+		// 查询数据
+		$result			= $Model->edit($id,['status'=>$status]);
+		// 提示新增失败
+		if( !$result )	return json_send(['code'=>'error','msg'=>'设置失败']);
+		// 告知结果
+		return			json_send(['code'=>'success','msg'=>'设置成功','path'=>'']);
+	}
+
+}

+ 68 - 0
app/Http/Controllers/Admin/VideoExamAnswer.php

@@ -0,0 +1,68 @@
+<?php namespace App\Http\Controllers\Admin;
+
+use App\Models\Custom;
+use App\Models\Video\ExamAnswer as Model;
+use App\Models\Video\Course as VideoCourse;
+use App\Models\Video\Answer as VideoAnswer;
+use App\Models\Video\Question as VideoQuestion;
+
+/**
+ * 学习记录
+ *
+ * @author    刘相欣
+ *
+ */
+class VideoExamAnswer extends Auth{
+	
+	protected function _initialize(){
+		parent::_initialize();
+		$this->assign('breadcrumb1','课后评测');
+		$this->assign('breadcrumb2','答题记录');
+	}
+
+	/**
+	 * 列表页
+	 * 
+	 * */
+    public function index(Model $Model,VideoCourse $VideoCourse,Custom $Custom,VideoQuestion $VideoQuestion,VideoAnswer $VideoAnswer){
+		// 接收参数
+		$recordId					= request('record_id',0);
+		$courseId					= request('course_id',0);
+		$customCode					= request('custom_code','');
+		$customName					= request('custom_name','');
+		// 转码
+		$customCode					= $Custom->codeToId($customCode);
+		// 查询条件
+		$map 						= [];
+		// 组合条件
+		if( $courseId )				$map[] = ['video_course.id','=',$courseId];
+		if( $recordId )				$map[] = ['video_exam_answer.record_id','=',$recordId];
+		if( $customCode )			$map[] = ['custom.uid','=',$customCode];
+		if( $customName )			$map[] = ['custom.username','LIKE','%'.$customName.'%'];
+		// 查询数据
+		$list						= $Model->query()
+									->join('video_course','video_course.id','=','video_exam_answer.course_id')
+									->join('custom','custom.uid','=','video_exam_answer.custom_uid')
+									->where($map)->select(['video_exam_answer.*','video_course.name as course_name','custom.username as custom_name'])
+									->orderByDesc('id')->paginate(config('page_num',10));
+		// 循环处理数据
+		foreach ($list as $key => $value) {
+			// 时间
+			$value['custom_code']	= $Custom->idToCode($value['custom_uid']);
+			$value['question_title']= $VideoQuestion->getOne($value['question_id'],'title');
+			$value['answer_list'] 	= $VideoAnswer->getListByQuestion($value['question_id']);
+			$value['answer_list'] 	= array_values($value['answer_list']);
+			// 重组
+			$list[$key]				= $value;
+		}
+		// 查询数据
+		$courseList 				= $VideoCourse->query()->orderByDesc('id')->get(['id','name']);
+		// 分配数据
+		$this->assign('list',$list);
+		$this->assign('courseList',$courseList);
+		$this->assign('empty', '<tr><td colspan="20">~~暂无数据</td></tr>');
+		// 加载模板
+		return 						$this->fetch();
+    }
+
+}

+ 8 - 16
app/Http/Controllers/Admin/VideoCourseQuestion.php → app/Http/Controllers/Admin/VideoExamQuestion.php

@@ -1,7 +1,7 @@
 <?php namespace App\Http\Controllers\Admin;
 
-use App\Http\Requests\Admin\Video\CourseQuestion as Request;
-use App\Models\Video\CourseQuestion as Model;
+use App\Http\Requests\Admin\Video\ExamQuestion as Request;
+use App\Models\Video\ExamQuestion as Model;
 use App\Models\Video\Course as VideoCourse;
 use App\Models\Video\Question as VideoQuestion;
 
@@ -12,7 +12,7 @@ use App\Models\Video\Question as VideoQuestion;
  * @author    刘相欣
  *
  */
-class VideoCourseQuestion extends Auth{
+class VideoExamQuestion extends Auth{
 	
 	protected function _initialize(){
 		parent::_initialize();
@@ -35,10 +35,10 @@ class VideoCourseQuestion extends Auth{
 		if( $questionId )		$map[] = ['video_question.id','=',$questionId];
 		// 查询数据
 		$list					= $Model->query()
-									->join('video_course','video_course.id','=','video_course_question.course_id')
-									->join('video_question','video_question.id','=','video_course_question.question_id')
-									->where($map)->select(['video_course_question.*','video_course.name as course_name','video_question.title as question_title'])
-									->orderBy('video_course_question.id')->paginate(config('page_num',10));
+									->join('video_course','video_course.id','=','video_exam_question.course_id')
+									->join('video_question','video_question.id','=','video_exam_question.question_id')
+									->where($map)->select(['video_exam_question.*','video_course.name as course_name','video_question.title as question_title'])
+									->orderBy('video_exam_question.id')->paginate(config('page_num',10));
 		// 循环处理数据
 		foreach ($list as $key => $value) {
 			// 重组
@@ -73,10 +73,6 @@ class VideoCourseQuestion extends Auth{
 			$unique					= $Model->where(['course_id'=>$data['course_id'],'question_id'=>$data['question_id']])->first();
 			// 如果存在
 			if( $unique )			return json_send(['code'=>'error','msg'=>'习题已存在']);
-			// 查询
-			$unique					= $Model->where(['course_id'=>$data['course_id'],['play_time','=',$data['play_time']]])->first();
-			// 如果存在
-			if( $unique )			return json_send(['code'=>'error','msg'=>'该时间已设置问题']);
 			// 写入数据表
 			$id						= $Model->add($data);
 			// 如果操作失败
@@ -118,10 +114,6 @@ class VideoCourseQuestion extends Auth{
 			$unique					= $Model->where([['course_id','=',$data['course_id']],['question_id','=',$data['question_id']],['id','<>',$id]])->first();
 			// 如果存在
 			if( $unique )			return json_send(['code'=>'error','msg'=>'习题已存在']);
-			// 查询
-			$unique					= $Model->where(['course_id'=>$data['course_id'],['play_time','=',$data['play_time']],['id','<>',$id]])->first();
-			// 如果存在
-			if( $unique )			return json_send(['code'=>'error','msg'=>'该时间已设置问题']);
 			// 写入数据表
 			$result					= $Model->edit($id,$data);
 			// 如果操作失败
@@ -160,7 +152,7 @@ class VideoCourseQuestion extends Auth{
 		// 如果用户不存在
 		if( !$oldData )	return json_send(['code'=>'error','msg'=>'数据不存在']);
 		// 执行修改
-		$result			= $Model->edit($id,['status'=>$status]);
+		$result			= $Model->edit($id,['status'=>$status,'course_id'=>$oldData['course_id']]);
 		// 提示新增失败
 		if( !$result )	return json_send(['code'=>'error','msg'=>'设置失败']);
 		// 记录行为

+ 64 - 0
app/Http/Controllers/Admin/VideoExamRecord.php

@@ -0,0 +1,64 @@
+<?php namespace App\Http\Controllers\Admin;
+
+use App\Models\Custom;
+use App\Models\Video\ExamRecord as Model;
+use App\Models\Video\Course as VideoCourse;
+
+
+/**
+ * 测评记录
+ *
+ * @author    刘相欣
+ *
+ */
+class VideoExamRecord extends Auth{
+	
+	protected function _initialize(){
+		parent::_initialize();
+		$this->assign('breadcrumb1','课程关联');
+		$this->assign('breadcrumb2','测评记录');
+	}
+
+	/**
+	 * 列表页
+	 * 
+	 * */
+    public function index(Model $Model,VideoCourse $VideoCourse,Custom $Custom){
+		// 接收参数
+		$courseId				= request('course_id',0);
+		$customCode				= request('custom_code','');
+		$customName				= request('custom_name','');
+		// 转码
+		$customCode				= $Custom->codeToId($customCode);
+		// 查询条件
+		$map 					= [];
+		// 组合条件
+		if( $courseId )			$map[] = ['video_course.id','=',$courseId];
+		if( $customCode )		$map[] = ['custom.uid','=',$customCode];
+		if( $customName )		$map[] = ['custom.username','LIKE','%'.$customName.'%'];
+		// 查询数据
+		$list					= $Model->query()
+									->join('video_course','video_course.id','=','video_exam_record.course_id')
+									->join('custom','custom.uid','=','video_exam_record.custom_uid')
+									->where($map)->select(['video_exam_record.*','video_course.name as course_name','custom.username as custom_name'])
+									->orderByDesc('id')->paginate(config('page_num',10));
+		// 循环处理数据
+		foreach ($list as $key => $value) {
+			// 时间
+			$value['custom_code']	 = $Custom->idToCode($value['custom_uid']);
+			$value['right_ratio']	 = $value['question_total'] ? number_format(($value['isanswer_total'] / $value['question_total'])*100 ,2) : 0;
+			$value['exam_time'] 	 = str_pad((floor($value['exam_time'] / 60)),2, '0', STR_PAD_LEFT) .':'. str_pad(($value['exam_time'] % 60),2, '0', STR_PAD_LEFT);
+			// 重组
+			$list[$key]			= $value;
+		}
+		// 查询数据
+		$courseList 			= $VideoCourse->query()->orderByDesc('id')->get(['id','name']);
+		// 分配数据
+		$this->assign('list',$list);
+		$this->assign('courseList',$courseList);
+		$this->assign('empty', '<tr><td colspan="20">~~暂无数据</td></tr>');
+		// 加载模板
+		return 					$this->fetch();
+    }
+
+}

+ 68 - 0
app/Http/Controllers/Admin/VideoLearnAnswer.php

@@ -0,0 +1,68 @@
+<?php namespace App\Http\Controllers\Admin;
+
+use App\Models\Custom;
+use App\Models\Video\LearnAnswer as Model;
+use App\Models\Video\Course as VideoCourse;
+use App\Models\Video\Answer as VideoAnswer;
+use App\Models\Video\Question as VideoQuestion;
+
+/**
+ * 学习记录
+ *
+ * @author    刘相欣
+ *
+ */
+class VideoLearnAnswer extends Auth{
+	
+	protected function _initialize(){
+		parent::_initialize();
+		$this->assign('breadcrumb1','课中习题');
+		$this->assign('breadcrumb2','答题记录');
+	}
+
+	/**
+	 * 列表页
+	 * 
+	 * */
+    public function index(Model $Model,VideoCourse $VideoCourse,Custom $Custom,VideoQuestion $VideoQuestion,VideoAnswer $VideoAnswer){
+		// 接收参数
+		$recordId					= request('record_id',0);
+		$courseId					= request('course_id',0);
+		$customCode					= request('custom_code','');
+		$customName					= request('custom_name','');
+		// 转码
+		$customCode					= $Custom->codeToId($customCode);
+		// 查询条件
+		$map 						= [];
+		// 组合条件
+		if( $courseId )				$map[] = ['video_course.id','=',$courseId];
+		if( $recordId )				$map[] = ['video_learn_answer.record_id','=',$recordId];
+		if( $customCode )			$map[] = ['custom.uid','=',$customCode];
+		if( $customName )			$map[] = ['custom.username','LIKE','%'.$customName.'%'];
+		// 查询数据
+		$list						= $Model->query()
+									->join('video_course','video_course.id','=','video_learn_answer.course_id')
+									->join('custom','custom.uid','=','video_learn_answer.custom_uid')
+									->where($map)->select(['video_learn_answer.*','video_course.name as course_name','custom.username as custom_name'])
+									->orderByDesc('id')->paginate(config('page_num',10));
+		// 循环处理数据
+		foreach ($list as $key => $value) {
+			// 时间
+			$value['custom_code']	= $Custom->idToCode($value['custom_uid']);
+			$value['question_title']= $VideoQuestion->getOne($value['question_id'],'title');
+			$value['answer_list'] 	= $VideoAnswer->getListByQuestion($value['question_id']);
+			$value['answer_list'] 	= array_values($value['answer_list']);
+			// 重组
+			$list[$key]				= $value;
+		}
+		// 查询数据
+		$courseList 				= $VideoCourse->query()->orderByDesc('id')->get(['id','name']);
+		// 分配数据
+		$this->assign('list',$list);
+		$this->assign('courseList',$courseList);
+		$this->assign('empty', '<tr><td colspan="20">~~暂无数据</td></tr>');
+		// 加载模板
+		return 						$this->fetch();
+    }
+
+}

+ 8 - 8
app/Http/Controllers/Admin/VideoPlayQuestion.php → app/Http/Controllers/Admin/VideoLearnQuestion.php

@@ -1,7 +1,7 @@
 <?php namespace App\Http\Controllers\Admin;
 
-use App\Http\Requests\Admin\Video\PlayQuestion as Request;
-use App\Models\Video\PlayQuestion as Model;
+use App\Http\Requests\Admin\Video\LearnQuestion as Request;
+use App\Models\Video\LearnQuestion as Model;
 use App\Models\Video\Course as VideoCourse;
 use App\Models\Video\Question as VideoQuestion;
 
@@ -12,7 +12,7 @@ use App\Models\Video\Question as VideoQuestion;
  * @author    刘相欣
  *
  */
-class VideoPlayQuestion extends Auth{
+class VideoLearnQuestion extends Auth{
 	
 	protected function _initialize(){
 		parent::_initialize();
@@ -35,10 +35,10 @@ class VideoPlayQuestion extends Auth{
 		if( $questionId )		$map[] = ['video_question.id','=',$questionId];
 		// 查询数据
 		$list					= $Model->query()
-									->join('video_course','video_course.id','=','video_play_question.course_id')
-									->join('video_question','video_question.id','=','video_play_question.question_id')
-									->where($map)->select(['video_play_question.*','video_course.name as course_name','video_question.title as question_title'])
-									->orderBy('video_play_question.play_time')->paginate(config('page_num',10));
+									->join('video_course','video_course.id','=','video_learn_question.course_id')
+									->join('video_question','video_question.id','=','video_learn_question.question_id')
+									->where($map)->select(['video_learn_question.*','video_course.name as course_name','video_question.title as question_title'])
+									->orderBy('video_learn_question.play_time')->paginate(config('page_num',10));
 		// 循环处理数据
 		foreach ($list as $key => $value) {
 			// 出题时间
@@ -173,7 +173,7 @@ class VideoPlayQuestion extends Auth{
 		// 如果用户不存在
 		if( !$oldData )	return json_send(['code'=>'error','msg'=>'数据不存在']);
 		// 执行修改
-		$result			= $Model->edit($id,['status'=>$status]);
+		$result			= $Model->edit($id,['status'=>$status,'course_id'=>$oldData['course_id']]);
 		// 提示新增失败
 		if( !$result )	return json_send(['code'=>'error','msg'=>'设置失败']);
 		// 记录行为

+ 65 - 0
app/Http/Controllers/Admin/VideoLearnRecord.php

@@ -0,0 +1,65 @@
+<?php namespace App\Http\Controllers\Admin;
+
+use App\Models\Custom;
+use App\Models\Video\LearnRecord as Model;
+use App\Models\Video\Course as VideoCourse;
+
+
+/**
+ * 学习记录
+ *
+ * @author    刘相欣
+ *
+ */
+class VideoLearnRecord extends Auth{
+	
+	protected function _initialize(){
+		parent::_initialize();
+		$this->assign('breadcrumb1','课程关联');
+		$this->assign('breadcrumb2','学习记录');
+	}
+
+	/**
+	 * 列表页
+	 * 
+	 * */
+    public function index(Model $Model,VideoCourse $VideoCourse,Custom $Custom){
+		// 接收参数
+		$courseId				= request('course_id',0);
+		$customCode				= request('custom_code','');
+		$customName				= request('custom_name','');
+		// 转码
+		$customCode				= $Custom->codeToId($customCode);
+		// 查询条件
+		$map 					= [];
+		// 组合条件
+		if( $courseId )			$map[] = ['video_course.id','=',$courseId];
+		if( $customCode )		$map[] = ['custom.uid','=',$customCode];
+		if( $customName )		$map[] = ['custom.username','LIKE','%'.$customName.'%'];
+		// 查询数据
+		$list					= $Model->query()
+									->join('video_course','video_course.id','=','video_learn_record.course_id')
+									->join('custom','custom.uid','=','video_learn_record.custom_uid')
+									->where($map)->select(['video_learn_record.*','video_course.name as course_name','custom.username as custom_name'])
+									->orderByDesc('id')->paginate(config('page_num',10));
+		// 循环处理数据
+		foreach ($list as $key => $value) {
+			// 时间
+			$value['custom_code']	 = $Custom->idToCode($value['custom_uid']);
+			$value['right_ratio']	 = $value['question_total'] ? number_format(($value['isanswer_total'] / $value['question_total'])*100 ,2) : 0;
+			$value['video_inittime'] = str_pad((floor($value['video_inittime'] / 60)),2, '0', STR_PAD_LEFT) .':'. str_pad(($value['video_inittime'] % 60),2, '0', STR_PAD_LEFT);
+			$value['video_lasttime'] = str_pad((floor($value['video_lasttime'] / 60)),2, '0', STR_PAD_LEFT) .':'. str_pad(($value['video_lasttime'] % 60),2, '0', STR_PAD_LEFT);
+			// 重组
+			$list[$key]			= $value;
+		}
+		// 查询数据
+		$courseList 			= $VideoCourse->query()->orderByDesc('id')->get(['id','name']);
+		// 分配数据
+		$this->assign('list',$list);
+		$this->assign('courseList',$courseList);
+		$this->assign('empty', '<tr><td colspan="20">~~暂无数据</td></tr>');
+		// 加载模板
+		return 					$this->fetch();
+    }
+
+}

+ 128 - 0
app/Http/Controllers/Api/Video/Course.php

@@ -0,0 +1,128 @@
+<?php namespace App\Http\Controllers\Api\Video;
+
+use App\Http\Controllers\Api\Api;
+use App\Models\Video\Course as Model;
+use App\Models\Video\LearnRecord;
+use App\Models\Video\CourseType;
+use App\Models\Video\LearnQuestion;
+use Illuminate\Support\Facades\DB;
+use App\Models\Video\Answer as VideoAnswer;
+use App\Models\Video\Question as VideoQuestion;
+use App\Models\Video\ExamRecord;
+/**
+ * 课程
+ *
+ * @author    刘相欣
+ *
+ */
+class Course extends Api{
+	
+
+	/**
+	 * 获取课程列表		/api/video_course/get_list
+	 * 
+	 */
+	public function get_list(Model $Model,LearnRecord $LearnRecord,CourseType $CourseType,ExamRecord $ExamRecord){
+		// 检查登录
+		$uid 						= $this->checkLogin();
+		// 查询条件
+		$map 						= [['status','=','0'],['start_time','<=',time()],['end_time','>=',time()]];
+		// 查询课程数据
+		$Paginator					= $Model->query()->where($map)->orderByDesc('id')->select(['id','name','type_id','thumb','end_time'])->paginate(request('limit',config('page_num',10)));
+		// 获取用户学习记录
+		$record 					= $LearnRecord->query()->where([['custom_uid','=',$uid]])->groupBy('course_id')->select(['course_id',DB::raw('max(`status`) as status')])->get()->toArray();
+		// 获取报告
+		$report						= $ExamRecord->query()->where([['custom_uid','=',$uid],['status','=',1]])->groupBy('course_id')->pluck('id','course_id')->toArray();
+		// 记录列表
+		$recordList 				= [];
+		// 以课程重组课程状态
+		foreach ($record as $key => $value) {
+			// 重组
+			$recordList[$value['course_id']] = $value['status'];
+		}
+		// 循环处理数据
+		foreach ($Paginator as $key => $value) {
+			// 类型名称
+			$value['type_name'] 	= (string) $CourseType->getOne($value['type_id'],'name');
+			// 如果没有缩略图,使用海报图
+			$value['thumb']			= path_compat($value['thumb']);
+			// 用户学习状态
+			$value['learn_status']	= isset($recordList[$value['id']]) ? $recordList[$value['id']] : -1;
+			// 学习报告
+			$value['report_id']		= isset($report[$value['id']]) ? $report[$value['id']] : 0;
+			// 结束时间
+		    $value['end_time']   	= date('Y-m-d H:i',$value['end_time']);
+			// 重组
+			$Paginator[$key]		= $value;
+		}
+		// 获取数据
+		$data['total']				= $Paginator->total();
+		$data['current_page']		= $Paginator->currentPage();
+		$data['per_page']			= $Paginator->perPage();
+		$data['last_page']			= $Paginator->lastPage();
+		$data['data']				= $Paginator->items();
+		// 分配数据
+		return						json_send(['code'=>'success','msg'=>'列表数据','data'=>$data]);
+    }
+	/**
+	 * 课程详情		/api/video_course/get_detail
+	 * 
+	 * */
+    public function get_detail(Model $Model,LearnRecord $LearnRecord,LearnQuestion $LearnQuestion,VideoQuestion $VideoQuestion,VideoAnswer $VideoAnswer){
+		// 检查登录
+		$uid 							= $this->checkLogin();
+		// 接受参数
+		$id								= request('id',0);
+		// 用户是否点赞
+		if( !$id )						return json_send(['code'=>'error','msg'=>'课程ID不能为空']);
+		// 获取旧数据
+        $courseData            			= $Model->query()->where([['status','=',0]])->find($id,['id','name','thumb','video_src','content','start_time','end_time','insert_time']);
+		// 用户是否点赞
+		if( !$courseData )				return json_send(['code'=>'error','msg'=>'课程不存在或者已下架']);
+		// 转数组
+		$courseData						= $courseData->toArray();
+		// 用户是否点赞和推荐
+		$courseData['thumb']			= $courseData['thumb'] ? path_compat($courseData['thumb']) : '';
+		// 获取用户学习进度
+		$courseData['inittime'] 		= (int)$LearnRecord->query()->where([['course_id','=',$id],['custom_uid','=',$uid]])->orderByDesc('id')->value('video_lasttime');
+		// 查询是不是有记录在使用中
+		$oldRecordId			 		= $LearnRecord->query()->where([['custom_uid','=',$uid],['course_id','=',$id],['status','=',0],['video_lasttime','=',0]])->value('id');
+		// 查询课程数据
+		$questionList					= $LearnQuestion->getList($id);
+		// 以时间排序
+		$questionList					= array_sort($questionList,'play_time',SORT_ASC);
+		// 获取数据
+		foreach ($questionList as $key => $value) {
+			# 获取习题数据
+			$value['question_title']	= $VideoQuestion->getOne($value['question_id'],'title');
+			$value['answer_list'] 		= $VideoAnswer->getListByQuestion($value['question_id']);
+			$value['answer_list'] 		= array_values($value['answer_list']);
+			// 如果没有题目选项,删除
+			if( !$value['answer_list'] ){
+				// 如果没有题目选项,删除
+				unset($questionList[$key]);
+				continue;
+			}
+			// 重组
+			$questionList[$key]			= $value;
+		}
+		// 习题列表
+		$courseData['question_list']	= array_values($questionList);
+		// 学习状态
+		$courseData['learn_status']		= (int)$LearnRecord->query()->where([['custom_uid','=',$uid],['course_id','=',$id]])->value(DB::raw('max(`status`) as status'));
+		// 接收参数
+		$data['custom_uid']				= $uid;
+		$data['course_id']				= $id;
+		$data['start_time']				= time();
+		$data['video_inittime']			= $courseData['inittime'];
+		$data['video_lasttime']			= $courseData['inittime'];
+		$data['question_total']			= count($questionList);
+		// 新增记录
+		$courseData['record_id']		= $oldRecordId ? $LearnRecord->edit($oldRecordId,$data) : $LearnRecord->add($data);
+		// 如果记录失败
+		if( !$courseData['record_id'] )	return json_send(['code'=>'error','msg'=>'获取详情失败,请重试']);
+		// 返回结果
+		return							json_send(['code'=>'success','msg'=>'获取成功','data'=>$courseData]);
+	}
+
+}

+ 46 - 0
app/Http/Controllers/Api/Video/ExamAnswer.php

@@ -0,0 +1,46 @@
+<?php namespace App\Http\Controllers\Api\Video;
+
+use App\Http\Controllers\Api\Api;
+use App\Models\Video\ExamAnswer as Model;
+use App\Models\Video\Answer as VideoAnswer;
+use App\Models\Video\Question as VideoQuestion;
+
+/**
+ * 课程
+ *
+ * @author    刘相欣
+ *
+ */
+class ExamAnswer extends Api{
+	
+    
+    /**
+     * 获取答题记录      /api/video_learn_answer/get_list
+     * 
+     */
+    public function get_list(Model $Model,VideoQuestion $VideoQuestion,VideoAnswer $VideoAnswer){
+        // 用户登录
+        $uid                        = $this->checkLogin();
+        // 接收参数
+        $recordId                   = request('record_id',0);
+        // 如果不是课中习题
+        if( !$recordId )            return json_send(['code'=>'error','msg'=>'请选择评测记录']);
+        // 查询答题记录
+        $answerList                 = $Model->query()
+                                    ->where([['custom_uid','=',$uid],['record_id','=',$recordId]])
+                                    ->select(['id','record_id','course_id','question_id','answer_id','is_answer','get_score'])
+                                    ->get()->toArray();
+        // 循环答题
+        foreach ($answerList as $key => $value) {
+            // 题目标题
+            $value['question_title']= $VideoQuestion->getOne($value['question_id'],'title');
+			$value['answer_list'] 	= $VideoAnswer->getListByQuestion($value['question_id']);
+			$value['answer_list'] 	= array_values($value['answer_list']);
+            // 重组
+			$answerList[$key]		= $value;
+        }
+        // 返回结果
+        return                      json_send(['code'=>'success','msg'=>'获取成功','data'=>$answerList]);
+    }
+
+}

+ 59 - 0
app/Http/Controllers/Api/Video/ExamQuestion.php

@@ -0,0 +1,59 @@
+<?php namespace App\Http\Controllers\Api\Video;
+
+use App\Http\Controllers\Api\Api;
+use App\Models\Video\Answer as VideoAnswer;
+use App\Models\Video\Question as VideoQuestion;
+use App\Models\Video\ExamQuestion as Model;
+use App\Models\Video\ExamRecord;
+/**
+ * 课程
+ *
+ * @author    刘相欣
+ *
+ */
+class ExamQuestion extends Api{
+	
+    /**
+     * 获取课后习题列表      /api/video_exam_question/get_list
+     * 
+     */
+    public function get_list(Model $Model,VideoQuestion $VideoQuestion,VideoAnswer $VideoAnswer,ExamRecord $ExamRecord){
+        // 用户登录
+        $uid                        = 2;//$this->checkLogin();
+        // 接收参数
+        $data['course_id']			= request('course_id',0);
+        $data['custom_uid']			= $uid;
+		$data['start_time']			= time();
+		// 查询是不是有记录在使用中
+		$oldRecordId 				= $ExamRecord->query()->where([['custom_uid','=',$uid],['course_id','=',$data['course_id']],['status','=',0]])->value('id');
+        // 查询课程数据
+		$questionList				= $Model->getList($data['course_id']);
+		// 获取数据
+		foreach ($questionList as $key => $value) {
+			# 获取习题数据
+			$value['question_title']= (string) $VideoQuestion->getOne($value['question_id'],'title');
+			$value['answer_list'] 	= $VideoAnswer->getListByQuestion($value['question_id']);
+			$value['answer_list'] 	= array_values($value['answer_list']);
+			// 如果没有题目选项,删除
+			if( !$value['answer_list'] ){
+				// 如果没有题目选项,删除
+				unset($questionList[$key]);
+				continue;
+			}
+			// 重组
+			$questionList[$key]		= $value;
+		}
+		// 题目数量
+		$data['question_total']		= count($questionList);
+		// 新增/修改记录
+		$data['record_id']			= $oldRecordId ? $ExamRecord->edit($oldRecordId,$data) : $ExamRecord->add($data);
+		// 如果记录失败
+		if( !$data['record_id'] )	return json_send(['code'=>'error','msg'=>'获取详情失败,请重试']);
+		// 习题列表
+		$data['question_list']		= array_values($questionList);
+		// 返回结果
+		return						json_send(['code'=>'success','msg'=>'获取成功','data'=>$data]);
+    }
+
+
+}

+ 160 - 0
app/Http/Controllers/Api/Video/ExamRecord.php

@@ -0,0 +1,160 @@
+<?php namespace App\Http\Controllers\Api\Video;
+
+use App\Http\Controllers\Api\Api;
+use App\Models\Video\Answer as VideoAnswer;
+use App\Models\Video\Question as VideoQuestion;
+use App\Models\Video\ExamAnswer;
+use App\Models\Video\ExamRecord as Model;
+use App\Models\CustomScore;
+use Illuminate\Support\Facades\DB;
+
+/**
+ * 课后评测记录
+ *
+ * @author    刘相欣
+ *
+ */
+class ExamRecord extends Api{
+	
+    /**
+     * 交卷     /api/video_exam_record/hand_in
+     * 
+     */
+    public function hand_in(Model $Model,ExamAnswer $ExamAnswer,VideoQuestion $VideoQuestion,VideoAnswer $VideoAnswer,CustomScore $CustomScore){
+        // 用户登录
+        $uid                        	= $this->checkLogin();
+        // 接收参数
+        $id         					= request('record_id',0);
+		$answerList 					= request('answer_list',''); // 示例 '[{"question_id":43,"answer_id":128}]'
+		// 组合数据
+		$data['custom_uid']				= $uid;
+		$data['end_time']				= time();
+		$data['status']					= 1;
+		// 如果没有记录
+		if( !$id ) 						return json_send(['code'=>'error','msg'=>'请选择的记录ID']);
+		// 解析json结构
+		$answerList						= json_decode($answerList,true);
+		// 如果没有记录
+		if( !$answerList || !is_array($answerList) ) return json_send(['code'=>'error','msg'=>'请先答题']);
+		// 查询记录
+		$record							= $Model->query()->where([['id','=',$id]])->first();
+		// 如果没有记录
+		if( !$record ) 					return json_send(['code'=>'error','msg'=>'记录不存在!']);
+		// 转数据
+		$record							= $record->toArray();
+		// 如果没有记录
+		if( $record['status'] ) 		return json_send(['code'=>'error','msg'=>'请勿重复交卷']);
+		// 写入列表
+		$insertList						= [];
+		// 循环题目列表
+		foreach ( $answerList as $value ) {
+			// 临时存储
+			$temp						= ['record_id'=>$id,'course_id'=>$record['course_id'],'custom_uid'=>$uid,'question_id'=>$value['question_id'],'answer_id'=>$value['answer_id']];
+			// 获取答案
+			$temp['is_answer']          = (int) $VideoAnswer->getOne($value['question_id'],$value['answer_id'],'is_answer');
+			// 如果没的话,获取题目分数
+			$temp['score']				= (int) $VideoQuestion->getOne($value['question_id'],'score');
+			// 获取题目分数
+			$temp['get_score']          = 0;
+			// 如果答对的话
+			if( $temp['is_answer'] )	{
+				// 查询该用户该课程该题答题记录
+				$answerRecord			= $ExamAnswer->query()->where([['custom_uid','=',$uid],['course_id','=',$record['course_id']],['question_id','=',$value['question_id']]])->first();;
+				// 如果有的答题记录,不再给分
+				if( $answerRecord )		continue;
+				// 获取积分
+				$temp['get_score']		= $temp['score'];
+			}
+			// 时间
+			$temp['insert_time']		= $data['end_time'];
+			$temp['update_time']		= $data['end_time'];
+			// 重组
+			$insertList[]				= $temp;
+		}
+		// 评测时长
+		$data['exam_time']				= $data['end_time'] - $record['start_time'];
+		// 查询答题数量
+        $data['course_id']  			= $record['course_id'];
+        // 查询答题数量
+        $data['answer_total']  			= count($insertList);
+		// 查询答对数量
+        $data['isanswer_total']			= count(array_column($insertList,'is_answer'));
+        // 查询答题总积分
+        $data['get_score']     			= (int) array_sum(array_column($insertList,'get_score'));
+
+		// 开始事务
+        DB::beginTransaction();
+        // 保存答题记录
+        $result                 		= $ExamAnswer->insert($insertList);
+        // 答题记录保存失败
+        if ( !$result )     			{
+            // 回滚事务
+            DB::rollBack();
+            // 失败提醒
+            return              		json_send(['code'=>'error', 'msg'=>'答题记录失败,请重试']);
+        }
+        // 如果有获取积分
+        if ($data['get_score']) 		{
+            // 积分奖励
+            $result             		= $CustomScore->trade($uid,$id,$data['get_score'],10,2,'课后评测奖励');
+            // 积分奖励失败
+            if( isset($result['error']) ) {
+                // 回滚事务
+                DB::rollBack();
+                // 失败提醒
+                return          		json_send(['code'=>'error', 'msg'=>'积分下发失败,请重试','data'=>['error'=>$result['error']]]);
+            }
+        }
+        // 写入/修改学习记录
+        $result                 		= $Model->edit($id,$data);
+        // 写入失败
+        if( !$result )          		{
+            // 回滚事务
+            DB::rollBack();
+            // 失败提醒
+            return              		json_send(['code'=>'error', 'msg'=>'测评记录失败,请重试','data'=>['error'=>'测评记录写入失败']]);
+        }
+        // 提交事务
+        DB::commit();
+        // 成功提醒
+        return                  		json_send(['code'=>'success', 'msg'=>'提交成功','data'=>$data]);
+    }
+
+
+	/**
+	 * 获取评测报告				/api/video_exam_record/get_report
+	 * 
+	 */
+	public function get_report(Model $Model){
+		// 登录信息
+		$uid 					= $this->checkLogin();
+		// 接收参数
+		$id 					= request('record_id',0);
+		// 返回结果
+		$data					= $Model->query()->where([['id','=',$id]])->first();
+		// 错误提示
+		if(!$data) 				return json_send(['code'=>'error','msg'=>'记录不存在']);
+		// 成功下发
+		return 					json_send(['code'=>'success','msg'=>'获取成功','data'=>$data]);
+	}
+
+
+	/**
+	 * 获取已完成的报告			 /api/video_exam_record/get_report_last
+	 * 
+	 */
+	public function get_report_last(Model $Model){
+		// 登录信息
+		$uid 					= $this->checkLogin();
+		$courseId				= request('course_id',0);
+		// 返回结果
+		$data					= $Model->query()->where([['course_id','=',$courseId],['custom_uid','=',$uid],['status','=',1]])->orderByDesc('id')->first();
+		// 错误提示
+		if(!$data) 				return json_send(['code'=>'error','msg'=>'记录不存在']);
+		// 成功下发
+		return 					json_send(['code'=>'success','msg'=>'获取成功','data'=>$data]);
+	}
+
+
+
+}

+ 132 - 0
app/Http/Controllers/Api/Video/LearnAnswer.php

@@ -0,0 +1,132 @@
+<?php namespace App\Http\Controllers\Api\Video;
+
+use App\Http\Controllers\Api\Api;
+use App\Models\Video\LearnAnswer as Model;
+use App\Models\Video\Answer as VideoAnswer;
+use App\Models\Video\Question as VideoQuestion;
+use App\Models\Video\LearnQuestion;
+use App\Models\Video\LearnRecord;
+use App\Models\CustomScore;
+use Illuminate\Support\Facades\DB;
+
+/**
+ * 课程
+ *
+ * @author    刘相欣
+ *
+ */
+class LearnAnswer extends Api{
+	
+    
+    /**
+     * 获取答题记录      /api/video_learn_answer/get_list
+     * 
+     */
+    public function get_list(Model $Model,VideoQuestion $VideoQuestion,VideoAnswer $VideoAnswer){
+        // 用户登录
+        $uid                        = $this->checkLogin();
+        // 接收参数
+        $recordId                   = request('record_id',0);
+        // 如果不是课中习题
+        if( !$recordId )            return json_send(['code'=>'error','msg'=>'请选择学习记录']);
+        // 查询答题记录
+        $answerList                 = $Model->query()
+                                    ->where([['custom_uid','=',$uid],['record_id','=',$recordId]])
+                                    ->select(['id','record_id','course_id','question_id','answer_id','is_answer','get_score'])
+                                    ->get()->toArray();
+        // 循环答题
+        foreach ($answerList as $key => $value) {
+            // 题目标题
+            $value['question_title']= $VideoQuestion->getOne($value['question_id'],'title');
+			$value['answer_list'] 	= $VideoAnswer->getListByQuestion($value['question_id']);
+			$value['answer_list'] 	= array_values($value['answer_list']);
+            // 重组
+			$answerList[$key]		= $value;
+        }
+        // 返回结果
+        return                      json_send(['code'=>'success','msg'=>'获取成功','data'=>$answerList]);
+    }
+
+    /**
+     * 上报课中习题答案     /api/video_learn_answer/play_exam
+     * 
+     */
+    public function play_exam(Model $Model,LearnQuestion $LearnQuestion,VideoQuestion $VideoQuestion,VideoAnswer $VideoAnswer,CustomScore $CustomScore,LearnRecord $LearnRecord){
+        // 用户登录
+        $uid                        = $this->checkLogin();
+        // 接收参数
+        $data['custom_uid']         = $uid;
+		$data['record_id']          = request('record_id',0);
+        $data['course_id']          = request('course_id',0);
+        $data['question_id']        = request('question_id',0);
+        $data['answer_id']          = request('answer_id',0);
+		// 
+		if( ! $data['record_id'] )	return json_send(['code'=>'error','msg'=>'请选择学习记录']);
+		if( ! $data['course_id'] )	return json_send(['code'=>'error','msg'=>'请选择学习课程']);
+		if( ! $data['question_id'] )return json_send(['code'=>'error','msg'=>'请选择习题问题']);
+		if( ! $data['answer_id'] )	return json_send(['code'=>'error','msg'=>'请选择习题答案']);
+		// 判断是不是课中习题
+        $isLearnQuestion            = $LearnQuestion->getOne($data['course_id'],$data['question_id']);
+        // 如果不是课中习题
+        if( !$isLearnQuestion )     return json_send(['code'=>'error','msg'=>'题目有误或者题目已停用']);
+
+        // 通过记录ID。查询问题是否已经回答
+		$havaAnswer					= $Model->query()->where([['record_id','=',$data['record_id']],['custom_uid','=',$uid],['question_id','=',$data['question_id']]])->first();
+		// 如果答过题
+		if( $havaAnswer )			return json_send(['code'=>'error','msg'=>'已答题,请无重复作答']);
+		// 查询该用户该课程该题答题记录
+        $answerRecord               = $Model->where([['custom_uid','=',$uid],['course_id','=',$data['course_id']],['question_id','=',$data['question_id']]])->first();
+        // 获取题目分数
+        $data['score']              = (int) $VideoQuestion->getOne($data['question_id'],'score');
+        // 获取答案
+        $data['is_answer']          = (int) $VideoAnswer->getOne($data['question_id'],$data['answer_id'],'is_answer');
+        // 如果没有答题记录,并且题目答案正确,则获取分数
+        $data['get_score']          = (!$answerRecord && $data['is_answer']) ? $data['score'] : 0;
+
+        // 获取题目数量
+        $learnData['question_total']= count($LearnQuestion->getList($data['course_id']));
+        // 查询答题数量
+        $learnData['answer_total']  = ($Model->query()->where([['record_id','=',$data['record_id']],['custom_uid','=',$uid]])->count()) + 1;
+		// 查询答对数量
+        $learnData['isanswer_total']= ($Model->query()->where([['record_id','=',$data['record_id']],['custom_uid','=',$uid],['is_answer','=',1]])->count()) + ($data['is_answer'] ? 1 : 0);
+        // 查询答题总积分
+        $learnData['get_score']     = intval($Model->query()->where([['record_id','=',$data['record_id']],['custom_uid','=',$uid]])->sum('get_score')) + $data['get_score'];
+
+        // 开始事务
+        DB::beginTransaction();
+        // 保存答题记录
+        $data['id']                 = $Model->add($data);
+        // 答题记录保存失败
+        if ( !$data['id'] )     {
+            // 回滚事务
+            DB::rollBack();
+            // 失败提醒
+            return              json_send(['code'=>'error', 'msg'=>'答题记录失败,请重试']);
+        }
+        // 如果有获取积分
+        if ($data['get_score']) {
+            // 积分奖励
+            $result             = $CustomScore->trade($uid,$data['id'],$data['get_score'],10,1,'课中评测奖励');
+            // 积分奖励失败
+            if( isset($result['error']) )      {
+                // 回滚事务
+                DB::rollBack();
+                // 失败提醒
+                return          json_send(['code'=>'error', 'msg'=>'积分下发失败,请重试','data'=>['error'=>$result['error']]]);
+            }
+        }
+        // 写入/修改学习记录
+        $result                 = $LearnRecord->edit($data['record_id'],$learnData);
+        // 写入失败
+        if( !$result )          {
+            // 回滚事务
+            DB::rollBack();
+            // 失败提醒
+            return              json_send(['code'=>'error', 'msg'=>'学习记录失败,请重试','data'=>['error'=>'学习记录写入失败']]);
+        }
+        // 提交事务
+        DB::commit();
+        // 成功提醒
+        return                  json_send(['code'=>'success', 'msg'=>'提交成功','data'=>$data]);
+    }
+}

+ 48 - 0
app/Http/Controllers/Api/Video/LearnQuestion.php

@@ -0,0 +1,48 @@
+<?php namespace App\Http\Controllers\Api\Video;
+
+use App\Http\Controllers\Api\Api;
+use App\Models\Video\Answer as VideoAnswer;
+use App\Models\Video\Question as VideoQuestion;
+use App\Models\Video\LearnQuestion as Model;
+
+/**
+ * 课程
+ *
+ * @author    刘相欣
+ *
+ */
+class LearnQuestion extends Api{
+	
+    /**
+     * 获取习题列表      /api/video_learn_question/get_list
+     * 
+     */
+    public function get_list(Model $Model,VideoQuestion $VideoQuestion,VideoAnswer $VideoAnswer){
+        // 用户登录
+        $uid                        = $this->checkLogin();
+        // 接收参数
+        $courseId                   = request('course_id',0);
+        // 查询课程数据
+		$questionList				= $Model->query()->where([['course_id','=',$courseId],['status','=',0]])->orderBy('play_time')->select(['question_id','play_time'])->get()->toArray();
+		// 获取数据
+		foreach ($questionList as $key => $value) {
+			# 获取习题数据
+			$value['question_title']= $VideoQuestion->getOne($value['question_id'],'title');
+			$value['answer_list'] 	= $VideoAnswer->getListByQuestion($value['question_id']);
+			$value['answer_list'] 	= array_values($value['answer_list']);
+			// 如果没有题目选项,删除
+			if( !$value['answer_list'] ){
+				// 如果没有题目选项,删除
+				unset($questionList[$key]);
+				continue;
+			}
+			// 重组
+			$questionList[$key]		= $value;
+		}
+        // 习题列表
+		$questionList               = array_values($questionList);
+		// 返回结果
+		return						json_send(['code'=>'success','msg'=>'暂无','data'=>$questionList]);
+    }
+
+}

+ 76 - 0
app/Http/Controllers/Api/Video/LearnRecord.php

@@ -0,0 +1,76 @@
+<?php namespace App\Http\Controllers\Api\Video;
+
+use App\Http\Controllers\Api\Api;
+use App\Models\Video\LearnRecord as Model;
+use App\Models\Video\LearnQuestion;
+/**
+ * 学习记录
+ *
+ * @author    刘相欣
+ *
+ */
+class LearnRecord extends Api{
+	
+	/**
+	 * 新增学习记录	/api/video_learn_record/add
+	 * 
+	 */
+	public function add(Model $Model,LearnQuestion $LearnQuestion){
+		// 登录信息
+		$uid 					= $this->checkLogin();
+		// 接收参数
+		$data['custom_uid']		= $uid;
+		$data['course_id']		= request('course_id',0);
+		$data['video_inittime']	= request('video_inittime',0);
+		$data['video_lasttime']	= $data['video_inittime'];
+		$data['start_time']		= time();
+		$data['question_total']	= count($LearnQuestion->getList($data['course_id']));
+		// 查询播放记录
+		$data['id']				= $Model->add($data);
+		// 上报失败
+		if( !$data['id'] )		return json_send(['code'=>'error','msg'=>'创建成功']);
+		// 返回结果
+		return 					json_send(['code'=>'success','msg'=>'创建失败','data'=>$data]);
+	}
+
+
+	/**
+	 * 修改学习记录				/api/video_learn_record/update_playtime
+	 * 
+	 */
+	public function update_playtime(Model $Model){
+		// 登录信息
+		$uid 					= $this->checkLogin();
+		// 接收参数
+		$id						= request('record_id',0);
+		$data['video_lasttime']	= request('video_playtime',0);
+		$data['status']			= request('status',0);
+		$data['end_time']		= time();
+		// 查询播放记录
+		$data['id']				= $Model->edit($id,$data);
+		// 上报失败
+		if( !$data['id'] )		return json_send(['code'=>'error','msg'=>'上报失败']);
+		// 返回结果
+		return 					json_send(['code'=>'success','msg'=>'上报成功','data'=>$data]);
+	}
+
+
+
+	/**
+	 * 获取学习报告				/api/video_learn_record/get_report
+	 * 
+	 */
+	public function get_report(Model $Model){
+		// 登录信息
+		$uid 					= $this->checkLogin();
+		// 接收参数
+		$id 					= request('record_id',0);
+		// 返回结果
+		$data					= $Model->query()->where([['id','=',$id]])->first();
+		// 错误提示
+		if(!$data) 				return json_send(['code'=>'error','msg'=>'记录不存在']);
+		// 成功下发
+		return 					json_send(['code'=>'success','msg'=>'获取成功','data'=>$data]);
+	}
+
+}

+ 0 - 1
app/Http/Requests/Admin/Video/Course.php

@@ -46,7 +46,6 @@ class Course extends BaseRequest
             'id.gt'   		            => 'ID格式错误',
             'name.required'   		    => '请输入课程名称',
             'name.unique'   		    => '课程名称已存在',
-            'name.required'   		    => '请输入课程名称',
             'video_src.required'   		=> '请上传视频',
             'status.integer'   		    => '状态格式错误',
             'status.gte'   		        => '状态格式错误',

+ 53 - 0
app/Http/Requests/Admin/Video/CourseType.php

@@ -0,0 +1,53 @@
+<?php namespace App\Http\Requests\Admin\Video;
+
+use App\Http\Requests\BaseRequest;
+/**
+ * 验证器
+ * 
+ */
+class CourseType extends BaseRequest
+{
+    /**
+     * 获取应用于请求的规则
+     *
+     * @return array
+     */
+    public function rules()
+    {
+        // 编辑时排除ID
+        // 返回结果
+        return      [
+            // 有时候我们希望某个字段在第一次验证失败后就停止运行验证规则,只需要将 bail 添加到规则中:
+            // 验证字段,验证规则,提示信息
+            'id'            => 'required|integer|gt:0',
+            'name'          => 'required|unique:video_course_type,name,'.request('id',0),
+            'status'        => 'required|integer|gte:0',
+        ];
+    }
+
+    // 场景列表
+    protected   $scenes         = [
+        'add'                   => ['name'],
+        'edit'                  => ['id','name'],
+        'set_status'            => ['id','status'],
+	];
+
+    /**
+     * 获取已定义验证规则的错误消息
+     *
+     * @return array
+     */
+    public function messages()
+    {
+        return [
+            'id.required'   		    => 'ID未知',
+            'id.integer'   		        => 'ID格式错误',
+            'id.gt'   		            => 'ID格式错误',
+            'name.required'   		    => '请输入类型名称',
+            'name.unique'   		    => '课程类型已存在',
+            'status.integer'   		    => '状态格式错误',
+            'status.gte'   		        => '状态格式错误',
+        ];
+    }
+
+}

+ 1 - 1
app/Http/Requests/Admin/Video/PlayQuestion.php → app/Http/Requests/Admin/Video/ExamQuestion.php

@@ -6,7 +6,7 @@ use App\Http\Requests\BaseRequest;
  * 验证器
  * 
  */
-class PlayQuestion extends BaseRequest
+class ExamQuestion extends BaseRequest
 {
     /**
      * 获取应用于请求的规则

+ 1 - 1
app/Http/Requests/Admin/Video/CourseQuestion.php → app/Http/Requests/Admin/Video/LearnQuestion.php

@@ -6,7 +6,7 @@ use App\Http\Requests\BaseRequest;
  * 验证器
  * 
  */
-class CourseQuestion extends BaseRequest
+class LearnQuestion extends BaseRequest
 {
     /**
      * 获取应用于请求的规则

+ 6 - 0
app/Models/Traits/Score/BuyType.php

@@ -66,6 +66,12 @@ trait BuyType
                                         'name'          =>'拉新奖励',
                                         // 支付方式  方式名称
                                         'pay_type'      =>['1'=>['id'=>1,'name'=>'拉新奖励']],
+                                    ],'10'=>[
+                                        'id'            =>10,
+                                        // 类型名称
+                                        'name'          =>'课程测评',
+                                        // 支付方式  方式名称
+                                        'pay_type'      =>['1'=>['id'=>1,'name'=>'课中习题'],'2'=>['id'=>2,'name'=>'课后评测']],
                                     ]];
 
     /**

+ 7 - 9
app/Models/Video/Answer.php

@@ -33,7 +33,7 @@ class Answer extends Model
         // 如果操作失败
         if( !$id )                          return $id;
         // 更新缓存
-        $this->getList(true);
+        if( isset($data['question_id']) )   $this->getList($data['question_id'],true);
         // 返回结果
         return                              $id;
     }
@@ -51,7 +51,7 @@ class Answer extends Model
         // 如果操作失败
         if( !$result )                      return $result;
         // 更新缓存
-        $this->getList(true);
+        if( isset($data['question_id']) )   $this->getList($data['question_id'],true);
         // 返回结果
         return                              $result;
     }
@@ -61,10 +61,10 @@ class Answer extends Model
      * @param   bool    $force  是否强制更新
      * 
      */
-    public function getList($force = false)
+    public function getList($questionId,$force = false)
     {
         // 结果数据
-        $list                  = $force ? [] : cache('admin:video:answer:list');
+        $list                  = $force ? [] : cache('admin:video:answer:list:'.$questionId);
         // 不存在数据
         if ( !$list ) {
             // 从数据库获取数据
@@ -77,7 +77,7 @@ class Answer extends Model
                 $list[$value['question_id']][$value['id']] = $value;
             }
             // 存起来
-            cache(['admin:video:answer:list'=>$list]);
+            cache(['admin:video:answer:list:'.$questionId=>$list]);
         }
         // 返回结果
         return                  $list;
@@ -95,7 +95,7 @@ class Answer extends Model
     public function getListByQuestion($questionId)
     {
         // 获取列表数据
-        $list                   = $this->getList();
+        $list                   = $this->getList($questionId);
         // 获取问题的列表
         $list                   = isset($list[$questionId]) ? $list[$questionId] : [];
         // 返回值
@@ -113,9 +113,7 @@ class Answer extends Model
     public function getOne($questionId,$id,$field='')
     {
         // 获取列表数据
-        $list                   = $this->getList();
-        // 获取问题的列表
-        $list                   = isset($list[$questionId]) ? $list[$questionId] : [];
+        $list                   = $this->getListByQuestion($questionId);
         // 获取数据
         $one                    = isset($list[$id]) ? $list[$id] : [];
         // 返回值

+ 99 - 0
app/Models/Video/CourseType.php

@@ -0,0 +1,99 @@
+<?php namespace App\Models\Video;
+
+use Illuminate\Database\Eloquent\Factories\HasFactory;
+use Illuminate\Database\Eloquent\Model;
+
+/**
+ * 模型
+ * 
+ */
+class CourseType extends Model
+{
+    use HasFactory;
+
+    // 与模型关联的表名
+    protected $table = 'video_course_type';
+    // 是否主动维护时间戳
+    public $timestamps = false;
+    // 定义时间戳字段名
+    // const CREATED_AT = 'insert_time';
+    // const UPDATED_AT = 'update_time';
+
+    /**
+     * 添加数据
+     * 
+     */
+    public function add($data)
+    {
+        // 时间
+        $data['insert_time']				= time();
+        $data['update_time']				= time();
+        // 写入数据表
+        $id						            = $this->query()->insertGetId($data);
+        // 更新缓存
+        $this->getList(true);
+        // 返回结果
+        return                              $id;
+    }
+
+    /**
+     * 添加数据
+     * 
+     */
+    public function edit($id,$data)
+    {
+        // 更新时间
+        $data['update_time']                = time();
+        // 写入数据表
+        $result						        = $this->query()->where(['id'=>$id])->update($data);
+        // 更新缓存
+        $this->getList(true);
+        // 返回结果
+        return                              $result;
+    }
+
+    /**
+     * 获取列表
+     * @param   Bool    $force  是否强制更新
+     * 
+     */
+    public function getList($force = false)
+    {
+        // 结果数据
+        $list                  = $force ? [] : cache('admin:video:course:type:list');
+        // 不存在数据
+        if ( !$list ) {
+            // 从数据库获取数据
+            $data              = $this->query()->get(['id','status','name'])->toArray();
+            // 循环处理数据
+            $list              = [];
+            // 进行更新
+            foreach ($data as $value) {
+                // 重组数据
+                $list[$value['id']] = $value;
+            }
+            // 存起来
+            cache(['admin:video:course:type:list'=>$list]);
+        }
+        // 返回结果
+        return                  $list;
+    }
+
+    /**
+     * 获取配置平台对应的应用数据
+     * 
+     * @param   Array      用户ID
+     * @param   String     指定字段
+     * 
+     */
+    public function getOne($id,$field='')
+    {
+        // 获取列表数据
+        $list                   = $this->getList();
+        // 获取数据
+        $one                    = isset($list[$id]) ? $list[$id] : [];
+        // 返回值
+        return                  empty($field) ? $one : ( isset($one[$field]) ? $one[$field] : null);
+    }
+
+}

+ 53 - 0
app/Models/Video/ExamAnswer.php

@@ -0,0 +1,53 @@
+<?php namespace App\Models\Video;
+
+use Illuminate\Database\Eloquent\Factories\HasFactory;
+use Illuminate\Database\Eloquent\Model;
+
+/**
+ * 模型
+ * 
+ */
+class ExamAnswer extends Model
+{
+    use HasFactory;
+
+    // 与模型关联的表名
+    protected $table = 'video_exam_answer';
+    // 是否主动维护时间戳
+    public $timestamps = false;
+    // 定义时间戳字段名
+    // const CREATED_AT = 'insert_time';
+    // const UPDATED_AT = 'update_time';
+
+    /**
+     * 添加数据
+     * 
+     */
+    public function add($data)
+    {
+        // 时间
+        $data['insert_time']				= time();
+        $data['update_time']				= time();
+        // 写入数据表
+        $id						            = $this->query()->insertGetId($data);
+        // 返回结果
+        return                              $id;
+    }
+
+    /**
+     * 添加数据
+     * 
+     */
+    public function edit($id,$data)
+    {
+        // 更新时间
+        $data['update_time']                = time();
+        // 写入数据表
+        $result						        = $this->query()->where(['id'=>$id])->update($data);
+        // 返回结果
+        if( !$result )                      return 0;
+        // 返回结果
+        return                              $id;
+    }
+
+}

+ 6 - 6
app/Models/Video/CourseQuestion.php → app/Models/Video/ExamQuestion.php

@@ -7,12 +7,12 @@ use Illuminate\Database\Eloquent\Model;
  * 模型
  * 
  */
-class CourseQuestion extends Model
+class ExamQuestion extends Model
 {
     use HasFactory;
 
     // 与模型关联的表名
-    protected $table = 'video_course_question';
+    protected $table = 'video_exam_question';
     // 是否主动维护时间戳
     public $timestamps = false;
     // 定义时间戳字段名
@@ -62,20 +62,20 @@ class CourseQuestion extends Model
     public function getList($courseId,$force = false)
     {
         // 结果数据
-        $list                  = $force ? [] : cache('admin:video:play:question:list:'.$courseId);
+        $list                  = $force ? [] : cache('admin:video:exam:question:list:'.$courseId);
         // 不存在数据
         if ( !$list )          {
             // 从数据库获取数据
-            $data              = $this->query()->where([['status','=',0]])->get(['id','course_id','question_id'])->toArray();
+            $data              = $this->query()->where([['status','=',0],['course_id','=',$courseId]])->get(['id','course_id','question_id'])->toArray();
             // 循环处理数据
             $list              = [];
             // 进行更新
             foreach ($data as $value) {
                 // 重组数据
-                $list[$value['course_id']][$value['question_id']] = $value;
+                $list[$value['question_id']] = $value;
             }
             // 存起来
-            cache(['admin:video:play:question:list:'.$courseId=>$list]);
+            cache(['admin:video:exam:question:list:'.$courseId=>$list]);
         }
         // 返回结果
         return                  $list;

+ 53 - 0
app/Models/Video/ExamRecord.php

@@ -0,0 +1,53 @@
+<?php namespace App\Models\Video;
+
+use Illuminate\Database\Eloquent\Factories\HasFactory;
+use Illuminate\Database\Eloquent\Model;
+
+/**
+ * 模型
+ * 
+ */
+class ExamRecord extends Model
+{
+    use HasFactory;
+
+    // 与模型关联的表名
+    protected $table = 'video_exam_record';
+    // 是否主动维护时间戳
+    public $timestamps = false;
+    // 定义时间戳字段名
+    // const CREATED_AT = 'insert_time';
+    // const UPDATED_AT = 'update_time';
+
+    /**
+     * 添加数据
+     * 
+     */
+    public function add($data)
+    {
+        // 时间
+        $data['insert_time']				= time();
+        $data['update_time']				= time();
+        // 写入数据表
+        $id						            = $this->query()->insertGetId($data);
+        // 返回结果
+        return                              $id;
+    }
+
+    /**
+     * 添加数据
+     * 
+     */
+    public function edit($id,$data)
+    {
+        // 更新时间
+        $data['update_time']                = time();
+        // 写入数据表
+        $result						        = $this->query()->where(['id'=>$id])->update($data);
+        // 返回结果
+        if( !$result )                      return 0;
+        // 返回结果
+        return                              $id;
+    }
+
+}

+ 53 - 0
app/Models/Video/LearnAnswer.php

@@ -0,0 +1,53 @@
+<?php namespace App\Models\Video;
+
+use Illuminate\Database\Eloquent\Factories\HasFactory;
+use Illuminate\Database\Eloquent\Model;
+
+/**
+ * 模型
+ * 
+ */
+class LearnAnswer extends Model
+{
+    use HasFactory;
+
+    // 与模型关联的表名
+    protected $table = 'video_learn_answer';
+    // 是否主动维护时间戳
+    public $timestamps = false;
+    // 定义时间戳字段名
+    // const CREATED_AT = 'insert_time';
+    // const UPDATED_AT = 'update_time';
+
+    /**
+     * 添加数据
+     * 
+     */
+    public function add($data)
+    {
+        // 时间
+        $data['insert_time']				= time();
+        $data['update_time']				= time();
+        // 写入数据表
+        $id						            = $this->query()->insertGetId($data);
+        // 返回结果
+        return                              $id;
+    }
+
+    /**
+     * 添加数据
+     * 
+     */
+    public function edit($id,$data)
+    {
+        // 更新时间
+        $data['update_time']                = time();
+        // 写入数据表
+        $result						        = $this->query()->where(['id'=>$id])->update($data);
+        // 返回结果
+        if( !$result )                      return 0;
+        // 返回结果
+        return                              $id;
+    }
+
+}

+ 26 - 6
app/Models/Video/PlayQuestion.php → app/Models/Video/LearnQuestion.php

@@ -7,12 +7,12 @@ use Illuminate\Database\Eloquent\Model;
  * 模型
  * 
  */
-class PlayQuestion extends Model
+class LearnQuestion extends Model
 {
     use HasFactory;
 
     // 与模型关联的表名
-    protected $table = 'video_play_question';
+    protected $table = 'video_learn_question';
     // 是否主动维护时间戳
     public $timestamps = false;
     // 定义时间戳字段名
@@ -50,6 +50,8 @@ class PlayQuestion extends Model
         $result						        = $this->query()->where(['id'=>$id])->update($data);
         // 如果操作失败
         if( !$result )                      return $result;
+        // 更新缓存
+        if( isset($data['course_id']) )     $this->getList($data['course_id'],true);
         // 返回结果
         return                              $result;
     }
@@ -62,23 +64,41 @@ class PlayQuestion extends Model
     public function getList($courseId,$force = false)
     {
         // 结果数据
-        $list                  = $force ? [] : cache('admin:video:play:question:list:'.$courseId);
+        $list                  = $force ? [] : cache('admin:video:learn:question:list:'.$courseId);
         // 不存在数据
         if ( !$list )          {
             // 从数据库获取数据
-            $data              = $this->query()->where([['status','=',0]])->get(['id','course_id','question_id','play_time'])->toArray();
+            $data              = $this->query()->where([['status','=',0],['course_id','=',$courseId]])->get(['id','course_id','question_id','play_time'])->toArray();
             // 循环处理数据
             $list              = [];
             // 进行更新
             foreach ($data as $value) {
                 // 重组数据
-                $list[$value['course_id']][$value['question_id']] = $value;
+                $list[$value['question_id']] = $value;
             }
             // 存起来
-            cache(['admin:video:play:question:list:'.$courseId=>$list]);
+            cache(['admin:video:learn:question:list:'.$courseId=>$list]);
         }
         // 返回结果
         return                  $list;
     }
 
+    /**
+     * 获取配置平台对应的应用数据
+     * 
+     * @param   int     $courseId    课程ID
+     * @param   int     $questionId  问题ID
+     * @param   string  $field       字段名
+     * 
+     */
+    public function getOne($courseId,$questionId,$field='')
+    {
+        // 获取列表数据
+        $list                   = $this->getList($courseId);
+        // 获取数据
+        $one                    = isset($list[$questionId]) ? $list[$questionId] : [];
+        // 返回值
+        return                  empty($field) ? $one : ( isset($one[$field]) ? $one[$field] : null);
+    }
+
 }

+ 53 - 0
app/Models/Video/LearnRecord.php

@@ -0,0 +1,53 @@
+<?php namespace App\Models\Video;
+
+use Illuminate\Database\Eloquent\Factories\HasFactory;
+use Illuminate\Database\Eloquent\Model;
+
+/**
+ * 模型
+ * 
+ */
+class LearnRecord extends Model
+{
+    use HasFactory;
+
+    // 与模型关联的表名
+    protected $table = 'video_learn_record';
+    // 是否主动维护时间戳
+    public $timestamps = false;
+    // 定义时间戳字段名
+    // const CREATED_AT = 'insert_time';
+    // const UPDATED_AT = 'update_time';
+
+    /**
+     * 添加数据
+     * 
+     */
+    public function add($data)
+    {
+        // 时间
+        $data['insert_time']				= time();
+        $data['update_time']				= time();
+        // 写入数据表
+        $id						            = $this->query()->insertGetId($data);
+        // 返回结果
+        return                              $id;
+    }
+
+    /**
+     * 添加数据
+     * 
+     */
+    public function edit($id,$data)
+    {
+        // 更新时间
+        $data['update_time']                = time();
+        // 写入数据表
+        $result						        = $this->query()->where(['id'=>$id])->update($data);
+        // 返回结果
+        if( !$result )                      return 0;
+        // 返回结果
+        return                              $id;
+    }
+
+}

+ 1 - 1
app/Models/Video/Question.php

@@ -68,7 +68,7 @@ class Question extends Model
         // 不存在数据
         if ( !$list ) {
             // 从数据库获取数据
-            $data              = $this->query()->where([['status','=',0]])->get(['id','title'])->toArray();
+            $data              = $this->query()->where([['status','=',0]])->get(['id','title','score'])->toArray();
             // 循环处理数据
             $list              = [];
             // 进行更新

+ 9 - 1
resources/views/admin/video_course/add.blade.php

@@ -22,10 +22,18 @@ style="margin: 0 auto;width: 96%;padding: 30px 0px;"
 			<input type="hidden" name="video_src" value=""  />
 		</div>
 	</div>
-	<div class="form-group col-sm-4">
+	<div class="form-group col-sm-2">
 		<label class="control-label">课程名称</label>
 		<input class="form-control" required="required" type="text" placeholder="课程名称" maxlength="40" name="name" value="" />
 	</div>
+	<div class="form-group col-sm-2">
+		<label class="control-label">课程类型</label>
+		<select class="form-control" name="type_id" required="required">
+			@foreach ($typeList as $value)
+				<option value="{{$value['id']}}"  >{{$value['name']}}</option>
+			@endforeach
+		</select>
+	</div>
 	<div class="form-group col-sm-2">
 		<label class="control-label">开始时间</label>
 		<input class="form-control" required="required" type="datetime-local" placeholder="开始时间"  name="start_time" value="" />

+ 9 - 1
resources/views/admin/video_course/edit.blade.php

@@ -22,10 +22,18 @@ style="margin: 0 auto;width: 96%;padding: 30px 0px;"
 			<input type="hidden" name="video_src" value="{{$oldData['video_src']}}"  />
 		</div>
 	</div>
-	<div class="form-group col-sm-4">
+	<div class="form-group col-sm-2">
 		<label class="control-label">课程名称</label>
 		<input class="form-control" required="required" type="text" placeholder="课程名称" maxlength="40" name="name" value="{{$oldData['name']}}" />
 	</div>
+	<div class="form-group col-sm-2">
+		<label class="control-label">课程类型</label>
+		<select class="form-control" name="type_id" required="required">
+			@foreach ($typeList as $value)
+				<option value="{{$value['id']}}" @if( $value['id'] == $oldData['type_id'])  selected @endif >{{$value['name']}}</option>
+			@endforeach
+		</select>
+	</div>
 	<div class="form-group col-sm-2">
 		<label class="control-label">开始时间</label>
 		<input class="form-control" required="required" type="datetime-local" placeholder="开始时间"  name="start_time" value="{{date('Y-m-d H:i',$oldData['start_time'])}}" />

+ 17 - 5
resources/views/admin/video_course/index.blade.php

@@ -10,7 +10,7 @@ style="margin: 0 auto;width: 96%;padding: 30px 0px;"
 </div>
 <form action="" method="get" class="form-horizontal form-line">
 	<div class="form-group col col-lg-2 col-md-2 col-sm-2 col-xs-12" style="margin-right: 2px;">
-		<input type="text" class="form-control" name="title" value="{{request('title','')}}" placeholder="请输入课程标题查询" />
+		<input type="text" class="form-control" name="name" value="{{request('name','')}}" placeholder="请输入课程标题查询" />
 	</div>
 	<div class="form-group col col-lg-2 col-md-2 col-sm-2 col-xs-12" style="margin-right: 2px;">
 		<input type="text" class="form-control" name="start_time" value="{{request('start_time','')}}" placeholder="请输入开始时间查询" />
@@ -34,6 +34,7 @@ style="margin: 0 auto;width: 96%;padding: 30px 0px;"
 						<th>课后习题</th>
 						<th>课程有效期</th>
 						<th>课程状态</th>
+						<th>课程类型</th>
 						<th>修改时间</th>
 						<th>操作</th>
 					</tr>
@@ -44,15 +45,15 @@ style="margin: 0 auto;width: 96%;padding: 30px 0px;"
 						<td> {{$a['id']}}</td>
 						<td> {{$a['name']}}</td>
 						<td> 
-							@if( check_auth('admin/video_play_question/index') )
-							<a href="{{url('admin/video_play_question/index?'.http_build_query(['course_id'=>$a['id']]))}}" title="课中习题">
+							@if( check_auth('admin/video_learn_question/index') )
+							<a href="{{url('admin/video_learn_question/index?'.http_build_query(['course_id'=>$a['id']]))}}" title="课中习题">
 								课中习题
 							</a>
 							@endif
 						</td>
 						<td> 
-							@if( check_auth('admin/video_course_question/index') )
-							<a href="{{url('admin/video_course_question/index?'.http_build_query(['course_id'=>$a['id']]))}}" title="课后习题">
+							@if( check_auth('admin/video_exam_question/index') )
+							<a href="{{url('admin/video_exam_question/index?'.http_build_query(['course_id'=>$a['id']]))}}" title="课后习题">
 								课后习题
 							</a>
 							@endif
@@ -62,8 +63,19 @@ style="margin: 0 auto;width: 96%;padding: 30px 0px;"
 							<p>结束: {{date('Y/m/d H:i',$a['end_time'])}} </p>
 						</td>
 						<td> @if ($a['status'] == 0) 启用 @endif @if ($a['status'] == 1) 停用 @endif</td>
+						<td> {{$a['type_name']}}</td>
 						<td> {{date('Y/m/d H:i',$a['update_time'])}}</td>
 						<td>
+							@if( check_auth('admin/video_course/edit') )
+							<a class="btn btn-sm btn-primary" href="{{url('admin/video_learn_record/index?'.http_build_query(['course_id'=>$a['id']]))}}" title="学习记录">
+								学习记录
+							</a>
+							@endif
+							@if( check_auth('admin/video_course/edit') )
+							<a class="btn btn-sm btn-primary" href="{{url('admin/video_exam_record/index?'.http_build_query(['course_id'=>$a['id']]))}}" title="课后评测记录">
+								课后评测记录
+							</a>
+							@endif
 							@if( check_auth('admin/video_course/edit') )
 							<a class="btn btn-sm btn-warning" href="{{url('admin/video_course/edit?'.http_build_query(['id'=>$a['id']]))}}" title="查看">
 								修改

+ 16 - 0
resources/views/admin/video_course_type/add.blade.php

@@ -0,0 +1,16 @@
+@extends('admin.public.base')
+@section('body_class')
+style="margin: 0 auto;width: 96%;padding: 30px 0px;"
+@endsection
+@section('content')
+<form class="post-form" action="" method="post">
+	<div class="form-group col-sm-4">
+		<label class="control-label">类型名称</label>
+		<input class="form-control" required="required" type="text" placeholder="类型名称" maxlength="10" name="name" value="" />
+	</div>
+	<div class="form-group col-sm-12">
+		@csrf
+		<input id="send" type="submit" value="提交" class="btn btn-primary btn-block" />
+	</div>
+</form>
+@endsection

+ 17 - 0
resources/views/admin/video_course_type/edit.blade.php

@@ -0,0 +1,17 @@
+@extends('admin.public.base')
+@section('body_class')
+style="margin: 0 auto;width: 96%;padding: 30px 0px;" 
+@endsection
+@section('content')
+<form class="post-form" action="" method="post">
+	<div class="form-group col-sm-4">
+		<label class="control-label">类型名称</label>
+		<input class="form-control" required="required" type="text" placeholder="类型名称" maxlength="10" name="name" value="{{$oldData['name']}}" />
+	</div>
+	<div class="form-group col-sm-12">
+		@csrf
+		<input type="hidden" name="id" value="{{$oldData['id']}}" />
+		<input id="send" type="submit" value="提交" class="btn btn-primary btn-block" />
+	</div>
+</form>
+@endsection

+ 71 - 0
resources/views/admin/video_course_type/index.blade.php

@@ -0,0 +1,71 @@
+@extends('admin.public.base')
+@section('body_class')
+style="margin: 0 auto;width: 96%;padding: 30px 0px;"
+@endsection
+@section('content')
+<div class="page-header">
+	@if( check_auth('admin/video_course_type/add') )
+	<a href="{{url('admin/video_course_type/add')}}" class="btn btn-primary">新增</a>
+	@endif
+</div>
+<form action="" method="get" class="form-horizontal form-line">
+	<div class="form-group col col-lg-2 col-md-2 col-sm-2 col-xs-12" style="margin-right: 2px;">
+		<input type="text" class="form-control" name="name" value="{{request('name','')}}" placeholder="请输入类型名称查询" />
+	</div>
+	<input type="submit" class="btn btn-sm btn-primary" value="查询"/>
+	<a href="{{url('admin/video_course_type/index')}}" class="btn btn-sm btn-default" >重置</a>
+	@csrf
+</form>
+<div class="row">
+	<div class="col-xs-12">
+		<div class="table-responsive">
+			<table class="table table-striped table-bordered table-hover">
+				<thead>
+					<tr>
+						<th>ID</th>
+						<th>类型名称</th>
+						<th>类型状态</th>
+						<th>修改时间</th>
+						<th>操作</th>
+					</tr>
+				</thead>
+				<tbody>
+					@foreach ($list as $a)
+					<tr>
+						<td> {{$a['id']}}</td>
+						<td> {{$a['name']}}</td>
+						<td> @if ($a['status'] == 0) 启用 @endif @if ($a['status'] == 1) 停用 @endif</td>
+						<td> {{date('Y/m/d H:i',$a['update_time'])}}</td>
+						<td>
+							@if( check_auth('admin/video_course_type/edit') )
+							<a class="btn btn-sm btn-warning" href="{{url('admin/video_course_type/edit?'.http_build_query(['id'=>$a['id']]))}}" title="查看">
+								修改
+							</a>
+							@endif
+							@if( check_auth('admin/video_course_type/set_status') )
+								@if ( $a['status'] )
+									<a class="delete btn btn-sm btn-success" data-url="{{url('admin/video_course_type/set_status?'.http_build_query(['id'=>$a['id'],'status'=>'0']))}}">
+										启用
+									</a>
+								@else
+									<a class="delete btn btn-sm btn-danger" data-url="{{url('admin/video_course_type/set_status?'.http_build_query(['id'=>$a['id'],'status'=>'1']))}}">
+										停用
+									</a>
+								@endif
+							@endif
+						</td>
+					</tr>
+					@endforeach
+					<tr>
+						<td colspan="20" class="page">{{$list->render()}}</td>
+					</tr>
+					<tr>
+						<td colspan="20">总计 {{$list->total()}} 个类型</td>
+					</tr>
+				</tbody>
+
+			</table>
+		</div>
+	</div>
+</div>
+@endsection

+ 84 - 0
resources/views/admin/video_exam_answer/index.blade.php

@@ -0,0 +1,84 @@
+@extends('admin.public.base')
+@section('body_class')
+style="margin: 0 auto;width: 96%;padding: 30px 0px;"
+@endsection
+@section('content')
+
+<form action="" method="get" class="form-horizontal form-line">
+	<div class="form-group col col-lg-2 col-md-2 col-sm-2 col-xs-12" style="margin-right: 2px;">
+		<input type="text" class="form-control" name="record_id" value="{{request('record_id','')}}" placeholder="请输入记录ID查询" />
+	</div>
+	<div class="form-group col col-lg-2 col-md-4 col-sm-6 col-xs-12" style="margin-right: 2px;">
+		<select name="course_id" class="form-control selectpicker" data-live-search="true" data-live-search-placeholder="搜索课程名称" data-none-results-text="未搜索到 {0}" title="选择课程名称">
+			<option value="0" @if( 0 == request('course_id',0) ) selected @endif>不限课程</option>
+			@foreach ($courseList as $value)
+				<option value="{{$value['id']}}" @if( $value['id'] == request('course_id',0) ) selected @endif>{{$value['name']}}</option>
+			@endforeach
+		</select>
+	</div>
+	<div class="form-group col col-lg-2 col-md-2 col-sm-2 col-xs-12" style="margin-right: 2px;">
+		<input type="text" class="form-control" name="custom_code" value="{{request('custom_code','')}}" placeholder="请输入客户编码查询" />
+	</div>
+	<div class="form-group col col-lg-2 col-md-2 col-sm-2 col-xs-12" style="margin-right: 2px;">
+		<input type="text" class="form-control" name="custom_name" value="{{request('custom_name','')}}" placeholder="请输入客户昵称查询" />
+	</div>
+	<input type="submit" class="btn btn-sm btn-primary" value="查询"/>
+	<a href="{{url('admin/video_learn_question/index')}}" class="btn btn-sm btn-default" >重置</a>
+</form>
+
+<div class="row">
+	<div class="col-xs-12">	
+		<div class="table-responsive">
+			<table class="table table-striped table-bordered table-hover">
+				<thead>
+					<tr>
+						<th>ID</th>
+						<th>课程名称</th>
+						<th>客户编码</th>
+						<th>客户昵称</th>
+						<th>习题ID</th>
+						<th>习题题目</th>
+						<th>正确与否</th>
+						<th>所得积分</th>
+						<th>答题时间</th>
+						<th>操作</th>									
+					</tr>
+				</thead>
+				
+				<tbody>
+						@foreach ($list as $a)
+						<tr>
+							<th>{{$a['id']}}</th>
+							<td>{{$a['course_name']}}</td>
+							<td>{{$a['custom_code']}}</td>
+							<td>{{$a['custom_name']}}</td>
+							<td>{{$a['question_name']}}</td>
+							<td>
+								@foreach ($a['answer_list'] as $v)
+								<p>
+									{{$v['value']}} 
+									@if($v['is_answer']) 【答案】 @endif
+								</p>
+								@endforeach
+							</td>
+							<td>{{$a['is_answer']?'答对':'答错'}}</td>
+							<td>{{$a['get_score']}}</td>
+							<td> {{date('Y/m/d H:i:s',$a['insert_time'])}}</td>
+							<td>
+								
+							</td>							
+						</tr>  
+						@endforeach
+						<tr>
+							<td colspan="20" class="page">{{$list->render()}}</td>
+						</tr>
+						<tr>
+							<td colspan="20">总计 {{$list->total()}} 个记录</td>
+						</tr>
+				</tbody>
+				
+			</table>
+		</div>
+	</div>
+</div>
+@endsection

+ 0 - 0
resources/views/admin/video_course_question/add.blade.php → resources/views/admin/video_exam_question/add.blade.php


+ 0 - 0
resources/views/admin/video_course_question/edit.blade.php → resources/views/admin/video_exam_question/edit.blade.php


+ 8 - 10
resources/views/admin/video_play_question/index.blade.php → resources/views/admin/video_exam_question/index.blade.php

@@ -4,9 +4,9 @@ style="margin: 0 auto;width: 96%;padding: 30px 0px;"
 @endsection
 @section('content')
 
-@if(check_auth('admin/video_play_question/add'))
+@if(check_auth('admin/video_exam_question/add'))
 	<div class="page-header">
-		<a href="{{url('admin/video_play_question/add?'.http_build_query(['course_id'=>request('course_id',0)]))}}" class="btn btn-primary">新增</a>
+		<a href="{{url('admin/video_exam_question/add?'.http_build_query(['course_id'=>request('course_id',0)]))}}" class="btn btn-primary">新增</a>
 	</div>
 @endif
 
@@ -28,7 +28,7 @@ style="margin: 0 auto;width: 96%;padding: 30px 0px;"
 		</select>
 	</div>
 	<input type="submit" class="btn btn-sm btn-primary" value="查询"/>
-	<a href="{{url('admin/video_play_question/index')}}" class="btn btn-sm btn-default" >重置</a>
+	<a href="{{url('admin/video_exam_question/index')}}" class="btn btn-sm btn-default" >重置</a>
 </form>
 
 <div class="row">
@@ -39,7 +39,6 @@ style="margin: 0 auto;width: 96%;padding: 30px 0px;"
 					<tr>
 						<th>ID</th>
 						<th>课程名称</th>
-						<th>出题时间</th>
 						<th>习题题目</th>
 						<th>状态</th>
 						<th>修改时间</th>
@@ -52,7 +51,6 @@ style="margin: 0 auto;width: 96%;padding: 30px 0px;"
 						<tr>
 							<th>{{$a['id']}}</th>
 							<td>{{$a['course_name']}}</td>
-							<td>{{$a['play_time']}}</td>
 							<td>{{$a['question_title']}}</td>
 							<td>
 								@if( $a['status'] )
@@ -63,14 +61,14 @@ style="margin: 0 auto;width: 96%;padding: 30px 0px;"
 							</td>
 							<td> {{date('Y/m/d H:i:s',$a['update_time'])}}</td>
 							<td>
-								@if(check_auth('admin/video_play_question/edit'))
-								<a href="{{url('admin/video_play_question/edit?'.http_build_query(['id'=>$a['id']]))}}" class="btn btn-sm btn-warning" >编辑</a>
+								@if(check_auth('admin/video_exam_question/edit'))
+								<a href="{{url('admin/video_exam_question/edit?'.http_build_query(['id'=>$a['id']]))}}" class="btn btn-sm btn-warning" >编辑</a>
 								@endif
-								@if(check_auth('admin/video_play_question/set_status'))
+								@if(check_auth('admin/video_exam_question/set_status'))
 									@if($a['status'])
-									<a data-url="{{url('admin/video_play_question/set_status?'.http_build_query(['id'=>$a['id'],'status'=>0]))}}" class="set_status btn btn-sm btn-success" >启用</a>
+									<a data-url="{{url('admin/video_exam_question/set_status?'.http_build_query(['id'=>$a['id'],'status'=>0]))}}" class="set_status btn btn-sm btn-success" >启用</a>
 									@else
-									<a data-url="{{url('admin/video_play_question/set_status?'.http_build_query(['id'=>$a['id'],'status'=>1]))}}" class="set_status btn btn-sm btn-danger" >停用</a>
+									<a data-url="{{url('admin/video_exam_question/set_status?'.http_build_query(['id'=>$a['id'],'status'=>1]))}}" class="set_status btn btn-sm btn-danger" >停用</a>
 									@endif
 								@endif
 							</td>							

+ 78 - 0
resources/views/admin/video_exam_record/index.blade.php

@@ -0,0 +1,78 @@
+@extends('admin.public.base')
+@section('body_class')
+style="margin: 0 auto;width: 96%;padding: 30px 0px;"
+@endsection
+@section('content')
+
+<form action="" method="get" class="form-horizontal form-line">
+	<div class="form-group col col-lg-2 col-md-4 col-sm-6 col-xs-12" style="margin-right: 2px;">
+		<select name="course_id" class="form-control selectpicker" data-live-search="true" data-live-search-placeholder="搜索课程名称" data-none-results-text="未搜索到 {0}" title="选择课程名称">
+			<option value="0" @if( 0 == request('course_id',0) ) selected @endif>不限课程</option>
+			@foreach ($courseList as $value)
+				<option value="{{$value['id']}}" @if( $value['id'] == request('course_id',0) ) selected @endif>{{$value['name']}}</option>
+			@endforeach
+		</select>
+	</div>
+	<div class="form-group col col-lg-2 col-md-2 col-sm-2 col-xs-12" style="margin-right: 2px;">
+		<input type="text" class="form-control" name="custom_code" value="{{request('custom_code','')}}" placeholder="请输入客户编码查询" />
+	</div>
+	<div class="form-group col col-lg-2 col-md-2 col-sm-2 col-xs-12" style="margin-right: 2px;">
+		<input type="text" class="form-control" name="custom_name" value="{{request('custom_name','')}}" placeholder="请输入客户昵称查询" />
+	</div>
+	<input type="submit" class="btn btn-sm btn-primary" value="查询"/>
+	<a href="{{url('admin/video_learn_question/index')}}" class="btn btn-sm btn-default" >重置</a>
+</form>
+
+<div class="row">
+	<div class="col-xs-12">	
+		<div class="table-responsive">
+			<table class="table table-striped table-bordered table-hover">
+				<thead>
+					<tr>
+						<th>ID</th>
+						<th>课程名称</th>
+						<th>客户编码</th>
+						<th>客户昵称</th>
+						<th>正确率</th>
+						<th>所得积分</th>
+						<th>答题时长</th>
+						<th>开始时间</th>
+						<th>结束时间</th>
+						<th>操作</th>									
+					</tr>
+				</thead>
+				
+				<tbody>
+						@foreach ($list as $a)
+						<tr>
+							<th>{{$a['id']}}</th>
+							<td>{{$a['course_name']}}</td>
+							<td>{{$a['custom_code']}}</td>
+							<td>{{$a['custom_name']}}</td>
+							<td>{{$a['right_ratio']}}%</td>
+							<td>{{$a['get_score']}}</td>
+							<td>{{$a['exam_time']}}</td>
+							<td> {{date('Y/m/d H:i:s',$a['start_time'])}}</td>
+							<td> {{$a['end_time'] ? date('Y/m/d H:i:s',$a['end_time']) : ''}}</td>
+							<td>
+								@if( check_auth('admin/video_exam_answer/edit') )
+								<a class="btn btn-sm btn-primary" href="{{url('admin/video_exam_answer/index?'.http_build_query(['course_id'=>$a['course_id'],'record_id'=>$a['id']]))}}" title="答题记录">
+								课后答题记录
+								</a>
+								@endif
+							</td>
+						</tr>  
+						@endforeach
+						<tr>
+							<td colspan="20" class="page">{{$list->render()}}</td>
+						</tr>
+						<tr>
+							<td colspan="20">总计 {{$list->total()}} 个记录</td>
+						</tr>
+				</tbody>
+				
+			</table>
+		</div>
+	</div>
+</div>
+@endsection

+ 84 - 0
resources/views/admin/video_learn_answer/index.blade.php

@@ -0,0 +1,84 @@
+@extends('admin.public.base')
+@section('body_class')
+style="margin: 0 auto;width: 96%;padding: 30px 0px;"
+@endsection
+@section('content')
+
+<form action="" method="get" class="form-horizontal form-line">
+	<div class="form-group col col-lg-2 col-md-2 col-sm-2 col-xs-12" style="margin-right: 2px;">
+		<input type="text" class="form-control" name="record_id" value="{{request('record_id','')}}" placeholder="请输入记录ID查询" />
+	</div>
+	<div class="form-group col col-lg-2 col-md-4 col-sm-6 col-xs-12" style="margin-right: 2px;">
+		<select name="course_id" class="form-control selectpicker" data-live-search="true" data-live-search-placeholder="搜索课程名称" data-none-results-text="未搜索到 {0}" title="选择课程名称">
+			<option value="0" @if( 0 == request('course_id',0) ) selected @endif>不限课程</option>
+			@foreach ($courseList as $value)
+				<option value="{{$value['id']}}" @if( $value['id'] == request('course_id',0) ) selected @endif>{{$value['name']}}</option>
+			@endforeach
+		</select>
+	</div>
+	<div class="form-group col col-lg-2 col-md-2 col-sm-2 col-xs-12" style="margin-right: 2px;">
+		<input type="text" class="form-control" name="custom_code" value="{{request('custom_code','')}}" placeholder="请输入客户编码查询" />
+	</div>
+	<div class="form-group col col-lg-2 col-md-2 col-sm-2 col-xs-12" style="margin-right: 2px;">
+		<input type="text" class="form-control" name="custom_name" value="{{request('custom_name','')}}" placeholder="请输入客户昵称查询" />
+	</div>
+	<input type="submit" class="btn btn-sm btn-primary" value="查询"/>
+	<a href="{{url('admin/video_learn_question/index')}}" class="btn btn-sm btn-default" >重置</a>
+</form>
+
+<div class="row">
+	<div class="col-xs-12">	
+		<div class="table-responsive">
+			<table class="table table-striped table-bordered table-hover">
+				<thead>
+					<tr>
+						<th>ID</th>
+						<th>课程名称</th>
+						<th>客户编码</th>
+						<th>客户昵称</th>
+						<th>习题ID</th>
+						<th>习题题目</th>
+						<th>正确与否</th>
+						<th>所得积分</th>
+						<th>答题时间</th>
+						<th>操作</th>									
+					</tr>
+				</thead>
+				
+				<tbody>
+						@foreach ($list as $a)
+						<tr>
+							<th>{{$a['id']}}</th>
+							<td>{{$a['course_name']}}</td>
+							<td>{{$a['custom_code']}}</td>
+							<td>{{$a['custom_name']}}</td>
+							<td>{{$a['question_name']}}</td>
+							<td>
+								@foreach ($a['answer_list'] as $v)
+								<p>
+									{{$v['value']}} 
+									@if($v['is_answer']) 【答案】 @endif
+								</p>
+								@endforeach
+							</td>
+							<td>{{$a['is_answer']?'答对':'答错'}}</td>
+							<td>{{$a['get_score']}}</td>
+							<td> {{date('Y/m/d H:i:s',$a['insert_time'])}}</td>
+							<td>
+								
+							</td>							
+						</tr>  
+						@endforeach
+						<tr>
+							<td colspan="20" class="page">{{$list->render()}}</td>
+						</tr>
+						<tr>
+							<td colspan="20">总计 {{$list->total()}} 个记录</td>
+						</tr>
+				</tbody>
+				
+			</table>
+		</div>
+	</div>
+</div>
+@endsection

+ 0 - 0
resources/views/admin/video_play_question/add.blade.php → resources/views/admin/video_learn_question/add.blade.php


+ 0 - 0
resources/views/admin/video_play_question/edit.blade.php → resources/views/admin/video_learn_question/edit.blade.php


+ 10 - 8
resources/views/admin/video_course_question/index.blade.php → resources/views/admin/video_learn_question/index.blade.php

@@ -4,9 +4,9 @@ style="margin: 0 auto;width: 96%;padding: 30px 0px;"
 @endsection
 @section('content')
 
-@if(check_auth('admin/video_course_question/add'))
+@if(check_auth('admin/video_learn_question/add'))
 	<div class="page-header">
-		<a href="{{url('admin/video_course_question/add?'.http_build_query(['course_id'=>request('course_id',0)]))}}" class="btn btn-primary">新增</a>
+		<a href="{{url('admin/video_learn_question/add?'.http_build_query(['course_id'=>request('course_id',0)]))}}" class="btn btn-primary">新增</a>
 	</div>
 @endif
 
@@ -28,7 +28,7 @@ style="margin: 0 auto;width: 96%;padding: 30px 0px;"
 		</select>
 	</div>
 	<input type="submit" class="btn btn-sm btn-primary" value="查询"/>
-	<a href="{{url('admin/video_course_question/index')}}" class="btn btn-sm btn-default" >重置</a>
+	<a href="{{url('admin/video_learn_question/index')}}" class="btn btn-sm btn-default" >重置</a>
 </form>
 
 <div class="row">
@@ -39,6 +39,7 @@ style="margin: 0 auto;width: 96%;padding: 30px 0px;"
 					<tr>
 						<th>ID</th>
 						<th>课程名称</th>
+						<th>出题时间</th>
 						<th>习题题目</th>
 						<th>状态</th>
 						<th>修改时间</th>
@@ -51,6 +52,7 @@ style="margin: 0 auto;width: 96%;padding: 30px 0px;"
 						<tr>
 							<th>{{$a['id']}}</th>
 							<td>{{$a['course_name']}}</td>
+							<td>{{$a['play_time']}}</td>
 							<td>{{$a['question_title']}}</td>
 							<td>
 								@if( $a['status'] )
@@ -61,14 +63,14 @@ style="margin: 0 auto;width: 96%;padding: 30px 0px;"
 							</td>
 							<td> {{date('Y/m/d H:i:s',$a['update_time'])}}</td>
 							<td>
-								@if(check_auth('admin/video_course_question/edit'))
-								<a href="{{url('admin/video_course_question/edit?'.http_build_query(['id'=>$a['id']]))}}" class="btn btn-sm btn-warning" >编辑</a>
+								@if(check_auth('admin/video_learn_question/edit'))
+								<a href="{{url('admin/video_learn_question/edit?'.http_build_query(['id'=>$a['id']]))}}" class="btn btn-sm btn-warning" >编辑</a>
 								@endif
-								@if(check_auth('admin/video_course_question/set_status'))
+								@if(check_auth('admin/video_learn_question/set_status'))
 									@if($a['status'])
-									<a data-url="{{url('admin/video_course_question/set_status?'.http_build_query(['id'=>$a['id'],'status'=>0]))}}" class="set_status btn btn-sm btn-success" >启用</a>
+									<a data-url="{{url('admin/video_learn_question/set_status?'.http_build_query(['id'=>$a['id'],'status'=>0]))}}" class="set_status btn btn-sm btn-success" >启用</a>
 									@else
-									<a data-url="{{url('admin/video_course_question/set_status?'.http_build_query(['id'=>$a['id'],'status'=>1]))}}" class="set_status btn btn-sm btn-danger" >停用</a>
+									<a data-url="{{url('admin/video_learn_question/set_status?'.http_build_query(['id'=>$a['id'],'status'=>1]))}}" class="set_status btn btn-sm btn-danger" >停用</a>
 									@endif
 								@endif
 							</td>							

+ 80 - 0
resources/views/admin/video_learn_record/index.blade.php

@@ -0,0 +1,80 @@
+@extends('admin.public.base')
+@section('body_class')
+style="margin: 0 auto;width: 96%;padding: 30px 0px;"
+@endsection
+@section('content')
+
+<form action="" method="get" class="form-horizontal form-line">
+	<div class="form-group col col-lg-2 col-md-4 col-sm-6 col-xs-12" style="margin-right: 2px;">
+		<select name="course_id" class="form-control selectpicker" data-live-search="true" data-live-search-placeholder="搜索课程名称" data-none-results-text="未搜索到 {0}" title="选择课程名称">
+			<option value="0" @if( 0 == request('course_id',0) ) selected @endif>不限课程</option>
+			@foreach ($courseList as $value)
+				<option value="{{$value['id']}}" @if( $value['id'] == request('course_id',0) ) selected @endif>{{$value['name']}}</option>
+			@endforeach
+		</select>
+	</div>
+	<div class="form-group col col-lg-2 col-md-2 col-sm-2 col-xs-12" style="margin-right: 2px;">
+		<input type="text" class="form-control" name="custom_code" value="{{request('custom_code','')}}" placeholder="请输入客户编码查询" />
+	</div>
+	<div class="form-group col col-lg-2 col-md-2 col-sm-2 col-xs-12" style="margin-right: 2px;">
+		<input type="text" class="form-control" name="custom_name" value="{{request('custom_name','')}}" placeholder="请输入客户昵称查询" />
+	</div>
+	<input type="submit" class="btn btn-sm btn-primary" value="查询"/>
+	<a href="{{url('admin/video_learn_question/index')}}" class="btn btn-sm btn-default" >重置</a>
+</form>
+
+<div class="row">
+	<div class="col-xs-12">	
+		<div class="table-responsive">
+			<table class="table table-striped table-bordered table-hover">
+				<thead>
+					<tr>
+						<th>ID</th>
+						<th>课程名称</th>
+						<th>客户编码</th>
+						<th>客户昵称</th>
+						<th>正确率</th>
+						<th>所得积分</th>
+						<th>视频学习开始时间</th>
+						<th>视频学习结束时间</th>
+						<th>开始时间</th>
+						<th>结束时间</th>
+						<th>操作</th>									
+					</tr>
+				</thead>
+				
+				<tbody>
+						@foreach ($list as $a)
+						<tr>
+							<th>{{$a['id']}}</th>
+							<td>{{$a['course_name']}}</td>
+							<td>{{$a['custom_code']}}</td>
+							<td>{{$a['custom_name']}}</td>
+							<td>{{$a['right_ratio']}}%</td>
+							<td>{{$a['get_score']}}</td>
+							<td>{{$a['video_inittime']}}</td>
+							<td>{{$a['video_lasttime']}}</td>
+							<td> {{date('Y/m/d H:i:s',$a['start_time'])}}</td>
+							<td> {{$a['end_time'] ? date('Y/m/d H:i:s',$a['end_time']) : ''}}</td>
+							<td>
+								@if( check_auth('admin/video_learn_answer/edit') )
+								<a class="btn btn-sm btn-primary" href="{{url('admin/video_learn_answer/index?'.http_build_query(['course_id'=>$a['course_id'],'record_id'=>$a['id']]))}}" title="答题记录">
+									课中答题记录
+								</a>
+								@endif
+							</td>							
+						</tr>  
+						@endforeach
+						<tr>
+							<td colspan="20" class="page">{{$list->render()}}</td>
+						</tr>
+						<tr>
+							<td colspan="20">总计 {{$list->total()}} 个记录</td>
+						</tr>
+				</tbody>
+				
+			</table>
+		</div>
+	</div>
+</div>
+@endsection

+ 34 - 1
routes/api.php

@@ -271,8 +271,41 @@ Route::any('riddle_active_share/add',[\App\Http\Controllers\Api\Riddle\ActiveSha
 Route::any('riddle_answer/check_answer',[\App\Http\Controllers\Api\Riddle\Answer::class,'check_answer']);
 
 /**
- * 文章详情
+ * 文章资讯
  */
 Route::any('article/get_list',[App\Http\Controllers\Api\Article\Comment::class,'get_list']);
 Route::any('article/get_detail',[App\Http\Controllers\Api\Article\Comment::class,'get_detail']);
 Route::any('article/update_event',[App\Http\Controllers\Api\Article\Comment::class,'update_event']);
+
+
+/**
+ * 视频课程
+ */
+Route::any('video_course/get_list',[App\Http\Controllers\Api\Video\Course::class,'get_list']);
+Route::any('video_course/get_detail',[App\Http\Controllers\Api\Video\Course::class,'get_detail']);
+
+/**
+ * 更新播放时间
+ * 
+ */
+Route::any('video_learn_record/update_playtime',[App\Http\Controllers\Api\Video\LearnRecord::class,'update_playtime']);
+
+/**
+ * 课中习题
+ */
+Route::any('video_learn_answer/play_exam',[App\Http\Controllers\Api\Video\LearnAnswer::class,'play_exam']);
+
+
+/**
+ * 课后评测习题
+ * 
+ */
+Route::any('video_exam_question/get_list',[App\Http\Controllers\Api\Video\ExamQuestion::class,'get_list']);
+
+/**
+ * 评测报告
+ * 
+ */
+Route::any('video_exam_record/hand_in',[App\Http\Controllers\Api\Video\ExamRecord::class,'hand_in']);
+Route::any('video_exam_record/get_report',[App\Http\Controllers\Api\Video\ExamRecord::class,'get_report']);
+Route::any('video_exam_record/get_report_last',[App\Http\Controllers\Api\Video\ExamRecord::class,'get_report_last']);

+ 32 - 8
routes/web.php

@@ -659,6 +659,17 @@ Route::middleware('admin')->prefix('admin')->group(function(){
     // 状态
     Route::any('riddle_answer/set_answer',[App\Http\Controllers\Admin\RiddleAnswer::class,'set_answer']);
 
+    /* 视频课程类型管理 */
+    // 文章
+    Route::any('video_course_type/index',[App\Http\Controllers\Admin\VideoCourseType::class,'index']);
+    // 新增
+    Route::any('video_course_type/add',[App\Http\Controllers\Admin\VideoCourseType::class,'add']);
+    // 编辑
+    Route::any('video_course_type/edit',[App\Http\Controllers\Admin\VideoCourseType::class,'edit']);
+    // 状态
+    Route::any('video_course_type/set_status',[App\Http\Controllers\Admin\VideoCourseType::class,'set_status']);
+    // 状态
+    Route::any('video_course_type/get_sign_url',[App\Http\Controllers\Admin\VideoCourseType::class,'get_sign_url']);
 
     /* 视频课程管理 */
     // 文章
@@ -695,21 +706,34 @@ Route::middleware('admin')->prefix('admin')->group(function(){
 
     /* 课中习题 */
     // 列表
-    Route::any('video_play_question/index',[App\Http\Controllers\Admin\VideoPlayQuestion::class,'index']);
+    Route::any('video_learn_question/index',[App\Http\Controllers\Admin\VideoLearnQuestion::class,'index']);
     // 详情
-    Route::any('video_play_question/add',[App\Http\Controllers\Admin\VideoPlayQuestion::class,'add']);
+    Route::any('video_learn_question/add',[App\Http\Controllers\Admin\VideoLearnQuestion::class,'add']);
     // 详情
-    Route::any('video_play_question/edit',[App\Http\Controllers\Admin\VideoPlayQuestion::class,'edit']);
+    Route::any('video_learn_question/edit',[App\Http\Controllers\Admin\VideoLearnQuestion::class,'edit']);
     // 状态
-    Route::any('video_play_question/set_answer',[App\Http\Controllers\Admin\VideoPlayQuestion::class,'set_answer']);
+    Route::any('video_learn_question/set_status',[App\Http\Controllers\Admin\VideoLearnQuestion::class,'set_status']);
 
     /* 课后习题 */
     // 列表
-    Route::any('video_course_question/index',[App\Http\Controllers\Admin\VideoCourseQuestion::class,'index']);
+    Route::any('video_exam_question/index',[App\Http\Controllers\Admin\VideoExamQuestion::class,'index']);
     // 详情
-    Route::any('video_course_question/add',[App\Http\Controllers\Admin\VideoCourseQuestion::class,'add']);
+    Route::any('video_exam_question/add',[App\Http\Controllers\Admin\VideoExamQuestion::class,'add']);
     // 详情
-    Route::any('video_course_question/edit',[App\Http\Controllers\Admin\VideoCourseQuestion::class,'edit']);
+    Route::any('video_exam_question/edit',[App\Http\Controllers\Admin\VideoExamQuestion::class,'edit']);
     // 状态
-    Route::any('video_course_question/set_answer',[App\Http\Controllers\Admin\VideoCourseQuestion::class,'set_answer']);
+    Route::any('video_exam_question/set_status',[App\Http\Controllers\Admin\VideoExamQuestion::class,'set_status']);
+
+
+    /* 学习记录 */
+    Route::any('video_learn_record/index',[App\Http\Controllers\Admin\VideoLearnRecord::class,'index']);
+    /* 学习答题记录 */
+    Route::any('video_learn_answer/index',[App\Http\Controllers\Admin\VideoLearnAnswer::class,'index']);
+
+    /* 评测记录 */
+    Route::any('video_exam_record/index',[App\Http\Controllers\Admin\VideoExamRecord::class,'index']);
+    /* 评测答题记录 */
+    Route::any('video_exam_answer/index',[App\Http\Controllers\Admin\VideoExamAnswer::class,'index']);
+
+
 });