diff --git a/app/Http/Web/Controllers/MessengerController.php b/app/Http/Web/Controllers/MessengerController.php index a5883dcb..7faf1bf7 100644 --- a/app/Http/Web/Controllers/MessengerController.php +++ b/app/Http/Web/Controllers/MessengerController.php @@ -5,13 +5,232 @@ namespace App\Http\Web\Controllers; /** * @RoutePrefix("/im") */ -class MessengerController extends Controller +class MessengerController extends \Phalcon\Mvc\Controller { /** - * @Get("/init", name="web.index") + * @Get("/init", name="im.init") */ public function initAction() + { + $data = [ + 'mine' => [ + 'id' => '100000', //我的ID + 'username' => '纸飞机', //我的昵称 + 'sign' => '在深邃的编码世界,做一枚轻盈的纸飞机', //我的签名 + 'avatar' => '//wx2.sinaimg.cn/mw690/5db11ff4gy1flxmew7edlj203d03wt8n.jpg', //我的头像 + 'status' => 'online', //在线状态 online:在线、hide:隐身 + ], + 'friend' => [ + [ + 'id' => '1000', + 'groupname' => '前端码农', + 'online' => 3, + 'list' => [ + [ + 'id' => '1000', + 'username' => '闲心', + 'sign' => '我是如此的不寒而栗', + 'avatar' => '//wx2.sinaimg.cn/mw690/5db11ff4gy1flxmew7edlj203d03wt8n.jpg', //我的头像 + 'status' => 'online', + ], + [ + 'id' => '1001', + 'username' => '妹儿美', + 'sign' => '我是如此的不寒而栗', + 'avatar' => '//wx2.sinaimg.cn/mw690/5db11ff4gy1flxmew7edlj203d03wt8n.jpg', //我的头像 + 'status' => 'online', + ] + ], + ], + [ + 'id' => '1001', + 'groupname' => '后端码农', + 'online' => 2, + 'list' => [ + [ + 'id' => '1003', + 'username' => '合肥马哥', + 'sign' => '我是如此的不寒而栗', + 'avatar' => '//wx2.sinaimg.cn/mw690/5db11ff4gy1flxmew7edlj203d03wt8n.jpg', + 'status' => 'online', + ], + [ + 'id' => '1004', + 'username' => '合肥牛哥', + 'sign' => '我是如此的不寒而栗', + 'avatar' => '//wx2.sinaimg.cn/mw690/5db11ff4gy1flxmew7edlj203d03wt8n.jpg', + 'status' => 'online', + ] + ], + ], + [ + 'id' => '1002', + 'groupname' => '全栈码农', + 'online' => 1, + 'list' => [ + [ + 'id' => '1005', + 'username' => '南拳', + 'sign' => '我是如此的不寒而栗', + 'avatar' => '//wx2.sinaimg.cn/mw690/5db11ff4gy1flxmew7edlj203d03wt8n.jpg', + 'status' => 'online', + ], + [ + 'id' => '1006', + 'username' => '北腿', + 'sign' => '我是如此的不寒而栗', + 'avatar' => '//wx2.sinaimg.cn/mw690/5db11ff4gy1flxmew7edlj203d03wt8n.jpg', + 'status' => 'online', + ] + ], + ], + ], + 'group' => [ + [ + 'id' => '1001', + 'groupname' => '前端码农', + 'avatar' => '//wx2.sinaimg.cn/mw690/5db11ff4gy1flxmew7edlj203d03wt8n.jpg', + ], + [ + 'id' => '1002', + 'groupname' => '后端码农', + 'avatar' => '//wx2.sinaimg.cn/mw690/5db11ff4gy1flxmew7edlj203d03wt8n.jpg', + ], + [ + 'id' => '1003', + 'groupname' => '全栈码农', + 'avatar' => '//wx2.sinaimg.cn/mw690/5db11ff4gy1flxmew7edlj203d03wt8n.jpg', + ], + ], + ]; + + return $this->jsonSuccess(['data' => $data]); + } + + /** + * @Get("/group/members", name="im.group_members") + */ + public function groupMembersAction() + { + $data = [ + 'list' => [ + [ + 'id' => '1000', + 'username' => '闲心', + 'sign' => '我是如此的不寒而栗', + 'status' => 'online', + ], + [ + 'id' => '1001', + 'username' => '妹儿美', + 'sign' => '我是如此的不寒而栗', + 'status' => 'online', + ] + ] + ]; + + return $this->jsonSuccess(['data' => $data]); + } + + /** + * @Get("/msg/box", name="im.msg_box") + */ + public function messageBoxAction() + { + + } + + /** + * @Get("/chat/log", name="im.chat_log") + */ + public function chatLogAction() + { + + } + + /** + * @Get("/find", name="im.find") + */ + public function findAction() + { + + } + + /** + * @Post("/user/bind", name="im.bind_user") + */ + public function bindUserAction() + { + + } + + /** + * @Post("/msg/send", name="im.send_msg") + */ + public function sendMessageAction() + { + + } + + /** + * @Post("/img/upload", name="im.upload_img") + */ + public function uploadImageAction() + { + } + + /** + * @Post("/file/upload", name="im.upload_file") + */ + public function uploadFileAction() + { + + } + + /** + * @Post("/stats/update", name="im.update_stats") + */ + public function updateStatsAction() + { + + } + + /** + * @Post("/sign/update", name="im.update_sign") + */ + public function updateSignAction() + { + + } + + /** + * @Post("/friend/apply", name="im.apply_friend") + */ + public function applyFriendAction() + { + } + + /** + * @Post("/group/apply", name="im.apply_group") + */ + public function applyGroupAction() + { + + } + + /** + * @Post("/friend/approve", name="im.approve_friend") + */ + public function approveFriendAction() + { + + } + + /** + * @Post("/group/approve", name="im.approve_group") + */ + public function approveGroupAction() { } diff --git a/app/Http/Web/Views/templates/full.volt b/app/Http/Web/Views/templates/full.volt index 35b3eaf5..4d87664e 100644 --- a/app/Http/Web/Views/templates/full.volt +++ b/app/Http/Web/Views/templates/full.volt @@ -31,6 +31,10 @@ {{ js_include('web/js/common.js') }} {{ js_include('web/js/fixbar.js') }} +{% if auth_user.id > 0 %} + {{ js_include('web/js/im.js') }} +{% endif %} + {% block include_js %}{% endblock %} {% block inline_js %}{% endblock %} diff --git a/app/Models/ImChatGroup.php b/app/Models/ImChatGroup.php new file mode 100644 index 00000000..826d727e --- /dev/null +++ b/app/Models/ImChatGroup.php @@ -0,0 +1,101 @@ +addBehavior( + new SoftDelete([ + 'field' => 'deleted', + 'value' => 1, + ]) + ); + } + + public function beforeCreate() + { + $this->create_time = time(); + } + + public function beforeUpdate() + { + $this->update_time = time(); + } + +} + diff --git a/app/Models/ImChatGroupUser.php b/app/Models/ImChatGroupUser.php new file mode 100644 index 00000000..b3e1ab94 --- /dev/null +++ b/app/Models/ImChatGroupUser.php @@ -0,0 +1,73 @@ +create_time = time(); + } + + public function beforeUpdate() + { + $this->update_time = time(); + } + +} + diff --git a/app/Models/ImFriend.php b/app/Models/ImFriend.php new file mode 100644 index 00000000..c38b0f3e --- /dev/null +++ b/app/Models/ImFriend.php @@ -0,0 +1,65 @@ +create_time = time(); + } + + public function beforeUpdate() + { + $this->update_time = time(); + } + +} diff --git a/app/Models/ImFriendGroup.php b/app/Models/ImFriendGroup.php new file mode 100644 index 00000000..9878dbce --- /dev/null +++ b/app/Models/ImFriendGroup.php @@ -0,0 +1,87 @@ +addBehavior( + new SoftDelete([ + 'field' => 'deleted', + 'value' => 1, + ]) + ); + } + + public function beforeCreate() + { + $this->create_time = time(); + } + + public function beforeUpdate() + { + $this->update_time = time(); + } + +} + diff --git a/app/Models/ImFriendGroupUser.php b/app/Models/ImFriendGroupUser.php new file mode 100644 index 00000000..53dafec1 --- /dev/null +++ b/app/Models/ImFriendGroupUser.php @@ -0,0 +1,66 @@ +create_time = time(); + } + + public function beforeUpdate() + { + $this->update_time = time(); + } + +} + diff --git a/app/Models/ImMessage.php b/app/Models/ImMessage.php new file mode 100644 index 00000000..7f991b28 --- /dev/null +++ b/app/Models/ImMessage.php @@ -0,0 +1,96 @@ +addBehavior( + new SoftDelete([ + 'field' => 'deleted', + 'value' => 1, + ]) + ); + } + + public function beforeCreate() + { + $this->create_time = time(); + } + + public function beforeUpdate() + { + $this->update_time = time(); + } + +} diff --git a/app/Models/ImMessageContent.php b/app/Models/ImMessageContent.php new file mode 100644 index 00000000..ad2246d5 --- /dev/null +++ b/app/Models/ImMessageContent.php @@ -0,0 +1,27 @@ +modelsManager->createBuilder(); + + $builder->from(ImChatModel::class); + + $builder->where('1 = 1'); + + if (!empty($where['sender_id'])) { + $builder->andWhere('sender_id = :sender_id:', ['sender_id' => $where['sender_id']]); + } + + if (!empty($where['receiver_id'])) { + $builder->andWhere('receiver_id = :receiver_id:', ['receiver_id' => $where['receiver_id']]); + } + + if (!empty($where['type'])) { + $builder->andWhere('type = :type:', ['type' => $where['type']]); + } + + if (isset($where['deleted'])) { + $builder->andWhere('deleted = :deleted:', ['deleted' => $where['deleted']]); + } + + switch ($sort) { + default: + $orderBy = 'id DESC'; + break; + } + + $builder->orderBy($orderBy); + + $pager = new PagerQueryBuilder([ + 'builder' => $builder, + 'page' => $page, + 'limit' => $limit, + ]); + + return $pager->paginate(); + } + + /** + * @param int $id + * @return ImChatModel|Model|bool + */ + public function findById($id) + { + return ImChatModel::findFirst($id); + } + + /** + * @param array $ids + * @param string|array $columns + * @return ResultsetInterface|Resultset|ImChatModel[] + */ + public function findByIds($ids, $columns = '*') + { + return ImChatModel::query() + ->columns($columns) + ->inWhere('id', $ids) + ->execute(); + } + +} diff --git a/app/Repos/ImGroup.php b/app/Repos/ImGroup.php new file mode 100644 index 00000000..27a98105 --- /dev/null +++ b/app/Repos/ImGroup.php @@ -0,0 +1,90 @@ +modelsManager->createBuilder(); + + $builder->from(ImGroupModel::class); + + $builder->where('1 = 1'); + + if (!empty($where['course_id'])) { + $builder->andWhere('sender_id = :sender_id:', ['sender_id' => $where['sender_id']]); + } + + if (!empty($where['name'])) { + $builder->andWhere('name LIKE :name:', ['name' => "%{$where['name']}%"]); + } + + if (isset($where['deleted'])) { + $builder->andWhere('deleted = :deleted:', ['deleted' => $where['deleted']]); + } + + switch ($sort) { + default: + $orderBy = 'id DESC'; + break; + } + + $builder->orderBy($orderBy); + + $pager = new PagerQueryBuilder([ + 'builder' => $builder, + 'page' => $page, + 'limit' => $limit, + ]); + + return $pager->paginate(); + } + + /** + * @param int $id + * @return ImGroupModel|Model|bool + */ + public function findById($id) + { + return ImGroupModel::findFirst($id); + } + + /** + * @param array $ids + * @param string|array $columns + * @return ResultsetInterface|Resultset|ImGroupModel[] + */ + public function findByIds($ids, $columns = '*') + { + return ImGroupModel::query() + ->columns($columns) + ->inWhere('id', $ids) + ->execute(); + } + + /** + * @param int $groupId + * @return ResultsetInterface|Resultset|UserModel[] + */ + public function findGroupUsers($groupId) + { + return $this->modelsManager->createBuilder() + ->columns('u.*') + ->addFrom(UserModel::class, 'u') + ->join(ImGroupUserModel::class, 'u.id = gu.user_id', 'gu') + ->where('gu.group_id = :group_id:', ['group_id' => $groupId]) + ->andWhere('u.deleted = 0') + ->getQuery()->execute(); + } + +} diff --git a/app/Repos/User.php b/app/Repos/User.php index 0b80136c..9a9c0f7d 100644 --- a/app/Repos/User.php +++ b/app/Repos/User.php @@ -3,6 +3,8 @@ namespace App\Repos; use App\Library\Paginator\Adapter\QueryBuilder as PagerQueryBuilder; +use App\Models\ImChatGroup as ImGroupModel; +use App\Models\ImChatGroupUser as ImGroupUserModel; use App\Models\User as UserModel; use Phalcon\Mvc\Model; use Phalcon\Mvc\Model\Resultset; @@ -111,4 +113,20 @@ class User extends Repository ->execute(); } + public function findImFriends($userId) + { + + } + + public function findImGroups($userId) + { + return $this->modelsManager->createBuilder() + ->columns('g.*') + ->addFrom(ImGroupModel::class, 'g') + ->join(ImGroupUserModel::class, 'g.id = gu.user_id', 'gu') + ->where('gu.user_id = :user_id:', ['user_id' => $userId]) + ->andWhere('g.deleted = 0') + ->getQuery()->execute(); + } + } diff --git a/app/Services/Frontend/Messenger/ContactList.php b/app/Services/Frontend/Messenger/ContactList.php new file mode 100644 index 00000000..6dd03e9f --- /dev/null +++ b/app/Services/Frontend/Messenger/ContactList.php @@ -0,0 +1,19 @@ +