mirror of
https://gitee.com/koogua/course-tencent-cloud.git
synced 2025-06-29 05:41:37 +08:00
完成消息盒子
This commit is contained in:
parent
986b60a50b
commit
4676a18a64
41
app/Builders/FriendUserList.php
Normal file
41
app/Builders/FriendUserList.php
Normal 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;
|
||||
}
|
||||
|
||||
}
|
@ -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);
|
||||
|
@ -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,
|
||||
],
|
||||
]);
|
||||
|
||||
|
@ -2,25 +2,26 @@
|
||||
|
||||
{% block content %}
|
||||
|
||||
<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="layui-tab layui-tab-brief user-tab">
|
||||
<ul class="layui-tab-title">
|
||||
<li class="layui-this">成员</li>
|
||||
<li>群组</li>
|
||||
</ul>
|
||||
<div class="layui-tab-content">
|
||||
<div class="layui-tab-item layui-show" id="tab-users">
|
||||
{{ partial('messenger/find_users',{'pager':users_pager}) }}
|
||||
</div>
|
||||
<div class="layui-tab-item" id="tab-groups">
|
||||
{{ partial('messenger/find_groups',{'pager':groups_pager}) }}
|
||||
<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="find-tab">
|
||||
<div class="layui-tab layui-tab-brief user-tab">
|
||||
<ul class="layui-tab-title">
|
||||
<li class="layui-this">成员</li>
|
||||
<li>群组</li>
|
||||
</ul>
|
||||
<div class="layui-tab-content">
|
||||
<div class="layui-tab-item layui-show" id="tab-users">
|
||||
{{ partial('messenger/find_users',{'pager':users_pager}) }}
|
||||
</div>
|
||||
<div class="layui-tab-item" id="tab-groups">
|
||||
{{ partial('messenger/find_groups',{'pager':groups_pager}) }}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -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">
|
||||
|
@ -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>
|
||||
|
20
app/Http/Web/Views/user/friends.volt
Normal file
20
app/Http/Web/Views/user/friends.volt
Normal 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 %}
|
@ -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
|
||||
|
@ -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'],
|
||||
];
|
||||
}
|
||||
|
||||
|
61
app/Services/Frontend/User/FriendList.php
Normal file
61
app/Services/Frontend/User/FriendList.php
Normal 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;
|
||||
}
|
||||
|
||||
}
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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('已同意');
|
||||
}
|
||||
});
|
||||
|
Loading…
x
Reference in New Issue
Block a user