mirror of
https://gitee.com/koogua/course-tencent-cloud.git
synced 2025-06-25 12:09:09 +08:00
设计即时通信结构
This commit is contained in:
parent
1dce158ee6
commit
ceb3e1dcbb
@ -2,108 +2,25 @@
|
|||||||
|
|
||||||
namespace App\Http\Web\Controllers;
|
namespace App\Http\Web\Controllers;
|
||||||
|
|
||||||
|
use App\Http\Web\Services\Messenger as MessengerService;
|
||||||
|
use App\Traits\Response as ResponseTrait;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @RoutePrefix("/im")
|
* @RoutePrefix("/im")
|
||||||
*/
|
*/
|
||||||
class MessengerController extends \Phalcon\Mvc\Controller
|
class MessengerController extends \Phalcon\Mvc\Controller
|
||||||
{
|
{
|
||||||
|
|
||||||
|
use ResponseTrait;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @Get("/init", name="im.init")
|
* @Get("/init", name="im.init")
|
||||||
*/
|
*/
|
||||||
public function initAction()
|
public function initAction()
|
||||||
{
|
{
|
||||||
$data = [
|
$service = new MessengerService();
|
||||||
'mine' => [
|
|
||||||
'id' => '100000', //我的ID
|
$data = $service->init();
|
||||||
'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]);
|
return $this->jsonSuccess(['data' => $data]);
|
||||||
}
|
}
|
||||||
@ -162,7 +79,11 @@ class MessengerController extends \Phalcon\Mvc\Controller
|
|||||||
*/
|
*/
|
||||||
public function bindUserAction()
|
public function bindUserAction()
|
||||||
{
|
{
|
||||||
|
$service = new MessengerService();
|
||||||
|
|
||||||
|
$service->bindUser();
|
||||||
|
|
||||||
|
return $this->jsonSuccess();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -170,7 +91,11 @@ class MessengerController extends \Phalcon\Mvc\Controller
|
|||||||
*/
|
*/
|
||||||
public function sendMessageAction()
|
public function sendMessageAction()
|
||||||
{
|
{
|
||||||
|
$service = new MessengerService();
|
||||||
|
|
||||||
|
$service->sendMessage();
|
||||||
|
|
||||||
|
return $this->jsonSuccess();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -2,34 +2,63 @@
|
|||||||
|
|
||||||
namespace App\Http\Web\Services;
|
namespace App\Http\Web\Services;
|
||||||
|
|
||||||
use App\Services\Frontend\ChapterTrait;
|
use App\Repos\User as UserRepo;
|
||||||
|
use App\Services\Frontend\UserTrait;
|
||||||
use GatewayClient\Gateway;
|
use GatewayClient\Gateway;
|
||||||
|
|
||||||
class Messenger extends Service
|
class Messenger extends Service
|
||||||
{
|
{
|
||||||
|
|
||||||
use ChapterTrait;
|
use UserTrait;
|
||||||
|
|
||||||
public function bindUser($id)
|
public function init()
|
||||||
{
|
{
|
||||||
$user = $this->getCurrentUser();
|
$user = $this->getLoginUser();
|
||||||
|
|
||||||
$userId = $user->id > 0 ?: $this->session->getId();
|
$mine = [
|
||||||
|
'id' => $user->id,
|
||||||
|
'username' => $user->name,
|
||||||
|
'sign' => $user->sign,
|
||||||
|
'avatar' => $user->avatar,
|
||||||
|
'status' => 'online',
|
||||||
|
];
|
||||||
|
|
||||||
|
$friend = $this->handleFriendList($user->id);
|
||||||
|
|
||||||
|
$group = $this->handleGroupList($user->id);
|
||||||
|
|
||||||
|
return [
|
||||||
|
'mine' => $mine,
|
||||||
|
'friend' => $friend,
|
||||||
|
'group' => $group,
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
public function bindUser()
|
||||||
|
{
|
||||||
|
$user = $this->getLoginUser();
|
||||||
|
|
||||||
$clientId = $this->request->getPost('client_id');
|
$clientId = $this->request->getPost('client_id');
|
||||||
|
|
||||||
$groupName = $this->getGroupName($id);
|
|
||||||
|
|
||||||
Gateway::$registerAddress = '127.0.0.1:1238';
|
Gateway::$registerAddress = '127.0.0.1:1238';
|
||||||
|
|
||||||
Gateway::bindUid($clientId, $userId);
|
Gateway::bindUid($clientId, $user->id);
|
||||||
|
|
||||||
|
$userRepo = new UserRepo();
|
||||||
|
|
||||||
|
$chatGroups = $userRepo->findImChatGroups($user->id);
|
||||||
|
|
||||||
|
if ($chatGroups->count() > 0) {
|
||||||
|
foreach ($chatGroups as $group) {
|
||||||
|
Gateway::joinGroup($clientId, $this->getGroupName($group->id));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Gateway::joinGroup($clientId, $groupName);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public function sendMessage($id)
|
public function sendMessage()
|
||||||
{
|
{
|
||||||
$chapter = $this->checkChapterCache($id);
|
$user = $this->getLoginUser();
|
||||||
|
|
||||||
$from = $this->request->getPost('from');
|
$from = $this->request->getPost('from');
|
||||||
$to = $this->request->getPost('to');
|
$to = $this->request->getPost('to');
|
||||||
@ -39,7 +68,7 @@ class Messenger extends Service
|
|||||||
'avatar' => $from['avatar'],
|
'avatar' => $from['avatar'],
|
||||||
'content' => $from['content'],
|
'content' => $from['content'],
|
||||||
'fromid' => $from['id'],
|
'fromid' => $from['id'],
|
||||||
'id' => $to['id'],
|
'id' => $from['id'],
|
||||||
'type' => $to['type'],
|
'type' => $to['type'],
|
||||||
'timestamp' => 1000 * time(),
|
'timestamp' => 1000 * time(),
|
||||||
'mine' => false,
|
'mine' => false,
|
||||||
@ -50,11 +79,101 @@ class Messenger extends Service
|
|||||||
'content' => $content,
|
'content' => $content,
|
||||||
]);
|
]);
|
||||||
|
|
||||||
$groupName = $this->getGroupName($chapter->id);
|
|
||||||
|
|
||||||
Gateway::$registerAddress = '127.0.0.1:1238';
|
Gateway::$registerAddress = '127.0.0.1:1238';
|
||||||
|
|
||||||
Gateway::sendToGroup($groupName, $message);
|
if ($to['type'] == 'friend') {
|
||||||
|
|
||||||
|
Gateway::sendToUid($to['id'], $message);
|
||||||
|
|
||||||
|
} elseif ($to['type'] == 'group') {
|
||||||
|
|
||||||
|
$excludeClientId = null;
|
||||||
|
|
||||||
|
if ($user->id == $from['id']) {
|
||||||
|
$excludeClientId = Gateway::getClientIdByUid($user->id);
|
||||||
|
}
|
||||||
|
|
||||||
|
$groupName = $this->getGroupName($to['id']);
|
||||||
|
|
||||||
|
Gateway::sendToGroup($groupName, $message, $excludeClientId);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function handleFriendList($userId)
|
||||||
|
{
|
||||||
|
$userRepo = new UserRepo();
|
||||||
|
|
||||||
|
$friendGroups = $userRepo->findImFriendGroups($userId);
|
||||||
|
$friends = $userRepo->findImFriends($userId);
|
||||||
|
|
||||||
|
$items = [];
|
||||||
|
|
||||||
|
$items[] = ['id' => 0, 'groupname' => '我的好友', 'list' => []];
|
||||||
|
|
||||||
|
if ($friendGroups->count() > 0) {
|
||||||
|
foreach ($friendGroups as $group) {
|
||||||
|
$items[] = ['id' => $group->id, 'groupname' => $group->name, 'online' => 0, 'list' => []];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($friends->count() == 0) {
|
||||||
|
return $items;
|
||||||
|
}
|
||||||
|
|
||||||
|
$userIds = kg_array_column($friends->toArray(), 'friend_id');
|
||||||
|
|
||||||
|
$users = $userRepo->findByIds($userIds);
|
||||||
|
|
||||||
|
$userMappings = [];
|
||||||
|
|
||||||
|
foreach ($users as $user) {
|
||||||
|
$userMappings[$user->id] = [
|
||||||
|
'id' => $user->id,
|
||||||
|
'username' => $user->name,
|
||||||
|
'avatar' => $user->avatar,
|
||||||
|
'sign' => $user->sign,
|
||||||
|
'status' => 'online',
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach ($items as $key => $item) {
|
||||||
|
foreach ($friends as $friend) {
|
||||||
|
$userId = $friend->friend_id;
|
||||||
|
if ($item['id'] == $friend->group_id) {
|
||||||
|
$items[$key]['list'][] = $userMappings[$userId];
|
||||||
|
} else {
|
||||||
|
$items[0]['list'][] = $userMappings[$userId];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return $items;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function handleGroupList($userId)
|
||||||
|
{
|
||||||
|
$userRepo = new UserRepo();
|
||||||
|
|
||||||
|
$groups = $userRepo->findImChatGroups($userId);
|
||||||
|
|
||||||
|
if ($groups->count() == 0) {
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
|
||||||
|
$baseUrl = kg_ci_base_url();
|
||||||
|
|
||||||
|
$result = [];
|
||||||
|
|
||||||
|
foreach ($groups->toArray() as $group) {
|
||||||
|
$group['avatar'] = $baseUrl . $group['avatar'];
|
||||||
|
$result[] = [
|
||||||
|
'id' => $group['id'],
|
||||||
|
'groupname' => $group['name'],
|
||||||
|
'avatar' => $group['avatar'],
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
return $result;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected function getGroupName($groupId)
|
protected function getGroupName($groupId)
|
||||||
|
@ -51,14 +51,17 @@
|
|||||||
{% block inline_js %}
|
{% block inline_js %}
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
if ($('#tab-courses').length > 0) {
|
layui.use(['jquery', 'element'], function () {
|
||||||
var $tabCourses = $('#tab-courses');
|
var $ = layui.jquery;
|
||||||
helper.ajaxLoadHtml($tabCourses.attr('data-url'), $tabCourses.attr('id'));
|
if ($('#tab-courses').length > 0) {
|
||||||
}
|
var $tabCourses = $('#tab-courses');
|
||||||
if ($('#tab-users').length > 0) {
|
layui.ajaxLoadHtml($tabCourses.attr('data-url'), $tabCourses.attr('id'));
|
||||||
var $tabUsers = $('#tab-users');
|
}
|
||||||
helper.ajaxLoadHtml($tabUsers.attr('data-url'), $tabUsers.attr('id'));
|
if ($('#tab-users').length > 0) {
|
||||||
}
|
var $tabUsers = $('#tab-users');
|
||||||
|
layui.ajaxLoadHtml($tabUsers.attr('data-url'), $tabUsers.attr('id'));
|
||||||
|
}
|
||||||
|
});
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
{% endblock %}
|
{% endblock %}
|
@ -130,6 +130,26 @@ function kg_site_base_url()
|
|||||||
return "{$scheme}://{$host}" . rtrim(dirname($path), '/');
|
return "{$scheme}://{$host}" . rtrim(dirname($path), '/');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取默认头像路径
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
function kg_default_avatar_path()
|
||||||
|
{
|
||||||
|
return '/img/avatar/default.png';
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取默认封面路径
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
function kg_default_cover_path()
|
||||||
|
{
|
||||||
|
return '/img/cover/default.png';
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获取数据万象基准URL
|
* 获取数据万象基准URL
|
||||||
*
|
*
|
||||||
@ -146,11 +166,9 @@ function kg_ci_base_url()
|
|||||||
* 获取数据万象URL
|
* 获取数据万象URL
|
||||||
*
|
*
|
||||||
* @param string $path
|
* @param string $path
|
||||||
* @param int $width
|
|
||||||
* @param int $height
|
|
||||||
* @return string
|
* @return string
|
||||||
*/
|
*/
|
||||||
function kg_ci_img_url($path, $width = 0, $height = 0)
|
function kg_ci_img_url($path)
|
||||||
{
|
{
|
||||||
if (!$path) return '';
|
if (!$path) return '';
|
||||||
|
|
||||||
@ -160,37 +178,33 @@ function kg_ci_img_url($path, $width = 0, $height = 0)
|
|||||||
|
|
||||||
$storage = new StorageService();
|
$storage = new StorageService();
|
||||||
|
|
||||||
return $storage->getCiImageUrl($path, $width, $height);
|
return $storage->getCiImageUrl($path);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获取头像数据万象URL
|
* 获取头像数据万象URL
|
||||||
*
|
*
|
||||||
* @param string $path
|
* @param string $path
|
||||||
* @param int $width
|
|
||||||
* @param int $height
|
|
||||||
* @return string
|
* @return string
|
||||||
*/
|
*/
|
||||||
function kg_ci_avatar_img_url($path, $width = 0, $height = 0)
|
function kg_ci_avatar_img_url($path)
|
||||||
{
|
{
|
||||||
$path = $path ?: '/img/avatar/default.png';
|
$path = $path ?: kg_default_avatar_path();
|
||||||
|
|
||||||
return kg_ci_img_url($path, $width, $height);
|
return kg_ci_img_url($path);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获取封面数据万象URL
|
* 获取封面数据万象URL
|
||||||
*
|
*
|
||||||
* @param string $path
|
* @param string $path
|
||||||
* @param int $width
|
|
||||||
* @param int $height
|
|
||||||
* @return string
|
* @return string
|
||||||
*/
|
*/
|
||||||
function kg_ci_cover_img_url($path, $width = 0, $height = 0)
|
function kg_ci_cover_img_url($path)
|
||||||
{
|
{
|
||||||
$path = $path ?: '/img/cover/default.png';
|
$path = $path ?: kg_default_cover_path();
|
||||||
|
|
||||||
return kg_ci_img_url($path, $width, $height);
|
return kg_ci_img_url($path);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -278,6 +278,8 @@ class Course extends Model
|
|||||||
|
|
||||||
if (Text::startsWith($this->cover, 'http')) {
|
if (Text::startsWith($this->cover, 'http')) {
|
||||||
$this->cover = self::getCoverPath($this->cover);
|
$this->cover = self::getCoverPath($this->cover);
|
||||||
|
} elseif (empty($this->cover)) {
|
||||||
|
$this->cover = kg_default_cover_path();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!empty($attrs)) {
|
if (!empty($attrs)) {
|
||||||
|
@ -3,6 +3,7 @@
|
|||||||
namespace App\Models;
|
namespace App\Models;
|
||||||
|
|
||||||
use Phalcon\Mvc\Model\Behavior\SoftDelete;
|
use Phalcon\Mvc\Model\Behavior\SoftDelete;
|
||||||
|
use Phalcon\Text;
|
||||||
|
|
||||||
class ImChatGroup extends Model
|
class ImChatGroup extends Model
|
||||||
{
|
{
|
||||||
@ -90,6 +91,12 @@ class ImChatGroup extends Model
|
|||||||
public function beforeCreate()
|
public function beforeCreate()
|
||||||
{
|
{
|
||||||
$this->create_time = time();
|
$this->create_time = time();
|
||||||
|
|
||||||
|
if (Text::startsWith($this->avatar, 'http')) {
|
||||||
|
$this->avatar = self::getAvatarPath($this->avatar);
|
||||||
|
} elseif (empty($this->avatar)) {
|
||||||
|
$this->avatar = kg_default_avatar_path();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public function beforeUpdate()
|
public function beforeUpdate()
|
||||||
@ -97,5 +104,21 @@ class ImChatGroup extends Model
|
|||||||
$this->update_time = time();
|
$this->update_time = time();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function afterFetch()
|
||||||
|
{
|
||||||
|
if (!Text::startsWith($this->avatar, 'http')) {
|
||||||
|
$this->avatar = kg_ci_avatar_img_url($this->avatar);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static function getAvatarPath($url)
|
||||||
|
{
|
||||||
|
if (Text::startsWith($url, 'http')) {
|
||||||
|
return parse_url($url, PHP_URL_PATH);
|
||||||
|
}
|
||||||
|
|
||||||
|
return $url;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -26,6 +26,13 @@ class ImFriend extends Model
|
|||||||
*/
|
*/
|
||||||
public $friend_id;
|
public $friend_id;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 分组编号
|
||||||
|
*
|
||||||
|
* @var integer
|
||||||
|
*/
|
||||||
|
public $group_id;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 屏蔽标识
|
* 屏蔽标识
|
||||||
*
|
*
|
||||||
|
@ -1,66 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
namespace App\Models;
|
|
||||||
|
|
||||||
class ImFriendGroupUser extends Model
|
|
||||||
{
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 主键编号
|
|
||||||
*
|
|
||||||
* @var integer
|
|
||||||
*/
|
|
||||||
public $id;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 分组编号
|
|
||||||
*
|
|
||||||
* @var integer
|
|
||||||
*/
|
|
||||||
public $group_id;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 用户编号
|
|
||||||
*
|
|
||||||
* @var integer
|
|
||||||
*/
|
|
||||||
public $user_id;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 优先级
|
|
||||||
*
|
|
||||||
* @var integer
|
|
||||||
*/
|
|
||||||
public $priority;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 创建时间
|
|
||||||
*
|
|
||||||
* @var integer
|
|
||||||
*/
|
|
||||||
public $create_time;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 更新时间
|
|
||||||
*
|
|
||||||
* @var integer
|
|
||||||
*/
|
|
||||||
public $update_time;
|
|
||||||
|
|
||||||
public function getSource()
|
|
||||||
{
|
|
||||||
return 'kg_im_friend_group_user';
|
|
||||||
}
|
|
||||||
|
|
||||||
public function beforeCreate()
|
|
||||||
{
|
|
||||||
$this->create_time = time();
|
|
||||||
}
|
|
||||||
|
|
||||||
public function beforeUpdate()
|
|
||||||
{
|
|
||||||
$this->update_time = time();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
95
app/Models/ImFriendMessage.php
Normal file
95
app/Models/ImFriendMessage.php
Normal file
@ -0,0 +1,95 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Models;
|
||||||
|
|
||||||
|
use Phalcon\Mvc\Model\Behavior\SoftDelete;
|
||||||
|
|
||||||
|
class ImFriendMessage extends Model
|
||||||
|
{
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 主键编号
|
||||||
|
*
|
||||||
|
* @var integer
|
||||||
|
*/
|
||||||
|
public $id;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 用户编号
|
||||||
|
*
|
||||||
|
* @var integer
|
||||||
|
*/
|
||||||
|
public $user_id;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 对话编号
|
||||||
|
*
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
public $chat_id;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 内容
|
||||||
|
*
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
public $content;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 删除标识
|
||||||
|
*
|
||||||
|
* @var integer
|
||||||
|
*/
|
||||||
|
public $deleted;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 创建时间
|
||||||
|
*
|
||||||
|
* @var integer
|
||||||
|
*/
|
||||||
|
public $create_time;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 更新时间
|
||||||
|
*
|
||||||
|
* @var integer
|
||||||
|
*/
|
||||||
|
public $update_time;
|
||||||
|
|
||||||
|
public function getSource()
|
||||||
|
{
|
||||||
|
return 'kg_im_friend_message';
|
||||||
|
}
|
||||||
|
|
||||||
|
public function initialize()
|
||||||
|
{
|
||||||
|
parent::initialize();
|
||||||
|
|
||||||
|
$this->addBehavior(
|
||||||
|
new SoftDelete([
|
||||||
|
'field' => 'deleted',
|
||||||
|
'value' => 1,
|
||||||
|
])
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function beforeCreate()
|
||||||
|
{
|
||||||
|
$this->create_time = time();
|
||||||
|
}
|
||||||
|
|
||||||
|
public function beforeUpdate()
|
||||||
|
{
|
||||||
|
$this->update_time = time();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static function getChatId($aUserId, $bUserId)
|
||||||
|
{
|
||||||
|
$list = [$aUserId, $bUserId];
|
||||||
|
|
||||||
|
sort($list);
|
||||||
|
|
||||||
|
return implode('_', $list);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -4,12 +4,9 @@ namespace App\Models;
|
|||||||
|
|
||||||
use Phalcon\Mvc\Model\Behavior\SoftDelete;
|
use Phalcon\Mvc\Model\Behavior\SoftDelete;
|
||||||
|
|
||||||
class ImMessage extends Model
|
class ImGroupMessage extends Model
|
||||||
{
|
{
|
||||||
|
|
||||||
const TYPE_FRIEND = 1; // 私聊
|
|
||||||
const TYPE_GROUP = 2; // 群聊
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 主键编号
|
* 主键编号
|
||||||
*
|
*
|
||||||
@ -18,32 +15,25 @@ class ImMessage extends Model
|
|||||||
public $id;
|
public $id;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 类型
|
* 群组编号
|
||||||
*
|
*
|
||||||
* @var integer
|
* @var integer
|
||||||
*/
|
*/
|
||||||
public $type;
|
public $group_id;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 发送方编号
|
* 用户编号
|
||||||
*
|
*
|
||||||
* @var integer
|
* @var integer
|
||||||
*/
|
*/
|
||||||
public $sender_id;
|
public $user_id;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 接收方编号
|
* 内容
|
||||||
*
|
|
||||||
* @var integer
|
|
||||||
*/
|
|
||||||
public $receiver_id;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 内容编号
|
|
||||||
*
|
*
|
||||||
* @var string
|
* @var string
|
||||||
*/
|
*/
|
||||||
public $content_id;
|
public $content;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 删除标识
|
* 删除标识
|
||||||
@ -68,7 +58,7 @@ class ImMessage extends Model
|
|||||||
|
|
||||||
public function getSource()
|
public function getSource()
|
||||||
{
|
{
|
||||||
return 'kg_im_message';
|
return 'kg_im_group_message';
|
||||||
}
|
}
|
||||||
|
|
||||||
public function initialize()
|
public function initialize()
|
@ -1,27 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
namespace App\Models;
|
|
||||||
|
|
||||||
class ImMessageContent extends Model
|
|
||||||
{
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 主键编号
|
|
||||||
*
|
|
||||||
* @var integer
|
|
||||||
*/
|
|
||||||
public $id;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 内容
|
|
||||||
*
|
|
||||||
* @var string
|
|
||||||
*/
|
|
||||||
public $content;
|
|
||||||
|
|
||||||
public function getSource()
|
|
||||||
{
|
|
||||||
return 'kg_im_message_content';
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -122,6 +122,8 @@ class Slide extends Model
|
|||||||
|
|
||||||
if (Text::startsWith($this->cover, 'http')) {
|
if (Text::startsWith($this->cover, 'http')) {
|
||||||
$this->cover = self::getCoverPath($this->cover);
|
$this->cover = self::getCoverPath($this->cover);
|
||||||
|
} elseif (empty($this->cover)) {
|
||||||
|
$this->cover = kg_default_cover_path();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (is_array($this->style) && !empty($this->style)) {
|
if (is_array($this->style) && !empty($this->style)) {
|
||||||
|
@ -193,6 +193,8 @@ class User extends Model
|
|||||||
|
|
||||||
if (Text::startsWith($this->avatar, 'http')) {
|
if (Text::startsWith($this->avatar, 'http')) {
|
||||||
$this->avatar = self::getAvatarPath($this->avatar);
|
$this->avatar = self::getAvatarPath($this->avatar);
|
||||||
|
} elseif (empty($this->avatar)) {
|
||||||
|
$this->avatar = kg_default_avatar_path();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3,8 +3,10 @@
|
|||||||
namespace App\Repos;
|
namespace App\Repos;
|
||||||
|
|
||||||
use App\Library\Paginator\Adapter\QueryBuilder as PagerQueryBuilder;
|
use App\Library\Paginator\Adapter\QueryBuilder as PagerQueryBuilder;
|
||||||
use App\Models\ImChatGroup as ImGroupModel;
|
use App\Models\ImChatGroup as ImChatGroupModel;
|
||||||
use App\Models\ImChatGroupUser as ImGroupUserModel;
|
use App\Models\ImChatGroupUser as ImChatGroupUserModel;
|
||||||
|
use App\Models\ImFriend as ImFriendModel;
|
||||||
|
use App\Models\ImFriendGroup as ImFriendGroupModel;
|
||||||
use App\Models\User as UserModel;
|
use App\Models\User as UserModel;
|
||||||
use Phalcon\Mvc\Model;
|
use Phalcon\Mvc\Model;
|
||||||
use Phalcon\Mvc\Model\Resultset;
|
use Phalcon\Mvc\Model\Resultset;
|
||||||
@ -113,17 +115,39 @@ class User extends Repository
|
|||||||
->execute();
|
->execute();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param int $userId
|
||||||
|
* @return ResultsetInterface|Resultset|ImFriendModel[]
|
||||||
|
*/
|
||||||
public function findImFriends($userId)
|
public function findImFriends($userId)
|
||||||
{
|
{
|
||||||
|
return ImFriendModel::query()
|
||||||
|
->where('user_id = :user_id:', ['user_id' => $userId])
|
||||||
|
->execute();
|
||||||
}
|
}
|
||||||
|
|
||||||
public function findImGroups($userId)
|
/**
|
||||||
|
* @param int $userId
|
||||||
|
* @return ResultsetInterface|Resultset|ImFriendGroupModel[]
|
||||||
|
*/
|
||||||
|
public function findImFriendGroups($userId)
|
||||||
|
{
|
||||||
|
return ImFriendGroupModel::query()
|
||||||
|
->where('user_id = :user_id:', ['user_id' => $userId])
|
||||||
|
->andWhere('deleted = 0')
|
||||||
|
->execute();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param int $userId
|
||||||
|
* @return ResultsetInterface|Resultset|ImChatGroupModel[]
|
||||||
|
*/
|
||||||
|
public function findImChatGroups($userId)
|
||||||
{
|
{
|
||||||
return $this->modelsManager->createBuilder()
|
return $this->modelsManager->createBuilder()
|
||||||
->columns('g.*')
|
->columns('g.*')
|
||||||
->addFrom(ImGroupModel::class, 'g')
|
->addFrom(ImChatGroupModel::class, 'g')
|
||||||
->join(ImGroupUserModel::class, 'g.id = gu.user_id', 'gu')
|
->join(ImChatGroupUserModel::class, 'g.id = gu.group_id', 'gu')
|
||||||
->where('gu.user_id = :user_id:', ['user_id' => $userId])
|
->where('gu.user_id = :user_id:', ['user_id' => $userId])
|
||||||
->andWhere('g.deleted = 0')
|
->andWhere('g.deleted = 0')
|
||||||
->getQuery()->execute();
|
->getQuery()->execute();
|
||||||
|
@ -2,18 +2,18 @@
|
|||||||
|
|
||||||
namespace App\Services\Frontend\Messenger;
|
namespace App\Services\Frontend\Messenger;
|
||||||
|
|
||||||
use App\Services\Frontend\CourseTrait;
|
|
||||||
use App\Services\Frontend\Service as FrontendService;
|
use App\Services\Frontend\Service as FrontendService;
|
||||||
use App\Services\Frontend\UserTrait;
|
|
||||||
|
|
||||||
class ContactList extends FrontendService
|
class ContactList extends FrontendService
|
||||||
{
|
{
|
||||||
|
|
||||||
use CourseTrait, UserTrait;
|
public function handle()
|
||||||
|
|
||||||
public function handle($id)
|
|
||||||
{
|
{
|
||||||
|
$user = $this->getLoginUser();
|
||||||
|
|
||||||
|
$mine = [
|
||||||
|
|
||||||
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -4,6 +4,30 @@ layui.use(['jquery', 'layim'], function () {
|
|||||||
var layim = layui.layim;
|
var layim = layui.layim;
|
||||||
var socket = new WebSocket('ws://127.0.0.1:8282');
|
var socket = new WebSocket('ws://127.0.0.1:8282');
|
||||||
|
|
||||||
|
socket.onopen = function () {
|
||||||
|
console.log('socket connect success');
|
||||||
|
};
|
||||||
|
|
||||||
|
socket.onclose = function () {
|
||||||
|
console.log('socket connect close');
|
||||||
|
};
|
||||||
|
|
||||||
|
socket.onerror = function () {
|
||||||
|
console.log('socket connect error');
|
||||||
|
};
|
||||||
|
|
||||||
|
socket.onmessage = function (e) {
|
||||||
|
var data = JSON.parse(e.data);
|
||||||
|
console.log(data);
|
||||||
|
if (data.type === 'ping') {
|
||||||
|
socket.send('pong...');
|
||||||
|
} else if (data.type === 'bind_user') {
|
||||||
|
bindUser(data.client_id);
|
||||||
|
} else if (data.type === 'show_message') {
|
||||||
|
showMessage(data.content);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
layim.config({
|
layim.config({
|
||||||
title: '即时聊天',
|
title: '即时聊天',
|
||||||
init: {
|
init: {
|
||||||
@ -18,34 +42,12 @@ layui.use(['jquery', 'layim'], function () {
|
|||||||
uploadFile: {
|
uploadFile: {
|
||||||
url: '/im/file/upload'
|
url: '/im/file/upload'
|
||||||
},
|
},
|
||||||
|
maxLength: 1500,
|
||||||
find: '/im/find',
|
find: '/im/find',
|
||||||
msgbox: '/im/msg/box',
|
msgbox: '/im/msg/box',
|
||||||
chatLog: '/im/chat/log'
|
chatLog: '/im/chat/log'
|
||||||
});
|
});
|
||||||
|
|
||||||
layim.on('ready', function (options) {
|
|
||||||
socket.onopen = function () {
|
|
||||||
console.log('socket connect success');
|
|
||||||
};
|
|
||||||
socket.onclose = function () {
|
|
||||||
console.log('socket connect close');
|
|
||||||
};
|
|
||||||
socket.onerror = function () {
|
|
||||||
console.log('socket connect error');
|
|
||||||
};
|
|
||||||
socket.onmessage = function (e) {
|
|
||||||
var data = JSON.parse(e.data);
|
|
||||||
console.log(data);
|
|
||||||
if (data.type === 'ping') {
|
|
||||||
socket.send('pong...');
|
|
||||||
} else if (data.type === 'bind_user') {
|
|
||||||
bindUser(data.client_id);
|
|
||||||
} else if (data.type === 'show_message') {
|
|
||||||
showMessage(data.content);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
});
|
|
||||||
|
|
||||||
layim.on('sendMessage', function (res) {
|
layim.on('sendMessage', function (res) {
|
||||||
sendMessage(res.mine, res.to);
|
sendMessage(res.mine, res.to);
|
||||||
});
|
});
|
||||||
@ -61,16 +63,13 @@ layui.use(['jquery', 'layim'], function () {
|
|||||||
function sendMessage(from, to) {
|
function sendMessage(from, to) {
|
||||||
$.ajax({
|
$.ajax({
|
||||||
type: 'POST',
|
type: 'POST',
|
||||||
dataType: 'json',
|
|
||||||
url: '/im/msg/send',
|
url: '/im/msg/send',
|
||||||
data: {from: from, to: to}
|
data: {from: from, to: to}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
function showMessage(message) {
|
function showMessage(message) {
|
||||||
if (message.fromid !== user.id) {
|
layim.getMessage(message);
|
||||||
layim.getMessage(message);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
});
|
});
|
Loading…
x
Reference in New Issue
Block a user