初始化项目:添加后端代码、ThinkPHP框架、前端资源

This commit is contained in:
amb
2026-09-03 12:42:39 +08:00
commit 482bece22e
3726 changed files with 416708 additions and 0 deletions
@@ -0,0 +1,273 @@
<?php
namespace app\api\controller\app\exam;
use app\common\controller\Api;
/**
* 练习
*/
class Exercises extends Api
{
protected $noNeedLogin = ["detail","getCourseBindExam"];
// 无需鉴权的接口,*表示全部
protected $noNeedRight = ['*'];
public function _initialize()
{
parent::_initialize();
$this->model = new \app\api\model\app\exam\Exercises();
$this->logModel = new \app\api\model\app\exam\ExercisesLog;
$this->exercisesSubscribeModel = new \app\api\model\app\exam\ExercisesSubscribe;
}
/**
* 获取练习详情
* @return void
*/
public function detail()
{
$id = input('id');
$data = $this->model->with(['course'])->where([
'exercises.id'=>$id
])->where([
'exercises.status'=>1
])->find();
if(!$data){
$this->error('获取练习详情信息错误,请重试');
}
if($data->course && $data->course->id){
//判断是否已经订阅
$data->course->is_subscription = \app\common\model\user\Subscription::getSubscriptionAuth($this->auth->id,$data->course->id);
$data->course->visible(['is_subscription','id','name','cover','pay_price','price','pay_type']);
$courseData = $data->course->toArray();
$courseType = $courseData['type'] ?? '';
$isVirtualPay = \app\common\library\pay\VirtualPayService::isUseVirtualPay($courseType);
$courseData['is_virtual_pay'] = $isVirtualPay ? 1 : 0;
if ($isVirtualPay) {
$courseData = \app\common\library\pay\VirtualPayService::convertPriceFields($courseData, ['price', 'pay_price']);
}
$data['course'] = $courseData;
} else {
$data['course'] = null;
}
$data->is_auth = \app\common\model\app\exam\ExercisesSubscribe::checkAuth($this->auth->id,$id);
$data->is_subscribe = \app\common\model\app\exam\ExercisesSubscribe::checkSubscribe($this->auth->id,$id);
$this->model->where(['id'=>$id])->setInc('views');
if(!$data['question_total_count']){
$data['question_total_count'] = $this->model->getExercisesQuestionCount($id);
}
$data['detail'] = \addons\alivod\library\Alivod::parseContentAliovdTag($data['detail']);
$data['is_virtual_pay'] = \app\common\library\pay\VirtualPayService::isUseVirtualPay('exercises');
if ($data['is_virtual_pay'] && isset($data['pay_price'])) {
$data['pay_price'] = \app\common\library\pay\VirtualPayService::convertPrice($data['pay_price']);
}
$this->success("获取成功",$data);
}
/**
* 获取课程关联的题库练习
* @return void
*/
public function getCourseBindExam(){
$courseId = $this->request->post('course_id');
$examIds = $this->model
->where([
'bind_course'=>$courseId,
'status'=>1
])
->column('id');
$query = \app\common\model\goods\Handle::getGoodsQuery();
$list = [];
if($examIds) {
$list = $query->where([
'id'=>['in',$examIds],
'type'=>'exercises'
])->select();
if($list){
foreach ($list as &$item){
$priceInfo = \app\common\model\goods\Handle::parseGoodsExtendInfo($item['id'],$item['type']);
$item = array_merge($item,$priceInfo);
}
}
}
$this->success("获取成功",$list);
}
/**
* 加入练习
* @return void
*/
public function subscribe(){
$id = input('id');
$data = $this->model->with(['course'])->where([
'exercises.id'=>$id
])->where([
'exercises.status'=>1
])->find();
if(!$data){
$this->error('该课程暂不可用,请重试');
}
$isAuth = \app\common\model\app\exam\ExercisesSubscribe::checkAuth($this->auth->id,$id);
if(!$isAuth){
$this->error('暂无使用该练习权限,请重试');
}
$isSubscribe = \app\common\model\app\exam\ExercisesSubscribe::checkSubscribe($this->auth->id,$id);
if($isSubscribe){
$this->error('已经订阅过了');
}
$type = $data['sales_type'] == 1 ? 'free' : 'bind_course';
\app\common\model\app\exam\ExercisesSubscribe::subscribe($this->auth->id,$id,$type);
$this->success("操作成功");
}
/**
* 获取订阅列表
* @return void
*/
public function getSubscribeList(){
$limit = input('limit',10);
$page = input('page',1);
$search = input('search');
$sort = input('sort','desc') == 'desc' ? 'desc' : 'asc';
$order = input('order');
$where = [
'user_id'=>$this->auth->id,
'exercises.status'=>1
];
$orderField = 'exercises_subscribe.createtime';
if(!empty($search)){
// $where['course.name'] = ['like',"%{$search}%"];
}
$rows = $this->exercisesSubscribeModel->with(['exercises']);
$list = $rows
->where($where)
->limit($limit)->page($page)
->order($orderField,$sort)
->select();
if(!empty($list)){
foreach ($list as $item){
//获取练习包含题目数量
$item->question_count = $this->model->getExercisesQuestionCount($item->exercises_id);
//获取已做的题目数量
$item->complete_question_count = $this->logModel->getCompleteQuestionCount($item->exercises_id);
//判断百分比
$item->complete_prop = !$item->complete_question_count ? 0 : ceil($item->question_count/$item->complete_question_count) * 100;
$item->exercises->visible(['type','sales_type','id','name','cover','pay_price','price','pay_type']);
}
}
$this->success('获取成功', $list);
}
/**
* 获取练习商品列表
* @return void
*/
public function getGoodsList(){
$limit = input('limit',10);
$page = input('page',1);
$search = input('search');
$groupId = input('group_id');
$sort = input('sort','desc') == 'desc' ? 'desc' : 'asc';
$order = input('order');
$sort = 'desc';
$where = [
'status'=>1,
'hide'=>0,
];
$orderField = 'createtime';
if(!empty($groupId)){
$where['group_id'] = $groupId;
}
$rows = $this->model;
$list = $rows
->where($where)
->limit($limit)->page($page)
->order($orderField,$sort)
->select();
if(!empty($list)){
foreach ($list as &$item){
$item->type = 'exercises';
switch ($item->sales_type){
case 1:
$item->pay_type = 'free';
break;
case 2:
$item->price = $item->pay_price;
$item->pay_type = 'pay';
break;
case 3:
$item->pay_type = 'bind_course';
break;
}
$item->visible(['type','sales_type','id','name','cover','pay_price','price','pay_type']);
}
}
$this->success('获取成功', $list);
}
/**
* 获取课程分组列表
* @return void
*/
public function group(){
$list = (new \app\api\model\app\exam\ExercisesGroup)->getList();
$this->success('返回成功', $list);
}
}