This commit is contained in:
2025-11-18 13:38:05 +08:00
parent a3e5568f93
commit f9062837ab
7 changed files with 286 additions and 116 deletions

View File

@@ -5,60 +5,64 @@ use app\chat\model\ChatGroup;
use app\chat\model\ChatGroupMember;
use app\chat\model\ChatGroupMute;
use app\chat\model\ChatDoNotDisturb;
use app\common\controller\ApiController;
use app\utils\Session;
use support\Request;
use support\Response;
use support\think\Db;
class GroupController
class GroupController extends ApiController
{
/**
* 创建群(仅商家可创建)
*/
public function create(Request $request): Response
{
$uid = $request->uid;
$userType = $request->user_type;
if ($userType != 2) { // 2=商家
return json(['code' => 403, 'msg' => '仅商家可创建群聊']);
if ($this->user_type == 1) { // 2=商家
return $this->error('仅商家可创建群聊');
}
$name = $request->post('name', '');
$avatar = $request->post('avatar', '');
$shop_id = $request->post('shop_id', 0);
if(empty($shop_id)) {
return $this->error('参数不完整');
}
$shop = Db::name('tb_shop_info')->where(['id' => $shop_id])->find();
if(empty($shop)) {
return $this->error('店铺不存在');
}
// 查找群数量
$count = Db::name('chat_group')->where(['shop_id' => $shop_id])->count();
$name = $request->post('name')?:$shop['shop_name'] . '粉丝福利' . $count + 1 . '群';
$avatar = $request->post('avatar')?:$shop['logo'];
$announcement = $request->post('announcement', '');
$isPublic = $request->post('is_public', 0);
if (empty($name)) {
return json(['code' => 400, 'msg' => '群名称不能为空']);
$now = d();
try {
Db::startTrans();
// 创建群
$group_id = Db::name('chat_group')->insertGetId([
'name' => $name,
'shop_id' => $shop_id,
'avatar' => $avatar,
'owner_id' => $this->uid,
'announcement' => $announcement,
'is_public' => $isPublic,
'created_time' => $now,
]);
// 群主加入群
Db::name('chat_group_member')->insert([
'group_id' => $group_id,
'user_id' => $this->uid,
'role' => 1, // 1=群主
'join_time' => $now,
]);
Db::commit();
return $this->success(['group_id' => $group_id]);
}catch (\Throwable $exception) {
Db::rollback();
return $this->error($exception->getMessage());
}
$now = time();
// 创建群
$group = ChatGroup::create([
'name' => $name,
'avatar' => $avatar,
'owner_id' => $uid,
'announcement' => $announcement,
'is_public' => $isPublic,
'created_at' => $now,
'updated_at' => $now
]);
// 群主加入群
ChatGroupMember::create([
'group_id' => $group->id,
'user_id' => $uid,
'role' => 1, // 1=群主
'join_time' => $now,
'quit_time' => null,
'is_kicked' => 0
]);
return json([
'code' => 200,
'msg' => '群创建成功',
'data' => ['group_id' => $group->id]
]);
}
/**
@@ -66,93 +70,130 @@ class GroupController
*/
public function join(Request $request): Response
{
$uid = $request->uid;
$groupId = $request->post('group_id', 0);
if (!$groupId) {
return json(['code' => 400, 'msg' => '缺少group_id']);
$group_id = $request->post('group_id');
$invite = $request->post('invite');
if (!$group_id) {
return $this->error('缺少group_id');
}
// 验证群是否存在
$group = ChatGroup::find($groupId);
$group = Db::name('chat_group')->where(['id' => $group_id])->find();
if (!$group) {
return json(['code' => 404, 'msg' => '群不存在']);
return $this->error('群不存在');
}
// 验证是否已在群内
$exists = ChatGroupMember::where([
'group_id' => $groupId,
'user_id' => $uid,
$exists = Db::name('chat_group_member')->where([
'group_id' => $group_id,
'user_id' => $this->uid,
'quit_time' => null,
'is_kicked' => 0
])->exists();
])->find();
if ($exists) {
return json(['code' => 400, 'msg' => '已在群内']);
return $this->error('已在群内');
}
// 被踢用户不能重新加入(需群主邀请)
$isKicked = ChatGroupMember::where([
'group_id' => $groupId,
'user_id' => $uid,
$isKicked = Db::name('chat_group_member')->where([
'group_id' => $group_id,
'user_id' => $this->uid,
'is_kicked' => 1
])->exists();
if ($isKicked) {
return json(['code' => 403, 'msg' => '你已被移出该群,无法重新加入']);
])->find();
// 如果不是邀请
if(empty($invite) && $isKicked) {
return $this->error('你已被移出该群,无法重新加入');
}
$insert_arr = [
'group_id' => $group_id,
'user_id' => $this->uid,
'role' => 3,
'join_time' => d(),
];
$is_insert = true;
if($invite) {
// 验证邀请参数是否正常
$decryptedText = simple_decrypt($invite, config('cons.sercer_key'));
$decryptedText_arr = json_decode($decryptedText, true);
if($isKicked) {
$is_insert = false;
$insert_arr['is_kicked'] = 0;
}
$insert_arr['pid'] = $decryptedText_arr['pid'];
$insert_arr['group_id'] = $decryptedText_arr['group_id'];
$group_id = $decryptedText_arr['group_id'];
}
// 加入群
ChatGroupMember::create([
'group_id' => $groupId,
'user_id' => $uid,
'role' => 3, // 3=普通成员
'join_time' => time(),
'quit_time' => null,
'is_kicked' => 0
]);
return json(['code' => 200, 'msg' => '加群成功']);
if($is_insert) {
$res = Db::name('chat_group_member')->insert($insert_arr);
}else {
$res = Db::name('chat_group_member')->where(['user_id' => $this->uid, 'group_id' => $group_id])->update($insert_arr);
}
if($res) {
return $this->success();
}else {
return $this->error();
}
}
// 获取群邀请链接参数
public function getgrepurl(Request $request): Response
{
$group_id = $request->post('group_id');
if (!$group_id) {
return $this->error('缺少group_id');
}
if($this->user_type == 1) {
return $this->error('角色有误');
}
$data = [
'pid' => $this->uid,
'group_id' => $group_id
];
return $this->success(simple_encrypt(json_encode($data), config('cons.sercer_key')));
}
/**
* 退群
*/
public function quit(Request $request): Response
{
$uid = $request->uid;
$groupId = $request->post('group_id', 0);
$groupId = $request->post('group_id')?:0;
if (!$groupId) {
return json(['code' => 400, 'msg' => '缺少group_id']);
return $this->error('缺少group_id');
}
// 验证是否是群主(群主不能退群,需转让)
$isOwner = ChatGroupMember::where([
$owner = Db::name('chat_group_member')->where([
'group_id' => $groupId,
'user_id' => $uid,
'role' => 1,
'user_id' => $this->uid,
'quit_time' => null
])->exists();
if ($isOwner) {
return json(['code' => 403, 'msg' => '群主不能退群,请先转让群主']);
}
// 标记退出时间
$member = ChatGroupMember::where([
'group_id' => $groupId,
'user_id' => $uid,
'quit_time' => null,
'is_kicked' => 0
])->find();
if (!$member) {
return json(['code' => 400, 'msg' => '不在群内']);
if ($owner) {
if($owner['role'] == 1) {
return $this->error('群主不能退群,请先转让群');
}
}else {
return $this->error('不在群内');
}
$member->quit_time = time();
$member->save();
return json(['code' => 200, 'msg' => '退群成功']);
$res = Db::name('chat_group_member')->where([
'group_id' => $groupId,
'user_id' => $this->uid,
])->update(['quit_time' => d()]);
if($res) {
return $this->success();
}
return $this->error();
}
/**
* 设置群公告(仅群主/管理员)
*/