no message

This commit is contained in:
kuaifan 2021-06-04 16:01:22 +08:00
parent ea5478c2fb
commit 81a16c235f
16 changed files with 409 additions and 72 deletions

View File

@ -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);
}

View File

@ -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([

View File

@ -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'));

View File

@ -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) {

View File

@ -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() ?: '处理错误');
}
}
}

View File

@ -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)

View File

@ -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();

View File

@ -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("权限不足");
}
/**

View File

@ -0,0 +1,146 @@
<?php
namespace App\Models;
/**
* Class WebSocketDialog
*
* @package App\Models
* @property int $id
* @property string|null $type 对话类型
* @property string|null $group_type 聊天室类型
* @property string|null $name 对话名称
* @property string|null $last_at 最后消息时间
* @property \Illuminate\Support\Carbon|null $created_at
* @property \Illuminate\Support\Carbon|null $updated_at
* @method static \Illuminate\Database\Eloquent\Builder|WebSocketDialog newModelQuery()
* @method static \Illuminate\Database\Eloquent\Builder|WebSocketDialog newQuery()
* @method static \Illuminate\Database\Eloquent\Builder|WebSocketDialog query()
* @method static \Illuminate\Database\Eloquent\Builder|WebSocketDialog whereCreatedAt($value)
* @method static \Illuminate\Database\Eloquent\Builder|WebSocketDialog whereGroupType($value)
* @method static \Illuminate\Database\Eloquent\Builder|WebSocketDialog whereId($value)
* @method static \Illuminate\Database\Eloquent\Builder|WebSocketDialog whereLastAt($value)
* @method static \Illuminate\Database\Eloquent\Builder|WebSocketDialog whereName($value)
* @method static \Illuminate\Database\Eloquent\Builder|WebSocketDialog whereType($value)
* @method static \Illuminate\Database\Eloquent\Builder|WebSocketDialog whereUpdatedAt($value)
* @mixin \Eloquent
*/
class WebSocketDialog extends AbstractModel
{
/**
* 创建聊天室
* @param string $name 聊天室名称
* @param int|array $userid 加入的会员ID或会员ID组
* @param string $group_type 聊天室类型
* @return self
*/
public static function createGroup($name, $userid, $group_type = '')
{
$dialog = self::createInstance([
'type' => '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;
}
}

View File

@ -0,0 +1,106 @@
<?php
namespace App\Models;
use App\Module\Base;
use App\Tasks\PushTask;
use Carbon\Carbon;
/**
* Class WebSocketDialogMsg
*
* @package App\Models
* @property int $id
* @property int|null $dialog_id 对话ID
* @property int|null $userid 发送会员ID
* @property string|null $msg 详细消息
* @property int|null $send 是否已送达
* @property \Illuminate\Support\Carbon|null $created_at
* @property \Illuminate\Support\Carbon|null $updated_at
* @method static \Illuminate\Database\Eloquent\Builder|WebSocketDialogMsg newModelQuery()
* @method static \Illuminate\Database\Eloquent\Builder|WebSocketDialogMsg newQuery()
* @method static \Illuminate\Database\Eloquent\Builder|WebSocketDialogMsg query()
* @method static \Illuminate\Database\Eloquent\Builder|WebSocketDialogMsg whereCreatedAt($value)
* @method static \Illuminate\Database\Eloquent\Builder|WebSocketDialogMsg whereDialogId($value)
* @method static \Illuminate\Database\Eloquent\Builder|WebSocketDialogMsg whereId($value)
* @method static \Illuminate\Database\Eloquent\Builder|WebSocketDialogMsg whereMsg($value)
* @method static \Illuminate\Database\Eloquent\Builder|WebSocketDialogMsg whereSend($value)
* @method static \Illuminate\Database\Eloquent\Builder|WebSocketDialogMsg whereUpdatedAt($value)
* @method static \Illuminate\Database\Eloquent\Builder|WebSocketDialogMsg whereUserid($value)
* @mixin \Eloquent
*/
class WebSocketDialogMsg extends AbstractModel
{
/**
* 给会员添加并发送消息
* @param int $dialog_id 会话ID 聊天室ID
* @param array $msg 发送的消息
* @param int $sender 发送的会员ID默认自己0为系统
* @return array|bool
*/
public static function addGroupMsg($dialog_id, $msg, $sender = 0)
{
$dialogMsg = self::createInstance([
'userid' => $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('发送成功');
});
}
}

View File

@ -0,0 +1,27 @@
<?php
namespace App\Models;
/**
* Class WebSocketDialogUser
*
* @package App\Models
* @property int $id
* @property int|null $dialog_id 对话ID
* @property int|null $userid 会员ID
* @property \Illuminate\Support\Carbon|null $created_at
* @property \Illuminate\Support\Carbon|null $updated_at
* @method static \Illuminate\Database\Eloquent\Builder|WebSocketDialogUser newModelQuery()
* @method static \Illuminate\Database\Eloquent\Builder|WebSocketDialogUser newQuery()
* @method static \Illuminate\Database\Eloquent\Builder|WebSocketDialogUser query()
* @method static \Illuminate\Database\Eloquent\Builder|WebSocketDialogUser whereCreatedAt($value)
* @method static \Illuminate\Database\Eloquent\Builder|WebSocketDialogUser whereDialogId($value)
* @method static \Illuminate\Database\Eloquent\Builder|WebSocketDialogUser whereId($value)
* @method static \Illuminate\Database\Eloquent\Builder|WebSocketDialogUser whereUpdatedAt($value)
* @method static \Illuminate\Database\Eloquent\Builder|WebSocketDialogUser whereUserid($value)
* @mixin \Eloquent
*/
class WebSocketDialogUser extends AbstractModel
{
}

View File

@ -2052,7 +2052,7 @@ class Base
if (preg_match('/^(data:\s*image\/(\w+);base64,)/', $imgBase64, $res)) {
$extension = $res[2];
if (!in_array($extension, ['png', 'jpg', 'jpeg', 'gif'])) {
return Base::retError('图片格式错误');
return Base::retError('图片格式错误');
}
$scaleName = "";
if ($param['fileName']) {
@ -2133,7 +2133,7 @@ class Base
return Base::retSuccess('success', $array);
}
}
return Base::retError('图片保存失败');
return Base::retError('图片保存失败');
}
/**
@ -2145,7 +2145,7 @@ class Base
{
$file = $param['file'];
if (empty($file)) {
return Base::retError("您没有选择要上传的文件");
return Base::retError("您没有选择要上传的文件");
}
if ($file->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')) {

View File

@ -65,7 +65,7 @@ class WebSocketService implements WebSocketHandlerInterface
$server->push($fd, Base::array2json([
'type' => 'error',
'data' => [
'error' => '会员不存在'
'error' => '会员不存在'
],
]));
$server->close($fd);

View File

@ -41,7 +41,7 @@
</li>
</ul>
<div class="project-switch">
<div :class="['project-switch-button', $store.state.projectListPanel ? 'menu' : '']" @click="$store.commit('toggleBoolean', 'projectListPanel')">
<div :class="['project-switch-button', !$store.state.projectListPanel ? 'menu' : '']" @click="$store.commit('toggleBoolean', 'projectListPanel')">
<div><i class="iconfont">&#xe60c;</i></div>
<div><i class="iconfont">&#xe66a;</i></div>
</div>
@ -55,7 +55,7 @@
<div class="column-head-title">{{column.name}}</div>
<div :class="['column-head-num', column.project_task.length > 0 ? 'have' : '']">{{column.project_task.length}}</div>
</div>
<ul>
<ul class="overlay-y">
<li v-for="item in panelTask(column.project_task)">
<div :class="['task-head', item.desc ? 'has-desc' : '']">
<div class="task-title"><pre>{{item.name}}</pre></div>
@ -500,7 +500,8 @@
> ul {
flex: 1;
height: 0;
overflow: auto;
overflow-x: hidden;
overflow-y: auto;
> li {
list-style: none;
margin: 0 10px 16px;
@ -918,8 +919,10 @@ export default {
const {nowTime} = this;
return function (date) {
let time = Math.round(new Date(date).getTime() / 1000) - nowTime;
if (time > 0 && time < 86400 * 4) {
if (time < 86400 * 4 && time > 0 ) {
return this.formatSeconds(time);
} else if (time <= 0) {
return '-' + this.formatSeconds(time * -1);
}
return this.formatTime(date)
}

View File

@ -1,3 +1,4 @@
@import "scrollbar";
@import "iconfont";
@import "loading";
@import "main";

40
resources/assets/sass/scrollbar.scss vendored Normal file
View File

@ -0,0 +1,40 @@
/* 滚动条美化 */
::-webkit-scrollbar {
width: 6px;
height: 0;
}
/*滚动条滑块隐藏*/
::-webkit-scrollbar-thumb {
border-radius: 10px;
background: rgba(0, 0, 0, 0);
}
/*按下滚动条,颜色加深*/
::-webkit-scrollbar-thumb:active {
border-radius: 10px;
background: rgba(0, 0, 0, .5);
}
/*鼠标浮到容器上,让该容器的滚动条滑块显示*/
:hover::-webkit-scrollbar-thumb {
background: rgba(0, 0, 0, .2);
}
/*滚动条轨道*/
::-webkit-scrollbar-track {
border-radius: 10px;
background: rgba(0, 0, 0, 0);
}
.overlay-x {
overflow: overlay !important;
}
.overlay-x {
overflow-x: overlay !important;
}
.overlay-y {
overflow-y: overlay !important;
}