mirror of
https://gitee.com/koogua/course-tencent-cloud.git
synced 2025-07-15 12:52:21 +08:00
整理代码
This commit is contained in:
parent
d696e40988
commit
01932654f5
@ -47,7 +47,7 @@ class IndexSlideList extends Cache
|
||||
'id' => $slide->id,
|
||||
'title' => $slide->title,
|
||||
'cover' => $slide->cover,
|
||||
'bg_color' => $slide->bg_color,
|
||||
'style' => $slide->style,
|
||||
'target' => $slide->target,
|
||||
'content' => $slide->content,
|
||||
];
|
||||
|
@ -87,8 +87,8 @@ class Slide extends Service
|
||||
$data['cover'] = $validator->checkCover($post['cover']);
|
||||
}
|
||||
|
||||
if (isset($post['bg_color'])) {
|
||||
$data['bg_color'] = $validator->checkBgColor($post['bg_color']);
|
||||
if (isset($post['style']['bg_color'])) {
|
||||
$data['style']['bg_color'] = $validator->checkBgColor($post['style']['bg_color']);
|
||||
}
|
||||
|
||||
if (isset($post['content'])) {
|
||||
|
@ -32,10 +32,10 @@
|
||||
<div class="layui-form-item">
|
||||
<label class="layui-form-label">背景色</label>
|
||||
<div class="layui-input-inline">
|
||||
<input class="layui-input" type="text" name="bg_color" value="{{ slide.bg_color }}" lay-verify="required">
|
||||
<input class="layui-input" type="text" name="style[bg_color]" value="{{ slide.style['bg_color'] }}" lay-verify="required">
|
||||
</div>
|
||||
<div class="layui-inline">
|
||||
<div id="bg-color"></div>
|
||||
<div id="style-bg-color"></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@ -92,11 +92,11 @@
|
||||
var $ = layui.jquery;
|
||||
var colorPicker = layui.colorpicker;
|
||||
colorPicker.render({
|
||||
elem: '#bg-color',
|
||||
color: '{{ slide.bg_color }}',
|
||||
elem: '#style-bg-color',
|
||||
color: '{{ slide.style['bg_color'] }}',
|
||||
predefine: true,
|
||||
change: function (color) {
|
||||
$('input[name=bg_color]').val(color);
|
||||
$('input[name="style[bg_color]"]').val(color);
|
||||
}
|
||||
});
|
||||
});
|
||||
|
@ -26,18 +26,18 @@ class CourseController extends Controller
|
||||
*/
|
||||
public function listAction()
|
||||
{
|
||||
$courseListService = new CourseListService();
|
||||
$service = new CourseListService();
|
||||
|
||||
$pager = $courseListService->handle();
|
||||
$pager = $service->handle();
|
||||
|
||||
$courseQueryService = new CourseQueryService();
|
||||
$service = new CourseQueryService();
|
||||
|
||||
$topCategories = $courseQueryService->handleTopCategories();
|
||||
$subCategories = $courseQueryService->handleSubCategories();
|
||||
$topCategories = $service->handleTopCategories();
|
||||
$subCategories = $service->handleSubCategories();
|
||||
|
||||
$models = $courseQueryService->handleModels();
|
||||
$levels = $courseQueryService->handleLevels();
|
||||
$sorts = $courseQueryService->handleSorts();
|
||||
$models = $service->handleModels();
|
||||
$levels = $service->handleLevels();
|
||||
$sorts = $service->handleSorts();
|
||||
|
||||
$this->view->setVar('top_categories', $topCategories);
|
||||
$this->view->setVar('sub_categories', $subCategories);
|
||||
@ -52,83 +52,46 @@ class CourseController extends Controller
|
||||
*/
|
||||
public function showAction($id)
|
||||
{
|
||||
$courseInfoService = new CourseInfoService();
|
||||
$service = new CourseInfoService();
|
||||
|
||||
$course = $courseInfoService->handle($id);
|
||||
$course = $service->handle($id);
|
||||
|
||||
$this->view->setVar('course', $course);
|
||||
}
|
||||
$service = new CourseQueryService();
|
||||
|
||||
/**
|
||||
* @Get("/{id:[0-9]+}/teachers", name="web.course.teachers")
|
||||
*/
|
||||
public function teachersAction($id)
|
||||
{
|
||||
$service = new CourseTeacherListService();
|
||||
$categoryPaths = $service->handleCategoryPaths($course['category_id']);
|
||||
|
||||
$teachers = $service->handle($id);
|
||||
|
||||
return $this->jsonSuccess(['teachers' => $teachers]);
|
||||
}
|
||||
|
||||
/**
|
||||
* @Get("/{id:[0-9]+}/chapters", name="web.course.chapters")
|
||||
*/
|
||||
public function chaptersAction($id)
|
||||
{
|
||||
$service = new CourseChapterListService();
|
||||
|
||||
$chapters = $service->handle($id);
|
||||
|
||||
return $this->jsonSuccess(['chapters' => $chapters]);
|
||||
}
|
||||
|
||||
/**
|
||||
* @Get("/{id:[0-9]+}/packages", name="web.course.packages")
|
||||
*/
|
||||
public function packagesAction($id)
|
||||
{
|
||||
$service = new CoursePackageListService();
|
||||
|
||||
$packages = $service->handle($id);
|
||||
|
||||
return $this->jsonSuccess(['packages' => $packages]);
|
||||
}
|
||||
$service = new CourseTeacherListService();
|
||||
|
||||
/**
|
||||
* @Get("/{id:[0-9]+}/recommended", name="web.course.recommended")
|
||||
*/
|
||||
public function recommendedAction($id)
|
||||
{
|
||||
$service = new CourseRecommendedListService();
|
||||
$teachers = $service->handle($id);
|
||||
|
||||
$courses = $service->handle($id);
|
||||
|
||||
return $this->jsonSuccess(['courses' => $courses]);
|
||||
}
|
||||
|
||||
/**
|
||||
* @Get("/{id:[0-9]+}/related", name="web.course.related")
|
||||
*/
|
||||
public function relatedAction($id)
|
||||
{
|
||||
$service = new CourseRelatedListService();
|
||||
|
||||
$courses = $service->handle($id);
|
||||
|
||||
return $this->jsonSuccess(['courses' => $courses]);
|
||||
}
|
||||
|
||||
/**
|
||||
* @Get("/{id:[0-9]+}/topics", name="web.course.topics")
|
||||
*/
|
||||
public function topicsAction($id)
|
||||
{
|
||||
$service = new CourseTopicListService();
|
||||
|
||||
$topics = $service->handle($id);
|
||||
|
||||
return $this->jsonSuccess(['topics' => $topics]);
|
||||
$service = new CourseRecommendedListService();
|
||||
|
||||
$recommendedCourses = $service->handle($id);
|
||||
|
||||
$service = new CourseRelatedListService();
|
||||
|
||||
$relatedCourses = $service->handle($id);
|
||||
|
||||
$this->view->setVar('course', $course);
|
||||
$this->view->setVar('chapters', $chapters);
|
||||
$this->view->setVar('packages', $packages);
|
||||
$this->view->setVar('teachers', $teachers);
|
||||
$this->view->setVar('topics', $topics);
|
||||
$this->view->setVar('recommended_courses', $recommendedCourses);
|
||||
$this->view->setVar('related_courses', $relatedCourses);
|
||||
$this->view->setVar('category_paths', $categoryPaths);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -136,9 +99,9 @@ class CourseController extends Controller
|
||||
*/
|
||||
public function consultsAction($id)
|
||||
{
|
||||
$consultListService = new CourseConsultListService();
|
||||
$service = new CourseConsultListService();
|
||||
|
||||
$pager = $consultListService->handle($id);
|
||||
$pager = $service->handle($id);
|
||||
|
||||
return $this->jsonPaginate($pager);
|
||||
}
|
||||
@ -148,9 +111,9 @@ class CourseController extends Controller
|
||||
*/
|
||||
public function reviewsAction($id)
|
||||
{
|
||||
$reviewListService = new CourseReviewListService();
|
||||
$service = new CourseReviewListService();
|
||||
|
||||
$pager = $reviewListService->handle($id);
|
||||
$pager = $service->handle($id);
|
||||
|
||||
return $this->jsonPaginate($pager);
|
||||
}
|
||||
@ -160,9 +123,9 @@ class CourseController extends Controller
|
||||
*/
|
||||
public function favoriteAction($id)
|
||||
{
|
||||
$favoriteService = new CourseFavoriteService();
|
||||
$service = new CourseFavoriteService();
|
||||
|
||||
$favoriteService->handle($id);
|
||||
$service->handle($id);
|
||||
|
||||
return $this->jsonSuccess(['msg' => '收藏课程成功']);
|
||||
}
|
||||
|
@ -12,27 +12,20 @@ class TopicController extends Controller
|
||||
{
|
||||
|
||||
/**
|
||||
* @Get("/{id:[0-9]+}/info", name="web.topic.info")
|
||||
* @Get("/{id:[0-9]+}", name="web.topic.show")
|
||||
*/
|
||||
public function infoAction($id)
|
||||
public function showAction($id)
|
||||
{
|
||||
$service = new TopicInfoService();
|
||||
|
||||
$topic = $service->handle($id);
|
||||
|
||||
return $this->jsonSuccess(['topic' => $topic]);
|
||||
}
|
||||
|
||||
/**
|
||||
* @Get("/{id:[0-9]+}/courses", name="web.topic.courses")
|
||||
*/
|
||||
public function coursesAction($id)
|
||||
{
|
||||
$service = new TopicCourseListService();
|
||||
|
||||
$courses = $service->handle($id);
|
||||
|
||||
return $this->jsonSuccess(['courses' => $courses]);
|
||||
$this->view->setVar('topic', $topic);
|
||||
$this->view->setVar('courses', $courses);
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -2,6 +2,7 @@
|
||||
|
||||
namespace App\Http\Web\Services;
|
||||
|
||||
use App\Caches\Category as CategoryCache;
|
||||
use App\Models\Course as CourseModel;
|
||||
use App\Services\Category as CategoryService;
|
||||
|
||||
@ -183,6 +184,32 @@ class CourseQuery extends Service
|
||||
return $result;
|
||||
}
|
||||
|
||||
public function handleCategoryPaths($categoryId)
|
||||
{
|
||||
$result = [];
|
||||
|
||||
$cache = new CategoryCache();
|
||||
|
||||
$subCategory = $cache->get($categoryId);
|
||||
$topCategory = $cache->get($subCategory->parent_id);
|
||||
|
||||
$topParams = ['tc' => $topCategory->id];
|
||||
|
||||
$result['top'] = [
|
||||
'name' => $topCategory->name,
|
||||
'url' => $this->baseUrl . $this->buildQueryParams($topParams),
|
||||
];
|
||||
|
||||
$subParams = ['tc' => $topCategory->id, 'sc' => $subCategory->id];
|
||||
|
||||
$result['sub'] = [
|
||||
'name' => $subCategory->name,
|
||||
'url' => $this->baseUrl . $this->buildQueryParams($subParams),
|
||||
];
|
||||
|
||||
return $result;
|
||||
}
|
||||
|
||||
protected function getQueryParams()
|
||||
{
|
||||
$query = $this->request->getQuery();
|
||||
|
@ -24,6 +24,9 @@ class Index extends Service
|
||||
if (!$slides) return [];
|
||||
|
||||
foreach ($slides as $key => $slide) {
|
||||
|
||||
$slides[$key]['style'] = SlideModel::htmlStyle($slide['style']);
|
||||
|
||||
switch ($slide['target']) {
|
||||
case SlideModel::TARGET_COURSE:
|
||||
$slides[$key]['url'] = $this->url->get([
|
||||
|
0
app/Http/Web/Views/course/chapters.volt
Normal file
0
app/Http/Web/Views/course/chapters.volt
Normal file
@ -42,7 +42,10 @@
|
||||
</div>
|
||||
|
||||
<div class="course-sort">
|
||||
|
||||
{% for sort in sorts %}
|
||||
{% set class = request.get('sort','trim','score') == sort.id ? 'layui-badge active' : 'layui-badge' %}
|
||||
<a class="{{ class }}" href="{{ sort.url }}">{{ sort.name }}</a>
|
||||
{% endfor %}
|
||||
</div>
|
||||
|
||||
<div class="course-list">
|
||||
|
58
app/Http/Web/Views/course/show.volt
Normal file
58
app/Http/Web/Views/course/show.volt
Normal file
@ -0,0 +1,58 @@
|
||||
{% extends 'templates/base.volt' %}
|
||||
|
||||
{% block content %}
|
||||
|
||||
<div class="breadcrumb">
|
||||
<span class="layui-breadcrumb">
|
||||
<a href="{{ url({'for':'web.course.list'}) }}">全部课程</a>
|
||||
{% for path in category_paths %}
|
||||
<a href="{{ path.url }}">{{ path.name }}</a>
|
||||
{% endfor %}
|
||||
<a><cite>{{ course.title }}</cite></a>
|
||||
</span>
|
||||
</div>
|
||||
|
||||
<div class="course-meta">
|
||||
<div class="left"></div>
|
||||
<div class="right"></div>
|
||||
</div>
|
||||
|
||||
<div class="course-body">
|
||||
<div class="left">
|
||||
<div class="layui-tab layui-tab-brief">
|
||||
<ul class="layui-tab-title">
|
||||
<li class="layui-this">详情</li>
|
||||
<li>目录</li>
|
||||
<li>评价</li>
|
||||
</ul>
|
||||
<div class="layui-tab-content">
|
||||
<div class="layui-tab-item layui-show">
|
||||
<div class="course-details">{{ course.details }}</div>
|
||||
</div>
|
||||
<div class="layui-tab-item">
|
||||
{{ partial('course/chapters', {'chapters':chapters}) }}
|
||||
</div>
|
||||
<div class="layui-tab-item">内容3</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="right">
|
||||
{% if teachers %}
|
||||
{{ partial('course/widget_teacher', {'teachers':teachers}) }}
|
||||
{% endif %}
|
||||
|
||||
{% if topics %}
|
||||
{{ partial('course/widget_topic', {'topics':topics}) }}
|
||||
{% endif %}
|
||||
|
||||
{% if recommended_courses %}
|
||||
{{ partial('course/widget_recommended', {'courses':recommended_courses}) }}
|
||||
{% endif %}
|
||||
|
||||
{% if related_courses %}
|
||||
{{ partial('course/widget_related', {'courses':related_courses}) }}
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{% endblock %}
|
18
app/Http/Web/Views/course/widget_recommended.volt
Normal file
18
app/Http/Web/Views/course/widget_recommended.volt
Normal file
@ -0,0 +1,18 @@
|
||||
<div class="course-widget widget">
|
||||
<div class="head">推荐课程</div>
|
||||
<div class="body">
|
||||
{% for course in courses %}
|
||||
<div class="course">
|
||||
<div class="cover"></div>
|
||||
<div class="info">
|
||||
<div class="title">{{ course.title }}</div>
|
||||
<div class="meta">
|
||||
<span class="price"></span>
|
||||
<span class="level"></span>
|
||||
<span class="user"></span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endfor %}
|
||||
</div>
|
||||
</div>
|
18
app/Http/Web/Views/course/widget_related.volt
Normal file
18
app/Http/Web/Views/course/widget_related.volt
Normal file
@ -0,0 +1,18 @@
|
||||
<div class="course-widget widget">
|
||||
<div class="head">相关课程</div>
|
||||
<div class="body">
|
||||
{% for course in courses %}
|
||||
<div class="course">
|
||||
<div class="cover"></div>
|
||||
<div class="info">
|
||||
<div class="title">{{ course.title }}</div>
|
||||
<div class="meta">
|
||||
<span class="price"></span>
|
||||
<span class="level"></span>
|
||||
<span class="user"></span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endfor %}
|
||||
</div>
|
||||
</div>
|
14
app/Http/Web/Views/course/widget_teacher.volt
Normal file
14
app/Http/Web/Views/course/widget_teacher.volt
Normal file
@ -0,0 +1,14 @@
|
||||
<div class="teacher-widget widget">
|
||||
<div class="head">授课教师</div>
|
||||
<div class="body">
|
||||
{% for teacher in teachers %}
|
||||
<div class="teacher" title="{{ teacher.about }}">
|
||||
<div class="avatar"></div>
|
||||
<div class="info">
|
||||
<div class="name">{{ teacher.name }}</div>
|
||||
<div class="title">{{ teacher.title }}</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endfor %}
|
||||
</div>
|
||||
</div>
|
8
app/Http/Web/Views/course/widget_topic.volt
Normal file
8
app/Http/Web/Views/course/widget_topic.volt
Normal file
@ -0,0 +1,8 @@
|
||||
<div class="teacher-widget widget">
|
||||
<div class="head">热门专题</div>
|
||||
<div class="body">
|
||||
{% for topic in topics %}
|
||||
<a class="layui-badge" href="{{ url({'for':'web.topic.show','id':topic.id}) }}">{{ topic.title }}</a>
|
||||
{% endfor %}
|
||||
</div>
|
||||
</div>
|
@ -31,7 +31,7 @@
|
||||
<div class="layui-carousel" id="carousel">
|
||||
<div class="carousel" carousel-item>
|
||||
{% for slide in slides %}
|
||||
<div class="item" style="background-color:{{ slide.bg_color }}">
|
||||
<div class="item" style="{{ slide.style }}">
|
||||
<a href="{{ slide.url }}">
|
||||
<img src="{{ slide.cover }}" alt="{{ slide.title }}">
|
||||
</a>
|
||||
|
@ -346,8 +346,9 @@ class Course extends Model
|
||||
{
|
||||
return [
|
||||
'score' => '综合',
|
||||
'rating' => '好评',
|
||||
'pop' => '人气',
|
||||
'rating' => '评价',
|
||||
'latest' => '最新',
|
||||
'popular' => '最热',
|
||||
];
|
||||
}
|
||||
|
||||
|
@ -37,11 +37,11 @@ class Slide extends Model
|
||||
public $cover;
|
||||
|
||||
/**
|
||||
* 背景色
|
||||
* 样式
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
public $bg_color;
|
||||
public $style;
|
||||
|
||||
/**
|
||||
* 摘要
|
||||
@ -123,6 +123,10 @@ class Slide extends Model
|
||||
if (Text::startsWith($this->cover, 'http')) {
|
||||
$this->cover = self::getCoverPath($this->cover);
|
||||
}
|
||||
|
||||
if (is_array($this->style) && !empty($this->style)) {
|
||||
$this->style = kg_json_encode($this->style);
|
||||
}
|
||||
}
|
||||
|
||||
public function beforeUpdate()
|
||||
@ -132,6 +136,10 @@ class Slide extends Model
|
||||
if (Text::startsWith($this->cover, 'http')) {
|
||||
$this->cover = self::getCoverPath($this->cover);
|
||||
}
|
||||
|
||||
if (!empty($this->style)) {
|
||||
$this->style = kg_json_encode($this->style);
|
||||
}
|
||||
}
|
||||
|
||||
public function afterFetch()
|
||||
@ -139,6 +147,21 @@ class Slide extends Model
|
||||
if (!Text::startsWith($this->cover, 'http')) {
|
||||
$this->cover = kg_ci_cover_img_url($this->cover);
|
||||
}
|
||||
|
||||
if (!empty($this->style)) {
|
||||
$this->style = json_decode($this->style, true);
|
||||
}
|
||||
}
|
||||
|
||||
public static function htmlStyle($style)
|
||||
{
|
||||
$result = [];
|
||||
|
||||
if (isset($style['bg_color'])) {
|
||||
$result[] = "background-color:{$style['bg_color']}";
|
||||
}
|
||||
|
||||
return implode(';', $result);
|
||||
}
|
||||
|
||||
public static function getCoverPath($url)
|
||||
|
@ -89,7 +89,7 @@ class Course extends Repository
|
||||
case 'rating':
|
||||
$orderBy = 'c.rating DESC';
|
||||
break;
|
||||
case 'pop':
|
||||
case 'popular':
|
||||
$orderBy = 'c.user_count DESC';
|
||||
break;
|
||||
default:
|
||||
|
@ -5,7 +5,6 @@ namespace App\Services\Frontend\Course;
|
||||
use App\Models\Course as CourseModel;
|
||||
use App\Models\User as UserModel;
|
||||
use App\Repos\CourseFavorite as CourseFavoriteRepo;
|
||||
use App\Services\Category as CategoryService;
|
||||
use App\Services\Frontend\CourseTrait;
|
||||
use App\Services\Frontend\Service as FrontendService;
|
||||
|
||||
@ -34,6 +33,8 @@ class CourseInfo extends FrontendService
|
||||
'summary' => $course->summary,
|
||||
'details' => $course->details,
|
||||
'keywords' => $course->keywords,
|
||||
'category_id' => $course->category_id,
|
||||
'teacher_id' => $course->teacher_id,
|
||||
'market_price' => (float)$course->market_price,
|
||||
'vip_price' => (float)$course->vip_price,
|
||||
'study_expiry' => $course->study_expiry,
|
||||
@ -77,17 +78,9 @@ class CourseInfo extends FrontendService
|
||||
$me['owned'] = $this->ownedCourse ? 1 : 0;
|
||||
}
|
||||
|
||||
$result['paths'] = $this->getPaths($course);
|
||||
$result['me'] = $me;
|
||||
|
||||
return $result;
|
||||
}
|
||||
|
||||
protected function getPaths(CourseModel $course)
|
||||
{
|
||||
$service = new CategoryService();
|
||||
|
||||
return $service->getCategoryPaths($course->category_id);
|
||||
}
|
||||
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user