初始化
parent
2a955a841a
commit
b05d25e1de
|
@ -8,6 +8,8 @@ use App\Helper\PushMessageHelper;
|
||||||
use App\Model\Chat\ChatRecord;
|
use App\Model\Chat\ChatRecord;
|
||||||
use App\Model\Chat\ChatRecordsCode;
|
use App\Model\Chat\ChatRecordsCode;
|
||||||
use App\Model\Chat\ChatRecordsFile;
|
use App\Model\Chat\ChatRecordsFile;
|
||||||
|
use App\Model\User;
|
||||||
|
use App\Model\Chat\ChatRecordsInvite;
|
||||||
use App\Service\SocketFDService;
|
use App\Service\SocketFDService;
|
||||||
use App\Service\SocketRoomService;
|
use App\Service\SocketRoomService;
|
||||||
use Hyperf\Amqp\Result;
|
use Hyperf\Amqp\Result;
|
||||||
|
@ -112,6 +114,9 @@ class ChatMessageConsumer extends ConsumerMessage
|
||||||
return Result::ACK;
|
return Result::ACK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var ChatRecord
|
||||||
|
*/
|
||||||
$result = ChatRecord::leftJoin('users', 'users.id', '=', 'chat_records.user_id')
|
$result = ChatRecord::leftJoin('users', 'users.id', '=', 'chat_records.user_id')
|
||||||
->where('chat_records.id', $data['record_id'])
|
->where('chat_records.id', $data['record_id'])
|
||||||
->first([
|
->first([
|
||||||
|
@ -130,15 +135,39 @@ class ChatMessageConsumer extends ConsumerMessage
|
||||||
|
|
||||||
$file = [];
|
$file = [];
|
||||||
$code_block = [];
|
$code_block = [];
|
||||||
if ($result->msg_type == 2) {
|
$forward = [];
|
||||||
$file = ChatRecordsFile::where('record_id', $result->id)->first(['id', 'record_id', 'user_id', 'file_source', 'file_type', 'save_type', 'original_name', 'file_suffix', 'file_size', 'save_dir']);
|
$invite = [];
|
||||||
$file = $file ? $file->toArray() : [];
|
switch ($result->msg_type) {
|
||||||
if ($file) {
|
case 2://文件消息
|
||||||
$file['file_url'] = get_media_url($file['save_dir']);
|
$file = ChatRecordsFile::where('record_id', $result->id)->first(['id', 'record_id', 'user_id', 'file_source', 'file_type', 'save_type', 'original_name', 'file_suffix', 'file_size', 'save_dir']);
|
||||||
}
|
$file = $file ? $file->toArray() : [];
|
||||||
} else if ($result->msg_type == 5) {
|
if ($file) {
|
||||||
$code_block = ChatRecordsCode::where('record_id', $result->id)->first(['record_id', 'code_lang', 'code']);
|
$file['file_url'] = get_media_url($file['save_dir']);
|
||||||
$code_block = $code_block ? $code_block->toArray() : [];
|
}
|
||||||
|
break;
|
||||||
|
case 3://入群消息/退群消息
|
||||||
|
$notifyInfo = ChatRecordsInvite::where('record_id', $result->id)->first([
|
||||||
|
'record_id', 'type', 'operate_user_id', 'user_ids'
|
||||||
|
]);
|
||||||
|
|
||||||
|
$userInfo = User::where('id', $notifyInfo->operate_user_id)->first(['nickname', 'id']);
|
||||||
|
$membersIds = explode(',', $notifyInfo->user_ids);
|
||||||
|
|
||||||
|
$invite = [
|
||||||
|
'type' => $notifyInfo->type,
|
||||||
|
'operate_user' => ['id' => $userInfo->id, 'nickname' => $userInfo->nickname],
|
||||||
|
'users' => User::select('id', 'nickname')->whereIn('id', $membersIds)->get()->toArray()
|
||||||
|
];
|
||||||
|
|
||||||
|
unset($notifyInfo, $userInfo, $membersIds);
|
||||||
|
break;
|
||||||
|
case 4://会话记录消息
|
||||||
|
|
||||||
|
break;
|
||||||
|
case 5://代码块消息
|
||||||
|
$code_block = ChatRecordsCode::where('record_id', $result->id)->first(['record_id', 'code_lang', 'code']);
|
||||||
|
$code_block = $code_block ? $code_block->toArray() : [];
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
$msg = [
|
$msg = [
|
||||||
|
@ -156,7 +185,9 @@ class ChatMessageConsumer extends ConsumerMessage
|
||||||
"created_at" => $result->created_at,
|
"created_at" => $result->created_at,
|
||||||
"content" => $result->content,
|
"content" => $result->content,
|
||||||
"file" => $file,
|
"file" => $file,
|
||||||
"code_block" => $code_block
|
"code_block" => $code_block,
|
||||||
|
'forward' => $forward,
|
||||||
|
'invite' => $invite
|
||||||
])
|
])
|
||||||
];
|
];
|
||||||
|
|
||||||
|
|
|
@ -3,6 +3,8 @@
|
||||||
namespace App\Controller\Api\V1;
|
namespace App\Controller\Api\V1;
|
||||||
|
|
||||||
use App\Model\UsersFriend;
|
use App\Model\UsersFriend;
|
||||||
|
use App\Service\SocketRoomService;
|
||||||
|
use Hyperf\Amqp\Producer;
|
||||||
use Hyperf\Di\Annotation\Inject;
|
use Hyperf\Di\Annotation\Inject;
|
||||||
use Hyperf\HttpServer\Annotation\Controller;
|
use Hyperf\HttpServer\Annotation\Controller;
|
||||||
use Hyperf\HttpServer\Annotation\RequestMapping;
|
use Hyperf\HttpServer\Annotation\RequestMapping;
|
||||||
|
@ -13,6 +15,7 @@ use App\Model\UsersChatList;
|
||||||
use App\Model\Group\UsersGroup;
|
use App\Model\Group\UsersGroup;
|
||||||
use App\Model\Group\UsersGroupMember;
|
use App\Model\Group\UsersGroupMember;
|
||||||
use App\Model\Group\UsersGroupNotice;
|
use App\Model\Group\UsersGroupNotice;
|
||||||
|
use App\Amqp\Producer\ChatMessageProducer;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Class GroupController
|
* Class GroupController
|
||||||
|
@ -30,6 +33,18 @@ class GroupController extends CController
|
||||||
*/
|
*/
|
||||||
public $groupService;
|
public $groupService;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @Inject
|
||||||
|
* @var Producer
|
||||||
|
*/
|
||||||
|
private $producer;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @Inject
|
||||||
|
* @var SocketRoomService
|
||||||
|
*/
|
||||||
|
private $socketRoomService;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 创建群组
|
* 创建群组
|
||||||
*
|
*
|
||||||
|
@ -47,7 +62,8 @@ class GroupController extends CController
|
||||||
|
|
||||||
$friend_ids = array_filter(explode(',', $params['uids']));
|
$friend_ids = array_filter(explode(',', $params['uids']));
|
||||||
|
|
||||||
[$isTrue, $data] = $this->groupService->create($this->uid(), [
|
$user_id = $this->uid();
|
||||||
|
[$isTrue, $data] = $this->groupService->create($user_id, [
|
||||||
'name' => $params['group_name'],
|
'name' => $params['group_name'],
|
||||||
'avatar' => $params['avatar'] ?? '',
|
'avatar' => $params['avatar'] ?? '',
|
||||||
'profile' => $params['group_profile'] ?? ''
|
'profile' => $params['group_profile'] ?? ''
|
||||||
|
@ -57,8 +73,10 @@ class GroupController extends CController
|
||||||
return $this->response->fail('创建群聊失败,请稍后再试...');
|
return $this->response->fail('创建群聊失败,请稍后再试...');
|
||||||
}
|
}
|
||||||
|
|
||||||
//群聊创建成功后需要创建聊天室并发送消息通知
|
// ...消息推送队列
|
||||||
// ... 包装消息推送到队列
|
$this->producer->produce(
|
||||||
|
new ChatMessageProducer($user_id, $data['group_id'], 2, $data['record_id'])
|
||||||
|
);
|
||||||
|
|
||||||
return $this->response->success([
|
return $this->response->success([
|
||||||
'group_id' => $data['group_id']
|
'group_id' => $data['group_id']
|
||||||
|
@ -101,14 +119,23 @@ class GroupController extends CController
|
||||||
]);
|
]);
|
||||||
|
|
||||||
$uids = array_filter(explode(',', $params['uids']));
|
$uids = array_filter(explode(',', $params['uids']));
|
||||||
|
$uids = array_unique($uids);
|
||||||
|
|
||||||
[$isTrue, $record_id] = $this->groupService->invite($this->uid(), $params['group_id'], array_unique($uids));
|
$user_id = $this->uid();
|
||||||
|
[$isTrue, $record_id] = $this->groupService->invite($user_id, $params['group_id'], $uids);
|
||||||
if (!$isTrue) {
|
if (!$isTrue) {
|
||||||
return $this->response->fail('邀请好友加入群聊失败...');
|
return $this->response->fail('邀请好友加入群聊失败...');
|
||||||
}
|
}
|
||||||
|
|
||||||
// 推送入群消息
|
// 移出聊天室
|
||||||
// ...
|
foreach ($uids as $uid) {
|
||||||
|
$this->socketRoomService->addRoomMember($uid, $params['group_id']);
|
||||||
|
}
|
||||||
|
|
||||||
|
// ...消息推送队列
|
||||||
|
$this->producer->produce(
|
||||||
|
new ChatMessageProducer($user_id, $params['group_id'], 2, $record_id)
|
||||||
|
);
|
||||||
|
|
||||||
return $this->response->success([], '好友已成功加入群聊...');
|
return $this->response->success([], '好友已成功加入群聊...');
|
||||||
}
|
}
|
||||||
|
@ -125,13 +152,19 @@ class GroupController extends CController
|
||||||
'group_id' => 'required|integer'
|
'group_id' => 'required|integer'
|
||||||
]);
|
]);
|
||||||
|
|
||||||
[$isTrue, $record_id] = $this->groupService->quit($this->uid(), $params['group_id']);
|
$user_id = $this->uid();
|
||||||
|
[$isTrue, $record_id] = $this->groupService->quit($user_id, $params['group_id']);
|
||||||
if (!$isTrue) {
|
if (!$isTrue) {
|
||||||
return $this->response->fail('退出群组失败...');
|
return $this->response->fail('退出群组失败...');
|
||||||
}
|
}
|
||||||
|
|
||||||
// 推送消息通知
|
// 移出聊天室
|
||||||
// ...
|
$this->socketRoomService->delRoomMember($params['group_id'], $user_id);
|
||||||
|
|
||||||
|
// ...消息推送队列
|
||||||
|
$this->producer->produce(
|
||||||
|
new ChatMessageProducer($user_id, $params['group_id'], 2, $record_id)
|
||||||
|
);
|
||||||
|
|
||||||
return $this->response->success([], '已成功退出群组...');
|
return $this->response->success([], '已成功退出群组...');
|
||||||
}
|
}
|
||||||
|
@ -178,13 +211,21 @@ class GroupController extends CController
|
||||||
'members_ids' => 'required|array'
|
'members_ids' => 'required|array'
|
||||||
]);
|
]);
|
||||||
|
|
||||||
[$isTrue, $record_id] = $this->groupService->removeMember($params['group_id'], $this->uid(), $params['members_ids']);
|
$user_id = $this->uid();
|
||||||
|
[$isTrue, $record_id] = $this->groupService->removeMember($params['group_id'], $user_id, $params['members_ids']);
|
||||||
if (!$isTrue) {
|
if (!$isTrue) {
|
||||||
return $this->response->fail('群聊用户移除失败...');
|
return $this->response->fail('群聊用户移除失败...');
|
||||||
}
|
}
|
||||||
|
|
||||||
// 推送消息通知
|
// 移出聊天室
|
||||||
// ...
|
foreach ($params['members_ids'] as $uid) {
|
||||||
|
$this->socketRoomService->delRoomMember($params['group_id'], $uid);
|
||||||
|
}
|
||||||
|
|
||||||
|
// ...消息推送队列
|
||||||
|
$this->producer->produce(
|
||||||
|
new ChatMessageProducer($user_id, $params['group_id'], 2, $record_id)
|
||||||
|
);
|
||||||
|
|
||||||
return $this->response->success([], '已成功退出群组...');
|
return $this->response->success([], '已成功退出群组...');
|
||||||
}
|
}
|
||||||
|
@ -387,7 +428,7 @@ class GroupController extends CController
|
||||||
]);
|
]);
|
||||||
|
|
||||||
return $result
|
return $result
|
||||||
? $this->response->success([],'修改群公告信息成功...')
|
? $this->response->success([], '修改群公告信息成功...')
|
||||||
: $this->response->fail('修改群公告信息成功...');
|
: $this->response->fail('修改群公告信息成功...');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -419,7 +460,7 @@ class GroupController extends CController
|
||||||
]);
|
]);
|
||||||
|
|
||||||
return $result
|
return $result
|
||||||
? $this->response->success([],'公告删除成功...')
|
? $this->response->success([], '公告删除成功...')
|
||||||
: $this->response->fail('公告删除失败...');
|
: $this->response->fail('公告删除失败...');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -189,8 +189,8 @@ class TalkController extends CController
|
||||||
$isTrue = UsersChatList::notDisturbItem($this->uid(), $params['receive_id'], $params['type'], $params['not_disturb']);
|
$isTrue = UsersChatList::notDisturbItem($this->uid(), $params['receive_id'], $params['type'], $params['not_disturb']);
|
||||||
|
|
||||||
return $isTrue
|
return $isTrue
|
||||||
? $this->response->success([], '对话列表置顶成功...')
|
? $this->response->success([], '免打扰设置成功...')
|
||||||
: $this->response->fail('对话列表置顶失败...');
|
: $this->response->fail('免打扰设置失败...');
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -279,19 +279,29 @@ class TalkController extends CController
|
||||||
//转发方方式[1:逐条转发;2:合并转发]
|
//转发方方式[1:逐条转发;2:合并转发]
|
||||||
'forward_mode' => 'required|in:1,2',
|
'forward_mode' => 'required|in:1,2',
|
||||||
//转发的好友的ID
|
//转发的好友的ID
|
||||||
'receive_user_ids' => 'required|array',
|
// 'receive_user_ids' => 'array',
|
||||||
//转发的群聊ID
|
//转发的群聊ID
|
||||||
'receive_group_ids' => 'required|array',
|
// 'receive_group_ids' => 'array',
|
||||||
]);
|
]);
|
||||||
|
|
||||||
$user_id = $this->uid();
|
$user_id = $this->uid();
|
||||||
$items = array_merge(
|
|
||||||
array_map(function ($friend_id) {
|
$receive_user_ids = $receive_group_ids = [];
|
||||||
|
if (isset($params['receive_user_ids']) && !empty($params['receive_user_ids'])) {
|
||||||
|
$receive_user_ids = array_map(function ($friend_id) {
|
||||||
return ['source' => 1, 'id' => $friend_id];
|
return ['source' => 1, 'id' => $friend_id];
|
||||||
}, $params['receive_user_ids']),
|
}, $params['receive_user_ids']);
|
||||||
array_map(function ($group_id) {
|
}
|
||||||
|
|
||||||
|
if (isset($params['receive_group_ids']) && !empty($params['receive_group_ids'])) {
|
||||||
|
$receive_group_ids = array_map(function ($group_id) {
|
||||||
return ['source' => 2, 'id' => $group_id];
|
return ['source' => 2, 'id' => $group_id];
|
||||||
}, $params['receive_group_ids'])
|
}, $params['receive_group_ids']);
|
||||||
|
}
|
||||||
|
|
||||||
|
$items = array_merge(
|
||||||
|
$receive_user_ids,
|
||||||
|
$receive_group_ids
|
||||||
);
|
);
|
||||||
|
|
||||||
if ($params['forward_mode'] == 1) {//单条转发
|
if ($params['forward_mode'] == 1) {//单条转发
|
||||||
|
@ -304,14 +314,18 @@ class TalkController extends CController
|
||||||
return $this->response->fail('转发失败...');
|
return $this->response->fail('转发失败...');
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($params['receive_user_ids']) {
|
if ($receive_user_ids) {
|
||||||
foreach ($params['receive_user_ids'] as $v) {
|
foreach ($receive_user_ids as $v) {
|
||||||
$this->unreadTalkCache->setInc($v, $user_id);
|
$this->unreadTalkCache->setInc($v['id'], $user_id);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//这里需要调用WebSocket推送接口
|
// ...消息推送队列
|
||||||
// ...
|
foreach ($ids as $value) {
|
||||||
|
$this->producer->produce(
|
||||||
|
new ChatMessageProducer($user_id, $value['receive_id'], $value['source'], $value['record_id'])
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
return $this->response->success([], '转发成功...');
|
return $this->response->success([], '转发成功...');
|
||||||
}
|
}
|
||||||
|
|
|
@ -35,6 +35,23 @@ class UploadController extends CController
|
||||||
*/
|
*/
|
||||||
private $splitUploadService;
|
private $splitUploadService;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 图片文件流上传接口
|
||||||
|
*
|
||||||
|
* @RequestMapping(path="file-stream", methods="post")
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public function fileStream()
|
||||||
|
{
|
||||||
|
$fileStream = $this->request->post('fileStream', '');
|
||||||
|
$data = base64_decode(str_replace(['data:image/png;base64,', ' '], ['', '+'], $fileStream));
|
||||||
|
|
||||||
|
$path = '/media/images/avatar/' . date('Ymd') . '/' . uniqid() . date('His') . '.png';
|
||||||
|
$this->uploadService->makeDirectory($this->uploadService->driver('/media/images/avatar/' . date('Ymd') . '/'));
|
||||||
|
@file_put_contents($this->uploadService->driver($path), $data);
|
||||||
|
return $this->response->success(['avatar' => get_media_url($path)]);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获取拆分文件信息
|
* 获取拆分文件信息
|
||||||
*
|
*
|
||||||
|
|
|
@ -33,7 +33,7 @@ class ChatRecordsForward extends BaseModel
|
||||||
* @var array
|
* @var array
|
||||||
*/
|
*/
|
||||||
protected $fillable = [
|
protected $fillable = [
|
||||||
'record_id', 'user_id', 'created_at'
|
'record_id', 'user_id', 'records_id','text','created_at'
|
||||||
];
|
];
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -45,6 +45,5 @@ class ChatRecordsForward extends BaseModel
|
||||||
'id' => 'integer',
|
'id' => 'integer',
|
||||||
'record_id' => 'integer',
|
'record_id' => 'integer',
|
||||||
'user_id' => 'integer',
|
'user_id' => 'integer',
|
||||||
'created_at' => 'datetime'
|
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
|
|
||||||
namespace App\Service;
|
namespace App\Service;
|
||||||
|
|
||||||
|
use App\Cache\LastMsgCache;
|
||||||
use App\Model\Chat\ChatRecord;
|
use App\Model\Chat\ChatRecord;
|
||||||
use App\Model\Chat\ChatRecordsInvite;
|
use App\Model\Chat\ChatRecordsInvite;
|
||||||
use App\Model\Group\UsersGroup;
|
use App\Model\Group\UsersGroup;
|
||||||
|
@ -100,7 +101,7 @@ class GroupService extends BaseService
|
||||||
}
|
}
|
||||||
|
|
||||||
// 设置群聊消息缓存
|
// 设置群聊消息缓存
|
||||||
//LastMsgCache::set(['created_at' => date('Y-m-d H:i:s'), 'text' => '入群通知'], $insRes->id, 0);
|
LastMsgCache::set(['created_at' => date('Y-m-d H:i:s'), 'text' => '入群通知'], $insRes->id, 0);
|
||||||
|
|
||||||
return [true, ['record_id' => $result->id, 'group_id' => $insRes->id]];
|
return [true, ['record_id' => $result->id, 'group_id' => $insRes->id]];
|
||||||
}
|
}
|
||||||
|
@ -221,7 +222,7 @@ class GroupService extends BaseService
|
||||||
return [false, 0];
|
return [false, 0];
|
||||||
}
|
}
|
||||||
|
|
||||||
//LastMsgCache::set(['created_at' => date('Y-m-d H:i:s'), 'text' => '入群通知'], $group_id, 0);
|
LastMsgCache::set(['created_at' => date('Y-m-d H:i:s'), 'text' => '入群通知'], $group_id, 0);
|
||||||
return [true, $result->id];
|
return [true, $result->id];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -521,7 +521,7 @@ class TalkService extends BaseService
|
||||||
if ($source == 2) {//群聊消息
|
if ($source == 2) {//群聊消息
|
||||||
//判断是否是群聊成员
|
//判断是否是群聊成员
|
||||||
if (!UsersGroup::isMember($receive_id, $user_id)) {
|
if (!UsersGroup::isMember($receive_id, $user_id)) {
|
||||||
return [];
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
$sqlObj = $sqlObj->where('receive_id', $receive_id)->whereIn('msg_type', $msg_type)->where('source', 2)->where('is_revoke', 0);
|
$sqlObj = $sqlObj->where('receive_id', $receive_id)->whereIn('msg_type', $msg_type)->where('source', 2)->where('is_revoke', 0);
|
||||||
|
@ -591,7 +591,11 @@ class TalkService extends BaseService
|
||||||
throw new Exception('插入消息失败');
|
throw new Exception('插入消息失败');
|
||||||
}
|
}
|
||||||
|
|
||||||
$insRecordIds[] = $res->id;
|
$insRecordIds[] = [
|
||||||
|
'record_id' => $res->id,
|
||||||
|
'receive_id' => $item['id'],
|
||||||
|
'source' => $item['source']
|
||||||
|
];
|
||||||
|
|
||||||
if (!ChatRecordsForward::create([
|
if (!ChatRecordsForward::create([
|
||||||
'record_id' => $res->id,
|
'record_id' => $res->id,
|
||||||
|
|
Loading…
Reference in New Issue