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()
{
$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'));

View File

@ -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('项目不存在或不在成员列表内');

View File

@ -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('项目不存在或不在成员列表内');

View File

@ -170,7 +170,14 @@ export default {
},
computed: {
...mapState(['userId', 'userInfo', 'dialogMsgUnread', 'projectList', 'projectOpenTask', 'projectChatShow']),
...mapState([
'userId',
'userInfo',
'dialogMsgUnread',
'projectList',
'projectOpenTask',
'projectChatShow'
]),
},
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>
<Col span="12" :class="['row-name', item.complete_at ? 'complete' : '']">
<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' : '']"
type="ios-arrow-forward"
@click="getSublist(item)"/>
@ -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"/>

View File

@ -1,14 +1,67 @@
<template>
<div class="page-dashboard">
<PageTitle>{{$L('仪表板')}}</PageTitle>
<div class="nopage">
<div class="nopage-icon"><Icon type="ios-speedometer" /></div>
<div class="nopage-text">{{$L('仪表板')}}</div>
<div class="dashboard-wrapper">
<div class="dashboard-hello">{{$L('欢迎您,' + userInfo.nickname)}}</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>
</template>
<script>
import {mapState} from "vuex";
export default {
data() {
return {}
@ -16,5 +69,8 @@ export default {
mounted() {
},
computed: {
...mapState(['userInfo', 'projectList']),
}
}
</script>

View File

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

View File

@ -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%;