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
1851fb9b25
commit
8c99e5accd
@ -25,8 +25,8 @@ class ImFriendUserList extends Builder
|
|||||||
$userRepo = new UserRepo();
|
$userRepo = new UserRepo();
|
||||||
|
|
||||||
$columns = [
|
$columns = [
|
||||||
'id', 'name', 'avatar', 'gender', 'vip',
|
'id', 'name', 'avatar', 'title', 'about', 'vip',
|
||||||
'location', 'about', 'active_time',
|
'gender', 'location', 'active_time',
|
||||||
];
|
];
|
||||||
|
|
||||||
$users = $userRepo->findByIds($ids, $columns);
|
$users = $userRepo->findByIds($ids, $columns);
|
||||||
|
@ -58,7 +58,7 @@ class ImGroupUserList extends Builder
|
|||||||
|
|
||||||
$groupRepo = new ImGroupRepo();
|
$groupRepo = new ImGroupRepo();
|
||||||
|
|
||||||
$columns = ['id', 'type', 'name', 'avatar', 'about', 'owner_id', 'user_count'];
|
$columns = ['id', 'type', 'name', 'avatar', 'about', 'owner_id', 'user_count', 'msg_count'];
|
||||||
|
|
||||||
$groups = $groupRepo->findByIds($ids, $columns);
|
$groups = $groupRepo->findByIds($ids, $columns);
|
||||||
|
|
||||||
|
44
app/Http/Web/Controllers/TeachingController.php
Normal file
44
app/Http/Web/Controllers/TeachingController.php
Normal file
@ -0,0 +1,44 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
|
||||||
|
namespace App\Http\Web\Controllers;
|
||||||
|
|
||||||
|
use App\Services\Frontend\Teaching\ConsultList as TclService;
|
||||||
|
use App\Services\Frontend\Teaching\LiveList as TllService;
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @RoutePrefix("/teaching")
|
||||||
|
*/
|
||||||
|
class TeachingController extends Controller
|
||||||
|
{
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @Get("/lives", name="web.teaching.lives")
|
||||||
|
*/
|
||||||
|
public function livesAction()
|
||||||
|
{
|
||||||
|
$service = new TllService();
|
||||||
|
|
||||||
|
$pager = $service->handle();
|
||||||
|
|
||||||
|
$pager->items = kg_array_object($pager->items);
|
||||||
|
|
||||||
|
$this->view->setVar('pager', $pager);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @Get("/consults", name="web.teaching.consults")
|
||||||
|
*/
|
||||||
|
public function consultsAction()
|
||||||
|
{
|
||||||
|
$service = new TclService();
|
||||||
|
|
||||||
|
$pager = $service->handle();
|
||||||
|
|
||||||
|
$pager->items = kg_array_object($pager->items);
|
||||||
|
|
||||||
|
$this->view->setVar('pager', $pager);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -84,12 +84,8 @@
|
|||||||
{% set show_sidebar_related = 1 %}
|
{% set show_sidebar_related = 1 %}
|
||||||
|
|
||||||
<div class="layout-sidebar">
|
<div class="layout-sidebar">
|
||||||
<div class="sidebar">
|
|
||||||
{{ partial('course/show_order') }}
|
{{ partial('course/show_order') }}
|
||||||
</div>
|
|
||||||
<div class="sidebar">
|
|
||||||
{{ partial('course/show_teacher') }}
|
{{ partial('course/show_teacher') }}
|
||||||
</div>
|
|
||||||
{% if show_sidebar_topics %}
|
{% if show_sidebar_topics %}
|
||||||
{% set topics_url = url({'for':'web.course.topics','id':course.id}) %}
|
{% set topics_url = url({'for':'web.course.topics','id':course.id}) %}
|
||||||
<div class="sidebar" id="sidebar-topics" data-url="{{ topics_url }}"></div>
|
<div class="sidebar" id="sidebar-topics" data-url="{{ topics_url }}"></div>
|
||||||
|
@ -1,11 +1,12 @@
|
|||||||
{% if course.me.owned == 0 and course.market_price > 0 %}
|
{% if course.me.owned == 0 and course.market_price > 0 %}
|
||||||
<div class="sidebar-order wrap">
|
|
||||||
{% set order_url = url({'for':'web.order.confirm'},{'item_id':course.id,'item_type':'course'}) %}
|
{% set order_url = url({'for':'web.order.confirm'},{'item_id':course.id,'item_type':'course'}) %}
|
||||||
|
<div class="sidebar wrap">
|
||||||
<button class="layui-btn layui-btn-fluid layui-bg-red btn-buy" data-url="{{ order_url }}">立即购买</button>
|
<button class="layui-btn layui-btn-fluid layui-bg-red btn-buy" data-url="{{ order_url }}">立即购买</button>
|
||||||
</div>
|
</div>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
{% if course.market_price == 0 %}
|
{% if course.market_price == 0 %}
|
||||||
|
<div class="sidebar">
|
||||||
<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">
|
||||||
@ -18,4 +19,5 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
</div>
|
||||||
{% endif %}
|
{% endif %}
|
@ -1,4 +1,5 @@
|
|||||||
{% if course.teachers %}
|
{% if course.teachers %}
|
||||||
|
<div class="sidebar">
|
||||||
<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">
|
||||||
@ -11,7 +12,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="info">
|
<div class="info">
|
||||||
<div class="name layui-elip">
|
<div class="name layui-elip">
|
||||||
<a href="{{ teacher_url }}">{{ teacher.name }}</a>
|
<a href="{{ teacher_url }}" title="{{ teacher.about }}">{{ teacher.name }}</a>
|
||||||
</div>
|
</div>
|
||||||
<div class="title layui-elip">{{ teacher.title }}</div>
|
<div class="title layui-elip">{{ teacher.title }}</div>
|
||||||
</div>
|
</div>
|
||||||
@ -19,4 +20,5 @@
|
|||||||
{% endfor %}
|
{% endfor %}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
</div>
|
||||||
{% endif %}
|
{% endif %}
|
@ -30,5 +30,6 @@
|
|||||||
{% block include_js %}
|
{% block include_js %}
|
||||||
|
|
||||||
{{ js_include('web/js/im.find.js') }}
|
{{ js_include('web/js/im.find.js') }}
|
||||||
|
{{ js_include('web/js/im.apply.js') }}
|
||||||
|
|
||||||
{% endblock %}
|
{% endblock %}
|
@ -9,7 +9,7 @@
|
|||||||
{% set group = item_info.group %}
|
{% set group = item_info.group %}
|
||||||
{% set remark = item_info.remark ? '附言:' ~ item_info.remark : '' %}
|
{% set remark = item_info.remark ? '附言:' ~ item_info.remark : '' %}
|
||||||
<li data-id="{{ item.id }}">
|
<li data-id="{{ item.id }}">
|
||||||
<a href="{{ sender_url }}" target="_blank"><img src="{{ sender.avatar }}" class="layui-circle layim-msgbox-avatar"></a>
|
<a href="{{ sender_url }}" target="_blank"><img class="layui-circle layim-msgbox-avatar" alt="{{ sender.name }}" src="{{ sender.avatar }}"></a>
|
||||||
<p class="layim-msgbox-user" data-id="{{ sender.id }}" data-name="{{ sender.name }}" data-avatar="{{ sender.avatar }}" data-group="{{ group.id }}">
|
<p class="layim-msgbox-user" data-id="{{ sender.id }}" data-name="{{ sender.name }}" data-avatar="{{ sender.avatar }}" data-group="{{ group.id }}">
|
||||||
<a href="{{ sender_url }}" target="_blank">{{ sender.name }}</a>
|
<a href="{{ sender_url }}" target="_blank">{{ sender.name }}</a>
|
||||||
<span>{{ item.create_time|time_ago }}</span>
|
<span>{{ item.create_time|time_ago }}</span>
|
||||||
@ -45,7 +45,7 @@
|
|||||||
{% elseif item_type == '4' %}
|
{% elseif item_type == '4' %}
|
||||||
{% set remark = item_info.remark ? '附言:' ~ item_info.remark : '' %}
|
{% set remark = item_info.remark ? '附言:' ~ item_info.remark : '' %}
|
||||||
<li data-id="{{ item.id }}">
|
<li data-id="{{ item.id }}">
|
||||||
<a href="{{ sender_url }}" target="_blank"><img src="{{ sender.avatar }}" class="layui-circle layim-msgbox-avatar"></a>
|
<a href="{{ sender_url }}" target="_blank"><img class="layui-circle layim-msgbox-avatar" alt="{{ sender.name }}" src="{{ sender.avatar }}"></a>
|
||||||
<p class="layim-msgbox-user">
|
<p class="layim-msgbox-user">
|
||||||
<a href="{{ sender_url }}" target="_blank">{{ sender.name }}</a>
|
<a href="{{ sender_url }}" target="_blank">{{ sender.name }}</a>
|
||||||
<span>{{ item.create_time|time_ago }}</span>
|
<span>{{ item.create_time|time_ago }}</span>
|
||||||
|
@ -4,7 +4,7 @@
|
|||||||
<div class="layui-card-body">
|
<div class="layui-card-body">
|
||||||
{% for user in users %}
|
{% for user in users %}
|
||||||
{% set user_url = url({'for':'web.user.show','id':user.id}) %}
|
{% set user_url = url({'for':'web.user.show','id':user.id}) %}
|
||||||
{% set user.title = user.title ? user.title : '暂无头衔' %}
|
{% set user.title = user.title ? user.title : '暂露头角' %}
|
||||||
<div class="sidebar-teacher-card clearfix">
|
<div class="sidebar-teacher-card clearfix">
|
||||||
<div class="avatar">
|
<div class="avatar">
|
||||||
<img src="{{ user.avatar }}" alt="{{ user.name }}">
|
<img src="{{ user.avatar }}" alt="{{ user.name }}">
|
||||||
|
@ -34,7 +34,7 @@
|
|||||||
{{ partial('im_group/show_owner') }}
|
{{ partial('im_group/show_owner') }}
|
||||||
</div>
|
</div>
|
||||||
<div class="sidebar wrap">
|
<div class="sidebar wrap">
|
||||||
<button class="layui-btn layui-btn-fluid apply-group" data-url="{{ apply_group_url }}">申请加入</button>
|
<button class="layui-btn layui-btn-fluid apply-group" data-id="{{ group.id }}" data-name="{{ group.name }}" data-avatar="{{ group.avatar }}">加入群组</button>
|
||||||
</div>
|
</div>
|
||||||
<div class="sidebar" id="active-user-list" data-url="{{ active_users_url }}"></div>
|
<div class="sidebar" id="active-user-list" data-url="{{ active_users_url }}"></div>
|
||||||
</div>
|
</div>
|
||||||
@ -45,5 +45,6 @@
|
|||||||
{% block include_js %}
|
{% block include_js %}
|
||||||
|
|
||||||
{{ js_include('web/js/im_group.show.js') }}
|
{{ js_include('web/js/im_group.show.js') }}
|
||||||
|
{{ js_include('web/js/im.apply.js') }}
|
||||||
|
|
||||||
{% endblock %}
|
{% endblock %}
|
@ -1,7 +1,8 @@
|
|||||||
<div class="group-user-list clearfix">
|
<div class="user-list group-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_url = url({'for':'web.user.show','id':item.id}) %}
|
{% set user_url = url({'for':'web.user.show','id':item.id}) %}
|
||||||
|
{% set item.title = item.title ? item.title : '暂露头角' %}
|
||||||
<div class="layui-col-md3">
|
<div class="layui-col-md3">
|
||||||
<div class="user-card">
|
<div class="user-card">
|
||||||
{% if item.vip == 1 %}
|
{% if item.vip == 1 %}
|
||||||
@ -15,8 +16,9 @@
|
|||||||
<div class="name layui-elip">
|
<div class="name layui-elip">
|
||||||
<a href="{{ user_url }}" title="{{ item.about }}">{{ item.name }}</a>
|
<a href="{{ user_url }}" title="{{ item.about }}">{{ item.name }}</a>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="title layui-elip">{{ item.title }}</div>
|
||||||
<div class="action">
|
<div class="action">
|
||||||
<span class="layui-btn layui-btn-xs apply-friend">添加好友</span>
|
<span class="layui-btn apply-friend" data-id="{{ item.id }}" data-name="{{ item.name }}" data-avatar="{{ item.avatar }}">添加好友</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@ -24,3 +26,4 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{{ partial('partials/pager_ajax') }}
|
{{ partial('partials/pager_ajax') }}
|
||||||
|
<br>
|
@ -16,5 +16,6 @@
|
|||||||
{% block include_js %}
|
{% block include_js %}
|
||||||
|
|
||||||
{{ js_include('web/js/teacher.list.js') }}
|
{{ js_include('web/js/teacher.list.js') }}
|
||||||
|
{{ js_include('web/js/im.apply.js') }}
|
||||||
|
|
||||||
{% endblock %}
|
{% endblock %}
|
@ -1,21 +1,24 @@
|
|||||||
{% if pager.total_pages > 0 %}
|
{% if pager.total_pages > 0 %}
|
||||||
<div class="user-list clearfix">
|
<div class="user-list teacher-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 item.title = item.title ? item.title : '暂露头角' %}
|
||||||
{% set user_about = item.about ? item.about : '这个人很懒,什么都没留下' %}
|
{% set item.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-md2">
|
<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 }}">
|
<a href="{{ user_url }}" title="{{ item.about }}">
|
||||||
<img src="{{ item.avatar }}" alt="{{ item.name }}">
|
<img src="{{ item.avatar }}" alt="{{ item.name }}">
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
<div class="name layui-elip">
|
<div class="name layui-elip">
|
||||||
<a href="{{ user_url }}" title="{{ user_about }}">{{ item.name }}</a>
|
<a href="{{ user_url }}" title="{{ item.about }}">{{ item.name }}</a>
|
||||||
|
</div>
|
||||||
|
<div class="title layui-elip">{{ item.title }}</div>
|
||||||
|
<div class="action">
|
||||||
|
<span class="layui-btn apply-friend" data-id="{{ item.id }}" data-name="{{ item.name }}" data-avatar="{{ item.avatar }}">添加好友</span>
|
||||||
</div>
|
</div>
|
||||||
<div class="title layui-elip">{{ user_title }}</div>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
|
@ -2,7 +2,8 @@
|
|||||||
<div class="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 item.title = item.title ? item.title : '暂露头角' %}
|
||||||
|
{% set item.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-md2">
|
<div class="layui-col-md2">
|
||||||
<div class="user-card">
|
<div class="user-card">
|
||||||
@ -10,15 +11,16 @@
|
|||||||
<span class="vip">VIP</span>
|
<span class="vip">VIP</span>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
<div class="avatar">
|
<div class="avatar">
|
||||||
<a href="{{ user_url }}" title="{{ user_about }}">
|
<a href="{{ user_url }}" title="{{ item.about }}">
|
||||||
<img src="{{ item.avatar }}" alt="{{ item.name }}">
|
<img src="{{ item.avatar }}" alt="{{ item.name }}">
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
<div class="name layui-elip">
|
<div class="name layui-elip">
|
||||||
<a href="{{ user_url }}" title="{{ user_about }}">{{ item.name }}</a>
|
<a href="{{ user_url }}" title="{{ item.about }}">{{ item.name }}</a>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="title layui-elip">{{ item.title }}</div>
|
||||||
<div class="action">
|
<div class="action">
|
||||||
<button class="layui-btn apply-friend" data-id="{{ item.id }}">加为好友</button>
|
<span class="layui-btn apply-friend" data-id="{{ item.id }}" data-name="{{ item.name }}" data-avatar="{{ item.avatar }}">添加好友</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -3,8 +3,14 @@
|
|||||||
<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 group_url = url({'for':'web.im_group.show','id':item.id}) %}
|
{% set group_url = url({'for':'web.im_group.show','id':item.id}) %}
|
||||||
|
{% set item.about = item.about ? item.about : '这家伙真懒,什么都没留下!' %}
|
||||||
<div class="layui-col-md3">
|
<div class="layui-col-md3">
|
||||||
<div class="user-card">
|
<div class="user-card">
|
||||||
|
{% if item.type == 'course' %}
|
||||||
|
<span class="layui-badge layui-bg-green type">课</span>
|
||||||
|
{% elseif item.type == 'chat' %}
|
||||||
|
<span class="layui-badge layui-bg-blue type">聊</span>
|
||||||
|
{% endif %}
|
||||||
<div class="avatar">
|
<div class="avatar">
|
||||||
<a href="{{ group_url }}" title="{{ item.about }}">
|
<a href="{{ group_url }}" title="{{ item.about }}">
|
||||||
<img src="{{ item.avatar }}" alt="{{ item.name }}">
|
<img src="{{ item.avatar }}" alt="{{ item.name }}">
|
||||||
@ -13,8 +19,12 @@
|
|||||||
<div class="name layui-elip">
|
<div class="name layui-elip">
|
||||||
<a href="{{ group_url }}" title="{{ item.name }}">{{ item.name }}</a>
|
<a href="{{ group_url }}" title="{{ item.name }}">{{ item.name }}</a>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="meta layui-elip">
|
||||||
|
<span>成员:{{ item.user_count }}</span>
|
||||||
|
<span>讨论:{{ item.msg_count }}</span>
|
||||||
|
</div>
|
||||||
<div class="action">
|
<div class="action">
|
||||||
<button class="layui-btn apply-group" data-id="{{ item.id }}">申请加入</button>
|
<span class="layui-btn apply-group" data-id="{{ item.id }}" data-name="{{ item.name }}" data-avatar="{{ item.avatar }}">加入群组</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -64,5 +64,6 @@
|
|||||||
{% block include_js %}
|
{% block include_js %}
|
||||||
|
|
||||||
{{ js_include('web/js/user.show.js') }}
|
{{ js_include('web/js/user.show.js') }}
|
||||||
|
{{ js_include('web/js/im.apply.js') }}
|
||||||
|
|
||||||
{% endblock %}
|
{% endblock %}
|
@ -2,21 +2,23 @@
|
|||||||
<div class="user-list vip-user-list clearfix">
|
<div class="user-list vip-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}) %}
|
{% set user_url = url({'for':'web.user.show','id':item.id}) %}
|
||||||
|
{% set item.title = item.title ? item.title : '暂露头角' %}
|
||||||
|
{% set item.about = item.about ? item.about : '这个人很懒,什么都没留下' %}
|
||||||
<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="layui-badge layui-bg-orange vip">VIP</span>
|
<span class="layui-badge layui-bg-orange vip">VIP</span>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
<div class="avatar">
|
<div class="avatar">
|
||||||
<a href="{{ user_url }}" title="{{ user_about }}">
|
<a href="{{ user_url }}" title="{{ item.about }}">
|
||||||
<img src="{{ item.avatar }}" alt="{{ item.name }}">
|
<img src="{{ item.avatar }}" alt="{{ item.name }}">
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
<div class="name layui-elip">
|
<div class="name layui-elip">
|
||||||
<a href="{{ user_url }}" title="{{ user_about }}">{{ item.name }}</a>
|
<a href="{{ user_url }}" title="{{ item.about }}">{{ item.name }}</a>
|
||||||
</div>
|
</div>
|
||||||
|
<div class="title layui-elip">{{ item.title }}</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
|
113
app/Services/Frontend/Teaching/ConsultList.php
Normal file
113
app/Services/Frontend/Teaching/ConsultList.php
Normal file
@ -0,0 +1,113 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Services\Frontend\Teaching;
|
||||||
|
|
||||||
|
use App\Builders\ConsultList as ConsultListBuilder;
|
||||||
|
use App\Library\Paginator\Adapter\QueryBuilder as PagerQueryBuilder;
|
||||||
|
use App\Library\Paginator\Query as PagerQuery;
|
||||||
|
use App\Models\Consult as ConsultModel;
|
||||||
|
use App\Models\Course as CourseModel;
|
||||||
|
use App\Models\CourseUser as CourseUserModel;
|
||||||
|
use App\Services\Frontend\Service as FrontendService;
|
||||||
|
use Phalcon\Mvc\Model\Resultset;
|
||||||
|
use Phalcon\Mvc\Model\ResultsetInterface;
|
||||||
|
|
||||||
|
class ConsultList extends FrontendService
|
||||||
|
{
|
||||||
|
|
||||||
|
public function handle()
|
||||||
|
{
|
||||||
|
$user = $this->getLoginUser();
|
||||||
|
|
||||||
|
$pagerQuery = new PagerQuery();
|
||||||
|
|
||||||
|
$page = $pagerQuery->getPage();
|
||||||
|
$limit = $pagerQuery->getLimit();
|
||||||
|
|
||||||
|
$courses = $this->findUserTeachingCourses($user->id);
|
||||||
|
|
||||||
|
if ($courses->count() == 0) {
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
|
||||||
|
$courseIds = kg_array_column($courses->toArray(), 'id');
|
||||||
|
|
||||||
|
$pager = $this->paginate($courseIds, $page, $limit);
|
||||||
|
|
||||||
|
return $this->handleConsults($pager);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function handleConsults($pager)
|
||||||
|
{
|
||||||
|
if ($pager->total_items == 0) {
|
||||||
|
return $pager;
|
||||||
|
}
|
||||||
|
|
||||||
|
$builder = new ConsultListBuilder();
|
||||||
|
|
||||||
|
$consults = $pager->items->toArray();
|
||||||
|
|
||||||
|
$courses = $builder->getCourses($consults);
|
||||||
|
$chapters = $builder->getChapters($consults);
|
||||||
|
$users = $builder->getUsers($consults);
|
||||||
|
|
||||||
|
$items = [];
|
||||||
|
|
||||||
|
foreach ($consults as $consult) {
|
||||||
|
|
||||||
|
$course = $courses[$consult['course_id']] ?? new \stdClass();
|
||||||
|
$chapter = $chapters[$consult['chapter_id']] ?? new \stdClass();
|
||||||
|
$owner = $users[$consult['owner_id']] ?? new \stdClass();
|
||||||
|
|
||||||
|
$items[] = [
|
||||||
|
'id' => $consult['id'],
|
||||||
|
'question' => $consult['question'],
|
||||||
|
'answer' => $consult['answer'],
|
||||||
|
'rating' => $consult['rating'],
|
||||||
|
'like_count' => $consult['like_count'],
|
||||||
|
'create_time' => $consult['create_time'],
|
||||||
|
'update_time' => $consult['update_time'],
|
||||||
|
'course' => $course,
|
||||||
|
'chapter' => $chapter,
|
||||||
|
'owner' => $owner,
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
$pager->items = $items;
|
||||||
|
|
||||||
|
return $pager;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function paginate($courseIds, $page = 1, $limit = 15)
|
||||||
|
{
|
||||||
|
$builder = $this->modelsManager->createBuilder()
|
||||||
|
->from(ConsultModel::class)
|
||||||
|
->inWhere('course_id', $courseIds)
|
||||||
|
->andWhere('published = 1')
|
||||||
|
->orderBy('priority ASC');
|
||||||
|
|
||||||
|
$pager = new PagerQueryBuilder([
|
||||||
|
'builder' => $builder,
|
||||||
|
'page' => $page,
|
||||||
|
'limit' => $limit,
|
||||||
|
]);
|
||||||
|
|
||||||
|
return $pager->paginate();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param int $userId
|
||||||
|
* @return ResultsetInterface|Resultset|CourseModel[]
|
||||||
|
*/
|
||||||
|
protected function findUserTeachingCourses($userId)
|
||||||
|
{
|
||||||
|
return $this->modelsManager->createBuilder()
|
||||||
|
->columns('c.*')
|
||||||
|
->addFrom(CourseModel::class, 'c')
|
||||||
|
->join(CourseUserModel::class, 'c.id = cu.course_id', 'cu')
|
||||||
|
->where('cu.user_id = :user_id:', ['user_id' => $userId])
|
||||||
|
->andWhere('cu.role_type = :role_type:', ['role_type' => CourseUserModel::ROLE_TEACHER])
|
||||||
|
->getQuery()->execute();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
103
app/Services/Frontend/Teaching/LiveList.php
Normal file
103
app/Services/Frontend/Teaching/LiveList.php
Normal file
@ -0,0 +1,103 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Services\Frontend\Teaching;
|
||||||
|
|
||||||
|
use App\Library\Paginator\Adapter\QueryBuilder as PagerQueryBuilder;
|
||||||
|
use App\Library\Paginator\Query as PagerQuery;
|
||||||
|
use App\Models\Chapter as ChapterModel;
|
||||||
|
use App\Models\ChapterLive as ChapterLiveModel;
|
||||||
|
use App\Models\Course as CourseModel;
|
||||||
|
use App\Models\CourseUser as CourseUserModel;
|
||||||
|
use App\Services\Frontend\Service as FrontendService;
|
||||||
|
use Phalcon\Mvc\Model\Resultset;
|
||||||
|
use Phalcon\Mvc\Model\ResultsetInterface;
|
||||||
|
|
||||||
|
class LiveList extends FrontendService
|
||||||
|
{
|
||||||
|
|
||||||
|
public function handle()
|
||||||
|
{
|
||||||
|
$user = $this->getLoginUser();
|
||||||
|
|
||||||
|
$courses = $this->findUserTeachingCourses($user->id);
|
||||||
|
|
||||||
|
if ($courses->count() == 0) {
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
|
||||||
|
$courseMappings = [];
|
||||||
|
|
||||||
|
foreach ($courses as $course) {
|
||||||
|
$courseMappings[$course->id] = [
|
||||||
|
'id' => $course->id,
|
||||||
|
'title' => $course->title,
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
$courseIds = kg_array_column($courses->toArray(), 'id');
|
||||||
|
|
||||||
|
$pagerQuery = new PagerQuery();
|
||||||
|
|
||||||
|
$page = $pagerQuery->getPage();
|
||||||
|
$limit = $pagerQuery->getLimit();
|
||||||
|
|
||||||
|
$pager = $this->paginate($courseIds, $page, $limit);
|
||||||
|
|
||||||
|
if ($pager->total_items == 0) {
|
||||||
|
return $pager;
|
||||||
|
}
|
||||||
|
|
||||||
|
$items = [];
|
||||||
|
|
||||||
|
foreach ($pager->items as $item) {
|
||||||
|
$items[] = [
|
||||||
|
'course' => $courseMappings[$item->course_id],
|
||||||
|
'chapter' => [
|
||||||
|
'id' => $item->id,
|
||||||
|
'title' => $item->title,
|
||||||
|
],
|
||||||
|
'start_time' => $item->start_time,
|
||||||
|
'end_time' => $item->end_time,
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
$pager->items = $items;
|
||||||
|
|
||||||
|
return $pager;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function paginate($courseIds, $page = 1, $limit = 15)
|
||||||
|
{
|
||||||
|
$builder = $this->modelsManager->createBuilder()
|
||||||
|
->columns(['c.id', 'c.title', 'c.course_id', 'cl.start_time', 'cl.end_time'])
|
||||||
|
->addFrom(ChapterModel::class, 'c')
|
||||||
|
->join(ChapterLiveModel::class, 'c.id = cl.chapter_id', 'cl')
|
||||||
|
->inWhere('cl.course_id', $courseIds)
|
||||||
|
->orderBy('cl.start_time DESC');
|
||||||
|
|
||||||
|
$pager = new PagerQueryBuilder([
|
||||||
|
'builder' => $builder,
|
||||||
|
'page' => $page,
|
||||||
|
'limit' => $limit,
|
||||||
|
]);
|
||||||
|
|
||||||
|
return $pager->paginate();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param int $userId
|
||||||
|
* @return ResultsetInterface|Resultset|CourseModel[]
|
||||||
|
*/
|
||||||
|
protected function findUserTeachingCourses($userId)
|
||||||
|
{
|
||||||
|
return $this->modelsManager->createBuilder()
|
||||||
|
->columns('c.*')
|
||||||
|
->addFrom(CourseModel::class, 'c')
|
||||||
|
->join(CourseUserModel::class, 'c.id = cu.course_id', 'cu')
|
||||||
|
->where('cu.user_id = :user_id:', ['user_id' => $userId])
|
||||||
|
->andWhere('cu.role_type = :role_type:', ['role_type' => CourseUserModel::ROLE_TEACHER])
|
||||||
|
->andWhere('c.model = :model:', ['model' => CourseModel::MODEL_LIVE])
|
||||||
|
->getQuery()->execute();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -74,7 +74,7 @@ class ImFriendUser extends Validator
|
|||||||
|
|
||||||
$record = $repo->findFriendUser($friendId, $userId);
|
$record = $repo->findFriendUser($friendId, $userId);
|
||||||
|
|
||||||
if ($record && $record->blocked == 0) {
|
if ($record) {
|
||||||
throw new BadRequestException('im_friend_user.has_joined');
|
throw new BadRequestException('im_friend_user.has_joined');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -54,7 +54,7 @@ class ImGroupUser extends Validator
|
|||||||
|
|
||||||
$record = $repo->findGroupUser($groupId, $userId);
|
$record = $repo->findGroupUser($groupId, $userId);
|
||||||
|
|
||||||
if ($record && $record->blocked == 0) {
|
if ($record) {
|
||||||
throw new BadRequestException('im_group_user.has_joined');
|
throw new BadRequestException('im_group_user.has_joined');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -989,10 +989,6 @@ body {
|
|||||||
color: red;
|
color: red;
|
||||||
}
|
}
|
||||||
|
|
||||||
.vip-user-list .user-card {
|
|
||||||
height: 180px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.cart-course-card {
|
.cart-course-card {
|
||||||
padding-bottom: 10px;
|
padding-bottom: 10px;
|
||||||
margin-bottom: 10px;
|
margin-bottom: 10px;
|
||||||
@ -1272,7 +1268,7 @@ body {
|
|||||||
.user-card {
|
.user-card {
|
||||||
float: left;
|
float: left;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
height: 220px;
|
height: 240px;
|
||||||
position: relative;
|
position: relative;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
background-color: #fff;
|
background-color: #fff;
|
||||||
@ -1281,7 +1277,7 @@ body {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.user-card .avatar {
|
.user-card .avatar {
|
||||||
margin-top: 25px;
|
margin-top: 20px;
|
||||||
margin-bottom: 15px;
|
margin-bottom: 15px;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1298,11 +1294,11 @@ body {
|
|||||||
|
|
||||||
.user-card .name {
|
.user-card .name {
|
||||||
padding: 0 10px;
|
padding: 0 10px;
|
||||||
margin-bottom: 15px;
|
margin-bottom: 10px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.user-card .owner {
|
.user-card .owner {
|
||||||
margin-bottom: 15px;
|
margin-bottom: 10px;
|
||||||
color: #666;
|
color: #666;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1318,7 +1314,11 @@ body {
|
|||||||
margin-right: 5px;
|
margin-right: 5px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.user-card .action button {
|
.user-card .action {
|
||||||
|
margin-top: 15px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.user-card .action .layui-btn {
|
||||||
padding: 0 5px;
|
padding: 0 5px;
|
||||||
height: 20px;
|
height: 20px;
|
||||||
line-height: 20px;
|
line-height: 20px;
|
||||||
@ -1344,13 +1344,21 @@ body {
|
|||||||
margin-bottom: 20px;
|
margin-bottom: 20px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.group-user-list .user-card {
|
.teacher-list .user-card {
|
||||||
|
height: 240px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.vip-user-list .user-card {
|
||||||
height: 200px;
|
height: 200px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.group-user-list .user-card {
|
||||||
box-shadow: none;
|
box-shadow: none;
|
||||||
|
height: 220px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.group-user-list .user-card .avatar {
|
.group-user-list .user-card .avatar {
|
||||||
margin-top: 15px;
|
margin-top: 10px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.im-group-list .user-card {
|
.im-group-list .user-card {
|
||||||
|
63
public/static/web/js/im.apply.js
Normal file
63
public/static/web/js/im.apply.js
Normal file
@ -0,0 +1,63 @@
|
|||||||
|
layui.use(['jquery', 'layer', 'layim', 'helper'], function () {
|
||||||
|
|
||||||
|
var $ = layui.jquery;
|
||||||
|
var layer = layui.layer;
|
||||||
|
var layim = layui.layim;
|
||||||
|
var helper = layui.helper;
|
||||||
|
|
||||||
|
$('body').on('click', '.apply-friend', function () {
|
||||||
|
var friendId = $(this).data('id');
|
||||||
|
var username = $(this).data('name');
|
||||||
|
var avatar = $(this).data('avatar');
|
||||||
|
helper.checkLogin(function () {
|
||||||
|
layim.add({
|
||||||
|
type: 'friend',
|
||||||
|
username: username,
|
||||||
|
avatar: avatar,
|
||||||
|
submit: function (groupId, remark, index) {
|
||||||
|
$.ajax({
|
||||||
|
type: 'POST',
|
||||||
|
url: '/im/friend/apply',
|
||||||
|
data: {
|
||||||
|
friend_id: friendId,
|
||||||
|
group_id: groupId,
|
||||||
|
remark: remark
|
||||||
|
},
|
||||||
|
success: function (res) {
|
||||||
|
layer.msg(res.msg, {icon: 1});
|
||||||
|
layer.close(index);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
$('body').on('click', '.apply-group', function () {
|
||||||
|
var groupId = $(this).data('id');
|
||||||
|
var groupName = $(this).data('name');
|
||||||
|
var avatar = $(this).data('avatar');
|
||||||
|
helper.checkLogin(function () {
|
||||||
|
layim.add({
|
||||||
|
type: 'group',
|
||||||
|
groupname: groupName,
|
||||||
|
avatar: avatar,
|
||||||
|
submit: function (group, remark, index) {
|
||||||
|
$.ajax({
|
||||||
|
type: 'POST',
|
||||||
|
url: '/im/group/apply',
|
||||||
|
data: {
|
||||||
|
group_id: groupId,
|
||||||
|
remark: remark
|
||||||
|
},
|
||||||
|
success: function (res) {
|
||||||
|
layer.msg(res.msg, {icon: 1});
|
||||||
|
layer.close(index);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
});
|
@ -1,68 +1,14 @@
|
|||||||
layui.use(['jquery', 'form', 'layer', 'layim', 'helper'], function () {
|
layui.use(['form', 'helper'], function () {
|
||||||
|
|
||||||
var $ = layui.jquery;
|
|
||||||
var form = layui.form;
|
var form = layui.form;
|
||||||
var layer = layui.layer;
|
|
||||||
var layim = layui.layim;
|
|
||||||
var helper = layui.helper;
|
var helper = layui.helper;
|
||||||
|
|
||||||
form.on('submit(im_search)', function (data) {
|
form.on('submit(im_search)', function (data) {
|
||||||
var usersUrl = '/im/search?limit=12&target=tab-users&type=user&query=' + data.field.query;
|
var usersUrl = '/im/search?target=tab-users&type=user&query=' + data.field.query;
|
||||||
var groupsUrl = '/im/search?limit=12&target=tab-groups&type=group&query=' + data.field.query;
|
var groupsUrl = '/im/search?target=tab-groups&type=group&query=' + data.field.query;
|
||||||
helper.ajaxLoadHtml(usersUrl, 'tab-users');
|
helper.ajaxLoadHtml(usersUrl, 'tab-users');
|
||||||
helper.ajaxLoadHtml(groupsUrl, 'tab-groups');
|
helper.ajaxLoadHtml(groupsUrl, 'tab-groups');
|
||||||
return false;
|
return false;
|
||||||
});
|
});
|
||||||
|
|
||||||
$('body').on('click', '.apply-friend', function () {
|
|
||||||
var friendId = $(this).data('id');
|
|
||||||
var username = $(this).data('name');
|
|
||||||
var avatar = $(this).data('avatar');
|
|
||||||
layim.add({
|
|
||||||
type: 'friend',
|
|
||||||
username: username,
|
|
||||||
avatar: avatar,
|
|
||||||
submit: function (groupId, remark, index) {
|
|
||||||
$.ajax({
|
|
||||||
type: 'POST',
|
|
||||||
url: '/im/friend/apply',
|
|
||||||
data: {
|
|
||||||
friend_id: friendId,
|
|
||||||
group_id: groupId,
|
|
||||||
remark: remark
|
|
||||||
},
|
|
||||||
success: function (res) {
|
|
||||||
layer.msg(res.msg, {icon: 1});
|
|
||||||
layer.close(index);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
$('body').on('click', '.apply-group', function () {
|
|
||||||
var groupId = $(this).data('id');
|
|
||||||
var groupName = $(this).data('name');
|
|
||||||
var avatar = $(this).data('avatar');
|
|
||||||
layim.add({
|
|
||||||
type: 'group',
|
|
||||||
groupname: groupName,
|
|
||||||
avatar: avatar,
|
|
||||||
submit: function (group, remark, index) {
|
|
||||||
$.ajax({
|
|
||||||
type: 'POST',
|
|
||||||
url: '/im/group/apply',
|
|
||||||
data: {
|
|
||||||
group_id: groupId,
|
|
||||||
remark: remark
|
|
||||||
},
|
|
||||||
success: function (res) {
|
|
||||||
layer.msg(res.msg, {icon: 1});
|
|
||||||
layer.close(index);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
});
|
});
|
Loading…
x
Reference in New Issue
Block a user