mirror of
https://gitee.com/koogua/course-tencent-cloud.git
synced 2025-06-29 05:41:37 +08:00
整理前端代码
This commit is contained in:
parent
24214e8baa
commit
ea8f2732fd
@ -14,6 +14,7 @@ use App\Services\Frontend\Course\RelatedList as CourseRelatedListService;
|
||||
use App\Services\Frontend\Course\ReviewList as CourseReviewListService;
|
||||
use App\Services\Frontend\Course\TeacherList as CourseTeacherListService;
|
||||
use App\Services\Frontend\Course\TopicList as CourseTopicListService;
|
||||
use App\Services\Frontend\Reward\OptionList as RewardOptionList;
|
||||
use Phalcon\Mvc\View;
|
||||
|
||||
/**
|
||||
@ -61,66 +62,24 @@ class CourseController extends Controller
|
||||
|
||||
$service = new CourseQueryService();
|
||||
|
||||
$categoryPaths = $service->handleCategoryPaths($course['category_id']);
|
||||
$course['category_paths'] = $service->handleCategoryPaths($course['category_id']);
|
||||
|
||||
$service = new CourseChapterListService();
|
||||
|
||||
$chapters = $service->handle($id);
|
||||
|
||||
$service = new CoursePackageListService();
|
||||
|
||||
$packages = $service->handle($id);
|
||||
|
||||
$service = new CourseReviewListService();
|
||||
|
||||
$reviews = $service->handle($id);
|
||||
|
||||
$reviews->items = kg_array_object($reviews->items);
|
||||
|
||||
$service = new CourseConsultListService();
|
||||
|
||||
$consults = $service->handle($id);
|
||||
|
||||
$consults->items = kg_array_object($consults->items);
|
||||
|
||||
$service = new CourseTeacherListService();
|
||||
|
||||
$teachers = $service->handle($id);
|
||||
|
||||
$service = new CourseTopicListService();
|
||||
$service = new RewardOptionList();
|
||||
|
||||
$topics = $service->handle($id);
|
||||
|
||||
$service = new CourseRecommendedListService();
|
||||
|
||||
$recommendedCourses = $service->handle($id);
|
||||
|
||||
$service = new CourseRelatedListService();
|
||||
|
||||
$relatedCourses = $service->handle($id);
|
||||
$rewardOptions = $service->handle();
|
||||
|
||||
$this->view->setVar('course', $course);
|
||||
$this->view->setVar('chapters', $chapters);
|
||||
$this->view->setVar('packages', $packages);
|
||||
$this->view->setVar('consults', $consults);
|
||||
$this->view->setVar('reviews', $reviews);
|
||||
$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);
|
||||
}
|
||||
|
||||
/**
|
||||
* @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]);
|
||||
$this->view->setVar('reward_options', $rewardOptions);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -132,22 +91,23 @@ class CourseController extends Controller
|
||||
|
||||
$packages = $service->handle($id);
|
||||
|
||||
return $this->jsonSuccess(['packages' => $packages]);
|
||||
$this->view->setRenderLevel(View::LEVEL_ACTION_VIEW);
|
||||
$this->view->setVar('packages', $packages);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @Get("/{id:[0-9]+}/consults", name="web.course.consults")
|
||||
*/
|
||||
public function consultsAction($id)
|
||||
{
|
||||
$target = $this->request->get('target', 'trim', 'tab-consults');
|
||||
|
||||
$service = new CourseConsultListService();
|
||||
|
||||
$pager = $service->handle($id);
|
||||
|
||||
$pager->target = $this->request->get('target', 'trim', 'tab-consults');
|
||||
|
||||
$pager->items = kg_array_object($pager->items);
|
||||
$pager->target = $target;
|
||||
|
||||
$this->view->setRenderLevel(View::LEVEL_ACTION_VIEW);
|
||||
$this->view->setVar('pager', $pager);
|
||||
@ -158,30 +118,19 @@ class CourseController extends Controller
|
||||
*/
|
||||
public function reviewsAction($id)
|
||||
{
|
||||
$target = $this->request->get('target', 'trim', 'tab-reviews');
|
||||
|
||||
$service = new CourseReviewListService();
|
||||
|
||||
$pager = $service->handle($id);
|
||||
|
||||
$pager->target = $this->request->get('target', 'trim', 'tab-reviews');
|
||||
|
||||
$pager->items = kg_array_object($pager->items);
|
||||
$pager->target = $target;
|
||||
|
||||
$this->view->setRenderLevel(View::LEVEL_ACTION_VIEW);
|
||||
$this->view->setVar('pager', $pager);
|
||||
}
|
||||
|
||||
/**
|
||||
* @Get("/{id:[0-9]+}/teachers", name="web.course.teachers")
|
||||
*/
|
||||
public function teachersAction($id)
|
||||
{
|
||||
$service = new CourseTeacherListService();
|
||||
|
||||
$teachers = $service->handle($id);
|
||||
|
||||
return $this->jsonSuccess(['teachers' => $teachers]);
|
||||
}
|
||||
|
||||
/**
|
||||
* @Get("/{id:[0-9]+}/recommended", name="web.course.recommended")
|
||||
*/
|
||||
@ -191,7 +140,8 @@ class CourseController extends Controller
|
||||
|
||||
$courses = $service->handle($id);
|
||||
|
||||
return $this->jsonSuccess(['courses' => $courses]);
|
||||
$this->view->setRenderLevel(View::LEVEL_ACTION_VIEW);
|
||||
$this->view->setVar('courses', $courses);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -203,7 +153,8 @@ class CourseController extends Controller
|
||||
|
||||
$courses = $service->handle($id);
|
||||
|
||||
return $this->jsonSuccess(['courses' => $courses]);
|
||||
$this->view->setRenderLevel(View::LEVEL_ACTION_VIEW);
|
||||
$this->view->setVar('courses', $courses);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -215,7 +166,20 @@ class CourseController extends Controller
|
||||
|
||||
$topics = $service->handle($id);
|
||||
|
||||
return $this->jsonSuccess(['topics' => $topics]);
|
||||
$this->view->setRenderLevel(View::LEVEL_ACTION_VIEW);
|
||||
$this->view->setVar('topics', $topics);
|
||||
}
|
||||
|
||||
/**
|
||||
* @Get("/{id:[0-9]+}/reward", name="web.course.reward")
|
||||
*/
|
||||
public function rewardAction($id)
|
||||
{
|
||||
$service = new RewardOptionList();
|
||||
|
||||
$options = $service->handle();
|
||||
|
||||
$this->view->setVar('options', $options);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -23,9 +23,9 @@ class OrderController extends Controller
|
||||
|
||||
$service = new OrderConfirmService();
|
||||
|
||||
$info = $service->handle($itemId, $itemType);
|
||||
$confirm = $service->handle($itemId, $itemType);
|
||||
|
||||
$this->view->setVar('info', $info);
|
||||
$this->view->setVar('confirm', $confirm);
|
||||
}
|
||||
|
||||
/**
|
||||
|
65
app/Http/Web/Views/course/chapters.volt
Normal file
65
app/Http/Web/Views/course/chapters.volt
Normal file
@ -0,0 +1,65 @@
|
||||
{%- macro vod_lesson_info(lesson) %}
|
||||
{% set url = lesson.me.owned ? url({'for':'web.chapter.show','id':lesson.id}) : 'javascript:' %}
|
||||
<a href="{{ url }}">
|
||||
<i class="layui-icon layui-icon-play"></i>
|
||||
<span class="title">{{ lesson.title }}</span>
|
||||
{% if lesson.free == 1 %}
|
||||
<span class="layui-badge free-badge">免费</span>
|
||||
{% endif %}
|
||||
{% if lesson.me.duration > 0 %}
|
||||
<span class="study-time" title="学习时长:{{ lesson.me.duration|total_duration }}"><i class="layui-icon layui-icon-time"></i></span>
|
||||
{% endif %}
|
||||
<span class="duration">{{ lesson.attrs.duration|total_duration }}</span>
|
||||
</a>
|
||||
{%- endmacro %}
|
||||
|
||||
{%- macro live_lesson_info(lesson) %}
|
||||
{% set url = lesson.me.owned ? url({'for':'web.chapter.show','id':lesson.id}) : 'javascript:' %}
|
||||
{% set over_flag = lesson.attrs.end_time < time() ? '已结束' : '' %}
|
||||
<a href="{{ url }}">
|
||||
<i class="layui-icon layui-icon-video"></i>
|
||||
<span class="title">{{ lesson.title }}</span>
|
||||
{% if lesson.free == 1 %}
|
||||
<span class="layui-badge free-badge">免费</span>
|
||||
{% endif %}
|
||||
{% if lesson.me.duration > 0 %}
|
||||
<span class="study-time" title="学习时长:{{ lesson.me.duration|total_duration }}"><i class="layui-icon layui-icon-time"></i></span>
|
||||
{% endif %}
|
||||
<span class="live">{{ date('m月d日',lesson.attrs.start_time) }} {{ date('H:i',lesson.attrs.start_time) }}~{{ date('H:i',lesson.attrs.end_time) }} {{ over_flag }}</span>
|
||||
</a>
|
||||
{%- endmacro %}
|
||||
|
||||
{%- macro read_lesson_info(lesson) %}
|
||||
{% set url = lesson.me.owned ? url({'for':'web.chapter.show','id':lesson.id}) : 'javascript:' %}
|
||||
<a href="{{ url }}">
|
||||
<i class="layui-icon layui-icon-read"></i>
|
||||
<span class="title">{{ lesson.title|e }}</span>
|
||||
{% if lesson.free == 1 %}
|
||||
<span class="layui-badge free-badge">免费</span>
|
||||
{% endif %}
|
||||
{% if lesson.me.duration > 0 %}
|
||||
<span class="study-time" title="学习时长:{{ lesson.me.duration|total_duration }}"><i class="layui-icon layui-icon-time"></i></span>
|
||||
{% endif %}
|
||||
</a>
|
||||
{%- endmacro %}
|
||||
|
||||
<div class="layui-collapse">
|
||||
{% for chapter in chapters %}
|
||||
<div class="layui-colla-item">
|
||||
<h2 class="layui-colla-title">{{ chapter.title }}</h2>
|
||||
<div class="layui-colla-content layui-show">
|
||||
<ul class="lesson-list">
|
||||
{% for lesson in chapter.children %}
|
||||
{% if course.model == 'vod' %}
|
||||
<li class="lesson-item clearfix">{{ vod_lesson_info(lesson) }}</li>
|
||||
{% elseif course.model == 'live' %}
|
||||
<li class="lesson-item clearfix">{{ live_lesson_info(lesson) }}</li>
|
||||
{% elseif course.model == 'read' %}
|
||||
<li class="lesson-item clearfix">{{ read_lesson_info(lesson) }}</li>
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
{% endfor %}
|
||||
</div>
|
@ -1,33 +0,0 @@
|
||||
{%- macro live_lesson_info(lesson) %}
|
||||
|
||||
{% set url = lesson.me.owned ? url({'for':'web.chapter.show','id':lesson.id}) : 'javascript:' %}
|
||||
{% set over_flag = lesson.attrs.end_time < time() ? '已结束' : '' %}
|
||||
|
||||
<a href="{{ url }}">
|
||||
<i class="layui-icon layui-icon-video"></i>
|
||||
<span class="title">{{ lesson.title }}</span>
|
||||
{% if lesson.free == 1 %}
|
||||
<span class="layui-badge free-badge">免费</span>
|
||||
{% endif %}
|
||||
{% if lesson.me.duration > 0 %}
|
||||
<span class="study-time" title="学习时长:{{ lesson.me.duration|total_duration }}"><i class="layui-icon layui-icon-time"></i></span>
|
||||
{% endif %}
|
||||
<span class="live">{{ date('m月d日',lesson.attrs.start_time) }} {{ date('H:i',lesson.attrs.start_time) }}~{{ date('H:i',lesson.attrs.end_time) }} {{ over_flag }}</span>
|
||||
</a>
|
||||
|
||||
{%- endmacro %}
|
||||
|
||||
<div class="layui-collapse">
|
||||
{% for chapter in chapters %}
|
||||
<div class="layui-colla-item">
|
||||
<h2 class="layui-colla-title">{{ chapter.title }}</h2>
|
||||
<div class="layui-colla-content layui-show">
|
||||
<ul class="lesson-list">
|
||||
{% for lesson in chapter.children %}
|
||||
<li class="lesson-item">{{ live_lesson_info(lesson) }}</li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
{% endfor %}
|
||||
</div>
|
@ -1,31 +0,0 @@
|
||||
{%- macro read_lesson_info(lesson) %}
|
||||
|
||||
{% set url = lesson.me.owned ? url({'for':'web.chapter.show','id':lesson.id}) : 'javascript:' %}
|
||||
|
||||
<a href="{{ url }}">
|
||||
<i class="layui-icon layui-icon-read"></i>
|
||||
<span class="title">{{ lesson.title|e }}</span>
|
||||
{% if lesson.free == 1 %}
|
||||
<span class="layui-badge free-badge">免费</span>
|
||||
{% endif %}
|
||||
{% if lesson.me.duration > 0 %}
|
||||
<span class="study-time" title="学习时长:{{ lesson.me.duration|total_duration }}"><i class="layui-icon layui-icon-time"></i></span>
|
||||
{% endif %}
|
||||
</a>
|
||||
|
||||
{%- endmacro %}
|
||||
|
||||
<div class="layui-collapse">
|
||||
{% for chapter in chapters %}
|
||||
<div class="layui-colla-item">
|
||||
<h2 class="layui-colla-title">{{ chapter.title|e }}</h2>
|
||||
<div class="layui-colla-content layui-show">
|
||||
<ul class="lesson-list">
|
||||
{% for lesson in chapter.children %}
|
||||
<li class="lesson-item">{{ read_lesson_info(lesson) }}</li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
{% endfor %}
|
||||
</div>
|
@ -1,32 +0,0 @@
|
||||
{%- macro vod_lesson_info(lesson) %}
|
||||
|
||||
{% set url = lesson.me.owned ? url({'for':'web.chapter.show','id':lesson.id}) : 'javascript:' %}
|
||||
|
||||
<a href="{{ url }}">
|
||||
<i class="layui-icon layui-icon-play"></i>
|
||||
<span class="title">{{ lesson.title }}</span>
|
||||
{% if lesson.free == 1 %}
|
||||
<span class="layui-badge free-badge">免费</span>
|
||||
{% endif %}
|
||||
{% if lesson.me.duration > 0 %}
|
||||
<span class="study-time" title="学习时长:{{ lesson.me.duration|total_duration }}"><i class="layui-icon layui-icon-time"></i></span>
|
||||
{% endif %}
|
||||
<span class="duration">{{ lesson.attrs.duration|total_duration }}</span>
|
||||
</a>
|
||||
|
||||
{%- endmacro %}
|
||||
|
||||
<div class="layui-collapse">
|
||||
{% for chapter in chapters %}
|
||||
<div class="layui-colla-item">
|
||||
<h2 class="layui-colla-title">{{ chapter.title }}</h2>
|
||||
<div class="layui-colla-content layui-show">
|
||||
<ul class="lesson-list">
|
||||
{% for lesson in chapter.children %}
|
||||
<li class="lesson-item clearfix">{{ vod_lesson_info(lesson) }}</li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
{% endfor %}
|
||||
</div>
|
@ -1,20 +1,43 @@
|
||||
<div class="cover">
|
||||
<img src="{{ course.cover }}" alt="{{ course.summary|e }}">
|
||||
<img src="{{ course.cover }}" alt="{{ course.title|e }}">
|
||||
</div>
|
||||
|
||||
<div class="info">
|
||||
<p class="duration">课程时长:{{ course.attrs.duration|total_duration }}</p>
|
||||
<p class="expiry">
|
||||
<span class="study-expiry">学习期限:<span class="layui-badge-rim">{{ course.study_expiry }}个月</span></span>
|
||||
<span class="refund-expiry">退款期限:<span class="layui-badge-rim">{{ course.refund_expiry }}天</span></span>
|
||||
{% if course.model == 'vod' %}
|
||||
<p>课程时长 <span>{{ course.attrs.duration|total_duration }}</span></p>
|
||||
{% elseif course.model == 'live' %}
|
||||
<p>直播时间 <span>{{ course.attrs.start_date }} ~ {{ course.attrs.end_date }}</span></p>
|
||||
{% endif %}
|
||||
{% if course.market_price > 0 %}
|
||||
<p>
|
||||
学习期限 <span class="expiry">{{ course.study_expiry }}个月</span>
|
||||
退款期限 <span class="expiry">{{ course.refund_expiry }}天</span>
|
||||
</p>
|
||||
{% endif %}
|
||||
<p>
|
||||
{% if course.market_price > 0 %}
|
||||
市场价格 <span class="price">¥{{ course.market_price }}</span>
|
||||
{% else %}
|
||||
市场价格 <span class="free">免费</span>
|
||||
{% endif %}
|
||||
{% if course.vip_price > 0 %}
|
||||
会员价格 <span class="price">¥{{ course.vip_price }}</span>
|
||||
{% else %}
|
||||
会员价格 <span class="free">免费</span>
|
||||
{% endif %}
|
||||
</p>
|
||||
<p class="price">
|
||||
<span class="market-price">市场价格:<span class="layui-badge-rim">¥{{ course.market_price }}</span></span>
|
||||
<span class="vip-price">会员价格:<span class="layui-badge-rim">¥{{ course.vip_price }}</span></span>
|
||||
</p>
|
||||
<p class="stats">
|
||||
<span class="user-count">{{ course.user_count }}次学习</span>
|
||||
<span class="review-count">{{ course.review_count }}次评价</span>
|
||||
<span class="favorite-count">{{ course.favorite_count }}次收藏</span>
|
||||
<p>
|
||||
难度 <span>{{ level_info(course.level) }}</span>
|
||||
课时 <span>{{ course.lesson_count }}</span>
|
||||
学员 <span>{{ course.user_count }}</span>
|
||||
收藏 <span>{{ course.favorite_count }}</span>
|
||||
评分 <span>{{ course.rating }}</span>
|
||||
</p>
|
||||
<div class="share">
|
||||
<a class="favorite" href="javascript:"><i class="layui-icon layui-icon-heart"></i></a>
|
||||
<a class="mobile" href="javascript:"><i class="layui-icon layui-icon-cellphone"></i></a>
|
||||
<a class="weibo" href="javascript:"><i class="layui-icon layui-icon-login-weibo"></i></a>
|
||||
<a class="wechat" href="javascript:"><i class="layui-icon layui-icon-login-wechat"></i></a>
|
||||
<a class="qq" href="javascript:"><i class="layui-icon layui-icon-login-qq"></i></a>
|
||||
</div>
|
||||
</div>
|
26
app/Http/Web/Views/course/order.volt
Normal file
26
app/Http/Web/Views/course/order.volt
Normal file
@ -0,0 +1,26 @@
|
||||
{% if course.me.owned == 0 and course.market_price > 0 %}
|
||||
<div class="sidebar-order module">
|
||||
<div class="order">
|
||||
{% set order_url = url({'for':'web.order.confirm'},{'item_id':course.id,'item_type':'course'}) %}
|
||||
<a class="layui-btn layui-btn-fluid layui-bg-red" href="{{ order_url }}">立即购买</a>
|
||||
</div>
|
||||
<div class="consult">
|
||||
<a class="layui-btn layui-btn-fluid layui-bg-blue" href="javascript:">课程咨询</a>
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
{% if course.market_price == 0 %}
|
||||
<div class="layui-card">
|
||||
<div class="layui-card-header">赞赏支持</div>
|
||||
<div class="layui-card-body">
|
||||
<div class="sidebar-order">
|
||||
{% for option in reward_options %}
|
||||
{% set item_id = [course.id,option.id]|join('-') %}
|
||||
{% set order_url = url({'for':'web.order.confirm'},{'item_id':item_id,'item_type':'reward'}) %}
|
||||
<a class="layui-btn layui-btn-xs reward-btn" href="{{ order_url }}">{{ option.title }}</a>
|
||||
{% endfor %}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
@ -13,7 +13,7 @@
|
||||
<span>会员价 <i>¥{{ package.vip_price }}</i></span>
|
||||
</div>
|
||||
<div class="order">
|
||||
<a class="layui-btn layui-btn-sm" href="{{ order_url }}">立即购买</a>
|
||||
<a class="layui-btn layui-btn-sm layui-bg-red" href="{{ order_url }}">立即购买</a>
|
||||
</div>
|
||||
</div>
|
||||
<div class="package-course-list">
|
||||
|
@ -1,7 +1,9 @@
|
||||
<div class="course-widget layui-card">
|
||||
{{ partial('partials/macro_course') }}
|
||||
|
||||
<div class="layui-card">
|
||||
<div class="layui-card-header">推荐课程</div>
|
||||
<div class="layui-card-body">
|
||||
{% for course in recommended_courses %}
|
||||
{% for course in courses %}
|
||||
{{ sidebar_course_card(course) }}
|
||||
{% endfor %}
|
||||
</div>
|
@ -1,7 +1,9 @@
|
||||
{{ partial('partials/macro_course') }}
|
||||
|
||||
<div class="layui-card">
|
||||
<div class="layui-card-header">相关课程</div>
|
||||
<div class="layui-card-body">
|
||||
{% for course in related_courses %}
|
||||
{% for course in courses %}
|
||||
{{ sidebar_course_card(course) }}
|
||||
{% endfor %}
|
||||
</div>
|
@ -11,12 +11,13 @@
|
||||
{% set user_url = url({'for':'web.user.show','id':item.id}) %}
|
||||
<div class="review-card clearfix">
|
||||
<div class="avatar">
|
||||
<a href="{{ user_url }}">
|
||||
<img src="{{ item.user.avatar }}" alt="{{ item.user.name }}" title="{{ item.user.name }}">
|
||||
</a>
|
||||
<img src="{{ item.user.avatar }}" alt="{{ item.user.name }}">
|
||||
</div>
|
||||
<div class="info">
|
||||
<div class="rating">{{ star_info(item.rating) }}</div>
|
||||
<div class="user">
|
||||
<a href="{{ user_url }}">{{ item.user.name }}</a>
|
||||
</div>
|
||||
<div class="content">{{ item.content }}</div>
|
||||
<div class="footer">
|
||||
<span>{{ date('Y-m-d H:i',item.create_time) }}</span>
|
||||
|
@ -7,7 +7,7 @@
|
||||
<div class="breadcrumb">
|
||||
<span class="layui-breadcrumb">
|
||||
<a href="{{ url({'for':'web.course.list'}) }}">全部课程</a>
|
||||
{% for path in category_paths %}
|
||||
{% for path in course.category_paths %}
|
||||
<a href="{{ path.url }}">{{ path.name }}</a>
|
||||
{% endfor %}
|
||||
<a><cite>{{ course.title }}</cite></a>
|
||||
@ -18,23 +18,24 @@
|
||||
{{ partial('course/meta') }}
|
||||
</div>
|
||||
|
||||
{% set show_packages = packages ? 1 : 0 %}
|
||||
{% set show_consults = course.market_price > 0 ? 1 : 0 %}
|
||||
{% set show_reviews = course.market_price > 0 ? 1 : 0 %}
|
||||
|
||||
<div class="layout-main clearfix">
|
||||
|
||||
{% set show_tab_packages = 1 %}
|
||||
{% set show_tab_consults = course.consult_count > 0 ? 1 : 0 %}
|
||||
{% set show_tab_reviews = course.review_count > 0 ? 1 : 0 %}
|
||||
|
||||
<div class="layout-content module">
|
||||
<div class="layui-tab layui-tab-brief course-tab">
|
||||
<ul class="layui-tab-title">
|
||||
<li class="layui-this">详情</li>
|
||||
<li>目录</li>
|
||||
{% if show_packages == 1 %}
|
||||
{% if show_tab_packages == 1 %}
|
||||
<li>套餐</li>
|
||||
{% endif %}
|
||||
{% if show_consults == 1 %}
|
||||
{% if show_tab_consults == 1 %}
|
||||
<li>咨询</li>
|
||||
{% endif %}
|
||||
{% if show_reviews == 1 %}
|
||||
{% if show_tab_reviews == 1 %}
|
||||
<li>评价</li>
|
||||
{% endif %}
|
||||
</ul>
|
||||
@ -42,45 +43,47 @@
|
||||
<div class="layui-tab-item layui-show">
|
||||
<div class="course-details">{{ course.details }}</div>
|
||||
</div>
|
||||
<div class="layui-tab-item" id="tab-chapters">
|
||||
{% if course.model == 'vod' %}
|
||||
{{ partial('course/chapters_vod') }}
|
||||
{% elseif course.model == 'live' %}
|
||||
{{ partial('course/chapters_live') }}
|
||||
{% elseif course.model == 'read' %}
|
||||
{{ partial('course/chapters_read') }}
|
||||
{% endif %}
|
||||
<div class="layui-tab-item">
|
||||
{{ partial('course/chapters') }}
|
||||
</div>
|
||||
{% if show_packages == 1 %}
|
||||
<div class="layui-tab-item" id="tab-packages">
|
||||
{{ partial('course/packages') }}
|
||||
</div>
|
||||
{% if show_tab_packages == 1 %}
|
||||
{% set package_url = url({'for':'web.course.packages','id':course.id}) %}
|
||||
<div class="layui-tab-item" id="tab-packages" data-url="{{ package_url }}"></div>
|
||||
{% endif %}
|
||||
{% if show_consults == 1 %}
|
||||
{% if show_tab_consults == 1 %}
|
||||
{% set consult_url = url({'for':'web.course.consults','id':course.id}) %}
|
||||
<div class="layui-tab-item" id="tab-consults" data-url="{{ consult_url }}"></div>
|
||||
{% endif %}
|
||||
{% if show_reviews == 1 %}
|
||||
{% if show_tab_reviews == 1 %}
|
||||
{% set review_url = url({'for':'web.course.reviews','id':course.id}) %}
|
||||
<div class="layui-tab-item" id="tab-reviews" data-url="{{ review_url }}"></div>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{% set show_sidebar_teachers = 1 %}
|
||||
{% set show_sidebar_topics = 1 %}
|
||||
{% set show_sidebar_recommended = 1 %}
|
||||
{% set show_sidebar_related = 1 %}
|
||||
|
||||
<div class="layout-sidebar">
|
||||
{% if teachers %}
|
||||
{{ partial('course/sidebar_teachers') }}
|
||||
{{ partial('course/order') }}
|
||||
{{ partial('course/teachers') }}
|
||||
{% if show_sidebar_topics %}
|
||||
{% set topic_url = url({'for':'web.course.topics','id':course.id}) %}
|
||||
<div class="sidebar" id="sidebar-topics" data-url="{{ topic_url }}"></div>
|
||||
{% endif %}
|
||||
{% if topics %}
|
||||
{{ partial('course/sidebar_topics') }}
|
||||
{% if show_sidebar_recommended %}
|
||||
{% set recommended_url = url({'for':'web.course.recommended','id':course.id}) %}
|
||||
<div class="sidebar" id="sidebar-recommended" data-url="{{ recommended_url }}"></div>
|
||||
{% endif %}
|
||||
{% if recommended_courses %}
|
||||
{{ partial('course/sidebar_recommended') }}
|
||||
{% endif %}
|
||||
{% if related_courses %}
|
||||
{{ partial('course/sidebar_related') }}
|
||||
{% if show_sidebar_related %}
|
||||
{% set related_url = url({'for':'web.course.related','id':course.id}) %}
|
||||
<div class="sidebar" id="sidebar-related" data-url="{{ related_url }}"></div>
|
||||
{% endif %}
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
{% endblock %}
|
||||
@ -88,19 +91,30 @@
|
||||
{% block inline_js %}
|
||||
|
||||
<script>
|
||||
|
||||
if ($('#tab-packages').length > 0) {
|
||||
var $tabPackages = $('#tab-packages');
|
||||
helper.ajaxLoadHtml($tabPackages.attr('data-url'), $tabPackages.attr('id'));
|
||||
}
|
||||
if ($('#tab-consults').length > 0) {
|
||||
console.log('#tab-consults#');
|
||||
var obj = $('#tab-consults');
|
||||
helper.ajaxPager(obj.attr('data-url'), obj.attr('id'));
|
||||
var $tabConsults = $('#tab-consults');
|
||||
helper.ajaxLoadHtml($tabConsults.attr('data-url'), $tabConsults.attr('id'));
|
||||
}
|
||||
|
||||
if ($('#tab-reviews').length > 0) {
|
||||
console.log('#tab-reviews#');
|
||||
var obj = $('#tab-reviews');
|
||||
helper.ajaxPager(obj.attr('data-url'), obj.attr('id'));
|
||||
var $tabReviews = $('#tab-reviews');
|
||||
helper.ajaxLoadHtml($tabReviews.attr('data-url'), $tabReviews.attr('id'));
|
||||
}
|
||||
if ($('#sidebar-topics').length > 0) {
|
||||
var $sdTopics = $('#sidebar-topics');
|
||||
helper.ajaxLoadHtml($sdTopics.attr('data-url'), $sdTopics.attr('id'));
|
||||
}
|
||||
if ($('#sidebar-recommended').length > 0) {
|
||||
var $sdRecommended = $('#sidebar-recommended');
|
||||
helper.ajaxLoadHtml($sdRecommended.attr('data-url'), $sdRecommended.attr('id'));
|
||||
}
|
||||
if ($('#sidebar-related').length > 0) {
|
||||
var $sdRelated = $('#sidebar-related');
|
||||
helper.ajaxLoadHtml($sdRelated.attr('data-url'), $sdRelated.attr('id'));
|
||||
}
|
||||
|
||||
</script>
|
||||
|
||||
{% endblock %}
|
@ -2,15 +2,17 @@
|
||||
<div class="layui-card-header">授课教师</div>
|
||||
<div class="layui-card-body">
|
||||
{% for teacher in teachers %}
|
||||
<div class="sidebar-teacher-card clearfix">
|
||||
{% set teacher_url = url({'for':'web.user.show','id':teacher.id}) %}
|
||||
<div class="sidebar-teacher-card clearfix" title="{{ teacher.about|e }}">
|
||||
<div class="avatar">
|
||||
<img src="{{ teacher.avatar }}" alt="{{ teacher.about }}">
|
||||
<img src="{{ teacher.avatar }}" alt="{{ teacher.about|e }}">
|
||||
</div>
|
||||
<div class="info">
|
||||
<div class="name">
|
||||
<a href="{{ url({'for':'web.user.show','id':teacher.id}) }}">{{ teacher.name }}</a>
|
||||
<a href="{{ teacher_url }}">{{ teacher.name }}</a>
|
||||
</div>
|
||||
<div class="title">{{ teacher.title }}</div>
|
||||
{% set title = teacher.title ? teacher.title : '小小教书匠' %}
|
||||
<div class="title">{{ title }}</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endfor %}
|
54
app/Http/Web/Views/order/confirm.volt
Normal file
54
app/Http/Web/Views/order/confirm.volt
Normal file
@ -0,0 +1,54 @@
|
||||
{% extends 'templates/base.volt' %}
|
||||
|
||||
{% block content %}
|
||||
|
||||
{%- macro cart_course_card(course) %}
|
||||
{% set course_url = url({'for':'web.course.show','id':course.id}) %}
|
||||
<div class="cover">
|
||||
<img src="{{ course.cover }}!cover_270" alt="course.title|e">
|
||||
</div>
|
||||
<div class="info">
|
||||
<p><a href="{{ course_url }}" target="_blank">{{ course.title }}</a></p>
|
||||
<p>
|
||||
市场价格 <span class="price">{{ course.market_price }}</span>
|
||||
会员价格 <span class="price">{{ course.vip_price }}</span>
|
||||
</p>
|
||||
<p>
|
||||
学习期限 <span class="expiry">{{ course.study_expiry }}</span>
|
||||
退款期限 <span class="expiry">{{ course.refund_expiry }}</span>
|
||||
</p>
|
||||
</div>
|
||||
{%- endmacro %}
|
||||
|
||||
{%- macro reward_course_card(reward) %}
|
||||
<div>I am reward</div>
|
||||
{%- endmacro %}
|
||||
|
||||
{%- macro vip_course_card(vip) %}
|
||||
<div>I am vip</div>
|
||||
{%- endmacro %}
|
||||
|
||||
<div class="layui-breadcrumb breadcrumb">
|
||||
<a href="/">首页</a>
|
||||
<a><cite>确认订单</cite></a>
|
||||
</div>
|
||||
|
||||
<div class="cart module">
|
||||
{% if confirm.item_type == 'course' %}
|
||||
{% set course = confirm.item_info.course %}
|
||||
{{ cart_course_card(course) }}
|
||||
{% elseif confirm.item_type == 'package' %}
|
||||
{% set package = confirm.item_info.package %}
|
||||
{% for course in package.courses %}
|
||||
{{ cart_course_card(course) }}
|
||||
{% endfor %}
|
||||
{% elseif confirm.item_type == 'reward' %}
|
||||
{% set reward = confirm.item_info.reward %}
|
||||
{{ cart_reward_card(reward) }}
|
||||
{% elseif confirm.item_type == 'vip' %}
|
||||
{% set vip = confirm.item_info.vip %}
|
||||
{{ cart_vip_card(vip) }}
|
||||
{% endif %}
|
||||
</div>
|
||||
|
||||
{% endblock %}
|
@ -35,11 +35,11 @@ class CourseInfo extends FrontendService
|
||||
'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,
|
||||
'market_price' => $course->market_price,
|
||||
'vip_price' => $course->vip_price,
|
||||
'study_expiry' => $course->study_expiry,
|
||||
'refund_expiry' => $course->refund_expiry,
|
||||
'rating' => (float)$course->rating,
|
||||
'rating' => $course->rating,
|
||||
'model' => $course->model,
|
||||
'level' => $course->level,
|
||||
'attrs' => $course->attrs,
|
||||
|
34
app/Services/Frontend/Reward/OptionList.php
Normal file
34
app/Services/Frontend/Reward/OptionList.php
Normal file
@ -0,0 +1,34 @@
|
||||
<?php
|
||||
|
||||
namespace App\Services\Frontend\Reward;
|
||||
|
||||
use App\Repos\Reward as RewardRepo;
|
||||
use App\Services\Frontend\Service as FrontendService;
|
||||
|
||||
class OptionList extends FrontendService
|
||||
{
|
||||
|
||||
public function handle()
|
||||
{
|
||||
$rewardRepo = new RewardRepo();
|
||||
|
||||
$rewards = $rewardRepo->findAll(['deleted' => 0]);
|
||||
|
||||
if ($rewards->count() == 0) {
|
||||
return [];
|
||||
}
|
||||
|
||||
$result = [];
|
||||
|
||||
foreach ($rewards as $reward) {
|
||||
$result[] = [
|
||||
'id' => $reward->id,
|
||||
'title' => $reward->title,
|
||||
'price' => $reward->price,
|
||||
];
|
||||
}
|
||||
|
||||
return $result;
|
||||
}
|
||||
|
||||
}
|
@ -32,6 +32,10 @@ trait Auth
|
||||
*/
|
||||
public function getLoginUser()
|
||||
{
|
||||
$userRepo = new UserRepo();
|
||||
|
||||
return $userRepo->findById(100015);
|
||||
|
||||
$authUser = $this->getAuthUser();
|
||||
|
||||
$validator = new AppValidator();
|
||||
|
@ -118,6 +118,15 @@ body {
|
||||
width: 320px;
|
||||
}
|
||||
|
||||
.layout-sidebar .loading {
|
||||
padding: 15px;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.layout-sidebar .sidebar {
|
||||
margin-bottom: 15px;
|
||||
}
|
||||
|
||||
.index-module .layui-tab {
|
||||
margin-bottom: 0;
|
||||
}
|
||||
@ -310,10 +319,41 @@ body {
|
||||
}
|
||||
|
||||
.course-meta .info {
|
||||
position: relative;
|
||||
float: left;
|
||||
width: 80%;
|
||||
font-size: 12px;
|
||||
}
|
||||
|
||||
.course-meta .info .share {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
right: 0;
|
||||
}
|
||||
|
||||
.course-meta .share a {
|
||||
margin-right: 5px;
|
||||
color: #999;
|
||||
}
|
||||
|
||||
.course-meta .share a:hover {
|
||||
color: #000;
|
||||
}
|
||||
|
||||
.course-meta .info .price {
|
||||
color: red;
|
||||
font-size: 14px;
|
||||
}
|
||||
|
||||
.course-meta .info .free {
|
||||
color: green;
|
||||
}
|
||||
|
||||
.course-meta .info span {
|
||||
color: #999;
|
||||
margin: 0 5px;
|
||||
}
|
||||
|
||||
.course-meta .cover img {
|
||||
width: 210px;
|
||||
height: 118px;
|
||||
@ -323,16 +363,26 @@ body {
|
||||
line-height: 30px;
|
||||
}
|
||||
|
||||
.course-meta .stats span {
|
||||
margin-right: 5px;
|
||||
}
|
||||
|
||||
.course-tab {
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
.course-tab .layui-tab-content {
|
||||
padding: 30px 0;
|
||||
padding: 20px 0;
|
||||
}
|
||||
|
||||
.course-tab .loading {
|
||||
text-align: center;
|
||||
padding: 15px;
|
||||
}
|
||||
|
||||
.course-tab .loading .layui-icon {
|
||||
font-size: 30px;
|
||||
}
|
||||
|
||||
.course-details {
|
||||
font-size: 12px;
|
||||
color: #999;
|
||||
}
|
||||
|
||||
.lesson-item {
|
||||
@ -448,6 +498,7 @@ body {
|
||||
}
|
||||
|
||||
.review-card {
|
||||
position: relative;
|
||||
padding-bottom: 10px;
|
||||
margin-bottom: 10px;
|
||||
border-bottom: 1px dashed #ccc;
|
||||
@ -473,31 +524,48 @@ body {
|
||||
.review-card .info {
|
||||
float: left;
|
||||
width: 650px;
|
||||
font-size: 12px;
|
||||
}
|
||||
|
||||
.review-card .rating {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
right: 0;
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
|
||||
.review-card .rating .layui-icon {
|
||||
color: orange;
|
||||
font-size: 12px;
|
||||
}
|
||||
|
||||
.review-card .title {
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
|
||||
.review-card .user {
|
||||
margin-bottom: 10px;
|
||||
color: #999;
|
||||
}
|
||||
|
||||
.review-card .content {
|
||||
margin-bottom: 10px;
|
||||
color: #999;
|
||||
font-size: 12px;
|
||||
word-wrap: break-word;
|
||||
white-space: pre-wrap;
|
||||
}
|
||||
|
||||
.review-card .footer {
|
||||
color: #999;
|
||||
font-size: 12px;
|
||||
}
|
||||
|
||||
.sidebar-order .order {
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
|
||||
.sidebar-order .reward-btn {
|
||||
width: 84px;
|
||||
margin: 5px;
|
||||
}
|
||||
|
||||
.sidebar-teacher-card {
|
||||
|
@ -22,11 +22,12 @@ util.fixbar({
|
||||
|
||||
var helper = {};
|
||||
|
||||
helper.ajaxPager = function (url, target) {
|
||||
var index = layer.load();
|
||||
helper.ajaxLoadHtml = function (url, target) {
|
||||
var $target = $('#' + target);
|
||||
var html = '<div class="loading"><i class="layui-icon layui-icon-loading layui-anim layui-anim-rotate layui-anim-loop"></i></div>';
|
||||
$target.html(html);
|
||||
$.get(url, function (html) {
|
||||
$('#' + target).html(html);
|
||||
layer.close(index);
|
||||
$target.html(html);
|
||||
});
|
||||
}
|
||||
|
||||
@ -87,5 +88,5 @@ $('.kg-delete').on('click', function () {
|
||||
$('body').on('click', '.layui-laypage > a', function () {
|
||||
var url = $(this).attr('data-url');
|
||||
var target = $(this).attr('data-target');
|
||||
helper.ajaxPager(url, target);
|
||||
helper.ajaxLoadHtml(url, target);
|
||||
});
|
2
storage/cache/annotations/.gitignore
vendored
2
storage/cache/annotations/.gitignore
vendored
@ -1,2 +0,0 @@
|
||||
*
|
||||
!.gitignore
|
Loading…
x
Reference in New Issue
Block a user