diff --git a/app/Http/Controllers/Api/FileController.php b/app/Http/Controllers/Api/FileController.php index 8889f3142..a1b1c99cc 100755 --- a/app/Http/Controllers/Api/FileController.php +++ b/app/Http/Controllers/Api/FileController.php @@ -252,7 +252,7 @@ class FileController extends AbstractController 'userid' => $userid, 'created_id' => $user->userid, ]); - $file->save(); + $file->saveBeforePids(); // $data = File::find($file->id); $data->pushMsg('add', $data); @@ -305,7 +305,7 @@ class FileController extends AbstractController $data = AbstractModel::transaction(function() use ($file) { $content = FileContent::select(['content', 'text', 'size'])->whereFid($file->cid)->orderByDesc('id')->first(); $file->size = $content?->size ?: 0; - $file->save(); + $file->saveBeforePids(); if ($content) { $content = $content->toArray(); $content['fid'] = $file->id; @@ -336,7 +336,7 @@ class FileController extends AbstractController */ public function move() { - $user = User::auth(); + User::auth(); // $ids = Request::input('ids'); $pid = intval(Request::input('pid')); @@ -369,7 +369,7 @@ class FileController extends AbstractController } // $file->pid = $pid; - $file->save(); + $file->saveBeforePids(); $files[] = $file; } }); @@ -666,7 +666,7 @@ class FileController extends AbstractController 'userid' => $userid, 'created_id' => $user->userid, ]); - if ($dirRow->save()) { + if ($dirRow->saveBeforePids()) { $pushMsg[] = File::find($dirRow->id); } } @@ -735,7 +735,7 @@ class FileController extends AbstractController // 开始创建 return AbstractModel::transaction(function () use ($webkitRelativePath, $type, $user, $data, $file) { $file->size = $data['size'] * 1024; - $file->save(); + $file->saveBeforePids(); // $data = Base::uploadMove($data, "uploads/file/" . $file->type . "/" . date("Ym") . "/" . $file->id . "/"); $content = FileContent::createInstance([ diff --git a/app/Models/File.php b/app/Models/File.php index c0a49e736..c66fa2b65 100644 --- a/app/Models/File.php +++ b/app/Models/File.php @@ -13,6 +13,7 @@ use Request; * App\Models\File * * @property int $id + * @property string|null $pids 上级ID递归 * @property int|null $pid 上级ID * @property int|null $cid 复制ID * @property string|null $name 名称 @@ -37,6 +38,7 @@ use Request; * @method static \Illuminate\Database\Eloquent\Builder|File whereId($value) * @method static \Illuminate\Database\Eloquent\Builder|File whereName($value) * @method static \Illuminate\Database\Eloquent\Builder|File wherePid($value) + * @method static \Illuminate\Database\Eloquent\Builder|File wherePids($value) * @method static \Illuminate\Database\Eloquent\Builder|File whereShare($value) * @method static \Illuminate\Database\Eloquent\Builder|File whereSize($value) * @method static \Illuminate\Database\Eloquent\Builder|File whereType($value) @@ -176,6 +178,40 @@ class File extends AbstractModel return true; } + /** + * 保存前更新pids + * @return bool + */ + public function saveBeforePids() + { + $pid = $this->pid; + $array = []; + while ($pid > 0) { + $array[] = $pid; + $pid = intval(self::whereId($pid)->value('pid')); + } + $opids = $this->pids; + if ($array) { + $array = array_values(array_reverse($array)); + $this->pids = ',' . implode(',', $array) . ','; + } else { + $this->pids = ''; + } + if (!$this->save()) { + return false; + } + // 更新子文件(夹) + if ($opids != $this->pids) { + self::wherePid($this->id)->chunkById(100, function ($lists) { + /** @var self $item */ + foreach ($lists as $item) { + $item->saveBeforePids(); + } + }); + } + return true; + } + /** * 遍历删除文件(夹) * @return bool diff --git a/database/migrations/2022_03_30_070029_add_files_pids.php b/database/migrations/2022_03_30_070029_add_files_pids.php new file mode 100644 index 000000000..a103a1dc8 --- /dev/null +++ b/database/migrations/2022_03_30_070029_add_files_pids.php @@ -0,0 +1,45 @@ +string('pids', 255)->nullable()->default('')->after('id')->comment('上级ID递归'); + } + }); + if ($isAdd) { + // 更新数据 + \App\Models\File::where('pid', '>', 0)->chunkById(100, function ($lists) { + /** @var \App\Models\File $item */ + foreach ($lists as $item) { + $item->saveBeforePids(); + } + }); + } + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('files', function (Blueprint $table) { + $table->dropColumn("pids"); + }); + } +} diff --git a/database/seeders/FilesTableSeeder.php b/database/seeders/FilesTableSeeder.php index 64f67c78a..0a08c5a4a 100644 --- a/database/seeders/FilesTableSeeder.php +++ b/database/seeders/FilesTableSeeder.php @@ -326,5 +326,12 @@ class FilesTableSeeder extends Seeder $content->save(); } }); + + File::where('pid', '>', 0)->chunkById(100, function ($lists) { + /** @var File $item */ + foreach ($lists as $item) { + $item->saveBeforePids(); + } + }); } } diff --git a/resources/assets/js/pages/manage/file.vue b/resources/assets/js/pages/manage/file.vue index ae6dfdec5..6f554f963 100644 --- a/resources/assets/js/pages/manage/file.vue +++ b/resources/assets/js/pages/manage/file.vue @@ -51,9 +51,9 @@
-
-
-
+
+
+
@@ -62,22 +62,7 @@ @drop.prevent="filePasteDrag($event, 'drag')" @dragover.prevent="fileDragOver(true, $event)" @dragleave.prevent="fileDragOver(false, $event)"> -
- - -