From 81a16c235f6b73883e4ce3f8c72e54f7661e3aeb Mon Sep 17 00:00:00 2001 From: kuaifan Date: Fri, 4 Jun 2021 16:01:22 +0800 Subject: [PATCH] no message --- app/Exceptions/Handler.php | 2 +- .../Controllers/Api/ProjectController.php | 46 +++--- app/Http/Controllers/Api/SystemController.php | 16 +- app/Http/Controllers/Api/UsersController.php | 38 ++--- app/Models/AbstractModel.php | 11 +- app/Models/Project.php | 2 + app/Models/ProjectTask.php | 9 +- app/Models/User.php | 12 +- app/Models/WebSocketDialog.php | 146 ++++++++++++++++++ app/Models/WebSocketDialogMsg.php | 106 +++++++++++++ app/Models/WebSocketDialogUser.php | 27 ++++ app/Module/Base.php | 12 +- app/Services/WebSocketService.php | 2 +- .../pages/manage/components/project-list.vue | 11 +- resources/assets/sass/app.scss | 1 + resources/assets/sass/scrollbar.scss | 40 +++++ 16 files changed, 409 insertions(+), 72 deletions(-) create mode 100644 app/Models/WebSocketDialog.php create mode 100644 app/Models/WebSocketDialogMsg.php create mode 100644 app/Models/WebSocketDialogUser.php create mode 100644 resources/assets/sass/scrollbar.scss diff --git a/app/Exceptions/Handler.php b/app/Exceptions/Handler.php index b9816391..2842f775 100644 --- a/app/Exceptions/Handler.php +++ b/app/Exceptions/Handler.php @@ -51,7 +51,7 @@ class Handler extends ExceptionHandler public function render($request, Throwable $e) { if ($e instanceof ModelNotFoundException) { - return response()->json(Base::retError('数据不存在!')); + return response()->json(Base::retError('数据不存在')); } return parent::render($request, $e); } diff --git a/app/Http/Controllers/Api/ProjectController.php b/app/Http/Controllers/Api/ProjectController.php index 84e1a678..4443c1a2 100755 --- a/app/Http/Controllers/Api/ProjectController.php +++ b/app/Http/Controllers/Api/ProjectController.php @@ -9,6 +9,7 @@ use App\Models\ProjectLog; use App\Models\ProjectTask; use App\Models\ProjectUser; use App\Models\User; +use App\Models\WebSocketDialog; use App\Module\Base; use Carbon\Carbon; use Request; @@ -105,12 +106,12 @@ class ProjectController extends AbstractController $name = trim(Request::input('name', '')); $desc = trim(Request::input('desc', '')); if (mb_strlen($name) < 2) { - return Base::retError('项目名称不可以少于2个字!'); + return Base::retError('项目名称不可以少于2个字'); } elseif (mb_strlen($name) > 32) { - return Base::retError('项目名称最多只能设置32个字!'); + return Base::retError('项目名称最多只能设置32个字'); } if (mb_strlen($desc) > 255) { - return Base::retError('项目描述最多只能设置255个字!'); + return Base::retError('项目描述最多只能设置255个字'); } //流程 $columns = Request::input('columns'); @@ -133,7 +134,7 @@ class ProjectController extends AbstractController ]; } if (count($insertColumns) > 30) { - return Base::retError('项目流程最多不能超过30个!'); + return Base::retError('项目流程最多不能超过30个'); } //开始创建 $project = Project::createInstance([ @@ -141,23 +142,28 @@ class ProjectController extends AbstractController 'desc' => $desc, 'userid' => $user->userid, ]); - return AbstractModel::transaction(function() use ($user, $insertColumns, $project) { + return AbstractModel::transaction(function() use ($insertColumns, $project) { + $dialog = WebSocketDialog::createGroup($project->name, $project->userid, 'project'); + if (empty($dialog)) { + return Base::retError('创建失败'); + } + $project->dialog_id = $dialog->id; $project->save(); ProjectUser::createInstance([ 'project_id' => $project->id, - 'userid' => $user->userid, + 'userid' => $project->userid, 'owner' => 1, ])->save(); ProjectLog::createInstance([ 'project_id' => $project->id, - 'userid' => $user->userid, + 'userid' => $project->userid, 'detail' => '创建项目', ])->save(); foreach ($insertColumns AS $column) { $column['project_id'] = $project->id; ProjectColumn::createInstance($column)->save(); } - return Base::retSuccess('添加成功!'); + return Base::retSuccess('添加成功'); }); } @@ -181,12 +187,12 @@ class ProjectController extends AbstractController $name = trim(Request::input('name', '')); $desc = trim(Request::input('desc', '')); if (mb_strlen($name) < 2) { - return Base::retError('项目名称不可以少于2个字!'); + return Base::retError('项目名称不可以少于2个字'); } elseif (mb_strlen($name) > 32) { - return Base::retError('项目名称最多只能设置32个字!'); + return Base::retError('项目名称最多只能设置32个字'); } if (mb_strlen($desc) > 255) { - return Base::retError('项目描述最多只能设置255个字!'); + return Base::retError('项目描述最多只能设置255个字'); } // $project = Project::select($this->projectSelect) @@ -195,10 +201,10 @@ class ProjectController extends AbstractController ->where('project_users.userid', $user->userid) ->first(); if (empty($project)) { - return Base::retError('项目不存在或不在成员列表内!'); + return Base::retError('项目不存在或不在成员列表内'); } if (!$project->owner) { - return Base::retError('你不是项目负责人!'); + return Base::retError('你不是项目负责人'); } // $project->name = $name; @@ -232,14 +238,14 @@ class ProjectController extends AbstractController ->where('project_users.userid', $user->userid) ->first(); if (empty($project)) { - return Base::retError('项目不存在或不在成员列表内!'); + return Base::retError('项目不存在或不在成员列表内'); } if (!$project->owner) { - return Base::retError('你不是项目负责人!'); + return Base::retError('你不是项目负责人'); } // if (!User::whereUserid($owner_userid)->exists()) { - return Base::retError('会员不存在!'); + return Base::retError('会员不存在'); } // return AbstractModel::transaction(function() use ($owner_userid, $project) { @@ -277,10 +283,10 @@ class ProjectController extends AbstractController ->where('project_users.userid', $user->userid) ->first(); if (empty($project)) { - return Base::retError('项目不存在或不在成员列表内!'); + return Base::retError('项目不存在或不在成员列表内'); } if (!$project->owner) { - return Base::retError('你不是项目负责人!'); + return Base::retError('你不是项目负责人'); } // return AbstractModel::transaction(function() use ($project) { @@ -327,7 +333,7 @@ class ProjectController extends AbstractController ->where('project_users.userid', $user->userid) ->first(); if (empty($project)) { - return Base::retError('项目不存在或不在成员列表内!'); + return Base::retError('项目不存在或不在成员列表内'); } // 列表 if (is_array($column_id)) { @@ -348,7 +354,7 @@ class ProjectController extends AbstractController } } if (empty($column)) { - return Base::retError('任务列表不存在或已被删除!'); + return Base::retError('任务列表不存在或已被删除'); } // return ProjectTask::addTask([ diff --git a/app/Http/Controllers/Api/SystemController.php b/app/Http/Controllers/Api/SystemController.php index 881d1235..d19f71ba 100755 --- a/app/Http/Controllers/Api/SystemController.php +++ b/app/Http/Controllers/Api/SystemController.php @@ -34,7 +34,7 @@ class SystemController extends AbstractController $type = trim(Request::input('type')); if ($type == 'save') { if (env("SYSTEM_SETTING") == 'disabled') { - return Base::retError('当前环境禁止修改!'); + return Base::retError('当前环境禁止修改'); } $user = User::authE(); if (Base::isError($user)) { @@ -43,7 +43,7 @@ class SystemController extends AbstractController $user = User::IDE($user['data']); } if (!$user->isAdmin()) { - return Base::retError('权限不足!'); + return Base::retError('权限不足'); } $all = Request::input(); foreach ($all AS $key => $value) { @@ -86,12 +86,12 @@ class SystemController extends AbstractController $user = User::IDE($user['data']); } if (!$user->isAdmin()) { - return Base::retError('权限不足!'); + return Base::retError('权限不足'); } $list = Base::getPostValue('list'); $array = []; if (empty($list) || !is_array($list)) { - return Base::retError('参数错误!'); + return Base::retError('参数错误'); } foreach ($list AS $item) { if (empty($item['name']) || empty($item['color']) || empty($item['days']) || empty($item['priority'])) { @@ -105,7 +105,7 @@ class SystemController extends AbstractController ]; } if (empty($array)) { - return Base::retError('参数为空!'); + return Base::retError('参数为空'); } $setting = Base::setting('priority', $array); } else { @@ -228,7 +228,7 @@ class SystemController extends AbstractController public function imgupload() { if (User::token2userid() === 0) { - return Base::retError('身份失效,等重新登录!'); + return Base::retError('身份失效,等重新登录'); } $scale = [intval(Request::input('width')), intval(Request::input('height'))]; if (!$scale[0] && !$scale[1]) { @@ -277,7 +277,7 @@ class SystemController extends AbstractController public function imgview() { if (User::token2userid() === 0) { - return Base::retError('身份失效,等重新登录!'); + return Base::retError('身份失效,等重新登录'); } $publicPath = "uploads/picture/" . User::token2userid() . "/"; $dirPath = public_path($publicPath); @@ -375,7 +375,7 @@ class SystemController extends AbstractController public function fileupload() { if (User::token2userid() === 0) { - return Base::retError('身份失效,等重新登录!'); + return Base::retError('身份失效,等重新登录'); } $path = "uploads/files/" . User::token2userid() . "/" . date("Ym") . "/"; $image64 = trim(Base::getPostValue('image64')); diff --git a/app/Http/Controllers/Api/UsersController.php b/app/Http/Controllers/Api/UsersController.php index d0a7b8fd..d259aa8c 100755 --- a/app/Http/Controllers/Api/UsersController.php +++ b/app/Http/Controllers/Api/UsersController.php @@ -44,7 +44,7 @@ class UsersController extends AbstractController if ($type == 'reg') { $setting = Base::setting('system'); if ($setting['reg'] == 'close') { - return Base::retError('未开放注册!'); + return Base::retError('未开放注册'); } $user = User::reg($email, $password); if (Base::isError($user)) { @@ -58,15 +58,15 @@ class UsersController extends AbstractController $code = trim(Request::input('code')); $key = trim(Request::input('key')); if (empty($code)) { - return Base::retError('请输入验证码!', ['code' => 'need']); + return Base::retError('请输入验证码', ['code' => 'need']); } if (empty($key)) { if (!Captcha::check($code)) { - return Base::retError('请输入正确的验证码!', ['code' => 'need']); + return Base::retError('请输入正确的验证码', ['code' => 'need']); } } else { if (!Captcha::check_api($code, $key)) { - return Base::retError('请输入正确的验证码!', ['code' => 'need']); + return Base::retError('请输入正确的验证码', ['code' => 'need']); } } } @@ -79,10 +79,10 @@ class UsersController extends AbstractController }; $user = User::whereEmail($email)->first(); if (empty($user)) { - return $retError('账号或密码错误!'); + return $retError('账号或密码错误'); } if ($user->password != Base::md52($password, $user->encrypt)) { - return $retError('账号或密码错误!'); + return $retError('账号或密码错误'); } Cache::forget("code::" . $email); } @@ -223,9 +223,9 @@ class UsersController extends AbstractController $nickname = trim(Request::input('nickname')); if ($nickname) { if (mb_strlen($nickname) < 2) { - return Base::retError('昵称不可以少于2个字!'); + return Base::retError('昵称不可以少于2个字'); } elseif (mb_strlen($nickname) > 20) { - return Base::retError('昵称最多只能设置20个字!'); + return Base::retError('昵称最多只能设置20个字'); } else { $user->nickname = $nickname; } @@ -234,9 +234,9 @@ class UsersController extends AbstractController $profession = trim(Request::input('profession')); if ($profession) { if (mb_strlen($profession) < 2) { - return Base::retError('职位/职称不可以少于2个字!'); + return Base::retError('职位/职称不可以少于2个字'); } elseif (mb_strlen($profession) > 20) { - return Base::retError('职位/职称最多只能设置20个字!'); + return Base::retError('职位/职称最多只能设置20个字'); } else { $user->profession = $profession; } @@ -244,7 +244,7 @@ class UsersController extends AbstractController // $user->save(); User::token($user); - return Base::retSuccess('修改成功!', $user); + return Base::retSuccess('修改成功', $user); } /** @@ -274,26 +274,26 @@ class UsersController extends AbstractController $oldpass = trim(Request::input('oldpass')); $newpass = trim(Request::input('newpass')); if (strlen($newpass) < 6) { - return Base::retError('密码设置不能小于6位数!'); + return Base::retError('密码设置不能小于6位数'); } elseif (strlen($newpass) > 32) { - return Base::retError('密码最多只能设置32位数!'); + return Base::retError('密码最多只能设置32位数'); } if ($oldpass == $newpass) { - return Base::retError('新旧密码一致!'); + return Base::retError('新旧密码一致'); } // if (env("PASSWORD_ADMIN") == 'disabled') { if ($user->userid == 1) { - return Base::retError('当前环境禁止修改密码!'); + return Base::retError('当前环境禁止修改密码'); } } if (env("PASSWORD_OWNER") == 'disabled') { - return Base::retError('当前环境禁止修改密码!'); + return Base::retError('当前环境禁止修改密码'); } // $verify = User::whereUserid($user->userid)->wherePassword(Base::md52($oldpass, User::token2encrypt()))->count(); if (empty($verify)) { - return Base::retError('请填写正确的旧密码!'); + return Base::retError('请填写正确的旧密码'); } // $user->encrypt = Base::generatePassword(6); @@ -301,7 +301,7 @@ class UsersController extends AbstractController $user->changepass = 0; $user->save(); User::token($user); - return Base::retSuccess('修改成功!', $user); + return Base::retSuccess('修改成功', $user); } /** @@ -378,7 +378,7 @@ class UsersController extends AbstractController $array[] = $userid; } if (count($array) > 50) { - return Base::retError(['一次最多只能获取%条数据!', 50]); + return Base::retError(['一次最多只能获取%条数据', 50]); } $retArray = []; foreach ($array AS $id) { diff --git a/app/Models/AbstractModel.php b/app/Models/AbstractModel.php index 1b5e3017..c6fa2030 100644 --- a/app/Models/AbstractModel.php +++ b/app/Models/AbstractModel.php @@ -117,7 +117,7 @@ class AbstractModel extends Model * @param $where * @param array $update 存在时更新的内容 * @param array $insert 不存在时插入的内容,如果没有则插入更新内容 - * @return bool + * @return AbstractModel|\Illuminate\Database\Eloquent\Builder|Model|object|static|null */ public static function updateInsert($where, $update = [], $insert = []) { @@ -128,7 +128,10 @@ class AbstractModel extends Model } elseif ($update) { $row->updateInstance($update); } - return $row->save(); + if (!$row->save()) { + return null; + } + return $row; } /** @@ -154,7 +157,7 @@ class AbstractModel extends Model $result = $closure(); if (is_bool($result)) { if ($result === false) { - throw new \Exception('处理失败!'); // 错误:① 返回faske + throw new \Exception('处理失败'); // 错误:① 返回faske } } elseif ($result) { if (is_string($result)) { @@ -174,7 +177,7 @@ class AbstractModel extends Model } catch (\Throwable $eb) { info($eb); } - return Base::retError($e->getMessage() ?: '处理错误!'); + return Base::retError($e->getMessage() ?: '处理错误'); } } } diff --git a/app/Models/Project.php b/app/Models/Project.php index 85257cdd..8ad7c9eb 100644 --- a/app/Models/Project.php +++ b/app/Models/Project.php @@ -12,6 +12,7 @@ use Illuminate\Database\Eloquent\SoftDeletes; * @property string|null $name 名称 * @property string|null $desc 描述、备注 * @property int|null $userid 创建人 + * @property int|null $dialog_id 聊天会话ID * @property \Illuminate\Support\Carbon|null $created_at * @property \Illuminate\Support\Carbon|null $updated_at * @property \Illuminate\Support\Carbon|null $deleted_at @@ -28,6 +29,7 @@ use Illuminate\Database\Eloquent\SoftDeletes; * @method static \Illuminate\Database\Eloquent\Builder|Project whereCreatedAt($value) * @method static \Illuminate\Database\Eloquent\Builder|Project whereDeletedAt($value) * @method static \Illuminate\Database\Eloquent\Builder|Project whereDesc($value) + * @method static \Illuminate\Database\Eloquent\Builder|Project whereDialogId($value) * @method static \Illuminate\Database\Eloquent\Builder|Project whereId($value) * @method static \Illuminate\Database\Eloquent\Builder|Project whereName($value) * @method static \Illuminate\Database\Eloquent\Builder|Project whereUpdatedAt($value) diff --git a/app/Models/ProjectTask.php b/app/Models/ProjectTask.php index 1572000a..bc206133 100644 --- a/app/Models/ProjectTask.php +++ b/app/Models/ProjectTask.php @@ -39,6 +39,7 @@ use Illuminate\Database\Eloquent\SoftDeletes; * @property-read int|null $task_user_count * @method static \Illuminate\Database\Eloquent\Builder|ProjectTask newModelQuery() * @method static \Illuminate\Database\Eloquent\Builder|ProjectTask newQuery() + * @method static \Illuminate\Database\Query\Builder|ProjectTask onlyTrashed() * @method static \Illuminate\Database\Eloquent\Builder|ProjectTask query() * @method static \Illuminate\Database\Eloquent\Builder|ProjectTask whereArchivedAt($value) * @method static \Illuminate\Database\Eloquent\Builder|ProjectTask whereColumnId($value) @@ -57,6 +58,8 @@ use Illuminate\Database\Eloquent\SoftDeletes; * @method static \Illuminate\Database\Eloquent\Builder|ProjectTask whereStartAt($value) * @method static \Illuminate\Database\Eloquent\Builder|ProjectTask whereUpdatedAt($value) * @method static \Illuminate\Database\Eloquent\Builder|ProjectTask whereUserid($value) + * @method static \Illuminate\Database\Query\Builder|ProjectTask withTrashed() + * @method static \Illuminate\Database\Query\Builder|ProjectTask withoutTrashed() * @mixin \Eloquent */ class ProjectTask extends AbstractModel @@ -212,9 +215,9 @@ class ProjectTask extends AbstractModel } // 标题 if (empty($name)) { - return Base::retError($retPre . '描述不能为空!'); + return Base::retError($retPre . '描述不能为空'); } elseif (mb_strlen($name) > 255) { - return Base::retError($retPre . '描述最多只能设置255个字!'); + return Base::retError($retPre . '描述最多只能设置255个字'); } $task->name = $name; // 时间 @@ -233,7 +236,7 @@ class ProjectTask extends AbstractModel } $owner = $owner ?: User::token2userid(); if (!ProjectUser::whereProjectId($project_id)->whereUserid($owner)->exists()) { - return Base::retError($retPre . '负责人填写错误!'); + return Base::retError($retPre . '负责人填写错误'); } // 创建人 $task->userid = User::token2userid(); diff --git a/app/Models/User.php b/app/Models/User.php index 757fdcef..830c0c19 100644 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -144,16 +144,16 @@ class User extends AbstractModel { //邮箱 if (!Base::isMail($email)) { - return Base::retError('请输入正确的邮箱地址!'); + return Base::retError('请输入正确的邮箱地址'); } if (User::email2userid($email) > 0) { - return Base::retError('邮箱地址已存在!'); + return Base::retError('邮箱地址已存在'); } //密码 if (strlen($password) < 6) { - return Base::retError(['密码设置不能小于%位数!', 6]); + return Base::retError(['密码设置不能小于%位数', 6]); } elseif (strlen($password) > 32) { - return Base::retError(['密码最多只能设置%位数!', 32]); + return Base::retError(['密码最多只能设置%位数', 32]); } //开始注册 $encrypt = Base::generatePassword(6); @@ -287,7 +287,7 @@ class User extends AbstractModel if (!$user) { $authorization = Base::getToken(); if ($authorization) { - return Base::retError('身份已失效,请重新登录!', $user, -1); + return Base::retError('身份已失效,请重新登录', $user, -1); } else { return Base::retError('请登录后继续...', [], -1); } @@ -320,7 +320,7 @@ class User extends AbstractModel && in_array($identity, $user->identity)) { return Base::retSuccess("success"); } - return Base::retError("权限不足!"); + return Base::retError("权限不足"); } /** diff --git a/app/Models/WebSocketDialog.php b/app/Models/WebSocketDialog.php new file mode 100644 index 00000000..71310e74 --- /dev/null +++ b/app/Models/WebSocketDialog.php @@ -0,0 +1,146 @@ + 'group', + 'name' => $name, + 'group_type' => $group_type, + ]); + $dialog->save(); + foreach (is_array($userid) ? $userid : [$userid] as $value) { + if ($value > 0) { + WebSocketDialogUser::createInstance([ + 'dialog_id' => $dialog->id, + 'userid' => $value, + ])->save(); + } + } + return $dialog; + } + + /** + * 加入聊天室 + * @param int $dialog_id 会话ID(即 聊天室ID) + * @param int|array $userid 加入的会员ID或会员ID组 + * @return bool + */ + public static function joinGroup($dialog_id, $userid) + { + $dialog = self::whereId($dialog_id)->whereType('group')->first(); + if (empty($dialog)) { + return false; + } + foreach (is_array($userid) ? $userid : [$userid] as $value) { + if ($value > 0) { + WebSocketDialogUser::createInstance([ + 'dialog_id' => $dialog->id, + 'userid' => $value, + ])->save(); + } + } + return true; + } + + /** + * 退出聊天室 + * @param int $dialog_id 会话ID(即 聊天室ID) + * @param int|array $userid 加入的会员ID或会员ID组 + * @return bool + */ + public static function quitGroup($dialog_id, $userid) + { + if (is_array($userid)) { + WebSocketDialogUser::whereDialogId($dialog_id)->whereIn('userid', $userid)->delete(); + } else { + WebSocketDialogUser::whereDialogId($dialog_id)->whereUserid($userid)->delete(); + } + return true; + } + + /** + * 获取聊天室对话 + * @param int $userid 会员ID + * @param int $dialog_id 会话ID(即 聊天室ID) + * @return self + */ + public static function checkGroupDialog($userid, $dialog_id) + { + if ($userid == 0) { + return self::whereId($dialog_id)->first(); + } else { + return self::select(['web_socket_dialogs.*']) + ->join('web_socket_dialog_users', 'web_socket_dialog_users.dialog_id', '=', 'web_socket_dialogs.id') + ->where('web_socket_dialogs.id', $dialog_id) + ->where('web_socket_dialogs.type', 'group') + ->where('web_socket_dialog_users.userid', $userid) + ->first(); + } + } + + /** + * 获取会员对话(没有自动创建) + * @param int $userid 会员ID + * @param int $userid2 另一个会员ID + * @return self + */ + public static function checkUserDialog($userid, $userid2) + { + $dialogUser = self::select(['web_socket_dialogs.*']) + ->join('web_socket_dialog_users', 'web_socket_dialog_users.dialog_id', '=', 'web_socket_dialogs.id') + ->where('web_socket_dialogs.type', 'user') + ->whereIn('web_socket_dialog_users.userid', [$userid, $userid2]) + ->get(); + if ($dialogUser->count() >= 2) { + return $dialogUser[0]; + } + $dialog = self::createInstance([ + 'type' => 'user', + ]); + $dialog->save(); + WebSocketDialogUser::createInstance([ + 'dialog_id' => $dialog->id, + 'userid' => $userid, + ])->save(); + WebSocketDialogUser::createInstance([ + 'dialog_id' => $dialog->id, + 'userid' => $userid2, + ])->save(); + return $dialog; + } + +} diff --git a/app/Models/WebSocketDialogMsg.php b/app/Models/WebSocketDialogMsg.php new file mode 100644 index 00000000..cf8fe55e --- /dev/null +++ b/app/Models/WebSocketDialogMsg.php @@ -0,0 +1,106 @@ + $sender ?: User::token2userid(), + 'msg' => $msg, + ]); + return AbstractModel::transaction(function () use ($dialog_id, $msg, $dialogMsg) { + $dialog = WebSocketDialog::checkGroupDialog($dialogMsg->userid, $dialog_id); + if (empty($dialog)) { + return Base::retError('不是聊天室成员'); + } + $dialog->last_at = Carbon::now(); + $dialog->save(); + $dialogMsg->dialog_id = $dialog->id; + $dialogMsg->save(); + // + $userids = WebSocketDialogUser::whereDialogId($dialog->id)->where('userid', '!=', $dialogMsg->userid)->pluck('userid'); + if ($userids) { + PushTask::push([ + 'userid' => $userids, + 'msg' => [ + 'type' => 'dialog', + 'data' => $msg, + ] + ]); + } + return Base::retSuccess('发送成功'); + }); + } + + + /** + * 给会员添加并发送消息 + * @param int $userid 接收的会员ID + * @param array $msg 发送的消息 + * @param int $sender 发送的会员ID(默认自己,0为系统) + * @return array|bool + */ + public static function addUserMsg($userid, $msg, $sender = 0) + { + $dialogMsg = self::createInstance([ + 'userid' => $sender ?: User::token2userid(), + 'msg' => $msg, + ]); + return AbstractModel::transaction(function () use ($userid, $msg, $dialogMsg) { + $dialog = WebSocketDialog::checkUserDialog($dialogMsg->userid, $userid); + if (empty($dialog)) { + return Base::retError('创建对话失败'); + } + $dialog->last_at = Carbon::now(); + $dialog->save(); + $dialogMsg->dialog_id = $dialog->id; + $dialogMsg->save(); + // + PushTask::push([ + 'userid' => $userid, + 'msg' => [ + 'type' => 'dialog', + 'data' => $msg, + ] + ]); + return Base::retSuccess('发送成功'); + }); + } + +} diff --git a/app/Models/WebSocketDialogUser.php b/app/Models/WebSocketDialogUser.php new file mode 100644 index 00000000..ba6091d4 --- /dev/null +++ b/app/Models/WebSocketDialogUser.php @@ -0,0 +1,27 @@ +isValid()) { Base::makeDir(public_path($param['path'])); @@ -2192,12 +2192,12 @@ class Base } $extension = strtolower($file->getClientOriginalExtension()); if ($type && is_array($type) && !in_array($extension, $type)) { - return Base::retError(['文件格式错误,限制类型:%!', implode(",", $type)]); + return Base::retError(['文件格式错误,限制类型:%', implode(",", $type)]); } try { $fileSize = $file->getSize(); if ($param['size'] > 0 && $fileSize > $param['size'] * 1024) { - return Base::retError(['文件大小超限,最大限制:%KB!', $param['size']]); + return Base::retError(['文件大小超限,最大限制:%KB', $param['size']]); } } catch (Exception $e) { $fileSize = 0; @@ -2233,7 +2233,7 @@ class Base "ext" => $extension, //文件后缀名 ]; if (!is_file($array['file'])) { - return Base::retError('上传失败!'); + return Base::retError('上传失败'); } //iOS照片颠倒处理 if (in_array($extension, ['jpg', 'jpeg']) && function_exists('exif_read_data')) { diff --git a/app/Services/WebSocketService.php b/app/Services/WebSocketService.php index 92f2192d..b3955d51 100644 --- a/app/Services/WebSocketService.php +++ b/app/Services/WebSocketService.php @@ -65,7 +65,7 @@ class WebSocketService implements WebSocketHandlerInterface $server->push($fd, Base::array2json([ 'type' => 'error', 'data' => [ - 'error' => '会员不存在!' + 'error' => '会员不存在' ], ])); $server->close($fd); diff --git a/resources/assets/js/pages/manage/components/project-list.vue b/resources/assets/js/pages/manage/components/project-list.vue index ac1e3957..16e0559c 100644 --- a/resources/assets/js/pages/manage/components/project-list.vue +++ b/resources/assets/js/pages/manage/components/project-list.vue @@ -41,7 +41,7 @@
-
+
@@ -55,7 +55,7 @@
{{column.name}}
{{column.project_task.length}}
-