From 4676a18a64e0fe9ac8d19366fd90a464ed62f21b Mon Sep 17 00:00:00 2001 From: xiaochong0302 Date: Sat, 27 Jun 2020 18:32:39 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E6=88=90=E6=B6=88=E6=81=AF=E7=9B=92?= =?UTF-8?q?=E5=AD=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Builders/FriendUserList.php | 41 +++++++++++++ app/Http/Web/Controllers/UserController.php | 3 +- app/Http/Web/Services/Messenger.php | 18 +++--- app/Http/Web/Views/messenger/find.volt | 39 ++++++------ app/Http/Web/Views/messenger/find_users.volt | 4 +- app/Http/Web/Views/teacher/list.volt | 4 +- app/Http/Web/Views/user/friends.volt | 20 ++++++ app/Repos/ImFriendUser.php | 41 +++++++++++++ app/Services/Frontend/Teacher/TeacherList.php | 3 - app/Services/Frontend/User/FriendList.php | 61 +++++++++++++++++++ app/Validators/ImMessage.php | 31 ++++++---- public/static/web/css/common.css | 13 ++-- public/static/web/js/im.msgbox.js | 1 - 13 files changed, 225 insertions(+), 54 deletions(-) create mode 100644 app/Builders/FriendUserList.php create mode 100644 app/Http/Web/Views/user/friends.volt create mode 100644 app/Services/Frontend/User/FriendList.php diff --git a/app/Builders/FriendUserList.php b/app/Builders/FriendUserList.php new file mode 100644 index 00000000..962e3291 --- /dev/null +++ b/app/Builders/FriendUserList.php @@ -0,0 +1,41 @@ +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; + } + +} diff --git a/app/Http/Web/Controllers/UserController.php b/app/Http/Web/Controllers/UserController.php index d35a4155..de780983 100644 --- a/app/Http/Web/Controllers/UserController.php +++ b/app/Http/Web/Controllers/UserController.php @@ -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); diff --git a/app/Http/Web/Services/Messenger.php b/app/Http/Web/Services/Messenger.php index 26d080c6..24b13bbd 100644 --- a/app/Http/Web/Services/Messenger.php +++ b/app/Http/Web/Services/Messenger.php @@ -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, ], ]); diff --git a/app/Http/Web/Views/messenger/find.volt b/app/Http/Web/Views/messenger/find.volt index 75fe9de4..f5d02c02 100644 --- a/app/Http/Web/Views/messenger/find.volt +++ b/app/Http/Web/Views/messenger/find.volt @@ -2,25 +2,26 @@ {% block content %} - - -
-
-
    -
  • 成员
  • -
  • 群组
  • -
-
-
- {{ partial('messenger/find_users',{'pager':users_pager}) }} -
-
- {{ partial('messenger/find_groups',{'pager':groups_pager}) }} +
+ +
+
+
    +
  • 成员
  • +
  • 群组
  • +
+
+
+ {{ partial('messenger/find_users',{'pager':users_pager}) }} +
+
+ {{ partial('messenger/find_groups',{'pager':groups_pager}) }} +
diff --git a/app/Http/Web/Views/messenger/find_users.volt b/app/Http/Web/Views/messenger/find_users.volt index 66407483..5fa9e853 100644 --- a/app/Http/Web/Views/messenger/find_users.volt +++ b/app/Http/Web/Views/messenger/find_users.volt @@ -3,9 +3,9 @@
{% for item in pager.items %}
-
+
- {{ item.name }} + {{ item.name }}
{{ item.name }}
diff --git a/app/Http/Web/Views/teacher/list.volt b/app/Http/Web/Views/teacher/list.volt index afcefebe..01a9334a 100644 --- a/app/Http/Web/Views/teacher/list.volt +++ b/app/Http/Web/Views/teacher/list.volt @@ -15,9 +15,9 @@ {% set user_about = item.about ? item.about|e : '这个人很懒,什么都没留下' %} {% set user_url = url({'for':'web.teacher.show','id':item.id}) %}
-
+
- {{ item.name }} + {{ item.name }}
{{ item.name }} diff --git a/app/Http/Web/Views/user/friends.volt b/app/Http/Web/Views/user/friends.volt new file mode 100644 index 00000000..c159accb --- /dev/null +++ b/app/Http/Web/Views/user/friends.volt @@ -0,0 +1,20 @@ +{% if pager.total_pages > 0 %} +
+
+ {% for item in pager.items %} +
+
+
+ {{ item.name }} +
+
{{ item.name }}
+ +
+
+ {% endfor %} +
+
+ {{ partial('partials/pager_ajax') }} +{% endif %} \ No newline at end of file diff --git a/app/Repos/ImFriendUser.php b/app/Repos/ImFriendUser.php index 034c2229..355b1e44 100644 --- a/app/Repos/ImFriendUser.php +++ b/app/Repos/ImFriendUser.php @@ -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 diff --git a/app/Services/Frontend/Teacher/TeacherList.php b/app/Services/Frontend/Teacher/TeacherList.php index 9213a0bc..b300a1a8 100644 --- a/app/Services/Frontend/Teacher/TeacherList.php +++ b/app/Services/Frontend/Teacher/TeacherList.php @@ -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'], ]; } diff --git a/app/Services/Frontend/User/FriendList.php b/app/Services/Frontend/User/FriendList.php new file mode 100644 index 00000000..f3913434 --- /dev/null +++ b/app/Services/Frontend/User/FriendList.php @@ -0,0 +1,61 @@ +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; + } + +} diff --git a/app/Validators/ImMessage.php b/app/Validators/ImMessage.php index 0326c045..10719711 100644 --- a/app/Validators/ImMessage.php +++ b/app/Validators/ImMessage.php @@ -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); + } + } + } diff --git a/public/static/web/css/common.css b/public/static/web/css/common.css index ae6fc66b..4a0b2e4a 100644 --- a/public/static/web/css/common.css +++ b/public/static/web/css/common.css @@ -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; } diff --git a/public/static/web/js/im.msgbox.js b/public/static/web/js/im.msgbox.js index 272fe28b..d3789048 100644 --- a/public/static/web/js/im.msgbox.js +++ b/public/static/web/js/im.msgbox.js @@ -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('已同意'); } });