mirror of
https://gitee.com/koogua/course-tencent-cloud.git
synced 2025-06-28 05:11:39 +08:00
群组设计
This commit is contained in:
parent
c982856564
commit
1851fb9b25
@ -36,7 +36,7 @@ class ImGroupUserList extends Builder
|
|||||||
|
|
||||||
$userRepo = new UserRepo();
|
$userRepo = new UserRepo();
|
||||||
|
|
||||||
$columns = ['id', 'name', 'avatar', 'about', 'vip'];
|
$columns = ['id', 'name', 'avatar', 'title', 'about', 'vip'];
|
||||||
|
|
||||||
$users = $userRepo->findByIds($ids, $columns);
|
$users = $userRepo->findByIds($ids, $columns);
|
||||||
|
|
||||||
|
82
app/Caches/ImGroupActiveUserList.php
Normal file
82
app/Caches/ImGroupActiveUserList.php
Normal file
@ -0,0 +1,82 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Caches;
|
||||||
|
|
||||||
|
use App\Models\ImGroupMessage as ImGroupMessageModel;
|
||||||
|
use App\Models\User as UserModel;
|
||||||
|
use App\Repos\User as UserRepo;
|
||||||
|
use Phalcon\Mvc\Model\Resultset;
|
||||||
|
use Phalcon\Mvc\Model\ResultsetInterface;
|
||||||
|
|
||||||
|
class ImGroupActiveUserList extends Cache
|
||||||
|
{
|
||||||
|
|
||||||
|
protected $lifetime = 1 * 86400;
|
||||||
|
|
||||||
|
public function getLifetime()
|
||||||
|
{
|
||||||
|
return $this->lifetime;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getKey($id = null)
|
||||||
|
{
|
||||||
|
return "im_group_active_user_list:{$id}";
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getContent($id = null)
|
||||||
|
{
|
||||||
|
$users = $this->findUsers($id);
|
||||||
|
|
||||||
|
if (!$users) return [];
|
||||||
|
|
||||||
|
$result = [];
|
||||||
|
|
||||||
|
foreach ($users as $user) {
|
||||||
|
$result[] = [
|
||||||
|
'id' => $user->id,
|
||||||
|
'name' => $user->name,
|
||||||
|
'avatar' => $user->avatar,
|
||||||
|
'title' => $user->title,
|
||||||
|
'about' => $user->about,
|
||||||
|
'vip' => $user->vip,
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
return $result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param int $groupId
|
||||||
|
* @param int $days
|
||||||
|
* @param int $limit
|
||||||
|
* @return ResultsetInterface|Resultset|UserModel[]
|
||||||
|
*/
|
||||||
|
protected function findUsers($groupId, $days = 7, $limit = 5)
|
||||||
|
{
|
||||||
|
$result = [];
|
||||||
|
|
||||||
|
$startTime = strtotime("-{$days} days");
|
||||||
|
$endTime = time();
|
||||||
|
|
||||||
|
$rows = ImGroupMessageModel::query()
|
||||||
|
->columns(['sender_id', 'total_count' => 'count(sender_id)'])
|
||||||
|
->groupBy('sender_id')
|
||||||
|
->orderBy('total_count DESC')
|
||||||
|
->where('group_id = :group_id:', ['group_id' => $groupId])
|
||||||
|
->betweenWhere('create_time', $startTime, $endTime)
|
||||||
|
->limit($limit)
|
||||||
|
->execute();
|
||||||
|
|
||||||
|
if ($rows->count() > 0) {
|
||||||
|
|
||||||
|
$ids = kg_array_column($rows->toArray(), 'sender_id');
|
||||||
|
|
||||||
|
$userRepo = new UserRepo();
|
||||||
|
|
||||||
|
$result = $userRepo->findByIds($ids);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $result;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -54,57 +54,26 @@ class ImGroupController extends Controller
|
|||||||
{
|
{
|
||||||
$service = new ImGroupService();
|
$service = new ImGroupService();
|
||||||
|
|
||||||
$group = $service->getGroup($id);
|
|
||||||
|
|
||||||
$pager = $service->getGroupUsers($id);
|
$pager = $service->getGroupUsers($id);
|
||||||
|
|
||||||
$pager->items = kg_array_object($pager->items);
|
$pager->items = kg_array_object($pager->items);
|
||||||
|
$pager->target = 'user-list';
|
||||||
|
|
||||||
$this->view->setVar('group', $group);
|
$this->view->setRenderLevel(View::LEVEL_ACTION_VIEW);
|
||||||
$this->view->setVar('pager', $pager);
|
$this->view->setVar('pager', $pager);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @Get("/{id:[0-9]+}/edit", name="web.im_group.edit")
|
* @Get("/{id:[0-9]+}/users/active", name="web.im_group.active_users")
|
||||||
*/
|
*/
|
||||||
public function editAction($id)
|
public function activeUsersAction($id)
|
||||||
{
|
{
|
||||||
$service = new ImGroupService();
|
$service = new ImGroupService();
|
||||||
|
|
||||||
$group = $service->getGroup($id);
|
$users = $service->getActiveGroupUsers($id);
|
||||||
|
|
||||||
$this->view->setVar('group', $group);
|
$this->view->setRenderLevel(View::LEVEL_ACTION_VIEW);
|
||||||
}
|
$this->view->pick('im_group/active_users');
|
||||||
|
$this->view->setVar('users', $users);
|
||||||
/**
|
|
||||||
* @Post("/{id:[0-9]+}/update", name="web.im_group.update")
|
|
||||||
*/
|
|
||||||
public function updateAction($id)
|
|
||||||
{
|
|
||||||
$service = new ImGroupService();
|
|
||||||
|
|
||||||
$service->updateGroup($id);
|
|
||||||
|
|
||||||
$content = ['msg' => '更新群组成功'];
|
|
||||||
|
|
||||||
return $this->jsonSuccess($content);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @Post("/{gid:[0-9]+}/user/{uid:[0-9]+}/delete", name="web.im_group.delete_user")
|
|
||||||
*/
|
|
||||||
public function deleteGroupUserAction($gid, $uid)
|
|
||||||
{
|
|
||||||
$service = new ImGroupService();
|
|
||||||
|
|
||||||
$service->deleteGroupUser($gid, $uid);
|
|
||||||
|
|
||||||
$content = [
|
|
||||||
'location' => $this->request->getHTTPReferer(),
|
|
||||||
'msg' => '移除用户成功',
|
|
||||||
];
|
|
||||||
|
|
||||||
return $this->jsonSuccess($content);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
73
app/Http/Web/Controllers/ImGroupManageController.php
Normal file
73
app/Http/Web/Controllers/ImGroupManageController.php
Normal file
@ -0,0 +1,73 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Http\Web\Controllers;
|
||||||
|
|
||||||
|
use App\Http\Web\Services\ImGroup as ImGroupService;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @RoutePrefix("/igm")
|
||||||
|
*/
|
||||||
|
class ImGroupManageController extends Controller
|
||||||
|
{
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @Get("/{id:[0-9]+}/users", name="web.igm.users")
|
||||||
|
*/
|
||||||
|
public function usersAction($id)
|
||||||
|
{
|
||||||
|
$service = new ImGroupService();
|
||||||
|
|
||||||
|
$group = $service->getGroup($id);
|
||||||
|
|
||||||
|
$pager = $service->getGroupUsers($id);
|
||||||
|
|
||||||
|
$pager->items = kg_array_object($pager->items);
|
||||||
|
|
||||||
|
$this->view->setVar('group', $group);
|
||||||
|
$this->view->setVar('pager', $pager);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @Get("/{id:[0-9]+}/edit", name="web.igm.edit")
|
||||||
|
*/
|
||||||
|
public function editAction($id)
|
||||||
|
{
|
||||||
|
$service = new ImGroupService();
|
||||||
|
|
||||||
|
$group = $service->getGroup($id);
|
||||||
|
|
||||||
|
$this->view->setVar('group', $group);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @Post("/{id:[0-9]+}/update", name="web.igm.update")
|
||||||
|
*/
|
||||||
|
public function updateAction($id)
|
||||||
|
{
|
||||||
|
$service = new ImGroupService();
|
||||||
|
|
||||||
|
$service->updateGroup($id);
|
||||||
|
|
||||||
|
$content = ['msg' => '更新群组成功'];
|
||||||
|
|
||||||
|
return $this->jsonSuccess($content);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @Post("/{gid:[0-9]+}/user/{uid:[0-9]+}/delete", name="web.igm.delete_user")
|
||||||
|
*/
|
||||||
|
public function deleteGroupUserAction($gid, $uid)
|
||||||
|
{
|
||||||
|
$service = new ImGroupService();
|
||||||
|
|
||||||
|
$service->deleteGroupUser($gid, $uid);
|
||||||
|
|
||||||
|
$content = [
|
||||||
|
'location' => $this->request->getHTTPReferer(),
|
||||||
|
'msg' => '移除用户成功',
|
||||||
|
];
|
||||||
|
|
||||||
|
return $this->jsonSuccess($content);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -371,15 +371,18 @@ class Im extends Service
|
|||||||
if ($online) {
|
if ($online) {
|
||||||
Gateway::sendToUid($to['id'], $content);
|
Gateway::sendToUid($to['id'], $content);
|
||||||
} else {
|
} else {
|
||||||
$msgCount = $relation->msg_count + 1;
|
$this->incrFriendUserMsgCount($relation);
|
||||||
$relation->update(['msg_count' => $msgCount]);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
} elseif ($to['type'] == 'group') {
|
} elseif ($to['type'] == 'group') {
|
||||||
|
|
||||||
|
$validator = new ImGroupValidator();
|
||||||
|
|
||||||
|
$group = $validator->checkGroup($to['id']);
|
||||||
|
|
||||||
$validator = new ImGroupUserValidator();
|
$validator = new ImGroupUserValidator();
|
||||||
|
|
||||||
$validator->checkGroupUser($to['id'], $user->id);
|
$validator->checkGroupUser($group->id, $user->id);
|
||||||
|
|
||||||
$messageModel = new ImGroupMessageModel();
|
$messageModel = new ImGroupMessageModel();
|
||||||
|
|
||||||
@ -389,6 +392,8 @@ class Im extends Service
|
|||||||
'content' => $from['content'],
|
'content' => $from['content'],
|
||||||
]);
|
]);
|
||||||
|
|
||||||
|
$this->incrGroupMessageCount($group);
|
||||||
|
|
||||||
$excludeClientId = null;
|
$excludeClientId = null;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -279,4 +279,10 @@ Trait ImFriendTrait
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected function incrFriendUserMsgCount(ImFriendUserModel $friendUser)
|
||||||
|
{
|
||||||
|
$friendUser->msg_count += 1;
|
||||||
|
$friendUser->update();
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -4,6 +4,7 @@ namespace App\Http\Web\Services;
|
|||||||
|
|
||||||
use App\Builders\ImGroupList as ImGroupListBuilder;
|
use App\Builders\ImGroupList as ImGroupListBuilder;
|
||||||
use App\Builders\ImGroupUserList as ImGroupUserListBuilder;
|
use App\Builders\ImGroupUserList as ImGroupUserListBuilder;
|
||||||
|
use App\Caches\ImGroupActiveUserList as ImGroupActiveUserListCache;
|
||||||
use App\Library\Paginator\Query as PagerQuery;
|
use App\Library\Paginator\Query as PagerQuery;
|
||||||
use App\Models\ImGroup as ImGroupModel;
|
use App\Models\ImGroup as ImGroupModel;
|
||||||
use App\Repos\ImGroup as ImGroupRepo;
|
use App\Repos\ImGroup as ImGroupRepo;
|
||||||
@ -34,6 +35,67 @@ class ImGroup extends Service
|
|||||||
return $this->handleGroups($pager);
|
return $this->handleGroups($pager);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function getGroup($id)
|
||||||
|
{
|
||||||
|
$validator = new ImGroupValidator();
|
||||||
|
|
||||||
|
$group = $validator->checkGroup($id);
|
||||||
|
|
||||||
|
$userRepo = new UserRepo();
|
||||||
|
|
||||||
|
$owner = $userRepo->findById($group->owner_id);
|
||||||
|
|
||||||
|
return [
|
||||||
|
'id' => $group->id,
|
||||||
|
'type' => $group->type,
|
||||||
|
'name' => $group->name,
|
||||||
|
'avatar' => $group->avatar,
|
||||||
|
'about' => $group->about,
|
||||||
|
'user_count' => $group->user_count,
|
||||||
|
'msg_count' => $group->msg_count,
|
||||||
|
'owner' => [
|
||||||
|
'id' => $owner->id,
|
||||||
|
'name' => $owner->name,
|
||||||
|
'avatar' => $owner->avatar,
|
||||||
|
'title' => $owner->title,
|
||||||
|
'about' => $owner->about,
|
||||||
|
'vip' => $owner->vip,
|
||||||
|
],
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getGroupUsers($id)
|
||||||
|
{
|
||||||
|
$validator = new ImGroupValidator();
|
||||||
|
|
||||||
|
$group = $validator->checkGroup($id);
|
||||||
|
|
||||||
|
$pagerQuery = new PagerQuery();
|
||||||
|
|
||||||
|
$params = $pagerQuery->getParams();
|
||||||
|
|
||||||
|
$params['group_id'] = $group->id;
|
||||||
|
|
||||||
|
$sort = $pagerQuery->getSort();
|
||||||
|
$page = $pagerQuery->getPage();
|
||||||
|
$limit = $pagerQuery->getLimit();
|
||||||
|
|
||||||
|
$repo = new ImGroupUserRepo();
|
||||||
|
|
||||||
|
$pager = $repo->paginate($params, $sort, $page, $limit);
|
||||||
|
|
||||||
|
return $this->handleGroupUsers($pager);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getActiveGroupUsers($id)
|
||||||
|
{
|
||||||
|
$cache = new ImGroupActiveUserListCache();
|
||||||
|
|
||||||
|
$result = $cache->get($id);
|
||||||
|
|
||||||
|
return $result ?: [];
|
||||||
|
}
|
||||||
|
|
||||||
public function updateGroup($id)
|
public function updateGroup($id)
|
||||||
{
|
{
|
||||||
$post = $this->request->getPost();
|
$post = $this->request->getPost();
|
||||||
@ -68,54 +130,6 @@ class ImGroup extends Service
|
|||||||
return $group;
|
return $group;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getGroup($id)
|
|
||||||
{
|
|
||||||
$validator = new ImGroupValidator();
|
|
||||||
|
|
||||||
$group = $validator->checkGroup($id);
|
|
||||||
|
|
||||||
$userRepo = new UserRepo();
|
|
||||||
|
|
||||||
$owner = $userRepo->findById($group->owner_id);
|
|
||||||
|
|
||||||
return [
|
|
||||||
'id' => $group->id,
|
|
||||||
'name' => $group->name,
|
|
||||||
'about' => $group->about,
|
|
||||||
'user_count' => $group->user_count,
|
|
||||||
'owner' => [
|
|
||||||
'id' => $owner->id,
|
|
||||||
'name' => $owner->name,
|
|
||||||
'avatar' => $owner->avatar,
|
|
||||||
'title' => $owner->title,
|
|
||||||
'about' => $owner->about,
|
|
||||||
],
|
|
||||||
];
|
|
||||||
}
|
|
||||||
|
|
||||||
public function getGroupUsers($id)
|
|
||||||
{
|
|
||||||
$validator = new ImGroupValidator();
|
|
||||||
|
|
||||||
$group = $validator->checkGroup($id);
|
|
||||||
|
|
||||||
$pagerQuery = new PagerQuery();
|
|
||||||
|
|
||||||
$params = $pagerQuery->getParams();
|
|
||||||
|
|
||||||
$params['group_id'] = $group->id;
|
|
||||||
|
|
||||||
$sort = $pagerQuery->getSort();
|
|
||||||
$page = $pagerQuery->getPage();
|
|
||||||
$limit = $pagerQuery->getLimit();
|
|
||||||
|
|
||||||
$repo = new ImGroupUserRepo();
|
|
||||||
|
|
||||||
$pager = $repo->paginate($params, $sort, $page, $limit);
|
|
||||||
|
|
||||||
return $this->handleGroupUsers($pager);
|
|
||||||
}
|
|
||||||
|
|
||||||
public function deleteGroupUser($groupId, $userId)
|
public function deleteGroupUser($groupId, $userId)
|
||||||
{
|
{
|
||||||
$loginUser = $this->getLoginUser();
|
$loginUser = $this->getLoginUser();
|
||||||
@ -183,6 +197,7 @@ class ImGroup extends Service
|
|||||||
'avatar' => $group['avatar'],
|
'avatar' => $group['avatar'],
|
||||||
'about' => $group['about'],
|
'about' => $group['about'],
|
||||||
'user_count' => $group['user_count'],
|
'user_count' => $group['user_count'],
|
||||||
|
'msg_count' => $group['msg_count'],
|
||||||
'owner' => $group['owner'],
|
'owner' => $group['owner'],
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
@ -148,7 +148,7 @@ Trait ImGroupTrait
|
|||||||
{
|
{
|
||||||
$userRepo = new ImUserRepo();
|
$userRepo = new ImUserRepo();
|
||||||
|
|
||||||
$receiver = $userRepo->findById($group->user_id);
|
$receiver = $userRepo->findById($group->owner_id);
|
||||||
|
|
||||||
$itemType = ImSystemMessageModel::TYPE_GROUP_REQUEST;
|
$itemType = ImSystemMessageModel::TYPE_GROUP_REQUEST;
|
||||||
|
|
||||||
@ -314,4 +314,10 @@ Trait ImGroupTrait
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected function incrGroupMessageCount(ImGroupModel $group)
|
||||||
|
{
|
||||||
|
$group->msg_count += 1;
|
||||||
|
$group->update();
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -84,8 +84,12 @@
|
|||||||
{% set show_sidebar_related = 1 %}
|
{% set show_sidebar_related = 1 %}
|
||||||
|
|
||||||
<div class="layout-sidebar">
|
<div class="layout-sidebar">
|
||||||
{{ partial('course/show_order') }}
|
<div class="sidebar">
|
||||||
{{ partial('course/show_teacher') }}
|
{{ partial('course/show_order') }}
|
||||||
|
</div>
|
||||||
|
<div class="sidebar">
|
||||||
|
{{ 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,7 +1,7 @@
|
|||||||
{% 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">
|
<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'}) %}
|
||||||
<a class="layui-btn layui-btn-fluid layui-bg-red btn-buy" href="javascript:" data-url="{{ order_url }}">立即购买</a>
|
<button class="layui-btn layui-btn-fluid layui-bg-red btn-buy" data-url="{{ order_url }}">立即购买</button>
|
||||||
</div>
|
</div>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
@ -13,7 +13,7 @@
|
|||||||
{% for reward in rewards %}
|
{% for reward in rewards %}
|
||||||
{% set item_id = [course.id,reward.id]|join('-') %}
|
{% set item_id = [course.id,reward.id]|join('-') %}
|
||||||
{% set order_url = url({'for':'web.order.confirm'},{'item_id':item_id,'item_type':'reward'}) %}
|
{% set order_url = url({'for':'web.order.confirm'},{'item_id':item_id,'item_type':'reward'}) %}
|
||||||
<a class="layui-btn layui-btn-xs btn-reward" href="javascript:" data-url="{{ order_url }}">{{ reward.title }}</a>
|
<button class="layui-btn layui-btn-xs btn-reward" data-url="{{ order_url }}">{{ reward.title }}</button>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -3,7 +3,8 @@
|
|||||||
<div class="layui-card-header">热门专题</div>
|
<div class="layui-card-header">热门专题</div>
|
||||||
<div class="layui-card-body">
|
<div class="layui-card-body">
|
||||||
{% for topic in topics %}
|
{% for topic in topics %}
|
||||||
<a class="layui-badge-rim topic-badge" href="{{ url({'for':'web.topic.show','id':topic.id}) }}">{{ topic.title }}</a>
|
{% set topic_url = url({'for':'web.topic.show','id':topic.id}) %}
|
||||||
|
<a class="layui-badge-rim topic-badge" href="{{ topic_url }}">{{ topic.title }}</a>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
22
app/Http/Web/Views/im_group/active_users.volt
Normal file
22
app/Http/Web/Views/im_group/active_users.volt
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
{% if users %}
|
||||||
|
<div class="layui-card">
|
||||||
|
<div class="layui-card-header">活跃成员</div>
|
||||||
|
<div class="layui-card-body">
|
||||||
|
{% for user in users %}
|
||||||
|
{% set user_url = url({'for':'web.user.show','id':user.id}) %}
|
||||||
|
{% set user.title = user.title ? user.title : '暂无头衔' %}
|
||||||
|
<div class="sidebar-teacher-card clearfix">
|
||||||
|
<div class="avatar">
|
||||||
|
<img src="{{ user.avatar }}" alt="{{ user.name }}">
|
||||||
|
</div>
|
||||||
|
<div class="info">
|
||||||
|
<div class="name layui-elip">
|
||||||
|
<a href="{{ user_url }}" title="{{ user.about }}">{{ user.name }}</a>
|
||||||
|
</div>
|
||||||
|
<div class="title layui-elip">{{ user.title }}</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endfor %}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
@ -15,6 +15,6 @@
|
|||||||
|
|
||||||
{% block include_js %}
|
{% block include_js %}
|
||||||
|
|
||||||
{{ js_include('web/js/group.list.js') }}
|
{{ js_include('web/js/im_group.list.js') }}
|
||||||
|
|
||||||
{% endblock %}
|
{% endblock %}
|
@ -1,8 +1,10 @@
|
|||||||
{% if pager.total_pages > 0 %}
|
{% if pager.total_pages > 0 %}
|
||||||
<div class="user-list clearfix">
|
<div class="im-group-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 group_url = url({'for':'web.im_group.show','id':item.id}) %}
|
{% set group_url = url({'for':'web.im_group.show','id':item.id}) %}
|
||||||
|
{% set owner_url = url({'for':'web.user.show','id':item.owner.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' %}
|
{% if item.type == 'course' %}
|
||||||
@ -18,8 +20,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="action">
|
<div class="owner">
|
||||||
<button class="layui-btn apply-group" data-id="{{ item.id }}">申请加入</button>
|
<span>组长:<a href="{{ owner_url }}">{{ item.owner.name }}</a></span>
|
||||||
|
</div>
|
||||||
|
<div class="meta layui-elip">
|
||||||
|
<span>成员:{{ item.user_count }}</span>
|
||||||
|
<span>讨论:{{ item.msg_count }}</span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -3,7 +3,9 @@
|
|||||||
{% block content %}
|
{% block content %}
|
||||||
|
|
||||||
{% set group.about = group.about ? group.about : '这个家伙真懒,什么都没有留下~' %}
|
{% set group.about = group.about ? group.about : '这个家伙真懒,什么都没有留下~' %}
|
||||||
|
{% set apply_group_url = '' %}
|
||||||
{% set users_url = url({'for':'web.im_group.users','id':group.id}) %}
|
{% set users_url = url({'for':'web.im_group.users','id':group.id}) %}
|
||||||
|
{% set active_users_url = url({'for':'web.im_group.active_users','id':group.id}) %}
|
||||||
|
|
||||||
<div class="breadcrumb">
|
<div class="breadcrumb">
|
||||||
<span class="layui-breadcrumb">
|
<span class="layui-breadcrumb">
|
||||||
@ -13,24 +15,28 @@
|
|||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="layout-main">
|
<div class="layout-main clearfix">
|
||||||
<div class="layout-content">
|
<div class="layout-content">
|
||||||
<div class="layui-card group-about">
|
<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 group-about">{{ group.about }}</div>
|
||||||
<blockquote class="layui-elem-quote">{{ group.about }}</blockquote>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
<div class="layui-card group-about">
|
<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">
|
||||||
<div id="group-user-list" data-url="{{ users_url }}"></div>
|
<div id="user-list" data-url="{{ users_url }}"></div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
<br>
|
||||||
</div>
|
</div>
|
||||||
<div class="layout-sidebar">
|
<div class="layout-sidebar">
|
||||||
{{ partial('im_group/show_owner') }}
|
<div class="sidebar">
|
||||||
{{ partial('im_group/show_active_users') }}
|
{{ partial('im_group/show_owner') }}
|
||||||
|
</div>
|
||||||
|
<div class="sidebar wrap">
|
||||||
|
<button class="layui-btn layui-btn-fluid apply-group" data-url="{{ apply_group_url }}">申请加入</button>
|
||||||
|
</div>
|
||||||
|
<div class="sidebar" id="active-user-list" data-url="{{ active_users_url }}"></div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@ -38,6 +44,6 @@
|
|||||||
|
|
||||||
{% block include_js %}
|
{% block include_js %}
|
||||||
|
|
||||||
{{ js_include('web/js/user.show.js') }}
|
{{ js_include('web/js/im_group.show.js') }}
|
||||||
|
|
||||||
{% endblock %}
|
{% endblock %}
|
@ -1,16 +0,0 @@
|
|||||||
<div class="layui-card">
|
|
||||||
<div class="layui-card-header">活跃成员</div>
|
|
||||||
<div class="layui-card-body">
|
|
||||||
<div class="sidebar-teacher-card clearfix">
|
|
||||||
<div class="avatar">
|
|
||||||
<img src="" alt="">
|
|
||||||
</div>
|
|
||||||
<div class="info">
|
|
||||||
<div class="name layui-elip">
|
|
||||||
<a href="#">小明</a>
|
|
||||||
</div>
|
|
||||||
<div class="title layui-elip">社科</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
@ -10,7 +10,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="info">
|
<div class="info">
|
||||||
<div class="name layui-elip">
|
<div class="name layui-elip">
|
||||||
<a href="{{ owner_url }}">{{ group.owner.name }}</a>
|
<a href="{{ owner_url }}" title="{{ group.owner.about }}">{{ group.owner.name }}</a>
|
||||||
</div>
|
</div>
|
||||||
<div class="title layui-elip">{{ group.owner.title }}</div>
|
<div class="title layui-elip">{{ group.owner.title }}</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -1,31 +1,26 @@
|
|||||||
{% extends 'templates/layer.volt' %}
|
<div class="group-user-list clearfix">
|
||||||
|
<div class="layui-row layui-col-space20">
|
||||||
{% block content %}
|
{% for item in pager.items %}
|
||||||
|
{% set user_url = url({'for':'web.user.show','id':item.id}) %}
|
||||||
<div class="bg-wrap">
|
<div class="layui-col-md3">
|
||||||
<div class="im-user-list clearfix">
|
<div class="user-card">
|
||||||
<div class="layui-row layui-col-space20">
|
{% if item.vip == 1 %}
|
||||||
{% for item in pager.items %}
|
<span class="layui-badge layui-bg-orange vip">VIP</span>
|
||||||
{% set delete_url = url({'for':'web.im_group.delete_user','gid':group.id,'uid':item.id}) %}
|
{% endif %}
|
||||||
<div class="layui-col-md2">
|
<div class="avatar">
|
||||||
<div class="user-card">
|
<a href="{{ user_url }}" title="{{ item.about }}">
|
||||||
{% if item.vip == 1 %}
|
<img src="{{ item.avatar }}" alt="{{ item.name }}">
|
||||||
<span class="vip">会员</span>
|
</a>
|
||||||
{% endif %}
|
|
||||||
<div class="avatar">
|
|
||||||
<a href="javascript:" title="{{ item.about }}"><img src="{{ item.avatar }}" alt="{{ item.name }}"></a>
|
|
||||||
</div>
|
|
||||||
<div class="name layui-elip" title="{{ item.name }}">{{ item.name }}</div>
|
|
||||||
<div class="action">
|
|
||||||
<button class="layui-btn kg-delete" data-tips="你确定要移除该用户吗?" data-url="{{ delete_url }}">移除</button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
{% endfor %}
|
<div class="name layui-elip">
|
||||||
|
<a href="{{ user_url }}" title="{{ item.about }}">{{ item.name }}</a>
|
||||||
|
</div>
|
||||||
|
<div class="action">
|
||||||
|
<span class="layui-btn layui-btn-xs apply-friend">添加好友</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
{% endfor %}
|
||||||
{{ partial('partials/pager') }}
|
|
||||||
</div>
|
</div>
|
||||||
|
</div>
|
||||||
{% endblock %}
|
{{ partial('partials/pager_ajax') }}
|
||||||
|
|
31
app/Http/Web/Views/im_group_manage/users.volt
Normal file
31
app/Http/Web/Views/im_group_manage/users.volt
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
{% extends 'templates/layer.volt' %}
|
||||||
|
|
||||||
|
{% block content %}
|
||||||
|
|
||||||
|
<div class="bg-wrap">
|
||||||
|
<div class="im-user-list clearfix">
|
||||||
|
<div class="layui-row layui-col-space20">
|
||||||
|
{% for item in pager.items %}
|
||||||
|
{% set delete_url = url({'for':'web.im_group.delete_user','gid':group.id,'uid':item.id}) %}
|
||||||
|
<div class="layui-col-md2">
|
||||||
|
<div class="user-card">
|
||||||
|
{% if item.vip == 1 %}
|
||||||
|
<span class="vip">会员</span>
|
||||||
|
{% endif %}
|
||||||
|
<div class="avatar">
|
||||||
|
<a href="javascript:" title="{{ item.about }}"><img src="{{ item.avatar }}" alt="{{ item.name }}"></a>
|
||||||
|
</div>
|
||||||
|
<div class="name layui-elip" title="{{ item.name }}">{{ item.name }}</div>
|
||||||
|
<div class="action">
|
||||||
|
<button class="layui-btn kg-delete" data-tips="你确定要移除该用户吗?" data-url="{{ delete_url }}">移除</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endfor %}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{{ partial('partials/pager') }}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
{% endblock %}
|
||||||
|
|
@ -9,23 +9,22 @@
|
|||||||
<thead>
|
<thead>
|
||||||
<tr>
|
<tr>
|
||||||
<th>名称</th>
|
<th>名称</th>
|
||||||
<th>群主</th>
|
|
||||||
<th>成员</th>
|
<th>成员</th>
|
||||||
|
<th>讨论</th>
|
||||||
<th>操作</th>
|
<th>操作</th>
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
<tbody>
|
<tbody>
|
||||||
{% for item in pager.items %}
|
{% for item in pager.items %}
|
||||||
{% set owner_url = url({'for':'web.user.show','id':item.owner.id}) %}
|
{% set edit_url = url({'for':'web.igm.edit','id':item.id}) %}
|
||||||
{% set edit_url = url({'for':'web.im_group.edit','id':item.id}) %}
|
{% set users_url = url({'for':'web.igm.users','id':item.id}) %}
|
||||||
{% set users_url = url({'for':'web.im_group.users','id':item.id}) %}
|
|
||||||
<tr>
|
<tr>
|
||||||
<td><span title="{{ item.about }}">{{ item.name }}</span> {{ type_info(item.type) }}</td>
|
<td><span title="{{ item.about }}">{{ item.name }}</span> {{ type_info(item.type) }}</td>
|
||||||
<td><a href="{{ owner_url }}">{{ item.owner.name }}</a></td>
|
|
||||||
<td><span class="layui-badge-rim">{{ item.user_count }}</span></td>
|
<td><span class="layui-badge-rim">{{ item.user_count }}</span></td>
|
||||||
|
<td><span class="layui-badge-rim">{{ item.msg_count }}</span></td>
|
||||||
<td>
|
<td>
|
||||||
<button class="layui-btn layui-btn-xs layui-bg-blue btn-group-user" data-url="{{ users_url }}">成员</button>
|
<span class="layui-btn layui-btn-xs layui-bg-blue btn-group-user" data-url="{{ users_url }}">成员</span>
|
||||||
<button class="layui-btn layui-btn-xs btn-edit-group" data-url="{{ edit_url }}">编辑</button>
|
<span class="layui-btn layui-btn-xs btn-edit-group" data-url="{{ edit_url }}">编辑</span>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
|
@ -84,6 +84,13 @@ class ImGroup extends Model
|
|||||||
*/
|
*/
|
||||||
public $user_count;
|
public $user_count;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 消息数
|
||||||
|
*
|
||||||
|
* @var int
|
||||||
|
*/
|
||||||
|
public $msg_count;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 创建时间
|
* 创建时间
|
||||||
*
|
*
|
||||||
|
@ -4,6 +4,7 @@ namespace App\Repos;
|
|||||||
|
|
||||||
use App\Library\Paginator\Adapter\QueryBuilder as PagerQueryBuilder;
|
use App\Library\Paginator\Adapter\QueryBuilder as PagerQueryBuilder;
|
||||||
use App\Models\ImGroup as ImGroupModel;
|
use App\Models\ImGroup as ImGroupModel;
|
||||||
|
use App\Models\ImGroupMessage as ImGroupMessageModel;
|
||||||
use App\Models\ImGroupUser as ImGroupUserModel;
|
use App\Models\ImGroupUser as ImGroupUserModel;
|
||||||
use App\Models\ImUser as ImUserModel;
|
use App\Models\ImUser as ImUserModel;
|
||||||
use Phalcon\Mvc\Model;
|
use Phalcon\Mvc\Model;
|
||||||
@ -103,13 +104,21 @@ class ImGroup extends Repository
|
|||||||
|
|
||||||
public function countGroups()
|
public function countGroups()
|
||||||
{
|
{
|
||||||
return (int)ImGroupModel::count(['conditions' => 'deleted = 0']);
|
return (int)ImGroupModel::count(['conditions' => 'published = 1']);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function countUsers($groupId)
|
public function countUsers($groupId)
|
||||||
{
|
{
|
||||||
return (int)ImGroupUserModel::count([
|
return (int)ImGroupUserModel::count([
|
||||||
'conditions' => 'group_id = :group_id: AND blocked = 0',
|
'conditions' => 'group_id = :group_id:',
|
||||||
|
'bind' => ['group_id' => $groupId],
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function countMessages($groupId)
|
||||||
|
{
|
||||||
|
return (int)ImGroupMessageModel::count([
|
||||||
|
'conditions' => 'group_id = :group_id: AND published = 1',
|
||||||
'bind' => ['group_id' => $groupId],
|
'bind' => ['group_id' => $groupId],
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
@ -111,7 +111,7 @@ class ImUser extends Repository
|
|||||||
->addFrom(ImGroupModel::class, 'g')
|
->addFrom(ImGroupModel::class, 'g')
|
||||||
->join(ImGroupUserModel::class, 'g.id = gu.group_id', 'gu')
|
->join(ImGroupUserModel::class, 'g.id = gu.group_id', 'gu')
|
||||||
->where('gu.user_id = :user_id:', ['user_id' => $userId])
|
->where('gu.user_id = :user_id:', ['user_id' => $userId])
|
||||||
->andWhere('g.published = 0')
|
->andWhere('g.published = 1')
|
||||||
->getQuery()->execute();
|
->getQuery()->execute();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -78,6 +78,7 @@ class GroupList extends FrontendService
|
|||||||
'avatar' => $group['avatar'],
|
'avatar' => $group['avatar'],
|
||||||
'about' => $group['about'],
|
'about' => $group['about'],
|
||||||
'user_count' => $group['user_count'],
|
'user_count' => $group['user_count'],
|
||||||
|
'msg_count' => $group['msg_count'],
|
||||||
'owner' => $group['owner'],
|
'owner' => $group['owner'],
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
@ -1,8 +1,7 @@
|
|||||||
layui.define(['jquery', 'element', 'layer'], function (exports) {
|
layui.define(['jquery', 'layer'], function (exports) {
|
||||||
|
|
||||||
var MOD_NAME = 'helper';
|
var MOD_NAME = 'helper';
|
||||||
var $ = layui.jquery;
|
var $ = layui.jquery;
|
||||||
var element = layui.element;
|
|
||||||
var layer = layui.layer;
|
var layer = layui.layer;
|
||||||
|
|
||||||
var helper = {};
|
var helper = {};
|
||||||
@ -13,7 +12,6 @@ layui.define(['jquery', 'element', 'layer'], function (exports) {
|
|||||||
$target.html(html);
|
$target.html(html);
|
||||||
$.get(url, function (html) {
|
$.get(url, function (html) {
|
||||||
$target.html(html);
|
$target.html(html);
|
||||||
element.init();
|
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -1269,10 +1269,6 @@ body {
|
|||||||
color: #666;
|
color: #666;
|
||||||
}
|
}
|
||||||
|
|
||||||
.user-list {
|
|
||||||
margin-bottom: 20px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.user-card {
|
.user-card {
|
||||||
float: left;
|
float: left;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
@ -1305,9 +1301,21 @@ body {
|
|||||||
margin-bottom: 15px;
|
margin-bottom: 15px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.user-card .owner {
|
||||||
|
margin-bottom: 15px;
|
||||||
|
color: #666;
|
||||||
|
}
|
||||||
|
|
||||||
.user-card .title {
|
.user-card .title {
|
||||||
color: #666;
|
color: #666;
|
||||||
font-size: 12px;
|
}
|
||||||
|
|
||||||
|
.user-card .meta {
|
||||||
|
color: #666;
|
||||||
|
}
|
||||||
|
|
||||||
|
.user-card .meta span {
|
||||||
|
margin-right: 5px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.user-card .action button {
|
.user-card .action button {
|
||||||
@ -1332,6 +1340,30 @@ body {
|
|||||||
right: 28px;
|
right: 28px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.user-list {
|
||||||
|
margin-bottom: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.group-user-list .user-card {
|
||||||
|
height: 200px;
|
||||||
|
box-shadow: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.group-user-list .user-card .avatar {
|
||||||
|
margin-top: 15px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.im-group-list .user-card {
|
||||||
|
height: 250px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.group-about {
|
||||||
|
padding: 15px;
|
||||||
|
min-height: 65px;
|
||||||
|
font-size: 12px;
|
||||||
|
color: #666;
|
||||||
|
}
|
||||||
|
|
||||||
.my-sidebar {
|
.my-sidebar {
|
||||||
float: left;
|
float: left;
|
||||||
width: 220px;
|
width: 220px;
|
||||||
@ -1386,7 +1418,7 @@ body {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.wrap .layui-table {
|
.wrap .layui-table {
|
||||||
margin-top: 0;
|
margin: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
.layui-table p {
|
.layui-table p {
|
||||||
@ -1639,12 +1671,14 @@ body {
|
|||||||
position: absolute;
|
position: absolute;
|
||||||
top: 10px;
|
top: 10px;
|
||||||
right: 10px;
|
right: 10px;
|
||||||
|
font-size: 12px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.layim-chat-list li .msg-count {
|
.layim-chat-list li .msg-count {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
top: 5px;
|
top: 5px;
|
||||||
right: 30px;
|
right: 30px;
|
||||||
|
font-size: 12px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.layim-chat-status .online {
|
.layim-chat-status .online {
|
||||||
|
12
public/static/web/js/im_group.show.js
Normal file
12
public/static/web/js/im_group.show.js
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
layui.use(['jquery', 'helper'], function () {
|
||||||
|
|
||||||
|
var $ = layui.jquery;
|
||||||
|
var helper = layui.helper;
|
||||||
|
|
||||||
|
var $userList = $('#user-list');
|
||||||
|
var $activeUserList = $('#active-user-list');
|
||||||
|
|
||||||
|
helper.ajaxLoadHtml($userList.data('url'), $userList.attr('id'));
|
||||||
|
helper.ajaxLoadHtml($activeUserList.data('url'), $activeUserList.attr('id'));
|
||||||
|
|
||||||
|
});
|
Loading…
x
Reference in New Issue
Block a user