From abdb4e15846f29ece681fcfbdc40cbca82cf910b Mon Sep 17 00:00:00 2001 From: xiaochong0302 Date: Wed, 27 May 2020 18:25:42 +0800 Subject: [PATCH] =?UTF-8?q?=E6=95=B4=E7=90=86=E5=89=8D=E7=AB=AF=E4=BB=A3?= =?UTF-8?q?=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Caches/CoursePackageList.php | 1 + app/Console/Tasks/SyncChapterCounterTask.php | 13 +- app/Console/Tasks/SyncCommentCounterTask.php | 14 +- app/Console/Tasks/SyncConsultCounterTask.php | 14 +- app/Console/Tasks/SyncCourseCounterTask.php | 14 +- app/Console/Tasks/SyncReviewCounterTask.php | 14 +- app/Http/Web/Views/course/chapters.volt | 28 --- app/Http/Web/Views/course/chapters_live.volt | 33 ++++ app/Http/Web/Views/course/chapters_read.volt | 31 ++++ app/Http/Web/Views/course/chapters_vod.volt | 32 ++++ app/Http/Web/Views/course/meta.volt | 20 ++ app/Http/Web/Views/course/packages.volt | 30 +++ app/Http/Web/Views/course/show.volt | 44 ++++- .../Web/Views/course/sidebar_recommended.volt | 17 +- .../Web/Views/course/sidebar_related.volt | 17 +- app/Http/Web/Views/partials/macro_course.volt | 30 ++- app/Http/Web/Views/search/list.volt | 2 +- app/Library/Helper.php | 4 +- app/Services/Frontend/Course/ChapterList.php | 4 + app/Services/Frontend/Course/PackageList.php | 10 +- public/static/web/css/common.css | 173 +++++++++++++++--- 21 files changed, 427 insertions(+), 118 deletions(-) delete mode 100644 app/Http/Web/Views/course/chapters.volt create mode 100644 app/Http/Web/Views/course/chapters_live.volt create mode 100644 app/Http/Web/Views/course/chapters_read.volt create mode 100644 app/Http/Web/Views/course/chapters_vod.volt create mode 100644 app/Http/Web/Views/course/meta.volt create mode 100644 app/Http/Web/Views/course/packages.volt diff --git a/app/Caches/CoursePackageList.php b/app/Caches/CoursePackageList.php index 3462825d..84858f47 100644 --- a/app/Caches/CoursePackageList.php +++ b/app/Caches/CoursePackageList.php @@ -45,6 +45,7 @@ class CoursePackageList extends Cache $result[] = [ 'id' => $package->id, 'title' => $package->title, + 'course_count' => $package->course_count, 'market_price' => $package->market_price, 'vip_price' => $package->vip_price, ]; diff --git a/app/Console/Tasks/SyncChapterCounterTask.php b/app/Console/Tasks/SyncChapterCounterTask.php index 97064fe8..2182e37e 100644 --- a/app/Console/Tasks/SyncChapterCounterTask.php +++ b/app/Console/Tasks/SyncChapterCounterTask.php @@ -52,16 +52,17 @@ class SyncChapterCounterTask extends Task $hour = date('H'); + $recount = $this->checkEnableRecount(); + foreach ($chapters as $chapter) { - if ($hour % 3 == 0) { + if ($recount && $hour % 3 == 0) { $chapter->user_count = $chapterRepo->countUsers($chapter->id); $chapter->lesson_count = $chapterRepo->countLessons($chapter->id); $chapter->comment_count = $chapterRepo->countComments($chapter->id); $chapter->agree_count = $chapterRepo->countAgrees($chapter->id); $chapter->oppose_count = $chapterRepo->countOpposes($chapter->id); - $chapter->update(); $counterCache->rebuild($chapter->id); @@ -78,7 +79,6 @@ class SyncChapterCounterTask extends Task $chapter->comment_count = $counter['comment_count']; $chapter->agree_count = $counter['agree_count']; $chapter->oppose_count = $counter['oppose_count']; - $chapter->update(); $chapterCache->rebuild($chapter->id); @@ -96,4 +96,11 @@ class SyncChapterCounterTask extends Task return $syncer->getSyncKey(); } + protected function checkEnableRecount() + { + $config = $this->getDI()->get('config'); + + return $config['recount_chapter'] ?? false; + } + } diff --git a/app/Console/Tasks/SyncCommentCounterTask.php b/app/Console/Tasks/SyncCommentCounterTask.php index 2d558e95..ea8ec5a7 100644 --- a/app/Console/Tasks/SyncCommentCounterTask.php +++ b/app/Console/Tasks/SyncCommentCounterTask.php @@ -49,14 +49,15 @@ class SyncCommentCounterTask extends Task $hour = date('H'); + $recount = $this->checkEnableRecount(); + foreach ($comments as $comment) { - if ($hour % 3 == 0) { + if ($recount && $hour % 3 == 0) { $comment->reply_count = $commentRepo->countReplies($comment->id); $comment->agree_count = $commentRepo->countAgrees($comment->id); $comment->oppose_count = $commentRepo->countOpposes($comment->id); - $comment->update(); $counterCache->rebuild($comment->id); @@ -66,11 +67,9 @@ class SyncCommentCounterTask extends Task $counter = $counterCache->get($comment->id); if ($counter) { - $comment->reply_count = $counter['reply_count']; $comment->agree_count = $counter['agree_count']; $comment->oppose_count = $counter['oppose_count']; - $comment->update(); } } @@ -86,4 +85,11 @@ class SyncCommentCounterTask extends Task return $syncer->getSyncKey(); } + protected function checkEnableRecount() + { + $config = $this->getDI()->get('config'); + + return $config['recount_comment'] ?? false; + } + } diff --git a/app/Console/Tasks/SyncConsultCounterTask.php b/app/Console/Tasks/SyncConsultCounterTask.php index afc5d021..1e4d3df0 100644 --- a/app/Console/Tasks/SyncConsultCounterTask.php +++ b/app/Console/Tasks/SyncConsultCounterTask.php @@ -49,13 +49,14 @@ class SyncConsultCounterTask extends Task $hour = date('H'); + $recount = $this->checkEnableRecount(); + foreach ($consults as $consult) { - if ($hour % 3 == 0) { + if ($recount && $hour % 3 == 0) { $consult->agree_count = $consultRepo->countAgrees($consult->id); $consult->oppose_count = $consultRepo->countOpposes($consult->id); - $consult->update(); $counterCache->rebuild($consult->id); @@ -65,10 +66,8 @@ class SyncConsultCounterTask extends Task $counter = $counterCache->get($consult->id); if ($counter) { - $consult->agree_count = $counter['agree_count']; $consult->oppose_count = $counter['oppose_count']; - $consult->update(); } } @@ -84,4 +83,11 @@ class SyncConsultCounterTask extends Task return $syncer->getSyncKey(); } + protected function checkEnableRecount() + { + $config = $this->getDI()->get('config'); + + return $config['recount_consult'] ?? false; + } + } diff --git a/app/Console/Tasks/SyncCourseCounterTask.php b/app/Console/Tasks/SyncCourseCounterTask.php index 6202efba..b4c63378 100644 --- a/app/Console/Tasks/SyncCourseCounterTask.php +++ b/app/Console/Tasks/SyncCourseCounterTask.php @@ -52,9 +52,11 @@ class SyncCourseCounterTask extends Task $hour = date('H'); + $recount = $this->checkEnableRecount(); + foreach ($courses as $course) { - if ($hour % 3 == 0) { + if ($recount && $hour % 3 == 0) { $course->user_count = $courseRepo->countUsers($course->id); $course->lesson_count = $courseRepo->countLessons($course->id); @@ -62,7 +64,6 @@ class SyncCourseCounterTask extends Task $course->consult_count = $courseRepo->countConsults($course->id); $course->review_count = $courseRepo->countReviews($course->id); $course->favorite_count = $courseRepo->countFavorites($course->id); - $course->update(); $counterCache->rebuild($course->id); @@ -73,14 +74,12 @@ class SyncCourseCounterTask extends Task $counter = $counterCache->get($course->id); if ($counter) { - $course->user_count = $counter['user_count']; $course->lesson_count = $counter['lesson_count']; $course->comment_count = $counter['comment_count']; $course->consult_count = $counter['consult_count']; $course->review_count = $counter['review_count']; $course->favorite_count = $counter['favorite_count']; - $course->update(); } } @@ -96,4 +95,11 @@ class SyncCourseCounterTask extends Task return $syncer->getSyncKey(); } + protected function checkEnableRecount() + { + $config = $this->getDI()->get('config'); + + return $config['recount_course'] ?? false; + } + } diff --git a/app/Console/Tasks/SyncReviewCounterTask.php b/app/Console/Tasks/SyncReviewCounterTask.php index ead634ba..826893d6 100644 --- a/app/Console/Tasks/SyncReviewCounterTask.php +++ b/app/Console/Tasks/SyncReviewCounterTask.php @@ -49,13 +49,14 @@ class SyncReviewCounterTask extends Task $hour = date('H'); + $recount = $this->checkEnableRecount(); + foreach ($reviews as $review) { - if ($hour % 3 == 0) { + if ($recount && $hour % 3 == 0) { $review->agree_count = $reviewRepo->countAgrees($review->id); $review->oppose_count = $reviewRepo->countOpposes($review->id); - $review->update(); $counterCache->rebuild($review->id); @@ -65,10 +66,8 @@ class SyncReviewCounterTask extends Task $counter = $counterCache->get($review->id); if ($counter) { - $review->agree_count = $counter['agree_count']; $review->oppose_count = $counter['oppose_count']; - $review->update(); } } @@ -84,4 +83,11 @@ class SyncReviewCounterTask extends Task return $syncer->getSyncKey(); } + protected function checkEnableRecount() + { + $config = $this->getDI()->get('config'); + + return $config['recount_review'] ?? false; + } + } diff --git a/app/Http/Web/Views/course/chapters.volt b/app/Http/Web/Views/course/chapters.volt deleted file mode 100644 index b6d19774..00000000 --- a/app/Http/Web/Views/course/chapters.volt +++ /dev/null @@ -1,28 +0,0 @@ -{%- macro lesson_info(lesson) %} - - {% set url = lesson.me.owned ? url({'for':'web.chapter.show','id':lesson.id}) : 'javascript:' %} - {% set free_badge = lesson.free ? '免费' : '' %} - - {% if lesson.attrs.model == 'vod' %} - {{ lesson.title }} {{ free_badge }} - {% elseif lesson.attrs.model == 'live' %} - {{ lesson.title }} {{ free_badge }} - {% elseif lesson.attrs.model == 'read' %} - {{ lesson.title }} {{ free_badge }} - {% endif %} -{%- endmacro %} - -
- {% for chapter in chapters %} -
-

{{ chapter.title }}

-
-
    - {% for lesson in chapter.children %} -
  • {{ lesson_info(lesson) }}
  • - {% endfor %} -
-
-
- {% endfor %} -
\ No newline at end of file diff --git a/app/Http/Web/Views/course/chapters_live.volt b/app/Http/Web/Views/course/chapters_live.volt new file mode 100644 index 00000000..b6e619c5 --- /dev/null +++ b/app/Http/Web/Views/course/chapters_live.volt @@ -0,0 +1,33 @@ +{%- 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() ? '已结束' : '' %} + + + + {{ lesson.title }} + {% if lesson.free == 1 %} + 免费 + {% endif %} + {% if lesson.me.duration > 0 %} + + {% endif %} + {{ date('m月d日',lesson.attrs.start_time) }} {{ date('H:i',lesson.attrs.start_time) }}~{{ date('H:i',lesson.attrs.end_time) }} {{ over_flag }} + + +{%- endmacro %} + +
+ {% for chapter in chapters %} +
+

{{ chapter.title }}

+
+
    + {% for lesson in chapter.children %} +
  • {{ live_lesson_info(lesson) }}
  • + {% endfor %} +
+
+
+ {% endfor %} +
\ No newline at end of file diff --git a/app/Http/Web/Views/course/chapters_read.volt b/app/Http/Web/Views/course/chapters_read.volt new file mode 100644 index 00000000..72640f68 --- /dev/null +++ b/app/Http/Web/Views/course/chapters_read.volt @@ -0,0 +1,31 @@ +{%- macro read_lesson_info(lesson) %} + + {% set url = lesson.me.owned ? url({'for':'web.chapter.show','id':lesson.id}) : 'javascript:' %} + + + + {{ lesson.title|e }} + {% if lesson.free == 1 %} + 免费 + {% endif %} + {% if lesson.me.duration > 0 %} + + {% endif %} + + +{%- endmacro %} + +
+ {% for chapter in chapters %} +
+

{{ chapter.title|e }}

+
+
    + {% for lesson in chapter.children %} +
  • {{ read_lesson_info(lesson) }}
  • + {% endfor %} +
+
+
+ {% endfor %} +
\ No newline at end of file diff --git a/app/Http/Web/Views/course/chapters_vod.volt b/app/Http/Web/Views/course/chapters_vod.volt new file mode 100644 index 00000000..1191f4e9 --- /dev/null +++ b/app/Http/Web/Views/course/chapters_vod.volt @@ -0,0 +1,32 @@ +{%- macro vod_lesson_info(lesson) %} + + {% set url = lesson.me.owned ? url({'for':'web.chapter.show','id':lesson.id}) : 'javascript:' %} + + + + {{ lesson.title }} + {% if lesson.free == 1 %} + 免费 + {% endif %} + {% if lesson.me.duration > 0 %} + + {% endif %} + {{ lesson.attrs.duration|total_duration }} + + +{%- endmacro %} + +
+ {% for chapter in chapters %} +
+

{{ chapter.title }}

+
+
    + {% for lesson in chapter.children %} +
  • {{ vod_lesson_info(lesson) }}
  • + {% endfor %} +
+
+
+ {% endfor %} +
\ No newline at end of file diff --git a/app/Http/Web/Views/course/meta.volt b/app/Http/Web/Views/course/meta.volt new file mode 100644 index 00000000..204cce3e --- /dev/null +++ b/app/Http/Web/Views/course/meta.volt @@ -0,0 +1,20 @@ +
+ {{ course.summary|e }} +
+ +
+

课程时长:{{ course.attrs.duration|total_duration }}

+

+ 学习期限:{{ course.study_expiry }}个月 + 退款期限:{{ course.refund_expiry }}天 +

+

+ 市场价格:¥{{ course.market_price }} + 会员价格:¥{{ course.vip_price }} +

+

+ {{ course.user_count }}次学习 + {{ course.review_count }}次评价 + {{ course.favorite_count }}次收藏 +

+
\ No newline at end of file diff --git a/app/Http/Web/Views/course/packages.volt b/app/Http/Web/Views/course/packages.volt new file mode 100644 index 00000000..69453e37 --- /dev/null +++ b/app/Http/Web/Views/course/packages.volt @@ -0,0 +1,30 @@ +
+ {% for package in packages %} + {% set order_url = url({'for':'web.order.confirm'},{'item_id':package.id,'item_type':'package'}) %} +
+
+
{{ package.title }}
+
+ {{ package.course_count }} 门课程 + 总价 ¥{{ package.origin_price }} +
+
+ 市场价 ¥{{ package.market_price }} + 会员价 ¥{{ package.vip_price }} +
+ +
+
+ {% for course in package.courses %} + {% set course_url = url({'for':'web.course.show','id':course.id}) %} + + {% endfor %} +
+
+ {% endfor %} +
\ No newline at end of file diff --git a/app/Http/Web/Views/course/show.volt b/app/Http/Web/Views/course/show.volt index 1297cd28..0e393370 100644 --- a/app/Http/Web/Views/course/show.volt +++ b/app/Http/Web/Views/course/show.volt @@ -2,6 +2,8 @@ {% block content %} + {{ partial('partials/macro_course') }} + +
+ {{ partial('course/meta') }} +
+ + {% set show_packages = packages ? 1 : 0 %} + {% set show_consults = course.market_price > 0 ? 1 : 0 %} + {% set show_reviews = course.market_price > 0 ? 1 : 0 %} +
-
-
-
-
-
+
  • 详情
  • 目录
  • -
  • 评价
  • + {% if show_packages == 1 %} +
  • 套餐
  • + {% endif %} + {% if show_consults == 1 %} +
  • 咨询
  • + {% endif %} + {% if show_reviews == 1 %} +
  • 评价
  • + {% endif %}
{{ course.details }}
- {{ partial('course/chapters', {'chapters':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 %}
-
内容3
+ {% if show_packages == 1 %} +
{{ partial('course/packages') }}
+ {% endif %} + {% if show_consults == 1 %} +
咨询
+ {% endif %} + {% if show_reviews == 1 %} +
评价
+ {% endif %}
diff --git a/app/Http/Web/Views/course/sidebar_recommended.volt b/app/Http/Web/Views/course/sidebar_recommended.volt index 3efa3136..6504d0af 100644 --- a/app/Http/Web/Views/course/sidebar_recommended.volt +++ b/app/Http/Web/Views/course/sidebar_recommended.volt @@ -2,22 +2,7 @@
推荐课程
{% for course in recommended_courses %} - {% set url = url({'for':'web.course.show','id':course.id}) %} - + {{ sidebar_course_card(course) }} {% endfor %}
\ No newline at end of file diff --git a/app/Http/Web/Views/course/sidebar_related.volt b/app/Http/Web/Views/course/sidebar_related.volt index 9c80d9a2..c9913fa5 100644 --- a/app/Http/Web/Views/course/sidebar_related.volt +++ b/app/Http/Web/Views/course/sidebar_related.volt @@ -2,22 +2,7 @@
相关课程
{% for course in related_courses %} - {% set url = url({'for':'web.course.show','id':course.id}) %} - + {{ sidebar_course_card(course) }} {% endfor %}
\ No newline at end of file diff --git a/app/Http/Web/Views/partials/macro_course.volt b/app/Http/Web/Views/partials/macro_course.volt index c7e4fe29..eca02472 100644 --- a/app/Http/Web/Views/partials/macro_course.volt +++ b/app/Http/Web/Views/partials/macro_course.volt @@ -21,14 +21,15 @@ {%- endmacro %} {%- macro course_card(course) %} + {% set course_url = url({'for':'web.course.show','id':course.id}) %}
{% if course.market_price > 0 %} @@ -44,4 +45,29 @@ {% endif %}
+{%- endmacro %} + +{%- macro sidebar_course_card(course) %} + {% set course_url = url({'for':'web.course.show','id':course.id}) %} + {%- endmacro %} \ No newline at end of file diff --git a/app/Http/Web/Views/search/list.volt b/app/Http/Web/Views/search/list.volt index 463625a2..1f80134c 100644 --- a/app/Http/Web/Views/search/list.volt +++ b/app/Http/Web/Views/search/list.volt @@ -13,7 +13,7 @@
-
+
{% if type == 'course' %} {{ partial('search/content_course') }} {% elseif type == 'other' %} diff --git a/app/Library/Helper.php b/app/Library/Helper.php index 0327e41f..1ccbb645 100644 --- a/app/Library/Helper.php +++ b/app/Library/Helper.php @@ -267,11 +267,11 @@ function kg_total_duration($time) $format = []; - if ($hours >= 0) { + if ($hours > 0) { $format[] = sprintf('%02d小时', $hours); } - if ($minutes >= 0) { + if ($minutes > 0) { $format[] = sprintf('%02d分钟', $minutes); } diff --git a/app/Services/Frontend/Course/ChapterList.php b/app/Services/Frontend/Course/ChapterList.php index a6eedf39..74b1ec38 100644 --- a/app/Services/Frontend/Course/ChapterList.php +++ b/app/Services/Frontend/Course/ChapterList.php @@ -41,6 +41,7 @@ class ChapterList extends FrontendService $lesson['me'] = [ 'owned' => $this->ownedCourse || $lesson['free'] ? 1 : 0, 'progress' => 0, + 'duration' => 0, ]; } } @@ -51,6 +52,7 @@ class ChapterList extends FrontendService $lesson['me'] = [ 'owned' => $this->ownedCourse || $lesson['free'] ? 1 : 0, 'progress' => $mappings[$lesson['id']]['progress'] ?? 0, + 'duration' => $mappings[$lesson['id']]['duration'] ?? 0, ]; } } @@ -74,6 +76,8 @@ class ChapterList extends FrontendService foreach ($userLearnings as $learning) { $mappings[$learning['chapter_id']] = [ 'progress' => $learning['progress'], + 'duration' => $learning['duration'], + 'consumed' => $learning['consumed'], ]; } diff --git a/app/Services/Frontend/Course/PackageList.php b/app/Services/Frontend/Course/PackageList.php index 12ba17b2..bd184d72 100644 --- a/app/Services/Frontend/Course/PackageList.php +++ b/app/Services/Frontend/Course/PackageList.php @@ -32,7 +32,15 @@ class PackageList extends FrontendService $courses = $cache->get($package['id']); - $package['courses'] = $courses ?: []; + $package['origin_price'] = 0.00; + $package['courses'] = []; + + if ($courses) { + foreach ($courses as $course) { + $package['origin_price'] += $course['market_price']; + } + $package['courses'] = $courses; + } $result[] = $package; } diff --git a/public/static/web/css/common.css b/public/static/web/css/common.css index 9a16d8aa..b55b114a 100644 --- a/public/static/web/css/common.css +++ b/public/static/web/css/common.css @@ -22,6 +22,14 @@ body { float: right; } +.bg-white { + background-color: #fff; +} + +.layui-badge, .layui-badge-rim { + padding-bottom: 1px; +} + #header { left: 0; top: 0; @@ -88,15 +96,21 @@ body { margin-bottom: 20px; } +.module { + padding: 20px; + margin-bottom: 15px; + background-color: #fff; + border-radius: 2px; + box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.05); +} + .pager { text-align: center; } .layout-content { float: left; - width: 730px; - padding: 30px; - background-color: #fff; + width: 760px; } .layout-sidebar { @@ -167,6 +181,12 @@ body { border-bottom: 1px dashed #ccc; } +.search-course-card:last-child { + padding-bottom: 0; + margin-bottom: 0; + border: none; +} + .search-course-card .cover { float: left; width: 210px; @@ -284,40 +304,147 @@ body { margin-bottom: 20px; } -.course-meta { - border: 1px dashed #ccc; - margin-bottom: 30px; -} - -.course-meta .left { +.course-meta .cover { float: left; + margin-right: 10px; } -.course-meta .right { - float: right; +.course-meta .info { + float: left; + font-size: 12px; +} + +.course-meta .cover img { + width: 210px; + height: 118px; +} + +.course-meta p { + line-height: 30px; +} + +.course-meta .stats span { + margin-right: 5px; +} + +.course-info-tab { + margin: 0; } .course-info-tab .layui-tab-content { - padding-top: 30px; + padding: 20px 0; } -ul.lesson-list { - -} - -.lesson-list li { - padding-left: 10px; +.lesson-item { + position: relative; + padding: 0 10px; line-height: 40px; } -.lesson-list li a { +.lesson-item a { display: block; } -.lesson-list li:hover { +.lesson-item .title { + margin: 0 5px; +} + +.lesson-item .free-badge { + margin-right: 5px; +} + +.lesson-item .duration, .lesson-item .live { + top: 0; + right: 10px; + position: absolute; + color: #999; +} + +.lesson-item .study-time { + color: green; +} + +.lesson-item:hover { background-color: #f2f2f2; } +.package-item { + margin-bottom: 15px; + border-bottom: 1px dashed #ccc; +} + +.package-item:last-child { + padding-bottom: 0; + margin-bottom: 0; + border: none; +} + +.package-info { + float: left; + width: 180px; + font-size: 12px; + text-align: center; +} + +.package-info span { + margin-right: 5px; +} + +.package-info .title { + margin-bottom: 10px; +} + +.package-info .origin-price { + color: #999; + margin-bottom: 10px; +} + +.package-info .origin-price i { + color: red; + font-style: normal; + text-decoration: line-through; +} + +.package-info .price { + color: #999; + margin-bottom: 15px; +} + +.package-info .price i { + color: red; + font-style: normal; +} + +.package-course-list { + width: 580px; + height: 170px; + overflow-x: auto; + white-space: nowrap; +} + +.package-course-card { + width: 180px; + display: inline-block; + margin-right: 10px; + vertical-align: top; +} + +.package-course-card .cover { + width: 180px; + height: 96px; + margin-bottom: 10px; +} + +.package-course-card .cover img { + width: 100%; + height: 100%; +} + +.package-course-card .title { + font-size: 12px; + white-space: normal; +} + .sidebar-teacher-card { margin-bottom: 15px; } @@ -380,18 +507,14 @@ ul.lesson-list { float: left; width: 190px; color: #999; + font-size: 12px; overflow: hidden; } .sidebar-course-card .title { - font-size: 12px; white-space: nowrap; } -.sidebar-course-card .meta { - font-size: 10px; -} - .sidebar-course-card .meta span { margin-right: 10px; }