1
0
mirror of https://gitee.com/koogua/course-tencent-cloud.git synced 2025-06-28 05:11:39 +08:00

群组设计

This commit is contained in:
xiaochong0302 2020-08-01 19:41:35 +08:00
parent c982856564
commit 1851fb9b25
29 changed files with 440 additions and 175 deletions

View File

@ -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);

View 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;
}
}

View File

@ -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);
}
}

View 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);
}
}

View File

@ -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;
/**

View File

@ -279,4 +279,10 @@ Trait ImFriendTrait
}
}
protected function incrFriendUserMsgCount(ImFriendUserModel $friendUser)
{
$friendUser->msg_count += 1;
$friendUser->update();
}
}

View File

@ -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'],
];
}

View File

@ -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();
}
}

View File

@ -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>

View File

@ -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>

View File

@ -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>

View 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 %}

View File

@ -15,6 +15,6 @@
{% block include_js %}
{{ js_include('web/js/group.list.js') }}
{{ js_include('web/js/im_group.list.js') }}
{% endblock %}

View File

@ -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>

View File

@ -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 %}

View File

@ -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>

View File

@ -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>

View File

@ -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') }}

View 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 %}

View File

@ -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 %}

View File

@ -84,6 +84,13 @@ class ImGroup extends Model
*/
public $user_count;
/**
* 消息数
*
* @var int
*/
public $msg_count;
/**
* 创建时间
*

View File

@ -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],
]);
}

View File

@ -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();
}

View File

@ -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'],
];
}

View File

@ -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();
});
};

View File

@ -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 {

View 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'));
});