From 775fdec0b881a0f6cc4d7a8d5b869d9570954e38 Mon Sep 17 00:00:00 2001 From: kuaifan Date: Thu, 31 Mar 2022 09:44:52 +0800 Subject: [PATCH] =?UTF-8?q?perf:=20=E6=96=87=E4=BB=B6=E5=85=B1=E4=BA=AB?= =?UTF-8?q?=E6=88=90=E5=91=98=E6=94=AF=E6=8C=81=E5=88=86=E4=BA=AB=E9=93=BE?= =?UTF-8?q?=E6=8E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Http/Controllers/Api/FileController.php | 24 +++++-------- app/Models/File.php | 5 ++- app/Models/FileUser.php | 30 ++++++++++++++++ ...022_03_31_093754_add_file_links_userid.php | 34 +++++++++++++++++++ resources/assets/js/pages/manage/file.vue | 29 ++++++++-------- 5 files changed, 88 insertions(+), 34 deletions(-) create mode 100644 database/migrations/2022_03_31_093754_add_file_links_userid.php diff --git a/app/Http/Controllers/Api/FileController.php b/app/Http/Controllers/Api/FileController.php index bfa76f713..ab5527e24 100755 --- a/app/Http/Controllers/Api/FileController.php +++ b/app/Http/Controllers/Api/FileController.php @@ -853,10 +853,7 @@ class FileController extends AbstractController // 取消共享 $action = "delete"; foreach ($userids as $userid) { - if (FileUser::where([ - 'file_id' => $file->id, - 'userid' => $userid, - ])->delete()) { + if (FileUser::deleteFileUser($file->id, $userid)) { $array[] = $userid; } } @@ -864,7 +861,7 @@ class FileController extends AbstractController // 设置共享 $action = "update"; if ($force === 0) { - if (File::where('pids', 'like', ",{$file->id},")->whereShare(1)->exists()) { + if (File::where("pids", "like", "%,{$file->id},%")->whereShare(1)->exists()) { return Base::retError('此文件夹内已有共享文件夹', [], -3001); } } @@ -913,16 +910,10 @@ class FileController extends AbstractController if ($file->userid == $user->userid) { return Base::retError('不能退出自己共享的文件'); } - if (FileUser::where([ - 'file_id' => $file->id, - 'userid' => 0, - ])->exists()) { + if (FileUser::whereFileId($file->id)->whereUserid(0)->exists()) { return Base::retError('无法退出共享所有人的文件或文件夹'); } - FileUser::where([ - 'file_id' => $file->id, - 'userid' => $user->userid, - ])->delete(); + FileUser::deleteFileUser($file->id, $user->userid); // $file->updataShare(); return Base::retSuccess("退出成功"); @@ -947,20 +938,21 @@ class FileController extends AbstractController */ public function link() { - User::auth(); + $user = User::auth(); // $id = intval(Request::input('id')); $refresh = Request::input('refresh', 'no'); // - $file = File::permissionFind($id, 1000); + $file = File::permissionFind($id); if ($file->type == 'folder') { return Base::retError('文件夹暂不支持此功能'); } // - $fileLink = FileLink::whereFileId($file->id)->first(); + $fileLink = FileLink::whereFileId($file->id)->whereUserid($user->userid)->first(); if (empty($fileLink)) { $fileLink = FileLink::createInstance([ 'file_id' => $file->id, + 'userid' => $user->userid, 'code' => Base::generatePassword(64), ]); $fileLink->save(); diff --git a/app/Models/File.php b/app/Models/File.php index 9728d85e9..db85f4778 100644 --- a/app/Models/File.php +++ b/app/Models/File.php @@ -168,7 +168,7 @@ class File extends AbstractModel $this->share = $share; $this->save(); if ($share === 0) { - FileUser::whereFileId($this->id)->delete(); + FileUser::deleteFileAll($this->id, $this->userid); } $list = self::wherePid($this->id)->get(); if ($list->isNotEmpty()) { @@ -224,8 +224,7 @@ class File extends AbstractModel AbstractModel::transaction(function () { $this->delete(); $this->pushMsg('delete'); - FileLink::whereFileId($this->id)->delete(); - FileUser::whereFileId($this->id)->delete(); + FileUser::deleteFileAll($this->id); FileContent::whereFid($this->id)->delete(); $list = self::wherePid($this->id)->get(); if ($list->isNotEmpty()) { diff --git a/app/Models/FileUser.php b/app/Models/FileUser.php index 5b35960fe..021e632f0 100644 --- a/app/Models/FileUser.php +++ b/app/Models/FileUser.php @@ -25,4 +25,34 @@ namespace App\Models; */ class FileUser extends AbstractModel { + /** + * 删除所有共享成员(同时删除成员分享的链接) + * @param $file_id + * @param int $retain_link_userid 保留指定会员的链接 + * @return mixed + */ + public static function deleteFileAll($file_id, $retain_link_userid = 0) + { + return AbstractModel::transaction(function() use ($retain_link_userid, $file_id) { + if ($retain_link_userid > 0) { + FileLink::whereFileId($file_id)->where('userid', '!=', $retain_link_userid)->delete(); + } else { + FileLink::whereFileId($file_id)->delete(); + } + FileUser::whereFileId($file_id)->delete(); + }); + } + /** + * 删除指定共享成员(同时删除成员分享的链接) + * @param $file_id + * @param $userid + * @return mixed + */ + public static function deleteFileUser($file_id, $userid) + { + return AbstractModel::transaction(function() use ($userid, $file_id) { + FileLink::whereFileId($file_id)->whereUserid($userid)->delete(); + return self::whereFileId($file_id)->whereUserid($userid)->delete(); + }); + } } diff --git a/database/migrations/2022_03_31_093754_add_file_links_userid.php b/database/migrations/2022_03_31_093754_add_file_links_userid.php new file mode 100644 index 000000000..e72210a53 --- /dev/null +++ b/database/migrations/2022_03_31_093754_add_file_links_userid.php @@ -0,0 +1,34 @@ +integer('userid')->nullable()->default(0)->after('code')->comment('会员ID'); + } + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('file_links', function (Blueprint $table) { + $table->dropColumn("userid"); + }); + } +} diff --git a/resources/assets/js/pages/manage/file.vue b/resources/assets/js/pages/manage/file.vue index e244a7d61..062388b76 100644 --- a/resources/assets/js/pages/manage/file.vue +++ b/resources/assets/js/pages/manage/file.vue @@ -146,6 +146,7 @@