no message
This commit is contained in:
parent
ea5478c2fb
commit
81a16c235f
@ -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);
|
||||
}
|
||||
|
@ -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([
|
||||
|
@ -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'));
|
||||
|
@ -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) {
|
||||
|
@ -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() ?: '处理错误');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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)
|
||||
|
@ -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();
|
||||
|
@ -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("权限不足");
|
||||
}
|
||||
|
||||
/**
|
||||
|
146
app/Models/WebSocketDialog.php
Normal file
146
app/Models/WebSocketDialog.php
Normal 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;
|
||||
}
|
||||
|
||||
}
|
106
app/Models/WebSocketDialogMsg.php
Normal file
106
app/Models/WebSocketDialogMsg.php
Normal 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('发送成功');
|
||||
});
|
||||
}
|
||||
|
||||
}
|
27
app/Models/WebSocketDialogUser.php
Normal file
27
app/Models/WebSocketDialogUser.php
Normal 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
|
||||
{
|
||||
|
||||
}
|
@ -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')) {
|
||||
|
@ -65,7 +65,7 @@ class WebSocketService implements WebSocketHandlerInterface
|
||||
$server->push($fd, Base::array2json([
|
||||
'type' => 'error',
|
||||
'data' => [
|
||||
'error' => '会员不存在!'
|
||||
'error' => '会员不存在'
|
||||
],
|
||||
]));
|
||||
$server->close($fd);
|
||||
|
@ -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"></i></div>
|
||||
<div><i class="iconfont"></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)
|
||||
}
|
||||
|
1
resources/assets/sass/app.scss
vendored
1
resources/assets/sass/app.scss
vendored
@ -1,3 +1,4 @@
|
||||
@import "scrollbar";
|
||||
@import "iconfont";
|
||||
@import "loading";
|
||||
@import "main";
|
||||
|
40
resources/assets/sass/scrollbar.scss
vendored
Normal file
40
resources/assets/sass/scrollbar.scss
vendored
Normal 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;
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user