From aa781a51df0652f09284f53dbf0d08fd491c54ae Mon Sep 17 00:00:00 2001 From: kuaifan Date: Sun, 5 Mar 2023 18:18:57 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E6=94=AF=E6=8C=81=E5=8F=91=E9=80=81?= =?UTF-8?q?=E5=8C=BF=E5=90=8D=E6=B6=88=E6=81=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Http/Controllers/Api/DialogController.php | 53 ++++ app/Http/Controllers/Api/SystemController.php | 4 +- app/Http/Middleware/VerifyCsrfToken.php | 3 + app/Models/User.php | 52 ++-- .../manage/components/ChatInput/index.vue | 17 +- .../pages/manage/components/DialogWrapper.vue | 48 +++- .../setting/components/SystemSetting.vue | 236 ++++++++++-------- .../public/images/avatar/default_anon.png | Bin 0 -> 8522 bytes 8 files changed, 279 insertions(+), 134 deletions(-) create mode 100644 resources/assets/statics/public/images/avatar/default_anon.png diff --git a/app/Http/Controllers/Api/DialogController.php b/app/Http/Controllers/Api/DialogController.php index c5202dc79..61ff4bb92 100755 --- a/app/Http/Controllers/Api/DialogController.php +++ b/app/Http/Controllers/Api/DialogController.php @@ -909,6 +909,59 @@ class DialogController extends AbstractController }); } + /** + * @api {post} api/dialog/msg/sendanon 16. 发送匿名消息 + * + * @apiDescription 需要token身份 + * @apiVersion 1.0.0 + * @apiGroup dialog + * @apiName msg__sendanon + * + * @apiParam {Number} userid 对方会员ID + * @apiParam {String} text 消息内容 + * + * @apiSuccess {Number} ret 返回状态码(1正确、0错误) + * @apiSuccess {String} msg 返回信息(错误描述) + * @apiSuccess {Object} data 返回数据 + */ + public function msg__sendanon() + { + User::auth(); + // + $userid = Base::getPostInt('userid'); + $text = trim(Base::getPostValue('text')); + // + $anonMessage = Base::settingFind('system', 'anon_message', 'open'); + if ($anonMessage != 'open') { + return Base::retError("匿名消息功能暂停使用"); + } + // + $toUser = User::whereUserid($userid)->first(); + if (empty($toUser) || $toUser->bot) { + return Base::retError("匿名消息仅允许发送给个人"); + } + if ($toUser->isDisable()) { + return Base::retError("对方已离职"); + } + $strlen = mb_strlen($text); + if ($strlen < 1) { + return Base::retError('消息内容不能为空'); + } + if ($strlen > 2000) { + return Base::retError('消息内容最大不能超过2000字'); + } + // + $botUser = User::botGetOrCreate('anon-msg'); + if (empty($botUser)) { + return Base::retError('匿名机器人不存在'); + } + $dialog = WebSocketDialog::checkUserDialog($botUser, $toUser->userid); + if (empty($dialog)) { + return Base::retError('匿名机器人会话不存在'); + } + return WebSocketDialogMsg::sendMsg(null, $dialog->id, 'text', ['text' => "

{$text}

"], $botUser->userid); + } + /** * @api {get} api/dialog/msg/readlist 17. 获取消息阅读情况 * diff --git a/app/Http/Controllers/Api/SystemController.php b/app/Http/Controllers/Api/SystemController.php index 647deebe2..6d8e7b7cd 100755 --- a/app/Http/Controllers/Api/SystemController.php +++ b/app/Http/Controllers/Api/SystemController.php @@ -41,7 +41,7 @@ class SystemController extends AbstractController * @apiParam {String} type * - get: 获取(默认) * - all: 获取所有(需要管理员权限) - * - save: 保存设置(参数:['reg', 'reg_identity', 'reg_invite', 'login_code', 'password_policy', 'project_invite', 'chat_information', 'auto_archived', 'archived_day', 'all_group_mute', 'all_group_autoin', 'start_home', 'home_footer']) + * - save: 保存设置(参数:['reg', 'reg_identity', 'reg_invite', 'login_code', 'password_policy', 'project_invite', 'chat_information', 'anon_message', 'auto_archived', 'archived_day', 'all_group_mute', 'all_group_autoin', 'start_home', 'home_footer']) * @apiSuccess {Number} ret 返回状态码(1正确、0错误) * @apiSuccess {String} msg 返回信息(错误描述) @@ -65,6 +65,7 @@ class SystemController extends AbstractController 'password_policy', 'project_invite', 'chat_information', + 'anon_message', 'auto_archived', 'archived_day', 'all_group_mute', @@ -101,6 +102,7 @@ class SystemController extends AbstractController $setting['password_policy'] = $setting['password_policy'] ?: 'simple'; $setting['project_invite'] = $setting['project_invite'] ?: 'open'; $setting['chat_information'] = $setting['chat_information'] ?: 'optional'; + $setting['anon_message'] = $setting['anon_message'] ?: 'open'; $setting['auto_archived'] = $setting['auto_archived'] ?: 'close'; $setting['archived_day'] = floatval($setting['archived_day']) ?: 7; $setting['all_group_mute'] = $setting['all_group_mute'] ?: 'open'; diff --git a/app/Http/Middleware/VerifyCsrfToken.php b/app/Http/Middleware/VerifyCsrfToken.php index ada79d014..1b5e5a8b9 100644 --- a/app/Http/Middleware/VerifyCsrfToken.php +++ b/app/Http/Middleware/VerifyCsrfToken.php @@ -42,6 +42,9 @@ class VerifyCsrfToken extends Middleware // 聊天发文件 'api/dialog/msg/sendfile/', + // 聊天发匿名消息 + 'api/dialog/msg/sendanon/', + // 保存文件内容 'api/file/content/save/', diff --git a/app/Models/User.php b/app/Models/User.php index beb3372dd..670f4e7d9 100644 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -179,6 +179,15 @@ class User extends AbstractModel return in_array('temp', $this->identity); } + /** + * 返回是否禁用帐号(离职) + * @return bool + */ + public function isDisable() + { + return in_array('disable', $this->identity); + } + /** * 返回是否管理员 * @return bool @@ -575,14 +584,17 @@ class User extends AbstractModel return Base::fillUrl($userimg); } // 机器人头像 - if ($email == 'system-msg@bot.system') { - return url("images/avatar/default_system.png"); - } elseif ($email == 'task-alert@bot.system') { - return url("images/avatar/default_task.png"); - } elseif ($email == 'check-in@bot.system') { - return url("images/avatar/default_checkin.png"); - } elseif ($email == 'bot-manager@bot.system') { - return url("images/avatar/default_bot.png"); + switch ($email) { + case 'system-msg@bot.system': + return url("images/avatar/default_system.png"); + case 'task-alert@bot.system': + return url("images/avatar/default_task.png"); + case 'check-in@bot.system': + return url("images/avatar/default_checkin.png"); + case 'anon-msg@bot.system': + return url("images/avatar/default_anon.png"); + case 'bot-manager@bot.system': + return url("images/avatar/default_bot.png"); } // 生成文字头像 if (self::$defaultAvatarMode === 'auto') { @@ -652,14 +664,22 @@ class User extends AbstractModel ])->save(); } // - if ($key === 'system-msg') { - $update['nickname'] = '系统消息'; - } elseif ($key === 'task-alert') { - $update['nickname'] = '任务提醒'; - } elseif ($key === 'check-in') { - $update['nickname'] = '签到打卡'; - } elseif ($key === 'bot-manager') { - $update['nickname'] = '机器人管理'; + switch ($key) { + case 'system-msg': + $update['nickname'] = '系统消息'; + break; + case 'task-alert': + $update['nickname'] = '任务提醒'; + break; + case 'check-in': + $update['nickname'] = '签到打卡'; + break; + case 'anon-msg': + $update['nickname'] = '匿名消息'; + break; + case 'bot-manager': + $update['nickname'] = '机器人管理'; + break; } } if ($update) { diff --git a/resources/assets/js/pages/manage/components/ChatInput/index.vue b/resources/assets/js/pages/manage/components/ChatInput/index.vue index abc974024..e241035b8 100755 --- a/resources/assets/js/pages/manage/components/ChatInput/index.vue +++ b/resources/assets/js/pages/manage/components/ChatInput/index.vue @@ -80,10 +80,6 @@ {{$L('新会议')}} -
- - {{$L('拨打电话')}} -
{{$L('发送图片')}} @@ -92,6 +88,16 @@ {{$L('上传文件')}}
+ @@ -994,9 +1000,10 @@ export default { }); break; - case 'call': case 'image': case 'file': + case 'call': + case 'anon': this.$emit('on-more', action) break; } diff --git a/resources/assets/js/pages/manage/components/DialogWrapper.vue b/resources/assets/js/pages/manage/components/DialogWrapper.vue index 364bc79a8..a79e1a4cb 100644 --- a/resources/assets/js/pages/manage/components/DialogWrapper.vue +++ b/resources/assets/js/pages/manage/components/DialogWrapper.vue @@ -1434,14 +1434,17 @@ export default { onEventMore(e) { switch (e) { - case 'call': - this.onCallTel() - break; - case 'image': case 'file': this.$refs.chatUpload.handleClick() break; + + case 'call': + this.onCallTel() + break; + case 'anon': + this.onAnon() + break; } }, @@ -1469,6 +1472,43 @@ export default { }); }, + onAnon() { + if (this.dialogData.type !== 'user' || this.dialogData.bot) { + $A.modalWarning("匿名消息仅允许发送给个人"); + return + } + $A.modalInput({ + title: `发送匿名消息`, + placeholder: `匿名消息将通过匿名机器人发送给对方,绝对不会暴露你的身份`, + inputProps: { + type: 'textarea', + rows: 3, + autosize: { minRows: 3, maxRows: 6 }, + maxlength: 2000, + }, + okText: "匿名发送", + onOk: (value) => { + if (!value) { + return `请输入消息内容` + } + return new Promise((resolve, reject) => { + this.$store.dispatch("call", { + url: 'dialog/msg/sendanon', + data: { + userid: this.dialogData.dialog_user.userid, + text: value, + }, + method: 'post', + }).then(({msg}) => { + resolve(msg) + }).catch(({msg}) => { + reject(msg) + }); + }) + } + }); + }, + onEventEmojiVisibleChange(val) { if (val && this.windowSmall) { this.onToBottom(); diff --git a/resources/assets/js/pages/manage/setting/components/SystemSetting.vue b/resources/assets/js/pages/manage/setting/components/SystemSetting.vue index daec72d2c..d3139dc14 100644 --- a/resources/assets/js/pages/manage/setting/components/SystemSetting.vue +++ b/resources/assets/js/pages/manage/setting/components/SystemSetting.vue @@ -1,116 +1,136 @@