version 4.36 release

pull/299/head
warlee 2018-09-29 00:34:47 +08:00
parent 14ea6cea31
commit c9cb4282a0
62 changed files with 7523 additions and 1121 deletions

View File

@ -1,3 +1,36 @@
### ver4.36 `2018/09/28`
-----
#### update:
- 上传加入断点续传断点续传分片指纹提取算法优化20倍速度提升失败重传加入延时机制
- 插件配置文件选择组件支持配置参数同文件选择组件参数插件表单组件formMake增强
- 断点续传分片重传加入延时断网等类似情况下15s内自动上传
- 通用前端worker调用支持
- 分享的的失效时间可以设置当前时间前
- 分享的的失效时间是否可以设置到分钟
- 分享后设置禁止下载,禁用打开方式等相关操作
- https的curl请求加入ssl版本声明兼容性调整
- 移动端上传对话框样式优化
- 用户使用空间大小变更优化
- 子目录集成父部们权限优化
- ios拍照上传失败问题; 图片或视频分片上传后重命名优化处理(用一个文件不同分片采用同一个文件名)
- ios上传视频多选(非Safari的其他浏览器不支持多选0B)
- 移动端管理菜单二级菜单点击展开异常问题;移动端touch事件穿透问题
- 移动端文件管理菜部分单点区域击不响应问题处理;
- 细节样式等优化
- 解压缩增强优化
- zip64解压支持支持解压超过4G的zip文件
- zip文件查看打开大文件内部列表处理采用worker处理优化打开压缩文件内含有超多目录情况页面异步处理.优化操作体验
- 压缩文件夹,文件夹内文件含有中文问题处理;自适应当前操作系统的中文编码
- 压缩文件夹预览,没有写权限也允许查看(个人可查看部门压缩文件内容)
- 压缩文件夹解压权限优化(没有写权限的目录,不允许解压到该目录;公共目录下的压缩文件没有写权限不可解压)
#### fix bug
- windows下中文搜索文件名编码问题处理
- 文件选择组件打开时将其他对话框确定按钮置disable处理
- 上传过程中取消某个上传,没有终止问题处理;
### ver4.35 `2018/09/5`
-----
#### update:

View File

@ -984,12 +984,14 @@ class explorer extends Controller{
if($checkSpaceChange){Hook::trigger("explorer.zipBefore",$zipname);}
$result = KodArchive::create($zipname,$files);
if($checkSpaceChange){Hook::trigger("explorer.zipAfter",$zipname);}
if ($result == 0) {
show_json("压缩失败!",false);
}
$info = LNG('zip_success').LNG('size').":".size_format(filesize($zipname));
if ($zipPath=='') {
show_json($info,true,_DIR_OUT(iconv_app($zipname)) );
if(file_exists($zipname)){
$info = LNG('zip_success').LNG('size').":".size_format(filesize($zipname));
show_json($info,true,_DIR_OUT(iconv_app($zipname)) );
}else{
show_json(LNG.error,false);
}
}else{
return iconv_app($zipname);
}

View File

@ -40,7 +40,11 @@ class pluginApp extends Controller{
}
show_tips("出错了!插件未开启,或您没有{$app}插件的权限");
}
Hook::trigger("pluginRun.before",$app.'Plugin.'.$action);
Hook::trigger($app.'Plugin.'.$action.'.before');
Hook::apply($app.'Plugin.'.$action);
Hook::trigger($app.'Plugin.'.$action.'.after');
Hook::trigger("pluginRun.after",$app.'Plugin.'.$action);
}
}

View File

@ -266,7 +266,7 @@ class share extends Controller{
header("Content-Type: application/javascript; charset=utf-8");
echo 'if(typeof(kodReady)=="undefined"){kodReady=[];}';
Hook::trigger('user.commonJs.insert',$this->in['st'],$this->in['act']);
echo 'AUTH=[];';
echo ';AUTH=[];';
echo 'G='.json_encode($theConfig).';';
$lang = json_encode_force(I18n::getAll());
if(!$lang){

View File

@ -299,7 +299,7 @@ class user extends Controller{
header("Content-Type: application/javascript; charset=utf-8");
echo 'if(typeof(kodReady)=="undefined"){kodReady=[];}';
Hook::trigger('user.commonJs.insert',$this->in['st'],$this->in['act']);
echo 'AUTH='.json_encode($GLOBALS['auth']).';';
echo ';AUTH='.json_encode($GLOBALS['auth']).';';
echo 'G='.json_encode($theConfig).';';
$lang = json_encode_force(I18n::getAll());

File diff suppressed because one or more lines are too long

View File

@ -621,16 +621,24 @@ function show_trace(){
exit;
}
function file_sub_str($file,$start=0,$len=0){
$fp = fopen($file,'r');
fseek($fp,$start);
$res = fread($fp,$len);
fclose($fp);
return $res;
}
function str2hex($string){
$hex='';
for($i=0;$i<strlen($string);$i++){
$hex .= sprintf('%02s',dechex(ord($string[$i])));
$hex .= sprintf('%02s ',dechex(ord($string[$i])));
}
$hex = strtoupper($hex);
return $hex;
}
function hex2str($hex){
$hex = str_replace(" ",'',$hex);
$string='';
for ($i=0; $i < strlen($hex)-1; $i+=2){
$string .= chr(hexdec($hex[$i].$hex[$i+1]));
@ -788,84 +796,60 @@ function msubstr($str, $start = 0, $length, $charset = "utf-8", $suffix = true){
$slice = join("", array_slice($match[0], $start, $length));
if ($suffix) return $slice . "";
return $slice;
}
}
/**
* 获取变量的名字
* eg hello="123" 获取ss字符串
*/
function get_var_name(&$aVar){
foreach($GLOBALS as $key => $var) {
if ($aVar == $GLOBALS[$key] && $key != "argc") {
return $key;
}
}
}
// -----------------变量调试-------------------
/**
* 格式化输出变量,或者对象
*
* @param mixed $var
* @param boolean $exit
* @param args;
* 默认自动退出最后一个参数为false时不退出
*/
function pr($var, $exit = false){
function pr_replace_callback($matches){
return "\n".str_repeat(" ",strlen($matches[1])*2).$matches[2];
}
function pr(){
ob_start();
$style = '<style>
pre#debug{margin:10px;font-size:14px;color:#222;font-family:Consolas ;line-height:1.2em;background:#f6f6f6;border-left:5px solid #444;padding:5px;width:95%;word-break:break-all;}
pre#debug{margin:10px;font-size:14px;color:#222;font-family:Consolas ;line-height:1.2em;background:#f6f6f6;
border-left:5px solid #444;padding:10px;width:95%;word-break:break-all;white-space:pre-wrap;word-wrap: break-word;}
pre#debug b{font-weight:400;}
#debug #debug_str{color:#E75B22;}
#debug #debug_keywords{font-weight:800;color:00f;}
#debug #debug_tag1{color:#22f;}
#debug #debug_tag2{color:#f33;font-weight:800;}
#debug #debug_var{color:#33f;}
#debug #debug_var_str{color:#f00;}
#debug #debug_keywords{font-weight:200;color:#888;}
#debug #debug_tag{color:#222 !important;}
#debug #debug_var{color:#f60;}
#debug #debug_var_str,#debug #debug_var_str #debug_keywords{color:#f44336;}
#debug #debug_set{color:#0C9CAE;}</style>';
if (is_array($var)) {
print_r($var);
} else if (is_object($var)) {
echo get_class($var) . " Object";
} else if (is_resource($var)) {
echo (string)$var;
} else {
echo var_dump($var);
}
$out = ob_get_clean(); //缓冲输出给$out 变量
$out = preg_replace('/"(.*)"/', '<b id="debug_var_str">"' . '\\1' . '"</b>', $out); //高亮字符串变量
$out = preg_replace('/=\>(.*)/', '=>' . '<b id="debug_str">' . '\\1' . '</b>', $out); //高亮=>后面的值
$out = preg_replace('/\[(.*)\]/', '<b id="debug_tag1">[</b><b id="debug_var">' . '\\1' . '</b><b id="debug_tag1">]</b>', $out); //高亮变量
$from = array(' ', '(', ')', '=>');
$to = array(' ', '<b id="debug_tag2">(</i>', '<b id="debug_tag2">)</b>', '<b id="debug_set">=></b>');
$out = str_replace($from, $to, $out);
$keywords = array('Array', 'int', 'string', 'class', 'object', 'null'); //关键字高亮
ob_start();
$arg = func_get_args();
$num = func_num_args();
$exit = true;
for ($i=0; $i < $num; $i++) {
if($i == $num-1 && $arg[$i] == true){
$exit = false;
}
var_dump($arg[$i]);
}
$out = ob_get_clean(); //缓冲输出给$out 变量
$out = preg_replace('/=\>\n\s+/',' => ',$out); //高亮=>后面的值
$out = preg_replace_callback('/\n(\s*)([\}\[])/','pr_replace_callback',$out); //高亮=>后面的值
$out = preg_replace('/"(.*)"/','<b id="debug_var_str">"\\1"</b>', $out); //高亮字符串变量
$out = preg_replace('/\[(.*)\]/','<b id="debug_tag">[</b><b id="debug_var">\\1</b><b id="debug_tag">]</b>', $out); //高亮变量
$out = preg_replace('/\((.*)\)/','<b id="debug_tag">(</b><b id="debug_var">\\1</b><b id="debug_tag">)</b>', $out); //高亮变量
$out = str_replace(array('=>',"\n\n"), array('<b id="debug_set">=></b>',"\n"), $out);
$keywords = array('array','int','string','class','object','null','float','bool'); //关键字高亮
$keywords_to = $keywords;
foreach($keywords as $key => $val) {
$keywords_to[$key] = '<b id="debug_keywords">' . $val . '</b>';
}
}
$out = str_replace($keywords, $keywords_to, $out);
$out = str_replace("\n\n", "\n", $out);
echo $style . '<pre id="debug"><b id="debug_keywords">' . get_var_name($var) . '</b> = ' . $out . '</pre>';
echo $style.'<pre id="debug">'.$out.'</pre>';
if ($exit) exit; //为真则退出
}
/**
* 调试输出变量,对象的值。
* 参数任意个(任意类型的变量)
*
* @return echo
*/
function debug_out(){
$avg_num = func_num_args();
$avg_list = func_get_args();
ob_start();
for($i = 0; $i < $avg_num; $i++) {
pr($avg_list[$i]);
}
$out = ob_get_clean();
echo $out;
exit;
}
function dump(){call_user_func('pr',func_get_args());}
function debug_out(){call_user_func('pr',func_get_args());}
/**
* $from~$to范围内的随机数

View File

@ -649,6 +649,10 @@ function recursion_dir($path,&$dir,&$file,$deepest=-1,$deep=0){
closedir($dh);
return true;
}
function dir_list($path){
recursion_dir($path,$dirs,$files);
return array_merge($dirs,$files);
}
/**
* 借用临时文件方式对读写文件进行锁定标记
@ -735,6 +739,9 @@ function file_read_safe($file,$timeout = 5){
$result = @fread($fp, filesize($file));
flock($fp,LOCK_UN);
fclose($fp);
if(filesize($file) == 0){
return '';
}
return $result;
}else{
flock($fp,LOCK_UN);fclose($fp);
@ -776,7 +783,6 @@ function file_wirte_safe($file,$buffer,$timeout=5){
}
}
/*
* $search 为包含的字符串
* is_content 表示是否搜索文件内容;默认不搜索
@ -816,7 +822,7 @@ function path_search($path,$search,$is_content=false,$file_ext='',$is_case=false
}
}else{
$path_this = get_path_this($f);
if ($strpos($path_this,$search) !== false){//搜索文件名;
if ($strpos($path_this,iconv_system($search)) !== false){//搜索文件名;
$result['fileList'][] = file_info($f);
$result_num ++;
}
@ -825,7 +831,7 @@ function path_search($path,$search,$is_content=false,$file_ext='',$is_case=false
if (!$is_content && $file_ext == '' ) {//没有指定搜索文件内容,且没有限定扩展名,才搜索文件夹
foreach($dirs as $f){
$path_this = get_path_this($f);
if ($strpos($path_this,$search) !== false){
if ($strpos($path_this,iconv_system($search)) !== false){
$result['folderList'][]= array(
'name' => iconv_app(get_path_this($f)),
'path' => iconv_app($f)
@ -851,9 +857,7 @@ function file_search($path,$search,$is_case){
unset($content);
return false;
}
$charset = get_charset($content);
//搜索关键字为纯英文则直接搜索含有中文则转为utf8再搜索为兼容其他文件编码格式
$notAscii = preg_match("/[\x7f-\xff]/", $search);
if($notAscii && !in_array($charset,array('utf-8','ascii'))){
@ -879,7 +883,6 @@ function file_search($path,$search,$is_case){
}
}
$arr_line = array();
$pose = 0;
while ( $pose !== false) {
@ -892,7 +895,6 @@ function file_search($path,$search,$is_case){
}
}
$arr_line[] = $file_size;//文件只有一行而且没有换行,则构造虚拟换行
$result = array();// [2,10,22,45,60] [20,30,40,50,55]
$len_search = count($arr_search);
$len_line = count($arr_line);
@ -1308,8 +1310,13 @@ function check_upload($error){
//拍照上传
function updload_ios_check($fileName,$in){
if(!is_wap()) return $fileName;
if($fileName == "image.jpg" || $fileName == "image.jpeg"){
return date('YmdHis',time()).'-'.rand_string(4,1).'.jpg';
$time = strtotime($in['lastModifiedDate']);
$time = $time ? $time : time();
$beforeName = strtolower($fileName);
if($beforeName == "image.jpg" || $beforeName == "image.jpeg"){
$fileName = date('Ymd',$time).'_'.$in['size'].'.jpg';
}else if($beforeName == "capturedvideo.mov"){
$fileName = date('Ymd',$time).'_'.$in['size'].'.mov';
}
return $fileName;
}
@ -1369,22 +1376,48 @@ function upload($path,$tempPath,$repeatAction='replace'){
}
}
/**
* 简易文件hash获取;替代md5_file;
* md5(文件头6字节+中间6字节+结尾6字节)
*/
function file_hash_simple($file){
$fileSize = filesize($file);
$sliceLength = 6;
if($fileSize <= $sliceLength){
$sliceString = file_get_contents($file);
}else{
$fp = fopen($file,'r');
$sliceString = fread($fp,$sliceLength);
fseek($fp,($fileSize-$sliceLength)/2);
$sliceString .= fread($fp,$sliceLength);
fseek($fp,$fileSize-$sliceLength);
$sliceString .= fread($fp,$sliceLength);
fclose($fp);
}
$hash = $fileSize;
for ($i=0; $i < strlen($sliceString); $i++) {
$hash = $hash.",".ord($sliceString[$i]);
}
return md5($hash);
}
function upload_chunk($uploadFile,$tempPath,$savePath){
global $in;
$chunk = isset($in["chunk"]) ? intval($in["chunk"]) : 0;
$chunks = isset($in["chunks"]) ? intval($in["chunks"]) : 1;
$check_md5 = isset($in["check_md5"]) ? $in["check_md5"] : false;
//if(mt_rand(0, 100) < 50) die("server error".$chunk); //分片失败重传
//if(mt_rand(0, 100) > 10) die("server error".$chunk); //模拟失败
//文件分块检测是否已上传,已上传则忽略;断点续传
if($check_md5 !== false){
$chunk_file_pre = $tempPath.md5($savePath).'.part';
$chunk_file = $chunk_file_pre.$chunk;
if( file_exists($chunk_file) && md5_file($chunk_file) == $check_md5){
if( file_exists($chunk_file) && file_hash_simple($chunk_file) == $check_md5){
$arr = array();
for($index = 0; $index<$chunks; $index++ ){
if(file_exists($chunk_file_pre.$index)){
$arr['part_'.$index] = md5_file($chunk_file_pre.$index);
$arr['part_'.$index] = file_hash_simple($chunk_file_pre.$index);
}
}
show_json('success',true,$arr);

View File

@ -361,6 +361,7 @@ function url_request($url,$method='GET',$data=false,$headers=false,$options=fals
curl_setopt($ch, CURLINFO_HEADER_OUT, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($ch, CURLOPT_SSLVERSION,1);//1|5|6; http://t.cn/RZy5nXF
curl_setopt($ch, CURLOPT_TIMEOUT,$timeout);
curl_setopt($ch, CURLOPT_REFERER,get_url_link($url));
curl_setopt($ch, CURLOPT_USERAGENT,'Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.94 Safari/537.36');
@ -383,7 +384,7 @@ function url_request($url,$method='GET',$data=false,$headers=false,$options=fals
curl_setopt($ch, CURLOPT_NOPROGRESS, false);
curl_setopt($ch, CURLOPT_PROGRESSFUNCTION,'curl_progress_set');
curl_setopt($ch,CURLOPT_HTTPGET,1);
curl_setopt($ch, CURLOPT_HTTPGET,1);
curl_setopt($ch, CURLOPT_HEADER,0);//不输出头
curl_setopt($ch, CURLOPT_FILE, $fp);
//CURLOPT_RETURNTRANSFER 必须放在CURLOPT_FILE前面;否则出问题

View File

@ -171,7 +171,7 @@ class FileCache{
$str = file_read_safe($file,10.5);
if( $str === false || $str === 0 || $str === -1){
show_tips('[Error Code:1011] FileCache data error!'.$file);
show_tips('[Error Code:1010] FileCache data read error!<br/>'.get_path_this($file));
}
if (strlen($str) == 0 ||
@ -182,7 +182,7 @@ class FileCache{
}
if($str === false || strlen($str) < strlen(CONFIG_EXIT) ){
show_tips('[Error Code:1011] FileCache data error!'.$file);
show_tips('[Error Code:1011] FileCache data error!<br/>'.get_path_this($file));
}
$data= json_decode(substr($str, strlen(CONFIG_EXIT)),true);
if (is_null($data)) $data = array();
@ -208,12 +208,12 @@ class FileCache{
$jsonStr = json_encode($data);
}
if(is_null($jsonStr) || strlen($jsonStr) == 0){//含有二进制或非utf8字符串对应检测
show_tips('json_encode error!');
show_tips('[Error Code:1013] json_encode error!<br/>'.get_path_this($file));
}
$result = file_wirte_safe($file,CONFIG_EXIT.$jsonStr,10.5);
if($result === false){
show_tips('[Error Code:1012] FileCache save error!'.$file);
show_tips('[Error Code:1012] FileCache save error!<br/>'.get_path_this($file));
}
return $result;
}

View File

@ -18,7 +18,7 @@ require_once ARCHIVE_LIB.'pcltrace.lib.php';
require_once ARCHIVE_LIB.'pcltar.lib.php';
require_once ARCHIVE_LIB.'pclzip.class.php';
require_once ARCHIVE_LIB.'kodRarArchive.class.php';
require_once ARCHIVE_LIB.'kodZipArchive.class.php';
class KodArchive {
/**
@ -87,8 +87,12 @@ class KodArchive {
$result = $appResult['data'];
}
}else{//默认zip
$zip = new PclZip($file);
$result = $zip->listContent();
if(kodZipArchive::support()){
$result = kodZipArchive::listContent($file);
}else{
$zip = new PclZip($file);
$result = $zip->listContent();
}
}
if($result){
@ -167,6 +171,8 @@ class KodArchive {
return array('code'=>$result,'data'=>PclErrorString(true));
}else if( self::checkIfType($ext,'rar')){ // || $ext == 'zip'
return kodRarArchive::extract($file,$dest,$ext,$partName);
}else if(kodZipArchive::support()){
return kodZipArchive::extract($file,$dest,$partName);
}else{
$zip = new PclZip($file);
//解压内部的一部分,按文件名或文件夹来
@ -253,40 +259,25 @@ class KodArchive {
mk_dir($temp);
touch(TEMP_PATH.'archivePreview/index.html');
$newFile = $temp.md5($file.$index.$byName);
if($index == 'byname' && $byName){
if(file_exists($newFile)){
file_put_out($newFile,$download,get_path_this($byName));
return;
}
$zip = new PclZip($file);
$filenameOutput = get_path_this($byName);
$outFile = unzip_filter_ext($temp.$filenameOutput);
$result = $zip->extract(
PCLZIP_OPT_PATH,$temp,
PCLZIP_CB_PRE_FILE_NAME,'unzip_pre_name',
PCLZIP_OPT_REMOVE_PATH,get_path_father($byName),
PCLZIP_OPT_BY_NAME,$byName);
}else{
$partName = '';
$result = self::extract($file, $temp,$index,$partName);
if(is_array($partName)){//不能是数组——文件夹
show_json('unzip preview folder error!');
}
if(file_exists($newFile)){
file_put_out($newFile,$download,get_path_this($partName));
return;
}
//$partName 压缩文件原名;初始编码;转为当前文件系统编码
$partName = unzip_pre_name($partName);
$filenameOutput = get_path_this($partName);
$outFile = unzip_filter_ext($temp.$filenameOutput);
if(!$result['code']){
show_json($result['data'],false);
}
$partName = '';//引用传值,传入处理
$result = self::extract($file, $temp,$index,$partName);
if(is_array($partName)){//不能是数组——文件夹
show_json('unzip preview folder error!',false);
}
if(file_exists($newFile)){
file_put_out($newFile,$download,get_path_this($partName));
return;
}
//$partName 压缩文件原名;初始编码;转为当前文件系统编码
$partName = unzip_pre_name($partName);
$filenameOutput = get_path_this($partName);
$outFile = unzip_filter_ext($temp.$filenameOutput);
if(!$result['code']){
show_json($result['data'],false);
}
//debug_out($partName,$file,$outFile,$byName);
if(!file_exists($outFile)){
show_json('unzip error!');
show_json('unzip error!',false);
}
@rename($outFile,$newFile);
if(!file_exists($newFile)){
@ -305,6 +296,9 @@ class KodArchive {
$ext = get_path_ext($file);
$result = false;
if( self::checkIfType($ext,'zip') ){
if(kodZipArchive::support()){
return kodZipArchive::create($file,$files);
}
$archive = new PclZip($file);
foreach ($files as $key =>$val) {
$val = str_replace('//','/',$val);
@ -323,11 +317,9 @@ class KodArchive {
}
}else if( self::checkIfType($ext,'tar') ){
//TrOn(10);
$test = array($files);
foreach ($files as $key =>$val) {
$val = str_replace('//','/',$val);
$removePathPre = _DIR_CLEAR(get_path_father($val));
$test[] = array($val,$removePathPre);
if($key == 0){
$result = PclTarCreate($file,array($val), $ext,null, $removePathPre);
continue;
@ -338,4 +330,4 @@ class KodArchive {
}
return $result;
}
}
}

View File

@ -17,6 +17,7 @@
* ------------
* 7zip命令行:http://blog.csdn.net/earbao/article/details/51382534
* rar命令行 :http://www.cnblogs.com/fetty/p/4769279.html
* 7za命令行 :https://www.mankier.com/1/7za //当rar解压失败时尝试调用系统内置7za解压; 支持大于60G文件
*/
@ -81,7 +82,21 @@ class kodRarArchive {
}
}
$result = self::run($command);
//pr($result);pr($command);exit;
//7za 兼容 rar解压大文件
if(strstr($result['data'],'is not RAR archive') && shell_exec('7za')){
$param = ' -y -o'.escapeShell($dest).' '.escapeShell($file).' ';
if($partName === false){
$command = '7za x'.$param;
}else if(is_array($partName)){
$command = '7za x'.$param.escapeShell($partName[0]);
}else{
$command = '7za e'.$param.escapeShell($partName);
}
$result = self::run($command);
}
//echo "<pre>";var_dump($result,$command);exit;
if(!$result['code']){
return $result;
}
@ -90,7 +105,6 @@ class kodRarArchive {
if( is_array($partName) ){
$thePath = trim(str_replace("\\",'/',$partName[0]),'/');
$pathGroup = explode('/',$thePath);
//一级目录解压不用移动
if(count($pathGroup) > 1){
move_path($dest.$partName[0],$dest.get_path_this($thePath));
@ -101,21 +115,8 @@ class kodRarArchive {
}
//扩展名处理;文件名重命名处理
recursion_dir($dest,$dirs,$files,-1,0);
foreach($dirs as $f){
$itemPath = str_replace(array($dest,"\\"),array('','/'),$f);
$itemPath = unzip_pre_name($itemPath);
$from = $dest.get_path_father($itemPath).get_path_this($f);
if(strstr($itemPath,'/') == false){
$from = $dest.get_path_this($f);
}
//echo $from.'==><br/>'.$dest.$itemPath.'<hr/>';
if($dest.$itemPath != $from){
@rename($from,$dest.$itemPath);
}
}
foreach($files as $f){
$arr = dir_list($dest);
foreach($arr as $f){
$itemPath = str_replace(array($dest,"\\"),array('','/'),$f);
$itemPath = unzip_pre_name($itemPath);
$from = $dest.get_path_father($itemPath).get_path_this($f);
@ -141,7 +142,11 @@ class kodRarArchive {
static function listContentRar($file) {
$command = self::bin('rar').' v '.escapeShell($file);
$result = self::run($command);
$result = self::run($command);
//7za 兼容 rar解压大文件
if(strstr($result['data'],'is not RAR archive') && shell_exec('7za')){
return self::listContent7z($file,'7za l ');
}
if(!$result['code']){
return $result;
}
@ -178,8 +183,11 @@ class kodRarArchive {
//debug_out($result,$match,$matchItem,$itemArr);
return array('code'=>true,'data'=>$itemArr);
}
static function listContent7z($file) {
static function listContent7z($file,$bin=false) {
$command = self::bin('7z').' l '.escapeShell($file);
if($bin){
$command = $bin.escapeShell($file);
}
$result = self::run($command);
if(!$result['code']){
return $result;
@ -231,7 +239,6 @@ class kodRarArchive {
// $command = $command.self::bin().' a -r -y -t'.$ext.' '.$passwd.' "'.$file.'" *';
// return self::run($command);
// }
}
// 不允许双引号

View File

@ -0,0 +1,142 @@
<?php
/*
* @link http://kodcloud.com/
* @author warlee | e-mail:kodcloud@qq.com
* @copyright warlee 2014.(Shanghai)Co.,Ltd
* @license http://kodcloud.com/tools/license/license.txt
*/
// ZipArchive 解压缩
class kodZipArchive{
static $listCache = array();
static function support(){
if(!defined("ZIP_ARCHIVE_LOCAL")){
return false;
}
return class_exists('ZipArchive');
}
static function listContent($file){
$file_hash = hash_path($file);
if(isset(self::$listCache[$file_hash])){
return self::$listCache[$file_hash];
}
$zip = new ZipArchive();
$zip->open($file);
$count = $zip->numFiles;
for ($i = 0; $i < $count; $i++) {
$entry = $zip->statIndex($i);
$filename = str_replace('\\', '/', $entry['name']);
$result[] = array(
'filename' => $entry['name'],
'stored_filename' => $entry['name'],
'size' => $entry['size'],
'compressed_size' => $entry['comp_size'],
'mtime' => $entry['mtime'],
'index' => $i,
'folder' => (substr($entry['name'], -1, 1) == '/'),
'crc' => $entry['crc']
);
}
self::$listCache[$file_hash] = $result;
return $result;
}
/**
* [extract description]
* @param [type] $file [archive file]
* @param [type] $dest [extract to folder]
* @param string $part [archive file content]
* @return [type] [array]
*/
static function extract($file,$dest,$partName=false) {
$dest_before = $dest;
$dest = TEMP_PATH.'archivePreview/'.md5(rand_string(40).time()).'/';
mk_dir($dest);touch(TEMP_PATH.'archivePreview/index.html');
$zip = new ZipArchive();
if(!$zip->open($file)){
return array('code'=>false,'data'=>'Can not open zip file!');
}
if($partName === false){
$result = $zip->extractTo($dest);
}else{
if(!is_array($partName)){
$partName = array($partName);
}
$matchFiles = $partName;
//解压文件夹
if(substr($partName[0], -1, 1) == '/'){
$matchFiles = array();
$list = self::listContent($file);
foreach ($list as $item) {
if ( strpos($item['filename'],$partName[0]) === 0 ) {
$matchFiles[] = $item['filename'];
}
}
}
$result = $zip->extractTo($dest,$matchFiles);
}
$zip->close();
//子目录解压移除多余层级目录
if( is_array(c) ){
$thePath = trim(str_replace("\\",'/',$partName[0]),'/');
$pathGroup = explode('/',$thePath);
//一级目录解压不用移动
if(count($pathGroup) > 1){
move_path($dest.$partName[0],$dest.get_path_this($thePath));
del_dir($dest.$pathGroup[0]);
}else{
$dest_before = get_path_father($dest_before);
}
}
//扩展名处理;文件名重命名处理
$arr = dir_list($dest);
foreach($arr as $f){
$itemPath = str_replace(array($dest,"\\"),array('','/'),$f);
$itemPath = unzip_pre_name($itemPath);
$from = $dest.get_path_father($itemPath).get_path_this($f);
if(strstr($itemPath,'/') == false){
$from = $dest.get_path_this($f);
}
if($dest.$itemPath != $from){
@rename($from,$dest.$itemPath);
}
}
move_path($dest,$dest_before);
del_dir(rtrim($dest,'/'));
return array('code'=>$result,'data'=>$result);
}
/**
* [create description]
* @param [type] $file [creat file to]
* @param [type] $files [array from]
* @return [type] [description]
*/
static function create($file,$files) {
$zip = new ZipArchive();
if(!$zip->open($file, ZipArchive::CREATE)){
return false;//Can not open(create) zip file!'
}
foreach ($files as $key =>$val) {
$val = str_replace(array('//','\\'),'/',$val);
$removePathPre = _DIR_CLEAR(get_path_father($val));
$list = array($val);
if(is_dir($val)){
$list = dir_list($val);
}
foreach ($list as $item) {
$addName = zip_pre_name(str_replace($removePathPre,'',$item));
if(is_dir($item)){
$result = $zip->addEmptyDir($addName);
}else{
$result = $zip->addFile($item,$addName);
}
}
}
$zip->close();
return $result;
}
}

View File

@ -2,6 +2,11 @@
//changed by warlee --kodcloud
//add pre name filter; PCLZIP_CB_PRE_FILE_NAME
// zip64 support;
//https://blog.csdn.net/a200710716/article/details/51644421
//https://github.com/brokencube/ZipStream64/blob/14087549a4914bfc441a396ca02849569145a273/src/ZipStream.php#L808
//https://pkware.cachefly.net/webdocs/APPNOTE/APPNOTE-6.2.0.txt
//
// --------------------------------------------------------------------------------
// PhpConcept Library - Zip Module 2.8.2
@ -3275,6 +3280,7 @@
$p_info['index'] = $p_header['index'];
$p_info['status'] = $p_header['status'];
$p_info['crc'] = $p_header['crc'];
$p_info['offset'] = $p_header['offset'];//add by warlee;
// ----- Return
return $v_result;
@ -4315,9 +4321,10 @@
// ----- Check signature
if ($v_data['id'] != 0x04034b50)
{
pr($p_header,$v_data,0x04034b50,str2hex($v_binary_data));
// ----- Error log
PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, 'Invalid archive structure');
PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, 'privReadFileHeader:Invalid archive structure');
// ----- Return
return PclZip::errorCode();
@ -4333,7 +4340,7 @@
$p_header['status'] = "invalid_header";
// ----- Error log
PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, "Invalid block size : ".strlen($v_binary_data));
PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, "privReadFileHeader:Invalid block size : ".strlen($v_binary_data));
// ----- Return
return PclZip::errorCode();
@ -4395,11 +4402,41 @@
// ----- Set the status field
$p_header['status'] = "ok";
$this->readZip64ExtraData($p_header);//add by warlee;
// ----- Return
return $v_result;
}
// --------------------------------------------------------------------------------
//zip64 footer:extra data;add by warlee;
//64位文件头读取处理
function readZip64ExtraData(&$p_header){
if(!$this->zip64 || !$p_header['extra']){
return;
}
$p_extra_data = unpack('va/vb/Psize/Pcompressed_size/Poffset/Vx',$p_header['extra']);
//01 为zip64扩展数据标记
if($p_extra_data['a'] != 0x01){
return;
}
if($p_header['offset'] == 0xffffffff){
//var_dump(str2hex($v_binary_data),$p_header,str2hex($p_header['extra']),$p_extra_data);
}
if($p_header['compressed_size'] == 0xffffffff){
$p_header['compressed_size'] = $p_extra_data['compressed_size'];
}
//适配特殊情况; 顺序适配
if($p_header['offset'] == 0xffffffff){
if( $p_extra_data['offset'] >0 && $p_extra_data['offset']< 1024*1024*1024*1000){
$p_header['offset'] = $p_extra_data['offset'];
}else if($p_extra_data['size'] >= 0xffffffff){
$p_header['offset'] = $p_extra_data['size'];
}
}
if($p_header['size'] == 0xffffffff){
$p_header['size'] = $p_extra_data['size'];
}
}
// --------------------------------------------------------------------------------
// Function : privReadCentralFileHeader()
@ -4420,7 +4457,7 @@
{
// ----- Error log
PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, 'Invalid archive structure');
PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, 'privReadCentralFileHeader:Invalid archive structure');
// ----- Return
return PclZip::errorCode();
@ -4436,7 +4473,7 @@
$p_header['status'] = "invalid_header";
// ----- Error log
PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, "Invalid block size : ".strlen($v_binary_data));
PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, "privReadCentralFileHeader:Invalid block size : ".strlen($v_binary_data));
// ----- Return
return PclZip::errorCode();
@ -4500,8 +4537,7 @@
//$p_header['external'] = 0x41FF0010;
$p_header['external'] = 0x00000010;
}
$this->readZip64ExtraData($p_header);//add by warlee;
// ----- Return
return $v_result;
}
@ -4661,7 +4697,7 @@
// ----- Extract the values
$v_data = unpack('vdisk/vdisk_start/vdisk_entries/ventries/Vsize/Voffset/vcomment_size', $v_binary_data);
// ----- Check the global size
if (($v_pos + $v_data['comment_size'] + 18) != $v_size) {
@ -4679,7 +4715,6 @@
return PclZip::errorCode();
}
}
// ----- Get comment
if ($v_data['comment_size'] != 0) {
$p_central_dir['comment'] = fread($this->zip_fd, $v_data['comment_size']);
@ -4693,7 +4728,12 @@
$p_central_dir['size'] = $v_data['size'];
$p_central_dir['disk'] = $v_data['disk'];
$p_central_dir['disk_start'] = $v_data['disk_start'];
//add by warlee; zip64 supports
//vdisk/vdisk_start/vdisk_entries/ventries/Vsize/Voffset/vcomment_size
if($v_data['offset'] == 0xFFFFFFFF){
return $this->privReadEndCentralDirZip64($p_central_dir,$v_data);
}
// TBC
//for(reset($p_central_dir); $key = key($p_central_dir); next($p_central_dir)) {
//}
@ -4701,6 +4741,43 @@
// ----- Return
return $v_result;
}
// zip64 support;
//https://blog.csdn.net/a200710716/article/details/51644421
//https://github.com/brokencube/ZipStream64/blob/14087549a4914bfc441a396ca02849569145a273/src/ZipStream.php#L808
//https://pkware.cachefly.net/webdocs/APPNOTE/APPNOTE-6.2.0.txt
function privReadEndCentralDirZip64(&$p_central_dir,$cdr_data){
$this->zip64 = true;
//56 [zip64 end of central directory record]
//Vzip64_cdr_eof/Pblow_offset/vversion/vversion_un/Vdisk/Vdisk_start/Pdisk_entries/Pentries/Psize/Poffset
//20 [zip64 end of central directory locator]
//Vzip64_cdr_loc_flag/Vdisk_num/Pcdr_offset/Vtotal_disk
//22 [end of central directory record]
//Vzip_cdr_eof/vdisk/vdisk_start/vdisk_entries/ventries/Vsize/Voffset/vcomment_size
$offset_back = 56+20+22;
$old_pose = ftell($this->zip_fd);
fseek($this->zip_fd,$old_pose-$cdr_data['comment_size']-$offset_back);
$v_bin = fread($this->zip_fd, 56);
$v_data = unpack('Vzip64_cdr_eof/Pblow_offset/vversion/vversion_un/Vdisk/Vdisk_start/Pdisk_entries/Pentries/Psize/Poffset', $v_bin);
if($v_data['zip64_cdr_eof'] != 0x06064b50){
PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, "Invalid End of Zip64 Central Dir Record error:".json_encode($v_data));
return PclZip::errorCode();
}
$loc_bin = fread($this->zip_fd,20);
$loc_data = unpack('Vzip64_cdr_loc_flag/Vdisk_num/Pcdr_offset/Vtotal_disk', $loc_bin);
if($loc_data['zip64_cdr_loc_flag'] != 0x07064b50){
PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, "Invalid End of Zip64 central directory locator error:".json_encode($loc_data));
return PclZip::errorCode();
}
$p_central_dir['entries'] = $v_data['entries'];
$p_central_dir['disk_entries'] = $v_data['disk_entries'];
$p_central_dir['offset'] = $v_data['offset'];
$p_central_dir['size'] = $v_data['size'];
fseek($this->zip_fd,$old_pose);
return 1;
}
// --------------------------------------------------------------------------------
// --------------------------------------------------------------------------------

View File

@ -36,6 +36,8 @@
padding: 5px 10px;
background: #fcfcfc;
color: #666;
word-break: break-all;
font-family: monospace;
}
.location-to{padding: 10px 0;color: #888;font-size: 13px;font-style: italic;}
.icon{

File diff suppressed because it is too large Load Diff

View File

@ -1,33 +1,33 @@
<div class="box">
<div class="title"><span>KODExplorer是什麼</span></div>
<p>KODExplorer是一個公開原始碼的基於Web的線上檔案管理、程式碼編輯器。它提供了類windows經典使用者介面,一整套線上檔案管理、檔案預覽、編輯、上傳下載、線上解壓縮、音樂播放功能。讓你直接在瀏覽器端實現web開發、原始碼檔案預覽、網站部署的同時擁有與本機操作一樣方便、快捷、安全的體驗。</p>
<p>KODExplorer是一個公開源碼的基於Web的在線文件管理、代碼編輯器。它提供了類windows經典用戶界面,一整套在線文件管理、文件預覽、編輯、上傳下載、在線解壓縮、音樂播放功能。讓你直接在瀏覽器端實現web開發、源碼文件預覽、網站部署的同時擁有與本地操作一樣方便、快捷、安全的體驗。</p>
<p><b>——設計理念——</b></p>
<p>傳承經典,追求創新,為使用者提供方便快捷、安全易用的線上雲管理系統。</p>
<p>傳承經典,追求創新,為用戶提供方便快捷、安全易用的在線雲管理系統。</p>
<p>無論何時when、何地where,擁有web只要你想want它就是你的管理利器4W策略</p>
<p><b>——面向使用者——</b></p>
<p>目前KODExplorer系統管理主要定位在個人云主機、中小企業雲資源管理、網路硬碟管理、中小型網站管理等。 Web開發者&站長(老鳥):線上編輯、壓縮備份、部署,經典windows介面操作,上手容易,遠離了主機的SSH、ftp複雜枯燥的指令操作。</p>
<p>個人私有雲(菜鳥):管理網路硬碟資源,同樣經典windows介面操作,可以就地瀏覽網路硬碟音樂、視屏檔案,上傳下載快捷方便。</p>
<p><b>——面向用戶——</b></p>
<p>目前KODExplorer系統管理主要定位在個人雲主機、中小企業雲資源管理、網盤管理、中小型網站管理等。 Web開發者&站長(老鳥):在線編輯、壓縮備份、部署,經典windows界面操作,上手容易,遠離了主機的SSH、ftp複雜枯燥的命令操作。</p>
<p>個人私有云(菜鳥):管理網盤資源,同樣經典windows界面操作,可以就地瀏覽網盤音樂、視屏文件,上傳下載快捷方便。</p>
</div>
<div class="box">
<div class="title"><span>特色</span></div>
<p>完備的檔案管理,強大的線上檔案編輯器</p>
<p>無論您在哪裡,都可以管理您的檔案;並可以線上娛樂,線上寫程式碼!就像適宜用操作系統那樣。</p>
<p>豐富的本機體驗移植,右鍵操作,拖曳,框中選擇,快捷鍵,檔案搜尋(內容中搜尋)……</p>
<p>框中選擇,拖曳移動,拖曳上傳,線上編輯器,影音播放器,解壓縮。全面ajax保證性能和體驗</p>
<p>各個功能直接無縫連;以對話框形式存在,多任務管理等功能</p>
<p>編輯器支援多檔案支援ZendCoding html,css,js程式碼編寫效率更高!</p>
<p>完美中文支,各種情況下亂碼解決;</p>
<p>完備的文件管理,強大的在線文件編輯器</p>
<p>無論您在哪裡,都可以管理您的文件;並可以在線娛樂,在線寫代碼!就像適宜用操作系統那樣。</p>
<p>豐富的本地體驗移植,右鍵操作,拖拽,框中選擇,快捷鍵,文件搜索(內容中搜索)……</p>
<p>框中選擇,拖拽移動,拖拽上傳,在線編輯器,影音播放器,解壓縮。全面ajax保證性能和體驗</p>
<p>各個功能直接無縫連;以對話框形式存在,多任務管理等功能</p>
<p>編輯器支持多文檔支持ZendCoding html,css,js代碼編寫效率更高!</p>
<p>完美中文支,各種情況下亂碼解決;</p>
</div>
<div class="box">
<div class="title"><span>開源技術採用</span></div>
<p><b>1.Jquery:</b>jpuery(plugin:Hotkeys.ztree.contentmenu).js主流開發框架。對Dom操作、BOM操作、css操作,以及Ajax封裝</p>
<p><b>2.ArtDialog:</b>一個設計優美,對瀏覽器相容性極強的對話框插件。使彈出視窗處理,事件以及資料的傳輸得到了更好的統一管理方式</p>
<p><b>3.Ztree:</b>列表樹控制項,擴展性很強的樹形資料操作插件</p>
<p><b>4.codemirror:</b>一個程式碼編輯js插件,支援各種程式語言的高亮處理</p>
<p><b>5.zendcoding:</b>一個支援html程式碼快速編寫插件。定義方式簡化程式碼編寫。有簡單編譯功能</p>
<p><b>2.ArtDialog:</b>一個設計優美,對瀏覽器兼容性極強的對話框插件。使彈出窗口處理,事件以及數據的傳輸得到了更好的統一管理方式</p>
<p><b>3.Ztree:</b>列表樹控件,擴展性很強的樹形數據操作插件</p>
<p><b>4.codemirror:</b>一個代碼編輯js插件,支持各種編程語言的高亮處理</p>
<p><b>5.zendcoding:</b>一個支持html代碼快速編寫插件。定義方式簡化代碼編寫。有簡單編譯功能</p>
<p><b>6.less:</b>一種高效的,函數式css開發模式,提高前端css樣式表的可複用性。有簡單編譯功能</p>
<p><b>7.SWFUpload:</b>flash多檔案上傳</p>
<p><b>8.CMP4:</b>一個非常優秀的flash媒體檔案播放插件,支援流媒體,常用音樂影片的播放工具。支援換外觀,高可配置性的設定。列表xml的動態載入。 mms流媒體,rstp開源協議媒體播放支援</p>
</div>
<p><b>7.SWFUpload:</b>flash多文件上傳</p>
<p><b>8.CMP4:</b>一個非常優秀的flash媒體文件播放插件,支持流媒體,常用音樂視頻的播放工具。支持換皮膚,高可配置性的設置。列表xml的動態加載。 mms流媒體,rstp開源協議媒體播放支持</p>
</div>

View File

@ -1,20 +1,20 @@
<div class="intro-left">
<div class="tips blue">
<h1> <span>豐富的功能</span> </h1>
<p>程式碼自動提示</p>
<p>碼自動提示</p>
<p>多主題:選擇你喜歡的編程風格</p>
<p>字體:適合種場景下使用</p>
<p>游標編輯,塊編輯等媲美sublime的線上編程體驗</p>
<p>程式碼塊折疊、展開;自動換行</p>
<p>多標籤,拖動切換順序; </p>
<p>維持多個檔案、尋找取代;歷史記錄; </p>
<p>定義字體:適合種場景下使用</p>
<p>光標編輯,塊編輯等媲美sublime的在線編程體驗</p>
<p>碼塊折疊、展開;自動換行</p>
<p>多標籤,拖動切換順序; </p>
<p>維持多個文檔、查找替換;歷史記錄; </p>
<p>自動補全[],{},(),&quot;&quot;,&#39;&#39; </p>
<p>線上即時預覽,使您愛上線上編程! </p>
<p> zendcodeing支援,寫程式碼健步如飛</p>
<p>在線實時預覽,使您愛上在線編程! </p>
<p> zendcodeing支持,寫代碼健步如飛</p>
<p>更多功能,等待你的發現…… </p>
</div>
<div class="tips orange">
<h1> <span>150多種程式碼高亮</span> </h1>
<h1> <span>150多種碼高亮</span> </h1>
<p>前端html,JavaScript,css,less,sass,scss </p>
<p> web開發php,perl,python,ruby,elang,go... </p>
<p>傳統語言java,c,c++,c#,actionScript,VBScript... </p>
@ -25,33 +25,33 @@
<div class="tips green">
<h1> <span>快捷鍵操作</span> </h1>
<pre>常用快捷鍵:
ctrl+s
ctrl+a 全選ctrl+x 剪
ctrl+c 複製ctrl+v 貼
ctrl+s
ctrl+a 全選ctrl+x 剪
ctrl+c 複製ctrl+v
ctrl+z 撤銷ctrl+y 反撤銷
ctrl+f 尋找ctrl+f+f 取代
ctrl+f 查找ctrl+f+f 替換
win+alt+0 折疊所有win+alt+shift+0 展開所有
esc [退出搜,取消自動提示...]
esc [退出搜,取消自動提示...]
ctrl-shift-s 預覽
ctrl-shift-e 顯示&amp;關閉函數
</pre>
<pre>選擇:
鼠框選——拖動
框選——拖動
shift+home/end/up/left/down/right
shift+pageUp/PageDown 上下翻頁選中
ctrl+shift+ home/end 目前游標到頭尾
alt+鼠拖動塊選擇
ctrl+alt+g 批次選中目前並進入多標籤編輯
ctrl+shift+ home/end 當前光標到頭尾
alt+鼠拖動塊選擇
ctrl+alt+g 批量選中當前並進入多標籤編輯
</pre>
<pre>標移動:
<pre>標移動:
home/end/up/left/down/right
ctrl+home/end 游標移動到檔案首/尾
ctrl+home/end 光標移動到文檔首/尾
ctrl+p 跳轉到匹配的標籤
pageUp/PageDown 標上下翻頁
alt+left/right 標移動到行首位
shift+left/right 標移動到行首&amp;
pageUp/PageDown 標上下翻頁
alt+left/right 標移動到行首位
shift+left/right 標移動到行首&amp;
ctrl+l 跳轉到指定行
ctrl+alt+up/down 上(下)增加
ctrl+alt+up/down 上(下)增加
</pre>
<pre>編輯:
ctrl+/ 註釋&amp;取消註釋ctrl+alt+a 左右對齊
@ -60,8 +60,8 @@
ctrl+delete 刪除該行右側單詞
ctrl/shift+backspace 刪除左側單詞
alt+shift+up/down 複製行並添加到上(下面)面
alt+delete 刪除標右側內容
alt+up/down 前行和上一行(下一行交換)
alt+delete 刪除標右側內容
alt+up/down 前行和上一行(下一行交換)
ctrl+shift+d 複製行並添加到下面
ctrl+delete 刪除右側單詞
ctrl+shift+u 轉換成小寫

View File

@ -1,36 +1,36 @@
<div class="box">
<div class="title"> <span>檔案管理</span> </div>
<p><i class="icon-tags"></i>檔案選擇:單選,滑鼠框選,shift連選,ctrl隨意選擇,鍵盤上下左右、home、end選擇。 </p>
<p><i class="icon-folder-open"></i>檔案操作:選擇檔案後,可以進行複製,剪下,刪除,屬性查看,壓縮,重新命名,打開預覽等操作…… </p>
<p><i class="icon-cloud-upload"></i>檔案上傳多檔案批次上傳html5拖曳上傳(拖曳到視窗實現無縫上傳,支援資料夾拖曳) </p>
<p><i class="icon-cogs"></i>右鍵功能:檔案右鍵,資料夾右鍵,多選後右鍵操作,桌面右鍵,樹目錄右鍵操作,右鍵選單綁定快捷鍵<br/>
(全選——複製——剪下——貼上——刪除——重新命名,設定……) </p>
<p><i class="icon-sitemap"></i>檔案瀏覽:列表模式,圖示模式;雙擊進入子資料夾;地址欄操作;打開資料夾記錄逆勢操作記錄(前進後退) </p>
<p><i class="icon-move"></i>援拖曳操作:選中後拖曳,實現剪下到指定資料夾功能</p>
<p><i class="icon-reply"></i>快捷鍵操作delete刪除,ctrl+A全選,ctrl+C複製,ctrl+X剪下,檔案搜尋(內容中搜尋) </p>
<div class="title"> <span>文件管理</span> </div>
<p><i class="icon-tags"></i>文件選擇:單選,鼠標框選,shift連選,ctrl隨意選擇,鍵盤上下左右、home、end選擇。 </p>
<p><i class="icon-folder-open"></i>文件操作:選擇文件後,可以進行複制,剪切,刪除,屬性查看,壓縮,重命名,打開預覽等操作…… </p>
<p><i class="icon-cloud-upload"></i>文件上傳多文件批量上傳html5拖拽上傳(拖拽到窗口實現無縫上傳,支持文件夾拖拽) </p>
<p><i class="icon-cogs"></i>右鍵功能:文件右鍵,文件夾右鍵,多選後右鍵操作,桌面右鍵,樹目錄右鍵操作,右鍵菜單綁定快捷鍵<br/>
(全選——複製——剪切——粘貼——刪除——重命名,設置……) </p>
<p><i class="icon-sitemap"></i>文件瀏覽:列表模式,圖標模式;雙擊進入子文件夾;地址欄操作;打開文件夾記錄逆勢操作記錄(前進後退) </p>
<p><i class="icon-move"></i>持拖拽操作:選中後拖拽,實現剪切到指定文件夾功能</p>
<p><i class="icon-reply"></i>快捷鍵操作delete刪除,ctrl+A全選,ctrl+C複製,ctrl+X剪切,文件搜索(內容中搜索) </p>
</div>
<div class="box">
<div class="title"> <span>檔案預覽</span> </div>
<p><i class="icon-edit"></i>檔案預覽文字檔案內容查看編輯儲存html,swf檔案預覽, </p>
<p><i class="icon-picture"></i>圖片預覽:自動生成縮圖,圖片幻燈片播放; </p>
<p><i class="icon-music"></i>訊播放:線上播放音樂,影片檔案;支援mp3,wma,mid,aac,wav;mp4, </p>
<p><i class="icon-play"></i>影片播放:線上影片檔案播放,支援格式flv,f4v,3gp </p>
<p><i class="icon-play"></i> officeoffice線上預覽,支援格式doc,docx,ppt,pptx,xls,xlsx </p>
<div class="title"> <span>文件預覽</span> </div>
<p><i class="icon-edit"></i>文件預覽文本文件內容查看編輯保存html,swf文件預覽, </p>
<p><i class="icon-picture"></i>圖片預覽:自動生成縮圖,圖片幻燈片播放; </p>
<p><i class="icon-music"></i>頻播放:在線播放音樂,視頻文件;支持mp3,wma,mid,aac,wav;mp4, </p>
<p><i class="icon-play"></i>視頻播放:在線視頻文件播放,支持格式flv,f4v,3gp </p>
<p><i class="icon-play"></i> officeoffice在線預覽,支持格式doc,docx,ppt,pptx,xls,xlsx </p>
</div>
<div class="box">
<div class="title"> <span>快捷鍵</span> </div>
<p><i class="icon-tags"></i> enter 打開</p>
<p><i class="icon-tags"></i> ctrl+a 全選</p>
<p><i class="icon-tags"></i> ctrl+c 複製選中</p>
<p><i class="icon-tags"></i> ctrl+v 貼</p>
<p><i class="icon-tags"></i> ctrl+x 剪</p>
<p><i class="icon-tags"></i> ctrl+f 目前目錄進行搜尋</p>
<p><i class="icon-tags"></i> alt+n 建立檔案</p>
<p><i class="icon-tags"></i> alt+m 建立資料</p>
<p><i class="icon-tags"></i> ctrl+v </p>
<p><i class="icon-tags"></i> ctrl+x 剪</p>
<p><i class="icon-tags"></i> ctrl+f 當前目錄進行搜索</p>
<p><i class="icon-tags"></i> alt+n 新建文件</p>
<p><i class="icon-tags"></i> alt+m 新建文件</p>
<p><i class="icon-tags"></i> delete 刪除選中</p>
<p><i class="icon-tags"></i> backspace 後退</p>
<p><i class="icon-tags"></i> ctrl+backspace 前進</p>
<p><i class="icon-tags"></i> f2 重新命名選中(檔案資料夾) </p>
<p><i class="icon-tags"></i> home/end/up/down/left/right 選擇檔案</p>
<p><i class="icon-tags"></i> anykey 選中以按下字元首字母的檔案&amp;資料夾自動循環選中</p>
<p><i class="icon-tags"></i> f2 重命名選中(文件文件夾) </p>
<p><i class="icon-tags"></i> home/end/up/down/left/right 選擇文件</p>
<p><i class="icon-tags"></i> anykey 選中以按下字符首字母的文件&amp;文件夾自動循環選中</p>
</div>

View File

@ -1,22 +1,22 @@
<?php
return array(
"path_api_select_file" => "請選擇檔案...",
"path_api_select_folder" => "請選擇資料夾...",
"path_api_select_file" => "請選擇文件...",
"path_api_select_folder" => "請選擇文件夾...",
"path_api_select_image" => "請選擇圖片...",
"share_can_upload" => "允許上傳",
"move_error" => "移動失敗",
"setting_basic" => "基礎設",
"setting_basic" => "基礎設",
"setting_user_sound_open" => "開啟音效",
"setting_user_animate_open" => "開啟動畫",
"recycle_open_if" => "開啟垃圾筒",
"recycle_open" => "開啟",
"recycle_open" => "开启",
"setting_user_recycle_desc" => "關閉後刪除會直接物理刪除,建議開啟",
"setting_user_animate_desc" => "窗打開等動畫,操作不流暢時可以考慮關閉",
"setting_user_sound_desc" => "打開檔案、刪除檔案、清空回收站等操作音效",
"setting_user_imageThumb" => "開啟圖片縮",
"setting_user_animate_desc" => "打開等動畫,操作不流暢時可以考慮關閉",
"setting_user_sound_desc" => "打開文件、刪除文件、清空回收站等操作音效",
"setting_user_imageThumb" => "開啟圖片縮",
"setting_user_imageThumb_desc" => "開啟後圖片瀏覽體驗更佳",
"setting_user_fileSelect" => "開啟檔案圖示勾選",
"setting_user_fileSelect_desc" => "檔案圖示的左鍵勾選,右鍵選單的快捷入口",
"setting_user_fileSelect" => "開啟文件圖標勾選",
"setting_user_fileSelect_desc" => "文件圖標的左鍵勾選,右鍵菜單的快捷入口",
"qrcode" => "URL 二維碼",
"theme_mac" => "Mac 簡約白",
"theme_win7" => "Windows 7",
@ -29,8 +29,8 @@ return array(
"theme_alpha_image" => "炫彩——飛揚",
"theme_alpha_image_sun" => "炫彩——夕陽",
"theme_alpha_image_sky" => "幻彩——藍天",
"theme_diy" => "<b>自</b>",
"theme_diy_title" => "訂主題設定",
"theme_diy" => "<b>自定義</b>",
"theme_diy_title" => "定義主題設置",
"theme_diy_background" => "背景",
"theme_diy_image" => "圖片",
"theme_diy_color_blur" => "漸變顏色",
@ -40,23 +40,23 @@ return array(
"theme_diy_color_end" => "結束顏色",
"theme_diy_color_radius" => "漸變角度",
"system_role_admin_set" => "系統管理員擁有所有權限,無需設定!",
"login_error_user_not_use" => "使用者已被禁用!請聯繫管理員",
"login_error_kod_version" => "式版本衝",
"login_error_role" => "所屬權限組不存在,請聯管理員",
"no_permission_group" => "您不在該使用者組!",
"login_error_user_not_use" => "用戶已被禁用!請聯系管理員",
"login_error_kod_version" => "序版本沖",
"login_error_role" => "所屬權限組不存在,請聯管理員",
"no_permission_group" => "您不在該用戶組!",
"no_permission_write" => "該目錄無寫權限",
"user" => "使用者",
"user" => "用戶",
"save_as" => "另存為",
"check_update" => "更新",
"keyboard_type" => "鍵盤模式",
"font_family" => "字體",
"code_mode" => "高亮語法",
"path_can_not_share" => "僅支援分享您自己的檔案",
"path_can_not_action" => "此目錄不支該操作!",
"path_can_not_share" => "僅支持分享您自己的文檔",
"path_can_not_action" => "此目錄不支該操作!",
"wap_page_pc" => "電腦版",
"wap_page_phone" => "手機版",
"image_size" => "圖片尺寸",
"no_permission_action" => "您無此權限,請聯管理員!",
"no_permission_action" => "您無此權限,請聯管理員!",
"path_is_root_tips" => "已經到根目錄了!",
"kod_group" => "組織架構",
"my_kod_group" => "我在的部門",
@ -68,83 +68,83 @@ return array(
"system_open_true_path" => "成功在檔案管理中打開!",
"group_role_error" => "權限角色錯誤(無權限設定)",
"group_role_error_admin" => "權限不足",
"markdown_content" => "內容目錄",
"system_group" => "使用者與部門",
"markdown_content" => "内容目录",
"system_group" => "用戶與部門",
"system_group_edit" => "部門管理",
"system_group_role" => "角色身份",
"system_group_create" => "部門",
"system_group_create" => "建部門",
"system_group_name" => "部門名稱",
"system_group_father" => "上級部門",
"system_group_add" => "新增子部門",
"system_group_add" => "添加子部門",
"system_group_remove" => "刪除部門",
"system_group_remove_tips" => "確認刪除該部門?<br/>刪除後屬於該部門的使用者會移除,子部門移動到根部門",
"system_group_remove_tips" => "確認刪除該部門?<br/>刪除後屬於該部門的用戶會移除,子部門移動到根部門",
"system_group_select" => "選擇所在部門",
"system_group_select_result" => "成員將屬於以下部門",
"system_role_admin_tips" => "備註:系統管理員不受權限控制",
"system_member_action" => "使用者管理",
"system_member_add" => "建立使用者",
"system_member_action" => "用戶管理",
"system_member_add" => "新建用戶",
"system_member_role" => "權限角色",
"system_member_role_select" => "選擇",
"system_member_password_tips" => "不填則不修改",
"system_set_home_path" => "目錄",
"system_set_home_path_tips" => "為空則使用預設目錄",
"system_set_home_path" => "定義目錄",
"system_set_home_path_tips" => "為空則使用默認目錄",
"system_member_group" => "所在部門",
"system_member_group_edit" => "編輯部門",
"system_member_remove" => "刪除使用者",
"system_member_remove_tips" => "確認刪除使用者?<br/>刪除後該使用者目錄會徹底刪除",
"system_member_set_role" => "確認更改所選使用者的權限組?",
"system_member_remove_group" => "確定將所選使用者從該組移除?",
"system_member_import" => "次新增",
"system_member_import_desc" => "每行一個使用者,<br/>已存在則自動忽略",
"system_member_remove" => "刪除用戶",
"system_member_remove_tips" => "確認刪除用戶?<br/>刪除後該用戶目錄會徹底刪除",
"system_member_set_role" => "確認更改所選用戶的權限組?",
"system_member_remove_group" => "確定將所選用戶從該組移除?",
"system_member_import" => "量添加",
"system_member_import_desc" => "每行一個用戶,<br/>已存在則自動忽略",
"system_member_use" => "啟用",
"system_member_unuse" => "禁用",
"system_member_space" => "定使用者空間大小",
"system_member_space_tips" => "定使用者空間大小",
"system_member_space" => "置用戶空間大小",
"system_member_space_tips" => "置用戶空間大小",
"system_member_space_number" => "必須是數字!",
"system_member_group_config" => "次設定部門",
"system_member_group_config" => "量設置部門",
"system_member_group_remove" => "從該部門移除",
"system_member_group_insert" => "新增到部門",
"system_member_group_reset" => "部門",
"system_member_group_insert" => "添加到部門",
"system_member_group_reset" => "部門",
"system_member_group_error" => "部門錯誤",
"system_group_action" => "部門管理",
"system_role_add" => "新增角色身份",
"system_role_read" => "",
"system_role_add" => "添加角色身份",
"system_role_read" => "",
"system_role_write" => "可讀寫",
"system_setting_root_path" => "根目錄訪問",
"system_setting_root_path_desc" => "僅系統管理員可以訪問所有目錄,其他權限組使用者只能看到自己的使用者目錄。<br/>如果想開啟或關閉管理員訪問其他目錄,可以修改php防跨站open_basedir參數,<a href=\"https://www.baidu.com/s?wd=php+open_basedir\" target=\"_blank\">如何設</a>",
"system_setting_root_path_desc" => "僅系統管理員可以訪問所有目錄,其他權限組用戶只能看到自己的用戶目錄。<br/>如果想開啟或關閉管理員訪問其他目錄,可以修改php防跨站open_basedir參數,<a href=\"https://www.baidu.com/s?wd=php+open_basedir\" target=\"_blank\">如何設</a>",
"system_group_role_title" => "部門權限角色管理",
"system_group_role_remove" => "確定刪除部門角色",
"system_group_role_style" => "樣式",
"system_group_role_display" => "是否顯示",
"system_group_role_display_desc" => "定部門使用者權限時是否顯示",
"system_group_role_display_desc" => "置部門用戶權限時是否顯示",
"role_type_name_read" => "讀取",
"role_type_name_read:list" => "檔案列表",
"role_type_name_read:info" => "檔案(夾)屬性查看,資料夾搜尋",
"role_type_name_read:copy" => "檔案複製",
"role_type_name_read:preview" => "檔案預覽(圖片,檔案,影音等)",
"role_type_name_read:download" => "檔案(夾)下載",
"role_type_name_read:list" => "文件列表",
"role_type_name_read:info" => "文件(夾)屬性查看,文件夾搜索",
"role_type_name_read:copy" => "文件複製",
"role_type_name_read:preview" => "文件預覽(圖片,文檔,音視頻等)",
"role_type_name_read:download" => "文件(夾)下載",
"role_type_name_write" => "寫入",
"role_type_name_write:add" => "建立檔案(夾),壓縮解壓檔案",
"role_type_name_write:edit" => "編輯儲存檔案",
"role_type_name_write:change" => "命名,調整目錄結構",
"role_type_name_write:upload" => "檔案(夾)上傳,遠程下載",
"role_type_name_write:remove" => "檔案(夾)刪除,剪下",
"role_type_name_write:add" => "創建文件(夾),壓縮解壓文件",
"role_type_name_write:edit" => "編輯保存文件",
"role_type_name_write:change" => "命名,調整目錄結構",
"role_type_name_write:upload" => "文件(夾)上傳,遠程下載",
"role_type_name_write:remove" => "文件(夾)刪除,剪切",
"group_guest" => "訪客",
"group_guest_desc" => "您不是該部門成員,<br/>僅能訪問[部門共享目錄]下面的內容,讀權限.",
"group_role_lebel_desc" => "您是該部門成員,<br/>部門內所有操作權限均由管理員分配",
"button_save_and_add" => "儲存並繼續新增",
"path_cannot_search" => "該目錄不支援搜尋!",
"not_support" => "暫不支援",
"group_not_exist" => "使用者組不存在!",
"group_guest_desc" => "您不是該部門成員,<br/>僅能訪問[部門共享目錄]下面的內容,讀權限.",
"group_role_lebel_desc" => "您是該部門成員,<br/>部門內檔所有操作權限均由管理員分配",
"button_save_and_add" => "儲存並繼續添加",
"path_cannot_search" => "该目录不支持搜尋!",
"not_support" => "暂不支持",
"group_not_exist" => "用户组不存在!",
"upload_clear_all" => "清空所有",
"upload_clear" => "清空已完成",
"upload_setting" => "設定",
"upload_tips" => "採取分段上傳,不再受php.ini限制;推薦Chrome體驗資料夾拖曳上傳",
"upload_exist" => "重複的檔案",
"upload_exist" => "重複的文件",
"upload_exist_rename" => "重新命名",
"upload_exist_replace" => "覆蓋",
"upload_exist_skip" => "略過",
"upload_add_more" => "次新增",
"upload_add_more" => "量添加",
"more" => "更多",
"system_setting" => "系統設定",
"openProject" => "編輯器開啟項目",
@ -152,12 +152,12 @@ return array(
"url_link" => "網址",
"app_type_link" => "捷徑",
"createLink" => "建立捷徑",
"createLinkHome" => "發送到桌面捷徑",
"createLinkHome" => "發送到桌面快捷方式",
"createProject" => "新增志編輯器工程",
"only_read" => "",
"only_read" => "",
"only_read_desc" => "此目錄無寫權限<br/>可以在作業系統中設定此目錄的權限",
"not_read" => "不可讀",
"explorerNew" => "kod 連結",
"explorerNew" => "kod 鏈接",
"zip_download_ready" => "壓縮後會自動下載,請稍後...",
"set_background" => "設定為桌面壁紙",
"share" => "分享",
@ -165,20 +165,20 @@ return array(
"group_share" => "群組對外分享",
"share_edit" => "編輯分享",
"share_remove" => "取消分享",
"share_remove_tips" => "確定取消分享?公開連將失效.",
"share_remove_tips" => "確定取消分享?公開連將失效.",
"share_path" => "分享路徑",
"share_title" => "資源分享",
"share_name" => "分享標題",
"share_time" => "到期時間",
"share_time_desc" => "為空則不設定",
"share_time_desc" => "为空则不設定",
"share_password" => "提取密碼",
"share_password_desc" => "為空則不設定密碼",
"share_password_desc" => "为空则不設定密碼",
"share_cancle" => "取消共用",
"share_create" => "建立公開連結",
"share_create" => "創建公開鏈接",
"share_url" => "共用網址",
"share_not_download" => "禁止下載",
"share_not_download_tips" => "共用者禁止了下載!",
"share_code_read" => "程式碼閱讀",
"share_code_read" => "碼閱讀",
"share_save" => "儲存設定",
"share_error_param" => "參數錯誤!",
"share_error_user" => "使用者資訊錯誤!",
@ -186,34 +186,34 @@ return array(
"share_error_time" => "您來晚了,該共用已經過期!",
"share_error_path" => "共用檔案不存在,被刪除或者移走了!",
"share_error_password" => "密碼錯誤!",
"share_error_show_tips" => "該類型檔案暫不支預覽!",
"share_error_show_tips" => "該類型檔案暫不支預覽!",
"share_view_num" => "檢視:",
"share_download_num" => "下載:",
"share_open_page" => "打開共用頁面",
"open_the_path" => "入所在目錄",
"open_the_path" => "入所在目錄",
"recycle_clear" => "清除垃圾筒",
"recycle_clear_success" => "清除垃圾筒成功!",
"recycle_clear_info" => "您確定要徹底清空垃圾筒嗎?",
"fav_remove" => "取消該收藏",
"remove_item" => "項內容",
"uploading" => "上傳中 ",
"upload_tips_more" => "檔案過多,建議壓縮後上傳,然後線上解壓!",
"upload_tips_more" => "文件過多,建議壓縮後上傳,然後在線解壓!",
"uploading_move" => "合併轉存中...",
"show_file" => "新頁面預覽",
"unknow_file_title" => "檔案打開提示!",
"unknow_file_tips" => "沒有支援此檔案的程式,您可以:",
"unknow_file_tips" => "沒有支持此文件的應用,您可以:",
"unknow_file_try" => "嘗試",
"unknow_file_download" => "下載該檔案",
"unknow_plugin_search" => "尋相關的程式安裝",
"config_save_error_auth" => "設定儲存失敗,管理員禁止了此權限!",
"config_save_error_file" => "錯誤,檔案沒有寫權限!",
"beautify_code" => "程式碼格式化",
"unknow_file_download" => "下載該文件",
"unknow_plugin_search" => "索相關的應用安裝",
"config_save_error_auth" => "設定儲存失败,管理员禁止了此权限!",
"config_save_error_file" => "錯誤,文件沒有寫權限!",
"beautify_code" => "碼格式化",
"convert_case" => "大小寫轉換",
"convert_upper_case" => "轉換為大寫",
"convert_lower_case" => "轉換為小寫",
"editor_insert_time" => "前時間",
"editor_insert_time" => "前時間",
"editor_md5" => " md5加密",
"editor_qrcode" => "串二維碼",
"editor_qrcode" => "串二維碼",
"editor_regx" => "正則表達式測試",
"editor_chinese" => "繁簡轉換",
"editor_chinese_simple" => "轉換為簡體中文",
@ -232,115 +232,115 @@ return array(
"shortcut" => "快捷鍵",
"use_free" => "繼續使用免費版",
"learn_more" => "了解更多",
"replace" => "取代",
"replace" => "替換",
"selectAll" => "全選",
"reload" => "重新載入",
"about" => "關於",
"complete_current" => "自動補全",
"view" => "",
"complete_current" => "自動補全",
"view" => "",
"tools" => "工具",
"help" => "幫助",
"not_exists" => "不存在",
"group_role_fileDownload" => "檔案下載",
"group_role_share" => "共用",
"users_share" => "的共享",
"system_setting_save" => "安全設",
"system_setting_menu" => "單管理",
"system_name" => "名稱",
"system_name_desc" => "logo標題",
"system_desc" => "描述",
"system_setting_save" => "安全設",
"system_setting_menu" => "單管理",
"system_name" => "名稱",
"system_name_desc" => "logo標題",
"system_desc" => "描述",
"path_hidden" => "目錄排除",
"version_not_support" => "您的版本不支援此操作,請到官網購買進階版本!",
"version_not_support_number" => "由於數量限制不支援此操作,請到官網購買進階版本!",
"path_hidden_desc" => "預設不顯示的目錄和檔案,逗號隔開",
"new_user_folder" => "使用者預設建立目錄",
"version_not_support" => "您的版本不支持此操作,請到官網購買高級版本!",
"version_not_support_number" => "由於數量限制不支持此操作,請到官網購買高級版本!",
"path_hidden_desc" => "默認不顯示的目錄和檔案,逗號隔開",
"new_user_folder" => "用戶默認創建目錄",
"new_user_folder_desc" => "用逗號隔開",
"new_user_app" => "使用者預設建立app",
"new_user_app_desc" => "程式中心的程式,多個用逗號隔開",
"auto_login" => "遊客自動登",
"auto_login_desc" => "預設登入使用者為<code>guest/guest</code>的使用者;開啟後確保該使用者存在",
"first_in" => "入後預設進入",
"new_user_app" => "用戶默認創建app",
"new_user_app_desc" => "應用中心的應用,多個用逗號隔開",
"auto_login" => "遊客自動登",
"auto_login_desc" => "默認登錄用戶為<code>guest/guest</code>的用戶;開啟後確保該用戶存在",
"first_in" => "錄後默認進入",
"version_price_free" => "免費",
"version_name_1" => "團隊版",
"version_name_2" => "專業版",
"version_name_3" => "企業版",
"version_name_4" => "進階版1",
"version_name_5" => "進階版2",
"version_name_6" => "進階版3",
"version_name_4" => "高級版1",
"version_name_5" => "高級版2",
"version_name_6" => "高級版3",
"version_vip_free" => "免費版",
"version_vip_1" => "VIP 1 (團隊版)",
"version_vip_2" => "VIP 2 (專業版)",
"version_vip_3" => "VIP 3 (企業版)",
"version_vip_4" => "VIP 4 (進階版)",
"version_vip_5" => "VIP 5 (進階版)",
"version_vip_6" => "VIP 6 (進階版)",
"path_can_not_write_data" => "目錄不可寫,請將該目錄及所有子目錄設為可讀寫後再試!",
"menu_name" => "單名",
"version_vip_4" => "VIP 4 (高級版)",
"version_vip_5" => "VIP 5 (高級版)",
"version_vip_6" => "VIP 6 (高級版)",
"path_can_not_write_data" => "目錄不可寫,請將該目錄及所有子目錄設為可讀寫後再試!",
"menu_name" => "單名",
"menu_hidden" => "隱藏",
"menu_show" => "顯示",
"menu_move_down" => "下移",
"menu_move_up" => "上移",
"menu_move_del" => "刪除",
"menu_open_window" => "窗打開",
"menu_sub_menu" => "",
"menu_open_window" => "打開",
"menu_sub_menu" => "",
"url_path" => "url地址",
"url_path_desc" => "url地址或js程式",
"no_permission_read" => "沒有讀取權限!",
"no_permission_download" => "沒有下載權限!",
"php_env_check" => "行環境檢測:",
"url_path_desc" => "url地址或js",
"no_permission_read" => "没有读取权限!",
"no_permission_download" => "没有下载权限!",
"php_env_check" => "行環境檢測:",
"php_env_error" => "php庫缺失",
"php_env_error_ignore" => "忽略並進入",
"php_env_error_version" => "PHP版本不能低於5.0",
"php_env_error_path" => "不可寫",
"php_env_error_list_dir" => "您的web服器開啟了列目錄功能,為安全考慮請禁用該功能!<a href=\"http://jingyan.baidu.com/article/22fe7ced389a0f3003617f41.html\" target=\"blank\">如何操作?</a>",
"php_env_error_gd" => "須開啟php GD庫,否則驗證碼、縮圖使用將不正常",
"install_login" => "您可以用如下帳號登入",
"php_env_error_list_dir" => "您的web器開啟了列目錄功能,為安全考慮請禁用該功能!<a href=\"http://jingyan.baidu.com/article/22fe7ced389a0f3003617f41.html\" target=\"blank\">如何操作?</a>",
"php_env_error_gd" => "須開啟php GD庫,否則驗證碼、縮圖使用將不正常",
"install_login" => "您可以用如下賬號登錄",
"install_enter" => "進入系統",
"install_user_default" => "管理員:{0}/(在下面設定密碼) <br/>普通使用者:{1} <br/>遊客使用者:{2}",
"login_root_password" => "管理員密碼",
"install_user_default" => "管理員:{0}/(在下面設置密碼) <br/>普通用戶:{1} <br/>遊客用戶:{2}",
"login_root_password" => "管理員密碼",
"login_root_password_repeat" => "再次確認密碼",
"login_root_password_equal" => "兩次密碼不一致!",
"login_root_password_tips" => "請設管理員密碼!",
"login_root_password_tips" => "請設管理員密碼!",
"forget_password" => "忘記密碼",
"forget_password_tips" => "管理員忘記密碼: <br/>請登入伺服器刪除<b>./data/system/install.lock</b>後重設; <br/><br/>非管理員忘記密碼: <br/>請聯繫管理員重設",
"copyright_desc" => "Kodexplorer是一款備受好評的web管理系統,你可以用它來做內部檔管理或共享、也可以用來管理服器上的網站取代Ftp甚至可以當作webIDE直接線上開發。同時你也可以將此程式二次開發整合到你現有的系統。",
"copyright_contact" => "授權或訂製請聯繫QQ:<a href=\"http://wpa.qq.com/msgrd?v=3&uin=3532208565&site=qq&menu=yes\" target=\"_blank\">3532208565</a><a href=\"javascript:core.openWindow('http://bbs.kodcloud.com/');\">問題饋</a>",
"forget_password_tips" => "管理員忘記密碼: <br/>請登陸服務器刪除<b>./data/system/install.lock</b>後重置; <br/><br/>非管理員忘記密碼: <br/>請聯繫管理員重置",
"copyright_desc" => "Kodexplorer是一款備受好評的web檔管理系統,你可以用它來做內部檔管理或共享、也可以用來管理服器上的網站取代Ftp甚至可以當作webIDE直接在線開發。同時你也可以將此程序二次開發整合到你現有的系統。",
"copyright_contact" => "授權或定制請聯繫QQ:<a href=\"http://wpa.qq.com/msgrd?v=3&uin=3532208565&site=qq&menu=yes\" target=\"_blank\">3532208565</a><a href=\"javascript:core.openWindow('http://bbs.kodcloud.com/');\">問題饋</a>",
"copyright_info" => "Copyright © <a href=\"https://kodcloud.com/?kodref=%s\" target=\"_blank\">kodcloud.com</a>.",
"copyright_pre" => "Powered by KodExplorer",
"kod_name" => "KodExplorer",
"kod_name_desc" => "可道•資源管理器",
"kod_name_desc" => "可道•資源管理器",
"kod_power_by" => " - Powered by KodExplorer",
"kod_name_copyright" => "可道•資源管理器",
"kod_name_copyright" => "可道•資源管理器",
"kod_meta_name" => "KodExplorer",
"kod_meta_keywords" => "KodExplorer,kod,kodCloud,webos,webIDE,php filemanage,filemanage,可道雲,芒果雲,檔案管理系統,企業雲端硬碟,資源管理器,,線上檔案,線上Office,線上辦公,線上CAD預覽,線上編輯,線上編輯器",
"kod_meta_description" => "KodExplorer可道雲(原芒果雲)是業內領先的政務/企業私有雲和線上檔案管理系統為個人網站、企業私有雲部署、網路儲存、線上檔案管理、線上辦公等提供安全可控簡便易用、可高度訂製的私有雲產品。採用windows風格介面、操作習慣無需適應即可快速上手支援幾百種常用檔案格式的線上預覽、播放和編輯,環境友好,功能強大,是一款一經試用,就再也離不開的私有雲產品。",
"kod_meta_keywords" => "KodExplorer,kod,kodCloud,webos,webIDE,php filemanage,filemanage,可道云,芒果雲,文檔管理系統,企業雲盤,資源管理器,,在線文檔,在線Office,在線辦公,在線CAD預覽,在線編輯,在線編輯器",
"kod_meta_description" => "KodExplorer可道云(原芒果雲)是業內領先的政務/企業私有云和在線文檔管理系統為個人網站、企業私有云部署、網絡存儲、在線文檔管理、在線辦公等提供安全可控簡便易用、可高度定制的私有云產品。採用windows風格界面、操作習慣無需適應即可快速上手支持幾百種常用文件格式的在線預覽、播放和編輯,環境友好,功能強大,是一款一經試用,就再也離不開的私有雲產品。",
"kod_meta_copyright" => "kodcloud.com",
"login" => "",
"guest_login" => "遊客登",
"username" => "入帳",
"userNickName" => "使用者暱稱",
"login" => "",
"guest_login" => "遊客登",
"username" => "陸賬",
"userNickName" => "用戶暱稱",
"password" => "密碼",
"login_code" => "驗證碼",
"need_check_code" => "入驗證碼開啟",
"need_check_code_desc" => "開啟後登必須需要輸入驗證碼。",
"need_check_code" => "錄驗證碼开启",
"need_check_code_desc" => "開啟後登必須需要輸入驗證碼。",
"setting_csrf_protect" => "開啟csrf保護",
"setting_csrf_protect_desc" => "開啟後能有效防護csrf類攻擊",
"login_rember_password" => "記住密碼",
"setting_show_root_group" => "羅列所有部門",
"setting_show_root_group_desc" => "樹目錄根部門是否列出所有部門",
"setting_show_share_user" => "羅列所有使用者",
"setting_show_share_user_desc" => "樹目錄根部門是否列出所有使用者分享",
"setting_clear_user_recycle" => "清空所有使用者回收站",
"setting_clear_cache" => "清空快取",
"setting_show_share_user" => "羅列所有用戶",
"setting_show_share_user_desc" => "樹目錄根部門是否列出所有用戶分享",
"setting_clear_user_recycle" => "清空所有用戶回收站",
"setting_clear_cache" => "清空緩存",
"setting_icp" => "版權或備案號",
"setting_global_css" => "訂全域css",
"setting_global_css_desc" => "所有頁面將會插入自css",
"setting_global_html" => "統計程式碼 HTML",
"setting_global_html_desc" => "所有頁面將插入此段html程式碼,可以放置第三方統計程式",
"setting_global_css" => "定義全局css",
"setting_global_css_desc" => "所有頁面將會插入自定義css",
"setting_global_html" => "統計碼 HTML",
"setting_global_html_desc" => "所有頁面將插入此段html代碼,可以放置第三方統計代",
"us" => "千帆網路工作室",
"login_not_null" => "使用者名稱密碼不能為空!",
"login_not_null" => "用戶名密碼不能為空!",
"code_error" => "驗證碼錯誤",
"password_error" => "使用者名稱或密碼錯誤!",
"password_error" => "用戶名或密码错误!",
"password_not_null" => "密碼不能為空!",
"old_password_error" => "原密碼錯誤!",
"permission" => "許可權!",
@ -352,7 +352,7 @@ return array(
"dialog_max" => "最大化",
"dialog_min" => "最小化",
"dialog_min_all" => "最小化所有",
"dialog_display_all" => "顯示所有",
"dialog_display_all" => "顯示所有",
"dialog_close_all" => "關閉所有",
"open" => "打開",
"others" => "其他",
@ -365,8 +365,8 @@ return array(
"loading" => "操作中...",
"warning" => "警告",
"getting" => "獲取中...",
"sending" => "資料發送中...",
"data_error" => "資料出錯!",
"sending" => "數據發送中...",
"data_error" => "數據出錯!",
"get_success" => "獲取成功!",
"save_success" => "儲存成功!",
"success" => "操作成功",
@ -383,7 +383,7 @@ return array(
"byte" => "位元組",
"path" => "路徑",
"action" => "操作",
"create_time" => "時間",
"create_time" => "建時間",
"modify_time" => "修改時間",
"last_time" => "最後訪問",
"sort_type" => "排序方式",
@ -391,12 +391,12 @@ return array(
"time_type_info" => "Y/m/d H:i:s",
"public_path" => "公共目錄",
"system_path_not_change" => "系統目錄,不允許修改",
"file" => "",
"folder" => "資料",
"file" => "",
"folder" => "",
"copy" => "複製",
"past" => "",
"clone" => "副本",
"cute" => "",
"past" => "",
"clone" => "建副本",
"cute" => "",
"cute_to" => "移動到...",
"copy_to" => "複製到...",
"remove" => "刪除",
@ -405,32 +405,32 @@ return array(
"list_type" => "查看",
"list_icon" => "圖示排列",
"list_list" => "列表排列",
"list_list_split" => "模式",
"list_list_split" => "模式",
"sort_up" => "遞增",
"sort_down" => "遞減",
"order_type" => "排序方式",
"order_desc" => "降序",
"order_asc" => "昇冪",
"rename" => "命名",
"add_to_fav" => "新增到收藏夾",
"search_in_path" => "資料夾中搜尋",
"add_to_play" => "新增到播放列表",
"rename" => "命名",
"add_to_fav" => "添加到收藏夾",
"search_in_path" => "文件夾中搜索",
"add_to_play" => "添加到播放列表",
"manage_fav" => "管理收藏夾",
"refresh_tree" => "刷新樹目錄",
"manage_folder" => "管理目錄",
"close_menu" => "關閉",
"zip" => "壓縮包",
"close_menu" => "關閉",
"zip" => "建壓縮包",
"unzip" => "解壓到...",
"unzip_folder" => "解壓到檔案",
"unzip_this" => "解壓到",
"unzip_folder" => "解壓到檔案",
"unzip_this" => "解壓到",
"unzip_to" => "解壓到...",
"zipview_file_big" => "檔案太大,請解壓後再進行預覽操作!",
"clipboard" => "查看剪貼簿",
"clipboard_clear" => "清空剪貼簿",
"full_screen" => "螢幕",
"folder_info_item" => "個項",
"folder_info_item_select" => "個選",
"file_load_all" => " 雙擊載入全部……",
"zipview_file_big" => "文件太大,請解壓後再進行預覽操作!",
"clipboard" => "查看剪貼",
"clipboard_clear" => "清空剪貼",
"full_screen" => "",
"folder_info_item" => "个项",
"folder_info_item_select" => "个选",
"file_load_all" => " 双击加载全部……",
"tips" => "提示",
"ziping" => "正在壓縮...",
"unziping" => "正在解壓...",
@ -438,15 +438,15 @@ return array(
"remove_title" => "刪除確認",
"remove_info" => "確認刪除選中內容嗎?",
"remove_title_force" => "永久刪除",
"remove_info_force" => "確定要永久刪除此嗎?",
"remove_info_force" => "確定要永久刪除此檔嗎?",
"name_isexists" => "出錯了,該名稱已存在!",
"install" => "安裝",
"width" => "",
"height" => "",
"app" => "程式",
"app_store" => "程式",
"app_create" => "建立程式",
"app_edit" => "修改程式",
"app" => "應用",
"app_store" => "應用",
"app_create" => "創建應用",
"app_edit" => "修改應用",
"app_group_all" => "全部",
"app_group_game" => "遊戲",
"app_group_tools" => "工具",
@ -456,55 +456,55 @@ return array(
"app_group_life" => "生活",
"app_group_others" => "其他",
"app_desc" => "描述",
"app_icon" => "程式圖示",
"app_icon" => "應用圖示",
"app_icon_show" => "url地址或該目錄",
"app_group" => "程式分組",
"app_group" => "應用分組",
"app_type" => "類型",
"app_type_url" => "連結",
"app_type_url" => "鏈接",
"app_type_code" => "js擴展",
"app_display" => "外觀",
"app_display_border" => "無邊框(選中即無邊框)",
"app_display_size" => "調整大小(選中即可調整)",
"app_size" => "尺寸",
"app_url" => "連結地址",
"app_code" => "js 程式",
"app_url" => "鏈接地址",
"app_code" => "js ",
"edit" => "編輯",
"edit_can_not" => "不是文",
"edit_can_not" => "不是文",
"edit_too_big" => "檔案太大,不能大於40M",
"open_default" => "預設方式打開",
"open_default" => "默認方式打開",
"open_ie" => "瀏覽器打開",
"refresh" => "刷新",
"refresh_all" => "強制刷新",
"newfile" => "",
"newfile" => "建檔",
"newfile_save_as" => "儲存到",
"newfolder" => "建立資料",
"newothers" => "其他",
"newfolder" => "新建檔",
"newothers" => "建其他",
"path_loading" => "載入中...",
"go" => "走著!",
"go_up" => "上層",
"history_next" => "前進",
"history_back" => "後退",
"address_in_edit" => "點擊進入編輯狀態",
"double_click_rename" => "雙擊名稱重命名",
"double_click_rename" => "雙擊名稱重命名",
"double_click_open" => "雙擊打開",
"path_null" => "資料夾為空!",
"file_size_title" => "大小",
"path_null" => "文件夾為空!",
"file_size_title" => "大小",
"file_size_small_super" => "超小",
"file_size_small" => "小圖",
"file_size_default" => "中圖",
"file_size_big" => "大圖",
"file_size_big_super" => "超大圖",
"file_size_small" => "小圖",
"file_size_default" => "中圖",
"file_size_big" => "大圖",
"file_size_big_super" => "超大圖",
"upload" => "上傳",
"upload_ready" => "等待上傳 ",
"upload_success" => "上傳成功",
"upload_path_current" => "切換到前目錄",
"upload_select" => "選擇檔",
"upload_path_current" => "切換到前目錄",
"upload_select" => "選擇檔",
"upload_max_size" => "最大允許",
"upload_size_info" => "如果想設定更大請修改php.ini中允許上傳的最大值。選擇檔時,大於該設定的將自動過濾掉。",
"upload_error" => "上傳失敗",
"upload_error_http" => "或防火牆錯誤",
"upload_error_http" => "或防火牆錯誤",
"upload_muti" => "多檔上傳",
"upload_drag" => "上傳",
"upload_drag" => "上傳",
"upload_drag_tips" => "鬆開即可上傳!",
"path_not_allow" => "檔案名不允許出現",
"download" => "下載",
@ -514,25 +514,25 @@ return array(
"download_success" => "下載成功!",
"download_error" => "下載失敗!",
"download_error_create" => "寫入出錯!",
"download_error_exists" => "連結到檔案失敗!",
"upload_error_null" => "無檔",
"upload_error_big" => "大小超過伺服器限制",
"upload_error_move" => "移動檔失敗!",
"upload_error_exists" => "該檔已存在",
"upload_local" => "上傳",
"download_error_exists" => "鏈接到文件失敗!",
"upload_error_null" => "無檔",
"upload_error_big" => "大小超過伺服器限制",
"upload_error_move" => "移動檔失敗!",
"upload_error_exists" => "該檔已存在",
"upload_local" => "上傳",
"download_from_server" => "離線下載",
"save_path" => "儲存路徑",
"upload_select_muti" => "可選擇多個檔上傳",
"search" => "搜尋",
"searching" => "搜尋中...",
"search_result" => "結果",
"seach_result_too_more" => "結果太多,建議換一個目錄或詞語",
"search_result" => "結果",
"seach_result_too_more" => "結果太多,建議換一個目錄或詞語",
"search_null" => "無搜尋結果!",
"search_uplow" => "區分大小寫",
"search_content" => "搜尋檔案內容",
"search_info" => "請輸入搜尋詞和路徑進行搜尋!",
"search_ext_tips" => "用|隔開;例如 php|js|css<br/>不填則搜尋預設文字",
"file_type" => "類型",
"search_ext_tips" => "用|隔開;例如 php|js|css<br/>不填則搜尋默認文本",
"file_type" => "類型",
"goto" => "跳轉到",
"server_dwonload_desc" => "個任務加入到下載列表",
"parent_permission" => "父目錄許可權",
@ -552,7 +552,7 @@ return array(
"ui_explorer" => "檔案管理",
"ui_editor" => "編輯器",
"adminer" => "adminer",
"ui_project_home" => "專案",
"ui_project_home" => "專案",
"ui_login" => "登入",
"ui_logout" => "登出",
"setting" => "系統設定",
@ -562,58 +562,58 @@ return array(
"setting_password_old" => "原密碼",
"setting_password_new" => "修改為",
"setting_language" => "語言設定",
"setting_member" => "使用者管理",
"setting_group" => "使用者組管理",
"setting_group_add" => "新增使用者",
"setting_group_edit" => "編輯使用者",
"setting_member" => "用戶管理",
"setting_group" => "用戶組管理",
"setting_group_add" => "添加用戶",
"setting_group_edit" => "編輯用戶",
"setting_theme" => "主題設定",
"setting_wall" => "壁紙設",
"setting_wall" => "壁紙設",
"setting_wall_desktop" => "桌面壁紙",
"setting_wall_desktop_list" => "桌面壁紙管理",
"setting_wall_login_list" => "壁紙管理",
"setting_wall_login_tips" => "提示 : 當如上面片多於1張時,登入介面背景將隨機輪換",
"setting_wall_diy" => "壁紙:",
"setting_wall_info" => "圖片url地址圖片可以右鍵圖片瀏覽器打開即可得到",
"setting_wall_login_list" => "壁紙管理",
"setting_wall_login_tips" => "提示 : 當如上面片多於1張時,登陸界面背景將隨機輪換",
"setting_wall_diy" => "定義壁紙:",
"setting_wall_info" => "圖片url地址圖片可以右鍵圖片瀏覽器打開即可得到",
"setting_fav" => "收藏夾管理",
"setting_help" => "使用幫助",
"setting_about" => "關於作品",
"setting_success" => "修改已生效!",
"can_not_repeat" => "不允許重複",
"absolute_path" => "絕對地址",
"group" => "使用者",
"data_not_full" => "資料提交不完整!",
"default_user_can_not_do" => "預設使用者不能操作",
"default_group_can_not_do" => "預設使用者組不能操作",
"username_can_not_null" => "使用者名稱不能為空!",
"groupname_can_not_null" => "使用者組名不能為空!",
"groupdesc_can_not_null" => "使用者組描述不能為空!",
"group_move_user_error" => "所屬使用者組使用者移動失敗",
"group_already_remove" => "使用者組已被刪除",
"group_not_exists" => "使用者組不存在",
"member_add" => "新增使用者",
"group" => "用戶",
"data_not_full" => "數據提交不完整!",
"default_user_can_not_do" => "默認用戶不能操作",
"default_group_can_not_do" => "默認用戶組不能操作",
"username_can_not_null" => "用戶名不能為空!",
"groupname_can_not_null" => "用戶組名不能為空!",
"groupdesc_can_not_null" => "用戶組描述不能為空!",
"group_move_user_error" => "所屬用戶組用戶移動失敗",
"group_already_remove" => "用戶組已被刪除",
"group_not_exists" => "用戶組不存在",
"member_add" => "添加用戶",
"password_null_not_update" => "密碼不填表示不更改",
"if_save_file_tips" => "檔案未儲存,確定關閉視窗",
"if_save_file" => "尚未儲存,是否儲存?",
"if_save_file_tips" => "文件未保存,確定關閉窗口",
"if_save_file" => "尚未儲存,是否儲存?",
"if_remove" => "確認刪除",
"member_remove_tips" => "刪除後該使用者目錄會被清除",
"group_remove_tips" => "刪除後該使用者組使用者無法登入<br/>(需要重新設定使用者組)",
"group_name" => "使用者組名",
"member_remove_tips" => "刪除後該用戶目錄會被清除",
"group_remove_tips" => "刪除後該用戶組用戶無法登錄<br/>(需要重新設定用戶組)",
"group_name" => "用戶組名",
"group_name_tips" => "建議英文名,不能重複",
"group_desc" => "展示名稱",
"group_desc_tips" => "組名描述",
"group_role_ext" => "副檔名限制",
"group_role_ext" => "擴展名限制",
"group_role_ext_tips" => "多個用|分隔開",
"group_role_file" => "管理",
"group_role_file" => "管理",
"group_role_upload" => "允許上傳",
"group_role_user" => "使用者資料",
"group_role_group" => "使用者組管理",
"group_role_member" => "使用者管理",
"group_role_mkfile" => "",
"group_role_mkdir" => "建立資料",
"group_role_pathrname" => "命名",
"group_role_pathdelete" => "檔案刪除",
"group_role_pathinfo" => "檔案屬性",
"group_role_pathmove" => "移動(複製/剪下/貼上/拖曳操作)",
"group_role_user" => "用戶數據",
"group_role_group" => "用戶組管理",
"group_role_member" => "用戶管理",
"group_role_mkfile" => "建檔",
"group_role_mkdir" => "新建檔",
"group_role_pathrname" => "命名",
"group_role_pathdelete" => "文件刪除",
"group_role_pathinfo" => "文件屬性",
"group_role_pathmove" => "移動(複製/剪切/粘貼/拖拽操作)",
"group_role_zip" => "壓縮",
"group_role_unzip" => "解壓",
"group_role_search" => "搜尋",
@ -621,50 +621,50 @@ return array(
"group_role_can_upload" => "上傳下載",
"group_role_download" => "遠程下載",
"group_role_passowrd" => "修改密碼",
"group_role_config" => "使用者設定",
"group_role_fav" => "收藏夾操作(新增/編輯/刪除)",
"group_role_config" => "用戶設定",
"group_role_fav" => "收藏夾操作(添加/編輯/刪除)",
"action_list" => "列表查看",
"action_add" => "新增",
"action_add" => "添加",
"action_edit" => "編輯",
"action_del" => "刪除",
"group_role_ext_warning" => "不允許此類檔案的上傳,<br/>重新命名(重新命名為指定副檔名),<br/>編輯儲存,遠程下載,解壓",
"group_tips" => "<li> 1.使用者組名不能重複,修改組名後原屬於改組使用者會自動關聯</li><li> 2.副檔名限制關係系統安全性,請務必謹慎操作<i>(如果在web目錄下建立php;就意味著改程式的權限對此使用者形同虛設)</i> </li><li> 3.戶管理、權限組管理;查看權限和增刪改權限是綁定的;程式會自動關聯</li><li> 4.設定權限組能新增權限組後,後續權限是不繼承的<i>(此權限相當於最高權限)</i> </li>",
"group_role_ext_warning" => "不允許此類檔的上傳,<br/>重命名(重命名為指定擴展名),<br/>編輯儲存,遠程下載,解壓",
"group_tips" => "<li> 1.用戶組名不能重複,修改組名後原屬於改組用戶會自動關聯</li><li> 2.擴展名限制關係系統安全性,請務必謹慎操作<i>(如果在web目錄下新建php;就意味著改程序的權限對此用戶形同虛設)</i> </li><li> 3.戶管理、權限組管理;查看權限和增刪改權限是綁定的;程序會自動關聯</li><li> 4.設定權限組能添加權限組後,後續權限是不繼承的<i>(此權限相當於最高權限)</i> </li>",
"not_null" => "必填項不能為空!",
"picture_can_not_null" => "圖片地址不能為空!",
"rname_success" => "命名成功!",
"rname_success" => "命名成功!",
"please_inpute_search_words" => "請輸入要搜尋的字串",
"remove_success" => "刪除成功!",
"remove_fali" => "刪除失敗!",
"clipboard_null" => "剪貼簿為空!",
"create_success" => "成功!",
"create_error" => "失敗,請檢查目錄許可權!",
"copy_success" => "【複製】—— 覆蓋剪貼簿成功!",
"cute_success" => "【剪下】—— 覆蓋剪貼簿成功!",
"clipboard_state" => "板狀態:",
"no_permission_write_all" => "該檔案或目錄沒有寫權",
"no_permission_write_file" => "檔案無寫權限",
"no_permission_read_all" => "該檔案或目錄沒有讀取權",
"clipboard_null" => "剪貼為空!",
"create_success" => "建成功!",
"create_error" => "建失敗,請檢查目錄許可權!",
"copy_success" => "【複製】—— 覆蓋剪貼成功!",
"cute_success" => "【剪切】—— 覆蓋剪貼板成功!",
"clipboard_state" => "板狀態:",
"no_permission_write_all" => "该檔案或目录没有写权",
"no_permission_write_file" => "檔案無寫權限",
"no_permission_read_all" => "该檔案或目录没有读取权",
"copy_not_exists" => "來源不存在",
"current_has_parent" => "目標資料夾是原始檔案夾的子資料夾!",
"past_success" => "<b>操作完成</b>",
"cute_past_success" => "<b>剪下操作完成</b>(來源檔案被刪除,剪貼簿清空)",
"current_has_parent" => "目標檔夾是原始檔案夾的子檔夾!",
"past_success" => "<b>貼操作完成</b>",
"cute_past_success" => "<b>剪切操作完成</b>(源文件被刪除,剪貼板清空)",
"zip_success" => "壓縮完成",
"not_zip" => "不是壓縮檔",
"zip_null" => "無選擇的檔或目錄",
"unzip_success" => "解壓完成",
"gotoline" => "跳轉到行",
"path_is_current" => "所打開路徑和前路徑壹洋!",
"path_is_current" => "所打開路徑和前路徑壹洋!",
"path_exists" => "該名稱已存在!",
"undo" => "復原",
"redo" => "反復原",
"preview" => "預覽",
"wordwrap" => "自動換行",
"show_gutter" => "顯示行號",
"char_all_display" => "顯示不可見字",
"show_gutter" => "显示行号",
"char_all_display" => "顯示不可見字",
"auto_complete" => "自動提示",
"auto_save" => "自動",
"auto_save" => "自動",
"function_list" => "函數列表",
"code_theme" => "程式碼風格",
"code_theme" => "碼風格",
"font_size" => "字體大小",
"confirm" => "確定進行該操作?",
"button_ok" => "確定",
@ -673,11 +673,11 @@ return array(
"button_cancel" => "取消",
"button_edit" => "編輯",
"button_save" => "儲存",
"button_apply" => "",
"button_apply" => "",
"button_save_all" => "儲存全部",
"button_not_save" => "不儲存",
"button_add" => "新增",
"button_back_add" => "返回新增",
"button_add" => "添加",
"button_back_add" => "返回添加",
"button_del" => "刪除",
"button_save_edit" => "儲存修改",
"button_save_submit" => "儲存提交",
@ -692,16 +692,16 @@ return array(
"charset_CP1257" => "波羅的海周邊語言",
"charset_ISO_8859_13" => "波羅的海周邊語言",
"charset_ISO_8859_4" => "波羅的海周邊語言",
"charset_BIG5_HKSCS" => "-香港",
"charset_BIG5" => "體-台灣",
"charset_Georgian_Academy" => "喬治亞文",
"charset_BIG5_HKSCS" => "-香港",
"charset_BIG5" => "体-台湾",
"charset_Georgian_Academy" => "格魯吉亞文",
"charset_PT154" => "哈薩克文",
"charset_CP949" => "韓語",
"charset_EUC_KR" => "韓語",
"charset_GB18030" => "簡體中文",
"charset_GBK" => "簡體中文",
"charset_ISO_8859_14" => "凱爾特語",
"charset_CP1133" => "寮國",
"charset_CP1133" => "老撾",
"charset_ISO_8859_16" => "羅馬尼亞文",
"charset_ISO_8859_3" => "南歐語言",
"charset_EUC_JP" => "日文",
@ -728,7 +728,7 @@ return array(
"charset_VISCII" => "越南文",
"charset_CP1250" => "中歐語言",
"charset_ISO_8859_2" => "中歐語言",
"charset_default_set" => "檔案編碼",
"charset_default_set" => "文件編碼",
"charset_convert_save" => "轉換編碼為",
"PluginCenter" => "插件中心",
"PluginBuy" => "購買授權",
@ -737,7 +737,7 @@ return array(
"PluginListNull" => "沒有內容!",
"PluginType" => "分類",
"PluginTypeAll" => "全部",
"PluginTypeFile" => "檔案增強",
"PluginTypeFile" => "文件增強",
"PluginTypeSafe" => "安全工具",
"PluginTypeTools" => "實用工具",
"PluginTypeMedia" => "多媒體",
@ -745,7 +745,7 @@ return array(
"PluginInstall" => "安裝插件",
"PluginEnable" => "啟用插件",
"PluginDisable" => "禁用",
"PluginRemove" => "移除插件",
"PluginRemove" => "卸載插件",
"PluginConfig" => "配置插件",
"PluginStatus" => "狀態",
"PluginStatusEnabled" => "已啟用",
@ -762,43 +762,43 @@ return array(
"PluginDownloadNumber" => "安裝次數",
"PluginBack" => "返回",
"PluginReadme" => "描述",
"PluginResetConfig" => "恢復預設設定",
"PluginResetConfig" => "恢復默認設置",
"PluginInstallSelf" => "手動安裝",
"Plugin.config.auth" => "使用權限",
"Plugin.config.authDesc" => "定所有人可用,或者指定使用者、使用者組、權限組可以使用",
"Plugin.config.authDesc" => "置所有人可用,或者指定用戶、用戶組、權限組可以使用",
"Plugin.config.authOpen" => "開放訪問",
"Plugin.config.authOpenDesc" => "無需登入皆可訪問,可用於對外介面調用",
"Plugin.config.authOpenDesc" => "無需登陸皆可訪問,可用於對外接口調用",
"Plugin.config.authAll" => "所有人",
"Plugin.config.authUser" => "指定使用者",
"Plugin.config.authUser" => "指定用戶",
"Plugin.config.authGroup" => "指定部門",
"Plugin.config.authRole" => "指定權限組",
"Plugin.Config.openWith" => "打開樣式",
"Plugin.Config.openWithDilog" => "內部對話框",
"Plugin.Config.openWithWindow" => "新頁面打開",
"Plugin.Config.fileSort" => "副檔名關聯優先度",
"Plugin.Config.fileSortDesc" => "越大副檔名打開優先度越高",
"Plugin.Config.fileExt" => "援的檔案格式",
"Plugin.Config.fileExtDesc" => "關聯副檔名到該插件",
"Plugin.tab.basic" => "基礎設",
"Plugin.tab.auth" => "權限設",
"Plugin.tab.others" => "其他設",
"Plugin.Config.fileSort" => "擴展名關聯優先級",
"Plugin.Config.fileSortDesc" => "越大擴展名打開優先級越高",
"Plugin.Config.fileExt" => "持的文件格式",
"Plugin.Config.fileExtDesc" => "關聯擴展名到該插件",
"Plugin.tab.basic" => "基礎設",
"Plugin.tab.auth" => "權限設",
"Plugin.tab.others" => "其他設",
"Plugin.default.aceEditor" => "Ace編輯器",
"Plugin.default.htmlView" => "網頁預覽",
"Plugin.default.picasa" => "Picasa 圖片瀏覽",
"Plugin.default.zipView" => "解壓縮",
"Plugin.default.zipView" => "線解壓縮",
"Plugin.default.jPlayer" => "jPlayer 播放器",
"Plugin.auth.viewList" => "插件列表",
"Plugin.auth.setting" => "插件設",
"Plugin.auth.setting" => "插件設",
"Plugin.auth.status" => "開啟關閉",
"Plugin.auth.install" => "安裝/移除",
"Plugin.auth.install" => "安裝/卸載",
"Explorer.UI.openWith" => "選擇打開方式",
"Explorer.UI.openWithText" => "記事本打開",
"Explorer.UI.appSetDefault" => "定預設打開",
"Explorer.UI.appAwaysOpen" => "始終使用選擇的程式打開這種檔案",
"Explorer.UI.selectAppDesc" => "選擇您想用來打開此檔案的程式",
"Explorer.UI.selectAppWarning" => "請選擇程式!",
"Explorer.UI.appTypeSupport" => "援程式",
"Explorer.UI.appTypeAll" => "所有程式",
"kodApp.oexe.edit" => "編輯輕程式",
"kodApp.oexe.open" => "打開輕程式"
);
"Explorer.UI.appSetDefault" => "置默認打開",
"Explorer.UI.appAwaysOpen" => "始終使用選擇的程序打開這種文件",
"Explorer.UI.selectAppDesc" => "選擇您想用來打開此文件的程序",
"Explorer.UI.selectAppWarning" => "請選擇應用!",
"Explorer.UI.appTypeSupport" => "持应用",
"Explorer.UI.appTypeAll" => "所有應用",
"kodApp.oexe.edit" => "編輯輕應用",
"kodApp.oexe.open" => "打開輕應用"
);

View File

@ -13,7 +13,7 @@ $config['settings'] = array(
'updloadChunkSize' => 1024*1024*0.4,//0.4M;分片上传大小设定;需要小于php.ini上传限制的大小
'updloadThreads' => 10, //上传并发数;部分低配服务器上传失败则将此设置为1
'updloadBindary' => 0, //1:以二进制方式上传;后端服务器以php://input接收;0则为传统方式上传
'uploadCheckChunk' => false, //开关断点续传,一个文件上传一半时中断,同一个文件再次上传到同一个位置时会接着之前的进度上传。开启后会一定程度影响上传速度
'uploadCheckChunk' => true, //开关断点续传,一个文件上传一半时中断,同一个文件再次上传到同一个位置时会接着之前的进度上传
'paramRewrite' => false, //开启url 去除? 直接跟参数
'httpSendFile' => false, //调用webserver下载 http://www.laruence.com/2012/05/02/2613.html;
//https://www.lovelucy.info/x-sendfile-in-nginx.html

View File

@ -1,2 +1,2 @@
<?php
define('KOD_VERSION','4.35');
define('KOD_VERSION','4.36');

View File

@ -2,7 +2,7 @@
"id":"DPlayer",
"name":"DPlayer播放器",
"title":"DPlayer播放器",
"version":"1.04",
"version":"1.05",
"source":{
"icon":"{{pluginHost}}static/images/icon.png",
},

View File

@ -21,10 +21,10 @@ define(function(require, exports) {
url:vedioInfo.url,
type:type
},
danmaku: {
id:md5(vedioInfo.url),
api:'https://api.prprpr.me/dplayer/'
},
// danmaku: {
// id:md5(vedioInfo.url),
// api:'https://api.prprpr.me/dplayer/'
// },
contextmenu: [
{
text: 'kodcloud官网',

View File

@ -5,10 +5,11 @@ return array(
"officeLive.meta.desc" => "Officelive Viewer",
"officeLive.Config.apiServer" => "Server Api",
"officeLive.Config.apiServerDesc" => "<br/><br/>The address of the preview server must be accessible by the server where the server can access kods can use third party services, or Microsoft's official interface <br/> (Kod server must be in the external network, and the need for domain name access)
"officeLive.Config.apiServerDesc" => "<div class='can-select pt-10'>
The address of the preview server must be accessible by the server where the server can access kods can use third party services, or Microsoft's official interface <br/> (Kod server must be in the external network, and the need for domain name access)
<div class = 'grayy 8'> https://owa-box.vips100.com/op/view.aspx?src= </div>
<div class = 'grayy 8'> https://docview.mingdao.com/op/view.aspx?src= </div>
<div class = 'grayy 8'> https://preview.tita.com/op/view.aspx?src= </div>
<div class = 'grayy 8'> https://view.officeapps.live.com/op/view.aspx?src= </div>
Users can build their own; <a href='http://kodcloud.com/office.html' target='_blank'> learn more </a>"
Users can build their own; <a href='https://kodcloud.com/help/show-5.html' target='_blank'> learn more </a></div>"
);

View File

@ -5,10 +5,11 @@ return array(
"officeLive.meta.desc" => "office系列文件在线预览",
"officeLive.Config.apiServer" => "服务器接口",
"officeLive.Config.apiServerDesc" => "<br/><br/>预览服务器的地址必须要office所在服务器能访问到kod<br/>可以使用第三方的服务,或微软官方的接口<br/>(kod服务器必须要在外网,且需要域名访问)<br/><br/>
"officeLive.Config.apiServerDesc" => "<div class='can-select pt-10'>
预览服务器的地址必须要office所在服务器能访问到kod<br/>可以使用第三方的服务,或微软官方的接口<br/>(kod服务器必须要在外网,且需要域名访问)<br/><br/>
<div class='grey-8'>https://owa-box.vips100.com/op/view.aspx?src=</div>
<div class='grey-8'>https://docview.mingdao.com/op/view.aspx?src=</div>
<div class='grey-8'>https://preview.tita.com/op/view.aspx?src=</div>
<div class='grey-8'>https://view.officeapps.live.com/op/view.aspx?src=</div><br/>
内网的用户,可以自己搭建;<a href='http://kodcloud.com/office.html' target='_blank'>了解详情</a>"
内网的用户,可以自己搭建;<a href='https://kodcloud.com/help/show-5.html' target='_blank'>了解详情</a></div>"
);

File diff suppressed because one or more lines are too long

View File

@ -2,7 +2,7 @@
"id":"yzOffice",
"name":"{{LNG.yzOffice.meta.name}}",
"title":"{{LNG.yzOffice.meta.title}}",
"version":"1.33",
"version":"1.34",
"category":"file",
"source":{
"icon":"{{pluginHost}}static/images/icon.png"

View File

@ -8,6 +8,9 @@
//$('.navbar-inverse').css('opacity',0);
}
$(document).ready(function(){
if($(".nav-collapse").length == 1){
$('body').addClass("body-excle");
}
})
</script>
<div class='powerby'>yozo DCS</div>

View File

@ -2,7 +2,7 @@
"id":"zipView",
"name":"{{LNG.Plugin.default.zipView}}",
"title":"",
"version":"1.34",
"version":"1.35",
"source":{
"icon":"{{pluginHost}}static/images/icon.png",
"screenshoot":[

View File

@ -141,7 +141,7 @@ define(function(require, exports) {
if(tree[i]['child']){
tree[i]['children'] = tree[i]['child'];
delete(tree[i]['child']);
clearCell(tree[i]['children']);
arguments.callee(tree[i]['children']);// == clearCell
}else{
delete(tree[i]['child']);
}
@ -185,15 +185,14 @@ define(function(require, exports) {
var tree = [];
for(var key in items){
var cell = items[key];
var parent_key = core.pathFather(cell['filename']);
if(items[parent_key]) parent_key = core.pathFather(cell['filename']);
if(items[rtrim(parent_key,'/')]) parent_key = rtrim(parent_key,'/');
if (items[parent_key]){
if(!items[parent_key]['child']){
items[parent_key]['child'] = [];
var parentKey = core.pathFather(cell['filename']);
if(items[parentKey]) parentKey = core.pathFather(cell['filename']);
if(items[rtrim(parentKey,'/')]) parentKey = rtrim(parentKey,'/');
if (items[parentKey]){
if(!items[parentKey]['child']){
items[parentKey]['child'] = [];
}
items[parent_key]['child'].push(items[cell['filename']]);
items[parentKey]['child'].push(items[cell['filename']]);
}else{
var temp = items[cell['filename']];
if(temp){
@ -404,7 +403,6 @@ define(function(require, exports) {
if(node.level == 0){
data.path = data.name;
}
if(node.type == 'folder'){
folderSizeCell = {fileCount:0,folderCount:0,size:0};
folderSize(node);
@ -467,7 +465,7 @@ define(function(require, exports) {
}
});
}
var treeDataSort = function(treeData,isRoot){
var treeDataSort = function(treeData){
var fileList = [],folderList=[];
for (var i = 0; i < treeData.length; i++) {
treeData[i].name = treeData[i].name;
@ -480,9 +478,6 @@ define(function(require, exports) {
fileList.push(treeData[i]);
}
}
if( isRoot ){//根目录不排序
return treeData;
}
folderList= folderList.sort(function (a, b) {
var a = a['name'];
var b = b['name'];
@ -496,13 +491,87 @@ define(function(require, exports) {
return folderList.concat(fileList);
};
var initData = function(title,data,path){
var treeData = makeTree(data);
var treeID = 'folder-list-zip-'+UUID();
treeData = treeDataSort(treeData);
if( typeof(window.WorkerRun) == "undefined" ){
WorkerRun = function(work,param,callback,alias){
setTimeout(function(){
callback(work(param));
},0);
return;
}
}
//core做了混淆压缩获取原代码失效;
var coreCode = {
pathThis:function(beforePath){
if(!beforePath || beforePath=='/') return '';
var path = rtrim(this.pathClear(beforePath),'/');
var index = path.lastIndexOf('/');
var name = path.substr(index+1);
//非服务器路径
if (name.search('fileProxy')==0) {
name = urlDecode(name.substr(name.search('&path=')));
var arr = name.split('/');
name = arr[arr.length -1];
if (name=='') name = arr[arr.length -2];
}
return name;
},
pathClear:function(beforePath){
if(!beforePath) return '';
var path = beforePath.replace(/\\/g, "/");
path = path.replace(/\/+/g, "/");
//path = rtrim(path,'/');
path = path.replace(/\.+\//g, "/");
return path;
},
//获取文件父目录
pathFather:function(beforePath){
var path = rtrim(this.pathClear(beforePath),'/');
var index = path.lastIndexOf('/');
return path.substr(0,index+1);
},
//获取路径扩展名
pathExt:function(beforePath){
var path = trim(beforePath,'/');
if(path.lastIndexOf('/')!=-1){
path = path.substr(path.lastIndexOf('/')+1);
}
if(path.lastIndexOf('.')!=-1){
return path.substr(path.lastIndexOf('.')+1).toLowerCase();
}else{
return path.toLowerCase();
}
}
};
var initData = function(path,data){
var title = urlDecode(core.pathThis(path));
var treeID = 'folder-list-zip-'+UUID();
initView(treeID,title,path);
Hook.trigger('Plugin.zipView.init');
bindMenu();
Hook.trigger('Plugin.zipView.init');
Tips.loading(LNG.loading);
//worker异步执行;
WorkerRun(function(data){
var treeData = makeTree(data);
treeData = treeDataSort(treeData);
return treeData;
},data,function(treeData){
initDataView(treeID,treeData,data,path);
Tips.close(LNG.success,true);
},[
'pathTools.strSort','trim','rtrim','ltrim','urlEncode','urlDecode','$.isNumeric',
{'core.pathFather':coreCode.pathFather},
{'core.pathClear':coreCode.pathClear},
{'core.pathThis':coreCode.pathThis},
{'core.pathExt':coreCode.pathExt},
{strSortChina:pathTools.strSortChina},
{makeTree:makeTree,treeDataSort:treeDataSort,currentFileUrl:currentFileUrl}
]);
}
var initDataView = function(treeID,treeData,data,path){
var title = urlDecode(core.pathThis(path));
treeData = {//根目录
name:title,
ext:core.pathExt(path),
@ -518,6 +587,9 @@ define(function(require, exports) {
}
$.fn.zTree.init($("#"+treeID),setting,treeData);
zTree = $.fn.zTree.getZTreeObj(treeID);
zTree.setting.filePath = path;
zTree.setting.fileUrl = currentFileUrl;
resetOdd(treeID);
pathInfoNode(zTree.getNodeByParam("index",'-1',null));
}
@ -528,10 +600,9 @@ define(function(require, exports) {
$dlgItem.shake(3,20,80);
return;
}
var fileUrl = appOption.apiList+'&path='+urlEncode(path);
currentFileUrl = fileUrl;
currentFileUrl = appOption.apiList+'&path='+urlEncode(path);
$.ajax({
url:fileUrl,
url:currentFileUrl,
dataType:'json',
beforeSend: function(){
Tips.loading(LNG.loading);
@ -544,10 +615,7 @@ define(function(require, exports) {
}
Tips.close(data);
if(data.code){
var name = urlDecode(core.pathThis(path));
initData(name,data.data,path);
zTree.setting.filePath = path;
zTree.setting.fileUrl = fileUrl;
initData(path,data.data);
}else{//预览失败
kodApp.openUnknow(path,data.data);
}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -238,7 +238,7 @@ ace.define("ace/ext/searchboxKod", ["require", "exports", "module", "ace/lib/dom
$search.addClass('hidden');
$edit_body.css('bottom',0);
}
Editor.current() && Editor.current().resize();
Editor && Editor.current() && Editor.current().resize();
}
this.setEditor = function(appSpace,editor) {
var $search = $('.search-content');
@ -248,7 +248,7 @@ ace.define("ace/ext/searchboxKod", ["require", "exports", "module", "ace/lib/dom
this.resetEditorHeight(true);
appSpace.searchBox = this;
this.editor = editor;
Editor.current() && Editor.current().resize();
Editor && Editor.current() && Editor.current().resize();
};
this.$initElements = function(sb) {
this.searchBox = sb.querySelector(".ace_search_form");

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,544 @@
/*!
* CityPicker v@VERSION
* https://github.com/tshi0912/citypicker
*
* Copyright (c) 2015-@YEAR Tao Shi
* Released under the MIT license
*
* Date: @DATE
*
* changed by warlee;
* arrayPicker
*/
(function (factory) {
if (typeof define === 'function' && define.amd) {
// AMD. Register as anonymous module.
define(['jquery', 'ChineseDistricts'], factory);
} else if (typeof exports === 'object') {
// Node / CommonJS
factory(require('jquery'), require('ChineseDistricts'));
} else {
// Browser globals.
factory(jQuery, ChineseDistricts);
}
})(function ($, ChineseDistricts) {
'use strict';
if (typeof ChineseDistricts === 'undefined') {
throw new Error('The file "city-picker.data.js" must be included first!');
}
var NAMESPACE = 'citypicker';
var EVENT_CHANGE = 'change.' + NAMESPACE;
var PROVINCE = 'province';
var CITY = 'city';
var DISTRICT = 'district';
function CityPicker(element, options) {
this.$element = $(element);
this.$dropdown = null;
this.options = $.extend({}, CityPicker.DEFAULTS, $.isPlainObject(options) && options);
this.active = false;
this.dems = [];
this.needBlur = false;
this.init();
}
$.fn.extend({
offsetWindow:function(){
var info = $(this).get(0).getBoundingClientRect();
return {
top:info.top,
left:info.left,
bottom:$(window).height() - info.top - $(this).outerHeight(),
right: $(window).width() - info.left - $(this).outerWidth(),
}
}
});
CityPicker.prototype = {
constructor: CityPicker,
init: function () {
this.defineDems();
this.render();
this.bind();
this.active = true;
},
render: function () {
var p = this.getPosition(),
placeholder = this.$element.attr('placeholder') || this.options.placeholder,
textspan = '<span class="city-picker-span" style="height:' +
p.height+'px;line-height:' + (p.height - 1) + 'px;">' +
(placeholder ? '<span class="placeholder">' + placeholder + '</span>' : '') +
'<span class="title"></span><div class="arrow"></div></span>',
dropdown = '<div class="city-picker-dropdown" style="left:0px;top:100%;">' +
'<div class="city-select-wrap">' +
'<div class="city-select-tab">' +
'<a class="active" data-count="province">省份</a>' +
(this.includeDem('city') ? '<a data-count="city">城市</a>' : '') +
(this.includeDem('district') ? '<a data-count="district">区县</a>' : '') + '</div>' +
'<div class="city-select-content">' +
'<div class="city-select province" data-count="province"></div>' +
(this.includeDem('city') ? '<div class="city-select city" data-count="city"></div>' : '') +
(this.includeDem('district') ? '<div class="city-select district" data-count="district"></div>' : '') +
'</div></div>';
this.$element.addClass('city-picker-input');
this.$textspan = $(textspan).insertAfter(this.$element);
// this.$dropdown = $(dropdown).insertAfter(this.$textspan);
this.$dropdown = $(dropdown).appendTo('body');
var $select = this.$dropdown.find('.city-select');
var padding = parseInt(this.$textspan.css("padding-left"))+ parseInt(this.$textspan.css("padding-right"));
this.$textspan.css({'min-width':p.width-padding});
// setup this.$province, this.$city and/or this.$district object
$.each(this.dems, $.proxy(function (i, type) {
this['$' + type] = $select.filter('.' + type + '');
}, this));
this.refresh();
},
refresh: function (force) {
var $select = this.$dropdown.find('.city-select');
$select.data('item', null);
var val = this.$element.val() || '';
val = val.split('/');
$.each(this.dems, $.proxy(function (i, type) {
if (val[i] && i < val.length) {
this.options[type] = val[i];
} else if (force) {
this.options[type] = '';
}
this.output(type);
}, this));
this.tab(PROVINCE);
this.feedText();
this.feedVal();
},
defineDems: function () {
var stop = false;
$.each([PROVINCE, CITY, DISTRICT], $.proxy(function (i, type) {
if (!stop) {
this.dems.push(type);
}
if (type === this.options.level) {
stop = true;
}
}, this));
},
includeDem: function (type) {
return $.inArray(type, this.dems) !== -1;
},
getPosition: function () {
var p, h, w, s, pw;
p = this.$element.position();
s = this.getSize(this.$element);
h = s.height;
w = s.width;
return {
top: p.top || 0,
left: p.left || 0,
height: h,
width: w
};
},
getSize: function ($dom) {
var $wrap, $clone, sizes;
if (!$dom.is(':visible')) {
$wrap = $("<div />").appendTo($("body"));
$wrap.css({
"position": "absolute !important",
"visibility": "hidden !important",
"display": "block !important"
});
$clone = $dom.clone().appendTo($wrap);
sizes = {
width: $clone.outerWidth(),
height: $clone.outerHeight()
};
$wrap.remove();
} else {
sizes = {
width: $dom.outerWidth(),
height: $dom.outerHeight()
};
}
return sizes;
},
bind: function () {
var $this = this;
$(document).on('click', (this._mouteclick = function (e) {
var $target = $(e.target);
var $dropdown, $span, $input;
if ($target.is('.city-picker-span')) {
$span = $target;
} else if ($target.is('.city-picker-span *')) {
$span = $target.parents('.city-picker-span');
}
if ($target.is('.city-picker-input')) {
$input = $target;
}
if ($target.is('.city-picker-dropdown')) {
$dropdown = $target;
} else if ($target.is('.city-picker-dropdown *')) {
$dropdown = $target.parents('.city-picker-dropdown');
}
if ((!$input && !$span && !$dropdown) ||
($span && $span.get(0) !== $this.$textspan.get(0)) ||
($input && $input.get(0) !== $this.$element.get(0)) ||
($dropdown && $dropdown.get(0) !== $this.$dropdown.get(0))) {
$this.close(true);
}
}));
this.$element.on('change', (this._changeElement = $.proxy(function () {
this.close(true);
this.refresh(true);
}, this))).on('focus', (this._focusElement = $.proxy(function () {
this.needBlur = true;
this.open();
}, this))).on('blur', (this._blurElement = $.proxy(function () {
if (this.needBlur) {
this.needBlur = false;
this.close(true);
}
}, this)));
this.$textspan.on('click', function (e) {
var $target = $(e.target), type;
$this.needBlur = false;
if ($target.is('.select-item')) {
type = $target.data('count');
$this.open(type);
} else {
if ($this.$dropdown.is(':visible')) {
$this.close();
} else {
$this.open();
}
}
}).on('mousedown', function () {
$this.needBlur = false;
});
this.$dropdown.on('click', '.city-select a', function () {
var $select = $(this).parents('.city-select');
var $active = $select.find('a.active');
var last = $select.next().length === 0;
$active.removeClass('active');
$(this).addClass('active');
if ($active.data('code') !== $(this).data('code')) {
$select.data('item', {
address: $(this).data('title'),
code: $(this).data('code')
});
$(this).trigger(EVENT_CHANGE);
$this.feedText();
$this.feedVal(true);
if (last) {
$this.close();
}
}
}).on('click', '.city-select-tab a', function () {
if (!$(this).hasClass('active')) {
var type = $(this).data('count');
$this.tab(type);
}
}).on('mousedown', function () {
$this.needBlur = false;
});
if (this.$province) {
this.$province.on(EVENT_CHANGE, (this._changeProvince = $.proxy(function () {
this.output(CITY);
this.output(DISTRICT);
this.tab(CITY);
}, this)));
}
if (this.$city) {
this.$city.on(EVENT_CHANGE, (this._changeCity = $.proxy(function () {
this.output(DISTRICT);
this.tab(DISTRICT);
}, this)));
}
},
resetPosition:function(){
var pose = this.$textspan.offsetWindow();
var margin = 3;
var top = this.$textspan.offset().top + this.$textspan.outerHeight() + margin;
this.$dropdown.removeClass("position-top");
if(pose.bottom <= 300 && pose.top>300){
top = this.$textspan.offset().top - this.$dropdown.outerHeight() - margin;
this.$dropdown.addClass("position-top");
}
this.$dropdown.css({
left:this.$textspan.offset().left,
top:top
});
},
open: function (type) {
type = type || PROVINCE;
this.$dropdown.show();
this.$textspan.addClass('open').addClass('focus');
this.tab(type);
},
close: function (blur) {
this.$dropdown.hide();
this.$textspan.removeClass('open');
if (blur) {
this.$textspan.removeClass('focus');
}
},
unbind: function () {
$(document).off('click', this._mouteclick);
this.$element.off('change', this._changeElement);
this.$element.off('focus', this._focusElement);
this.$element.off('blur', this._blurElement);
this.$textspan.off('click');
this.$textspan.off('mousedown');
this.$dropdown.off('click');
this.$dropdown.off('mousedown');
if (this.$province) {
this.$province.off(EVENT_CHANGE, this._changeProvince);
}
if (this.$city) {
this.$city.off(EVENT_CHANGE, this._changeCity);
}
},
getText: function () {
var text = '';
this.$dropdown.find('.city-select')
.each(function () {
var item = $(this).data('item'),
type = $(this).data('count');
if (item) {
text += ($(this).hasClass('province') ? '' : '/') + '<span class="select-item" data-count="' +
type + '" data-code="' + item.code + '">' + item.address + '</span>';
}
});
return text;
},
getPlaceHolder: function () {
return this.$element.attr('placeholder') || this.options.placeholder;
},
feedText: function () {
var text = this.getText();
if (text) {
this.$textspan.find('>.placeholder').hide();
this.$textspan.find('>.title').html(this.getText()).show();
} else {
this.$textspan.find('>.placeholder').text(this.getPlaceHolder()).show();
this.$textspan.find('>.title').html('').hide();
}
},
getCode: function (count) {
var obj = {}, arr = [];
this.$textspan.find('.select-item')
.each(function () {
var code = $(this).data('code');
var count = $(this).data('count');
obj[count] = code;
arr.push(code);
});
return count ? obj[count] : arr.join('/');
},
getVal: function () {
var text = '';
this.$dropdown.find('.city-select')
.each(function () {
var item = $(this).data('item');
if (item) {
text += ($(this).hasClass('province') ? '' : '/') + item.address;
}
});
return text;
},
feedVal: function (trigger) {
this.$element.val(this.getVal());
if(trigger) {
this.$element.trigger('cp:updated');
}
},
output: function (type) {
var options = this.options;
var $select = this['$' + type];
var data = type === PROVINCE ? {} : [];
var item;
var districts;
var code;
var matched = null;
var value;
if (!$select || !$select.length) {
return;
}
item = $select.data('item');
value = (item ? item.address : null) || options[type];
code = (
type === PROVINCE ? 86 :
type === CITY ? this.$province && this.$province.find('.active').data('code') :
type === DISTRICT ? this.$city && this.$city.find('.active').data('code') : code
);
districts = $.isNumeric(code) ? ChineseDistricts[code] : null;
if ($.isPlainObject(districts)) {
$.each(districts, function (code, address) {
var provs;
if (type === PROVINCE) {
provs = [];
for (var i = 0; i < address.length; i++) {
if (address[i].address === value) {
matched = {
code: address[i].code,
address: address[i].address
};
}
provs.push({
code: address[i].code,
address: address[i].address,
selected: address[i].address === value
});
}
data[code] = provs;
} else {
if (address === value) {
matched = {
code: code,
address: address
};
}
data.push({
code: code,
address: address,
selected: address === value
});
}
});
}
$select.html(type === PROVINCE ? this.getProvinceList(data):this.getList(data, type));
$select.data('item', matched);
},
getProvinceList: function (data) {
var list = [],
$this = this,
simple = this.options.simple;
$.each(data, function (i, n) {
list.push('<dl class="clearfix">');
list.push('<dt>' + i + '</dt><dd>');
$.each(n, function (j, m) {
list.push(
'<a' +
' data-title="' + (m.address || '') + '"' +
' data-code="' + (m.code || '') + '"' +
' class="' +
(m.selected ? ' active' : '') +
'">' +
( simple ? $this.simplize(m.address, PROVINCE) : m.address) +
'</a>');
});
list.push('</dd></dl>');
});
return list.join('');
},
getList: function (data, type) {
var list = [],
$this = this,
simple = this.options.simple;
list.push('<dl class="clearfix"><dd>');
$.each(data, function (i, n) {
list.push(
'<a' +
' data-title="' + (n.address || '') + '"' +
' data-code="' + (n.code || '') + '"' +
' class="' +
(n.selected ? ' active' : '') +
'">' +
( simple ? $this.simplize(n.address, type) : n.address) +
'</a>');
});
list.push('</dd></dl>');
return list.join('');
},
simplize:function (address, type) {
address = address || '';
if (type === PROVINCE) {
return address.replace(/[省,市,自治区,壮族,回族,维吾尔]/g, '');
} else if (type === CITY) {
return address.replace(/[市,地区,回族,蒙古,苗族,白族,傣族,景颇族,藏族,彝族,壮族,傈僳族,布依族,侗族]/g, '')
.replace('哈萨克', '').replace('自治州', '').replace(/自治县/, '');
} else if (type === DISTRICT) {
return address.length > 2 ? address.replace(/[市,区,县,旗]/g, '') : address;
}
},
tab: function (type) {
var $selects = this.$dropdown.find('.city-select');
var $tabs = this.$dropdown.find('.city-select-tab > a');
var $select = this['$' + type];
var $tab = this.$dropdown.find('.city-select-tab > a[data-count="' + type + '"]');
if ($select) {
$selects.hide();
$select.show();
$tabs.removeClass('active');
$tab.addClass('active');
}
this.resetPosition();
},
reset: function () {
this.$element.val(null).trigger('change');
},
destroy: function () {
this.unbind();
this.$element.removeData(NAMESPACE).removeClass('city-picker-input');
this.$textspan.remove();
this.$dropdown.remove();
}
};
CityPicker.DEFAULTS = {
simple: false,
level: 'district',
province: '',
city: '',
district: ''
};
CityPicker.setDefaults = function (options) {
$.extend(CityPicker.DEFAULTS, options);
};
CityPicker.other = $.fn.citypicker;
$.fn.citypicker = function (option) {
var args = [].slice.call(arguments, 1);
return this.each(function () {
var $this = $(this);
var data = $this.data(NAMESPACE);
var options;
var fn;
if (!data) {
if (/destroy/.test(option)) {
return;
}
options = $.extend({}, $this.data(), $.isPlainObject(option) && option);
$this.data(NAMESPACE, (data = new CityPicker(this, options)));
}
if (typeof option === 'string' && $.isFunction(fn = data[option])) {
fn.apply(data, args);
}
});
};
$.fn.citypicker.Constructor = CityPicker;
$.fn.citypicker.setDefaults = CityPicker.setDefaults;
$.fn.citypicker.noConflict = function () {
$.fn.citypicker = CityPicker.other;
return this;
};
$(function () {
$('[data-toggle="city-picker"]').citypicker();
});
});

View File

@ -0,0 +1,192 @@
.city-picker-input, .city-picker-input[readonly] {
background: #fff;
color: rgba(0,0,0,0.001);
border-radius: 0px;
box-shadow: none;
display: none !important;
}
.city-picker-span {
position: relative;
display: inline-block;
background: #fdfdfd;
border-radius: 3px;
border: 1px solid #ddd;
outline: 0;
padding: 0 8px;
min-width: 150px;
color: #ccc;
cursor: pointer;
width:auto;
text-overflow: ellipsis;
white-space: nowrap;
overflow: hidden;
}
.city-picker-dropdown{background:#fff;}
.city-picker-dropdown.position-top{
padding-bottom: 40px;
}
.city-picker-dropdown.position-top .city-select-tab {
position: absolute;
bottom: 0px;
width: 100%;
padding: 0px 15px 9px 15px;
border-top: 1px solid #dfe2e5;
border-bottom: none;
}
.city-picker-dropdown.position-top .city-select-tab > a{
margin-top: -1px;margin-bottom:0;
}
.city-picker-dropdown.position-top .city-select-tab > a.active {
border-radius: 0;
border-bottom-left-radius: 3px;
border-bottom-right-radius: 3px;
border-bottom: 1px solid #ddd;
border-top: 1px solid #fff;
}
.city-picker-span > .placeholder {
color: #aaa;
}
.city-picker-span > .arrow {
position: absolute;
top: 50%;
right: 8px;
width: 10px;
margin-top: -3px;
height: 5px;
}
.city-picker-span.focus,
.city-picker-span.open {
/* border-color: #46A4FF;
box-shadow: 1px 1px 5px rgba(70,165,255,0.2); */
box-shadow: 0px -1px 5px rgba(0,0,0,0.1);
}
.city-picker-span.open > .arrow {
background-position: -10px -10px;
}
span.city-picker-span:hover {
border-color: #46A4FF;
}
.city-picker-span > .title > span {
color: #333;
padding: 2px 4px;
margin: 0 2px;
border-radius: 3px;
}
.city-picker-span > .title > span:hover {
background-color:#def;
color:#46A4FF;
}
.city-picker-dropdown {
position: absolute;
width: 420px;
left: -9999px;
top: -9999px;
outline: 0;
-webkit-tap-highlight-color: rgba(0, 0, 0, 0);
z-index: 999999;
display: none;
min-width: 330px;
border: 1px solid #d6d7d7;
border-radius: 2px;
box-shadow: 0 3px 12px rgba(0,0,0,.2);
overflow: hidden;
}
.city-select-wrap {
}
.city-select-tab {
border-bottom: 1px solid #dfe2e5;
background: #f5f5f5;
font-size: 13px;
padding: 8px 15px 0 15px;
}
.city-select-tab > a {
display: inline-block;
padding: 4px 20px;
border: 1px solid transparent;
color: #777;
text-align: center;
outline: 0;
text-decoration: none;
cursor: pointer;
font-size: 14px;
margin-bottom: -1px;
}
.city-select-tab > a:hover{
color: #46A4FF;
}
.city-select-tab > a.active {
background: #fff;
color: #46A4FF;
border-top-left-radius: 3px;
border-top-right-radius: 3px;
border: 1px solid #ddd;
border-bottom: 1px solid #fff;
}
.city-select-content {
width: 100%;
min-height: 10px;
background-color: #fff;
padding: 10px 15px;
box-sizing: border-box;
}
.city-select {
font-size: 13px;
}
.city-select dl {
line-height: 2;
clear: both;
padding: 3px 0;
margin: 0;
border-bottom: 1px dotted #eee;
}
.city-select dl:last-child {
border: none;
}
.city-select dt {
position: absolute;
width: 2.5em;
font-weight: 500;
text-align: right;
line-height: 2;
}
.city-select dd {
margin-left: 0;
line-height: 2;
}
.city-select.province dd {
margin-left: 3em;
}
.city-select a {
display: inline-block;
padding: 0 10px;
outline: 0;
text-decoration: none;
white-space: nowrap;
margin-right: 2px;margin-bottom: 1px;
text-decoration: none;
color: #666;
border-radius: 4px;
cursor: pointer;
}
.city-select a:hover,
.city-select a:focus {
background-color: #def;
border-radius: 2px;
color: #46A4FF;
}
.city-select a.active {
background-color: #46A4FF;
color: #fff;
border-radius: 2px;
}

View File

@ -0,0 +1,101 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta http-equiv="x-ua-compatible" content="ie=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="description" content="A simple jQuery plugin for picking provinces, cities and districts of China.">
<meta name="author" content="Tao Shi">
<title>city-picker</title>
<link href="http://cdn.bootcss.com/bootstrap/3.3.6/css/bootstrap.css" rel="stylesheet">
<link href="./css/city-picker.css" rel="stylesheet">
</head>
<style>
body{
font-family: "Helvetica Neue", Helvetica, "Microsoft Yahei", 微软雅黑, "Lantinghei SC", STXihei;
font-family: -apple-system,BlinkMacSystemFont,Segoe UI,Helvetica,Arial,sans-serif;
-webkit-font-smoothing: antialiased;
}
</style>
<body>
<!-- header -->
<header class="navbar navbar-static-top docs-header" id="top">
<div class="container">
<div class="navbar-header">
<button class="navbar-toggle" data-target="#navbar-collapse-1" data-toggle="collapse" type="button">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
</div>
<nav class="collapse navbar-collapse" id="navbar-collapse-1" role="navigation">
<ul class="nav navbar-nav navbar-right">
<li><a href="http://tshi0912.github.io/city-picker/" target="_blank">Docs</a></li>
</ul>
</nav>
</div>
</header>
<!-- Content -->
<div class="container" style="margin-bottom:300px;">
<h1 class="page-header" id="getting-started">使用说明</h1>
<pre class="prettyprint">
&lt;script src=&quot;/path/to/city-picker.data.js&quot;&gt;&lt;/script&gt;
&lt;script src=&quot;/path/to/city-picker.js&quot;&gt;&lt;/script&gt;
&lt;input readonly id="city-picker1" type="text" placeholder="请选择省/市" data-level="[province|city|district]" data-simple="true" &gt;
$('#city-picker1').citypicker();
</pre>
<h3>自定义初始数据</h3>
<pre class="prettyprint">&lt;div style="position: relative;"&gt;&lt;!-- container --&gt;
&lt;input readonly type="text" data-toggle="city-picker" value="北京市/北京市/海淀区"&gt;
&lt;/div&gt;</pre>
<h5>Demo:</h5>
<form class="form-inline">
<div style="position: relative;">
<input class="form-control" readonly type="text" data-toggle="city-picker" value="北京市/北京市/海淀区">
</div>
</form>
<h3>定义选择到层级</h3>
<pre class="prettyprint">&lt;div style="position: relative;"&gt;&lt;!-- container --&gt;
&lt;input readonly type="text" data-toggle="city-picker" placeholder="请选择省/市" data-level="province" &gt;
&lt;/div&gt;</pre>
<h5>Demo:</h5>
<form class="form-inline">
<div style="position: relative;">
<input class="form-control" readonly type="text" data-toggle="city-picker" data-level="province"
placeholder="请选择省份">
</div>
</form>
<h3>精简版地址</h3>
<pre class="prettyprint">&lt;div style="position: relative;"&gt;&lt;!-- container --&gt;
&lt;input readonly type="text" data-toggle="city-picker" data-simple="true" &gt;
&lt;/div&gt;</pre>
<h5>Demo:</h5>
<form class="form-inline">
<div style="position: relative;">
<input class="form-control" readonly type="text" data-toggle="city-picker" data-simple="true" placeholder="请选择省份">
</div>
</form>
</div>
<!-- Scripts -->
<script src="http://cdn.bootcss.com/jquery/1.11.3/jquery.js"></script>
<script src="http://cdn.bootcss.com/bootstrap/3.3.6/js/bootstrap.js"></script>
<script src="./city-picker.data.js"></script>
<script src="./city-picker.js"></script>
<script>
$(function () {
$('#city-picker1').citypicker();
});
</script>
</body>
</html>

File diff suppressed because one or more lines are too long

View File

@ -166,6 +166,7 @@
current.preview = current.cal.data('colorpicker').livePreview;
$(document).bind('mouseup', current, upSelector);
$(document).bind('mousemove', current, moveSelector);
$(document).bind('mousedown', current, moveSelector);
},
moveSelector = function (ev) {
change.apply(
@ -186,6 +187,7 @@
fillHexFields(ev.data.cal.data('colorpicker').color, ev.data.cal.get(0));
$(document).unbind('mouseup', upSelector);
$(document).unbind('mousemove', moveSelector);
$(document).unbind('mousedown', moveSelector);
return false;
},
enterSubmit = function (ev) {

844
static/js/lib/others/fastClick.js Executable file
View File

@ -0,0 +1,844 @@
// 移动端点击延迟优化; https://github.com/ftlabs/fastclick
;(function () {
'use strict';
/**
* @preserve FastClick: polyfill to remove click delays on browsers with touch UIs.
*
* @codingstandard ftlabs-jsv2
* @copyright The Financial Times Limited [All Rights Reserved]
* @license MIT License (see LICENSE.txt)
*/
/*jslint browser:true, node:true*/
/*global define, Event, Node*/
/**
* Instantiate fast-clicking listeners on the specified layer.
*
* @constructor
* @param {Element} layer The layer to listen on
* @param {Object} [options={}] The options to override the defaults
*/
function FastClick(layer, options) {
var oldOnClick;
options = options || {};
/**
* Whether a click is currently being tracked.
*
* @type boolean
*/
this.trackingClick = false;
/**
* Timestamp for when click tracking started.
*
* @type number
*/
this.trackingClickStart = 0;
/**
* The element being tracked for a click.
*
* @type EventTarget
*/
this.targetElement = null;
/**
* X-coordinate of touch start event.
*
* @type number
*/
this.touchStartX = 0;
/**
* Y-coordinate of touch start event.
*
* @type number
*/
this.touchStartY = 0;
/**
* ID of the last touch, retrieved from Touch.identifier.
*
* @type number
*/
this.lastTouchIdentifier = 0;
/**
* Touchmove boundary, beyond which a click will be cancelled.
*
* @type number
*/
this.touchBoundary = options.touchBoundary || 10;
/**
* The FastClick layer.
*
* @type Element
*/
this.layer = layer;
/**
* The minimum time between tap(touchstart and touchend) events
*
* @type number
*/
this.tapDelay = options.tapDelay || 200;
/**
* The maximum time for a tap
*
* @type number
*/
this.tapTimeout = options.tapTimeout || 700;
if (FastClick.notNeeded(layer)) {
return;
}
// Some old versions of Android don't have Function.prototype.bind
function bind(method, context) {
return function() { return method.apply(context, arguments); };
}
var methods = ['onMouse', 'onClick', 'onTouchStart', 'onTouchMove', 'onTouchEnd', 'onTouchCancel'];
var context = this;
for (var i = 0, l = methods.length; i < l; i++) {
context[methods[i]] = bind(context[methods[i]], context);
}
// Set up event handlers as required
if (deviceIsAndroid) {
layer.addEventListener('mouseover', this.onMouse, true);
layer.addEventListener('mousedown', this.onMouse, true);
layer.addEventListener('mouseup', this.onMouse, true);
}
layer.addEventListener('click', this.onClick, true);
layer.addEventListener('touchstart', this.onTouchStart, false);
layer.addEventListener('touchmove', this.onTouchMove, false);
layer.addEventListener('touchend', this.onTouchEnd, false);
layer.addEventListener('touchcancel', this.onTouchCancel, false);
// Hack is required for browsers that don't support Event#stopImmediatePropagation (e.g. Android 2)
// which is how FastClick normally stops click events bubbling to callbacks registered on the FastClick
// layer when they are cancelled.
if (!Event.prototype.stopImmediatePropagation) {
layer.removeEventListener = function(type, callback, capture) {
var rmv = Node.prototype.removeEventListener;
if (type === 'click') {
rmv.call(layer, type, callback.hijacked || callback, capture);
} else {
rmv.call(layer, type, callback, capture);
}
};
layer.addEventListener = function(type, callback, capture) {
var adv = Node.prototype.addEventListener;
if (type === 'click') {
adv.call(layer, type, callback.hijacked || (callback.hijacked = function(event) {
if (!event.propagationStopped) {
callback(event);
}
}), capture);
} else {
adv.call(layer, type, callback, capture);
}
};
}
// If a handler is already declared in the element's onclick attribute, it will be fired before
// FastClick's onClick handler. Fix this by pulling out the user-defined handler function and
// adding it as listener.
if (typeof layer.onclick === 'function') {
// Android browser on at least 3.2 requires a new reference to the function in layer.onclick
// - the old one won't work if passed to addEventListener directly.
oldOnClick = layer.onclick;
layer.addEventListener('click', function(event) {
oldOnClick(event);
}, false);
layer.onclick = null;
}
}
/**
* Windows Phone 8.1 fakes user agent string to look like Android and iPhone.
*
* @type boolean
*/
var deviceIsWindowsPhone = navigator.userAgent.indexOf("Windows Phone") >= 0;
/**
* Android requires exceptions.
*
* @type boolean
*/
var deviceIsAndroid = navigator.userAgent.indexOf('Android') > 0 && !deviceIsWindowsPhone;
/**
* iOS requires exceptions.
*
* @type boolean
*/
var deviceIsIOS = /iP(ad|hone|od)/.test(navigator.userAgent) && !deviceIsWindowsPhone;
/**
* iOS 4 requires an exception for select elements.
*
* @type boolean
*/
var deviceIsIOS4 = deviceIsIOS && (/OS 4_\d(_\d)?/).test(navigator.userAgent);
/**
* iOS 6.0-7.* requires the target element to be manually derived
*
* @type boolean
*/
var deviceIsIOSWithBadTarget = deviceIsIOS && (/OS [6-7]_\d/).test(navigator.userAgent);
/**
* BlackBerry requires exceptions.
*
* @type boolean
*/
var deviceIsBlackBerry10 = navigator.userAgent.indexOf('BB10') > 0;
/**
* Determine whether a given element requires a native click.
*
* @param {EventTarget|Element} target Target DOM element
* @returns {boolean} Returns true if the element needs a native click
*/
FastClick.prototype.needsClick = function(target) {
switch (target.nodeName.toLowerCase()) {
// Don't send a synthetic click to disabled inputs (issue #62)
case 'button':
case 'select':
case 'textarea':
if (target.disabled) {
return true;
}
break;
case 'input':
// File inputs need real clicks on iOS 6 due to a browser bug (issue #68)
if ((deviceIsIOS && target.type === 'file') || target.disabled) {
return true;
}
break;
case 'label':
case 'iframe': // iOS8 homescreen apps can prevent events bubbling into frames
case 'video':
return true;
}
return (/\bneedsclick\b/).test(target.className);
};
/**
* Determine whether a given element requires a call to focus to simulate click into element.
*
* @param {EventTarget|Element} target Target DOM element
* @returns {boolean} Returns true if the element requires a call to focus to simulate native click.
*/
FastClick.prototype.needsFocus = function(target) {
switch (target.nodeName.toLowerCase()) {
case 'textarea':
return true;
case 'select':
return !deviceIsAndroid;
case 'input':
switch (target.type) {
case 'button':
case 'checkbox':
case 'file':
case 'image':
case 'radio':
case 'submit':
return false;
}
// No point in attempting to focus disabled inputs
return !target.disabled && !target.readOnly;
default:
return (/\bneedsfocus\b/).test(target.className);
}
};
/**
* Send a click event to the specified element.
*
* @param {EventTarget|Element} targetElement
* @param {Event} event
*/
FastClick.prototype.sendClick = function(targetElement, event) {
var clickEvent, touch;
// On some Android devices activeElement needs to be blurred otherwise the synthetic click will have no effect (#24)
if (document.activeElement && document.activeElement !== targetElement) {
document.activeElement.blur();
}
touch = event.changedTouches[0];
// Synthesise a click event, with an extra attribute so it can be tracked
clickEvent = document.createEvent('MouseEvents');
clickEvent.initMouseEvent(this.determineEventType(targetElement), true, true, window, 1, touch.screenX, touch.screenY, touch.clientX, touch.clientY, false, false, false, false, 0, null);
clickEvent.forwardedTouchEvent = true;
targetElement.dispatchEvent(clickEvent);
};
FastClick.prototype.determineEventType = function(targetElement) {
//Issue #159: Android Chrome Select Box does not open with a synthetic click event
if (deviceIsAndroid && targetElement.tagName.toLowerCase() === 'select') {
return 'mousedown';
}
return 'click';
};
/**
* @param {EventTarget|Element} targetElement
*/
FastClick.prototype.focus = function(targetElement) {
var length;
// Issue #160: on iOS 7, some input elements (e.g. date datetime month) throw a vague TypeError on setSelectionRange. These elements don't have an integer value for the selectionStart and selectionEnd properties, but unfortunately that can't be used for detection because accessing the properties also throws a TypeError. Just check the type instead. Filed as Apple bug #15122724.
if (deviceIsIOS && targetElement.setSelectionRange && targetElement.type.indexOf('date') !== 0 && targetElement.type !== 'time' && targetElement.type !== 'month' && targetElement.type !== 'email') {
length = targetElement.value.length;
targetElement.setSelectionRange(length, length);
} else {
targetElement.focus();
}
};
/**
* Check whether the given target element is a child of a scrollable layer and if so, set a flag on it.
*
* @param {EventTarget|Element} targetElement
*/
FastClick.prototype.updateScrollParent = function(targetElement) {
var scrollParent, parentElement;
scrollParent = targetElement.fastClickScrollParent;
// Attempt to discover whether the target element is contained within a scrollable layer. Re-check if the
// target element was moved to another parent.
if (!scrollParent || !scrollParent.contains(targetElement)) {
parentElement = targetElement;
do {
if (parentElement.scrollHeight > parentElement.offsetHeight) {
scrollParent = parentElement;
targetElement.fastClickScrollParent = parentElement;
break;
}
parentElement = parentElement.parentElement;
} while (parentElement);
}
// Always update the scroll top tracker if possible.
if (scrollParent) {
scrollParent.fastClickLastScrollTop = scrollParent.scrollTop;
}
};
/**
* @param {EventTarget} targetElement
* @returns {Element|EventTarget}
*/
FastClick.prototype.getTargetElementFromEventTarget = function(eventTarget) {
// On some older browsers (notably Safari on iOS 4.1 - see issue #56) the event target may be a text node.
if (eventTarget.nodeType === Node.TEXT_NODE) {
return eventTarget.parentNode;
}
return eventTarget;
};
/**
* On touch start, record the position and scroll offset.
*
* @param {Event} event
* @returns {boolean}
*/
FastClick.prototype.onTouchStart = function(event) {
var targetElement, touch, selection;
// Ignore multiple touches, otherwise pinch-to-zoom is prevented if both fingers are on the FastClick element (issue #111).
if (event.targetTouches.length > 1) {
return true;
}
targetElement = this.getTargetElementFromEventTarget(event.target);
touch = event.targetTouches[0];
if (deviceIsIOS) {
// Only trusted events will deselect text on iOS (issue #49)
selection = window.getSelection();
if (selection.rangeCount && !selection.isCollapsed) {
return true;
}
if (!deviceIsIOS4) {
// Weird things happen on iOS when an alert or confirm dialog is opened from a click event callback (issue #23):
// when the user next taps anywhere else on the page, new touchstart and touchend events are dispatched
// with the same identifier as the touch event that previously triggered the click that triggered the alert.
// Sadly, there is an issue on iOS 4 that causes some normal touch events to have the same identifier as an
// immediately preceeding touch event (issue #52), so this fix is unavailable on that platform.
// Issue 120: touch.identifier is 0 when Chrome dev tools 'Emulate touch events' is set with an iOS device UA string,
// which causes all touch events to be ignored. As this block only applies to iOS, and iOS identifiers are always long,
// random integers, it's safe to to continue if the identifier is 0 here.
if (touch.identifier && touch.identifier === this.lastTouchIdentifier) {
event.preventDefault();
return false;
}
this.lastTouchIdentifier = touch.identifier;
// If the target element is a child of a scrollable layer (using -webkit-overflow-scrolling: touch) and:
// 1) the user does a fling scroll on the scrollable layer
// 2) the user stops the fling scroll with another tap
// then the event.target of the last 'touchend' event will be the element that was under the user's finger
// when the fling scroll was started, causing FastClick to send a click event to that layer - unless a check
// is made to ensure that a parent layer was not scrolled before sending a synthetic click (issue #42).
this.updateScrollParent(targetElement);
}
}
this.trackingClick = true;
this.trackingClickStart = event.timeStamp;
this.targetElement = targetElement;
this.touchStartX = touch.pageX;
this.touchStartY = touch.pageY;
// Prevent phantom clicks on fast double-tap (issue #36)
if ((event.timeStamp - this.lastClickTime) < this.tapDelay) {
event.preventDefault();
}
return true;
};
/**
* Based on a touchmove event object, check whether the touch has moved past a boundary since it started.
*
* @param {Event} event
* @returns {boolean}
*/
FastClick.prototype.touchHasMoved = function(event) {
var touch = event.changedTouches[0], boundary = this.touchBoundary;
if (Math.abs(touch.pageX - this.touchStartX) > boundary || Math.abs(touch.pageY - this.touchStartY) > boundary) {
return true;
}
return false;
};
/**
* Update the last position.
*
* @param {Event} event
* @returns {boolean}
*/
FastClick.prototype.onTouchMove = function(event) {
if (!this.trackingClick) {
return true;
}
// If the touch has moved, cancel the click tracking
if (this.targetElement !== this.getTargetElementFromEventTarget(event.target) || this.touchHasMoved(event)) {
this.trackingClick = false;
this.targetElement = null;
}
return true;
};
/**
* Attempt to find the labelled control for the given label element.
*
* @param {EventTarget|HTMLLabelElement} labelElement
* @returns {Element|null}
*/
FastClick.prototype.findControl = function(labelElement) {
// Fast path for newer browsers supporting the HTML5 control attribute
if (labelElement.control !== undefined) {
return labelElement.control;
}
// All browsers under test that support touch events also support the HTML5 htmlFor attribute
if (labelElement.htmlFor) {
return document.getElementById(labelElement.htmlFor);
}
// If no for attribute exists, attempt to retrieve the first labellable descendant element
// the list of which is defined here: http://www.w3.org/TR/html5/forms.html#category-label
return labelElement.querySelector('button, input:not([type=hidden]), keygen, meter, output, progress, select, textarea');
};
/**
* On touch end, determine whether to send a click event at once.
*
* @param {Event} event
* @returns {boolean}
*/
FastClick.prototype.onTouchEnd = function(event) {
var forElement, trackingClickStart, targetTagName, scrollParent, touch, targetElement = this.targetElement;
if (!this.trackingClick) {
return true;
}
// Prevent phantom clicks on fast double-tap (issue #36)
if ((event.timeStamp - this.lastClickTime) < this.tapDelay) {
this.cancelNextClick = true;
return true;
}
if ((event.timeStamp - this.trackingClickStart) > this.tapTimeout) {
return true;
}
// Reset to prevent wrong click cancel on input (issue #156).
this.cancelNextClick = false;
this.lastClickTime = event.timeStamp;
trackingClickStart = this.trackingClickStart;
this.trackingClick = false;
this.trackingClickStart = 0;
// On some iOS devices, the targetElement supplied with the event is invalid if the layer
// is performing a transition or scroll, and has to be re-detected manually. Note that
// for this to function correctly, it must be called *after* the event target is checked!
// See issue #57; also filed as rdar://13048589 .
if (deviceIsIOSWithBadTarget) {
touch = event.changedTouches[0];
// In certain cases arguments of elementFromPoint can be negative, so prevent setting targetElement to null
targetElement = document.elementFromPoint(touch.pageX - window.pageXOffset, touch.pageY - window.pageYOffset) || targetElement;
targetElement.fastClickScrollParent = this.targetElement.fastClickScrollParent;
}
targetTagName = targetElement.tagName.toLowerCase();
if (targetTagName === 'label') {
forElement = this.findControl(targetElement);
if (forElement) {
this.focus(targetElement);
if (deviceIsAndroid) {
return false;
}
targetElement = forElement;
}
} else if (this.needsFocus(targetElement)) {
// Case 1: If the touch started a while ago (best guess is 100ms based on tests for issue #36) then focus will be triggered anyway. Return early and unset the target element reference so that the subsequent click will be allowed through.
// Case 2: Without this exception for input elements tapped when the document is contained in an iframe, then any inputted text won't be visible even though the value attribute is updated as the user types (issue #37).
if ((event.timeStamp - trackingClickStart) > 100 || (deviceIsIOS && window.top !== window && targetTagName === 'input')) {
this.targetElement = null;
return false;
}
this.focus(targetElement);
this.sendClick(targetElement, event);
// Select elements need the event to go through on iOS 4, otherwise the selector menu won't open.
// Also this breaks opening selects when VoiceOver is active on iOS6, iOS7 (and possibly others)
if (!deviceIsIOS || targetTagName !== 'select') {
this.targetElement = null;
event.preventDefault();
}
return false;
}
if (deviceIsIOS && !deviceIsIOS4) {
// Don't send a synthetic click event if the target element is contained within a parent layer that was scrolled
// and this tap is being used to stop the scrolling (usually initiated by a fling - issue #42).
scrollParent = targetElement.fastClickScrollParent;
if (scrollParent && scrollParent.fastClickLastScrollTop !== scrollParent.scrollTop) {
return true;
}
}
// Prevent the actual click from going though - unless the target node is marked as requiring
// real clicks or if it is in the whitelist in which case only non-programmatic clicks are permitted.
if (!this.needsClick(targetElement)) {
event.preventDefault();
this.sendClick(targetElement, event);
}
return false;
};
/**
* On touch cancel, stop tracking the click.
*
* @returns {void}
*/
FastClick.prototype.onTouchCancel = function() {
this.trackingClick = false;
this.targetElement = null;
};
/**
* Determine mouse events which should be permitted.
*
* @param {Event} event
* @returns {boolean}
*/
FastClick.prototype.onMouse = function(event) {
// If a target element was never set (because a touch event was never fired) allow the event
if (!this.targetElement) {
return true;
}
if (event.forwardedTouchEvent) {
return true;
}
// Programmatically generated events targeting a specific element should be permitted
if (!event.cancelable) {
return true;
}
// Derive and check the target element to see whether the mouse event needs to be permitted;
// unless explicitly enabled, prevent non-touch click events from triggering actions,
// to prevent ghost/doubleclicks.
if (!this.needsClick(this.targetElement) || this.cancelNextClick) {
// Prevent any user-added listeners declared on FastClick element from being fired.
if (event.stopImmediatePropagation) {
event.stopImmediatePropagation();
} else {
// Part of the hack for browsers that don't support Event#stopImmediatePropagation (e.g. Android 2)
event.propagationStopped = true;
}
// Cancel the event
event.stopPropagation();
event.preventDefault();
return false;
}
// If the mouse event is permitted, return true for the action to go through.
return true;
};
/**
* On actual clicks, determine whether this is a touch-generated click, a click action occurring
* naturally after a delay after a touch (which needs to be cancelled to avoid duplication), or
* an actual click which should be permitted.
*
* @param {Event} event
* @returns {boolean}
*/
FastClick.prototype.onClick = function(event) {
var permitted;
// It's possible for another FastClick-like library delivered with third-party code to fire a click event before FastClick does (issue #44). In that case, set the click-tracking flag back to false and return early. This will cause onTouchEnd to return early.
if (this.trackingClick) {
this.targetElement = null;
this.trackingClick = false;
return true;
}
// Very odd behaviour on iOS (issue #18): if a submit element is present inside a form and the user hits enter in the iOS simulator or clicks the Go button on the pop-up OS keyboard the a kind of 'fake' click event will be triggered with the submit-type input element as the target.
if (event.target.type === 'submit' && event.detail === 0) {
return true;
}
permitted = this.onMouse(event);
// Only unset targetElement if the click is not permitted. This will ensure that the check for !targetElement in onMouse fails and the browser's click doesn't go through.
if (!permitted) {
this.targetElement = null;
}
// If clicks are permitted, return true for the action to go through.
return permitted;
};
/**
* Remove all FastClick's event listeners.
*
* @returns {void}
*/
FastClick.prototype.destroy = function() {
var layer = this.layer;
if (deviceIsAndroid) {
layer.removeEventListener('mouseover', this.onMouse, true);
layer.removeEventListener('mousedown', this.onMouse, true);
layer.removeEventListener('mouseup', this.onMouse, true);
}
layer.removeEventListener('click', this.onClick, true);
layer.removeEventListener('touchstart', this.onTouchStart, false);
layer.removeEventListener('touchmove', this.onTouchMove, false);
layer.removeEventListener('touchend', this.onTouchEnd, false);
layer.removeEventListener('touchcancel', this.onTouchCancel, false);
};
/**
* Check whether FastClick is needed.
*
* @param {Element} layer The layer to listen on
*/
FastClick.notNeeded = function(layer) {
var metaViewport;
var chromeVersion;
var blackberryVersion;
var firefoxVersion;
// Devices that don't support touch don't need FastClick
if (typeof window.ontouchstart === 'undefined') {
return true;
}
// Chrome version - zero for other browsers
chromeVersion = +(/Chrome\/([0-9]+)/.exec(navigator.userAgent) || [,0])[1];
if (chromeVersion) {
if (deviceIsAndroid) {
metaViewport = document.querySelector('meta[name=viewport]');
if (metaViewport) {
// Chrome on Android with user-scalable="no" doesn't need FastClick (issue #89)
if (metaViewport.content.indexOf('user-scalable=no') !== -1) {
return true;
}
// Chrome 32 and above with width=device-width or less don't need FastClick
if (chromeVersion > 31 && document.documentElement.scrollWidth <= window.outerWidth) {
return true;
}
}
// Chrome desktop doesn't need FastClick (issue #15)
} else {
return true;
}
}
if (deviceIsBlackBerry10) {
blackberryVersion = navigator.userAgent.match(/Version\/([0-9]*)\.([0-9]*)/);
// BlackBerry 10.3+ does not require Fastclick library.
// https://github.com/ftlabs/fastclick/issues/251
if (blackberryVersion[1] >= 10 && blackberryVersion[2] >= 3) {
metaViewport = document.querySelector('meta[name=viewport]');
if (metaViewport) {
// user-scalable=no eliminates click delay.
if (metaViewport.content.indexOf('user-scalable=no') !== -1) {
return true;
}
// width=device-width (or less than device-width) eliminates click delay.
if (document.documentElement.scrollWidth <= window.outerWidth) {
return true;
}
}
}
}
// IE10 with -ms-touch-action: none or manipulation, which disables double-tap-to-zoom (issue #97)
if (layer.style.msTouchAction === 'none' || layer.style.touchAction === 'manipulation') {
return true;
}
// Firefox version - zero for other browsers
firefoxVersion = +(/Firefox\/([0-9]+)/.exec(navigator.userAgent) || [,0])[1];
if (firefoxVersion >= 27) {
// Firefox 27+ does not have tap delay if the content is not zoomable - https://bugzilla.mozilla.org/show_bug.cgi?id=922896
metaViewport = document.querySelector('meta[name=viewport]');
if (metaViewport && (metaViewport.content.indexOf('user-scalable=no') !== -1 || document.documentElement.scrollWidth <= window.outerWidth)) {
return true;
}
}
// IE11: prefixed -ms-touch-action is no longer supported and it's recomended to use non-prefixed version
// http://msdn.microsoft.com/en-us/library/windows/apps/Hh767313.aspx
if (layer.style.touchAction === 'none' || layer.style.touchAction === 'manipulation') {
return true;
}
return false;
};
/**
* Factory method for creating a FastClick object
*
* @param {Element} layer The layer to listen on
* @param {Object} [options={}] The options to override the defaults
*/
FastClick.attach = function(layer, options) {
return new FastClick(layer, options);
};
if (typeof define === 'function' && typeof define.amd === 'object' && define.amd) {
// AMD. Register as an anonymous module.
define(function() {
return FastClick;
});
} else if (typeof module !== 'undefined' && module.exports) {
module.exports = FastClick.attach;
module.exports.FastClick = FastClick;
} else {
window.FastClick = FastClick;
}
}());

View File

@ -15,7 +15,13 @@ var timeFloat = function(){
var time = (new Date()).valueOf();
return time/1000;
}
var urlEncode = encodeURIComponent;
var urlEncode = function(str){
try {
return encodeURIComponent(str);
} catch (e) {
return str;
}
};
var urlDecode = function(str){
try {
return decodeURIComponent(str);
@ -719,6 +725,7 @@ var pathTools = (function(){
return {
fileSize:fileSize,
strSort:strSort,
strSortChina:strSortChina,
pathThis:pathThis
}
})();
@ -851,9 +858,11 @@ var Tips = (function(){
msg+= "&nbsp;&nbsp; <img src='"+staticPath+"images/common/loading_circle.gif'/>";
var self = _init(true,msg,code);
self.stop(true,true)
try{
self.stop(true,true)
.css({'opacity':'0','top':-self.height()})
.animate({opacity:1,top:0},inTime,0);
}catch(e){};
};
var close = function(msg,code){
if (typeof(msg) == 'object'){
@ -1516,6 +1525,23 @@ var MaskView = (function(){
document.body.removeChild(ifr);
}
}
//将html内容添加到沙盒中不破坏父页面样式及方法
$.iframeHtml = function($parent,content){
var tpl = '<iframe src="about:blank" style="width:100%;height:100%;border:0px;display:block!important;"></iframe>';
$($parent).html(tpl);
var iframeDom = $($parent).find('iframe').get(0);
if (!iframeDom.tagName || "iframe" != iframeDom.tagName.toLowerCase()) {
$($parent).html(content);
return;
}
var dom = iframeDom.contentWindow.document;
try {
dom.open(), dom.write(content), dom.close()
} catch (d) {
$($parent).html(content);
}
}
$.printLink = function(link){
var $iframe = $('#page-print');
if ($iframe.length > 0) {
@ -1542,6 +1568,38 @@ var MaskView = (function(){
}
return false;
}
$.isMobleSafari = function(){
var ua = navigator.userAgent;
// IOS系统;不是Chrome;开头必须为Mozilla;结尾需为Safari/xxx.xx
if (/ OS \d/.test(ua) &&
!~ua.indexOf('CriOS') &&
!ua.indexOf('Mozilla') &&
/Safari\/[\d\.]+$/.test(ua)
) {
return true;
}
return false;
}
var u = navigator.userAgent;
$.browserIS = {
ie:!!(window.ActiveXObject || "ActiveXObject" in window), //ie;ie6~11
ie8:this.ie && parseInt($.browser.version) <=8,//ie8
trident: u.indexOf('Trident') > -1, //IE内核
presto: u.indexOf('Presto') > -1, //opera内核
webKit:u.indexOf('AppleWebKit') > -1, //苹果、谷歌内核
gecko:u.indexOf('Gecko') > -1 && u.indexOf('KHTML') == -1,//火狐内核
mobile: !!u.match(/AppleWebKit.*Mobile.*/), //是否为移动终端
ios: !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/), //ios终端
android: u.indexOf('Android') > -1 || u.indexOf('Adr') > -1, //android终端
iPhone: u.indexOf('iPhone') > -1 , //是否为iPhone
iPad: u.indexOf('iPad') > -1, //是否iPad
webApp: u.indexOf('Safari') == -1, //是否web应该程序没有头部与底部
weixin: u.indexOf('MicroMessenger') > -1, //是否微信
qq: u.match(/\sQQ/i) == " qq" //是否QQ
};
$.supportUploadFolder = function(){
if(isWap()){
@ -1618,6 +1676,16 @@ var MaskView = (function(){
});
return this;
},
offsetWindow:function(){
var info = $(this).get(0).getBoundingClientRect();
return {
top:info.top,
left:info.left,
bottom:$(window).height() - info.top - $(this).outerHeight(),
right: $(window).width() - info.left - $(this).outerWidth(),
}
},
myDbclick:function(callback){
var timeout = 0.5;
@ -1938,6 +2006,103 @@ var MaskView = (function(){
})(jQuery);
/**
* worker运行代码
* https://www.html5rocks.com/zh/tutorials/workers/basics/#toc-usecases
*
* work: function|string 异步执行的代码;必须为函数或者函数的代码;
* worker只支持访问navigator,location,XMLHttpRequest,setTimeout
*
* param: work函数传入的参数;
* callback: function 回调函数
* alias: 对象或数组;work中的依赖通过源码方式注入
* ['trim','core.pathFather','core.pathClear',{'urlEncode':window.urlEncode,'rtrim':0}] //数组时字符串对应window能访问的函数
* {'urlEncode':window.urlEncode,'rtrim':0};// 值为真时则 value为value.toString();
eg:
var fab = function(n){
return n<2?n:arguments.callee(n-1)+arguments.callee(n-2);
}
WorkerRun(fab,20,console.log);
WorkerRun(function(n){
console.log(n);
return core.pathFather(n);
},'/a/b//c/d/e.txt',function(data){
console.log(222,data);
},['trim','rtrim','core.pathFather','core.pathClear']);
*/
var WorkerRun = function(work,param,callback,alias){
if( typeof(Worker) == "undefined" ){
setTimeout(function(){
callback(work(param));
},0);
return;
}
//生成worker内部依赖的代码;
var makeAliasCode = function(obj){
if(!obj) return "";
var source = "";
var set = {};
if( !obj.hasOwnProperty(0) ){//全为对象
obj = [obj];
}
var makeItem = function(key,value){
var property = window;
var keyArr = key.split('.');
if(typeof(value) == 'string'){
value = '"'+value+'"';//支持引入变量
}else if(typeof(value) == 'object'){
value = JSON.stringify(value);
}
for (var i = 0; i < keyArr.length; i++) {
property = property[keyArr[i]];
var objKey = key.split('.').splice(0,i).join('.');
if(objKey && !set[objKey]){
set[objKey] = true;
source += 'var '+objKey+'={};\n';
}
if(i == keyArr.length - 1){
var needVar = key.indexOf('.') == -1?"var ":"";
value = value || property;
source += needVar+key+'='+value.toString()+';\n';
}
}
}
for (var i=0;i<=obj.length;i++) {
var item = obj[i];
if(typeof(item) == 'string'){
makeItem(item);
continue;
}
for (var key in item) {
makeItem(key,item[key]);
}
}
return source;
};
var source = (typeof(work) == 'function') ? work.toString():work;
source = "var workFunction = ("+source+");\n";
source += makeAliasCode(alias);
source += 'onmessage=function(e){postMessage(workFunction(e.data));}';
var blob = new Blob([source],{type:"text/javascript"});
var blobURL = URL.createObjectURL(blob);
var worker = new Worker(blobURL);
worker.onmessage = function(e){
callback(e.data);
};
worker.onerror = function(event) {
console.info(event.filename, event.lineno, event.message,[event,source]);
};
worker.postMessage(param);
worker.close = worker.terminate;
return worker;
}
/**
* FunctionHooks;
@ -2189,6 +2354,23 @@ window.Messenger = (function(){
return Messenger;
})();
var __json = function(obj){
var cache = [];
var result = JSON.stringify(obj, function(key, value) {
if (typeof value === 'object' && value !== null) {
if (cache.indexOf(value) !== -1) {
return;
}
cache.push(value);
}
if (typeof value === 'function') {
return '[function]';
}
return value;
});
cache = null;
return JSON.parse(result);
}
//yyyy-mm-dd H:i:s or yy-mm-dd to timestamp

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1,5 +1,5 @@
/* power by kodexplorer ver 4.35(2018-09-07) [build 1536314955.5225] */
/* power by kodexplorer ver 4.36(2018-09-28) [build 1538149928.4009] */
@import url('./fileIcon.css');
@import url('./common.css');
.frame-main{position:absolute;top:40px;width:100%;bottom:0px;}.frame-main .tools-left{background:#f8f8f8 url("../../../images/common/bg.gif") 0 0px;position:fixed;line-height:30px;padding-left:20px;height:28px;border-bottom:1px solid #ddd;left:0;width:100%;}.frame-main .tools-left a{font-size:1.25em;font-weight:800;text-decoration:none;color:#999;text-shadow:0 0 3px;display:inline-block;padding:2px 6px;margin-top:0;height:20px;line-height:20px;}.frame-main .tools-left a:hover{background:url("../../../images/common/buttons_40.png") 0 0px repeat-x;-webkit-box-shadow:0 2px 8px rgba(0,0,0,0.8);-moz-box-shadow:0 2px 8px rgba(0,0,0,0.8);box-shadow:0 2px 8px rgba(0,0,0,0.8);-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;}.frame-main .frame-left{position:absolute;left:0;top:30px;bottom:0;width:200px;background:#fff;background-attachment:fixed;overflow:auto;}.frame-main .frame-left .ztree{margin-top:0;}.frame-main .frame-left .ztree li.level0{margin-bottom:5px;}.frame-main .frame-resize{width:10px;cursor:col-resize;z-index:100;position:absolute;left:195px;top:0;bottom:0;overflow:hidden;background:url("../../../images/common/resize.png") 0px 50% no-repeat;}.frame-main .frame-resize.active{background:#000;opacity:0.2;filter:alpha(opacity=20);}.frame-main .frame-right{left:200px;right:0;position:absolute;top:0;bottom:0;overflow:auto;}.frame-main .frame-right .frame-right-main .resize-mask{z-index:999;position:absolute;left:0;top:0;bottom:0;right:0;display:none;}.frame-main .frame-right .frame-right-main .frame{height:100%;border-left:1px solid #ddd;overflow:hidden;}
/* ver 4.35(2018-09-07) [build 1536314955.5226] */
/* ver 4.36(2018-09-28) [build 1538149928.4009] */

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1358,70 +1358,192 @@ div.dialog-simple .aui-header{ opacity: 1; filter: alpha(opacity=100);}
div.dialog-simple.movie-player-dialog .aui-title-bar {margin-top:-25px;}
div.dialog-simple .jPlayer-music .top-banner{padding: 15px 15px 55px 15px;}
div.jPlayer-music .top-banner .progress{position: initial;}
div.pathInfo-dialog .aui-title .x-item-file{display:none;}
.file-upload-box{height:360px;padding:5px;margin-right:10px;min-width:280px;overflow:hidden;}
.file-upload-box .topbar-nav{border-bottom:1px solid #ddd;margin-top:6px;}
.file-upload-box .menu{display:block;text-decoration:none;float:left;padding:0px 15px;height:26px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#eeeeee');background:#eee;background-image:-webkit-linear-gradient(top,#fff,#eee);background-image:-moz-linear-gradient(top,#fff,#eee);background-image:-o-linear-gradient(top,#fff,#eee);background-image:-ms-linear-gradient(top,#fff,#eee);background-image:linear-gradient(top,#fff,#eee);-pie-background:linear-gradient(to top,#fff,#eee);font-size:1em;border:1px solid #ccc;text-align:center;line-height:24px;margin-right:5px;margin-bottom:-1px;color:#444;border-radius:4px 4px 0 0;}
.file-upload-box .menu.this{background:#fff;border-bottom:1px solid #fff;}
.file-upload-box .menu:hover{background:#fff;}
.file-upload-box .upload-box{margin-top:10px;}
.file-upload-box .download-btn-group{margin-left:-10px;margin-top:-3px;}
.file-upload-box .download-btn-group .download-start{border-radius:0px;}
.file-upload-box div a.left{margin-left:10px;}
.file-upload-box div a.right{position:absolute;right:5px;}
.file-upload-box span.info{font-size:1em;font-style:italic;padding:0px 0 5px 10px;}
.file-upload-box i{font-size:1em;color:#aaa;padding-left:10px;}
.file-upload-box .list{margin:10px 15px;}
.file-upload-box .list input{margin-left:10px;width:190px;height:22px;line-height:24px;padding:0px 3px;border:1px solid #ddd;background:#fff;outline:none;box-shadow:inset 0 1px 1px rgba(0,0,0,0.08);-webkit-transition:all ease-in-out .168s;-moz-transition:all ease-in-out .168s;-o-transition:all ease-in-out .168s;-ms-transition:all ease-in-out .168s;transition:all ease-in-out .168s;}
.file-upload-box .list input:focus{border-color:#75A1F0;outline:none;box-shadow:0 0 4px #75A1F0;}
.file-upload-box .submit input{float:right;padding:4px 20px;background:#ddd;border:none;margin-right:36px;margin-top:10px;}
.file-upload-box .submit input:hover{background:#bbb;}
.file-upload-box .submit input:active{background:#444;color:#fff;}
.file-upload-box .uploader-content{border:1px solid #ddd;margin:0 10px;font-size:1em;overflow:auto;position:absolute;bottom:10px;right:0px;left:0px;top:124px;}
.file-upload-box #downloader{height:290px;border:1px solid #ddd;overflow:auto;}
.file-upload-box .webuploader-container{position:relative;}
.file-upload-box .webuploader-element-invisible{position:absolute !important;clip:rect(1px 1px 1px 1px);clip:rect(1px,1px,1px,1px);}
.file-upload-box .webuploader-pick{position:relative;display:inline-block;color:#fff;text-align:center;height:27px;line-height:27px;border-radius:3px;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#84c8ff', endColorstr='#6091ff');background:#6091FF;background-image:-webkit-linear-gradient(top,#84C8FF,#6091FF);background-image:-moz-linear-gradient(top,#84C8FF,#6091FF);background-image:-o-linear-gradient(top,#84C8FF,#6091FF);background-image:-ms-linear-gradient(top,#84C8FF,#6091FF);background-image:linear-gradient(top,#84C8FF,#6091FF);-pie-background:linear-gradient(to top,#84C8FF,#6091FF);cursor:pointer;padding:0px 15px;}
.file-upload-box .webuploader-pick-hover{filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#84c8ff', endColorstr='#6091ff');background:#6091FF;background-image:-webkit-linear-gradient(top,#84C8FF,#6091FF);background-image:-moz-linear-gradient(top,#84C8FF,#6091FF);background-image:-o-linear-gradient(top,#84C8FF,#6091FF);background-image:-ms-linear-gradient(top,#84C8FF,#6091FF);background-image:linear-gradient(top,#84C8FF,#6091FF);-pie-background:linear-gradient(to top,#84C8FF,#6091FF);box-shadow:inset 0 1px 1em rgba(0,0,0,0.3);}
.file-upload-box .upload-cert{width:24px;background:#def;height:100%;float:left;cursor:pointer;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#84c8ff', endColorstr='#6091ff');background:#6091FF;background-image:-webkit-linear-gradient(top,#84C8FF,#6091FF);background-image:-moz-linear-gradient(top,#84C8FF,#6091FF);background-image:-o-linear-gradient(top,#84C8FF,#6091FF);background-image:-ms-linear-gradient(top,#84C8FF,#6091FF);background-image:linear-gradient(top,#84C8FF,#6091FF);-pie-background:linear-gradient(to top,#84C8FF,#6091FF);height:27px;line-height:27px;position:relative;z-index:10;padding:0;border:none;margin-left:-5px;border-left:1px solid rgba(0,0,0,0.1);border-top-right-radius:3px;border-bottom-right-radius:3px;}
.file-upload-box .upload-cert .caret{margin-top:-2px;margin-left:-1px;border-top:4px solid #fff;}
.file-upload-box .upload-cert-box .dropdown-menu{right:inherit;top:inherit;margin-top:30px;}
.file-upload-box .upload-cert-box .dropdown-menu:before{right:inherit;left:10px;}
.file-upload-box .upload-cert-box .dropdown-menu:after{right:inherit;left:11px;}
.file-upload-box .upload-cert-box.open.upload-cert,.file-upload-box .upload-cert-box .upload-cert:hover{filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#84c8ff', endColorstr='#6091ff');background:#6091FF;background-image:-webkit-linear-gradient(top,#84C8FF,#6091FF);background-image:-moz-linear-gradient(top,#84C8FF,#6091FF);background-image:-o-linear-gradient(top,#84C8FF,#6091FF);background-image:-ms-linear-gradient(top,#84C8FF,#6091FF);background-image:linear-gradient(top,#84C8FF,#6091FF);-pie-background:linear-gradient(to top,#84C8FF,#6091FF);box-shadow:inset 0 1px 1em rgba(0,0,0,0.3);}
.file-upload-box .webuploader-pick-disable{opacity:0.6;filter:alpha(opacity=60);pointer-events:none;}
.file-upload-box .btns{margin-bottom:10px;font-size:1em;height:28px;}
.file-upload-box .btns .tips{float:right;line-height:30px;}
.file-upload-box .btns #picker{float:left;}
.file-upload-box .upload-box-tips{line-height:34px;color:#888;position:absolute;right:10px;}
.file-upload-box .upload-box-config{box-shadow:inset 0px 1px 6px rgba(0,0,0,0.3);border-radius:2px;margin-bottom:10px;padding:4px;}
.file-upload-box .upload-box-config .upload-check-box{margin-left:10px;}
.file-upload-box .upload-box-config label{margin-left:15px;}
.file-upload-box .upload-box-config label input{margin-right:5px;}
.file-upload-box .uploader-list .item,.file-upload-box .download-list .item{padding:0px;height:35px;overflow:hidden;border-bottom:1px solid #ccc;background:#fefefe;}
.file-upload-box .uploader-list .item .info,.file-upload-box .download-list .item .info{color:#224;line-height:35px;padding:0 5px;z-index:100;position:relative;font-size:1em;}
.file-upload-box .uploader-list .item .info span,.file-upload-box .uploader-list .item .info a,.file-upload-box .download-list .item .info span,.file-upload-box .download-list .item .info a{display:block;float:left;text-overflow:ellipsis;height:30px;}
.file-upload-box .uploader-list .item .info .title,.file-upload-box .download-list .item .info .title{color:#3A87AD;width:120px;overflow:hidden;font-weight:800;}
.file-upload-box .uploader-list .item .info .size,.file-upload-box .download-list .item .info .size{width:50px;text-align:center;color:#3A87AD;}
.file-upload-box .uploader-list .item .info .state,.file-upload-box .download-list .item .info .state{width:70px;text-align:right;}
.file-upload-box .uploader-list .item .info .font-icon,.file-upload-box .download-list .item .info .font-icon{margin-left:12px;font-size:14px;width:14px;line-height:35px;cursor:pointer;color:#bbb;}
.file-upload-box .uploader-list .item .info .font-icon:hover,.file-upload-box .download-list .item .info .font-icon:hover{text-decoration:none;color:#f60;}
.file-upload-box .uploader-list .item .info .icon-ok,.file-upload-box .download-list .item .info .icon-ok{color:#40AA53;}
.file-upload-box .uploader-list .item .info .error,.file-upload-box .download-list .item .info .error{color:#f30;overflow:hidden;}
.file-upload-box .uploader-list .item .progress,.file-upload-box .download-list .item .progress{height:38px;margin:0px;width:100%;float:left;margin-top:-30px;border-radius:0;box-shadow:none;}
.file-upload-box .uploader-list .item .progress-bar,.file-upload-box .download-list .item .progress-bar{background-color:#abd7fb;background-image:linear-gradient(45deg,rgba(255,255,255,0.35) 25%,transparent 25%,transparent 50%,rgba(255,255,255,0.35) 50%,rgba(255,255,255,0.35) 75%,transparent 75%,transparent);}
.file-upload-box .uploader-list .success:hover,.file-upload-box .download-list .success:hover{cursor:pointer;background:#def;border-bottom:1px solid #3A87AD;}
.aui-outer .x-item-file{width: 28px;height: 15px;margin-top: 7px;}
table th, table td, table thead:first-child tr:first-child th {padding:0;border:0px solid #ddd;}
.file-upload-box .uploader-list .item, .file-upload-box .download-list .item{position: relative;}
.file-upload-box .uploader-list .item .progress, .file-upload-box .download-list .item .progress {
height: 38px;margin: 0px;width: 100%;height: 100%;
left: 0px;top: 0px;position: absolute;
.file-upload-box {
height: 385px;padding: 5px;min-width: 365px;overflow: hidden;
}
.file-upload-box .topbar-nav {
border-bottom: 1px solid #ddd;margin-top: 6px;
}
.file-upload-box .menu {
display: block;text-decoration: none;float: left;padding: 0px 15px;height: 26px;filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#eeeeee');background-image: -webkit-linear-gradient(top, #fff, #eee);background-image: -moz-linear-gradient(top, #fff, #eee);background-image: -o-linear-gradient(top, #fff, #eee);background-image: -ms-linear-gradient(top, #fff, #eee);background-image: linear-gradient(top, #fff, #eee);-pie-background: linear-gradient(to top, #fff, #eee);font-size: 1em;border: 1px solid #ccc;text-align: center;line-height: 24px;margin-right: 5px;margin-bottom: -1px;color: #444;border-radius: 4px 4px 0 0;
}
.file-upload-box .menu.this {
background: #fff;border-bottom: 1px solid #fff;
}
.file-upload-box .menu:hover {
background: #fff;
}
.file-upload-box .upload-box {
margin-top: 10px;
}
.file-upload-box .download-btn-group {
margin-left: -10px;margin-top: 0px;position: absolute;
}
.file-upload-box .download-btn-group .btn {
height: 18px;
}
.file-upload-box .download-btn-group .download-start {
border-radius: 0px;
}
.file-upload-box .upload-box-tips .btn.btn-default {
border-radius: 3px;color: #555;
}
.file-upload-box .upload-box-tips .btn-group>.btn:last-child:not(:first-child),.file-upload-box .upload-box-tips .btn-group>.dropdown-toggle:not(:first-child) {
border-bottom-left-radius: 0;border-top-left-radius: 0;
}
.file-upload-box div a.left {
margin-left: 10px;
}
.file-upload-box div a.right {
position: absolute;right: 5px;
}
.file-upload-box span.info {
font-size: 1em;font-style: italic;padding: 0px 0 5px 10px;
}
.file-upload-box i {
font-size: 1em;color: #aaa;padding-left: 10px;
}
.file-upload-box .list {
margin: 10px 15px 10px 0;
}
.file-upload-box .list input {
margin-left: 10px;width: 190px;height: 22px;line-height: 24px;padding: 0px 3px;border: 1px solid #ddd;background: #fff;outline: none;box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.08);-webkit-transition: all ease-in-out .168s;-moz-transition: all ease-in-out .168s;-o-transition: all ease-in-out .168s;-ms-transition: all ease-in-out .168s;transition: all ease-in-out .168s;
}
.file-upload-box .list input:focus {
border-color: #75A1F0;outline: none;box-shadow: 0 0 4px #75A1F0;
}
.file-upload-box .submit input {
float: right;padding: 4px 20px;background: #ddd;border: none;margin-right: 36px;margin-top: 10px;
}
.file-upload-box .submit input:hover {
background: #bbb;
}
.file-upload-box .submit input:active {
background: #444;color: #fff;
}
.file-upload-box .uploader-content {
border: 1px solid #ddd;margin: 0 10px;font-size: 1em;overflow: auto;position: absolute;bottom: 10px;right: 0px;left: 0px;top: 124px;
}
.file-upload-box #downloader {
border: 1px solid #ddd;margin: 0 10px;font-size: 1em;overflow: auto;position: absolute;bottom: 10px;right: 0px;left: 0px;top: 124px;
}
.file-upload-box .webuploader-container {
position: relative;
}
.file-upload-box .webuploader-element-invisible {
position: absolute !important;clip: rect(1px 1px 1px 1px);clip: rect(1px, 1px, 1px, 1px);
}
.file-upload-box .webuploader-pick {
position: relative;display: inline-block;color: #fff;text-align: center;height: 27px;line-height: 27px;border-radius: 3px;filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#84c8ff', endColorstr='#6091ff');background-image: -webkit-linear-gradient(top, #84C8FF, #6091FF);background-image: -moz-linear-gradient(top, #84C8FF, #6091FF);background-image: -o-linear-gradient(top, #84C8FF, #6091FF);background-image: -ms-linear-gradient(top, #84C8FF, #6091FF);background-image: linear-gradient(top, #84C8FF, #6091FF);-pie-background: linear-gradient(to top, #84C8FF, #6091FF);cursor: pointer;padding: 0px 15px;
}
.file-upload-box .webuploader-pick-hover {
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#84c8ff', endColorstr='#6091ff');background-image: -webkit-linear-gradient(top, #84C8FF, #6091FF);background-image: -moz-linear-gradient(top, #84C8FF, #6091FF);background-image: -o-linear-gradient(top, #84C8FF, #6091FF);background-image: -ms-linear-gradient(top, #84C8FF, #6091FF);background-image: linear-gradient(top, #84C8FF, #6091FF);-pie-background: linear-gradient(to top, #84C8FF, #6091FF);box-shadow: inset 0 1px 1em rgba(0, 0, 0, 0.3);
}
.file-upload-box .upload-cert {
width: 24px;background: #def;height: 100%;float: left;cursor: pointer;filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#84c8ff', endColorstr='#6091ff');background-image: -webkit-linear-gradient(top, #84C8FF, #6091FF);background-image: -moz-linear-gradient(top, #84C8FF, #6091FF);background-image: -o-linear-gradient(top, #84C8FF, #6091FF);background-image: -ms-linear-gradient(top, #84C8FF, #6091FF);background-image: linear-gradient(top, #84C8FF, #6091FF);-pie-background: linear-gradient(to top, #84C8FF, #6091FF);height: 27px;line-height: 27px;position: relative;z-index: 10;padding: 0;border: none;margin-left: -5px;border-left: 1px solid rgba(0, 0, 0, 0.1);border-top-right-radius: 3px;border-bottom-right-radius: 3px;
}
.file-upload-box .upload-cert .caret {
margin-top: -2px;margin-left: -1px;border-top: 4px solid #fff;
}
.file-upload-box .upload-cert-box .dropdown-menu {
right: inherit;top: inherit;margin-top: 30px;
}
.file-upload-box .upload-cert-box .dropdown-menu:before {
right: inherit;left: 10px;
}
.file-upload-box .upload-cert-box .dropdown-menu:after {
right: inherit;left: 11px;
}
.file-upload-box .upload-cert-box.open.upload-cert,.file-upload-box .upload-cert-box .upload-cert:hover {
filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#84c8ff', endColorstr='#6091ff');background-image: -webkit-linear-gradient(top, #84C8FF, #6091FF);background-image: -moz-linear-gradient(top, #84C8FF, #6091FF);background-image: -o-linear-gradient(top, #84C8FF, #6091FF);background-image: -ms-linear-gradient(top, #84C8FF, #6091FF);background-image: linear-gradient(top, #84C8FF, #6091FF);-pie-background: linear-gradient(to top, #84C8FF, #6091FF);box-shadow: inset 0 1px 1em rgba(0, 0, 0, 0.3);
}
.file-upload-box .webuploader-pick-disable {
opacity: 0.6;filter: alpha(opacity=60);pointer-events: none;
}
.file-upload-box .btns {
margin-bottom: 10px;font-size: 1em;height: 28px;
}
.file-upload-box .btns .tips {
float: right;line-height: 30px;
}
.file-upload-box .btns #picker {
float: left;
}
.file-upload-box .upload-box-tips {
line-height: 34px;color: #888;position: absolute;right: 10px;
}
.file-upload-box .upload-box-config {
box-shadow: inset 0px 1px 6px rgba(0, 0, 0, 0.3);border-radius: 2px;margin-bottom: 10px;padding: 4px;
}
.file-upload-box .upload-box-config .upload-check-box {
margin-left: 10px;
}
.file-upload-box .upload-box-config label {
margin-left: 15px;
}
.file-upload-box .upload-box-config label input {
margin-right: 5px;
}
.file-upload-box .uploader-list .item,.file-upload-box .download-list .item {
padding: 0px;height: 35px;overflow: hidden;position: relative;border-bottom: 1px solid #ccc;background: #fefefe;
}
.file-upload-box .uploader-list .item .info,.file-upload-box .download-list .item .info {
color: #224;line-height: 35px;padding: 0 5px;z-index: 100;position: relative;font-size: 1em;
}
.file-upload-box .uploader-list .item .info span,.file-upload-box .uploader-list .item .info a,.file-upload-box .download-list .item .info span,.file-upload-box .download-list .item .info a {
float: left;height: 30px;display: block;overflow: hidden;text-overflow: ellipsis;white-space: nowrap;
}
.file-upload-box .uploader-list .item .info .title,.file-upload-box .download-list .item .info .title {
color: #3A87AD;width: 160px;width: 50%;font-weight: 800;
}
.file-upload-box .uploader-list .item .info .size,.file-upload-box .download-list .item .info .size {
width: 45px;text-align: center;color: #3A87AD;font-size: 12px;
}
.file-upload-box .uploader-list .item .info .state,.file-upload-box .download-list .item .info .state {
width: 100px;width: 23%;text-align: right;font-size: 12px;
}
.file-upload-box .uploader-list .item .info .font-icon,.file-upload-box .download-list .item .info .font-icon {
margin-left: 12px;font-size: 20px;width: 20px;line-height: 35px;cursor: pointer;color: #bbb;position: absolute;right: 5px;
}
.file-upload-box .uploader-list .item .info .font-icon:hover,.file-upload-box .download-list .item .info .font-icon:hover {
text-decoration: none;color: #f60;
}
.file-upload-box .uploader-list .item .info .icon-ok,.file-upload-box .download-list .item .info .icon-ok {
color: #40AA53;
}
.file-upload-box .uploader-list .item .info .error,.file-upload-box .download-list .item .info .error {
color: #f30;
}
.file-upload-box .uploader-list .item .info .upload-retry,.file-upload-box .download-list .item .info .upload-retry {
color: #03A9F4;cursor: pointer;padding: 0px 4px;display: none;
}
.file-upload-box .uploader-list .item .info .upload-retry:hover,.file-upload-box .download-list .item .info .upload-retry:hover {
color: #2196F3;border-bottom: 1px solid #2196F3;
}
.file-upload-box .uploader-list .item .info .upload-retry:active,.file-upload-box .download-list .item .info .upload-retry:active {
color: #224;
}
.file-upload-box .uploader-list .item.error .info .upload-retry,.file-upload-box .download-list .item.error .info .upload-retry {
display: block;
}
.file-upload-box .uploader-list .item.success,.file-upload-box .download-list .item.success {
background: #eaf8ff;
}
.file-upload-box .uploader-list .item.error,.file-upload-box .download-list .item.error {
background: #ffe8e6;
}
.file-upload-box .uploader-list .item .progress,.file-upload-box .download-list .item .progress {
height: 38px;margin: 0px;width: 100%;border-radius: 0;box-shadow: none;position: absolute;top: 0;
}
.file-upload-box .uploader-list .item .progress-bar,.file-upload-box .download-list .item .progress-bar {
background-color: #adf;background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.35) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.35) 50%, rgba(255, 255, 255, 0.35) 75%, transparent 75%, transparent);filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ddeeff', endColorstr='#88ccff', GradientType=1);BACKGROUND-REPEAT: repeat-x;
}
.file-upload-box .uploader-list .success:hover,.file-upload-box .download-list .success:hover {
cursor: pointer;background: #def;border-bottom: 1px solid #3A87AD;
}
/*兼容调整*/
.file-upload-box{height:300px;padding:0px;min-width:240px;}
.file-upload-box .uploader-content{top:85px;}