文件搜索优化

pull/291/head
midoks 2 years ago
parent c1574f3430
commit dd2105d9ab
  1. 106
      class/core/files_api.py
  2. 24
      route/static/app/files.js
  3. 57
      route/static/css/site.css
  4. 17
      route/templates/default/files.html

@ -148,12 +148,16 @@ class files_api:
if not os.path.exists(path):
path = mw.getRootDir() + "/wwwroot"
search = request.args.get('search', '').strip().lower()
search_all = request.args.get('all', '').strip().lower()
page = request.args.get('p', '1').strip().lower()
row = request.args.get('showRow', '10')
disk = request.form.get('disk', '')
if disk == 'True':
row = 1000
# return self.getAllDir(path, int(page), int(row), "wp-inlcude")
if search_all == 'yes' and search != '':
return self.getAllDir(path, int(page), int(row), search)
return self.getDir(path, int(page), int(row), search)
def createFileApi(self):
@ -830,11 +834,59 @@ class files_api:
if search:
if name.lower().find(search) == -1:
continue
# if name[0:1] == '.':
# continue
if name == '.':
continue
i += 1
return i
def getAllDir(self, path, page=1, page_size=10, search=None):
# print("search:", search)
data = {}
dirnames = []
filenames = []
count = 0
max_limit = 3000
for d_list in os.walk(path):
if count >= max_limit:
break
for d in d_list[1]:
if count >= max_limit:
break
if d.lower().find(search) != -1:
filename = d_list[0] + '/' + d
if not os.path.exists(filename):
continue
dirnames.append(self.__get_stats(filename, path))
count += 1
for f in d_list[2]:
if count >= max_limit:
break
if f.lower().find(search) != -1:
filename = d_list[0] + '/' + f
if not os.path.exists(filename):
continue
filenames.append(self.__get_stats(filename, path))
count += 1
data['DIR'] = sorted(dirnames)
data['FILES'] = sorted(filenames)
data['PATH'] = path.replace('//', '/')
info = {}
info['count'] = len(dirnames) + len(filenames)
info['row'] = page_size
info['p'] = page
info['tojs'] = 'getFiles'
pageObj = mw.getPageObject(info, '1,2,3,4,5,6,7,8')
data['PAGE'] = pageObj[0]
return mw.getJson(data)
def getDir(self, path, page=1, page_size=10, search=None):
data = {}
dirnames = []
@ -861,31 +913,14 @@ class files_api:
continue
try:
filePath = path + '/' + filename
link = ''
if os.path.islink(filePath):
filePath = os.readlink(filePath)
link = ' -> ' + filePath
if not os.path.exists(filePath):
filePath = path + '/' + filePath
if not os.path.exists(filePath):
continue
stat = os.stat(filePath)
accept = str(oct(stat.st_mode)[-3:])
mtime = str(int(stat.st_mtime))
user = ''
try:
user = pwd.getpwuid(stat.st_uid).pw_name
except Exception as ee:
user = str(stat.st_uid)
if not os.path.exists(filePath):
continue
size = str(stat.st_size)
file_stats = self.__get_stats(filePath, path)
if os.path.isdir(filePath):
dirnames.append(filename + ';' + size + ';' +
mtime + ';' + accept + ';' + user + ';' + link)
dirnames.append(file_stats)
else:
filenames.append(filename + ';' + size + ';' +
mtime + ';' + accept + ';' + user + ';' + link)
filenames.append(file_stats)
n += 1
except Exception as e:
continue
@ -894,3 +929,26 @@ class files_api:
data['PATH'] = path.replace('//', '/')
return mw.getJson(data)
def __get_stats(self, filename, path=None):
try:
stat = os.stat(filename)
accept = str(oct(stat.st_mode)[-3:])
mtime = str(int(stat.st_mtime))
user = ''
try:
user = str(pwd.getpwuid(stat.st_uid).pw_name)
except:
user = str(stat.st_uid)
size = str(stat.st_size)
link = ''
if os.path.islink(filename):
link = ' -> ' + os.readlink(filename)
if path:
tmp_path = (path + '/').replace('//', '/')
if tmp_path != '/':
filename = filename.replace(tmp_path, '', 1)
return filename + ';' + size + ';' + mtime + ';' + accept + ';' + user + ';' + link
except Exception as e:
# print(e)
return ';;;;;'

@ -289,7 +289,7 @@ function openFilename(obj){
var ext = getSuffixName(path);
// console.log(path,ext);
if (inArray(ext,['html','htm','php','txt','md','js','css','scss','json','c','h','pl','py','java','log','conf'])){
if (inArray(ext,['html','htm','php','txt','md','js','css','scss','json','c','h','pl','py','java','log','conf','sh','json'])){
onlineEditFile(0, path);
}
@ -317,6 +317,10 @@ function openFilename(obj){
}
}
function searchFile(p){
getFiles(p);
}
//取数据
function getFiles(Path) {
var searchtype = Path;
@ -342,7 +346,14 @@ function getFiles(Path) {
var data = 'path=' + Path;
var loadT = layer.load();
var totalSize = 0;
$.post('/files/get_dir?p=' + p + '&showRow=' + showRow + search, data, function(rdata) {
var search_all = '';
var all = $('#search_all').hasClass('active');
if(all){
search_all = "&all=yes";
}
$.post('/files/get_dir?p=' + p + '&showRow=' + showRow + search + search_all, data, function(rdata) {
layer.close(loadT);
var rows = ['10','50','100','200','500','1000','2000'];
@ -444,8 +455,7 @@ function getFiles(Path) {
<a class='btlink' href='javascript:;' onclick=\"cutFile('" + rdata.PATH +"/"+ fmp[0] + "')\">剪切</a> | \
<a class='btlink' href='javascript:;' onclick=\"reName(0,'" + fmp[0] + "')\">重命名</a> | \
<a class='btlink' href=\"javascript:setChmod(0,'" + rdata.PATH +"/"+ fmp[0] + "');\">权限</a> | \
<a class='btlink' href=\"javascript:zip('" + rdata.PATH +"/" +fmp[0] + "');\">压缩</a> | \
"+bodyZip+download+"\
<a class='btlink' href=\"javascript:zip('" + rdata.PATH +"/" +fmp[0] + "');\">压缩</a> | "+bodyZip+download+"\
<a class='btlink' href='javascript:;' onclick=\"deleteFile('" + rdata.PATH +"/"+ fmp[0] + "')\">删除</a>\
</span></td>\
</tr>";
@ -459,9 +469,9 @@ function getFiles(Path) {
</div>";
}
}
var dirInfo = '(共{1}个目录与{2}个文件,大小:'.replace('{1}',rdata.DIR.length+'').replace('{2}',rdata.DIR.length+'')+'<font id="pathSize">'
var dirInfo = '(共{1}个目录与{2}个文件,大小:'.replace('{1}',rdata.DIR.length+'').replace('{2}',rdata.FILES.length+'')+'<font id="pathSize">'
+ (toSize(totalSize))+'<a class="btlink ml5" onClick="getPathSize()">获取</a></font>)';
$("#DirInfo").html(dirInfo);
$("#dir_info").html(dirInfo);
if( getCookie('rank') == 'a' ){
var tablehtml = '<table width="100%" border="0" cellpadding="0" cellspacing="0" class="table table-hover">\
<thead>\
@ -791,7 +801,7 @@ function getSuffixName(fileName){
'gif','ico','jpeg','jpg','JPG','png','psd','webp','ape','avi','flv','mkv','mov','mp3','mp4','mpeg',
'mpg','rm','rmvb','swf','wav','webm','wma','wmv','doc','docm','dotx','dotm','dot','rtf','docx','pdf',
'fdf','ppt','pptm','pot','potm','pptx','txt','xls','csv','xlsm','xlsb','xlsx','7z','gz','cab','iso',
'rar','zip','bt','file','apk','css','scss','svg','pl','py','php','md'];
'rar','zip','bt','file','apk','css','scss','svg','pl','py','php','md','json','sh'];
var extLastName = extArr[extArr.length - 1];
for(var i=0; i<exts.length; i++){
if(exts[i]==extLastName){

@ -4813,8 +4813,63 @@ select[disabled]{
bottom:10px;
right:10px;
}
.shell_btn_close{
.shell_btn_close {
margin-right:8px;
}
.file_search {
position: absolute;
right: 58px;
font-size: 12px;
color: #666;
width: 85px;
border-top: none;
background: #fff;
height: 8px;
line-height: 48px;
top: 0;
}
.file_search .file_search_checked {
position: relative;
height: 15px;
width: 15px;
border-radius: 1px;
cursor: pointer;
text-align: center;
margin: 0;
vertical-align: sub;
border:1px solid #aaa;
border-radius: 2px;
display: inline-block;
font-family: 'Glyphicons Halflings';
font-style: normal;
font-weight: 400;
line-height: 1;
-webkit-font-smoothing: antialiased;
}
.file_search .file_search_checked.active {
background: #20a53a;
color: #fff;
border-color:#20a53a ;
}
.file_search .file_search_checked.active:after {
content: "\e013";
font-size: 12px;
transform: scale(.85);
position: absolute;
left: .75px;
top: .75px;
}
.file_search label {
position: absolute;
right: 5px;
cursor: pointer;
top: 0;
font-weight: 400;
}

@ -13,11 +13,15 @@
<span id='DirPathPlace' class="pull-left"><input id="fileInputPath" type="text"></span>
<span id='PathPlaceBtn' class="pull-left"></span>
</div>
<div class="pull-left mlr15" style="line-height:26px"><span id='DirInfo'></span></div>
<div class="pull-left mlr15" style="line-height:26px"><span id='dir_info'></span></div>
<div class="search pull-right" style="position: absolute; top: 6px; right: 5px;">
<form target="hid" onsubmit='getFiles(1)'>
<input type="text" id="SearchValue" class="ser-text pull-left" placeholder="" />
<button type="button" class="ser-sub pull-left" onclick='getFiles(1)'></button>
<form target="hid">
<input type="text" id="SearchValue" class="ser-text pull-left" placeholder="搜索文件/目录" />
<button type="button" class="ser-sub pull-left" onclick='searchFile(1)'></button>
<div class="file_search" draggable="false">
<div id="search_all" class="file_search_checked"></div>
<label for="search_all">包含子目录</label>
</div>
</form>
<iframe name='hid' id="hid" style="display:none"></iframe>
</div>
@ -93,5 +97,10 @@ $("#set_list").click(function() {
$(".refreshBtn").click(function() {
getFiles(getCookie('open_dir_path'));
})
$('#search_all').click(function(){
$(this).toggleClass('active');
});
</script>
{% endblock %}
Loading…
Cancel
Save