perf: 支持搜索共享文件

This commit is contained in:
kuaifan 2022-07-15 18:25:18 +08:00
parent ed9b93c22f
commit 0a99ecdd9b
5 changed files with 103 additions and 20 deletions

View File

@ -93,8 +93,7 @@ class FileController extends AbstractController
->join('file_users', 'files.id', '=', 'file_users.file_id') ->join('file_users', 'files.id', '=', 'file_users.file_id')
->where('files.userid', '!=', $user->userid) ->where('files.userid', '!=', $user->userid)
->where(function ($query) use ($user) { ->where(function ($query) use ($user) {
$query->where('file_users.userid', 0); $query->whereIn('file_users.userid', [0, $user->userid]);
$query->orWhere('file_users.userid', $user->userid);
}) })
->groupBy('files.id') ->groupBy('files.id')
->take(100) ->take(100)
@ -175,11 +174,36 @@ class FileController extends AbstractController
if (empty($key)) { if (empty($key)) {
return Base::retError('请输入关键词'); return Base::retError('请输入关键词');
} }
// // 搜索自己的
$builder = File::whereUserid($user->userid)->where("name", "like", "%{$key}%"); $builder = File::whereUserid($user->userid)->where("name", "like", "%{$key}%");
$list = $builder->take(50)->get(); $array = $builder->take(50)->get()->toArray();
// 搜索共享的
$take = 50 - count($array);
if ($take > 0) {
$list = File::where("name", "like", "%{$key}%")
->whereIn('pshare', function ($queryA) use ($user) {
$queryA->select('files.id')
->from('files')
->join('file_users', 'files.id', '=', 'file_users.file_id')
->where('files.userid', '!=', $user->userid)
->where(function ($queryB) use ($user) {
$queryB->whereIn('file_users.userid', [0, $user->userid]);
});
})
->take($take)
->get();
if ($list->isNotEmpty()) {
foreach ($list as $file) {
$temp = $file->toArray();
if ($file->pshare === $file->id) {
$temp['pid'] = 0;
}
$array[] = $temp;
}
}
}
// //
return Base::retSuccess('success', $list); return Base::retSuccess('success', $array);
} }
/** /**
@ -274,7 +298,7 @@ class FileController extends AbstractController
'created_id' => $user->userid, 'created_id' => $user->userid,
]); ]);
$file->handleDuplicateName(); $file->handleDuplicateName();
$file->saveBeforePids(); $file->saveBeforePP();
// //
$data = File::find($file->id); $data = File::find($file->id);
$data->pushMsg('add', $data); $data->pushMsg('add', $data);
@ -328,7 +352,7 @@ class FileController extends AbstractController
$data = AbstractModel::transaction(function() use ($file) { $data = AbstractModel::transaction(function() use ($file) {
$content = FileContent::select(['content', 'text', 'size'])->whereFid($file->cid)->orderByDesc('id')->first(); $content = FileContent::select(['content', 'text', 'size'])->whereFid($file->cid)->orderByDesc('id')->first();
$file->size = $content?->size ?: 0; $file->size = $content?->size ?: 0;
$file->saveBeforePids(); $file->saveBeforePP();
if ($content) { if ($content) {
$content = $content->toArray(); $content = $content->toArray();
$content['fid'] = $file->id; $content['fid'] = $file->id;
@ -407,7 +431,7 @@ class FileController extends AbstractController
// //
$file->pid = $pid; $file->pid = $pid;
$file->handleDuplicateName(); $file->handleDuplicateName();
$file->saveBeforePids(); $file->saveBeforePP();
$files[] = $file; $files[] = $file;
} }
}); });
@ -716,7 +740,7 @@ class FileController extends AbstractController
'created_id' => $user->userid, 'created_id' => $user->userid,
]); ]);
$dirRow->handleDuplicateName(); $dirRow->handleDuplicateName();
if ($dirRow->saveBeforePids()) { if ($dirRow->saveBeforePP()) {
$addItem[] = File::find($dirRow->id); $addItem[] = File::find($dirRow->id);
} }
} }
@ -786,7 +810,7 @@ class FileController extends AbstractController
// 开始创建 // 开始创建
return AbstractModel::transaction(function () use ($addItem, $webkitRelativePath, $type, $user, $data, $file) { return AbstractModel::transaction(function () use ($addItem, $webkitRelativePath, $type, $user, $data, $file) {
$file->size = $data['size'] * 1024; $file->size = $data['size'] * 1024;
$file->saveBeforePids(); $file->saveBeforePP();
// //
$data = Base::uploadMove($data, "uploads/file/" . $file->type . "/" . date("Ym") . "/" . $file->id . "/"); $data = Base::uploadMove($data, "uploads/file/" . $file->type . "/" . date("Ym") . "/" . $file->id . "/");
$content = [ $content = [

View File

@ -13,8 +13,8 @@ use Request;
* App\Models\File * App\Models\File
* *
* @property int $id * @property int $id
* @property string|null $pids 上级ID递归
* @property int|null $pid 上级ID * @property int|null $pid 上级ID
* @property string|null $pids 上级ID递归
* @property int|null $cid 复制ID * @property int|null $cid 复制ID
* @property string|null $name 名称 * @property string|null $name 名称
* @property string|null $type 类型 * @property string|null $type 类型
@ -22,6 +22,7 @@ use Request;
* @property int|null $size 大小(B) * @property int|null $size 大小(B)
* @property int|null $userid 拥有者ID * @property int|null $userid 拥有者ID
* @property int|null $share 是否共享 * @property int|null $share 是否共享
* @property int|null $pshare 所属分享ID
* @property int|null $created_id 创建者 * @property int|null $created_id 创建者
* @property \Illuminate\Support\Carbon|null $created_at * @property \Illuminate\Support\Carbon|null $created_at
* @property \Illuminate\Support\Carbon|null $updated_at * @property \Illuminate\Support\Carbon|null $updated_at
@ -39,6 +40,7 @@ use Request;
* @method static \Illuminate\Database\Eloquent\Builder|File whereName($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 wherePid($value)
* @method static \Illuminate\Database\Eloquent\Builder|File wherePids($value) * @method static \Illuminate\Database\Eloquent\Builder|File wherePids($value)
* @method static \Illuminate\Database\Eloquent\Builder|File wherePshare($value)
* @method static \Illuminate\Database\Eloquent\Builder|File whereShare($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 whereSize($value)
* @method static \Illuminate\Database\Eloquent\Builder|File whereType($value) * @method static \Illuminate\Database\Eloquent\Builder|File whereType($value)
@ -183,6 +185,7 @@ class File extends AbstractModel
AbstractModel::transaction(function () use ($share) { AbstractModel::transaction(function () use ($share) {
$this->share = $share; $this->share = $share;
$this->save(); $this->save();
File::where("pids", "like", "%,{$this->id},%")->update(['pshare' => $share ? $this->id : 0]);
if ($share === 0) { if ($share === 0) {
FileUser::deleteFileAll($this->id, $this->userid); FileUser::deleteFileAll($this->id, $this->userid);
} }
@ -223,16 +226,25 @@ class File extends AbstractModel
} }
/** /**
* 保存前更新pids * 保存前更新pids/pshare
* @return bool * @return bool
*/ */
public function saveBeforePids() public function saveBeforePP()
{ {
$pid = $this->pid; $pid = $this->pid;
$pshare = $this->share ? $this->id : 0;
$array = []; $array = [];
while ($pid > 0) { while ($pid > 0) {
$array[] = $pid; $array[] = $pid;
$pid = intval(self::whereId($pid)->value('pid')); $file = self::select(['id', 'pid', 'share'])->find($pid);
if ($file) {
$pid = $file->pid;
if ($file->share) {
$pshare = $file->id;
}
} else {
$pid = 0;
}
} }
$opids = $this->pids; $opids = $this->pids;
if ($array) { if ($array) {
@ -241,6 +253,7 @@ class File extends AbstractModel
} else { } else {
$this->pids = ''; $this->pids = '';
} }
$this->pshare = $pshare;
if (!$this->save()) { if (!$this->save()) {
return false; return false;
} }
@ -249,7 +262,7 @@ class File extends AbstractModel
self::wherePid($this->id)->chunkById(100, function ($lists) { self::wherePid($this->id)->chunkById(100, function ($lists) {
/** @var self $item */ /** @var self $item */
foreach ($lists as $item) { foreach ($lists as $item) {
$item->saveBeforePids(); $item->saveBeforePP();
} }
}); });
} }
@ -494,7 +507,7 @@ class File extends AbstractModel
'created_id' => 0, 'created_id' => 0,
]); ]);
$file->handleDuplicateName(); $file->handleDuplicateName();
$file->saveBeforePids(); $file->saveBeforePP();
// 移交文件 // 移交文件
self::whereUserid($originalUserid)->chunkById(100, function($list) use ($file, $newUserid) { self::whereUserid($originalUserid)->chunkById(100, function($list) use ($file, $newUserid) {
@ -504,7 +517,7 @@ class File extends AbstractModel
$item->pid = $file->id; $item->pid = $file->id;
} }
$item->userid = $newUserid; $item->userid = $newUserid;
$item->saveBeforePids(); $item->saveBeforePP();
} }
}); });

View File

@ -25,7 +25,7 @@ class AddFilesPids extends Migration
\App\Models\File::where('pid', '>', 0)->chunkById(100, function ($lists) { \App\Models\File::where('pid', '>', 0)->chunkById(100, function ($lists) {
/** @var \App\Models\File $item */ /** @var \App\Models\File $item */
foreach ($lists as $item) { foreach ($lists as $item) {
$item->saveBeforePids(); $item->saveBeforePP();
} }
}); });
\App\Models\File::whereShare(0)->chunkById(100, function ($lists) { \App\Models\File::whereShare(0)->chunkById(100, function ($lists) {

View File

@ -0,0 +1,46 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class AddFilesPshare extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
$isAdd = false;
Schema::table('files', function (Blueprint $table) use (&$isAdd) {
if (!Schema::hasColumn('files', 'pshare')) {
$isAdd = true;
$table->bigInteger('pshare')->nullable()->default(0)->after('share')->comment('所属分享ID');
}
});
if ($isAdd) {
\App\Models\File::whereShare(1)->chunkById(100, function ($lists) {
/** @var \App\Models\File $item */
foreach ($lists as $item) {
\App\Models\File::where("pids", "like", "%,{$item->id},%")->update(['pshare' => $item->id]);
$item->pshare = $item->id;
$item->save();
}
});
}
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::table('files', function (Blueprint $table) {
$table->dropColumn("pshare");
});
}
}

View File

@ -1410,11 +1410,11 @@ export default {
}, },
onSearchChange() { onSearchChange() {
clearTimeout(this.searchTimeout); this.searchTimeout && clearTimeout(this.searchTimeout);
if (this.searchKey.trim() != '') { if (this.searchKey.trim() != '') {
this.searchTimeout = setTimeout(() => { this.searchTimeout = setTimeout(() => {
this.loadIng++; this.loadIng++;
this.$store.dispatch("searchFiles", this.searchKey).then(() => { this.$store.dispatch("searchFiles", this.searchKey.trim()).then(() => {
this.loadIng--; this.loadIng--;
}).catch(() => { }).catch(() => {
this.loadIng--; this.loadIng--;