mirror of
https://github.com/kuaifan/dootask.git
synced 2026-02-28 12:50:48 +00:00
perf: 个人群支持转让群主
This commit is contained in:
parent
c1275bac56
commit
cd56e3ec6f
@ -1314,7 +1314,7 @@ class DialogController extends AbstractController
|
||||
* @apiName group__adduser
|
||||
*
|
||||
* @apiParam {Number} dialog_id 会话ID
|
||||
* @apiParam {Array} userids 移出的群成员,格式: [userid1, userid2, userid3]
|
||||
* @apiParam {Array} [userids] 移出的群成员,格式: [userid1, userid2, userid3]
|
||||
* - 留空表示自己退出
|
||||
* - 有值表示移出,仅限群主操作
|
||||
*
|
||||
@ -1347,6 +1347,50 @@ class DialogController extends AbstractController
|
||||
return Base::retSuccess($type === 'remove' ? '移出成功' : '退出成功');
|
||||
}
|
||||
|
||||
/**
|
||||
* @api {get} api/dialog/group/transfer 31. 转让群组
|
||||
*
|
||||
* @apiDescription 需要token身份
|
||||
* - 只有群主且是个人类型群可以解散
|
||||
* @apiVersion 1.0.0
|
||||
* @apiGroup dialog
|
||||
* @apiName group__transfer
|
||||
*
|
||||
* @apiParam {Number} dialog_id 会话ID
|
||||
* @apiParam {Number} userid 新的群主
|
||||
*
|
||||
* @apiSuccess {Number} ret 返回状态码(1正确、0错误)
|
||||
* @apiSuccess {String} msg 返回信息(错误描述)
|
||||
* @apiSuccess {Object} data 返回数据
|
||||
*/
|
||||
public function group__transfer()
|
||||
{
|
||||
$user = User::auth();
|
||||
//
|
||||
$dialog_id = intval(Request::input('dialog_id'));
|
||||
$userid = intval(Request::input('userid'));
|
||||
//
|
||||
if ($userid === $user->userid) {
|
||||
return Base::retError('你已经是群主');
|
||||
}
|
||||
if (!User::whereUserid($userid)->exists()) {
|
||||
return Base::retError('请选择有效的新群主');
|
||||
}
|
||||
//
|
||||
$dialog = WebSocketDialog::checkDialog($dialog_id, true);
|
||||
//
|
||||
$dialog->checkGroup('user');
|
||||
$dialog->owner_id = $userid;
|
||||
if ($dialog->save()) {
|
||||
$dialog->joinGroup($userid, 0);
|
||||
$dialog->pushMsg("groupUpdate", [
|
||||
'id' => $dialog->id,
|
||||
'owner_id' => $dialog->owner_id,
|
||||
]);
|
||||
}
|
||||
return Base::retSuccess('转让成功');
|
||||
}
|
||||
|
||||
/**
|
||||
* @api {get} api/dialog/group/disband 31. 解散群组
|
||||
*
|
||||
|
||||
@ -142,26 +142,32 @@ class WebSocketDialog extends AbstractModel
|
||||
|
||||
/**
|
||||
* 加入聊天室
|
||||
* @param int|array $userid 加入的会员ID或会员ID组
|
||||
* @param int $inviter 邀请人
|
||||
* @param bool $important 重要人员
|
||||
* @param int|array $userid 加入的会员ID或会员ID组
|
||||
* @param int $inviter 邀请人
|
||||
* @param bool|null $important 重要人员(null不修改、bool修改)
|
||||
* @return bool
|
||||
*/
|
||||
public function joinGroup($userid, $inviter, $important = false)
|
||||
public function joinGroup($userid, $inviter, $important = null)
|
||||
{
|
||||
AbstractModel::transaction(function () use ($important, $inviter, $userid) {
|
||||
foreach (is_array($userid) ? $userid : [$userid] as $value) {
|
||||
if ($value > 0) {
|
||||
$updateData = [
|
||||
'inviter' => $inviter,
|
||||
];
|
||||
if (is_bool($important)) {
|
||||
$updateData['important'] = $important ? 1 : 0;
|
||||
}
|
||||
$isInsert = false;
|
||||
WebSocketDialogUser::updateInsert([
|
||||
'dialog_id' => $this->id,
|
||||
'userid' => $value,
|
||||
], [
|
||||
'inviter' => $inviter,
|
||||
'important' => $important ? 1 : 0,
|
||||
]);
|
||||
WebSocketDialogMsg::sendMsg(null, $this->id, 'notice', [
|
||||
'notice' => User::userid2nickname($value) . " 已加入群组"
|
||||
], $inviter, true, true);
|
||||
], $updateData, [], $isInsert);
|
||||
if ($isInsert) {
|
||||
WebSocketDialogMsg::sendMsg(null, $this->id, 'notice', [
|
||||
'notice' => User::userid2nickname($value) . " 已加入群组"
|
||||
], $inviter, true, true);
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
@ -33,11 +33,7 @@
|
||||
</div>
|
||||
|
||||
<div v-if="dialogData.group_type !== 'all'" class="group-info-button">
|
||||
<Button v-if="dialogData.owner_id == userId || dialogData.owner_id == 0" @click="openAdd" type="primary">{{ $L("添加成员") }}</Button>
|
||||
<template v-if="dialogData.owner_id == userId">
|
||||
<Button v-if="dialogData.group_type !== 'department'" @click="onDisband" type="error" ghost>{{ $L("解散群组") }}</Button>
|
||||
</template>
|
||||
<Button v-else @click="onExit" type="error" ghost>{{ $L("退出群组") }}</Button>
|
||||
<Button v-if="dialogData.owner_id == userId || dialogData.owner_id == 0" @click="openAdd" type="primary" icon="md-add">{{ $L("添加成员") }}</Button>
|
||||
</div>
|
||||
|
||||
<!--添加成员-->
|
||||
@ -247,30 +243,6 @@ export default {
|
||||
});
|
||||
},
|
||||
|
||||
onDisband() {
|
||||
$A.modalConfirm({
|
||||
content: `你确定要解散【${this.dialogData.name}】群组吗?`,
|
||||
loading: true,
|
||||
okText: '解散',
|
||||
onOk: () => {
|
||||
return new Promise((resolve, reject) => {
|
||||
this.$store.dispatch("call", {
|
||||
url: 'dialog/group/disband',
|
||||
data: {
|
||||
dialog_id: this.dialogId,
|
||||
}
|
||||
}).then(({msg}) => {
|
||||
resolve(msg);
|
||||
this.$store.dispatch("forgetDialog", this.dialogId);
|
||||
this.goForward({name: 'manage-messenger'});
|
||||
}).catch(({msg}) => {
|
||||
reject(msg);
|
||||
});
|
||||
})
|
||||
},
|
||||
});
|
||||
},
|
||||
|
||||
openUser(userid) {
|
||||
if (this.openIng) {
|
||||
return
|
||||
|
||||
@ -65,18 +65,33 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<template v-if="dialogData.type === 'group'">
|
||||
<ETooltip
|
||||
placement="top"
|
||||
:disabled="windowSmall"
|
||||
:openDelay="600"
|
||||
:content="$L('群设置')">
|
||||
<i class="taskfont dialog-create" @click="groupInfoShow = true"></i>
|
||||
</ETooltip>
|
||||
</template>
|
||||
<ETooltip v-else-if="dialogData.type === 'user' && !isMyDialog" placement="top" :disabled="windowSmall" :content="$L('创建群组')">
|
||||
<i class="taskfont dialog-create" @click="openCreateGroup"></i>
|
||||
</ETooltip>
|
||||
<EDropdown
|
||||
trigger="click"
|
||||
class="dialog-menu"
|
||||
@command="onDialogMenu">
|
||||
<i class="taskfont dialog-menu-icon"></i>
|
||||
<EDropdownMenu slot="dropdown">
|
||||
<EDropdownItem v-if="dialogData.type === 'user'" command="openCreate">
|
||||
<div>{{$L('创建群组')}}</div>
|
||||
</EDropdownItem>
|
||||
<template v-else>
|
||||
<EDropdownItem command="groupInfo">
|
||||
<div>{{$L('群组设置')}}</div>
|
||||
</EDropdownItem>
|
||||
<EDropdownItem v-if="dialogData.owner_id != userId" command="exit">
|
||||
<div style="color:#f00">{{$L('退出群组')}}</div>
|
||||
</EDropdownItem>
|
||||
<template v-else-if="dialogData.group_type === 'user'">
|
||||
<EDropdownItem command="transfer">
|
||||
<div>{{$L('转让群主')}}</div>
|
||||
</EDropdownItem>
|
||||
<EDropdownItem command="disband">
|
||||
<div style="color:#f00">{{$L('解散群组')}}</div>
|
||||
</EDropdownItem>
|
||||
</template>
|
||||
</template>
|
||||
</EDropdownMenu>
|
||||
</EDropdown>
|
||||
</div>
|
||||
</slot>
|
||||
</div>
|
||||
@ -351,6 +366,22 @@
|
||||
<DialogGroupInfo v-if="groupInfoShow" :dialogId="dialogId" @on-close="groupInfoShow=false"/>
|
||||
</DrawerOverlay>
|
||||
|
||||
<!--群转让-->
|
||||
<Modal
|
||||
v-model="groupTransferShow"
|
||||
:title="$L('转让群主身份')"
|
||||
:mask-closable="false">
|
||||
<Form :model="groupTransferData" label-width="auto" @submit.native.prevent>
|
||||
<FormItem prop="userid" :label="$L('新的群主')">
|
||||
<UserInput v-model="groupTransferData.userid" :disabledChoice="groupTransferData.disabledChoice" :multiple-max="1" max-hidden-select :placeholder="$L('选择新的群主')"/>
|
||||
</FormItem>
|
||||
</Form>
|
||||
<div slot="footer" class="adaption">
|
||||
<Button type="default" @click="groupTransferShow=false">{{$L('取消')}}</Button>
|
||||
<Button type="primary" :loading="groupTransferLoad > 0" @click="onDialogMenu('transferConfirm')">{{$L('确定转让')}}</Button>
|
||||
</div>
|
||||
</Modal>
|
||||
|
||||
<!--回复列表-->
|
||||
<DrawerOverlay
|
||||
v-model="replyListShow"
|
||||
@ -474,6 +505,13 @@ export default {
|
||||
dialogDrag: false,
|
||||
groupInfoShow: false,
|
||||
|
||||
groupTransferShow: false,
|
||||
groupTransferLoad: 0,
|
||||
groupTransferData: {
|
||||
userid: [],
|
||||
disabledChoice: []
|
||||
},
|
||||
|
||||
navStyle: {},
|
||||
|
||||
operateVisible: false,
|
||||
@ -1470,12 +1508,111 @@ export default {
|
||||
}).catch(() => {})
|
||||
},
|
||||
|
||||
openCreateGroup() {
|
||||
this.createGroupData = {
|
||||
userids: this.dialogData.dialog_user ? [this.userId, this.dialogData.dialog_user.userid] : [this.userId],
|
||||
uncancelable: [this.userId]
|
||||
};
|
||||
this.createGroupShow = true;
|
||||
onDialogMenu(cmd) {
|
||||
switch (cmd) {
|
||||
case "openCreate":
|
||||
const userids = [this.userId]
|
||||
if (this.dialogData.dialog_user && this.userId != this.dialogData.dialog_user.userid) {
|
||||
userids.push(this.dialogData.dialog_user.userid)
|
||||
}
|
||||
this.createGroupData = {userids, uncancelable: [this.userId]}
|
||||
this.createGroupShow = true
|
||||
break;
|
||||
|
||||
case "groupInfo":
|
||||
this.groupInfoShow = true
|
||||
break;
|
||||
|
||||
case "transfer":
|
||||
this.groupTransferData = {
|
||||
dialog_id: this.dialogId,
|
||||
userid: [],
|
||||
disabledChoice: [this.userId]
|
||||
}
|
||||
this.groupTransferShow = true
|
||||
break;
|
||||
|
||||
case "transferConfirm":
|
||||
this.onTransferGroup()
|
||||
break;
|
||||
|
||||
case "disband":
|
||||
this.onDisbandGroup()
|
||||
break;
|
||||
|
||||
case "exit":
|
||||
this.onExitGroup()
|
||||
break;
|
||||
}
|
||||
},
|
||||
|
||||
onTransferGroup() {
|
||||
if (this.groupTransferData.userid.length === 0) {
|
||||
$A.messageError("请选择新的群主");
|
||||
return
|
||||
}
|
||||
this.groupTransferLoad++;
|
||||
this.$store.dispatch("call", {
|
||||
url: 'dialog/group/transfer',
|
||||
data: {
|
||||
dialog_id: this.dialogId,
|
||||
userid: this.groupTransferData.userid[0]
|
||||
}
|
||||
}).then(({data, msg}) => {
|
||||
$A.messageSuccess(msg);
|
||||
this.$store.dispatch("saveDialog", data);
|
||||
}).catch(({msg}) => {
|
||||
$A.modalError(msg);
|
||||
}).finally(_ => {
|
||||
this.groupTransferLoad--;
|
||||
});
|
||||
},
|
||||
|
||||
onDisbandGroup() {
|
||||
$A.modalConfirm({
|
||||
content: `你确定要解散【${this.dialogData.name}】群组吗?`,
|
||||
loading: true,
|
||||
okText: '解散',
|
||||
onOk: () => {
|
||||
return new Promise((resolve, reject) => {
|
||||
this.$store.dispatch("call", {
|
||||
url: 'dialog/group/disband',
|
||||
data: {
|
||||
dialog_id: this.dialogId,
|
||||
}
|
||||
}).then(({msg}) => {
|
||||
resolve(msg);
|
||||
this.$store.dispatch("forgetDialog", this.dialogId);
|
||||
this.goForward({name: 'manage-messenger'});
|
||||
}).catch(({msg}) => {
|
||||
reject(msg);
|
||||
});
|
||||
})
|
||||
},
|
||||
});
|
||||
},
|
||||
|
||||
onExitGroup() {
|
||||
$A.modalConfirm({
|
||||
content: "你确定要退出群组吗?",
|
||||
loading: true,
|
||||
onOk: () => {
|
||||
return new Promise((resolve, reject) => {
|
||||
this.$store.dispatch("call", {
|
||||
url: 'dialog/group/deluser',
|
||||
data: {
|
||||
dialog_id: this.dialogId,
|
||||
}
|
||||
}).then(({msg}) => {
|
||||
resolve(msg);
|
||||
this.$store.dispatch("forgetDialog", this.dialogId);
|
||||
this.goForward({name: 'manage-messenger'});
|
||||
}).catch(({msg}) => {
|
||||
reject(msg);
|
||||
});
|
||||
})
|
||||
},
|
||||
});
|
||||
},
|
||||
|
||||
onCreateGroup() {
|
||||
|
||||
@ -296,15 +296,24 @@
|
||||
}
|
||||
|
||||
.dialog-back,
|
||||
.dialog-create {
|
||||
cursor: pointer;
|
||||
margin-left: 24px;
|
||||
.dialog-menu {
|
||||
font-size: 22px;
|
||||
color: $primary-text-color;
|
||||
}
|
||||
|
||||
.dialog-menu {
|
||||
margin-right: -22px;
|
||||
.dialog-menu-icon {
|
||||
cursor: pointer;
|
||||
margin: 0 22px;
|
||||
font-size: 22px;
|
||||
color: $primary-text-color;
|
||||
}
|
||||
}
|
||||
|
||||
.dialog-back {
|
||||
display: none;
|
||||
cursor: pointer;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1500,17 +1509,22 @@
|
||||
}
|
||||
|
||||
.dialog-back,
|
||||
.dialog-create {
|
||||
.dialog-menu {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
bottom: 0;
|
||||
right: 0;
|
||||
margin: 0;
|
||||
width: 52px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
}
|
||||
.dialog-menu {
|
||||
margin: 0;
|
||||
.dialog-menu-icon {
|
||||
margin: 0;
|
||||
}
|
||||
}
|
||||
.dialog-back {
|
||||
padding-right: 6px;
|
||||
right: auto;
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user