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();
|
||||
|
||||
$columns = ['id', 'name', 'avatar', 'about', 'vip'];
|
||||
$columns = ['id', 'name', 'avatar', 'title', 'about', 'vip'];
|
||||
|
||||
$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();
|
||||
|
||||
$group = $service->getGroup($id);
|
||||
|
||||
$pager = $service->getGroupUsers($id);
|
||||
|
||||
$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);
|
||||
}
|
||||
|
||||
/**
|
||||
* @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();
|
||||
|
||||
$group = $service->getGroup($id);
|
||||
$users = $service->getActiveGroupUsers($id);
|
||||
|
||||
$this->view->setVar('group', $group);
|
||||
}
|
||||
|
||||
/**
|
||||
* @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);
|
||||
$this->view->setRenderLevel(View::LEVEL_ACTION_VIEW);
|
||||
$this->view->pick('im_group/active_users');
|
||||
$this->view->setVar('users', $users);
|
||||
}
|
||||
|
||||
}
|
||||
|
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) {
|
||||
Gateway::sendToUid($to['id'], $content);
|
||||
} else {
|
||||
$msgCount = $relation->msg_count + 1;
|
||||
$relation->update(['msg_count' => $msgCount]);
|
||||
$this->incrFriendUserMsgCount($relation);
|
||||
}
|
||||
|
||||
} elseif ($to['type'] == 'group') {
|
||||
|
||||
$validator = new ImGroupValidator();
|
||||
|
||||
$group = $validator->checkGroup($to['id']);
|
||||
|
||||
$validator = new ImGroupUserValidator();
|
||||
|
||||
$validator->checkGroupUser($to['id'], $user->id);
|
||||
$validator->checkGroupUser($group->id, $user->id);
|
||||
|
||||
$messageModel = new ImGroupMessageModel();
|
||||
|
||||
@ -389,6 +392,8 @@ class Im extends Service
|
||||
'content' => $from['content'],
|
||||
]);
|
||||
|
||||
$this->incrGroupMessageCount($group);
|
||||
|
||||
$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\ImGroupUserList as ImGroupUserListBuilder;
|
||||
use App\Caches\ImGroupActiveUserList as ImGroupActiveUserListCache;
|
||||
use App\Library\Paginator\Query as PagerQuery;
|
||||
use App\Models\ImGroup as ImGroupModel;
|
||||
use App\Repos\ImGroup as ImGroupRepo;
|
||||
@ -34,6 +35,67 @@ class ImGroup extends Service
|
||||
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)
|
||||
{
|
||||
$post = $this->request->getPost();
|
||||
@ -68,54 +130,6 @@ class ImGroup extends Service
|
||||
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)
|
||||
{
|
||||
$loginUser = $this->getLoginUser();
|
||||
@ -183,6 +197,7 @@ class ImGroup extends Service
|
||||
'avatar' => $group['avatar'],
|
||||
'about' => $group['about'],
|
||||
'user_count' => $group['user_count'],
|
||||
'msg_count' => $group['msg_count'],
|
||||
'owner' => $group['owner'],
|
||||
];
|
||||
}
|
||||
|
@ -148,7 +148,7 @@ Trait ImGroupTrait
|
||||
{
|
||||
$userRepo = new ImUserRepo();
|
||||
|
||||
$receiver = $userRepo->findById($group->user_id);
|
||||
$receiver = $userRepo->findById($group->owner_id);
|
||||
|
||||
$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 %}
|
||||
|
||||
<div class="layout-sidebar">
|
||||
{{ partial('course/show_order') }}
|
||||
{{ partial('course/show_teacher') }}
|
||||
<div class="sidebar">
|
||||
{{ partial('course/show_order') }}
|
||||
</div>
|
||||
<div class="sidebar">
|
||||
{{ partial('course/show_teacher') }}
|
||||
</div>
|
||||
{% if show_sidebar_topics %}
|
||||
{% set topics_url = url({'for':'web.course.topics','id':course.id}) %}
|
||||
<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 %}
|
||||
<div class="sidebar-order wrap">
|
||||
{% 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>
|
||||
{% endif %}
|
||||
|
||||
@ -13,7 +13,7 @@
|
||||
{% for reward in rewards %}
|
||||
{% set item_id = [course.id,reward.id]|join('-') %}
|
||||
{% 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 %}
|
||||
</div>
|
||||
</div>
|
||||
|
@ -3,7 +3,8 @@
|
||||
<div class="layui-card-header">热门专题</div>
|
||||
<div class="layui-card-body">
|
||||
{% 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 %}
|
||||
</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 %}
|
||||
|
||||
{{ js_include('web/js/group.list.js') }}
|
||||
{{ js_include('web/js/im_group.list.js') }}
|
||||
|
||||
{% endblock %}
|
@ -1,8 +1,10 @@
|
||||
{% if pager.total_pages > 0 %}
|
||||
<div class="user-list clearfix">
|
||||
<div class="im-group-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}) %}
|
||||
{% 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="user-card">
|
||||
{% if item.type == 'course' %}
|
||||
@ -18,8 +20,12 @@
|
||||
<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 class="owner">
|
||||
<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>
|
||||
|
@ -3,7 +3,9 @@
|
||||
{% block content %}
|
||||
|
||||
{% set group.about = group.about ? group.about : '这个家伙真懒,什么都没有留下~' %}
|
||||
{% set apply_group_url = '' %}
|
||||
{% 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">
|
||||
<span class="layui-breadcrumb">
|
||||
@ -13,24 +15,28 @@
|
||||
</span>
|
||||
</div>
|
||||
|
||||
<div class="layout-main">
|
||||
<div class="layout-main clearfix">
|
||||
<div class="layout-content">
|
||||
<div class="layui-card group-about">
|
||||
<div class="layui-card">
|
||||
<div class="layui-card-header">小组介绍</div>
|
||||
<div class="layui-card-body">
|
||||
<blockquote class="layui-elem-quote">{{ group.about }}</blockquote>
|
||||
</div>
|
||||
<div class="layui-card-body group-about">{{ group.about }}</div>
|
||||
</div>
|
||||
<div class="layui-card group-about">
|
||||
<div class="layui-card">
|
||||
<div class="layui-card-header">小组成员</div>
|
||||
<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>
|
||||
<br>
|
||||
</div>
|
||||
<div class="layout-sidebar">
|
||||
{{ partial('im_group/show_owner') }}
|
||||
{{ partial('im_group/show_active_users') }}
|
||||
<div class="sidebar">
|
||||
{{ 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>
|
||||
|
||||
@ -38,6 +44,6 @@
|
||||
|
||||
{% block include_js %}
|
||||
|
||||
{{ js_include('web/js/user.show.js') }}
|
||||
{{ js_include('web/js/im_group.show.js') }}
|
||||
|
||||
{% 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 class="info">
|
||||
<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 class="title layui-elip">{{ group.owner.title }}</div>
|
||||
</div>
|
||||
|
@ -1,31 +1,26 @@
|
||||
{% 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 class="group-user-list clearfix">
|
||||
<div class="layui-row layui-col-space20">
|
||||
{% for item in pager.items %}
|
||||
{% set user_url = url({'for':'web.user.show','id':item.id}) %}
|
||||
<div class="layui-col-md3">
|
||||
<div class="user-card">
|
||||
{% if item.vip == 1 %}
|
||||
<span class="layui-badge layui-bg-orange vip">VIP</span>
|
||||
{% endif %}
|
||||
<div class="avatar">
|
||||
<a href="{{ user_url }}" title="{{ item.about }}">
|
||||
<img src="{{ item.avatar }}" alt="{{ item.name }}">
|
||||
</a>
|
||||
</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>
|
||||
{{ partial('partials/pager') }}
|
||||
{% endfor %}
|
||||
</div>
|
||||
|
||||
{% endblock %}
|
||||
|
||||
</div>
|
||||
{{ 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>
|
||||
<tr>
|
||||
<th>名称</th>
|
||||
<th>群主</th>
|
||||
<th>成员</th>
|
||||
<th>讨论</th>
|
||||
<th>操作</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{% for item in pager.items %}
|
||||
{% set owner_url = url({'for':'web.user.show','id':item.owner.id}) %}
|
||||
{% set edit_url = url({'for':'web.im_group.edit','id':item.id}) %}
|
||||
{% set users_url = url({'for':'web.im_group.users','id':item.id}) %}
|
||||
{% set edit_url = url({'for':'web.igm.edit','id':item.id}) %}
|
||||
{% set users_url = url({'for':'web.igm.users','id':item.id}) %}
|
||||
<tr>
|
||||
<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.msg_count }}</span></td>
|
||||
<td>
|
||||
<button class="layui-btn layui-btn-xs layui-bg-blue btn-group-user" data-url="{{ users_url }}">成员</button>
|
||||
<button class="layui-btn layui-btn-xs btn-edit-group" data-url="{{ edit_url }}">编辑</button>
|
||||
<span class="layui-btn layui-btn-xs layui-bg-blue btn-group-user" data-url="{{ users_url }}">成员</span>
|
||||
<span class="layui-btn layui-btn-xs btn-edit-group" data-url="{{ edit_url }}">编辑</span>
|
||||
</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
|
@ -84,6 +84,13 @@ class ImGroup extends Model
|
||||
*/
|
||||
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\Models\ImGroup as ImGroupModel;
|
||||
use App\Models\ImGroupMessage as ImGroupMessageModel;
|
||||
use App\Models\ImGroupUser as ImGroupUserModel;
|
||||
use App\Models\ImUser as ImUserModel;
|
||||
use Phalcon\Mvc\Model;
|
||||
@ -103,13 +104,21 @@ class ImGroup extends Repository
|
||||
|
||||
public function countGroups()
|
||||
{
|
||||
return (int)ImGroupModel::count(['conditions' => 'deleted = 0']);
|
||||
return (int)ImGroupModel::count(['conditions' => 'published = 1']);
|
||||
}
|
||||
|
||||
public function countUsers($groupId)
|
||||
{
|
||||
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],
|
||||
]);
|
||||
}
|
||||
|
@ -111,7 +111,7 @@ class ImUser extends Repository
|
||||
->addFrom(ImGroupModel::class, 'g')
|
||||
->join(ImGroupUserModel::class, 'g.id = gu.group_id', 'gu')
|
||||
->where('gu.user_id = :user_id:', ['user_id' => $userId])
|
||||
->andWhere('g.published = 0')
|
||||
->andWhere('g.published = 1')
|
||||
->getQuery()->execute();
|
||||
}
|
||||
|
||||
|
@ -78,6 +78,7 @@ class GroupList extends FrontendService
|
||||
'avatar' => $group['avatar'],
|
||||
'about' => $group['about'],
|
||||
'user_count' => $group['user_count'],
|
||||
'msg_count' => $group['msg_count'],
|
||||
'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 $ = layui.jquery;
|
||||
var element = layui.element;
|
||||
var layer = layui.layer;
|
||||
|
||||
var helper = {};
|
||||
@ -13,7 +12,6 @@ layui.define(['jquery', 'element', 'layer'], function (exports) {
|
||||
$target.html(html);
|
||||
$.get(url, function (html) {
|
||||
$target.html(html);
|
||||
element.init();
|
||||
});
|
||||
};
|
||||
|
||||
|
@ -1269,10 +1269,6 @@ body {
|
||||
color: #666;
|
||||
}
|
||||
|
||||
.user-list {
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
|
||||
.user-card {
|
||||
float: left;
|
||||
width: 100%;
|
||||
@ -1305,9 +1301,21 @@ body {
|
||||
margin-bottom: 15px;
|
||||
}
|
||||
|
||||
.user-card .owner {
|
||||
margin-bottom: 15px;
|
||||
color: #666;
|
||||
}
|
||||
|
||||
.user-card .title {
|
||||
color: #666;
|
||||
font-size: 12px;
|
||||
}
|
||||
|
||||
.user-card .meta {
|
||||
color: #666;
|
||||
}
|
||||
|
||||
.user-card .meta span {
|
||||
margin-right: 5px;
|
||||
}
|
||||
|
||||
.user-card .action button {
|
||||
@ -1332,6 +1340,30 @@ body {
|
||||
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 {
|
||||
float: left;
|
||||
width: 220px;
|
||||
@ -1386,7 +1418,7 @@ body {
|
||||
}
|
||||
|
||||
.wrap .layui-table {
|
||||
margin-top: 0;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
.layui-table p {
|
||||
@ -1639,12 +1671,14 @@ body {
|
||||
position: absolute;
|
||||
top: 10px;
|
||||
right: 10px;
|
||||
font-size: 12px;
|
||||
}
|
||||
|
||||
.layim-chat-list li .msg-count {
|
||||
position: absolute;
|
||||
top: 5px;
|
||||
right: 30px;
|
||||
font-size: 12px;
|
||||
}
|
||||
|
||||
.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