1
0
mirror of https://gitee.com/koogua/course-tencent-cloud.git synced 2025-06-25 12:09:09 +08:00

会员页细分畅学和优惠课程

This commit is contained in:
xiaochong0302 2020-07-30 20:50:11 +08:00
parent fdce89a4e7
commit 8c90b35991
29 changed files with 259 additions and 88 deletions

View File

@ -32,7 +32,7 @@
<legend>上传视频</legend> <legend>上传视频</legend>
</fieldset> </fieldset>
<form class="layui-form kg-form" method="POST" action="{{ url({'for':'admin.chapter.content','id':chapter.id}) }}"> <form class="layui-form kg-form" id="vod-form" method="POST" action="{{ url({'for':'admin.chapter.content','id':chapter.id}) }}">
<div class="layui-form-item" id="upload-block"> <div class="layui-form-item" id="upload-block">
<label class="layui-form-label">视频文件</label> <label class="layui-form-label">视频文件</label>
@ -54,7 +54,7 @@
<div class="layui-form-item"> <div class="layui-form-item">
<label class="layui-form-label">文件编号</label> <label class="layui-form-label">文件编号</label>
<div class="layui-input-block"> <div class="layui-input-block">
<input class="layui-input" type="text" name="file_id" value="{{ vod.file_id }}" readonly="true" lay-verify="required"> <input class="layui-input" type="text" name="file_id" value="{{ vod.file_id }}" readonly="readonly" lay-verify="required">
</div> </div>
</div> </div>

View File

@ -50,10 +50,9 @@
uploader.done().then(function (result) { uploader.done().then(function (result) {
$('input[name=file_id]').val(result.fileId); $('input[name=file_id]').val(result.fileId);
var chapterId = $('input[name=chapter_id]').val();
$.ajax({ $.ajax({
type: 'POST', type: 'POST',
url: '/admin/chapter/' + chapterId + '/content', url: $('#vod-form').attr('action'),
data: {file_id: result.fileId} data: {file_id: result.fileId}
}); });
}); });

View File

@ -18,6 +18,14 @@ class ImGroupController extends Controller
} }
/**
* @Get("/{id:[0-9]+}", name="web.im_group.show")
*/
public function showAction($id)
{
}
/** /**
* @Get("/{id:[0-9]+}/users", name="web.im_group.users") * @Get("/{id:[0-9]+}/users", name="web.im_group.users")
*/ */

View File

@ -30,11 +30,13 @@ class VipController extends Controller
*/ */
public function coursesAction() public function coursesAction()
{ {
$type = $this->request->getQuery('type', 'trim', 'discount');
$service = new VipCourseListService(); $service = new VipCourseListService();
$pager = $service->handle(); $pager = $service->handle($type);
$pager->items = kg_array_object($pager->items); $pager->items = kg_array_object($pager->items);
$pager->target = 'tab-courses'; $pager->target = "tab-{$type}-courses";
$this->view->setRenderLevel(View::LEVEL_ACTION_VIEW); $this->view->setRenderLevel(View::LEVEL_ACTION_VIEW);
$this->view->setVar('pager', $pager); $this->view->setVar('pager', $pager);

View File

@ -30,26 +30,26 @@
<div class="layout-main clearfix"> <div class="layout-main clearfix">
{% set show_tab_chapters = course.lesson_count > 0 ? 1 : 0 %} {% set show_tab_chapters = course.lesson_count > 0 %}
{% set show_tab_packages = course.package_count > 0 ? 1 : 0 %} {% set show_tab_packages = course.package_count > 0 %}
{% set show_tab_consults = course.consult_count > 0 ? 1 : 0 %} {% set show_tab_consults = course.consult_count > 0 %}
{% set show_tab_reviews = course.review_count > 0 ? 1 : 0 %} {% set show_tab_reviews = course.review_count > 0 %}
<div class="layout-content"> <div class="layout-content">
<div class="course-tab-wrap wrap"> <div class="course-tab-wrap wrap">
<div class="layui-tab layui-tab-brief course-tab"> <div class="layui-tab layui-tab-brief course-tab">
<ul class="layui-tab-title"> <ul class="layui-tab-title">
<li class="layui-this">详情</li> <li class="layui-this">详情</li>
{% if show_tab_chapters == 1 %} {% if show_tab_chapters %}
<li>目录<span class="tab-count">{{ course.lesson_count }}</span></li> <li>目录<span class="tab-count">{{ course.lesson_count }}</span></li>
{% endif %} {% endif %}
{% if show_tab_packages == 1 %} {% if show_tab_packages %}
<li>套餐<span class="tab-count">{{ course.package_count }}</span></li> <li>套餐<span class="tab-count">{{ course.package_count }}</span></li>
{% endif %} {% endif %}
{% if show_tab_consults == 1 %} {% if show_tab_consults %}
<li>咨询<span class="tab-count">{{ course.consult_count }}</span></li> <li>咨询<span class="tab-count">{{ course.consult_count }}</span></li>
{% endif %} {% endif %}
{% if show_tab_reviews == 1 %} {% if show_tab_reviews %}
<li>评价<span class="tab-count">{{ course.review_count }}</span></li> <li>评价<span class="tab-count">{{ course.review_count }}</span></li>
{% endif %} {% endif %}
</ul> </ul>
@ -57,19 +57,19 @@
<div class="layui-tab-item layui-show"> <div class="layui-tab-item layui-show">
<div class="course-details">{{ course.details }}</div> <div class="course-details">{{ course.details }}</div>
</div> </div>
{% if show_tab_chapters == 1 %} {% if show_tab_chapters %}
{% set chapters_url = url({'for':'web.course.chapters','id':course.id}) %} {% set chapters_url = url({'for':'web.course.chapters','id':course.id}) %}
<div class="layui-tab-item" id="tab-chapters" data-url="{{ chapters_url }}"></div> <div class="layui-tab-item" id="tab-chapters" data-url="{{ chapters_url }}"></div>
{% endif %} {% endif %}
{% if show_tab_packages == 1 %} {% if show_tab_packages %}
{% set packages_url = url({'for':'web.course.packages','id':course.id}) %} {% set packages_url = url({'for':'web.course.packages','id':course.id}) %}
<div class="layui-tab-item" id="tab-packages" data-url="{{ packages_url }}"></div> <div class="layui-tab-item" id="tab-packages" data-url="{{ packages_url }}"></div>
{% endif %} {% endif %}
{% if show_tab_consults == 1 %} {% if show_tab_consults %}
{% set consults_url = url({'for':'web.course.consults','id':course.id}) %} {% set consults_url = url({'for':'web.course.consults','id':course.id}) %}
<div class="layui-tab-item" id="tab-consults" data-url="{{ consults_url }}"></div> <div class="layui-tab-item" id="tab-consults" data-url="{{ consults_url }}"></div>
{% endif %} {% endif %}
{% if show_tab_reviews == 1 %} {% if show_tab_reviews %}
{% set reviews_url = url({'for':'web.course.reviews','id':course.id}) %} {% set reviews_url = url({'for':'web.course.reviews','id':course.id}) %}
<div class="layui-tab-item" id="tab-reviews" data-url="{{ reviews_url }}"></div> <div class="layui-tab-item" id="tab-reviews" data-url="{{ reviews_url }}"></div>
{% endif %} {% endif %}

View File

@ -5,7 +5,7 @@
<div class="layui-col-md2"> <div class="layui-col-md2">
<div class="user-card"> <div class="user-card">
{% if item.vip == 1 %} {% if item.vip == 1 %}
<span class="vip">会员</span> <span class="vip">VIP</span>
{% endif %} {% endif %}
<div class="avatar"> <div class="avatar">
<a href="javascript:" title="{{ item.about|e }}"><img src="{{ item.avatar }}" alt="{{ item.name }}"></a> <a href="javascript:" title="{{ item.about|e }}"><img src="{{ item.avatar }}" alt="{{ item.name }}"></a>

View File

@ -14,6 +14,16 @@
<div class="name">{{ auth_user.name }} {{ vip_info(auth_user) }}</div> <div class="name">{{ auth_user.name }} {{ vip_info(auth_user) }}</div>
</div> </div>
<div class="layui-card">
<div class="layui-card-header">教学中心</div>
<div class="layui-card-body">
<ul class="my-menu">
<li><a href="{{ url({'for':'web.my.refunds'}) }}">我的直播</a></li>
<li><a href="{{ url({'for':'web.my.orders'}) }}">用户咨询</a></li>
</ul>
</div>
</div>
<div class="layui-card"> <div class="layui-card">
<div class="layui-card-header">课程中心</div> <div class="layui-card-header">课程中心</div>
<div class="layui-card-body"> <div class="layui-card-body">

View File

@ -93,7 +93,7 @@
{%- macro learning_course_card(item) %} {%- macro learning_course_card(item) %}
{% set course_title = item.course.title|e %} {% set course_title = item.course.title|e %}
{% set course_url = url({'for':'web.course.show','id':item.course.id}) %} {% set course_url = url({'for':'web.course.show','id':item.course.id}) %}
<div class="course-card learning-course-card"> <div class="course-card">
<div class="cover"> <div class="cover">
<a href="{{ course_url }}" title="{{ course_title }}"> <a href="{{ course_url }}" title="{{ course_title }}">
<img src="{{ item.course.cover }}!cover_270" alt="{{ course_title }}"> <img src="{{ item.course.cover }}!cover_270" alt="{{ course_title }}">
@ -103,12 +103,10 @@
<div class="title layui-elip"> <div class="title layui-elip">
<a href="{{ course_url }}" title="{{ course_title }}">{{ course_title }}</a> <a href="{{ course_url }}" title="{{ course_title }}">{{ course_title }}</a>
</div> </div>
<div class="progress"> <div class="meta">
<div class="layui-progress" lay-showPercent="yes"> <span>已学习 {{ item.duration|duration }}</span>
<div class="layui-progress-bar" lay-percent="{{ item.progress }}%"></div> <span>已完成 {{ item.progress }}%</span>
</div> </div>
</div> </div>
<div class="duration">已学习 {{ item.duration|duration }}</div>
</div>
</div> </div>
{%- endmacro %} {%- endmacro %}

View File

@ -1,17 +1,19 @@
{% if pager.total_pages > 0 %} {% if pager.total_pages > 0 %}
<div class="teach-user-list clearfix"> <div class="user-list clearfix">
<div class="layui-row layui-col-space20"> <div class="layui-row layui-col-space20">
{% for item in pager.items %} {% for item in pager.items %}
{% set user_title = item.title ? item.title : '小小教书匠' %} {% set user_title = item.title ? item.title : '小小教书匠' %}
{% set user_about = item.about ? item.about|e : '这个人很懒,什么都没留下' %} {% set user_about = item.about ? item.about : '这个人很懒,什么都没留下' %}
{% set user_url = url({'for':'web.teacher.show','id':item.id}) %} {% set user_url = url({'for':'web.teacher.show','id':item.id}) %}
<div class="layui-col-md3"> <div class="layui-col-md2">
<div class="user-card"> <div class="user-card">
<div class="avatar"> <div class="avatar">
<a href="{{ user_url }}" title="{{ user_about }}"><img src="{{ item.avatar }}" alt="{{ item.name }}"></a> <a href="{{ user_url }}" title="{{ user_about }}">
<img src="{{ item.avatar }}" alt="{{ item.name }}">
</a>
</div> </div>
<div class="name layui-elip"> <div class="name layui-elip">
<a href="{{ user_url }}">{{ item.name }}</a> <a href="{{ user_url }}" title="{{ user_about }}">{{ item.name }}</a>
</div> </div>
<div class="title layui-elip">{{ user_title }}</div> <div class="title layui-elip">{{ user_title }}</div>
</div> </div>

View File

@ -1,18 +1,24 @@
{% if pager.total_pages > 0 %} {% if pager.total_pages > 0 %}
<div class="teach-user-list clearfix"> <div class="user-list clearfix">
<div class="layui-row layui-col-space20"> <div class="layui-row layui-col-space20">
{% for item in pager.items %} {% for item in pager.items %}
{% set user_about = item.about ? item.about : '这个人很懒,什么都没留下' %}
{% set user_url = url({'for':'web.user.show','id':item.id}) %}
<div class="layui-col-md2"> <div class="layui-col-md2">
<div class="user-card"> <div class="user-card">
{% if item.vip == 1 %} {% if item.vip == 1 %}
<span class="vip">会员</span> <span class="vip">VIP</span>
{% endif %} {% endif %}
<div class="avatar"> <div class="avatar">
<a href="javascript:" title="{{ item.about }}"><img src="{{ item.avatar }}" alt="{{ item.name }}"></a> <a href="{{ user_url }}" title="{{ user_about }}">
<img src="{{ item.avatar }}" alt="{{ item.name }}">
</a>
</div>
<div class="name layui-elip">
<a href="{{ user_url }}" title="{{ user_about }}">{{ item.name }}</a>
</div> </div>
<div class="name layui-elip" title="{{ item.name }}">{{ item.name }}</div>
<div class="action"> <div class="action">
<a href="javascript:" class="layui-badge-rim apply-friend" data-id="{{ item.id }}" data-name="{{ item.name }}" data-avatar="{{ item.avatar }}">加为好友</a> <button class="layui-btn apply-friend" data-id="{{ item.id }}">加为好友</button>
</div> </div>
</div> </div>
</div> </div>

View File

@ -0,0 +1,25 @@
{% if pager.total_pages > 0 %}
<div class="user-list clearfix">
<div class="layui-row layui-col-space20">
{% for item in pager.items %}
{% set group_url = url({'for':'web.im_group.show','id':item.id}) %}
<div class="layui-col-md3">
<div class="user-card">
<div class="avatar">
<a href="{{ group_url }}" title="{{ item.about }}">
<img src="{{ item.avatar }}" alt="{{ item.name }}">
</a>
</div>
<div class="name layui-elip">
<a href="{{ group_url }}" title="{{ item.name }}">{{ item.name }}</a>
</div>
<div class="action">
<button class="layui-btn apply-group" data-id="{{ item.id }}">申请加入</button>
</div>
</div>
</div>
{% endfor %}
</div>
</div>
{{ partial('partials/pager_ajax') }}
{% endif %}

View File

@ -11,7 +11,7 @@
<img src="{{ user.avatar }}" alt="{{ user.name }}"> <img src="{{ user.avatar }}" alt="{{ user.name }}">
</div> </div>
<div class="info"> <div class="info">
<h3>{{ user.name }} {{ vip_flag }}</h3> <p><span class="name">{{ user.name }}</span> {{ vip_flag }}</p>
<p><span><i class="layui-icon layui-icon-location"></i></span><span>{{ user.location }}</span></p> <p><span><i class="layui-icon layui-icon-location"></i></span><span>{{ user.location }}</span></p>
<p><span><i class="layui-icon layui-icon-time"></i></span><span>{{ date('Y-m-d H:i',user.active_time) }}</span></p> <p><span><i class="layui-icon layui-icon-time"></i></span><span>{{ date('Y-m-d H:i',user.active_time) }}</span></p>
</div> </div>
@ -20,21 +20,41 @@
{% endif %} {% endif %}
</div> </div>
{% set courses_url = url({'for':'web.user.courses','id':user.id},{'limit':12}) %} {% set show_tab_courses = user.course_count > 0 %}
{% set favorites_url = url({'for':'web.user.favorites','id':user.id},{'limit':12}) %} {% set show_tab_favorites = user.favorite_count > 0 %}
{% set friends_url = url({'for':'web.user.friends','id':user.id},{'limit':12}) %} {% set show_tab_friends = user.friend_count > 0 %}
{% set show_tab_groups = user.group_count > 0 %}
{% set courses_url = url({'for':'web.user.courses','id':user.id}) %}
{% set favorites_url = url({'for':'web.user.favorites','id':user.id}) %}
{% set friends_url = url({'for':'web.user.friends','id':user.id}) %}
{% set groups_url = url({'for':'web.user.groups','id':user.id}) %}
<div class="tab-wrap"> <div class="tab-wrap">
<div class="layui-tab layui-tab-brief user-tab"> <div class="layui-tab layui-tab-brief user-tab">
<ul class="layui-tab-title"> <ul class="layui-tab-title">
<li class="layui-this">课程</li> <li class="layui-this">课程<span class="tab-count">{{ user.course_count }}</span></li>
<li>收藏</li> {% if show_tab_favorites %}
<li>好友</li> <li>收藏<span class="tab-count">{{ user.favorite_count }}</span></li>
{% endif %}
{% if show_tab_friends %}
<li>好友<span class="tab-count">{{ user.friend_count }}</span></li>
{% endif %}
{% if show_tab_groups %}
<li>群组<span class="tab-count">{{ user.group_count }}</span></li>
{% endif %}
</ul> </ul>
<div class="layui-tab-content"> <div class="layui-tab-content">
<div class="layui-tab-item layui-show" id="tab-courses" data-url="{{ courses_url }}"></div> <div class="layui-tab-item layui-show" id="tab-courses" data-url="{{ courses_url }}"></div>
{% if show_tab_favorites %}
<div class="layui-tab-item" id="tab-favorites" data-url="{{ favorites_url }}"></div> <div class="layui-tab-item" id="tab-favorites" data-url="{{ favorites_url }}"></div>
{% endif %}
{% if show_tab_friends %}
<div class="layui-tab-item" id="tab-friends" data-url="{{ friends_url }}"></div> <div class="layui-tab-item" id="tab-friends" data-url="{{ friends_url }}"></div>
{% endif %}
{% if show_tab_groups %}
<div class="layui-tab-item" id="tab-groups" data-url="{{ groups_url }}"></div>
{% endif %}
</div> </div>
</div> </div>
</div> </div>

View File

@ -30,17 +30,20 @@
</div> </div>
</div> </div>
{% set courses_url = url({'for':'web.vip.courses'},{'limit':12}) %} {% set free_courses_url = url({'for':'web.vip.courses'},{'type':'free'}) %}
{% set users_url = url({'for':'web.vip.users'},{'limit':12}) %} {% set discount_courses_url = url({'for':'web.vip.courses'},{'type':'discount'}) %}
{% set users_url = url({'for':'web.vip.users'}) %}
<div class="vip-tab-wrap"> <div class="vip-tab-wrap">
<div class="layui-tab layui-tab-brief user-tab"> <div class="layui-tab layui-tab-brief user-tab">
<ul class="layui-tab-title"> <ul class="layui-tab-title">
<li class="layui-this">课程</li> <li class="layui-this">优惠课程</li>
<li>成员</li> <li>畅学课程</li>
<li>新进会员</li>
</ul> </ul>
<div class="layui-tab-content"> <div class="layui-tab-content">
<div class="layui-tab-item layui-show" id="tab-courses" data-url="{{ courses_url }}"></div> <div class="layui-tab-item layui-show" id="tab-discount-courses" data-url="{{ discount_courses_url }}"></div>
<div class="layui-tab-item" id="tab-free-courses" data-url="{{ free_courses_url }}"></div>
<div class="layui-tab-item" id="tab-users" data-url="{{ users_url }}"></div> <div class="layui-tab-item" id="tab-users" data-url="{{ users_url }}"></div>
</div> </div>
</div> </div>

View File

@ -1,19 +1,24 @@
{% if pager.total_pages > 0 %} {% if pager.total_pages > 0 %}
<div class="vip-user-list clearfix"> <div class="user-list clearfix">
<div class="layui-row layui-col-space20"> <div class="layui-row layui-col-space20">
{% for item in pager.items %} {% for item in pager.items %}
{% set user_about = item.about ? item.about|e : '这个人很懒,什么都没留下' %} {% set user_about = item.about ? item.about : '这个人很懒,什么都没留下' %}
{% set user_url = url({'for':'web.user.show','id':item.id}) %} {% set user_url = url({'for':'web.user.show','id':item.id}) %}
<div class="layui-col-md3"> <div class="layui-col-md2">
<div class="user-card" title="{{ user_about }}"> <div class="user-card">
{% if item.vip == 1 %}
<span class="vip">VIP</span>
{% endif %}
<div class="avatar"> <div class="avatar">
<a href="{{ user_url }}"><img src="{{ item.avatar }}" alt="{{ item.name }}"></a> <a href="{{ user_url }}" title="{{ user_about }}">
<img src="{{ item.avatar }}" alt="{{ item.name }}">
</a>
</div> </div>
<div class="name layui-elip"> <div class="name layui-elip">
<a href="{{ user_url }}">{{ item.name }}</a> <a href="{{ user_url }}" title="{{ user_about }}">{{ item.name }}</a>
</div> </div>
<div class="title layui-elip"> <div class="action">
<span class="layui-badge layui-bg-orange">vip</span> <button class="layui-btn apply-friend" data-url="{{ item.id }}">加为好友</button>
</div> </div>
</div> </div>
</div> </div>

View File

@ -293,9 +293,10 @@ function kg_time_ago($time)
* 格式化时长 * 格式化时长
* *
* @param int $time * @param int $time
* @param string $mode
* @return string * @return string
*/ */
function kg_duration($time) function kg_duration($time, $mode = 'simple')
{ {
$result = '00分钟'; $result = '00分钟';
@ -319,6 +320,10 @@ function kg_duration($time)
$format[] = sprintf('%02d秒', $seconds); $format[] = sprintf('%02d秒', $seconds);
} }
if ($mode == 'simple') {
$format = array_slice($format, 0, 2);
}
$result = implode('', $format); $result = implode('', $format);
} }

View File

@ -5,7 +5,7 @@ namespace App\Library\Utils;
class FileInfo class FileInfo
{ {
static function isVideo($mine) public static function isVideo($mine)
{ {
$case1 = self::isSecure($mine); $case1 = self::isSecure($mine);
@ -14,7 +14,7 @@ class FileInfo
return $case1 && $case2; return $case1 && $case2;
} }
static function isAudio($mine) public static function isAudio($mine)
{ {
$case1 = self::isSecure($mine); $case1 = self::isSecure($mine);
@ -23,7 +23,7 @@ class FileInfo
return $case1 && $case2; return $case1 && $case2;
} }
static function isImage($mine) public static function isImage($mine)
{ {
$case1 = self::isSecure($mine); $case1 = self::isSecure($mine);
@ -32,12 +32,26 @@ class FileInfo
return $case1 && $case2; return $case1 && $case2;
} }
static function isSecure($mine) public static function isSecure($mine)
{ {
return in_array($mine, self::mineTypes()); return in_array($mine, self::getMineTypes());
} }
static function mineTypes() public static function getMineType($file)
{
$info = new \finfo(FILEINFO_MIME_TYPE);
return $info->file($file);
}
public static function getMineTypeByExt($ext)
{
$mineTypes = self::getMineTypes();
return $mineTypes[$ext] ?? null;
}
public static function getMineTypes()
{ {
return [ return [
'aac' => 'audio/aac', 'aac' => 'audio/aac',

View File

@ -76,9 +76,11 @@ class Course extends Repository
if ($sort == 'free') { if ($sort == 'free') {
$builder->andWhere('market_price = 0'); $builder->andWhere('market_price = 0');
} elseif ($sort == 'vip') { } elseif ($sort == 'vip_discount') {
$builder->andWhere('vip_price < market_price'); $builder->andWhere('vip_price < market_price');
$builder->andWhere('vip_price > 0');
} elseif ($sort == 'vip_free') { } elseif ($sort == 'vip_free') {
$builder->andWhere('market_price > 0');
$builder->andWhere('vip_price = 0'); $builder->andWhere('vip_price = 0');
} }

View File

@ -162,4 +162,20 @@ class ImUser extends Repository
]); ]);
} }
public function countFriends($userId)
{
return (int)ImFriendUserModel::count([
'conditions' => 'user_id = :user_id:',
'bind' => ['user_id' => $userId],
]);
}
public function countGroups($userId)
{
return (int)ImGroupUserModel::count([
'conditions' => 'user_id = :user_id:',
'bind' => ['user_id' => $userId],
]);
}
} }

View File

@ -3,6 +3,9 @@
namespace App\Repos; namespace App\Repos;
use App\Library\Paginator\Adapter\QueryBuilder as PagerQueryBuilder; use App\Library\Paginator\Adapter\QueryBuilder as PagerQueryBuilder;
use App\Models\CourseFavorite as CourseFavoriteModel;
use App\Models\CourseUser as CourseUserModel;
use App\Models\ImUser as ImUserModel;
use App\Models\User as UserModel; use App\Models\User as UserModel;
use Phalcon\Mvc\Model; use Phalcon\Mvc\Model;
use Phalcon\Mvc\Model\Resultset; use Phalcon\Mvc\Model\Resultset;
@ -98,6 +101,15 @@ class User extends Repository
->execute(); ->execute();
} }
/**
* @param int $id
* @return ImUserModel|Model|bool
*/
public function findImUser($id)
{
return ImUserModel::findFirst($id);
}
/** /**
* @return ResultsetInterface|Resultset|UserModel[] * @return ResultsetInterface|Resultset|UserModel[]
*/ */
@ -113,7 +125,23 @@ class User extends Repository
public function countUsers() public function countUsers()
{ {
return (int)UserModel::count(['conditions' => 'deleted = 0']); return (int)UserModel::count();
}
public function countCourses($userId)
{
return (int)CourseUserModel::count([
'conditions' => 'user_id = :user_id: AND deleted = 0',
'bind' => ['user_id' => $userId],
]);
}
public function countFavorites($userId)
{
return (int)CourseFavoriteModel::count([
'conditions' => 'user_id = :user_id: AND deleted = 0',
'bind' => ['user_id' => $userId],
]);
} }
} }

View File

@ -4,7 +4,6 @@ namespace App\Services\Frontend\User;
use App\Builders\CourseUserList as CourseUserListBuilder; use App\Builders\CourseUserList as CourseUserListBuilder;
use App\Library\Paginator\Query as PagerQuery; use App\Library\Paginator\Query as PagerQuery;
use App\Models\CourseUser as CourseUserModel;
use App\Repos\CourseUser as CourseUserRepo; use App\Repos\CourseUser as CourseUserRepo;
use App\Services\Frontend\Service as FrontendService; use App\Services\Frontend\Service as FrontendService;
use App\Services\Frontend\UserTrait; use App\Services\Frontend\UserTrait;
@ -23,7 +22,6 @@ class CourseList extends FrontendService
$params = $pagerQuery->getParams(); $params = $pagerQuery->getParams();
$params['user_id'] = $user->id; $params['user_id'] = $user->id;
$params['role_type'] = CourseUserModel::ROLE_STUDENT;
$params['deleted'] = 0; $params['deleted'] = 0;
$sort = $pagerQuery->getSort(); $sort = $pagerQuery->getSort();

View File

@ -3,6 +3,7 @@
namespace App\Services\Frontend\User; namespace App\Services\Frontend\User;
use App\Models\User as UserModel; use App\Models\User as UserModel;
use App\Repos\User as UserRepo;
use App\Services\Frontend\Service as FrontendService; use App\Services\Frontend\Service as FrontendService;
use App\Services\Frontend\UserTrait; use App\Services\Frontend\UserTrait;
@ -20,6 +21,10 @@ class UserInfo extends FrontendService
protected function handleUser(UserModel $user) protected function handleUser(UserModel $user)
{ {
$userRepo = new UserRepo();
$imUser = $userRepo->findImUser($user->id);
return [ return [
'id' => $user->id, 'id' => $user->id,
'name' => $user->name, 'name' => $user->name,
@ -30,6 +35,10 @@ class UserInfo extends FrontendService
'gender' => $user->gender, 'gender' => $user->gender,
'vip' => $user->vip, 'vip' => $user->vip,
'locked' => $user->locked, 'locked' => $user->locked,
'course_count' => $user->course_count,
'favorite_count' => $user->favorite_count,
'friend_count' => $imUser->friend_count,
'group_count' => $imUser->group_count,
'active_time' => $user->active_time, 'active_time' => $user->active_time,
'create_time' => $user->create_time, 'create_time' => $user->create_time,
]; ];

View File

@ -9,7 +9,7 @@ use App\Services\Frontend\Service as FrontendService;
class CourseList extends FrontendService class CourseList extends FrontendService
{ {
public function handle() public function handle($type)
{ {
$pagerQuery = new PagerQuery(); $pagerQuery = new PagerQuery();
@ -18,7 +18,7 @@ class CourseList extends FrontendService
$params['published'] = 1; $params['published'] = 1;
$params['deleted'] = 0; $params['deleted'] = 0;
$sort = 'vip'; $sort = $type == 'discount' ? 'vip_discount' : 'vip_free';
$page = $pagerQuery->getPage(); $page = $pagerQuery->getPage();
$limit = $pagerQuery->getLimit(); $limit = $pagerQuery->getLimit();

View File

@ -51,6 +51,7 @@ class UserList extends FrontendService
'avatar' => $user['avatar'], 'avatar' => $user['avatar'],
'title' => $user['title'], 'title' => $user['title'],
'about' => $user['about'], 'about' => $user['about'],
'vip' => $user['vip'],
]; ];
} }

View File

@ -2,6 +2,7 @@
namespace App\Services; namespace App\Services;
use App\Library\Utils\FileInfo;
use App\Models\ContentImage as ContentImageModel; use App\Models\ContentImage as ContentImageModel;
use Phalcon\Logger\Adapter\File as FileLogger; use Phalcon\Logger\Adapter\File as FileLogger;
use Qcloud\Cos\Client as CosClient; use Qcloud\Cos\Client as CosClient;
@ -104,6 +105,9 @@ class Storage extends Service
$files = $this->request->getUploadedFiles(true); $files = $this->request->getUploadedFiles(true);
foreach ($files as $file) { foreach ($files as $file) {
if (!FileInfo::isImage($file->getRealType())) {
continue;
}
$extension = $this->getFileExtension($file->getName()); $extension = $this->getFileExtension($file->getName());
$keyName = $this->generateFileName($extension, $prefix); $keyName = $this->generateFileName($extension, $prefix);
$path = $this->putFile($keyName, $file->getTempName()); $path = $this->putFile($keyName, $file->getTempName());
@ -136,6 +140,7 @@ class Storage extends Service
} catch (\Exception $e) { } catch (\Exception $e) {
$this->logger->error('Put String Exception ' . kg_json_encode([ $this->logger->error('Put String Exception ' . kg_json_encode([
'line' => $e->getLine(),
'code' => $e->getCode(), 'code' => $e->getCode(),
'message' => $e->getMessage(), 'message' => $e->getMessage(),
])); ]));
@ -168,6 +173,7 @@ class Storage extends Service
} catch (\Exception $e) { } catch (\Exception $e) {
$this->logger->error('Put File Exception ' . kg_json_encode([ $this->logger->error('Put File Exception ' . kg_json_encode([
'line' => $e->getLine(),
'code' => $e->getCode(), 'code' => $e->getCode(),
'message' => $e->getMessage(), 'message' => $e->getMessage(),
])); ]));
@ -200,6 +206,7 @@ class Storage extends Service
} catch (\Exception $e) { } catch (\Exception $e) {
$this->logger->error('Delete Object Exception ' . kg_json_encode([ $this->logger->error('Delete Object Exception ' . kg_json_encode([
'line' => $e->getLine(),
'code' => $e->getCode(), 'code' => $e->getCode(),
'message' => $e->getMessage(), 'message' => $e->getMessage(),
])); ]));
@ -223,12 +230,11 @@ class Storage extends Service
/** /**
* 获取数据万象图片URL * 获取数据万象图片URL
*
* @param string $key * @param string $key
* @param int $width
* @param int $height
* @return string * @return string
*/ */
public function getCiImageUrl($key, $width = 0, $height = 0) public function getCiImageUrl($key)
{ {
return $this->getCiBaseUrl() . $key; return $this->getCiBaseUrl() . $key;
} }
@ -287,7 +293,7 @@ class Storage extends Service
} }
/** /**
* 获取 CosClient * 获取CosClient
* *
* @return CosClient * @return CosClient
*/ */

View File

@ -4,6 +4,7 @@
"ext-redis": "~4.3", "ext-redis": "~4.3",
"ext-pdo": "*", "ext-pdo": "*",
"ext-json": "*", "ext-json": "*",
"ext-fileinfo": "*",
"phalcon/incubator": "^3.4", "phalcon/incubator": "^3.4",
"guzzlehttp/guzzle": "^6.3", "guzzlehttp/guzzle": "^6.3",
"swiftmailer/swiftmailer": "^6.0", "swiftmailer/swiftmailer": "^6.0",

1
public/static/lib/spark-md5.min.js vendored Normal file

File diff suppressed because one or more lines are too long

View File

@ -1266,12 +1266,8 @@ body {
color: #666; color: #666;
} }
.teach-user-list { .user-list {
margin-bottom: 30px; margin-bottom: 20px;
}
.vip-user-list {
margin-bottom: 30px;
} }
.user-card { .user-card {
@ -1302,6 +1298,7 @@ body {
} }
.user-card .name { .user-card .name {
padding: 0 10px;
margin-bottom: 15px; margin-bottom: 15px;
} }
@ -1310,6 +1307,13 @@ body {
font-size: 12px; font-size: 12px;
} }
.user-card .action button {
padding: 0 5px;
height: 20px;
line-height: 20px;
font-size: 12px;
}
.user-card .vip { .user-card .vip {
position: absolute; position: absolute;
top: 8px; top: 8px;
@ -1317,16 +1321,12 @@ body {
padding: 1px 3px; padding: 1px 3px;
border-radius: 2px; border-radius: 2px;
text-align: center; text-align: center;
font-size: 12px; font-size: 10px;
line-height: 1.5em; line-height: 1.5em;
background-color: orange; background-color: orange;
color: white; color: white;
} }
.user-card .action span {
cursor: pointer;
}
.my-sidebar { .my-sidebar {
float: left; float: left;
width: 220px; width: 220px;

View File

@ -7,13 +7,20 @@ layui.use(['jquery', 'helper'], function () {
var $tabCourses = $('#tab-courses'); var $tabCourses = $('#tab-courses');
helper.ajaxLoadHtml($tabCourses.data('url'), $tabCourses.attr('id')); helper.ajaxLoadHtml($tabCourses.data('url'), $tabCourses.attr('id'));
} }
if ($('#tab-favorites').length > 0) { if ($('#tab-favorites').length > 0) {
var $tabFavorites = $('#tab-favorites'); var $tabFavorites = $('#tab-favorites');
helper.ajaxLoadHtml($tabFavorites.data('url'), $tabFavorites.attr('id')); helper.ajaxLoadHtml($tabFavorites.data('url'), $tabFavorites.attr('id'));
} }
if ($('#tab-friends').length > 0) { if ($('#tab-friends').length > 0) {
var $tabFriends = $('#tab-friends'); var $tabFriends = $('#tab-friends');
helper.ajaxLoadHtml($tabFriends.data('url'), $tabFriends.attr('id')); helper.ajaxLoadHtml($tabFriends.data('url'), $tabFriends.attr('id'));
} }
if ($('#tab-groups').length > 0) {
var $tabGroups = $('#tab-groups');
helper.ajaxLoadHtml($tabGroups.data('url'), $tabGroups.attr('id'));
}
}); });

View File

@ -3,9 +3,14 @@ layui.use(['jquery', 'helper'], function () {
var $ = layui.jquery; var $ = layui.jquery;
var helper = layui.helper; var helper = layui.helper;
if ($('#tab-courses').length > 0) { if ($('#tab-discount-courses').length > 0) {
var $tabCourses = $('#tab-courses'); var $tabDiscountCourses = $('#tab-discount-courses');
helper.ajaxLoadHtml($tabCourses.data('url'), $tabCourses.attr('id')); helper.ajaxLoadHtml($tabDiscountCourses.data('url'), $tabDiscountCourses.attr('id'));
}
if ($('#tab-free-courses').length > 0) {
var $tabFreeCourses = $('#tab-free-courses');
helper.ajaxLoadHtml($tabFreeCourses.data('url'), $tabFreeCourses.attr('id'));
} }
if ($('#tab-users').length > 0) { if ($('#tab-users').length > 0) {