1
0
mirror of https://gitee.com/koogua/course-tencent-cloud.git synced 2025-07-16 21:26:13 +08:00

1.优化课程目录UI

2.优化收藏UI
3.修正收费课程试听问题
This commit is contained in:
xiaochong0302 2025-04-10 22:35:16 +08:00
parent 9fcea65989
commit e5869e1e8f
8 changed files with 179 additions and 128 deletions

View File

@ -1,35 +1,45 @@
{%- macro model_icon(model) %}
{% if model == 1 %}
<i class="iconfont icon-video"></i>
{% elseif model == 2 %}
<i class="iconfont icon-live"></i>
{% elseif model == 3 %}
<i class="iconfont icon-article"></i>
{% elseif model == 4 %}
<i class="layui-icon layui-icon-user"></i>
{% endif %}
{%- endmacro %}
{%- macro show_lesson_list(parent,chapter) %}
<ul class="sidebar-lesson-list">
{% for lesson in parent.children %}
{% set url = url({'for':'home.chapter.show','id':lesson.id}) %}
{% set active = (chapter.id == lesson.id) ? 'active' : 'normal' %}
<li class="lesson-title layui-elip">
<li class="sidebar-lesson layui-elip">
{% if lesson.me.owned == 1 %}
<a class="{{ active }}" href="{{ url }}" title="{{ lesson.title }}">{{ lesson.title }}</a>
<a class="{{ active }}" href="{{ url }}" title="{{ lesson.title }}">{{ model_icon(lesson.model) }} {{ lesson.title }}</a>
{% else %}
<span class="deny" title="{{ lesson.title }}">{{ lesson.title }}</span>
<span class="deny" title="{{ lesson.title }}">{{ model_icon(lesson.model) }} {{ lesson.title }}</span>
<i class="iconfont icon-lock"></i>
{% endif %}
</li>
{% endfor %}
</ul>
{%- endmacro %}
<div class="layui-card sidebar-card sidebar-chapter">
<div class="layui-card sidebar-card sidebar-catalog">
<div class="layui-card-header">课程目录</div>
<div class="layui-card-body">
{% if catalog|length > 1 %}
<div class="sidebar-chapter-list">
{% for item in catalog %}
<div class="chapter-title layui-elip">{{ item.title }}</div>
<div class="sidebar-lesson-list">
{{ show_lesson_list(item,chapter) }}
</div>
<div class="sidebar-chapter layui-elip">{{ item.title }}</div>
{{ show_lesson_list(item,chapter) }}
{% endfor %}
</div>
{% else %}
<div class="sidebar-lesson-list">
{{ show_lesson_list(catalog[0],chapter) }}
</div>
{{ show_lesson_list(catalog[0],chapter) }}
{% endif %}
</div>
</div>
</div>

View File

@ -35,11 +35,7 @@
<div class="layui-card-body">
<div class="chat-msg-list" id="chat-msg-list" data-url="{{ live_chats_url }}"></div>
<form class="layui-form chat-msg-form" method="post" action="{{ send_msg_url }}">
{% if auth_user.id > 0 %}
<input class="layui-input" type="text" name="content" maxlength="50" placeholder="快来一起互动吧" lay-verType="tips" lay-verify="required">
{% else %}
<input class="layui-input" type="text" placeholder="登录后才可以发言哦" readonly="readonly">
{% endif %}
<input class="layui-input" type="text" name="content" maxlength="50" placeholder="快来一起互动吧" lay-vertype="tips" lay-verify="required">
<button class="layui-hide" type="submit" lay-submit="true" lay-filter="chat">发送</button>
</form>
</div>
@ -80,4 +76,4 @@
{{ js_include('home/js/course.share.js') }}
{{ js_include('home/js/copy.js') }}
{% endblock %}
{% endblock %}

View File

@ -1,103 +1,116 @@
{%- macro show_lesson_list(chapter) %}
<ul class="lesson-list">
{% for lesson in chapter.children %}
{% set url = url({'for':'home.chapter.show','id':lesson.id}) %}
{% set priv = lesson.me.owned ? 'allow' : 'deny' %}
{% if lesson.model == 1 %}
<li class="lesson-item">{{ vod_lesson_info(lesson) }}</li>
<li class="lesson-item {{ priv }}" data-url="{{ url }}">{{ vod_lesson_info(lesson) }}</li>
{% elseif lesson.model == 2 %}
<li class="lesson-item">{{ live_lesson_info(lesson) }}</li>
<li class="lesson-item {{ priv }}" data-url="{{ url }}">{{ live_lesson_info(lesson) }}</li>
{% elseif lesson.model == 3 %}
<li class="lesson-item">{{ read_lesson_info(lesson) }}</li>
<li class="lesson-item {{ priv }}" data-url="{{ url }}">{{ read_lesson_info(lesson) }}</li>
{% elseif lesson.model == 4 %}
<li class="lesson-item">{{ offline_lesson_info(lesson) }}</li>
<li class="lesson-item deny" data-url="{{ url }}">{{ offline_lesson_info(lesson) }}</li>
{% endif %}
{% endfor %}
</ul>
{%- endmacro %}
{%- macro vod_lesson_info(lesson) %}
{% set url = lesson.me.owned ? url({'for':'home.chapter.show','id':lesson.id}) : '' %}
{% set priv = lesson.me.owned ? 'allow' : 'deny' %}
<a class="{{ priv }} view-lesson" href="javascript:" data-url="{{ url }}">
<i class="layui-icon layui-icon-play"></i>
<div class="left">
<span class="model"><i class="iconfont icon-video"></i></span>
<span class="title">{{ lesson.title }}</span>
{% if lesson.free == 1 %}
<span class="iconfont icon-trial"></span>
{% endif %}
{% if lesson.me.duration > 0 %}
<span class="study-time" title="学习时长:{{ lesson.me.duration|duration }}"><i class="layui-icon layui-icon-time"></i></span>
{% endif %}
{% if priv == 'deny' %}
<span class="iconfont icon-lock"></span>
{% if lesson.me.owned == 0 %}
<span class="lock"><i class="iconfont icon-lock"></i></span>
{% endif %}
{% if lesson.free == 1 %}
<span class="flag flag-free">试听</span>
{% endif %}
</div>
<div class="right">
<span class="duration">{{ lesson.attrs.duration|duration }}</span>
</a>
</div>
{%- endmacro %}
{%- macro live_lesson_info(lesson) %}
{% set url = lesson.me.owned ? url({'for':'home.chapter.show','id':lesson.id}) : '' %}
{% set priv = lesson.me.owned ? 'allow' : 'deny' %}
<a class="{{ priv }} view-lesson" href="javascript:" data-url="{{ url }}">
<i class="layui-icon layui-icon-video"></i>
<div class="left">
<span class="model"><i class="iconfont icon-live"></i></span>
<span class="title">{{ lesson.title }}</span>
{% if lesson.free == 1 %}
<span class="iconfont icon-trial"></span>
{% endif %}
{% if lesson.me.duration > 0 %}
<span class="study-time" title="学习时长:{{ lesson.me.duration|duration }}"><i class="layui-icon layui-icon-time"></i></span>
{% endif %}
{% if priv == 'deny' %}
<span class="iconfont icon-lock"></span>
{% if lesson.me.owned == 0 %}
<span class="lock"><i class="iconfont icon-lock"></i></span>
{% endif %}
<span class="live" title="{{ date('Y-m-d H:i',lesson.attrs.start_time) }}">{{ live_status_info(lesson) }}</span>
</a>
{% if lesson.attrs.playback.ready == 1 %}
<span class="flag flag-playback">回放</span>
{% endif %}
{% if lesson.free == 1 %}
<span class="flag flag-free">试听</span>
{% endif %}
</div>
<div class="right">
<span class="live-status">{{ live_status_info(lesson) }}</span>
<span class="live-time">{{ date('Y-m-d H:i',lesson.attrs.start_time) }}</span>
</div>
{%- endmacro %}
{%- macro read_lesson_info(lesson) %}
{% set url = lesson.me.owned ? url({'for':'home.chapter.show','id':lesson.id}) : '' %}
{% set priv = lesson.me.owned ? 'allow' : 'deny' %}
<a class="{{ priv }} view-lesson" href="javascript:" data-url="{{ url }}">
<i class="layui-icon layui-icon-read"></i>
<div class="left">
<span class="model"><i class="iconfont icon-article"></i></span>
<span class="title">{{ lesson.title }}</span>
{% if lesson.free == 1 %}
<span class="iconfont icon-trial"></span>
{% endif %}
{% if lesson.me.duration > 0 %}
<span class="study-time" title="学习时长:{{ lesson.me.duration|duration }}"><i class="layui-icon layui-icon-time"></i></span>
{% endif %}
{% if priv == 'deny' %}
<span class="iconfont icon-lock"></span>
{% if lesson.me.owned == 0 %}
<span class="lock"><i class="iconfont icon-lock"></i></span>
{% endif %}
</a>
{% if lesson.free == 1 %}
<span class="flag flag-free">试读</span>
{% endif %}
</div>
<div class="right">
<span class="size"></span>
</div>
{%- endmacro %}
{%- macro offline_lesson_info(lesson) %}
<a class="deny view-lesson" href="javascript:">
<i class="layui-icon layui-icon-user"></i>
<div class="left">
<span class="model"><i class="layui-icon layui-icon-user"></i></span>
<span class="title">{{ lesson.title }}</span>
{% if lesson.free == 1 %}
<span class="layui-badge free-badge">试听</span>
{% if lesson.me.owned == 0 %}
<span class="lock"><i class="iconfont icon-lock"></i></span>
{% endif %}
<span class="live" title="{{ date('Y-m-d H:i',lesson.attrs.start_time) }}">{{ offline_status_info(lesson) }}</span>
</a>
{% if lesson.free == 1 %}
<span class="flag flag-free">试听</span>
{% endif %}
</div>
<div class="right">
<span class="live-status">{{ offline_status_info(lesson) }}</span>
<span class="live-time">{{ date('Y-m-d H:i',lesson.attrs.start_time) }}</span>
</div>
{%- endmacro %}
{%- macro live_status_info(lesson) %}
{% if lesson.attrs.stream.status == 'active' %}
<span class="active">{{ date('m月d日 H:i',lesson.attrs.start_time) }} 直播中</span>
<span class="flag flag-active">直播中</span>
{% elseif lesson.attrs.start_time > time() %}
<span class="pending">{{ date('m月d日 H:i',lesson.attrs.start_time) }} 倒计时</span>
<span class="flag flag-pending">倒计时</span>
{% elseif lesson.attrs.end_time < time() %}
<span class="finished">{{ date('m月d日 H:i',lesson.attrs.start_time) }} 已结束</span>
<span class="flag flag-finished">已结束</span>
{% endif %}
{%- endmacro %}
{%- macro offline_status_info(lesson) %}
{% if lesson.attrs.start_time < time() and lesson.attrs.end_time > time() %}
<span class="active">{{ date('m月d日 H:i',lesson.attrs.start_time) }} 授课中</span>
<span class="flag flag-active">授课中</span>
{% elseif lesson.attrs.start_time > time() %}
<span class="pending">{{ date('m月d日 H:i',lesson.attrs.start_time) }} 未开始</span>
<span class="flag flag-pending">未开始</span>
{% elseif lesson.attrs.end_time < time() %}
<span class="finished">{{ date('m月d日 H:i',lesson.attrs.start_time) }} 已结束</span>
<span class="flag flag-finished">已结束</span>
{% endif %}
{%- endmacro %}
@ -119,4 +132,4 @@
{% else %}
{{ show_lesson_list(chapters[0]) }}
{% endif %}
{% endif %}
{% endif %}

View File

@ -26,8 +26,8 @@
{% endif %}
<div class="item" id="toolbar-favorite">
<div class="icon" title="{{ favorite_title }}" data-url="{{ favorite_url }}">
<i class="layui-icon layui-icon-star icon-star {{ favorite_class }}"></i>
<i class="layui-icon icon-star {{ favorite_class }}"></i>
</div>
<div class="text" data-count="{{ course.favorite_count }}">{{ course.favorite_count }}</div>
</div>
</div>
</div>

View File

@ -39,10 +39,10 @@ class ChapterList extends LogicService
if (count($chapters) == 0) return [];
if ($user->id > 0 && $this->courseUser) {
if ($user->id > 0) {
$chapters = $this->handleLoginUserChapters($chapters, $course, $user);
} else {
$chapters = $this->handleGuestUserChapters($chapters);
$chapters = $this->handleGuestUserChapters($chapters, $course);
}
return $chapters;
@ -50,7 +50,11 @@ class ChapterList extends LogicService
protected function handleLoginUserChapters(array $chapters, CourseModel $course, UserModel $user)
{
$mappings = $this->getLearningMappings($course->id, $user->id, $this->courseUser->plan_id);
$mappings = [];
if ($this->courseUser) {
$mappings = $this->getLearningMappings($course->id, $user->id, $this->courseUser->plan_id);
}
foreach ($chapters as &$chapter) {
foreach ($chapter['children'] as &$lesson) {
@ -61,23 +65,30 @@ class ChapterList extends LogicService
'owned' => $owned ? 1 : 0,
'logged' => 1,
];
// 如果课程是免费的,但又设置了课时试听,清除试听标识
if ($course->market_price == 0 && $lesson['free'] == 1) {
$lesson['free'] = 0;
}
}
}
return $chapters;
}
protected function handleGuestUserChapters(array $chapters)
protected function handleGuestUserChapters(array $chapters, CourseModel $course)
{
foreach ($chapters as &$chapter) {
foreach ($chapter['children'] as &$lesson) {
$owned = ($this->ownedCourse || $lesson['free'] == 1) && $lesson['published'] == 1;
$lesson['me'] = [
'progress' => 0,
'duration' => 0,
'logged' => 0,
'owned' => $owned ? 1 : 0,
'owned' => 0,
];
// 如果课程是免费的,但又设置了课时试听,清除试听标识
if ($course->market_price == 0 && $lesson['free'] == 1) {
$lesson['free'] = 0;
}
}
}

View File

@ -100,7 +100,7 @@ class CourseInfo extends LogicService
if ($this->courseUser) {
$me['reviewed'] = $this->courseUser->reviewed ? 1 : 0;
$me['progress'] = $this->courseUser->progress ? 1 : 0;
$me['progress'] = $this->courseUser->progress;
$me['plan_id'] = $this->courseUser->plan_id;
}
}

View File

@ -1039,50 +1039,73 @@
font-size: 30px;
}
.lesson-item {
position: relative;
padding: 0 10px;
line-height: 35px;
.lesson-list .allow {
cursor: pointer;
}
.lesson-item a {
display: block;
}
.lesson-item .deny {
.lesson-list .deny {
cursor: default;
color: gray;
}
.lesson-item .title {
margin: 0 5px;
}
.lesson-item .icon-trial {
color: red;
font-size: 24px;
margin-right: 5px;
}
.lesson-item .duration, .lesson-item .live {
top: 0;
right: 10px;
position: absolute;
color: #666;
}
.lesson-item .live .active {
color: red;
}
.lesson-item .study-time {
color: green;
.lesson-item {
display: flex;
justify-content: space-between;
line-height: 35px;
padding: 0 10px;
}
.lesson-item:hover {
background-color: #f2f2f2;
}
.lesson-item .title {
margin-right: 5px;
}
.lesson-item .model {
margin-right: 5px;
}
.lesson-item .lock {
margin-right: 5px;
}
.lesson-item .study-time {
margin-right: 5px;
color: green;
}
.lesson-item .flag {
padding: 2px 3px;
margin-right: 5px;
font-size: 12px;
}
.lesson-item .flag-free {
border: 1px solid red;
color: red;
}
.lesson-item .flag-playback {
border: 1px solid orange;
color: orange;
}
.lesson-item .flag-pending {
border: 1px solid green;
color: green;
}
.lesson-item .flag-active {
border: 1px solid red;
color: red;
}
.lesson-item .flag-finished {
border: 1px solid gray;
color: gray;
}
.package-item {
display: flex;
margin-bottom: 20px;
@ -1173,15 +1196,13 @@
white-space: normal;
}
.review-card,
.consult-card,
.answer-card {
.review-card .info,
.consult-card .info {
position: relative;
}
.review-card .rating,
.consult-card .more,
.answer-card .accepted {
.consult-card .more {
position: absolute;
top: 0;
right: 0;
@ -1205,11 +1226,6 @@
font-size: 12px;
}
.review-card .more {
color: #666;
cursor: pointer;
}
.sidebar-card .layui-card-header {
text-align: center;
}
@ -1305,25 +1321,30 @@
overflow-y: auto;
}
.sidebar-chapter-list .chapter-title {
.sidebar-chapter {
padding-top: 10px;
margin-bottom: 10px;
color: #333;
}
.sidebar-lesson-list {
margin-left: 10px;
}
.sidebar-lesson-list .lesson-title {
.sidebar-lesson {
padding: 0 10px;
line-height: 30px;
}
.lesson-title .active {
.sidebar-lesson:hover {
background-color: #f2f2f2;
}
.sidebar-lesson a {
display: block;
}
.sidebar-lesson .active {
color: red;
}
.lesson-title .deny {
.sidebar-lesson .deny {
color: gray;
}

View File

@ -62,7 +62,7 @@ layui.use(['jquery', 'layer', 'helper'], function () {
/**
* 浏览章节
*/
$('body').on('click', '.view-lesson', function () {
$('body').on('click', '.lesson-item', function () {
if ($(this).hasClass('deny')) {
return false;
}
@ -140,4 +140,4 @@ layui.use(['jquery', 'layer', 'helper'], function () {
helper.ajaxLoadHtml($sdRelated.data('url'), $sdRelated.attr('id'));
}
});
});