<?php /** * Created by PhpStorm. * User: zhonglei * Date: 17/10/17 * Time: 11:21 */ namespace Apicp\Controller\CourseData; use Com\PackageValidate; use Common\Common\Constant; use Common\Common\DataHelper; use Common\Model\CourseClassModel; use Common\Model\CourseArticleModel; use Common\Model\CourseCompleteModel; class ListController extends \Apicp\Controller\AbstractController { /** * List * @author zhonglei * @desc 课程数据列表接口 * @param Int class_id 分类ID * @param String article_title 课程名称 * @param Int created_start 发布时间戳 * @param Int created_end 发布时间戳 * @param Int page:1 当前页 * @param Int limit:20 每页数据总数 * @return array array( 'list' => array( // 列表数据 array( 'article_id' => 188, // 课程ID 'article_title' => '热烈庆祝十九大胜利召开', // 课程名称 'class_id' => 188, // 分类ID 'class_name' => '分类A', // 分类名称 'user_total' => 1000, // 课程总人数 'study_total' => 800, // 学习人数 'complete_total' => 800, // 完成学习人数 'complete_rate' => 80, // 完成率 'like_total' => 100, // 点赞数 'comment_total' => 200, // 评论数 'created' => 1509292800000, // 发布时间 ), ), 'page' => 100, // 当前页 'limit' => 100, // 每页数据总数 'total' => 100, // 数据总数 ) */ public function Index_post() { // 请求数据 $post_data = I('post.'); // 验证规则 $rules = [ 'class_id' => 'integer', 'article_title' => 'max:64', 'created_start' => 'integer', 'created_end' => 'integer', 'page' => 'integer', 'limit' => 'integer', ]; // 验证请求数据 $validate = new PackageValidate(); $validate->postData = $post_data; $validate->validateParams($rules); // 返回值 $this->_result = [ 'list' => [], 'page' => isset($post_data['page']) ? $post_data['page'] : Constant::PAGING_DEFAULT_PAGE, 'limit' => isset($post_data['limit']) ? $post_data['limit'] : Constant::PAGING_DEFAULT_LIMIT, 'total' => 0, ]; // 获取分类数据 $classModel = new CourseClassModel(); $class_list = $classModel->list_all(); if (empty($class_list)) { return; } $class_data = array_combine_by_key($class_list, 'class_id'); // 格式化分类数据 foreach ($class_data as $class_id => $class) { $class_data[$class['parent_id']]['children'][$class_id] = &$class_data[$class_id]; } if (isset($post_data['class_id'])) { $class_id = $post_data['class_id']; $ids = []; // 未找到分类 if (!isset($class_data[$class_id])) { return; } // 获取分类自身ID和所有子分类ID $this->_getSelfChildId($class_data[$class_id], $ids); $post_data['class_id'] = $ids; } $dataHelper = &DataHelper::instance(); // 搜索条件 $conds = ['course_type' => Constant::COURSE_TYPE_NORMAL]; if (isset($post_data['class_id'])) { $conds['class_id'] = $post_data['class_id']; } if (isset($post_data['article_title'])) { $conds['article_title like ?'] = "%{$post_data['article_title']}%"; } if (isset($post_data['created_start'])) { $conds['created >= ?'] = $dataHelper->formatStarttime($post_data['created_start']); } if (isset($post_data['created_end'])) { $conds['created <= ?'] = $dataHelper->formatEndtime($post_data['created_end']); } // 获取课程总数 $articleModel = new CourseArticleModel(); $this->_result['total'] = $articleModel->count_by_conds($conds); if ($this->_result['total'] == 0) { return; } // 获取课程列表 list($start, $perpage) = page_limit($this->_result['page'], $this->_result['limit']); $article_list = $articleModel->list_by_conds($conds, [$start, $perpage], ['created' => 'desc']); $keys = ['article_id', 'class_id', 'article_title', 'user_total', 'study_total', 'comment_total', 'like_total', 'created']; $articles = array_combine_by_key(array_intersect_key_reserved($article_list, $keys), 'article_id'); // 获取已完成人数 $completeModel = new CourseCompleteModel(); $complete_list = $completeModel->listArticleRank(['article_id' => array_keys($articles)]); $completes = array_combine_by_key($complete_list, 'article_id'); foreach ($articles as $k => $v) { $class_id = $v['class_id']; $article_id = $v['article_id']; $articles[$k]['class_name'] = isset($class_data[$class_id]) ? $class_data[$class_id]['class_name'] : ''; $articles[$k]['complete_total'] = isset($completes[$article_id]) ? $completes[$article_id]['total'] : 0; $completeRate = round($articles[$k]['complete_total'] / $v['user_total'] * 100, 2); $articles[$k]['complete_rate'] = $completeRate > 100 ? 100 : $completeRate; } $this->_result['list'] = array_values($articles); } /** * 获取分类自身ID和所有子分类ID * @author zhonglei * @param array $class 分类数据 * @param array $ids 分类自身ID和所有子分类ID数组(引用) * @return void */ private function _getSelfChildId($class, &$ids) { $ids[] = $class['class_id']; // 包含子级分类 if (isset($class['children'])) { foreach ($class['children'] as $child) { $this->_getSelfChildId($child, $ids); } } } }