From bca28fb390fcc90509a0446906d5b37f408f1c35 Mon Sep 17 00:00:00 2001 From: kuaifan Date: Tue, 7 Mar 2023 18:11:34 +0800 Subject: [PATCH] =?UTF-8?q?perf:=20=E4=BC=98=E5=8C=96=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E5=90=8C=E6=AD=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Http/Controllers/Api/DialogController.php | 1 - .../Controllers/Api/ProjectController.php | 2 +- app/Models/AbstractModel.php | 38 +++++++++ app/Models/Deleted.php | 67 +++++++++++++++ app/Models/Project.php | 3 +- app/Models/ProjectTask.php | 7 +- app/Models/ProjectUser.php | 2 - app/Models/UserDepartment.php | 1 - app/Models/WebSocketDialog.php | 6 +- app/Observers/ProjectObserver.php | 81 +++++++++++++++++++ app/Observers/ProjectTaskObserver.php | 81 +++++++++++++++++++ app/Observers/ProjectTaskUserObserver.php | 64 +++++++++++++++ app/Observers/ProjectUserObserver.php | 64 +++++++++++++++ app/Observers/WebSocketDialogObserver.php | 74 +++++++++++++++++ app/Observers/WebSocketDialogUserObserver.php | 64 +++++++++++++++ app/Providers/EventServiceProvider.php | 20 ++++- .../2023_03_07_152557_create_deleteds.php | 37 +++++++++ resources/assets/js/store/actions.js | 10 ++- 18 files changed, 604 insertions(+), 18 deletions(-) create mode 100644 app/Models/Deleted.php create mode 100644 app/Observers/ProjectObserver.php create mode 100644 app/Observers/ProjectTaskObserver.php create mode 100644 app/Observers/ProjectTaskUserObserver.php create mode 100644 app/Observers/ProjectUserObserver.php create mode 100644 app/Observers/WebSocketDialogObserver.php create mode 100644 app/Observers/WebSocketDialogUserObserver.php create mode 100644 database/migrations/2023_03_07_152557_create_deleteds.php diff --git a/app/Http/Controllers/Api/DialogController.php b/app/Http/Controllers/Api/DialogController.php index 0ab93c9e3..17d388f85 100755 --- a/app/Http/Controllers/Api/DialogController.php +++ b/app/Http/Controllers/Api/DialogController.php @@ -1728,7 +1728,6 @@ class DialogController extends AbstractController // $dialog->checkGroup('user'); $dialog->deleteDialog(); - $dialog->pushMsg("groupDelete"); return Base::retSuccess('解散成功'); } diff --git a/app/Http/Controllers/Api/ProjectController.php b/app/Http/Controllers/Api/ProjectController.php index 1a5c2acb9..d9c1318a0 100755 --- a/app/Http/Controllers/Api/ProjectController.php +++ b/app/Http/Controllers/Api/ProjectController.php @@ -1784,7 +1784,7 @@ class ProjectController extends AbstractController // $task = ProjectTask::userTask($task_id, null, $type !== 'recovery', true); if ($type == 'recovery') { - $task->recoveryTask(); + $task->restoreTask(); return Base::retSuccess('操作成功', ['id' => $task->id]); } else { $task->deleteTask(); diff --git a/app/Models/AbstractModel.php b/app/Models/AbstractModel.php index 941a8607e..87a8104eb 100644 --- a/app/Models/AbstractModel.php +++ b/app/Models/AbstractModel.php @@ -15,6 +15,8 @@ use Illuminate\Support\Facades\DB; * @method static \Illuminate\Database\Eloquent\Builder|AbstractModel newModelQuery() * @method static \Illuminate\Database\Eloquent\Builder|AbstractModel newQuery() * @method static \Illuminate\Database\Eloquent\Builder|AbstractModel query() + * @method static \Illuminate\Database\Eloquent\Builder|AbstractModel modify(array $values) + * @method static \Illuminate\Database\Eloquent\Builder|AbstractModel remove() * @method static \Illuminate\Database\Eloquent\Builder|AbstractModel saveOrIgnore() * @method static \Illuminate\Database\Eloquent\Builder|AbstractModel getKeyValue() * @method static \Illuminate\Database\Eloquent\Model|object|static|null cancelAppend() @@ -39,6 +41,42 @@ class AbstractModel extends Model protected $appendattrs = []; + /** + * 通过模型修改数据 + * @param AbstractModel $builder + * @param $values + * @return int + */ + protected function scopeModify($builder, $values) + { + $line = 0; + $rows = $builder->get(); + foreach ($rows as $row) { + $row->updateInstance($values); + if ($row->save()) { + $line++; + } + } + return $line; + } + + /** + * 通过模型删除数据 + * @param AbstractModel $builder + * @return int + */ + protected function scopeRemove($builder) + { + $line = 0; + $rows = $builder->get(); + foreach ($rows as $row) { + if ($row->delete()) { + $line++; + } + } + return $line; + } + /** * 保存数据忽略错误 * @return bool diff --git a/app/Models/Deleted.php b/app/Models/Deleted.php new file mode 100644 index 000000000..592b06f08 --- /dev/null +++ b/app/Models/Deleted.php @@ -0,0 +1,67 @@ + $type, + 'did' => $id, + ])->whereIn('userid', $userid)->delete(); + } else { + self::where([ + 'type' => $type, + 'did' => $id, + 'userid' => $userid, + ])->delete(); + } + } + + /** + * 记录(删除数据时添加记录) + * @param $type + * @param $id + * @param $userid + * @return void + */ + public static function record($type, $id, $userid): void + { + $array = is_array($userid) ? $userid : [$userid]; + foreach ($array as $value) { + self::updateInsert([ + 'type' => $type, + 'did' => $id, + 'userid' => $value, + ]); + } + } +} diff --git a/app/Models/Project.php b/app/Models/Project.php index 1c753a130..8ba298c51 100644 --- a/app/Models/Project.php +++ b/app/Models/Project.php @@ -251,7 +251,7 @@ class Project extends AbstractModel $this->archived_at = null; $this->archived_userid = User::userid(); $this->addLog("项目取消归档"); - $this->pushMsg('add', $this); + $this->pushMsg('recovery', $this); ProjectTask::whereProjectId($this->id)->whereArchivedFollow(1)->update([ 'archived_at' => null, 'archived_follow' => 0 @@ -281,7 +281,6 @@ class Project extends AbstractModel AbstractModel::transaction(function () { $dialog = WebSocketDialog::find($this->dialog_id); $dialog?->deleteDialog(); - $dialog?->pushMsg("groupDelete"); $columns = ProjectColumn::whereProjectId($this->id)->get(); foreach ($columns as $column) { $column->deleteColumn(false); diff --git a/app/Models/ProjectTask.php b/app/Models/ProjectTask.php index 3d9931f9e..73ae872cb 100644 --- a/app/Models/ProjectTask.php +++ b/app/Models/ProjectTask.php @@ -1260,7 +1260,7 @@ class ProjectTask extends AbstractModel $this->archived_follow = 0; $this->addLog($logText, [], $userid); } - $this->pushMsg('update', [ + $this->pushMsg($archived_at === null ? 'recovery' : 'archived', [ 'id' => $this->id, 'archived_at' => $this->archived_at, 'archived_userid' => $this->archived_userid, @@ -1286,7 +1286,6 @@ class ProjectTask extends AbstractModel if ($this->dialog_id) { $dialog = WebSocketDialog::find($this->dialog_id); $dialog?->deleteDialog(); - $dialog?->pushMsg("groupDelete"); } self::whereParentId($this->id)->delete(); $this->deleted_userid = User::userid(); @@ -1305,12 +1304,12 @@ class ProjectTask extends AbstractModel * @param bool $pushMsg 是否推送 * @return bool */ - public function recoveryTask($pushMsg = true) + public function restoreTask($pushMsg = true) { AbstractModel::transaction(function () { if ($this->dialog_id) { $dialog = WebSocketDialog::withTrashed()->find($this->dialog_id); - $dialog?->recoveryDialog(); + $dialog?->restoreDialog(); } self::whereParentId($this->id)->withTrashed()->restore(); $this->addLog("还原{任务}"); diff --git a/app/Models/ProjectUser.php b/app/Models/ProjectUser.php index 5786510e0..96eb0145d 100644 --- a/app/Models/ProjectUser.php +++ b/app/Models/ProjectUser.php @@ -2,8 +2,6 @@ namespace App\Models; -use App\Module\Base; - /** * App\Models\ProjectUser * diff --git a/app/Models/UserDepartment.php b/app/Models/UserDepartment.php index 1baec3e67..e6349f991 100644 --- a/app/Models/UserDepartment.php +++ b/app/Models/UserDepartment.php @@ -127,7 +127,6 @@ class UserDepartment extends AbstractModel $dialog = WebSocketDialog::find($this->dialog_id); if ($dialog) { $dialog->deleteDialog(); - $dialog->pushMsg("groupDelete"); } // $this->delete(); diff --git a/app/Models/WebSocketDialog.php b/app/Models/WebSocketDialog.php index 48780722a..8c02cd8ca 100644 --- a/app/Models/WebSocketDialog.php +++ b/app/Models/WebSocketDialog.php @@ -17,7 +17,7 @@ use Illuminate\Database\Eloquent\SoftDeletes; * @property string|null $type 对话类型 * @property string|null $group_type 聊天室类型 * @property string|null $name 对话名称 - * @property string|null $avatar 头像(群) + * @property string $avatar 头像(群) * @property string|null $last_at 最后消息时间 * @property int|null $owner_id 群主用户ID * @property \Illuminate\Support\Carbon|null $created_at @@ -311,6 +311,7 @@ class WebSocketDialog extends AbstractModel }); $this->delete(); }); + $this->pushMsg("groupDelete"); return true; } @@ -318,9 +319,10 @@ class WebSocketDialog extends AbstractModel * 还原会话 * @return bool */ - public function recoveryDialog() + public function restoreDialog() { $this->restore(); + $this->pushMsg("groupRestore"); return true; } diff --git a/app/Observers/ProjectObserver.php b/app/Observers/ProjectObserver.php new file mode 100644 index 000000000..0d0b09591 --- /dev/null +++ b/app/Observers/ProjectObserver.php @@ -0,0 +1,81 @@ +isDirty('archived_at')) { + $userids = $this->userids($project); + if ($project->archived_at) { + Deleted::record('project', $project->id, $userids); + } else { + Deleted::forget('project', $project->id, $userids); + } + } + } + + /** + * Handle the Project "deleted" event. + * + * @param \App\Models\Project $project + * @return void + */ + public function deleted(Project $project) + { + Deleted::record('project', $project->id, $this->userids($project)); + } + + /** + * Handle the Project "restored" event. + * + * @param \App\Models\Project $project + * @return void + */ + public function restored(Project $project) + { + Deleted::forget('project', $project->id, $this->userids($project)); + } + + /** + * Handle the Project "force deleted" event. + * + * @param \App\Models\Project $project + * @return void + */ + public function forceDeleted(Project $project) + { + // + } + + /** + * @param Project $project + * @return array + */ + private function userids(Project $project) + { + return ProjectUser::whereProjectId($project->id)->pluck('userid')->toArray(); + } +} diff --git a/app/Observers/ProjectTaskObserver.php b/app/Observers/ProjectTaskObserver.php new file mode 100644 index 000000000..d2e0ad3a5 --- /dev/null +++ b/app/Observers/ProjectTaskObserver.php @@ -0,0 +1,81 @@ +isDirty('archived_at')) { + $userids = $this->userids($projectTask); + if ($projectTask->archived_at) { + Deleted::record('projectTask', $projectTask->id, $userids); + } else { + Deleted::forget('projectTask', $projectTask->id, $userids); + } + } + } + + /** + * Handle the ProjectTask "deleted" event. + * + * @param \App\Models\ProjectTask $projectTask + * @return void + */ + public function deleted(ProjectTask $projectTask) + { + Deleted::record('projectTask', $projectTask->id, $this->userids($projectTask)); + } + + /** + * Handle the ProjectTask "restored" event. + * + * @param \App\Models\ProjectTask $projectTask + * @return void + */ + public function restored(ProjectTask $projectTask) + { + Deleted::forget('projectTask', $projectTask->id, $this->userids($projectTask)); + } + + /** + * Handle the ProjectTask "force deleted" event. + * + * @param \App\Models\ProjectTask $projectTask + * @return void + */ + public function forceDeleted(ProjectTask $projectTask) + { + // + } + + /** + * @param ProjectTask $projectTask + * @return array + */ + private function userids(ProjectTask $projectTask) + { + return ProjectTaskUser::whereTaskId($projectTask->id)->pluck('userid')->toArray(); + } +} diff --git a/app/Observers/ProjectTaskUserObserver.php b/app/Observers/ProjectTaskUserObserver.php new file mode 100644 index 000000000..7aaf5a35c --- /dev/null +++ b/app/Observers/ProjectTaskUserObserver.php @@ -0,0 +1,64 @@ +task_id, $projectTaskUser->userid); + } + + /** + * Handle the ProjectTaskUser "updated" event. + * + * @param \App\Models\ProjectTaskUser $projectTaskUser + * @return void + */ + public function updated(ProjectTaskUser $projectTaskUser) + { + // + } + + /** + * Handle the ProjectTaskUser "deleted" event. + * + * @param \App\Models\ProjectTaskUser $projectTaskUser + * @return void + */ + public function deleted(ProjectTaskUser $projectTaskUser) + { + Deleted::record('projectTask', $projectTaskUser->task_id, $projectTaskUser->userid); + } + + /** + * Handle the ProjectTaskUser "restored" event. + * + * @param \App\Models\ProjectTaskUser $projectTaskUser + * @return void + */ + public function restored(ProjectTaskUser $projectTaskUser) + { + // + } + + /** + * Handle the ProjectTaskUser "force deleted" event. + * + * @param \App\Models\ProjectTaskUser $projectTaskUser + * @return void + */ + public function forceDeleted(ProjectTaskUser $projectTaskUser) + { + // + } +} diff --git a/app/Observers/ProjectUserObserver.php b/app/Observers/ProjectUserObserver.php new file mode 100644 index 000000000..cda58232d --- /dev/null +++ b/app/Observers/ProjectUserObserver.php @@ -0,0 +1,64 @@ +project_id, $projectUser->userid); + } + + /** + * Handle the ProjectUser "updated" event. + * + * @param \App\Models\ProjectUser $projectUser + * @return void + */ + public function updated(ProjectUser $projectUser) + { + // + } + + /** + * Handle the ProjectUser "deleted" event. + * + * @param \App\Models\ProjectUser $projectUser + * @return void + */ + public function deleted(ProjectUser $projectUser) + { + Deleted::record('project', $projectUser->project_id, $projectUser->userid); + } + + /** + * Handle the ProjectUser "restored" event. + * + * @param \App\Models\ProjectUser $projectUser + * @return void + */ + public function restored(ProjectUser $projectUser) + { + // + } + + /** + * Handle the ProjectUser "force deleted" event. + * + * @param \App\Models\ProjectUser $projectUser + * @return void + */ + public function forceDeleted(ProjectUser $projectUser) + { + // + } +} diff --git a/app/Observers/WebSocketDialogObserver.php b/app/Observers/WebSocketDialogObserver.php new file mode 100644 index 000000000..45a49c393 --- /dev/null +++ b/app/Observers/WebSocketDialogObserver.php @@ -0,0 +1,74 @@ +id, $this->userids($webSocketDialog)); + } + + /** + * Handle the WebSocketDialog "restored" event. + * + * @param \App\Models\WebSocketDialog $webSocketDialog + * @return void + */ + public function restored(WebSocketDialog $webSocketDialog) + { + Deleted::forget('dialog', $webSocketDialog->id, $this->userids($webSocketDialog)); + } + + /** + * Handle the WebSocketDialog "force deleted" event. + * + * @param \App\Models\WebSocketDialog $webSocketDialog + * @return void + */ + public function forceDeleted(WebSocketDialog $webSocketDialog) + { + // + } + + /** + * @param WebSocketDialog $webSocketDialog + * @return array + */ + private function userids(WebSocketDialog $webSocketDialog) + { + return WebSocketDialogUser::whereDialogId($webSocketDialog->id)->pluck('userid')->toArray(); + } +} diff --git a/app/Observers/WebSocketDialogUserObserver.php b/app/Observers/WebSocketDialogUserObserver.php new file mode 100644 index 000000000..ae9b8eade --- /dev/null +++ b/app/Observers/WebSocketDialogUserObserver.php @@ -0,0 +1,64 @@ +dialog_id, $webSocketDialogUser->userid); + } + + /** + * Handle the WebSocketDialogUser "updated" event. + * + * @param \App\Models\WebSocketDialogUser $webSocketDialogUser + * @return void + */ + public function updated(WebSocketDialogUser $webSocketDialogUser) + { + // + } + + /** + * Handle the WebSocketDialogUser "deleted" event. + * + * @param \App\Models\WebSocketDialogUser $webSocketDialogUser + * @return void + */ + public function deleted(WebSocketDialogUser $webSocketDialogUser) + { + Deleted::record('dialog', $webSocketDialogUser->dialog_id, $webSocketDialogUser->userid); + } + + /** + * Handle the WebSocketDialogUser "restored" event. + * + * @param \App\Models\WebSocketDialogUser $webSocketDialogUser + * @return void + */ + public function restored(WebSocketDialogUser $webSocketDialogUser) + { + // + } + + /** + * Handle the WebSocketDialogUser "force deleted" event. + * + * @param \App\Models\WebSocketDialogUser $webSocketDialogUser + * @return void + */ + public function forceDeleted(WebSocketDialogUser $webSocketDialogUser) + { + // + } +} diff --git a/app/Providers/EventServiceProvider.php b/app/Providers/EventServiceProvider.php index a9f10a631..ff76a6c16 100644 --- a/app/Providers/EventServiceProvider.php +++ b/app/Providers/EventServiceProvider.php @@ -2,10 +2,21 @@ namespace App\Providers; +use App\Models\Project; +use App\Models\ProjectTask; +use App\Models\ProjectTaskUser; +use App\Models\ProjectUser; +use App\Models\WebSocketDialog; +use App\Models\WebSocketDialogUser; +use App\Observers\ProjectObserver; +use App\Observers\ProjectTaskObserver; +use App\Observers\ProjectTaskUserObserver; +use App\Observers\ProjectUserObserver; +use App\Observers\WebSocketDialogObserver; +use App\Observers\WebSocketDialogUserObserver; use Illuminate\Auth\Events\Registered; use Illuminate\Auth\Listeners\SendEmailVerificationNotification; use Illuminate\Foundation\Support\Providers\EventServiceProvider as ServiceProvider; -use Illuminate\Support\Facades\Event; class EventServiceProvider extends ServiceProvider { @@ -27,6 +38,11 @@ class EventServiceProvider extends ServiceProvider */ public function boot() { - // + Project::observe(ProjectObserver::class); + ProjectTask::observe(ProjectTaskObserver::class); + ProjectTaskUser::observe(ProjectTaskUserObserver::class); + ProjectUser::observe(ProjectUserObserver::class); + WebSocketDialog::observe(WebSocketDialogObserver::class); + WebSocketDialogUser::observe(WebSocketDialogUserObserver::class); } } diff --git a/database/migrations/2023_03_07_152557_create_deleteds.php b/database/migrations/2023_03_07_152557_create_deleteds.php new file mode 100644 index 000000000..6c3ef47f3 --- /dev/null +++ b/database/migrations/2023_03_07_152557_create_deleteds.php @@ -0,0 +1,37 @@ +bigIncrements('id'); + $table->string('type', 50)->nullable()->default('')->comment('删除的数据类型(如:project、task、dialog)'); + $table->bigInteger('did')->nullable()->default(0)->comment('删除的数据ID'); + $table->bigInteger('userid')->nullable()->default(0)->comment('关系会员ID'); + $table->timestamp('created_at')->nullable(); + $table->unique(['type', 'did', 'userid']); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('deleted', function (Blueprint $table) { + // + }); + } +} diff --git a/resources/assets/js/store/actions.js b/resources/assets/js/store/actions.js index 96a6494ac..80e7c6aab 100644 --- a/resources/assets/js/store/actions.js +++ b/resources/assets/js/store/actions.js @@ -2915,7 +2915,8 @@ export default { break; case 'groupAdd': case 'groupJoin': - // 群组添加、加入 + case 'groupRestore': + // 群组添加、加入、恢复 dispatch("getDialogOne", data.id).catch(() => {}) break; case 'groupUpdate': @@ -2942,14 +2943,15 @@ export default { switch (action) { case 'add': case 'update': + case 'recovery': dispatch("saveProject", data) break; case 'detail': dispatch("getProjectOne", data.id).catch(() => {}) dispatch("getTaskForProject", data.id).catch(() => {}) break; - case 'archived': case 'delete': + case 'archived': dispatch("forgetProject", data.id); break; case 'sort': @@ -2985,10 +2987,12 @@ export default { const {action, data} = msg; switch (action) { case 'add': - case 'restore': + case 'restore': // 恢复(删除) dispatch("addTaskSuccess", data) break; case 'update': + case 'archived': // 归档 + case 'recovery': // 恢复(归档) dispatch("saveTask", data) break; case 'dialog':