diff --git a/app/Http/Controllers/Api/ProjectController.php b/app/Http/Controllers/Api/ProjectController.php
index 125f1c90..84e1a678 100755
--- a/app/Http/Controllers/Api/ProjectController.php
+++ b/app/Http/Controllers/Api/ProjectController.php
@@ -109,6 +109,9 @@ class ProjectController extends AbstractController
} elseif (mb_strlen($name) > 32) {
return Base::retError('项目名称最多只能设置32个字!');
}
+ if (mb_strlen($desc) > 255) {
+ return Base::retError('项目描述最多只能设置255个字!');
+ }
//流程
$columns = Request::input('columns');
if (!is_array($columns)) $columns = [];
@@ -158,6 +161,136 @@ class ProjectController extends AbstractController
});
}
+ /**
+ * 修改项目
+ *
+ * @apiParam {Number} project_id 项目ID
+ * @apiParam {String} name 项目名称
+ * @apiParam {String} [desc] 项目描述
+ */
+ public function edit()
+ {
+ $user = User::authE();
+ if (Base::isError($user)) {
+ return $user;
+ } else {
+ $user = User::IDE($user['data']);
+ }
+ //
+ $project_id = intval(Request::input('project_id'));
+ $name = trim(Request::input('name', ''));
+ $desc = trim(Request::input('desc', ''));
+ if (mb_strlen($name) < 2) {
+ return Base::retError('项目名称不可以少于2个字!');
+ } elseif (mb_strlen($name) > 32) {
+ return Base::retError('项目名称最多只能设置32个字!');
+ }
+ if (mb_strlen($desc) > 255) {
+ return Base::retError('项目描述最多只能设置255个字!');
+ }
+ //
+ $project = Project::select($this->projectSelect)
+ ->join('project_users', 'projects.id', '=', 'project_users.project_id')
+ ->where('projects.id', $project_id)
+ ->where('project_users.userid', $user->userid)
+ ->first();
+ if (empty($project)) {
+ return Base::retError('项目不存在或不在成员列表内!');
+ }
+ if (!$project->owner) {
+ return Base::retError('你不是项目负责人!');
+ }
+ //
+ $project->name = $name;
+ $project->desc = $desc;
+ $project->save();
+ //
+ return Base::retSuccess('修改成功');
+ }
+
+ /**
+ * 移交项目
+ *
+ * @apiParam {Number} project_id 项目ID
+ * @apiParam {Number} owner_userid 新的项目负责人ID
+ */
+ public function transfer()
+ {
+ $user = User::authE();
+ if (Base::isError($user)) {
+ return $user;
+ } else {
+ $user = User::IDE($user['data']);
+ }
+ //
+ $project_id = intval(Request::input('project_id'));
+ $owner_userid = intval(Request::input('owner_userid'));
+ //
+ $project = Project::select($this->projectSelect)
+ ->join('project_users', 'projects.id', '=', 'project_users.project_id')
+ ->where('projects.id', $project_id)
+ ->where('project_users.userid', $user->userid)
+ ->first();
+ if (empty($project)) {
+ return Base::retError('项目不存在或不在成员列表内!');
+ }
+ if (!$project->owner) {
+ return Base::retError('你不是项目负责人!');
+ }
+ //
+ if (!User::whereUserid($owner_userid)->exists()) {
+ return Base::retError('会员不存在!');
+ }
+ //
+ return AbstractModel::transaction(function() use ($owner_userid, $project) {
+ ProjectUser::whereProjectId($project->id)->update(['owner' => 0]);
+ ProjectUser::updateInsert([
+ 'project_id' => $project->id,
+ 'userid' => $owner_userid,
+ ], [
+ 'owner' => 1,
+ ]);
+ //
+ return Base::retSuccess('移交成功');
+ });
+ }
+
+ /**
+ * 删除项目
+ *
+ * @apiParam {Number} project_id 项目ID
+ */
+ public function delete()
+ {
+ $user = User::authE();
+ if (Base::isError($user)) {
+ return $user;
+ } else {
+ $user = User::IDE($user['data']);
+ }
+ //
+ $project_id = intval(Request::input('project_id'));
+ //
+ $project = Project::select($this->projectSelect)
+ ->join('project_users', 'projects.id', '=', 'project_users.project_id')
+ ->where('projects.id', $project_id)
+ ->where('project_users.userid', $user->userid)
+ ->first();
+ if (empty($project)) {
+ return Base::retError('项目不存在或不在成员列表内!');
+ }
+ if (!$project->owner) {
+ return Base::retError('你不是项目负责人!');
+ }
+ //
+ return AbstractModel::transaction(function() use ($project) {
+ ProjectTask::whereProjectId($project->id)->delete();
+ $project->delete();
+ //
+ return Base::retSuccess('删除成功');
+ });
+ }
+
/**
* {post}【任务】添加任务
*
@@ -184,6 +317,9 @@ class ProjectController extends AbstractController
$times = Base::getPostValue('times');
$owner = Base::getPostValue('owner');
$subtasks = Base::getPostValue('subtasks');
+ $p_level = Base::getPostValue('p_level');
+ $p_name = Base::getPostValue('p_name');
+ $p_color = Base::getPostValue('p_color');
// 项目
$project = Project::select($this->projectSelect)
->join('project_users', 'projects.id', '=', 'project_users.project_id')
@@ -191,7 +327,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)) {
@@ -224,6 +360,9 @@ class ProjectController extends AbstractController
'times' => $times,
'owner' => $owner,
'subtasks' => $subtasks,
+ 'p_level' => $p_level,
+ 'p_name' => $p_name,
+ 'p_color' => $p_color,
]);
}
}
diff --git a/app/Http/Controllers/Api/SystemController.php b/app/Http/Controllers/Api/SystemController.php
index 88206ec0..881d1235 100755
--- a/app/Http/Controllers/Api/SystemController.php
+++ b/app/Http/Controllers/Api/SystemController.php
@@ -62,6 +62,59 @@ class SystemController extends AbstractController
return Base::retSuccess('success', $setting ?: json_decode('{}'));
}
+ /**
+ * @api {post} api/system/priority 01. 获取优先级、保存优先级
+ *
+ * @apiVersion 1.0.0
+ * @apiGroup system
+ * @apiName priority
+ *
+ * @apiParam {Array} list 优先级数据,格式:[{name,color,days,priority}]
+ *
+ * @apiSuccess {Number} ret 返回状态码(1正确、0错误)
+ * @apiSuccess {String} msg 返回信息(错误描述)
+ * @apiSuccess {Object} data 返回数据
+ */
+ public function priority()
+ {
+ $type = trim(Request::input('type'));
+ if ($type == 'save') {
+ $user = User::authE();
+ if (Base::isError($user)) {
+ return $user;
+ } else {
+ $user = User::IDE($user['data']);
+ }
+ if (!$user->isAdmin()) {
+ return Base::retError('权限不足!');
+ }
+ $list = Base::getPostValue('list');
+ $array = [];
+ if (empty($list) || !is_array($list)) {
+ return Base::retError('参数错误!');
+ }
+ foreach ($list AS $item) {
+ if (empty($item['name']) || empty($item['color']) || empty($item['days']) || empty($item['priority'])) {
+ continue;
+ }
+ $array[] = [
+ 'name' => $item['name'],
+ 'color' => $item['color'],
+ 'days' => intval($item['days']),
+ 'priority' => intval($item['priority']),
+ ];
+ }
+ if (empty($array)) {
+ return Base::retError('参数为空!');
+ }
+ $setting = Base::setting('priority', $array);
+ } else {
+ $setting = Base::setting('priority');
+ }
+ //
+ return Base::retSuccess('success', $setting);
+ }
+
/**
* @api {get} api/system/get/info 02. 获取终端详细信息
*
diff --git a/app/Http/Middleware/VerifyCsrfToken.php b/app/Http/Middleware/VerifyCsrfToken.php
index 52064db3..cd3a95c8 100644
--- a/app/Http/Middleware/VerifyCsrfToken.php
+++ b/app/Http/Middleware/VerifyCsrfToken.php
@@ -12,12 +12,15 @@ class VerifyCsrfToken extends Middleware
* @var array
*/
protected $except = [
- //上传图片
+ // 上传图片
'api/system/imgupload/',
- //上传文件
+ // 上传文件
'api/system/fileupload/',
+ // 保存任务优先级
+ 'api/system/priority/',
+
// 添加任务
'api/project/task/add/',
];
diff --git a/app/Models/ProjectTask.php b/app/Models/ProjectTask.php
index 1c7a750b..1572000a 100644
--- a/app/Models/ProjectTask.php
+++ b/app/Models/ProjectTask.php
@@ -4,6 +4,7 @@ namespace App\Models;
use App\Module\Base;
use Carbon\Carbon;
+use Illuminate\Database\Eloquent\SoftDeletes;
/**
* Class ProjectTask
@@ -20,15 +21,20 @@ use Carbon\Carbon;
* @property string|null $archived_at 归档时间
* @property string|null $complete_at 完成时间
* @property int|null $userid 创建人
+ * @property int|null $p_level 优先级
+ * @property string|null $p_name 优先级名称
+ * @property string|null $p_color 优先级颜色
* @property \Illuminate\Support\Carbon|null $created_at
* @property \Illuminate\Support\Carbon|null $updated_at
* @property \Illuminate\Support\Carbon|null $deleted_at
* @property-read int $file_num
* @property-read int $msg_num
- * @property-read int $sub_num
* @property-read bool $overdue
* @property-read int $percent
+ * @property-read int $sub_num
* @property-read bool $today
+ * @property-read \Illuminate\Database\Eloquent\Collection|\App\Models\ProjectTaskTag[] $taskTag
+ * @property-read int|null $task_tag_count
* @property-read \Illuminate\Database\Eloquent\Collection|\App\Models\ProjectTaskUser[] $taskUser
* @property-read int|null $task_user_count
* @method static \Illuminate\Database\Eloquent\Builder|ProjectTask newModelQuery()
@@ -43,17 +49,19 @@ use Carbon\Carbon;
* @method static \Illuminate\Database\Eloquent\Builder|ProjectTask whereEndAt($value)
* @method static \Illuminate\Database\Eloquent\Builder|ProjectTask whereId($value)
* @method static \Illuminate\Database\Eloquent\Builder|ProjectTask whereName($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|ProjectTask wherePColor($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|ProjectTask wherePLevel($value)
+ * @method static \Illuminate\Database\Eloquent\Builder|ProjectTask wherePName($value)
* @method static \Illuminate\Database\Eloquent\Builder|ProjectTask whereParentId($value)
* @method static \Illuminate\Database\Eloquent\Builder|ProjectTask whereProjectId($value)
* @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)
* @mixin \Eloquent
- * @property-read \Illuminate\Database\Eloquent\Collection|\App\Models\ProjectTaskTag[] $taskTag
- * @property-read int|null $task_tag_count
*/
class ProjectTask extends AbstractModel
{
+ use SoftDeletes;
protected $appends = [
'file_num',
@@ -187,20 +195,26 @@ class ProjectTask extends AbstractModel
$times = $params['times'];
$owner = $params['owner'];
$subtasks = $params['subtasks'];
+ $p_level = intval($params['p_level']);
+ $p_name = $params['p_name'];
+ $p_color = $params['p_color'];
//
$retPre = $parent_id ? '子任务' : '任务';
$task = self::createInstance();
$task->parent_id = $parent_id;
$task->project_id = $project_id;
$task->column_id = $column_id;
+ $task->p_level = $p_level;
+ $task->p_name = $p_name;
+ $task->p_color = $p_color;
if ($content) {
$task->desc = Base::getHtml($content);
}
// 标题
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;
// 时间
@@ -246,6 +260,9 @@ class ProjectTask extends AbstractModel
$subtask['parent_id'] = $task->id;
$subtask['project_id'] = $task->project_id;
$subtask['column_id'] = $task->column_id;
+ $subtask['p_level'] = $task->p_level;
+ $subtask['p_name'] = $task->p_name;
+ $subtask['p_color'] = $task->p_color;
$res = self::addTask($subtask);
if (Base::isError($res)) {
return $res;
diff --git a/app/Models/User.php b/app/Models/User.php
index 245577ef..757fdcef 100644
--- a/app/Models/User.php
+++ b/app/Models/User.php
@@ -69,7 +69,7 @@ class User extends AbstractModel
parent::updateInstance($param);
//
if (isset($param['line_at']) && $this->userid) {
- Cache::put("User::online:" . $this->userid, time(), Carbon::now()->addSeconds(30));
+ Cache::put("User::online:" . $this->userid, time(), Carbon::now()->addSeconds(60));
}
}
diff --git a/resources/assets/js/components/UserAvatar.vue b/resources/assets/js/components/UserAvatar.vue
index 452a5ad9..07fb1d6b 100755
--- a/resources/assets/js/components/UserAvatar.vue
+++ b/resources/assets/js/components/UserAvatar.vue
@@ -2,8 +2,11 @@
{{$L('昵称')}}: {{user.nickname}} {{$L('职位/职称')}}: {{user.profession || '-'}}
{{item.name}}