1
0
mirror of https://gitee.com/koogua/course-tencent-cloud.git synced 2025-06-23 03:50:56 +08:00

更新composer包,优化前台课程页

This commit is contained in:
xiaochong0302 2020-09-15 20:01:37 +08:00
parent 504e8e0171
commit 970f2b8903
13 changed files with 239 additions and 178 deletions

View File

@ -9,7 +9,7 @@
- [前台演示](https://ctc.koogua.com)
- [后台演示](https://ctc.koogua.com/admin)
帐号100015@163.com / 123456 (前后台通用)
> 帐号100015@163.com / 123456 (前后台通用)
PS**管理后台已禁止提交并隐藏私人配置**
@ -19,7 +19,7 @@ PS**管理后台已禁止提交并隐藏私人配置**
- 前端框架:[layui 2.5.6](https://layui.com) [layim 3.9.5](https://www.layui.com/layim)(已授权)
- 全文检索:[xunsearch 1.4.9](http://www.xunsearch.com)
- 即时通讯:[workerman 3.5.22](https://workerman.net)
- 其它依赖:[php7.3](https://php.net) [mysql5.7](https://mysql.com) [redis5.0](https://redis.io)
- 基础依赖:[php7.3](https://php.net) [mysql5.7](https://mysql.com) [redis5.0](https://redis.io)
#### 使用协议
@ -56,7 +56,7 @@ PS**管理后台已禁止提交并隐藏私人配置**
#### 通过这个项目能学到什么?
1. 项目规划phalcon实战缓存JWT即时通讯全文检索
2. docker操作docker服务编排supervisordevops
2. dockersupervisordevops
3. gitlinuxphpmysqlredisnginx
#### 开发计划
@ -73,7 +73,7 @@ PS**管理后台已禁止提交并隐藏私人配置**
#### 加入我们
这是我的创业项目,个人能力和精力有限,要兼顾产品规划以及开发,还要处理除报税记账之外的所有琐碎事情。
目前在南山科技园某个众创空间,希望有能独挡一面的**深圳前端同学**加入我们。
这是我的创业项目,个人能力和精力有限,要兼顾产品规划以及开发,还要处理很多琐碎事情。
目前在南山科技园某个众创空间,希望有 **深圳前端同学** 加入我们。
联系邮箱76632555@qq.com

View File

@ -5,9 +5,9 @@ namespace App\Http\Desktop\Controllers;
use App\Http\Desktop\Services\CourseQuery as CourseQueryService;
use App\Services\Frontend\Course\ChapterList as CourseChapterListService;
use App\Services\Frontend\Course\ConsultList as CourseConsultListService;
use App\Services\Frontend\Course\CourseFavorite as CourseFavoriteService;
use App\Services\Frontend\Course\CourseInfo as CourseInfoService;
use App\Services\Frontend\Course\CourseList as CourseListService;
use App\Services\Frontend\Course\Favorite as CourseFavoriteService;
use App\Services\Frontend\Course\PackageList as CoursePackageListService;
use App\Services\Frontend\Course\RecommendedList as CourseRecommendedListService;
use App\Services\Frontend\Course\RelatedList as CourseRelatedListService;

View File

@ -27,7 +27,7 @@
{% if lesson.me.duration > 0 %}
<span class="study-time" title="学习时长:{{ lesson.me.duration|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>
<span class="live" title="{{ date('Y-m-d H:i',lesson.attrs.start_time) }}">{{ live_status_info(lesson) }}</span>
</a>
{%- endmacro %}
@ -46,6 +46,16 @@
</a>
{%- 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>
{% elseif lesson.attrs.start_time > time() %}
<span class="pending">{{ date('m月d日 H:i',lesson.attrs.start_time) }} 倒计时</span>
{% elseif lesson.attrs.end_time < time() %}
<span class="finished">{{ date('m月d日 H:i',lesson.attrs.start_time) }} 已结束</span>
{% endif %}
{%- endmacro %}
<div class="layui-collapse">
{% for chapter in chapters %}
<div class="layui-colla-item">
@ -53,11 +63,11 @@
<div class="layui-colla-content layui-show">
<ul class="lesson-list">
{% for lesson in chapter.children %}
{% if lesson.model == '1' %}
{% if lesson.model == 1 %}
<li class="lesson-item clearfix">{{ vod_lesson_info(lesson) }}</li>
{% elseif lesson.model == '2' %}
{% elseif lesson.model == 2 %}
<li class="lesson-item clearfix">{{ live_lesson_info(lesson) }}</li>
{% elseif lesson.model == '3' %}
{% elseif lesson.model == 3 %}
<li class="lesson-item clearfix">{{ read_lesson_info(lesson) }}</li>
{% endif %}
{% endfor %}

View File

@ -1,40 +1,72 @@
<div class="course-meta wrap clearfix">
<div class="cover">
<img src="{{ course.cover }}" alt="{{ course.title|e }}">
</div>
<div class="info">
{% if course.model == '1' %}
{%- macro vod_meta_info(course) %}
<p class="item">
<span class="key">课程时长</span><span class="value">{{ course.attrs.duration|duration }}</span>
</p>
{% elseif course.model == '2' %}
{{ meta_expiry_info(course) }}
{{ meta_price_info(course) }}
{{ meta_stats_info(course) }}
{%- endmacro %}
{%- macro live_meta_info(course) %}
<p class="item">
<span class="key">直播时间</span><span class="value">{{ course.attrs.start_date }} ~ {{ course.attrs.end_date }}</span>
</p>
{% endif %}
{% if course.market_price > 0 %}
{{ meta_expiry_info(course) }}
{{ meta_price_info(course) }}
{{ meta_stats_info(course) }}
{%- endmacro %}
{%- macro read_meta_info(course) %}
<p class="item">
<span class="key">课程时长</span><span class="value">{{ course.attrs.duration|duration }}</span>
</p>
{{ meta_expiry_info(course) }}
{{ meta_price_info(course) }}
{{ meta_stats_info(course) }}
{%- endmacro %}
{%- macro meta_expiry_info(course) %}
<p class="item">
<span class="key">学习期限</span><span class="value">{{ course.study_expiry }}个月</span>
<span class="key">退款期限</span><span class="value">{{ course.refund_expiry }}天</span>
</p>
{% endif %}
{%- endmacro %}
{%- macro meta_price_info(course) %}
<p class="item">
{% if course.market_price > 0 %}
<span class="key">市场价格</span><span class="price">{{ '¥%0.2f'|format(course.market_price) }}</span>
<span class="key">市场价格</span><span class="value price">{{ '¥%0.2f'|format(course.market_price) }}</span>
{% else %}
<span class="key">市场价格</span><span class="free">免费</span>
<span class="key">市场价格</span><span class="value free">免费</span>
{% endif %}
{% if course.vip_price > 0 %}
<span class="key">会员价格</span><span class="price">{{ '¥%0.2f'|format(course.vip_price) }}</span>
<span class="key">会员价格</span><span class="value price">{{ '¥%0.2f'|format(course.vip_price) }}</span>
{% else %}
<span class="key">会员价格</span><span class="free">免费</span>
<span class="key">会员价格</span><span class="value free">免费</span>
{% endif %}
</p>
{%- endmacro %}
{%- macro meta_stats_info(course) %}
<p class="item">
<span class="key">难度级别</span><span class="value">{{ level_info(course.level) }}</span>
<span class="key">学习人次</span><span class="value">{{ course.user_count }}</span>
<span class="key">综合评分</span><span class="value">{{ "%0.1f"|format(course.ratings.rating) }}</span>
</p>
{%- endmacro %}
<div class="course-meta wrap clearfix">
<div class="cover">
<img src="{{ course.cover }}!cover_270" alt="{{ course.title }}">
</div>
<div class="info">
{% if course.model == 1 %}
{{ vod_meta_info(course) }}
{% elseif course.model == 2 %}
{{ live_meta_info(course) }}
{% elseif course.model == 3 %}
{{ read_meta_info(course) }}
{% endif %}
</div>
<div class="rating">
<p class="item">

View File

@ -23,7 +23,9 @@
<div class="vip-option-card">
<div class="title">{{ option.title }}</div>
<div class="price">¥{{ option.price }}</div>
<div class="order"><a class="layui-btn layui-btn-sm layui-bg-red" href="{{ order_url }}">立即开通</a></div>
<div class="order">
<button class="layui-btn layui-btn-sm layui-bg-red btn-order" data-url="{{ order_url }}">立即开通</button>
</div>
</div>
</div>
{% endfor %}

View File

@ -147,18 +147,21 @@ class ChapterInfo extends FrontendService
protected function incrUserCourseCount(UserModel $user)
{
$user->course_count += 1;
$user->update();
}
protected function incrCourseUserCount(CourseModel $course)
{
$course->user_count += 1;
$course->update();
}
protected function incrChapterUserCount(ChapterModel $chapter)
{
$chapter->user_count += 1;
$chapter->update();
}

View File

@ -64,6 +64,7 @@ class ConsultLike extends FrontendService
protected function incrLikeCount(ConsultModel $consult)
{
$consult->like_count += 1;
$consult->update();
}

View File

@ -10,7 +10,7 @@ use App\Services\Frontend\CourseTrait;
use App\Services\Frontend\Service as FrontendService;
use App\Validators\UserLimit as UserLimitValidator;
class Favorite extends FrontendService
class CourseFavorite extends FrontendService
{
use CourseTrait;
@ -66,6 +66,7 @@ class Favorite extends FrontendService
protected function incrCourseFavoriteCount(CourseModel $course)
{
$course->favorite_count += 1;
$course->update();
}
@ -80,6 +81,7 @@ class Favorite extends FrontendService
protected function incrUserFavoriteCount(UserModel $user)
{
$user->favorite_count += 1;
$user->update();
}

View File

@ -64,6 +64,7 @@ class ReviewLike extends FrontendService
protected function incrLikeCount(ReviewModel $review)
{
$review->like_count += 1;
$review->update();
}

View File

@ -10,13 +10,13 @@
"swiftmailer/swiftmailer": "^6.0",
"peppeocchi/php-cron-scheduler": "^2.4",
"yansongda/pay": "^2.9",
"tencentcloud/tencentcloud-sdk-php": "3.*",
"qcloudsms/qcloudsms_php": "0.1.*",
"qcloud/cos-sdk-v5": "2.*",
"workerman/gateway-worker": "^3.0.12",
"workerman/gatewayclient": "^3.0.12",
"tencentcloud/tencentcloud-sdk-php": "^3.0",
"qcloudsms/qcloudsms_php": "^0.1",
"qcloud/cos-sdk-v5": "^2.0",
"workerman/gateway-worker": "^3.0",
"workerman/gatewayclient": "^3.0",
"whichbrowser/parser": "^2.0",
"hightman/xunsearch": "^1.4.14",
"hightman/xunsearch": "^1.4",
"aferrandini/phpqrcode": "1.0.1",
"xiaochong0302/ip2region": "^1.0",
"robmorgan/phinx": "^0.12",

48
composer.lock generated
View File

@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
"content-hash": "66628b38c16e2071e5636757472860e8",
"content-hash": "cce345a8509cd31ff8492310a2a2332a",
"packages": [
{
"name": "aferrandini/phpqrcode",
@ -749,16 +749,16 @@
},
{
"name": "hightman/xunsearch",
"version": "1.4.14",
"version": "1.4.15",
"source": {
"type": "git",
"url": "https://github.com/hightman/xs-sdk-php.git",
"reference": "d2faba65b9b4c0c0ea6e8b2ad5bafdefcbf3db87"
"reference": "8ec1a3aa3ef58b83cd4e0e72a171f6446f4136b9"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/hightman/xs-sdk-php/zipball/d2faba65b9b4c0c0ea6e8b2ad5bafdefcbf3db87",
"reference": "d2faba65b9b4c0c0ea6e8b2ad5bafdefcbf3db87",
"url": "https://api.github.com/repos/hightman/xs-sdk-php/zipball/8ec1a3aa3ef58b83cd4e0e72a171f6446f4136b9",
"reference": "8ec1a3aa3ef58b83cd4e0e72a171f6446f4136b9",
"shasum": "",
"mirrors": [
{
@ -790,7 +790,7 @@
"hightman\\xunsearch\\": "wrapper/yii2-ext/"
}
},
"notification-url": "https://packagist.jp/downloads/",
"notification-url": "https://packagist.org/downloads/",
"license": [
"GPL-2.0+"
],
@ -809,7 +809,7 @@
"yii",
"yii2"
],
"time": "2019-11-01T02:17:32+00:00"
"time": "2020-09-03T16:46:04+00:00"
},
{
"name": "lcobucci/jwt",
@ -1438,16 +1438,16 @@
},
{
"name": "qcloud/cos-sdk-v5",
"version": "v2.0.0",
"version": "v2.0.9",
"source": {
"type": "git",
"url": "https://github.com/tencentyun/cos-php-sdk-v5.git",
"reference": "a8ac2dc1f58ddb36e5d702d19f9d7cb8d6f1dc5e"
"reference": "d9fa5e8468ce4462d671976555efaa9acd2896e4"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/tencentyun/cos-php-sdk-v5/zipball/a8ac2dc1f58ddb36e5d702d19f9d7cb8d6f1dc5e",
"reference": "a8ac2dc1f58ddb36e5d702d19f9d7cb8d6f1dc5e",
"url": "https://api.github.com/repos/tencentyun/cos-php-sdk-v5/zipball/d9fa5e8468ce4462d671976555efaa9acd2896e4",
"reference": "d9fa5e8468ce4462d671976555efaa9acd2896e4",
"shasum": "",
"mirrors": [
{
@ -1487,7 +1487,7 @@
"php",
"qcloud"
],
"time": "2019-09-25T12:28:54+00:00"
"time": "2020-06-16T13:09:21+00:00"
},
{
"name": "qcloudsms/qcloudsms_php",
@ -2951,16 +2951,16 @@
},
{
"name": "tencentcloud/tencentcloud-sdk-php",
"version": "3.0.92",
"version": "3.0.251",
"source": {
"type": "git",
"url": "https://github.com/TencentCloud/tencentcloud-sdk-php.git",
"reference": "71164956c234368c65c00e321e96f6dbd0f8d9c0"
"reference": "a3b3054262e48776e8014d5e385a8932b0102f29"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/TencentCloud/tencentcloud-sdk-php/zipball/71164956c234368c65c00e321e96f6dbd0f8d9c0",
"reference": "71164956c234368c65c00e321e96f6dbd0f8d9c0",
"url": "https://api.github.com/repos/TencentCloud/tencentcloud-sdk-php/zipball/a3b3054262e48776e8014d5e385a8932b0102f29",
"reference": "a3b3054262e48776e8014d5e385a8932b0102f29",
"shasum": "",
"mirrors": [
{
@ -2972,7 +2972,7 @@
"require": {
"guzzlehttp/guzzle": "^6.3",
"guzzlehttp/psr7": "^1.4",
"php": ">=5.6.33"
"php": ">=5.6.0"
},
"type": "library",
"autoload": {
@ -2997,7 +2997,7 @@
],
"description": "TencentCloudApi php sdk",
"homepage": "https://github.com/TencentCloud/tencentcloud-sdk-php",
"time": "2019-09-27T09:23:30+00:00"
"time": "2020-09-15T00:59:07+00:00"
},
{
"name": "whichbrowser/parser",
@ -3066,16 +3066,16 @@
},
{
"name": "workerman/gateway-worker",
"version": "v3.0.13",
"version": "v3.0.18",
"source": {
"type": "git",
"url": "https://github.com/walkor/GatewayWorker.git",
"reference": "38b44c95f21cd340b5a9cff3987ddb2abb9a2a38"
"reference": "50d3a77deb7f7fb206d641ee0307ae1c41d5d41d"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/walkor/GatewayWorker/zipball/38b44c95f21cd340b5a9cff3987ddb2abb9a2a38",
"reference": "38b44c95f21cd340b5a9cff3987ddb2abb9a2a38",
"url": "https://api.github.com/repos/walkor/GatewayWorker/zipball/50d3a77deb7f7fb206d641ee0307ae1c41d5d41d",
"reference": "50d3a77deb7f7fb206d641ee0307ae1c41d5d41d",
"shasum": "",
"mirrors": [
{
@ -3085,7 +3085,7 @@
]
},
"require": {
"workerman/workerman": ">=3.1.8"
"workerman/workerman": ">=3.5.0"
},
"type": "library",
"autoload": {
@ -3102,7 +3102,7 @@
"communication",
"distributed"
],
"time": "2019-07-02T11:55:24+00:00"
"time": "2020-07-15T06:45:01+00:00"
},
{
"name": "workerman/gatewayclient",

View File

@ -92,6 +92,11 @@
width: 320px;
}
.layui-main .vditor-reset {
font: 14px Helvetica Neue, Helvetica, PingFang SC, Tahoma, Arial, sans-serif;
color: #666;
}
body {
display: flex;
flex-flow: column;
@ -500,7 +505,6 @@ body {
.course-meta .info .price {
color: red;
font-size: 14px;
}
.course-meta .info .free {
@ -548,11 +552,6 @@ body {
font-size: 30px;
}
.course-details {
line-height: 1.8em;
color: #666;
}
.lesson-item {
position: relative;
padding: 0 10px;
@ -583,6 +582,10 @@ body {
color: #666;
}
.lesson-item .live .active {
color: red;
}
.lesson-item .study-time {
color: green;
}

View File

@ -3,6 +3,13 @@ layui.use(['jquery', 'helper'], function () {
var $ = layui.jquery;
var helper = layui.helper;
$('.btn-order').on('click', function () {
var url = $(this).data('url');
helper.checkLogin(function () {
window.location.href = url;
});
});
if ($('#tab-discount-courses').length > 0) {
var $tabDiscountCourses = $('#tab-discount-courses');
helper.ajaxLoadHtml($tabDiscountCourses.data('url'), $tabDiscountCourses.attr('id'));