1
0
mirror of https://gitee.com/koogua/course-tencent-cloud.git synced 2025-06-29 05:41:37 +08:00

完成消息盒子

This commit is contained in:
xiaochong0302 2020-06-27 18:32:39 +08:00
parent 986b60a50b
commit 4676a18a64
13 changed files with 225 additions and 54 deletions

View File

@ -0,0 +1,41 @@
<?php
namespace App\Builders;
use App\Repos\User as UserRepo;
class FriendUserList extends Builder
{
public function handleFriends(array $relations)
{
$users = $this->getFriends($relations);
foreach ($relations as $key => $value) {
$relations[$key]['friend'] = $users[$value['friend_id']] ?? new \stdClass();
}
return $relations;
}
public function getFriends(array $relations)
{
$ids = kg_array_column($relations, 'friend_id');
$userRepo = new UserRepo();
$users = $userRepo->findByIds($ids, ['id', 'name', 'avatar', 'about', 'vip']);
$baseUrl = kg_ci_base_url();
$result = [];
foreach ($users->toArray() as $user) {
$user['avatar'] = $baseUrl . $user['avatar'];
$result[$user['id']] = $user;
}
return $result;
}
}

View File

@ -4,6 +4,7 @@ namespace App\Http\Web\Controllers;
use App\Services\Frontend\User\CourseList as UserCourseListService;
use App\Services\Frontend\User\FavoriteList as UserFavoriteListService;
use App\Services\Frontend\User\FriendList as UserFriendListService;
use App\Services\Frontend\User\UserInfo as UserInfoService;
use Phalcon\Mvc\View;
@ -66,7 +67,7 @@ class UserController extends Controller
{
$target = $this->request->get('target', 'trim', 'tab-friends');
$service = new UserFavoriteListService();
$service = new UserFriendListService();
$pager = $service->handle($id);
$pager->items = kg_array_object($pager->items);

View File

@ -254,6 +254,7 @@ class Messenger extends Service
$validator = new ImMessageValidator();
$validator->checkReceiver($to['id'], $to['type']);
$validator->checkIfBlocked($user->id, $to['id'], $to['type']);
$from['content'] = $validator->checkContent($from['content']);
@ -269,7 +270,7 @@ class Messenger extends Service
];
if ($to['type'] == 'group') {
$content['id'] = $to['id'];
$message['id'] = $to['id'];
}
$content = json_encode([
@ -404,9 +405,8 @@ class Messenger extends Service
$friendUser = $friendUserRepo->findFriendUser($user->id, $sender->id);
$friendUserModel = new ImFriendUserModel();
if (!$friendUser) {
$friendUserModel = new ImFriendUserModel();
$friendUserModel->create([
'user_id' => $user->id,
'friend_id' => $sender->id,
@ -419,9 +419,10 @@ class Messenger extends Service
$groupId = $message->item_info['group']['id'] ?: 0;
if (!$friendUser) {
$friendUserModel = new ImFriendUserModel();
$friendUserModel->create([
'user_id' => $user->id,
'friend_id' => $sender->id,
'user_id' => $sender->id,
'friend_id' => $user->id,
'group_id' => $groupId,
]);
}
@ -813,7 +814,7 @@ class Messenger extends Service
}
}
protected function handleAcceptFriendNotice(UserModel $sender, UserModel $receiver, ImSystemMessageModel $message)
protected function handleAcceptFriendNotice(UserModel $sender, UserModel $receiver, ImSystemMessageModel $applyMessage)
{
$sysMsgModel = new ImSystemMessageModel();
@ -837,8 +838,10 @@ class Messenger extends Service
if ($online) {
/**
* @var array $itemInfo
* 上层操作更新了item_info类型发生了变化故重新获取
*/
$messageRepo = new ImSystemMessageRepo();
$message = $messageRepo->findById($applyMessage->id);
$itemInfo = $message->item_info;
$content = kg_json_encode([
@ -962,6 +965,7 @@ class Messenger extends Service
'group' => [
'id' => $group->id,
'name' => $group->name,
'avatar' => $group->avatar,
],
]);

View File

@ -2,14 +2,14 @@
{% block content %}
<div class="im-search-container">
<div class="im-search">
<form class="layui-form" method="get" action="{{ url({'for':'web.im.search'}) }}">
<input class="layui-input" type="text" name="query" placeholder="请输入关键字...">
<button class="layui-hide" type="submit" lay-submit="true" lay-filter="im_search">搜索</button>
</form>
</div>
<div class="tab-container">
<div class="find-tab">
<div class="layui-tab layui-tab-brief user-tab">
<ul class="layui-tab-title">
<li class="layui-this">成员</li>
@ -25,6 +25,7 @@
</div>
</div>
</div>
</div>
{% endblock %}

View File

@ -3,9 +3,9 @@
<div class="layui-row layui-col-space20">
{% for item in pager.items %}
<div class="layui-col-md2">
<div class="user-card" title="{{ item.about|e }}">
<div class="user-card">
<div class="avatar">
<a href="javascript:"><img src="{{ item.avatar }}" alt="{{ item.name }}"></a>
<a href="javascript:" title="{{ item.about|e }}"><img src="{{ item.avatar }}" alt="{{ item.name }}"></a>
</div>
<div class="name layui-elip" title="{{ item.name|e }}">{{ item.name }}</div>
<div class="action">

View File

@ -15,9 +15,9 @@
{% set user_about = item.about ? item.about|e : '这个人很懒,什么都没留下' %}
{% set user_url = url({'for':'web.teacher.show','id':item.id}) %}
<div class="layui-col-md3">
<div class="user-card" title="{{ user_about }}">
<div class="user-card">
<div class="avatar">
<a href="{{ user_url }}"><img src="{{ item.avatar }}" alt="{{ item.name }}"></a>
<a href="{{ user_url }}" title="{{ user_about }}"><img src="{{ item.avatar }}" alt="{{ item.name }}"></a>
</div>
<div class="name layui-elip">
<a href="{{ user_url }}">{{ item.name }}</a>

View File

@ -0,0 +1,20 @@
{% if pager.total_pages > 0 %}
<div class="teach-user-list clearfix">
<div class="layui-row layui-col-space20">
{% for item in pager.items %}
<div class="layui-col-md2">
<div class="user-card">
<div class="avatar">
<a href="javascript:" title="{{ item.about|e }}"><img src="{{ item.avatar }}" alt="{{ item.name }}"></a>
</div>
<div class="name layui-elip" title="{{ item.name|e }}">{{ item.name }}</div>
<div class="action">
<a href="javascript:" class="layui-badge-rim apply-friend" data-id="{{ item.id }}" data-name="{{ item.name }}" data-avatar="{{ item.avatar }}">加为好友</a>
</div>
</div>
</div>
{% endfor %}
</div>
</div>
{{ partial('partials/pager_ajax') }}
{% endif %}

View File

@ -2,12 +2,53 @@
namespace App\Repos;
use App\Library\Paginator\Adapter\QueryBuilder as PagerQueryBuilder;
use App\Models\ImFriendUser as ImFriendUserModel;
use Phalcon\Mvc\Model;
class ImFriendUser extends Repository
{
public function paginate($where = [], $sort = 'latest', $page = 1, $limit = 15)
{
$builder = $this->modelsManager->createBuilder();
$builder->from(ImFriendUserModel::class);
$builder->where('1 = 1');
if (!empty($where['user_id'])) {
$builder->andWhere('user_id = :user_id:', ['user_id' => $where['user_id']]);
}
if (!empty($where['friend_id'])) {
$builder->andWhere('friend_id = :friend_id:', ['friend_id' => $where['friend_id']]);
}
if (isset($where['blocked'])) {
$builder->andWhere('blocked = :blocked:', ['blocked' => $where['blocked']]);
}
switch ($sort) {
case 'oldest':
$orderBy = 'id ASC';
break;
default:
$orderBy = 'id DESC';
break;
}
$builder->orderBy($orderBy);
$pager = new PagerQueryBuilder([
'builder' => $builder,
'page' => $page,
'limit' => $limit,
]);
return $pager->paginate();
}
/**
* @param int $userId
* @param int $friendId

View File

@ -52,9 +52,6 @@ class TeacherList extends FrontendService
'avatar' => $user['avatar'],
'title' => $user['title'],
'about' => $user['about'],
'location' => $user['location'],
'create_time' => $user['create_time'],
'last_login_time' => $user['last_login_time'],
];
}

View File

@ -0,0 +1,61 @@
<?php
namespace App\Services\Frontend\User;
use App\Builders\FriendUserList as FriendUserListBuilder;
use App\Library\Paginator\Query as PagerQuery;
use App\Repos\ImFriendUser as ImFriendUserRepo;
use App\Services\Frontend\Service as FrontendService;
use App\Services\Frontend\UserTrait;
class FriendList extends FrontendService
{
use UserTrait;
public function handle($id)
{
$user = $this->checkUserCache($id);
$pagerQuery = new PagerQuery();
$params = $pagerQuery->getParams();
$params['user_id'] = $user->id;
$sort = $pagerQuery->getSort();
$page = $pagerQuery->getPage();
$limit = $pagerQuery->getLimit();
$repo = new ImFriendUserRepo();
$pager = $repo->paginate($params, $sort, $page, $limit);
return $this->handleFriends($pager);
}
protected function handleFriends($pager)
{
if ($pager->total_items == 0) {
return $pager;
}
$builder = new FriendUserListBuilder();
$relations = $pager->items->toArray();
$friends = $builder->getFriends($relations);
$items = [];
foreach ($relations as $relation) {
$friend = $friends[$relation['friend_id']] ?? new \stdClass();
$items[] = $friend;
}
$pager->items = $items;
return $pager;
}
}

View File

@ -2,12 +2,14 @@
namespace App\Validators;
use App\Caches\ImChatGroup as ImChatGroupCache;
use App\Caches\User as UserCache;
use App\Exceptions\BadRequest as BadRequestException;
use App\Repos\ImFriendMessage as ImFriendMessageRepo;
use App\Repos\ImGroupMessage as ImGroupMessageRepo;
use App\Repos\ImSystemMessage as ImSystemMessageRepo;
use App\Validators\ImChatGroup as ImChatGroupValidator;
use App\Validators\ImChatGroupUser as ImChatGroupUserValidator;
use App\Validators\ImFriendUser as ImFriendUserValidator;
use App\Validators\User as UserValidator;
class ImMessage extends Validator
{
@ -43,17 +45,11 @@ class ImMessage extends Validator
$receiver = null;
if ($type == 'friend') {
$cache = new UserCache();
$receiver = $cache->get($id);
if (!$receiver) {
throw new BadRequestException('user.not_found');
}
$validator = new UserValidator();
$receiver = $validator->checkUserCache($id);
} elseif ($type == 'group') {
$cache = new ImChatGroupCache();
$receiver = $cache->get($id);
if (!$receiver) {
throw new BadRequestException('im_chat_group.not_found');
}
$validator = new ImChatGroupValidator();
$receiver = $validator->checkGroupCache($id);
}
return $receiver;
@ -85,4 +81,15 @@ class ImMessage extends Validator
return $value;
}
public function checkIfBlocked($userId, $targetId, $targetType)
{
if ($targetType == 'friend') {
$validator = new ImFriendUserValidator();
$validator->checkIfBlocked($userId, $targetId);
} elseif ($targetType == 'group') {
$validator = new ImChatGroupUserValidator();
$validator->checkIfBlocked($userId, $targetId);
}
}
}

View File

@ -24,11 +24,6 @@
background-color: #f2f2f2;
}
.layer {
padding: 20px;
background-color: #f2f2f2;
}
.clearfix {
zoom: 1
}
@ -66,7 +61,6 @@
}
.pager {
margin-top: 25px;
text-align: center;
}
@ -1121,7 +1115,7 @@
}
.user-tab .layui-tab-content {
padding: 25px 0;
padding: 20px 0 0 0;
}
.user-tab .loading {
@ -1287,6 +1281,11 @@
margin-right: 8px;
}
.im-search-container {
padding: 20px;
background-color: #f2f2f2;
}
.im-search {
margin-bottom: 10px;
}

View File

@ -101,7 +101,6 @@ layui.use(['jquery', 'layer', 'layim', 'laypage'], function () {
url: '/im/group/accept',
data: {message_id: li.data('id')},
success: function () {
layer.close(index);
othis.parent().html('已同意');
}
});