diff --git a/app/Http/Controllers/Api/ProjectController.php b/app/Http/Controllers/Api/ProjectController.php index 365f2dfd..e2d554d1 100755 --- a/app/Http/Controllers/Api/ProjectController.php +++ b/app/Http/Controllers/Api/ProjectController.php @@ -32,11 +32,10 @@ class ProjectController extends AbstractController */ public function lists() { - $user = User::auth(); + User::auth(); // $list = Project::select(Project::projectSelect) - ->join('project_users', 'projects.id', '=', 'project_users.project_id') - ->where('project_users.userid', $user->userid) + ->authData() ->orderByDesc('projects.id') ->paginate(Base::getPaginate(200, 100)); // @@ -50,7 +49,7 @@ class ProjectController extends AbstractController */ public function basic() { - user::auth(); + User::auth(); // $project_id = intval(Request::input('project_id')); // @@ -66,7 +65,7 @@ class ProjectController extends AbstractController */ public function detail() { - $user = User::auth(); + User::auth(); // $project_id = intval(Request::input('project_id')); // @@ -76,9 +75,8 @@ class ProjectController extends AbstractController }]); }, 'projectUser']) ->select(project::projectSelect) - ->join('project_users', 'projects.id', '=', 'project_users.project_id') + ->authData() ->where('projects.id', $project_id) - ->where('project_users.userid', $user->userid) ->first(); if (empty($project)) { return Base::retError('项目不存在或不在成员列表内'); @@ -167,7 +165,7 @@ class ProjectController extends AbstractController */ public function update() { - user::auth(); + User::auth(); // $project_id = intval(Request::input('project_id')); $name = trim(Request::input('name', '')); @@ -208,7 +206,7 @@ class ProjectController extends AbstractController */ public function user() { - user::auth(); + User::auth(); // $project_id = intval(Request::input('project_id')); $userid = Request::input('userid'); @@ -247,7 +245,7 @@ class ProjectController extends AbstractController */ public function transfer() { - user::auth(); + User::auth(); // $project_id = intval(Request::input('project_id')); $owner_userid = intval(Request::input('owner_userid')); @@ -286,7 +284,7 @@ class ProjectController extends AbstractController */ public function sort() { - user::auth(); + User::auth(); // $project_id = intval(Request::input('project_id')); $sort = Base::json2array(Request::input('sort')); @@ -363,7 +361,7 @@ class ProjectController extends AbstractController */ public function delete() { - user::auth(); + User::auth(); // $project_id = intval(Request::input('project_id')); // @@ -384,7 +382,7 @@ class ProjectController extends AbstractController */ public function column__add() { - user::auth(); + User::auth(); // $project_id = intval(Request::input('project_id')); $name = trim(Request::input('name')); @@ -417,7 +415,7 @@ class ProjectController extends AbstractController */ public function column__update() { - $user = User::auth(); + User::auth(); // $data = Request::all(); $column_id = intval($data['column_id']); @@ -428,9 +426,8 @@ class ProjectController extends AbstractController } // 项目 $project = Project::select(project::projectSelect) - ->join('project_users', 'projects.id', '=', 'project_users.project_id') + ->authData() ->where('projects.id', $column->project_id) - ->where('project_users.userid', $user->userid) ->first(); if (empty($project)) { return Base::retError('项目不存在或不在成员列表内'); @@ -456,7 +453,7 @@ class ProjectController extends AbstractController */ public function column__delete() { - $user = User::auth(); + User::auth(); // $column_id = intval(Request::input('column_id')); // 列表 @@ -466,9 +463,8 @@ class ProjectController extends AbstractController } // 项目 $project = Project::select(project::projectSelect) - ->join('project_users', 'projects.id', '=', 'project_users.project_id') + ->authData() ->where('projects.id', $column->project_id) - ->where('project_users.userid', $user->userid) ->first(); if (empty($project)) { return Base::retError('项目不存在或不在成员列表内'); @@ -478,6 +474,30 @@ class ProjectController extends AbstractController return Base::retSuccess('删除成功', $column->toArray()); } + /** + * 任务统计 + */ + public function task__statistics() + { + User::auth(); + + $data = []; + + // 今日待任务 + $between = [ + Carbon::today()->startOfDay(), + Carbon::today()->endOfDay() + ]; + $data['today'] = ProjectTask::authData()->where(function($query) use ($between) { + $query->whereBetween('project_tasks.start_at', $between)->orWhereBetween('project_tasks.end_at', $between); + })->count(); + + // 超期未完成 + $data['overdue'] = ProjectTask::authData()->whereNotNull('project_tasks.end_at')->where('project_tasks.end_at', '<', Carbon::now())->count(); + + return Base::retSuccess('success', $data); + } + /** * 任务列表 * @@ -486,9 +506,9 @@ class ProjectController extends AbstractController */ public function task__lists() { - $user = user::auth(); + User::auth(); // - $builder = ProjectTask::select(ProjectTask::taskSelect); + $builder = ProjectTask::select(ProjectTask::taskSelect)->authData(); // $name = Request::input('name'); $time = Request::input('time'); @@ -509,13 +529,7 @@ class ProjectController extends AbstractController } } // - $list = $builder - ->join('project_task_users', 'project_tasks.id', '=', 'project_task_users.task_pid') - ->whereNull('project_tasks.archived_at') - ->where('project_tasks.parent_id', 0) - ->where('project_task_users.userid', $user->userid) - ->orderByDesc('project_tasks.id') - ->paginate(Base::getPaginate(200, 100)); + $list = $builder->orderByDesc('project_tasks.id')->paginate(Base::getPaginate(200, 100)); // return Base::retSuccess('success', $list); } @@ -527,7 +541,7 @@ class ProjectController extends AbstractController */ public function task__basic() { - user::auth(); + User::auth(); // $task_id = intval(Request::input('task_id')); // @@ -546,7 +560,7 @@ class ProjectController extends AbstractController */ public function task__sublist() { - user::auth(); + User::auth(); // $task_id = intval(Request::input('task_id')); // @@ -563,7 +577,7 @@ class ProjectController extends AbstractController */ public function task__content() { - user::auth(); + User::auth(); // $task_id = intval(Request::input('task_id')); // @@ -579,7 +593,7 @@ class ProjectController extends AbstractController */ public function task__files() { - user::auth(); + User::auth(); // $task_id = intval(Request::input('task_id')); // @@ -602,7 +616,7 @@ class ProjectController extends AbstractController */ public function task__add() { - user::auth(); + User::auth(); parse_str(Request::getContent(), $data); $project_id = intval($data['project_id']); $column_id = $data['column_id']; @@ -658,7 +672,7 @@ class ProjectController extends AbstractController */ public function task__addsub() { - user::auth(); + User::auth(); // $task_id = intval(Request::input('task_id')); $name = Request::input('name'); @@ -699,7 +713,7 @@ class ProjectController extends AbstractController */ public function task__update() { - user::auth(); + User::auth(); // parse_str(Request::getContent(), $data); $task_id = intval($data['task_id']); @@ -796,7 +810,7 @@ class ProjectController extends AbstractController */ public function task__dialog() { - user::auth(); + User::auth(); // $task_id = intval(Request::input('task_id')); // @@ -834,7 +848,7 @@ class ProjectController extends AbstractController */ public function task__archived() { - user::auth(); + User::auth(); // $task_id = intval(Request::input('task_id')); // @@ -855,7 +869,7 @@ class ProjectController extends AbstractController */ public function task__delete() { - user::auth(); + User::auth(); // $task_id = intval(Request::input('task_id')); // @@ -876,7 +890,7 @@ class ProjectController extends AbstractController */ public function log__lists() { - user::auth(); + User::auth(); // $project_id = intval(Request::input('project_id')); $task_id = intval(Request::input('task_id')); diff --git a/app/Models/Project.php b/app/Models/Project.php index cd890831..3f09310a 100644 --- a/app/Models/Project.php +++ b/app/Models/Project.php @@ -3,7 +3,6 @@ namespace App\Models; use App\Exceptions\ApiException; -use App\Module\Base; use App\Tasks\PushTask; use Hhxsv5\LaravelS\Swoole\Task\Task; use Illuminate\Database\Eloquent\SoftDeletes; @@ -33,6 +32,7 @@ use Request; * @property-read int|null $project_log_count * @property-read \Illuminate\Database\Eloquent\Collection|\App\Models\ProjectUser[] $projectUser * @property-read int|null $project_user_count + * @method static \Illuminate\Database\Eloquent\Builder|Project authData($user = null) * @method static \Illuminate\Database\Eloquent\Builder|Project newModelQuery() * @method static \Illuminate\Database\Eloquent\Builder|Project newQuery() * @method static \Illuminate\Database\Query\Builder|Project onlyTrashed() @@ -189,6 +189,20 @@ class Project extends AbstractModel return $this->hasMany(projectUser::class, 'project_id', 'id')->orderBy('id'); } + /** + * 查询自己的项目 + * @param $query + * @param null $user + * @return mixed + */ + public function scopeAuthData($query, $user = null) + { + $user = $user ?: User::auth(); + $query->join('project_users', 'projects.id', '=', 'project_users.project_id') + ->where('project_users.userid', $user->userid); + return $query; + } + /** * 加入项目 * @param int $userid 加入的会员ID @@ -325,9 +339,8 @@ class Project extends AbstractModel public static function userProject($project_id) { $project = Project::select(self::projectSelect) - ->join('project_users', 'projects.id', '=', 'project_users.project_id') + ->authData() ->where('projects.id', intval($project_id)) - ->where('project_users.userid', User::token2userid()) ->first(); if (empty($project)) { throw new ApiException('项目不存在或不在成员列表内'); diff --git a/app/Models/ProjectTask.php b/app/Models/ProjectTask.php index deeeb421..6dafd4d0 100644 --- a/app/Models/ProjectTask.php +++ b/app/Models/ProjectTask.php @@ -50,6 +50,7 @@ use Request; * @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 authData($user = null) * @method static \Illuminate\Database\Eloquent\Builder|ProjectTask newModelQuery() * @method static \Illuminate\Database\Eloquent\Builder|ProjectTask newQuery() * @method static \Illuminate\Database\Query\Builder|ProjectTask onlyTrashed() @@ -246,6 +247,22 @@ class ProjectTask extends AbstractModel return $this->hasMany(projectTaskTag::class, 'task_id', 'id')->orderBy('id'); } + /** + * 查询自己的任务 + * @param $query + * @param null $user + * @return mixed + */ + public function scopeAuthData($query, $user = null) + { + $user = $user ?: User::auth(); + $query->join('project_task_users', 'project_tasks.id', '=', 'project_task_users.task_pid') + ->whereNull('project_tasks.archived_at') + ->where('project_tasks.parent_id', 0) + ->where('project_task_users.userid', $user->userid); + return $query; + } + /** * 添加任务 * @param $data @@ -669,9 +686,8 @@ class ProjectTask extends AbstractModel } // $project = Project::select(Project::projectSelect) - ->join('project_users', 'projects.id', '=', 'project_users.project_id') + ->authData() ->where('projects.id', $task->project_id) - ->where('project_users.userid', User::token2userid()) ->first(); if (empty($project)) { throw new ApiException('项目不存在或不在成员列表内'); diff --git a/resources/assets/js/pages/manage.vue b/resources/assets/js/pages/manage.vue index a610cd87..20376fcd 100644 --- a/resources/assets/js/pages/manage.vue +++ b/resources/assets/js/pages/manage.vue @@ -170,7 +170,14 @@ export default { }, computed: { - ...mapState(['userId', 'userInfo', 'dialogMsgUnread', 'projectList', 'projectOpenTask', 'projectChatShow']), + ...mapState([ + 'userId', + 'userInfo', + 'dialogMsgUnread', + 'projectList', + 'projectOpenTask', + 'projectChatShow' + ]), }, watch: { diff --git a/resources/assets/js/pages/manage/components/TaskRow.vue b/resources/assets/js/pages/manage/components/TaskRow.vue index 20fa3a92..59761c0b 100644 --- a/resources/assets/js/pages/manage/components/TaskRow.vue +++ b/resources/assets/js/pages/manage/components/TaskRow.vue @@ -5,7 +5,7 @@ @@ -86,7 +86,7 @@ v-if="item[openName]===true" :list="item.sub_task" :parent-id="item.id" - :fast-add-task="fastAddTask" + :fast-add-task="item.parent_id===0 && fastAddTask" :color-list="colorList" :open-key="openKey" @command="dropTask"/> diff --git a/resources/assets/js/pages/manage/dashboard.vue b/resources/assets/js/pages/manage/dashboard.vue index 94a7f093..23f50e36 100644 --- a/resources/assets/js/pages/manage/dashboard.vue +++ b/resources/assets/js/pages/manage/dashboard.vue @@ -1,14 +1,67 @@ diff --git a/resources/assets/sass/iconfont.scss b/resources/assets/sass/iconfont.scss index 82cf5e15..ea62a544 100644 --- a/resources/assets/sass/iconfont.scss +++ b/resources/assets/sass/iconfont.scss @@ -1,8 +1,8 @@ @font-face { font-family: 'iconfont'; /* Project id 2583385 */ - src: url('//at.alicdn.com/t/font_2583385_cz486uauxcg.woff2?t=1623761047200') format('woff2'), - url('//at.alicdn.com/t/font_2583385_cz486uauxcg.woff?t=1623761047200') format('woff'), - url('//at.alicdn.com/t/font_2583385_cz486uauxcg.ttf?t=1623761047200') format('truetype'); + src: url('//at.alicdn.com/t/font_2583385_s933tffef1.woff2?t=1624075007364') format('woff2'), + url('//at.alicdn.com/t/font_2583385_s933tffef1.woff?t=1624075007364') format('woff'), + url('//at.alicdn.com/t/font_2583385_s933tffef1.ttf?t=1624075007364') format('truetype'); } .iconfont { diff --git a/resources/assets/sass/pages/page-dashboard.scss b/resources/assets/sass/pages/page-dashboard.scss index f5c4229c..b853d8a6 100644 --- a/resources/assets/sass/pages/page-dashboard.scss +++ b/resources/assets/sass/pages/page-dashboard.scss @@ -1,4 +1,124 @@ .page-dashboard { + width: 100%; + height: 100%; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + .dashboard-wrapper { + width: 664px; + max-width: 80%; + max-height: 90%; + display: flex; + flex-direction: column; + .dashboard-hello { + padding: 0 12px; + color: #333333; + font-size: 24px; + font-weight: 600; + } + .dashboard-desc { + margin-top: 18px; + padding: 0 12px; + color: #888888; + font-size: 13px; + } + .dashboard-block { + margin-top: 18px; + padding: 0 12px; + display: flex; + > li { + flex: 1; + flex-shrink: 0; + list-style: none; + margin-right: 24px; + border-radius: 8px; + padding: 16px 24px; + background-color: #fa8e8c; + display: flex; + flex-direction: column; + justify-content: center; + cursor: pointer; + transition: box-shadow 0.3s; + &:hover { + box-shadow: 0 0 10px #cccccc; + } + &:first-child { + background-color: #6f9ef6; + } + &:last-child { + background-color: #98de6e; + margin-right: 0; + cursor: default; + box-shadow: none; + } + .block-title { + color: rgba(255, 255, 255, 0.6); + font-size: 12px; + } + .block-data { + display: flex; + align-items: center; + padding-top: 10px; + line-height: 1; + .block-num { + flex: 1; + color: #ffffff; + font-weight: 600; + font-size: 32px; + } + .iconfont { + color: rgba(255, 255, 255, 0.7); + font-size: 20px; + } + } + } + } + .dashboard-title { + margin-top: 60px; + padding: 0 12px; + font-weight: 600; + font-size: 15px; + } + .dashboard-list { + margin-top: 4px; + padding: 0 12px; + overflow: auto; + > li { + list-style: none; + display: flex; + background: #F9FAFB; + margin-top: 12px; + padding: 8px 12px; + border-radius: 6px; + cursor: pointer; + transition: box-shadow 0.3s; + &:hover { + box-shadow: 0 0 6px #dfdfdf; + } + &:last-child { + margin-bottom: 12px; + } + .iconfont { + color: #bbbbbb; + font-size: 18px; + flex-shrink: 0; + width: 22px; + height: 22px; + line-height: 22px; + } + .item-title { + flex: 1; + padding-left: 6px; + line-height: 22px; + } + .item-time { + padding-left: 12px; + flex-shrink: 0; + } + } + } + } .nopage { width: 100%; height: 100%;