<?php namespace app\mobile\controller; use think\Validate; use think\Db; use app\common\controller\Api; use app\mobile\model\Question; use app\mobile\model\Simulation; use app\mobile\model\Old; use app\mobile\model\Everyday; use app\mobile\model\Secret; use app\mobile\model\QuestionAnswer; use app\mobile\model\QuestionNote; use app\mobile\model\QuestionWrong; use app\mobile\model\QuestionCollect; use addons\qiniu\library\Auth; /** * 全能题库接口 * @ApiWeigh (98) */ class Almighty extends Api { protected $noNeedLogin = []; protected $noNeedRight = ['*']; public function _initialize() { parent::_initialize(); } /** * @ApiTitle (全能题库-题目列表) * @ApiSummary (全能题库-题目列表) * @ApiMethod (POST) * * @ApiHeaders (name=token, type=string, required=true, description="请求的Token") * * @ApiParams (name="answer_type", type="string", required=true, description="作答类型:0=全部,1=已答题,2=未答题,3=错题") * @ApiParams (name="question_type", type="string", required=true, description="试题题型:0=全部,1=单选题,2=多选题,3=判断题,4=简答题") * * @ApiReturn({ "code": 1, "msg": "成功", "time": "1599032660", "data": { "total": 1, //题目总数 "list": [{ //题目列表 "id": 1, //题目ID "title": "测定混凝土立方体抗压强度时,标准试件的尺寸是( )㎜。", //题目 "option": "[{\"name\":\"A\",\"gender\":\"100\\u00d7100\\u00d7100\"},{\"name\":\"B\",\"gender\":\"150\\u00d7150\\u00d7150\"},{\"name\":\"C\",\"gender\":\"200\\u00d7200\\u00d7200\"},{\"name\":\"D\",\"gender\":\"70.7\\u00d770.7\\u00d770.7\"}]", //题目选项 "type": "1", //题目类型:1=单选题,2=多选题,3=判断题,4=简答题 "answer": "A", //答案 "note": "笔记", //笔记 "is_collect": "1" //是否收藏:0=否,1=是 }] } }) */ public function questionList() { $user_id = $this->auth->id; $answer_type = $this->request->param('answer_type'); $question_type = $this->request->param('question_type'); $where['q.target_type'] = '1'; switch ($answer_type) { case '1': $question_id_arr = QuestionAnswer::where('user_id',$user_id)->column('question_id'); $where['q.id'] = !empty($question_id_arr) ? ['in',$question_id_arr] : 0; break; case '2': $question_id_arr = QuestionAnswer::where('user_id',$user_id)->column('question_id'); if(!empty($question_id_arr)){ $where['q.id'] = ['notin',$question_id_arr]; } break; case '3': $question_id_arr = QuestionAnswer::where('user_id',$user_id)->where('is_wrong','1')->column('question_id'); $where['q.id'] = !empty($question_id_arr) ? ['in',$question_id_arr] : 0; break; } if(!empty($question_type)){ $where['q.type'] = $question_type; } $list = Question::alias('q') ->join('mobile_question_note qn','q.id = qn.question_id and qn.user_id='.$user_id,'left') ->join('mobile_question_collect qc','q.id = qc.question_id and qc.user_id='.$user_id,'left') ->where($where) ->field(' q.id, q.title, q.option, q.type, q.answer, qn.content note, if(qc.id > 0,1,0) is_collect ')->orderRaw('rand()')->limit(100) // 随机100道题目 ->select(); $total = count($list); $this->success('成功',compact('total','list')); } /** * @ApiTitle (全能题库-题目列表-详情) * @ApiSummary (全能题库-题目列表-详情) * @ApiMethod (POST) * * @ApiHeaders (name=token, type=string, required=true, description="请求的Token") * * @ApiParams (name="question_id", type="int", required=true, description="题目ID") * * @ApiReturn({ "code": 1, "msg": "成功", "time": "1599032660", "data": { "id": 1, //题目ID "title": "测定混凝土立方体抗压强度时,标准试件的尺寸是( )㎜。", //题目 "option": "[{\"name\":\"A\",\"gender\":\"100\\u00d7100\\u00d7100\"},{\"name\":\"B\",\"gender\":\"150\\u00d7150\\u00d7150\"},{\"name\":\"C\",\"gender\":\"200\\u00d7200\\u00d7200\"},{\"name\":\"D\",\"gender\":\"70.7\\u00d770.7\\u00d770.7\"}]", //题目选项 "type": "1", //题目类型:1=单选题,2=多选题,3=判断题,4=简答题 "answer": "A", //答案 "note": "笔记", //笔记 "is_collect": "1", //是否收藏:0=否,1=是 "status": "1" //状态:0=未答,1=答对,2=答错 "my_answer": "1", //我的答案 } }) */ public function questionInfo() { $user_id = $this->auth->id; $question_id = $this->request->param('question_id'); empty($question_id) && $this->error('缺少必要参数'); $info = Question::alias('q') ->join('mobile_question_note qn','q.id = qn.question_id and qn.user_id='.$user_id,'left') ->join('mobile_question_collect qc','q.id = qc.question_id and qc.user_id='.$user_id,'left') ->join('mobile_question_answer qa','q.id = qa.question_id and qa.user_id='.$user_id,'left') ->where('q.id',$question_id) ->field(' q.id, q.title, q.option, q.type, q.answer, q.analysis_video, q.analysis_text, qn.content note, if(qc.id > 0,1,0) is_collect, if(qa.id > 0,if(qa.is_wrong="0",1,2),0) status, qa.content my_answer ')->find(); $this->success('成功',$info); } /** * @ApiTitle (全能题库-答题) * @ApiSummary (全能题库-答题) * @ApiMethod (POST) * * @ApiHeaders (name=token, type=string, required=true, description="请求的Token") * * @ApiParams (name="question_id", type="int", required=true, description="题目ID") * @ApiParams (name="answer", type="string", required=true, description="回答内容") * * @ApiReturn({ "code": 1, "msg": "成功", "time": "1599032660", "data": null }) */ public function answer() { $question_id = $this->request->param('question_id'); $answer = $this->request->param('answer'); if(empty($question_id) || empty($answer)){ $this->error('缺少必要参数'); } $question = Question::get($question_id); empty($question) && $this->error('题目信息不存在'); $info = QuestionAnswer::get(['question_id'=>$question_id,'user_id'=>$this->auth->id]); if(empty($info)){ $info = new QuestionAnswer(); } // 记录答案 $score = 0; $is_wrong = '0'; if($question['type'] != '4'){ if($question['answer'] == $answer){ $score = $question['score']; }else{ $is_wrong = '1'; } } $info->allowField(true)->save([ 'question_id' => $question_id, 'user_id' => $this->auth->id, 'content' => $answer, 'is_wrong' => $is_wrong, 'get_score' => $score ]); $this->success('回答成功'); } /** * @ApiTitle (全能题库-查看解析) * @ApiSummary (全能题库-查看解析) * @ApiMethod (POST) * * @ApiHeaders (name=token, type=string, required=true, description="请求的Token") * * @ApiParams (name="question_id", type="int", required=true, description="题目ID") * * @ApiReturn({ "code": 1, "msg": "成功", "time": "1600675472", "data": { "analysis_video": { //解析视频 "cover": "http://qizhibang.brotop.cn/uploads/20200921/Fkp1Dv0c4dyYfVzAFBjhTuv25BNv.mp4?vframe/jpg/offset/1/w/1280/h/720", //封面图 "video": "http://qizhibang.brotop.cn/uploads/20200921/Fkp1Dv0c4dyYfVzAFBjhTuv25BNv.mp4" //视频 }, "analysis_text": "" //解析文字 } }) */ public function analysis() { $question_id = $this->request->param('question_id'); empty($question_id) && $this->error('缺少必要参数'); $info = Question::get($question_id); empty($info) && $this->error('题目信息不存在'); $info->visible(['analysis_video','analysis_text']); $this->success('成功',$info); } /** * @ApiTitle (全能题库-笔记) * @ApiSummary (全能题库-笔记) * @ApiMethod (POST) * * @ApiHeaders (name=token, type=string, required=true, description="请求的Token") * * @ApiParams (name="question_id", type="int", required=true, description="题目ID") * @ApiParams (name="content", type="int", required=true, description="笔记内容") * * @ApiReturn({ "code": 1, "msg": "成功", "time": "1599032660", "data": null }) */ public function note() { $question_id = $this->request->param('question_id'); $content = $this->request->param('content'); empty($question_id) && $this->error('缺少必要参数'); empty($content) && $this->error('请填写笔记'); $info = QuestionNote::get(['question_id'=>$question_id,'user_id'=>$this->auth->id]); if(empty($info)){ $info = new QuestionNote(); } $info->allowField(true)->save([ 'question_id' => $question_id, 'user_id' => $this->auth->id, 'content' => $content ]); $this->success('添加笔记成功'); } /** * @ApiTitle (全能题库-报错) * @ApiSummary (全能题库-报错) * @ApiMethod (POST) * * @ApiHeaders (name=token, type=string, required=true, description="请求的Token") * * @ApiParams (name="question_id", type="int", required=true, description="题目ID") * @ApiParams (name="type", type="string", required=true, description="报错类型:1=答案不正确,2=题目不正确,3=解析不完整,4=其他错误") * @ApiParams (name="content", type="string", required=true, description="问题描述") * * @ApiReturn({ "code": 1, "msg": "成功", "time": "1599032660", "data": null }) */ public function wrong() { $question_id = $this->request->param('question_id'); $type = $this->request->param('type'); $content = $this->request->param('content'); empty($question_id) && $this->error('缺少必要参数'); empty($type) && $this->error('请选择报错类型'); empty($content) && $this->error('请填写问题描述'); $info = QuestionWrong::get(['question_id'=>$question_id,'user_id'=>$this->auth->id]); if(empty($info)){ $info = new QuestionWrong(); } $info->allowField(true)->save([ 'question_id' => $question_id, 'user_id' => $this->auth->id, 'type' => $type, 'content' => $content ]); $this->success('报错成功'); } /** * @ApiTitle (全能题库-收藏) * @ApiSummary (全能题库-收藏) * @ApiMethod (POST) * * @ApiHeaders (name=token, type=string, required=true, description="请求的Token") * * @ApiParams (name="question_id", type="int", required=true, description="题目ID") * * @ApiReturn({ "code": 1, "msg": "成功", "time": "1599032660", "data": null }) */ public function collect() { $question_id = $this->request->param('question_id'); empty($question_id) && $this->error('缺少必要参数'); $info = QuestionCollect::get(['question_id'=>$question_id,'user_id'=>$this->auth->id]); if(!empty($info)){ $info->delete(); $this->success('取消收藏成功'); } QuestionCollect::create([ 'question_id' => $question_id, 'user_id' => $this->auth->id, ]); $this->success('收藏成功'); } /** * @ApiTitle (智能搜题-语音转文字) * @ApiSummary (智能搜题-语音转文字) * @ApiMethod (POST) * * @ApiHeaders (name=token, type=string, required=true, description="请求的Token") * * @ApiParams (name="filename", type="string", required=true, description="文件地址") * * @ApiReturn({ "code": 1, "msg": "成功", "time": "1599130815", "data": [{ "id": 1, //题目ID "title": "测定混凝土立方体抗压强度时,标准试件的尺寸是( )㎜。", //题目 "type": "4", //题目类型:1=单选题,2=多选题,3=判断题,4=简答题 "option": "[{\"name\":\"A\",\"gender\":\"100\\u00d7100\\u00d7100\"},{\"name\":\"B\",\"gender\":\"150\\u00d7150\\u00d7150\"},{\"name\":\"C\",\"gender\":\"200\\u00d7200\\u00d7200\"},{\"name\":\"D\",\"gender\":\"70.7\\u00d770.7\\u00d770.7\"}]" //题目选项 }] }) */ public function getText() { $filename = $this->request->param('filename'); $res = $this->mp3ToPcm($filename); $this->success('成功'); } /** * @ApiTitle (智能搜题) * @ApiSummary (智能搜题) * @ApiMethod (POST) * * @ApiHeaders (name=token, type=string, required=true, description="请求的Token") * * @ApiParams (name="keyword", type="string", required=true, description="关键词") * @ApiParams (name="page", type="inter", required=false, description="当前页(默认1)") * @ApiParams (name="page_num", type="inter", required=false, description="每页显示数据个数(默认10)") * * @ApiReturn({ "code": 1, "msg": "成功", "time": "1599130815", "data": [{ "id": 1, //题目ID "title": "测定混凝土立方体抗压强度时,标准试件的尺寸是( )㎜。", //题目 "type": "4", //题目类型:1=单选题,2=多选题,3=判断题,4=简答题 "option": "[{\"name\":\"A\",\"gender\":\"100\\u00d7100\\u00d7100\"},{\"name\":\"B\",\"gender\":\"150\\u00d7150\\u00d7150\"},{\"name\":\"C\",\"gender\":\"200\\u00d7200\\u00d7200\"},{\"name\":\"D\",\"gender\":\"70.7\\u00d770.7\\u00d770.7\"}]" //题目选项 }] }) */ public function search() { $page = $this->request->param('page', 1, 'intval'); $page_num = $this->request->param('page_num', 10, 'intval'); $keyword = $this->request->param('keyword'); empty($keyword) && $this->error('缺少必要参数'); $list = Question::where('target_type','1') ->where('title','like','%'.$keyword.'%') ->field('id,title,type,option') ->page($page,$page_num) ->select(); $this->success('成功',$list); } /** * @ApiTitle (错题训练) * @ApiSummary (错题训练) * @ApiMethod (POST) * * @ApiHeaders (name=token, type=string, required=true, description="请求的Token") * * @ApiReturn({ "code": 1, "msg": "成功", "time": "1600678092", "data": { "banner": "http://www.enterprise.top/uploads/20200911/8894d62100f2f920ffb2f38063b63f2d.jpg", //广告图 "list": [{ // 试卷列表 "0": { "id": 11, "target_type": "1", "target_id": 0, "type": "3" }, "pan": 1, //判断题数 "duo": 0, //多选题数 "dan": 0, //单选题数 "title": "《全能题库》", //试卷标题 "type": "1", //题目归属类型:1=全能题库,2=模拟试题,3=历年真题,4=每日一练,5=通关密卷 "id": 0 //试卷ID(全能题库为0) }] } }) */ public function wrongQuestion() { $banner = Db::name('mobile_config')->where('id',1)->value('wrong_adver'); $banner = !empty($banner) ? cdnurl($banner,true) : ''; $question_list = Question::alias('q') ->join('mobile_question_answer qa','q.id = qa.question_id and user_id='.$this->auth->id,'left') ->where('qa.is_wrong','1') ->field('q.id,q.target_type,q.target_id,q.type') ->select(); $list = []; foreach ($question_list as $v) { $list[$v['target_id']][] = $v; } // 统计题目数 foreach ($list as &$v) { $v['dan'] = $v['duo'] = $v['pan'] = 0; foreach ($v as &$value) { switch ($value['type']) { case '1': $v['dan']++; break; case '2': $v['duo']++; break; case '3': $v['pan']++; break; } } switch ($v[0]['target_type']) { case '1': $v['title'] = '《全能题库》'; break; case '2': $v['title'] = Simulation::where('id',$v[0]['target_id'])->value('title'); break; case '3': $v['title'] = Old::where('id',$v[0]['target_id'])->value('title'); break; case '4': $v['title'] = Everyday::where('id',$v[0]['target_id'])->value('title'); break; case '5': $v['title'] = Secret::where('id',$v[0]['target_id'])->value('title'); break; } $v['type'] = $v[0]['target_type']; $v['id'] = $v[0]['target_id']; } $this->success('成功',compact('banner','list')); } /** * 上传接口 */ public function mp3ToPcm($filename) { $key = ltrim($filename,'/'); if(pathinfo($key,PATHINFO_EXTENSION) != 'mp3'){ return false; } $config = get_addon_config('qiniu'); $auth = new Auth($config['app_key'], $config['secret_key']); //设置转码参数 $fops = "avthumb/pcm/ab/192k"; //通过添加'|saveas'参数,指定处理后的文件保存的bucket和key 不指定默认保存在当前空间,bucket为目标空间,后一个参数为转码之后文件名 $filename = str_replace(strrchr($key, "."),"",$key); $entry = $config['bucket'] . ':' . $filename . '.pcm'; $saveas_key = $auth->base64_urlSafeEncode($entry); $fops = $fops.'|saveas/'.$saveas_key; $policy = array( 'persistentOps' => $fops ); $token = $auth->uploadToken($config['bucket'], null, $config['expire'], $policy); $multipart = [ ['name' => 'token', 'contents' => $token], [ 'name' => 'file', 'contents' => fopen(ROOT_PATH . '/public/' .$key, 'r'), 'filename' => $key, ] ]; try { $client = new \GuzzleHttp\Client(); $res = $client->request('POST', $config['uploadurl'], [ 'multipart' => $multipart ]); halt($res); $code = $res->getStatusCode(); //成功不做任何操作 } catch (\GuzzleHttp\Exception\ClientException $e) { return false; } return $code; } }