diff --git a/app/Http/Controllers/Api/ProjectController.php b/app/Http/Controllers/Api/ProjectController.php index 662ff350..991ead0a 100755 --- a/app/Http/Controllers/Api/ProjectController.php +++ b/app/Http/Controllers/Api/ProjectController.php @@ -1747,4 +1747,31 @@ class ProjectController extends AbstractController // return Base::retSuccess('success', $list); } + + /** + * @api {get} api/project/top 37. 项目置顶 + * + * @apiDescription 需要token身份 + * @apiVersion 1.0.0 + * @apiGroup project + * @apiName top + * + * @apiParam {Number} project_id 项目ID + * + * @apiSuccess {Number} ret 返回状态码(1正确、0错误) + * @apiSuccess {String} msg 返回信息(错误描述) + * @apiSuccess {Object} data 返回数据 + */ + public function top() + { + $user = User::auth(); + $projectId = intval(Request::input('project_id')); + $projectUser = ProjectUser::whereUserid($user->userid)->whereProjectId($projectId)->first(); + if (!$projectUser) { + return Base::retError("项目不存在"); + } + $projectUser->top_at = $projectUser->top_at ? null : Carbon::now(); + $projectUser->save(); + return Base::retSuccess("success", $projectId); + } } diff --git a/app/Models/Project.php b/app/Models/Project.php index 37d0a532..3a33022e 100644 --- a/app/Models/Project.php +++ b/app/Models/Project.php @@ -113,6 +113,7 @@ class Project extends AbstractModel ->select([ 'projects.*', 'project_users.owner', + 'project_users.top_at', ]) ->leftJoin('project_users', function ($leftJoin) use ($userid) { $leftJoin @@ -136,6 +137,7 @@ class Project extends AbstractModel ->select([ 'projects.*', 'project_users.owner', + 'project_users.top_at', ]) ->join('project_users', 'projects.id', '=', 'project_users.project_id') ->where('project_users.userid', $userid); diff --git a/app/Models/ProjectUser.php b/app/Models/ProjectUser.php index fad1568f..45365d62 100644 --- a/app/Models/ProjectUser.php +++ b/app/Models/ProjectUser.php @@ -11,6 +11,7 @@ use App\Module\Base; * @property int|null $project_id 项目ID * @property int|null $userid 成员ID * @property int|null $owner 是否负责人 + * @property \Illuminate\Support\Carbon|null $top_at 置顶时间 * @property \Illuminate\Support\Carbon|null $created_at * @property \Illuminate\Support\Carbon|null $updated_at * @property-read \App\Models\Project|null $project diff --git a/database/migrations/2022_02_22_142148_project_users_add_top_at.php b/database/migrations/2022_02_22_142148_project_users_add_top_at.php new file mode 100644 index 00000000..83a808ae --- /dev/null +++ b/database/migrations/2022_02_22_142148_project_users_add_top_at.php @@ -0,0 +1,34 @@ +timestamp('top_at')->nullable()->after('owner')->comment('置顶时间'); + } + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('project_users', function (Blueprint $table) { + $table->dropColumn("top_at"); + }); + } +} diff --git a/resources/assets/js/pages/manage.vue b/resources/assets/js/pages/manage.vue index 9117e41b..0513c23e 100644 --- a/resources/assets/js/pages/manage.vue +++ b/resources/assets/js/pages/manage.vue @@ -70,13 +70,20 @@ -
{ + if (a.top_at || b.top_at) { + return $A.Date(b.top_at) - $A.Date(a.top_at); + } return b.id - a.id; }); if (projectKeyValue) { @@ -773,6 +801,37 @@ export default { } document.addEventListener(visibilityChangeEvent, visibilityChangeListener); }, + handleRightClick(event, item) { + this.handleClickTopOperateOutside(); + this.topOperateItem = $A.isJson(item) ? item : {}; + this.$nextTick(() => { + const projectWrap = this.$refs.projectWrapper; + const projectBounding = projectWrap.getBoundingClientRect(); + this.topOperateStyles = { + left: `${event.clientX - projectBounding.left}px`, + top: `${event.clientY - projectBounding.top}px` + }; + this.topOperateVisible = true; + }) + }, + handleClickTopOperateOutside() { + this.topOperateVisible = false; + }, + + handleTopClick() { + this.$store.dispatch("call", { + url: 'project/top', + data: { + project_id: this.topOperateItem.id, + }, + }).then(() => { + this.$store.dispatch("getProjects").catch(() => {}); + this.$Modal.remove(); + }).catch(({msg}) => { + $A.modalError(msg, 301); + this.$Modal.remove(); + }); + } } } diff --git a/resources/assets/sass/pages/page-manage.scss b/resources/assets/sass/pages/page-manage.scss index 46abc6e4..f7cad932 100644 --- a/resources/assets/sass/pages/page-manage.scss +++ b/resources/assets/sass/pages/page-manage.scss @@ -225,6 +225,12 @@ display: block; } } + .top { + background-color: #dae3ef; + } + .operate { + border:1px solid $primary-color; + } } } .common-loading { @@ -232,6 +238,13 @@ width: 22px; height: 22px; } + .top-operate { + position: absolute; + top: 0; + right: 0; + opacity: 0; + display: flex; + } } &.active { background-color: #ffffff;