实现文件/文件夹搜素功能
*不支持内容搜素
This commit is contained in:
parent
07caef2555
commit
d5b04d7fdb
@ -40,7 +40,7 @@ class HomeController extends Controller
|
||||
'rules' => [
|
||||
[
|
||||
'allow' => true,
|
||||
'actions' => ['index', 'download', 'preview', 'rename', 'delete', 'upload', 'new-folder', 'download-folder', 'multi-ff-zip-dl', 'zip', 'unzip', 'paste'],
|
||||
'actions' => ['index', 'download', 'preview', 'rename', 'delete', 'upload', 'new-folder', 'download-folder', 'multi-ff-zip-dl', 'zip', 'unzip', 'paste', 'search'],
|
||||
'roles' => ['user'],
|
||||
],
|
||||
],
|
||||
@ -60,6 +60,7 @@ class HomeController extends Controller
|
||||
'zip' => ['POST'], //剩余空间检查√
|
||||
'unzip' => ['POST'], //剩余空间检查√
|
||||
'paste' => ['POST'], //剩余空间检查√
|
||||
'search' => ['POST']
|
||||
],
|
||||
],
|
||||
]
|
||||
@ -877,4 +878,43 @@ class HomeController extends Controller
|
||||
'sha256' => strtoupper($sha256),
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* @throws NotFoundHttpException
|
||||
*/
|
||||
public function actionSearch(): Response
|
||||
{
|
||||
if (Yii::$app->request->isAjax) {
|
||||
$directory = empty(Yii::$app->request->post('directory'))?'.':Yii::$app->request->post('directory');
|
||||
$keyword = Yii::$app->request->post('keyword');
|
||||
if ($keyword == null) {
|
||||
return $this->asJson(['status' => 'error', 'message' => '关键词不能为空']);
|
||||
}
|
||||
if (strlen($keyword) < 3) {
|
||||
return $this->asJson(['status' => 'error', 'message' => '关键词长度不得小于3']);
|
||||
}
|
||||
$absolutePath = Yii::getAlias(Yii::$app->params['dataDirectory']) . '/' . Yii::$app->user->id . '/' . $directory;
|
||||
// check if the directory is valid & exists
|
||||
if (!preg_match($this->pattern, $directory) || str_contains($directory, '..') || !is_dir($absolutePath)) {
|
||||
return $this->asJson(['status' => 'error', 'message' => '无效路径']);
|
||||
}
|
||||
|
||||
$directoryIterator = new RecursiveDirectoryIterator($absolutePath);
|
||||
$iterator = new RecursiveIteratorIterator($directoryIterator);
|
||||
|
||||
$results = [];
|
||||
foreach ($iterator as $file) {
|
||||
if (str_contains($file->getFilename(), $keyword)) {
|
||||
$results[] = [
|
||||
'name' => $file->getFilename(),
|
||||
'type' => FileTypeDetector::detect($file->getPathname()),
|
||||
'relativePath' => $directory.str_replace($absolutePath, '', $file->getPath())
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
return $this->asJson(['status' => 'success', 'data' => $results]);
|
||||
}
|
||||
return $this->asJson(['status' => 'error', 'message' => '非法请求']);
|
||||
}
|
||||
}
|
||||
|
@ -13,6 +13,7 @@ use app\assets\AceAsset;
|
||||
use app\assets\PlyrAsset;
|
||||
use app\assets\ViewerJsAsset;
|
||||
use app\models\CollectionTasks;
|
||||
use app\models\FileSearch;
|
||||
use app\models\NewFolderForm;
|
||||
use app\models\RenameForm;
|
||||
use app\models\Share;
|
||||
@ -78,8 +79,7 @@ $this->registerCssFile('@web/css/home_style.css');
|
||||
<li><?= Html::button('上传文件夹', ['class' => 'dropdown-item folder-upload-btn']) ?></li>
|
||||
</ul>
|
||||
</div>
|
||||
<!--TODO:文件搜索功能-->
|
||||
<button type="button" class="btn btn-primary">
|
||||
<button type="button" class="btn btn-primary" data-bs-toggle="modal" data-bs-target="#searchModal">
|
||||
<i class="fa-solid fa-magnifying-glass"></i>
|
||||
</button>
|
||||
<button type="button" class="btn btn-primary" data-bs-toggle="popover" data-bs-title="容量使用情况"
|
||||
@ -307,6 +307,35 @@ echo Html::submitButton('提交', ['class' => 'btn btn-primary']);
|
||||
ActiveForm::end();
|
||||
Modal::end();
|
||||
|
||||
Modal::begin([
|
||||
'title' => '<h4>搜素</h4>',
|
||||
'id' => 'searchModal',
|
||||
'size' => 'modal-xl',
|
||||
]);
|
||||
echo <<<EOL
|
||||
<div class="input-group mb-3">
|
||||
<input type="text" id="filesearch-keyword" class="form-control" name="keyword" value="" minlength="3" placeholder="在这里输入搜素关键词(长度要求不小于3位)" aria-label="keyword" aria-required="true" required>
|
||||
<input type="hidden" id="filesearch-directory" class="form-control" name="directory" value="$directory" readonly>
|
||||
<button class="btn btn-outline-primary" type="button" id="btnSearch">搜素</button>
|
||||
</div>
|
||||
<div id="loading" style="display: none">
|
||||
<h5 class="card-title placeholder-glow">
|
||||
<span class="placeholder col-8"></span>
|
||||
</h5>
|
||||
<p class="card-text placeholder-glow">
|
||||
<span class="placeholder col-7"></span>
|
||||
<span class="placeholder col-4"></span>
|
||||
<span class="placeholder col-4"></span>
|
||||
<span class="placeholder col-6"></span>
|
||||
<span class="placeholder col-8"></span>
|
||||
</p>
|
||||
</div>
|
||||
<div id="search-result">
|
||||
|
||||
</div>
|
||||
EOL;
|
||||
Modal::end();
|
||||
|
||||
Modal::begin([
|
||||
'title' => '<h4>视频播放</h4>',
|
||||
'id' => 'videoModal',
|
||||
|
@ -671,3 +671,43 @@ $(document).on('click', '.create-collection-btn', function () {
|
||||
|
||||
const popoverTriggerList = document.querySelectorAll('[data-bs-toggle="popover"]')
|
||||
const popoverList = [...popoverTriggerList].map(popoverTriggerEl => new bootstrap.Popover(popoverTriggerEl))
|
||||
|
||||
$(document).on('click', '#btnSearch', function () {
|
||||
var keyword = $('#filesearch-keyword').val();
|
||||
var directory = $('#filesearch-directory').val();
|
||||
$('#search-result').html('');
|
||||
$.ajax({
|
||||
type: "POST",
|
||||
url: "index.php?r=home%2Fsearch",
|
||||
data: {keyword: keyword, directory: directory},
|
||||
success: function (response) {
|
||||
if (response.status === 'success') {
|
||||
var table = '<table class="table"><tr><th style="display: table-cell;">文件/文件夹名</th><th>位置</th></tr>';
|
||||
$.each(response.data, function(index, item) {
|
||||
let path = item.relativePath;
|
||||
let correctedPath = path.replace(/\\/g, '/');
|
||||
table += '<tr><td style="display: table-cell;"> <i class="' + item.type+'"></i> '+item.name + '</td>' + '<td><a style="text-decoration: underline;" href="index.php?r=home%2Findex&directory=' + correctedPath + '">' + item.relativePath + '</a></td></tr>';
|
||||
});
|
||||
table += '</table>';
|
||||
$('#search-result').html(table);
|
||||
} else if (response.status === 'error') {
|
||||
$('#search-result').html(response.message);
|
||||
} else {
|
||||
$('#search-result').html('An error occurred while processing your request.');
|
||||
}
|
||||
},
|
||||
error: function () {
|
||||
$('#search-result').html('An error occurred while processing your request.');
|
||||
},
|
||||
beforeSend: function() {
|
||||
$('#loading').show();
|
||||
},
|
||||
complete: function() {
|
||||
$('#loading').hide();
|
||||
},
|
||||
});
|
||||
});
|
||||
$('#searchModal').on('hidden.bs.modal', function () {
|
||||
$('#search-result').html('');
|
||||
$('#filesearch-keyword').val('');
|
||||
});
|
Loading…
Reference in New Issue
Block a user