no message

This commit is contained in:
kuaifan 2021-06-19 16:51:26 +08:00
parent 921be40c64
commit 570583bafd
8 changed files with 279 additions and 53 deletions

View File

@ -32,11 +32,10 @@ class ProjectController extends AbstractController
*/ */
public function lists() public function lists()
{ {
$user = User::auth(); User::auth();
// //
$list = Project::select(Project::projectSelect) $list = Project::select(Project::projectSelect)
->join('project_users', 'projects.id', '=', 'project_users.project_id') ->authData()
->where('project_users.userid', $user->userid)
->orderByDesc('projects.id') ->orderByDesc('projects.id')
->paginate(Base::getPaginate(200, 100)); ->paginate(Base::getPaginate(200, 100));
// //
@ -50,7 +49,7 @@ class ProjectController extends AbstractController
*/ */
public function basic() public function basic()
{ {
user::auth(); User::auth();
// //
$project_id = intval(Request::input('project_id')); $project_id = intval(Request::input('project_id'));
// //
@ -66,7 +65,7 @@ class ProjectController extends AbstractController
*/ */
public function detail() public function detail()
{ {
$user = User::auth(); User::auth();
// //
$project_id = intval(Request::input('project_id')); $project_id = intval(Request::input('project_id'));
// //
@ -76,9 +75,8 @@ class ProjectController extends AbstractController
}]); }]);
}, 'projectUser']) }, 'projectUser'])
->select(project::projectSelect) ->select(project::projectSelect)
->join('project_users', 'projects.id', '=', 'project_users.project_id') ->authData()
->where('projects.id', $project_id) ->where('projects.id', $project_id)
->where('project_users.userid', $user->userid)
->first(); ->first();
if (empty($project)) { if (empty($project)) {
return Base::retError('项目不存在或不在成员列表内'); return Base::retError('项目不存在或不在成员列表内');
@ -167,7 +165,7 @@ class ProjectController extends AbstractController
*/ */
public function update() public function update()
{ {
user::auth(); User::auth();
// //
$project_id = intval(Request::input('project_id')); $project_id = intval(Request::input('project_id'));
$name = trim(Request::input('name', '')); $name = trim(Request::input('name', ''));
@ -208,7 +206,7 @@ class ProjectController extends AbstractController
*/ */
public function user() public function user()
{ {
user::auth(); User::auth();
// //
$project_id = intval(Request::input('project_id')); $project_id = intval(Request::input('project_id'));
$userid = Request::input('userid'); $userid = Request::input('userid');
@ -247,7 +245,7 @@ class ProjectController extends AbstractController
*/ */
public function transfer() public function transfer()
{ {
user::auth(); User::auth();
// //
$project_id = intval(Request::input('project_id')); $project_id = intval(Request::input('project_id'));
$owner_userid = intval(Request::input('owner_userid')); $owner_userid = intval(Request::input('owner_userid'));
@ -286,7 +284,7 @@ class ProjectController extends AbstractController
*/ */
public function sort() public function sort()
{ {
user::auth(); User::auth();
// //
$project_id = intval(Request::input('project_id')); $project_id = intval(Request::input('project_id'));
$sort = Base::json2array(Request::input('sort')); $sort = Base::json2array(Request::input('sort'));
@ -363,7 +361,7 @@ class ProjectController extends AbstractController
*/ */
public function delete() public function delete()
{ {
user::auth(); User::auth();
// //
$project_id = intval(Request::input('project_id')); $project_id = intval(Request::input('project_id'));
// //
@ -384,7 +382,7 @@ class ProjectController extends AbstractController
*/ */
public function column__add() public function column__add()
{ {
user::auth(); User::auth();
// //
$project_id = intval(Request::input('project_id')); $project_id = intval(Request::input('project_id'));
$name = trim(Request::input('name')); $name = trim(Request::input('name'));
@ -417,7 +415,7 @@ class ProjectController extends AbstractController
*/ */
public function column__update() public function column__update()
{ {
$user = User::auth(); User::auth();
// //
$data = Request::all(); $data = Request::all();
$column_id = intval($data['column_id']); $column_id = intval($data['column_id']);
@ -428,9 +426,8 @@ class ProjectController extends AbstractController
} }
// 项目 // 项目
$project = Project::select(project::projectSelect) $project = Project::select(project::projectSelect)
->join('project_users', 'projects.id', '=', 'project_users.project_id') ->authData()
->where('projects.id', $column->project_id) ->where('projects.id', $column->project_id)
->where('project_users.userid', $user->userid)
->first(); ->first();
if (empty($project)) { if (empty($project)) {
return Base::retError('项目不存在或不在成员列表内'); return Base::retError('项目不存在或不在成员列表内');
@ -456,7 +453,7 @@ class ProjectController extends AbstractController
*/ */
public function column__delete() public function column__delete()
{ {
$user = User::auth(); User::auth();
// //
$column_id = intval(Request::input('column_id')); $column_id = intval(Request::input('column_id'));
// 列表 // 列表
@ -466,9 +463,8 @@ class ProjectController extends AbstractController
} }
// 项目 // 项目
$project = Project::select(project::projectSelect) $project = Project::select(project::projectSelect)
->join('project_users', 'projects.id', '=', 'project_users.project_id') ->authData()
->where('projects.id', $column->project_id) ->where('projects.id', $column->project_id)
->where('project_users.userid', $user->userid)
->first(); ->first();
if (empty($project)) { if (empty($project)) {
return Base::retError('项目不存在或不在成员列表内'); return Base::retError('项目不存在或不在成员列表内');
@ -478,6 +474,30 @@ class ProjectController extends AbstractController
return Base::retSuccess('删除成功', $column->toArray()); 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() public function task__lists()
{ {
$user = user::auth(); User::auth();
// //
$builder = ProjectTask::select(ProjectTask::taskSelect); $builder = ProjectTask::select(ProjectTask::taskSelect)->authData();
// //
$name = Request::input('name'); $name = Request::input('name');
$time = Request::input('time'); $time = Request::input('time');
@ -509,13 +529,7 @@ class ProjectController extends AbstractController
} }
} }
// //
$list = $builder $list = $builder->orderByDesc('project_tasks.id')->paginate(Base::getPaginate(200, 100));
->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));
// //
return Base::retSuccess('success', $list); return Base::retSuccess('success', $list);
} }
@ -527,7 +541,7 @@ class ProjectController extends AbstractController
*/ */
public function task__basic() public function task__basic()
{ {
user::auth(); User::auth();
// //
$task_id = intval(Request::input('task_id')); $task_id = intval(Request::input('task_id'));
// //
@ -546,7 +560,7 @@ class ProjectController extends AbstractController
*/ */
public function task__sublist() public function task__sublist()
{ {
user::auth(); User::auth();
// //
$task_id = intval(Request::input('task_id')); $task_id = intval(Request::input('task_id'));
// //
@ -563,7 +577,7 @@ class ProjectController extends AbstractController
*/ */
public function task__content() public function task__content()
{ {
user::auth(); User::auth();
// //
$task_id = intval(Request::input('task_id')); $task_id = intval(Request::input('task_id'));
// //
@ -579,7 +593,7 @@ class ProjectController extends AbstractController
*/ */
public function task__files() public function task__files()
{ {
user::auth(); User::auth();
// //
$task_id = intval(Request::input('task_id')); $task_id = intval(Request::input('task_id'));
// //
@ -602,7 +616,7 @@ class ProjectController extends AbstractController
*/ */
public function task__add() public function task__add()
{ {
user::auth(); User::auth();
parse_str(Request::getContent(), $data); parse_str(Request::getContent(), $data);
$project_id = intval($data['project_id']); $project_id = intval($data['project_id']);
$column_id = $data['column_id']; $column_id = $data['column_id'];
@ -658,7 +672,7 @@ class ProjectController extends AbstractController
*/ */
public function task__addsub() public function task__addsub()
{ {
user::auth(); User::auth();
// //
$task_id = intval(Request::input('task_id')); $task_id = intval(Request::input('task_id'));
$name = Request::input('name'); $name = Request::input('name');
@ -699,7 +713,7 @@ class ProjectController extends AbstractController
*/ */
public function task__update() public function task__update()
{ {
user::auth(); User::auth();
// //
parse_str(Request::getContent(), $data); parse_str(Request::getContent(), $data);
$task_id = intval($data['task_id']); $task_id = intval($data['task_id']);
@ -796,7 +810,7 @@ class ProjectController extends AbstractController
*/ */
public function task__dialog() public function task__dialog()
{ {
user::auth(); User::auth();
// //
$task_id = intval(Request::input('task_id')); $task_id = intval(Request::input('task_id'));
// //
@ -834,7 +848,7 @@ class ProjectController extends AbstractController
*/ */
public function task__archived() public function task__archived()
{ {
user::auth(); User::auth();
// //
$task_id = intval(Request::input('task_id')); $task_id = intval(Request::input('task_id'));
// //
@ -855,7 +869,7 @@ class ProjectController extends AbstractController
*/ */
public function task__delete() public function task__delete()
{ {
user::auth(); User::auth();
// //
$task_id = intval(Request::input('task_id')); $task_id = intval(Request::input('task_id'));
// //
@ -876,7 +890,7 @@ class ProjectController extends AbstractController
*/ */
public function log__lists() public function log__lists()
{ {
user::auth(); User::auth();
// //
$project_id = intval(Request::input('project_id')); $project_id = intval(Request::input('project_id'));
$task_id = intval(Request::input('task_id')); $task_id = intval(Request::input('task_id'));

View File

@ -3,7 +3,6 @@
namespace App\Models; namespace App\Models;
use App\Exceptions\ApiException; use App\Exceptions\ApiException;
use App\Module\Base;
use App\Tasks\PushTask; use App\Tasks\PushTask;
use Hhxsv5\LaravelS\Swoole\Task\Task; use Hhxsv5\LaravelS\Swoole\Task\Task;
use Illuminate\Database\Eloquent\SoftDeletes; use Illuminate\Database\Eloquent\SoftDeletes;
@ -33,6 +32,7 @@ use Request;
* @property-read int|null $project_log_count * @property-read int|null $project_log_count
* @property-read \Illuminate\Database\Eloquent\Collection|\App\Models\ProjectUser[] $projectUser * @property-read \Illuminate\Database\Eloquent\Collection|\App\Models\ProjectUser[] $projectUser
* @property-read int|null $project_user_count * @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 newModelQuery()
* @method static \Illuminate\Database\Eloquent\Builder|Project newQuery() * @method static \Illuminate\Database\Eloquent\Builder|Project newQuery()
* @method static \Illuminate\Database\Query\Builder|Project onlyTrashed() * @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'); 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 * @param int $userid 加入的会员ID
@ -325,9 +339,8 @@ class Project extends AbstractModel
public static function userProject($project_id) public static function userProject($project_id)
{ {
$project = Project::select(self::projectSelect) $project = Project::select(self::projectSelect)
->join('project_users', 'projects.id', '=', 'project_users.project_id') ->authData()
->where('projects.id', intval($project_id)) ->where('projects.id', intval($project_id))
->where('project_users.userid', User::token2userid())
->first(); ->first();
if (empty($project)) { if (empty($project)) {
throw new ApiException('项目不存在或不在成员列表内'); throw new ApiException('项目不存在或不在成员列表内');

View File

@ -50,6 +50,7 @@ use Request;
* @property-read int|null $task_tag_count * @property-read int|null $task_tag_count
* @property-read \Illuminate\Database\Eloquent\Collection|\App\Models\ProjectTaskUser[] $taskUser * @property-read \Illuminate\Database\Eloquent\Collection|\App\Models\ProjectTaskUser[] $taskUser
* @property-read int|null $task_user_count * @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 newModelQuery()
* @method static \Illuminate\Database\Eloquent\Builder|ProjectTask newQuery() * @method static \Illuminate\Database\Eloquent\Builder|ProjectTask newQuery()
* @method static \Illuminate\Database\Query\Builder|ProjectTask onlyTrashed() * @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'); 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 * @param $data
@ -669,9 +686,8 @@ class ProjectTask extends AbstractModel
} }
// //
$project = Project::select(Project::projectSelect) $project = Project::select(Project::projectSelect)
->join('project_users', 'projects.id', '=', 'project_users.project_id') ->authData()
->where('projects.id', $task->project_id) ->where('projects.id', $task->project_id)
->where('project_users.userid', User::token2userid())
->first(); ->first();
if (empty($project)) { if (empty($project)) {
throw new ApiException('项目不存在或不在成员列表内'); throw new ApiException('项目不存在或不在成员列表内');

View File

@ -170,7 +170,14 @@ export default {
}, },
computed: { computed: {
...mapState(['userId', 'userInfo', 'dialogMsgUnread', 'projectList', 'projectOpenTask', 'projectChatShow']), ...mapState([
'userId',
'userInfo',
'dialogMsgUnread',
'projectList',
'projectOpenTask',
'projectChatShow'
]),
}, },
watch: { watch: {

View File

@ -5,7 +5,7 @@
<em v-if="item.p_name && item.parent_id === 0" class="priority-color" :style="{backgroundColor:item.p_color}"></em> <em v-if="item.p_name && item.parent_id === 0" class="priority-color" :style="{backgroundColor:item.p_color}"></em>
<Col span="12" :class="['row-name', item.complete_at ? 'complete' : '']"> <Col span="12" :class="['row-name', item.complete_at ? 'complete' : '']">
<Icon <Icon
v-if="item.sub_num > 0 || fastAddTask" v-if="item.sub_num > 0 || (item.parent_id===0 && fastAddTask)"
:class="['sub-icon', item[openName] ? 'active' : '']" :class="['sub-icon', item[openName] ? 'active' : '']"
type="ios-arrow-forward" type="ios-arrow-forward"
@click="getSublist(item)"/> @click="getSublist(item)"/>
@ -86,7 +86,7 @@
v-if="item[openName]===true" v-if="item[openName]===true"
:list="item.sub_task" :list="item.sub_task"
:parent-id="item.id" :parent-id="item.id"
:fast-add-task="fastAddTask" :fast-add-task="item.parent_id===0 && fastAddTask"
:color-list="colorList" :color-list="colorList"
:open-key="openKey" :open-key="openKey"
@command="dropTask"/> @command="dropTask"/>

View File

@ -1,14 +1,67 @@
<template> <template>
<div class="page-dashboard"> <div class="page-dashboard">
<PageTitle>{{$L('仪表板')}}</PageTitle> <PageTitle>{{$L('仪表板')}}</PageTitle>
<div class="nopage"> <div class="dashboard-wrapper">
<div class="nopage-icon"><Icon type="ios-speedometer" /></div> <div class="dashboard-hello">{{$L('欢迎您,' + userInfo.nickname)}}</div>
<div class="nopage-text">{{$L('仪表板')}}</div> <div class="dashboard-desc">{{$L('以下是你当前的任务统计数据')}}</div>
<ul class="dashboard-block">
<li>
<div class="block-title">{{$L('今日待完成')}}</div>
<div class="block-data">
<div class="block-num">21</div>
<i class="iconfont">&#xe6f4;</i>
</div>
</li>
<li>
<div class="block-title">{{$L('超期未完成')}}</div>
<div class="block-data">
<div class="block-num">2</div>
<i class="iconfont">&#xe603;</i>
</div>
</li>
<li>
<div class="block-title">{{$L('参与的项目')}}</div>
<div class="block-data">
<div class="block-num">{{projectList.length}}</div>
<i class="iconfont">&#xe6f9;</i>
</div>
</li>
</ul>
<div class="dashboard-title">{{$L('今日任务')}}</div>
<ul class="dashboard-list overlay-y">
<li>
<i class="iconfont">&#xe625;</i>
<div class="item-title">超全!B端通用界面设计法则全方位科普</div>
<div class="item-time"></div>
</li>
<li>
<i class="iconfont">&#xe625;</i>
<div class="item-title">做B端后台产品很复杂?送你一份完整的设计流程和规范!</div>
<div class="item-time"></div>
</li>
<li>
<i class="iconfont">&#xe625;</i>
<div class="item-title">如何设计时间显示更专业?来看大厂总结的方法</div>
<div class="item-time"></div>
</li>
<li>
<i class="iconfont">&#xe625;</i>
<div class="item-title">用实战分析和案例,教你网页配色的终极套路</div>
<div class="item-time"></div>
</li>
<li>
<i class="iconfont">&#xe625;</i>
<div class="item-title">用一篇超全面的文章,帮你了解维也纳艺术团体分离派</div>
<div class="item-time"></div>
</li>
</ul>
</div> </div>
</div> </div>
</template> </template>
<script> <script>
import {mapState} from "vuex";
export default { export default {
data() { data() {
return {} return {}
@ -16,5 +69,8 @@ export default {
mounted() { mounted() {
}, },
computed: {
...mapState(['userInfo', 'projectList']),
}
} }
</script> </script>

View File

@ -1,8 +1,8 @@
@font-face { @font-face {
font-family: 'iconfont'; /* Project id 2583385 */ font-family: 'iconfont'; /* Project id 2583385 */
src: url('//at.alicdn.com/t/font_2583385_cz486uauxcg.woff2?t=1623761047200') format('woff2'), src: url('//at.alicdn.com/t/font_2583385_s933tffef1.woff2?t=1624075007364') format('woff2'),
url('//at.alicdn.com/t/font_2583385_cz486uauxcg.woff?t=1623761047200') format('woff'), url('//at.alicdn.com/t/font_2583385_s933tffef1.woff?t=1624075007364') format('woff'),
url('//at.alicdn.com/t/font_2583385_cz486uauxcg.ttf?t=1623761047200') format('truetype'); url('//at.alicdn.com/t/font_2583385_s933tffef1.ttf?t=1624075007364') format('truetype');
} }
.iconfont { .iconfont {

View File

@ -1,4 +1,124 @@
.page-dashboard { .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 { .nopage {
width: 100%; width: 100%;
height: 100%; height: 100%;