Diff
checker
テキスト
テキスト
画像
ドキュメント
Excel
フォルダ
Legal
Enterprise
デスクトップ
料金
ログイン
Diffchecker デスクトップのダウンロード
テキスト比較
2 つのテキスト ファイルの違いを見つける
ツール
履歴
ライブエディター
未変更行を折りたたむ
折り返しなし
レイアウト
分割
統合
比較精度
スマート
単語
文字
シンタックスハイライト
構文を選択
無視
テキスト変換
最初の差分へ移動
入力を編集
Diffchecker Desktop
Diffcheckerを実行する最も安全な方法。Diffchecker Desktopアプリを入手:あなたの差分はコンピューターから出ることはありません!
Desktopを入手
Compare v6.8.7 vs v.6.8.12
作成日
5 年前
差分は期限切れになりません
クリア
エクスポート
共有
説明
0 削除
行
合計
削除
文字
合計
削除
この機能を引き続き使用するには、アップグレードしてください
Diff
checker
Pro
価格を見る
516 行
すべてコピー
0 追加
行
合計
追加
文字
合計
追加
この機能を引き続き使用するには、アップグレードしてください
Diff
checker
Pro
価格を見る
516 行
すべてコピー
$(function(){
$(function(){
$.fn.extend({
$.fn.extend({
fixedThead:function(options){
fixedThead:function(options){
var _that = $(this);
var _that = $(this);
console.log(_that);
console.log(_that);
var option = {
var option = {
height:400,
height:400,
shadow:true,
shadow:true,
resize:true
resize:true
};
};
options = $.extend(option,options);
options = $.extend(option,options);
if($(this).find('table').length === 0){
if($(this).find('table').length === 0){
return false;
return false;
}
}
var _height = $(this)[0].style.height,_table_config = _height.match(/([0-9]+)([%\w]+)/);
var _height = $(this)[0].style.height,_table_config = _height.match(/([0-9]+)([%\w]+)/);
if(_table_config === null){
if(_table_config === null){
_table_config = [null,options.height,'px'];
_table_config = [null,options.height,'px'];
}else{
}else{
$(this).css({
$(this).css({
'boxSizing': 'content-box',
'boxSizing': 'content-box',
'paddingBottom':$(this).find('thead').height()
'paddingBottom':$(this).find('thead').height()
});
});
}
}
$(this).css({'position':'relative'});
$(this).css({'position':'relative'});
var _thead = $(this).find('thead')[0].outerHTML,
var _thead = $(this).find('thead')[0].outerHTML,
_tbody = $(this).find('tbody')[0].outerHTML,
_tbody = $(this).find('tbody')[0].outerHTML,
_thead_div = $('<div class="thead_div"><table class="table table-hover mb0"></table></div>'),
_thead_div = $('<div class="thead_div"><table class="table table-hover mb0"></table></div>'),
_shadow_top = $('<div class="tbody_shadow_top"></div>'),
_shadow_top = $('<div class="tbody_shadow_top"></div>'),
_tbody_div = $('<div class="tbody_div" style="height:'+ _table_config[1] + _table_config[2] +';"><table class="table table-hover mb0" style="margin-top:-'+ $(this).find('thead').height() +'px"></table></div>'),
_tbody_div = $('<div class="tbody_div" style="height:'+ _table_config[1] + _table_config[2] +';"><table class="table table-hover mb0" style="margin-top:-'+ $(this).find('thead').height() +'px"></table></div>'),
_shadow_bottom = $('<div class="tbody_shadow_bottom"></div>');
_shadow_bottom = $('<div class="tbody_shadow_bottom"></div>');
_thead_div.find('table').append(_thead);
_thead_div.find('table').append(_thead);
_tbody_div.find('table').append(_thead);
_tbody_div.find('table').append(_thead);
_tbody_div.find('table').append(_tbody);
_tbody_div.find('table').append(_tbody);
$(this).html('');
$(this).html('');
$(this).append(_thead_div);
$(this).append(_thead_div);
$(this).append(_shadow_top);
$(this).append(_shadow_top);
$(this).append(_tbody_div);
$(this).append(_tbody_div);
$(this).append(_shadow_bottom);
$(this).append(_shadow_bottom);
var _table_width = _that.find('.thead_div table')[0].offsetWidth,
var _table_width = _that.find('.thead_div table')[0].offsetWidth,
_body_width = _that.find('.tbody_div table')[0].offsetWidth,
_body_width = _that.find('.tbody_div table')[0].offsetWidth,
_length = _that.find('tbody tr:eq(0)>td').length;
_length = _that.find('tbody tr:eq(0)>td').length;
$(this).find('tbody tr:eq(0)>td').each(function(index,item){
$(this).find('tbody tr:eq(0)>td').each(function(index,item){
var _item = _that.find('thead tr:eq(0)>th').eq(index);
var _item = _that.find('thead tr:eq(0)>th').eq(index);
if(index === (_length-1)){
if(index === (_length-1)){
_item.attr('width',$(item)[0].clientWidth + (_table_width - _body_width));
_item.attr('width',$(item)[0].clientWidth + (_table_width - _body_width));
}else{
}else{
_item.attr('width',$(item)[0].offsetWidth);
_item.attr('width',$(item)[0].offsetWidth);
}
}
});
});
if(options.resize){
if(options.resize){
$(window).resize(function(){
$(window).resize(function(){
var _table_width = _that.find('.thead_div table')[0].offsetWidth,
var _table_width = _that.find('.thead_div table')[0].offsetWidth,
_body_width = _that.find('.tbody_div table')[0].offsetWidth,
_body_width = _that.find('.tbody_div table')[0].offsetWidth,
_length = _that.find('tbody tr:eq(0)>td').length;
_length = _that.find('tbody tr:eq(0)>td').length;
_that.find('tbody tr:eq(0)>td').each(function(index,item){
_that.find('tbody tr:eq(0)>td').each(function(index,item){
var _item = _that.find('thead tr:eq(0)>th').eq(index);
var _item = _that.find('thead tr:eq(0)>th').eq(index);
if(index === (_length-1)){
if(index === (_length-1)){
_item.attr('width',$(item)[0].clientWidth + (_table_width - _body_width));
_item.attr('width',$(item)[0].clientWidth + (_table_width - _body_width));
}else{
}else{
_item.attr('width',$(item)[0].offsetWidth);
_item.attr('width',$(item)[0].offsetWidth);
}
}
});
});
});
});
}
}
if(options.shadow){
if(options.shadow){
var table_body = $(this).find('.tbody_div')[0];
var table_body = $(this).find('.tbody_div')[0];
if(_table_config[1] >= table_body.scrollHeight){
if(_table_config[1] >= table_body.scrollHeight){
$(this).find('.tbody_shadow_top').hide();
$(this).find('.tbody_shadow_top').hide();
$(this).find('.tbody_shadow_bottom').hide();
$(this).find('.tbody_shadow_bottom').hide();
}else{
}else{
$(this).find('.tbody_shadow_top').hide();
$(this).find('.tbody_shadow_top').hide();
$(this).find('.tbody_shadow_bottom').show();
$(this).find('.tbody_shadow_bottom').show();
}
}
$(this).find('.tbody_div').scroll(function(e){
$(this).find('.tbody_div').scroll(function(e){
var _scrollTop = $(this)[0].scrollTop,
var _scrollTop = $(this)[0].scrollTop,
_scrollHeight = $(this)[0].scrollHeight,
_scrollHeight = $(this)[0].scrollHeight,
_clientHeight = $(this)[0].clientHeight,
_clientHeight = $(this)[0].clientHeight,
_shadow_top = _that.find('.tbody_shadow_top'),
_shadow_top = _that.find('.tbody_shadow_top'),
_shadow_bottom = _that.find('.tbody_shadow_bottom');
_shadow_bottom = _that.find('.tbody_shadow_bottom');
if(_scrollTop == 0){
if(_scrollTop == 0){
_shadow_top.hide();
_shadow_top.hide();
_shadow_bottom.show();
_shadow_bottom.show();
}else if(_scrollTop > 0 && _scrollTop < (_scrollHeight - _clientHeight)){
}else if(_scrollTop > 0 && _scrollTop < (_scrollHeight - _clientHeight)){
_shadow_top.show();
_shadow_top.show();
_shadow_bottom.show();
_shadow_bottom.show();
}else if(_scrollTop == (_scrollHeight - _clientHeight)){
}else if(_scrollTop == (_scrollHeight - _clientHeight)){
_shadow_top.show();
_shadow_top.show();
_shadow_bottom.hide();
_shadow_bottom.hide();
}
}
})
})
}
}
}
}
});
});
}(jQuery))
}(jQuery))
$(document).ready(function() {
$(document).ready(function() {
$(".sub-menu a.sub-menu-a").click(function() {
$(".sub-menu a.sub-menu-a").click(function() {
$(this).next(".sub").slideToggle("slow").siblings(".sub:visible").slideUp("slow");
$(this).next(".sub").slideToggle("slow").siblings(".sub:visible").slideUp("slow");
});
});
});
});
var aceEditor = {
var aceEditor = {
layer_view: '',
layer_view: '',
aceConfig:{}, //ace配置参数
aceConfig:{}, //ace配置参数
editor: null,
editor: null,
supportedModes: {
supportedModes: {
Apache_Conf: ["^htaccess|^htgroups|^htpasswd|^conf|htaccess|htgroups|htpasswd"],
Apache_Conf: ["^htaccess|^htgroups|^htpasswd|^conf|htaccess|htgroups|htpasswd"],
BatchFile: ["bat|cmd"],
BatchFile: ["bat|cmd"],
C_Cpp: ["cpp|c|cc|cxx|h|hh|hpp|ino"],
C_Cpp: ["cpp|c|cc|cxx|h|hh|hpp|ino"],
CSharp: ["cs"],
CSharp: ["cs"],
CSS: ["css"],
CSS: ["css"],
Dockerfile: ["^Dockerfile"],
Dockerfile: ["^Dockerfile"],
golang: ["go"],
golang: ["go"],
HTML: ["html|htm|xhtml|vue|we|wpy"],
HTML: ["html|htm|xhtml|vue|we|wpy"],
Java: ["java"],
Java: ["java"],
JavaScript: ["js|jsm|jsx"],
JavaScript: ["js|jsm|jsx"],
'JSON': ["json"],
'JSON': ["json"],
JSP: ["jsp"],
JSP: ["jsp"],
LESS: ["less"],
LESS: ["less"],
Lua: ["lua"],
Lua: ["lua"],
Makefile: ["^Makefile|^GNUmakefile|^makefile|^OCamlMakefile|make"],
Makefile: ["^Makefile|^GNUmakefile|^makefile|^OCamlMakefile|make"],
Markdown: ["md|markdown"],
Markdown: ["md|markdown"],
MySQL: ["mysql"],
MySQL: ["mysql"],
Nginx: ["nginx|conf"],
Nginx: ["nginx|conf"],
INI: ["ini|conf|cfg|prefs"],
INI: ["ini|conf|cfg|prefs"],
ObjectiveC: ["m|mm"],
ObjectiveC: ["m|mm"],
Perl: ["pl|pm"],
Perl: ["pl|pm"],
Perl6: ["p6|pl6|pm6"],
Perl6: ["p6|pl6|pm6"],
pgSQL: ["pgsql"],
pgSQL: ["pgsql"],
PHP_Laravel_blade: ["blade.php"],
PHP_Laravel_blade: ["blade.php"],
PHP: ["php|inc|phtml|shtml|php3|php4|php5|phps|phpt|aw|ctp|module"],
PHP: ["php|inc|phtml|shtml|php3|php4|php5|phps|phpt|aw|ctp|module"],
Powershell: ["ps1"],
Powershell: ["ps1"],
Python: ["py"],
Python: ["py"],
R: ["r"],
R: ["r"],
Ruby: ["rb|ru|gemspec|rake|^Guardfile|^Rakefile|^Gemfile"],
Ruby: ["rb|ru|gemspec|rake|^Guardfile|^Rakefile|^Gemfile"],
Rust: ["rs"],
Rust: ["rs"],
SASS: ["sass"],
SASS: ["sass"],
SCSS: ["scss"],
SCSS: ["scss"],
SH: ["sh|bash|^.bashrc"],
SH: ["sh|bash|^.bashrc"],
SQL: ["sql"],
SQL: ["sql"],
SQLServer: ["sqlserver"],
SQLServer: ["sqlserver"],
Swift: ["swift"],
Swift: ["swift"],
Text: ["txt"],
Text: ["txt"],
Typescript: ["ts|typescript|str"],
Typescript: ["ts|typescript|str"],
VBScript: ["vbs|vb"],
VBScript: ["vbs|vb"],
Verilog: ["v|vh|sv|svh"],
Verilog: ["v|vh|sv|svh"],
XML: ["xml|rdf|rss|wsdl|xslt|atom|mathml|mml|xul|xbl|xaml"],
XML: ["xml|rdf|rss|wsdl|xslt|atom|mathml|mml|xul|xbl|xaml"],
YAML: ["yaml|yml"],
YAML: ["yaml|yml"],
Compress: ['tar|zip|7z|rar|gz|arj|z'],
Compress: ['tar|zip|7z|rar|gz|arj|z'],
images: ['icon|jpg|jpeg|png|bmp|gif|tif|emf']
images: ['icon|jpg|jpeg|png|bmp|gif|tif|emf']
},
},
nameOverrides: {
nameOverrides: {
ObjectiveC: "Objective-C",
ObjectiveC: "Objective-C",
CSharp: "C#",
CSharp: "C#",
golang: "Go",
golang: "Go",
C_Cpp: "C and C++",
C_Cpp: "C and C++",
PHP_Laravel_blade: "PHP (Blade Template)",
PHP_Laravel_blade: "PHP (Blade Template)",
Perl6: "Perl 6",
Perl6: "Perl 6",
},
},
pathAarry: [],
pathAarry: [],
encodingList: ['ASCII', 'UTF-8', 'GBK', 'GB2312', 'BIG5'],
encodingList: ['ASCII', 'UTF-8', 'GBK', 'GB2312', 'BIG5'],
themeList: [
themeList: [
'chrome',
'chrome',
'monokai'
'monokai'
],
],
fontSize: '13px',
fontSize: '13px',
editorTheme: 'monokai', // 编辑器主题
editorTheme: 'monokai', // 编辑器主题
editorLength: 0,
editorLength: 0,
isAceView: true,
isAceView: true,
ace_active: '',
ace_active: '',
is_resizing: false,
is_resizing: false,
menu_path:'', //当前文件目录根地址
menu_path:'', //当前文件目录根地址
refresh_config:{
refresh_config:{
el:{}, // 需要重新获取的元素,为DOM对象
el:{}, // 需要重新获取的元素,为DOM对象
path:'',// 需要获取的路径文件信息
path:'',// 需要获取的路径文件信息
group:1,// 当前列表层级,用来css固定结构
group:1,// 当前列表层级,用来css固定结构
is_empty:true
is_empty:true
}, //刷新配置参数
}, //刷新配置参数
// 事件编辑器-方法,事件绑定
// 事件编辑器-方法,事件绑定
eventEditor: function() {
eventEditor: function() {
var _this = this,_icon = '<span class="icon"><i class="glyphicon glyphicon-ok" aria-hidden="true"></i></span>';
var _this = this,_icon = '<span class="icon"><i class="glyphicon glyphicon-ok" aria-hidden="true"></i></span>';
$(window).resize(function(){
$(window).resize(function(){
if(_this.ace_active != undefined) _this.setEditorView()
if(_this.ace_active != undefined) _this.setEditorView()
if( $('.aceEditors .layui-layer-maxmin').length >0){
if( $('.aceEditors .layui-layer-maxmin').length >0){
$('.aceEditors').css({
$('.aceEditors').css({
'top':0,
'top':0,
'left':0,
'left':0,
'width':$(this)[0].innerWidth,
'width':$(this)[0].innerWidth,
'height':$(this)[0].innerHeight
'height':$(this)[0].innerHeight
});
});
}
}
})
})
$(document).click(function(e){
$(document).click(function(e){
$('.ace_toolbar_menu').hide();
$('.ace_toolbar_menu').hide();
$('.ace_conter_editor .ace_editors').css('fontSize', _this.aceConfig.aceEditor.fontSize + 'px');
$('.ace_conter_editor .ace_editors').css('fontSize', _this.aceConfig.aceEditor.fontSize + 'px');
$('.ace_toolbar_menu .menu-tabs,.ace_toolbar_menu .menu-encoding,.ace_toolbar_menu .menu-files').hide();
$('.ace_toolbar_menu .menu-tabs,.ace_toolbar_menu .menu-encoding,.ace_toolbar_menu .menu-files').hide();
});
});
$('.ace_editor_main').on('click',function(){
$('.ace_editor_main').on('click',function(){
$('.ace_toolbar_menu').hide();
$('.ace_toolbar_menu').hide();
});
});
$('.ace_toolbar_menu').click(function(e){
$('.ace_toolbar_menu').click(function(e){
e.stopPropagation();
e.stopPropagation();
e.preventDefault();
e.preventDefault();
});
});
// 显示工具条
// 显示工具条
$('.ace_header .pull-down').click(function(){
$('.ace_header .pull-down').click(function(){
if($(this).find('i').hasClass('glyphicon-menu-down')){
if($(this).find('i').hasClass('glyphicon-menu-down')){
$('.ace_header').css({'top':'-35px'});
$('.ace_header').css({'top':'-35px'});
$('.ace_overall').css({'top':'0'});
$('.ace_overall').css({'top':'0'});
$(this).css({'top':'35px','height':'40px','line-height':'40px'});
$(this).css({'top':'35px','height':'40px','line-height':'40px'});
$(this).find('i').addClass('glyphicon-menu-up').removeClass('glyphicon-menu-down');
$(this).find('i').addClass('glyphicon-menu-up').removeClass('glyphicon-menu-down');
}else{
}else{
$('.ace_header').css({'top':'0'});
$('.ace_header').css({'top':'0'});
$('.ace_overall').css({'top':'35px'});
$('.ace_overall').css({'top':'35px'});
$(this).removeAttr('style');
$(this).removeAttr('style');
$(this).find('i').addClass('glyphicon-menu-down').removeClass('glyphicon-menu-up');
$(this).find('i').addClass('glyphicon-menu-down').removeClass('glyphicon-menu-up');
}
}
_this.setEditorView();
_this.setEditorView();
});
});
// 切换TAB视图
// 切换TAB视图
$('.ace_conter_menu').on('click', '.item', function (e) {
$('.ace_conter_menu').on('click', '.item', function (e) {
var _id = $(this).attr('data-id'),_item = _this.editor['ace_editor_' + _id];
var _id = $(this).attr('data-id'),_item = _this.editor['ace_editor_' + _id];
$('.item_tab_'+ _id).addClass('active').siblings().removeClass('active');
$('.item_tab_'+ _id).addClass('active').siblings().removeClass('active');
$('#ace_editor_'+ _id).addClass('active').siblings().removeClass('active');
$('#ace_editor_'+ _id).addClass('active').siblings().removeClass('active');
_this.ace_active = _id;
_this.ace_active = _id;
_this.currentStatusBar(_id);
_this.currentStatusBar(_id);
_this.is_file_history(_item);
_this.is_file_history(_item);
});
});
// 移上TAB按钮变化,仅文件被修改后
// 移上TAB按钮变化,仅文件被修改后
$('.ace_conter_menu').on('mouseover', '.item .icon-tool', function () {
$('.ace_conter_menu').on('mouseover', '.item .icon-tool', function () {
var type = $(this).attr('data-file-state');
var type = $(this).attr('data-file-state');
if (type != '0') {
if (type != '0') {
$(this).removeClass('glyphicon-exclamation-sign').addClass('glyphicon-remove');
$(this).removeClass('glyphicon-exclamation-sign').addClass('glyphicon-remove');
}
}
});
});
// 移出tab按钮变化,仅文件被修改后
// 移出tab按钮变化,仅文件被修改后
$('.ace_conter_menu').on('mouseout', '.item .icon-tool', function () {
$('.ace_conter_menu').on('mouseout', '.item .icon-tool', function () {
var type = $(this).attr('data-file-state');
var type = $(this).attr('data-file-state');
if (type != '0') {
if (type != '0') {
$(this).removeClass('glyphicon-remove').addClass('glyphicon-exclamation-sign');
$(this).removeClass('glyphicon-remove').addClass('glyphicon-exclamation-sign');
}
}
});
});
// 关闭编辑视图
// 关闭编辑视图
$('.ace_conter_menu').on('click', '.item .icon-tool', function(e) {
$('.ace_conter_menu').on('click', '.item .icon-tool', function(e) {
var file_type = $(this).attr('data-file-state');
var file_type = $(this).attr('data-file-state');
var file_title = $(this).attr('data-title');
var file_title = $(this).attr('data-title');
var _path = $(this).parent().parent().attr('title');
var _path = $(this).parent().parent().attr('title');
var _id = $(this).parent().parent().attr('data-id');
var _id = $(this).parent().parent().attr('data-id');
switch (file_type) {
switch (file_type) {
// 直接关闭
// 直接关闭
case '0':
case '0':
_this.removeEditor(_id);
_this.removeEditor(_id);
break;
break;
// 未保存
// 未保存
case '1':
case '1':
var loadT = layer.open({
var loadT = layer.open({
type: 1,
type: 1,
area: ['400px', '180px'],
area: ['400px', '180px'],
title: 'Tips',
title: 'Tips',
content: '<div class="ace-clear-form">\
content: '<div class="ace-clear-form">\
<div class="clear-icon"></div>\
<div class="clear-icon"></div>\
<div class="clear-title">Do you want to save changes to  <span class="size_ellipsis" style="max-width:150px;vertical-align: top;" title="' + file_title + '">' + file_title + '</span> ?</div>\
<div class="clear-title">Do you want to save changes to  <span class="size_ellipsis" style="max-width:150px;vertical-align: top;" title="' + file_title + '">' + file_title + '</span> ?</div>\
<div class="clear-tips">If you don\'t save, the changes will be lost!</div>\
<div class="clear-tips">If you don\'t save, the changes will be lost!</div>\
<div class="ace-clear-btn" style="">\
<div class="ace-clear-btn" style="">\
<button type="button" class="btn btn-sm btn-default" style="float:left" data-type="2">Dont save</button>\
<button type="button" class="btn btn-sm btn-default" style="float:left" data-type="2">Dont save</button>\
<button type="button" class="btn btn-sm btn-default" style="margin-right:10px;" data-type="1">Cancel</button>\
<button type="button" class="btn btn-sm btn-default" style="margin-right:10px;" data-type="1">Cancel</button>\
<button type="button" class="btn btn-sm btn-success" data-type="0">Save</button>\
<button type="button" class="btn btn-sm btn-success" data-type="0">Save</button>\
</div>\
</div>\
</div>',
</div>',
success: function(layers, index) {
success: function(layers, index) {
$('.ace-clear-btn .btn').click(function() {
$('.ace-clear-btn .btn').click(function() {
var _type = $(this).attr('data-type'),
var _type = $(this).attr('data-type'),
editor_item = _this.editor['ace_editor_' + _id];
editor_item = _this.editor['ace_editor_' + _id];
switch (_type) {
switch (_type) {
case '0': //保存文件
case '0': //保存文件
_this.saveFileBody({
_this.saveFileBody({
path: _path,
path: _path,
data: editor_item.ace.getValue(),
data: editor_item.ace.getValue(),
encoding: editor_item.encoding
encoding: editor_item.encoding
}, function(res) {
}, function(res) {
layer.close(index);
layer.close(index);
_this.removeEditor(editor_item.id);
_this.removeEditor(editor_item.id);
layer.msg(res.msg, { icon: 1 });
layer.msg(res.msg, { icon: 1 });
editor_item.fileType = 0;
editor_item.fileType = 0;
$('.item_tab_' + editor_item.id + ' .icon-tool').attr('data-file-state', '0').removeClass('glyphicon-exclamation-sign').addClass('glyphicon-remove');
$('.item_tab_' + editor_item.id + ' .icon-tool').attr('data-file-state', '0').removeClass('glyphicon-exclamation-sign').addClass('glyphicon-remove');
});
});
break;
break;
case '1': //关闭视图
case '1': //关闭视图
layer.close(index);
layer.close(index);
break;
break;
case '2': //取消保存
case '2': //取消保存
_this.removeEditor(_id);
_this.removeEditor(_id);
layer.close(index);
layer.close(index);
break;
break;
}
}
});
});
}
}
});
});
break;
break;
}
}
$('.ace_toolbar_menu').hide();
$('.ace_toolbar_menu').hide();
$('.ace_toolbar_menu .menu-tabs,.ace_toolbar_menu .menu-encoding,.ace_toolbar_menu .menu-files').hide();
$('.ace_toolbar_menu .menu-tabs,.ace_toolbar_menu .menu-encoding,.ace_toolbar_menu .menu-files').hide();
e.stopPropagation();
e.stopPropagation();
e.preventDefault();
e.preventDefault();
});
});
$(window).keyup(function(e){
$(window).keyup(function(e){
if(e.keyCode === 116 && $('#ace_conter').length == 1){
if(e.keyCode === 116 && $('#ace_conter').length == 1){
layer.msg('Unable to refresh in editor mode. Please close and try again');
layer.msg('Unable to refresh in editor mode. Please close and try again');
}
}
});
});
// 新建编辑器视图
// 新建编辑器视图
$('.ace_editor_add').click(function() {
$('.ace_editor_add').click(function() {
_this.addEditorView();
_this.addEditorView();
});
});
// 底部状态栏功能按钮
// 底部状态栏功能按钮
$('.ace_conter_toolbar .pull-right span').click(function(e) {
$('.ace_conter_toolbar .pull-right span').click(function(e) {
var _type = $(this).attr('data-type'),
var _type = $(this).attr('data-type'),
_item = _this.editor['ace_editor_' + _this.ace_active];
_item = _this.editor['ace_editor_' + _this.ace_active];
$('.ace_toolbar_menu').show();
$('.ace_toolbar_menu').show();
switch (_type) {
switch (_type) {
case 'cursor':
case 'cursor':
$('.ace_toolbar_menu').hide();
$('.ace_toolbar_menu').hide();
$('.ace_header .jumpLine').click();
$('.ace_header .jumpLine').click();
break;
break;
case 'history':
case 'history':
$('.ace_toolbar_menu').hide();
$('.ace_toolbar_menu').hide();
if (_item.historys.length === 0) {
if (_item.historys.length === 0) {
layer.msg(lan.public.history_file_empty, { icon: 0 });
layer.msg(lan.public.history_file_empty, { icon: 0 });
return false;
return false;
}
}
_this.layer_view = layer.open({
_this.layer_view = layer.open({
type: 1,
type: 1,
area: '550px',
area: '550px',
title: lan.public.history_version + '[ ' + _item.fileName + ' ]',
title: lan.public.history_version + '[ ' + _item.fileName + ' ]',
skin: 'historys_layer',
skin: 'historys_layer',
content: '<div class="pd20">\
content: '<div class="pd20">\
<div class="divtable">\
<div class="divtable">\
<table class="historys table table-hover">\
<table class="historys table table-hover">\
<thead><tr><th>' + lan.public.file_name + '</th><th>' + lan.public.v_time + '</th><th style="text-align:right;">' + lan.public.operate + '</th></tr></thead>\
<thead><tr><th>' + lan.public.file_name + '</th><th>' + lan.public.v_time + '</th><th style="text-align:right;">' + lan.public.operate + '</th></tr></thead>\
<tbody></tbody>\
<tbody></tbody>\
</table>\
</table>\
</div>\
</div>\
</div>',
</div>',
success: function(layeo, index) {
success: function(layeo, index) {
var _html = '';
var _html = '';
for (var i = 0; i < _item.historys.length; i++) {
for (var i = 0; i < _item.historys.length; i++) {
_html += '<tr><td><span class="size_ellipsis" style="max-width:200px">' + _item.fileName + '</span></td><td>' + bt.format_data(_item.historys[i]) + '</td><td align="right"><a href="javascript:;" class="btlink open_history_file" data-time="' + _item.historys[i] + '">' + lan.public.open_file + '</a> | <a href="javascript:;" class="btlink recovery_file_historys" data-history="' + _item.historys[i] + '" data-path="' + _item.path + '">' + lan.public.restore + '</a></td></tr>'
_html += '<tr><td><span class="size_ellipsis" style="max-width:200px">' + _item.fileName + '</span></td><td>' + bt.format_data(_item.historys[i]) + '</td><td align="right"><a href="javascript:;" class="btlink open_history_file" data-time="' + _item.historys[i] + '">' + lan.public.open_file + '</a> | <a href="javascript:;" class="btlink recovery_file_historys" data-history="' + _item.historys[i] + '" data-path="' + _item.path + '">' + lan.public.restore + '</a></td></tr>'
}
}
if (_html === '') _html += '<tr><td colspan="3">' + lan.public.no_file_history + '</td></tr>'
if (_html === '') _html += '<tr><td colspan="3">' + lan.public.no_file_history + '</td></tr>'
$('.historys tbody').html(_html);
$('.historys tbody').html(_html);
$('.historys_layer').css('top', ($(window).height() / 2) - ($('.historys_layer').height() / 2) + 'px')
$('.historys_layer').css('top', ($(window).height() / 2) - ($('.historys_layer').height() / 2) + 'px')
$('.open_history_file').click(function() {
$('.open_history_file').click(function() {
var _history = $(this).attr('data-time');
var _history = $(this).attr('data-time');
_this.openHistoryEditorView({ filename: _item.path, history: _history }, function() {
_this.openHistoryEditorView({ filename: _item.path, history: _history }, function() {
layer.close(index);
layer.close(index);
$('.ace_conter_tips').show();
$('.ace_conter_tips').show();
$('.ace_conter_tips .tips').html(lan.public.read_only_file + _item.path + ',' + lan.public.history_v + ' [ ' + bt.format_data(new Number(_history)) + ' ]<a href="javascript:;" class="ml35 btlink" data-path="' + _item.path + '" data-history="' + _history + '">' + lan.public.restore_history + '</a>');
$('.ace_conter_tips .tips').html(lan.public.read_only_file + _item.path + ',' + lan.public.history_v + ' [ ' + bt.format_data(new Number(_history)) + ' ]<a href="javascript:;" class="ml35 btlink" data-path="' + _item.path + '" data-history="' + _history + '">' + lan.public.restore_history + '</a>');
});
});
});
});
$('.recovery_file_historys').click(function() {
$('.recovery_file_historys').click(function() {
_this.event_ecovery_file(this);
_this.event_ecovery_file(this);
});
});
}
}
});
});
break;
break;
case 'tab':
case 'tab':
$('.ace_toolbar_menu .menu-tabs').show().siblings().hide();
$('.ace_toolbar_menu .menu-tabs').show().siblings().hide();
$('.tabsType').find(_item.softTabs ? '[data-value="nbsp"]' : '[data-value="tabs"]').addClass('active').append(_icon);
$('.tabsType').find(_item.softTabs ? '[data-value="nbsp"]' : '[data-value="tabs"]').addClass('active').append(_icon);
$('.tabsSize [data-value="' + _item.tabSize + '"]').addClass('active').append(_icon);
$('.tabsSize [data-value="' + _item.tabSize + '"]').addClass('active').append(_icon);
break;
break;
case 'encoding':
case 'encoding':
_this.getEncodingList(_item.encoding);
_this.getEncodingList(_item.encoding);
$('.ace_toolbar_menu .menu-encoding').show().siblings().hide();
$('.ace_toolbar_menu .menu-encoding').show().siblings().hide();
break;
break;
case 'lang':
case 'lang':
$('.ace_toolbar_menu').hide();
$('.ace_toolbar_menu').hide();
layer.msg(lan.public.can_not_switch_lan, { icon: 6 });
layer.msg(lan.public.can_not_switch_lan, { icon: 6 });
break;
break;
}
}
e.stopPropagation();
e.stopPropagation();
e.preventDefault();
e.preventDefault();
});
});
// 隐藏目录
// 隐藏目录
$('.tips_fold_icon .glyphicon').click(function() {
$('.tips_fold_icon .glyphicon').click(function() {
if ($(this).hasClass('glyphicon-menu-left')) {
if ($(this).hasClass('glyphicon-menu-left')) {
$('.ace_conter_tips').css('right', '0');
$('.ace_conter_tips').css('right', '0');
$('.tips_fold_icon').css('left', '0');
$('.tips_fold_icon').css('left', '0');
$(this).removeClass('glyphicon-menu-left').addClass('glyphicon-menu-right');
$(this).removeClass('glyphicon-menu-left').addClass('glyphicon-menu-right');
} else {
} else {
$('.ace_conter_tips').css('right', '-100%');
$('.ace_conter_tips').css('right', '-100%');
$('.tips_fold_icon').css('left', '-25px');
$('.tips_fold_icon').css('left', '-25px');
$(this).removeClass('glyphicon-menu-right').addClass('glyphicon-menu-left');
$(this).removeClass('glyphicon-menu-right').addClass('glyphicon-menu-left');
}
}
});
});
// 设置换行符
// 设置换行符
$('.menu-tabs').on('click', 'li', function(e) {
$('.menu-tabs').on('click', 'li', function(e) {
var _val = $(this).attr('data-value'),
var _val = $(this).attr('data-value'),
_item = _this.editor['ace_editor_' + _this.ace_active];
_item = _this.editor['ace_editor_' + _this.ace_active];
if ($(this).parent().hasClass('tabsType')) {
if ($(this).parent().hasClass('tabsType')) {
//_item.ace.getSession().setUseSoftTabs(_val == 'nbsp');
//_item.ace.getSession().setUseSoftTabs(_val == 'nbsp');
_this.aceConfig.aceEditor.useSoftTabs = _val == 'nbsp';
_this.aceConfig.aceEditor.useSoftTabs = _val == 'nbsp';
_item.softTabs = _val == 'nbsp';
_item.softTabs = _val == 'nbsp';
} else {
} else {
//_item.ace.getSession().setTabSize(_val);
//_item.ace.getSession().setTabSize(_val);
_this.aceConfig.aceEditor.tabSize = _val;
_this.aceConfig.aceEditor.tabSize = _val;
_item.tabSize = _val;
_item.tabSize = _val;
}
}
_this.saveAceConfig(_this.aceConfig,function(res){
_this.saveAceConfig(_this.aceConfig,function(res){
if(res.status){
if(res.status){
layer.msg('Successful setup', {icon: 1});
layer.msg('Successful setup', {icon: 1});
}
}
});
});
$(this).siblings().removeClass('active').find('.icon').remove();
$(this).siblings().removeClass('active').find('.icon').remove();
$(this).addClass('active').append(_icon);
$(this).addClass('active').append(_icon);
_this.currentStatusBar(_item.id);
_this.currentStatusBar(_item.id);
e.stopPropagation();
e.stopPropagation();
e.preventDefault();
e.preventDefault();
});
});
// 设置编码内容
// 设置编码内容
$('.menu-encoding').on('click', 'li', function(e) {
$('.menu-encoding').on('click', 'li', function(e) {
var _item = _this.editor['ace_editor_' + _this.ace_active],
var _item = _this.editor['ace_editor_' + _this.ace_active],
_icon = '<span class="icon"><i class="glyphicon glyphicon-ok" aria-hidden="true"></i></span>';
_icon = '<span class="icon"><i class="glyphicon glyphicon-ok" aria-hidden="true"></i></span>';
layer.msg(lan.public.set_file_encoding + ':' + $(this).attr('data-value'));
layer.msg(lan.public.set_file_encoding + ':' + $(this).attr('data-value'));
$('.ace_conter_toolbar [data-type="encoding"]').html(lan.public.encoding + ': <i>' + $(this).attr('data-value') + '</i>');
$('.ace_conter_toolbar [data-type="encoding"]').html(lan.public.encoding + ': <i>' + $(this).attr('data-value') + '</i>');
$(this).addClass('active').append(_icon).siblings().removeClass('active').find('span').remove();
$(this).addClass('active').append(_icon).siblings().removeClass('active').find('span').remove();
_item.encoding = $(this).attr('data-value');
_item.encoding = $(this).attr('data-value');
_this.saveFileMethod(_item);
_this.saveFileMethod(_item);
});
});
// 搜索内容键盘事件
// 搜索内容键盘事件
$('.menu-files .menu-input').keyup(function() {
$('.menu-files .menu-input').keyup(function() {
_this.searchRelevance($(this).val());
_this.searchRelevance($(this).val());
if ($(this).val != '') {
if ($(this).val != '') {
$(this).next().show();
$(this).next().show();
} else {
} else {
$(this).next().hide();
$(this).next().hide();
}
}
});
});
// 清除搜索内容事件
// 清除搜索内容事件
$('.menu-files .menu-conter .fa').click(function() {
$('.menu-files .menu-conter .fa').click(function() {
$('.menu-files .menu-input').val('').next().hide();
$('.menu-files .menu-input').val('').next().hide();
_this.searchRelevance()
_this.searchRelevance()
});
});
// 顶部状态栏
// 顶部状态栏
$('.ace_header>span').click(function(e) {
$('.ace_header>span').click(function(e) {
var type = $(this).attr('class'),
var type = $(this).attr('class'),
editor_item = _this.editor['ace_editor_' + _this.ace_active];
editor_item = _this.editor['ace_editor_' + _this.ace_active];
var _icon = '<span class="icon"><i class="glyphicon glyphicon-ok" aria-hidden="true"></i></span>';
var _icon = '<span class="icon"><i class="glyphicon glyphicon-ok" aria-hidden="true"></i></span>';
switch (type) {
switch (type) {
case 'saveFile': //保存当时文件
case 'saveFile': //保存当时文件
_this.saveFileMethod(editor_item);
_this.saveFileMethod(editor_item);
break;
break;
case 'saveFileAll': //保存全部
case 'saveFileAll': //保存全部
var loadT = layer.open({
var loadT = layer.open({
type: 1,
type: 1,
area: ['350px', '180px'],
area: ['350px', '180px'],
title: 'Tips',
title: 'Tips',
content: '<div class="ace-clear-form">\
content: '<div class="ace-clear-form">\
<div class="clear-icon"></div>\
<div class="clear-icon"></div>\
<div class="clear-title">Do you want to save changes to all files?</div>\
<div class="clear-title">Do you want to save changes to all files?</div>\
<div class="clear-tips">If you don\'t save, the changes will be lost!</div>\
<div class="clear-tips">If you don\'t save, the changes will be lost!</div>\
<div class="ace-clear-btn" style="">\
<div class="ace-clear-btn" style="">\
<button type="button" class="btn btn-sm btn-default clear-btn" style="margin-right:10px;" >Cancel</button>\
<button type="button" class="btn btn-sm btn-default clear-btn" style="margin-right:10px;" >Cancel</button>\
<button type="button" class="btn btn-sm btn-success save-all-btn">Save</button>\
<button type="button" class="btn btn-sm btn-success save-all-btn">Save</button>\
</div>\
</div>\
</div>',
</div>',
success: function(layers, index) {
success: function(layers, index) {
$('.clear-btn').click(function() {
$('.clear-btn').click(function() {
layer.close(index);
layer.close(index);
});
});
$('.save-all-btn').click(function() {
$('.save-all-btn').click(function() {
var _arry = [],
var _arry = [],
editor = aceEditor['editor'];
editor = aceEditor['editor'];
for (var item in editor) {
for (var item in editor) {
_arry.push({
_arry.push({
path: editor[item]['path'],
path: editor[item]['path'],
data: editor[item]['ace'].getValue(),
data: editor[item]['ace'].getValue(),
encoding: editor[item]['encoding'],
encoding: editor[item]['encoding'],
})
})
}
}
_this.saveAllFileBody(_arry, function() {
_this.saveAllFileBody(_arry, function() {
$('.ace_conter_menu>.item').each(function(el, index) {
$('.ace_conter_menu>.item').each(function(el, index) {
var _id = $(this).attr('data-id');
var _id = $(this).attr('data-id');
$(this).find('i').attr('data-file-state', '0').removeClass('glyphicon-exclamation-sign').addClass('glyphicon-remove')
$(this).find('i').attr('data-file-state', '0').removeClass('glyphicon-exclamation-sign').addClass('glyphicon-remove')
aceEditor.editor['ace_editor_' + _id].fileType = 0;
aceEditor.editor['ace_editor_' + _id].fileType = 0;
});
});
layer.close(index);
layer.close(index);
});
});
});
});
}
}
});
});
break;
break;
case 'refreshs': //刷新文件
case 'refreshs': //刷新文件
if (editor_item.fileType === 0) {
if (editor_item.fileType === 0) {
aceEditor.getFileBody({ path: editor_item.path }, function(res) {
aceEditor.getFileBody({ path: editor_item.path }, function(res) {
editor_item.ace.setValue(res.data);
editor_item.ace.setValue(res.data);
editor_item.fileType = 0;
editor_item.fileType = 0;
$('.item_tab_' + editor_item.id + ' .icon-tool').attr('data-file-state', '0').removeClass('glyphicon-exclamation-sign').addClass('glyphicon-remove');
$('.item_tab_' + editor_item.id + ' .icon-tool').attr('data-file-state', '0').removeClass('glyphicon-exclamation-sign').addClass('glyphicon-remove');
layer.msg('Refresh successfully', { icon: 1 });
layer.msg('Refresh successfully', { icon: 1 });
});
});
return false;
return false;
}
}
var loadT = layer.open({
var loadT = layer.open({
type: 1,
type: 1,
//area: ['350px', '180px'],
//area: ['350px', '180px'],
title: 'Tips',
title: 'Tips',
content: '<div class="ace-clear-form">\
content: '<div class="ace-clear-form">\
<div class="clear-icon"></div>\
<div class="clear-icon"></div>\
<div class="clear-title">Whether to refresh the current file</div>\
<div class="clear-title">Whether to refresh the current file</div>\
<div class="clear-tips">Refreshing the current file will overwrite the current modification and continue!</div>\
<div class="clear-tips">Refreshing the current file will overwrite the current modification and continue!</div>\
<div class="ace-clear-btn" style="">\
<div class="ace-clear-btn" style="">\
<button type="button" class="btn btn-sm btn-default clear-btn" style="margin-right:10px;" >Cancel</button>\
<button type="button" class="btn btn-sm btn-default clear-btn" style="margin-right:10px;" >Cancel</button>\
<button type="button" class="btn btn-sm btn-success save-all-btn">Save</button>\
<button type="button" class="btn btn-sm btn-success save-all-btn">Save</button>\
</div>\
</div>\
</div>',
</div>',
success: function(layers, index) {
success: function(layers, index) {
保存された差分
原文
ファイルを開く
$(function(){ $.fn.extend({ fixedThead:function(options){ var _that = $(this); console.log(_that); var option = { height:400, shadow:true, resize:true }; options = $.extend(option,options); if($(this).find('table').length === 0){ return false; } var _height = $(this)[0].style.height,_table_config = _height.match(/([0-9]+)([%\w]+)/); if(_table_config === null){ _table_config = [null,options.height,'px']; }else{ $(this).css({ 'boxSizing': 'content-box', 'paddingBottom':$(this).find('thead').height() }); } $(this).css({'position':'relative'}); var _thead = $(this).find('thead')[0].outerHTML, _tbody = $(this).find('tbody')[0].outerHTML, _thead_div = $('<div class="thead_div"><table class="table table-hover mb0"></table></div>'), _shadow_top = $('<div class="tbody_shadow_top"></div>'), _tbody_div = $('<div class="tbody_div" style="height:'+ _table_config[1] + _table_config[2] +';"><table class="table table-hover mb0" style="margin-top:-'+ $(this).find('thead').height() +'px"></table></div>'), _shadow_bottom = $('<div class="tbody_shadow_bottom"></div>'); _thead_div.find('table').append(_thead); _tbody_div.find('table').append(_thead); _tbody_div.find('table').append(_tbody); $(this).html(''); $(this).append(_thead_div); $(this).append(_shadow_top); $(this).append(_tbody_div); $(this).append(_shadow_bottom); var _table_width = _that.find('.thead_div table')[0].offsetWidth, _body_width = _that.find('.tbody_div table')[0].offsetWidth, _length = _that.find('tbody tr:eq(0)>td').length; $(this).find('tbody tr:eq(0)>td').each(function(index,item){ var _item = _that.find('thead tr:eq(0)>th').eq(index); if(index === (_length-1)){ _item.attr('width',$(item)[0].clientWidth + (_table_width - _body_width)); }else{ _item.attr('width',$(item)[0].offsetWidth); } }); if(options.resize){ $(window).resize(function(){ var _table_width = _that.find('.thead_div table')[0].offsetWidth, _body_width = _that.find('.tbody_div table')[0].offsetWidth, _length = _that.find('tbody tr:eq(0)>td').length; _that.find('tbody tr:eq(0)>td').each(function(index,item){ var _item = _that.find('thead tr:eq(0)>th').eq(index); if(index === (_length-1)){ _item.attr('width',$(item)[0].clientWidth + (_table_width - _body_width)); }else{ _item.attr('width',$(item)[0].offsetWidth); } }); }); } if(options.shadow){ var table_body = $(this).find('.tbody_div')[0]; if(_table_config[1] >= table_body.scrollHeight){ $(this).find('.tbody_shadow_top').hide(); $(this).find('.tbody_shadow_bottom').hide(); }else{ $(this).find('.tbody_shadow_top').hide(); $(this).find('.tbody_shadow_bottom').show(); } $(this).find('.tbody_div').scroll(function(e){ var _scrollTop = $(this)[0].scrollTop, _scrollHeight = $(this)[0].scrollHeight, _clientHeight = $(this)[0].clientHeight, _shadow_top = _that.find('.tbody_shadow_top'), _shadow_bottom = _that.find('.tbody_shadow_bottom'); if(_scrollTop == 0){ _shadow_top.hide(); _shadow_bottom.show(); }else if(_scrollTop > 0 && _scrollTop < (_scrollHeight - _clientHeight)){ _shadow_top.show(); _shadow_bottom.show(); }else if(_scrollTop == (_scrollHeight - _clientHeight)){ _shadow_top.show(); _shadow_bottom.hide(); } }) } } }); }(jQuery)) $(document).ready(function() { $(".sub-menu a.sub-menu-a").click(function() { $(this).next(".sub").slideToggle("slow").siblings(".sub:visible").slideUp("slow"); }); }); var aceEditor = { layer_view: '', aceConfig:{}, //ace配置参数 editor: null, supportedModes: { Apache_Conf: ["^htaccess|^htgroups|^htpasswd|^conf|htaccess|htgroups|htpasswd"], BatchFile: ["bat|cmd"], C_Cpp: ["cpp|c|cc|cxx|h|hh|hpp|ino"], CSharp: ["cs"], CSS: ["css"], Dockerfile: ["^Dockerfile"], golang: ["go"], HTML: ["html|htm|xhtml|vue|we|wpy"], Java: ["java"], JavaScript: ["js|jsm|jsx"], 'JSON': ["json"], JSP: ["jsp"], LESS: ["less"], Lua: ["lua"], Makefile: ["^Makefile|^GNUmakefile|^makefile|^OCamlMakefile|make"], Markdown: ["md|markdown"], MySQL: ["mysql"], Nginx: ["nginx|conf"], INI: ["ini|conf|cfg|prefs"], ObjectiveC: ["m|mm"], Perl: ["pl|pm"], Perl6: ["p6|pl6|pm6"], pgSQL: ["pgsql"], PHP_Laravel_blade: ["blade.php"], PHP: ["php|inc|phtml|shtml|php3|php4|php5|phps|phpt|aw|ctp|module"], Powershell: ["ps1"], Python: ["py"], R: ["r"], Ruby: ["rb|ru|gemspec|rake|^Guardfile|^Rakefile|^Gemfile"], Rust: ["rs"], SASS: ["sass"], SCSS: ["scss"], SH: ["sh|bash|^.bashrc"], SQL: ["sql"], SQLServer: ["sqlserver"], Swift: ["swift"], Text: ["txt"], Typescript: ["ts|typescript|str"], VBScript: ["vbs|vb"], Verilog: ["v|vh|sv|svh"], XML: ["xml|rdf|rss|wsdl|xslt|atom|mathml|mml|xul|xbl|xaml"], YAML: ["yaml|yml"], Compress: ['tar|zip|7z|rar|gz|arj|z'], images: ['icon|jpg|jpeg|png|bmp|gif|tif|emf'] }, nameOverrides: { ObjectiveC: "Objective-C", CSharp: "C#", golang: "Go", C_Cpp: "C and C++", PHP_Laravel_blade: "PHP (Blade Template)", Perl6: "Perl 6", }, pathAarry: [], encodingList: ['ASCII', 'UTF-8', 'GBK', 'GB2312', 'BIG5'], themeList: [ 'chrome', 'monokai' ], fontSize: '13px', editorTheme: 'monokai', // 编辑器主题 editorLength: 0, isAceView: true, ace_active: '', is_resizing: false, menu_path:'', //当前文件目录根地址 refresh_config:{ el:{}, // 需要重新获取的元素,为DOM对象 path:'',// 需要获取的路径文件信息 group:1,// 当前列表层级,用来css固定结构 is_empty:true }, //刷新配置参数 // 事件编辑器-方法,事件绑定 eventEditor: function() { var _this = this,_icon = '<span class="icon"><i class="glyphicon glyphicon-ok" aria-hidden="true"></i></span>'; $(window).resize(function(){ if(_this.ace_active != undefined) _this.setEditorView() if( $('.aceEditors .layui-layer-maxmin').length >0){ $('.aceEditors').css({ 'top':0, 'left':0, 'width':$(this)[0].innerWidth, 'height':$(this)[0].innerHeight }); } }) $(document).click(function(e){ $('.ace_toolbar_menu').hide(); $('.ace_conter_editor .ace_editors').css('fontSize', _this.aceConfig.aceEditor.fontSize + 'px'); $('.ace_toolbar_menu .menu-tabs,.ace_toolbar_menu .menu-encoding,.ace_toolbar_menu .menu-files').hide(); }); $('.ace_editor_main').on('click',function(){ $('.ace_toolbar_menu').hide(); }); $('.ace_toolbar_menu').click(function(e){ e.stopPropagation(); e.preventDefault(); }); // 显示工具条 $('.ace_header .pull-down').click(function(){ if($(this).find('i').hasClass('glyphicon-menu-down')){ $('.ace_header').css({'top':'-35px'}); $('.ace_overall').css({'top':'0'}); $(this).css({'top':'35px','height':'40px','line-height':'40px'}); $(this).find('i').addClass('glyphicon-menu-up').removeClass('glyphicon-menu-down'); }else{ $('.ace_header').css({'top':'0'}); $('.ace_overall').css({'top':'35px'}); $(this).removeAttr('style'); $(this).find('i').addClass('glyphicon-menu-down').removeClass('glyphicon-menu-up'); } _this.setEditorView(); }); // 切换TAB视图 $('.ace_conter_menu').on('click', '.item', function (e) { var _id = $(this).attr('data-id'),_item = _this.editor['ace_editor_' + _id]; $('.item_tab_'+ _id).addClass('active').siblings().removeClass('active'); $('#ace_editor_'+ _id).addClass('active').siblings().removeClass('active'); _this.ace_active = _id; _this.currentStatusBar(_id); _this.is_file_history(_item); }); // 移上TAB按钮变化,仅文件被修改后 $('.ace_conter_menu').on('mouseover', '.item .icon-tool', function () { var type = $(this).attr('data-file-state'); if (type != '0') { $(this).removeClass('glyphicon-exclamation-sign').addClass('glyphicon-remove'); } }); // 移出tab按钮变化,仅文件被修改后 $('.ace_conter_menu').on('mouseout', '.item .icon-tool', function () { var type = $(this).attr('data-file-state'); if (type != '0') { $(this).removeClass('glyphicon-remove').addClass('glyphicon-exclamation-sign'); } }); // 关闭编辑视图 $('.ace_conter_menu').on('click', '.item .icon-tool', function(e) { var file_type = $(this).attr('data-file-state'); var file_title = $(this).attr('data-title'); var _path = $(this).parent().parent().attr('title'); var _id = $(this).parent().parent().attr('data-id'); switch (file_type) { // 直接关闭 case '0': _this.removeEditor(_id); break; // 未保存 case '1': var loadT = layer.open({ type: 1, area: ['400px', '180px'], title: 'Tips', content: '<div class="ace-clear-form">\ <div class="clear-icon"></div>\ <div class="clear-title">Do you want to save changes to  <span class="size_ellipsis" style="max-width:150px;vertical-align: top;" title="' + file_title + '">' + file_title + '</span> ?</div>\ <div class="clear-tips">If you don\'t save, the changes will be lost!</div>\ <div class="ace-clear-btn" style="">\ <button type="button" class="btn btn-sm btn-default" style="float:left" data-type="2">Dont save</button>\ <button type="button" class="btn btn-sm btn-default" style="margin-right:10px;" data-type="1">Cancel</button>\ <button type="button" class="btn btn-sm btn-success" data-type="0">Save</button>\ </div>\ </div>', success: function(layers, index) { $('.ace-clear-btn .btn').click(function() { var _type = $(this).attr('data-type'), editor_item = _this.editor['ace_editor_' + _id]; switch (_type) { case '0': //保存文件 _this.saveFileBody({ path: _path, data: editor_item.ace.getValue(), encoding: editor_item.encoding }, function(res) { layer.close(index); _this.removeEditor(editor_item.id); layer.msg(res.msg, { icon: 1 }); editor_item.fileType = 0; $('.item_tab_' + editor_item.id + ' .icon-tool').attr('data-file-state', '0').removeClass('glyphicon-exclamation-sign').addClass('glyphicon-remove'); }); break; case '1': //关闭视图 layer.close(index); break; case '2': //取消保存 _this.removeEditor(_id); layer.close(index); break; } }); } }); break; } $('.ace_toolbar_menu').hide(); $('.ace_toolbar_menu .menu-tabs,.ace_toolbar_menu .menu-encoding,.ace_toolbar_menu .menu-files').hide(); e.stopPropagation(); e.preventDefault(); }); $(window).keyup(function(e){ if(e.keyCode === 116 && $('#ace_conter').length == 1){ layer.msg('Unable to refresh in editor mode. Please close and try again'); } }); // 新建编辑器视图 $('.ace_editor_add').click(function() { _this.addEditorView(); }); // 底部状态栏功能按钮 $('.ace_conter_toolbar .pull-right span').click(function(e) { var _type = $(this).attr('data-type'), _item = _this.editor['ace_editor_' + _this.ace_active]; $('.ace_toolbar_menu').show(); switch (_type) { case 'cursor': $('.ace_toolbar_menu').hide(); $('.ace_header .jumpLine').click(); break; case 'history': $('.ace_toolbar_menu').hide(); if (_item.historys.length === 0) { layer.msg(lan.public.history_file_empty, { icon: 0 }); return false; } _this.layer_view = layer.open({ type: 1, area: '550px', title: lan.public.history_version + '[ ' + _item.fileName + ' ]', skin: 'historys_layer', content: '<div class="pd20">\ <div class="divtable">\ <table class="historys table table-hover">\ <thead><tr><th>' + lan.public.file_name + '</th><th>' + lan.public.v_time + '</th><th style="text-align:right;">' + lan.public.operate + '</th></tr></thead>\ <tbody></tbody>\ </table>\ </div>\ </div>', success: function(layeo, index) { var _html = ''; for (var i = 0; i < _item.historys.length; i++) { _html += '<tr><td><span class="size_ellipsis" style="max-width:200px">' + _item.fileName + '</span></td><td>' + bt.format_data(_item.historys[i]) + '</td><td align="right"><a href="javascript:;" class="btlink open_history_file" data-time="' + _item.historys[i] + '">' + lan.public.open_file + '</a> | <a href="javascript:;" class="btlink recovery_file_historys" data-history="' + _item.historys[i] + '" data-path="' + _item.path + '">' + lan.public.restore + '</a></td></tr>' } if (_html === '') _html += '<tr><td colspan="3">' + lan.public.no_file_history + '</td></tr>' $('.historys tbody').html(_html); $('.historys_layer').css('top', ($(window).height() / 2) - ($('.historys_layer').height() / 2) + 'px') $('.open_history_file').click(function() { var _history = $(this).attr('data-time'); _this.openHistoryEditorView({ filename: _item.path, history: _history }, function() { layer.close(index); $('.ace_conter_tips').show(); $('.ace_conter_tips .tips').html(lan.public.read_only_file + _item.path + ',' + lan.public.history_v + ' [ ' + bt.format_data(new Number(_history)) + ' ]<a href="javascript:;" class="ml35 btlink" data-path="' + _item.path + '" data-history="' + _history + '">' + lan.public.restore_history + '</a>'); }); }); $('.recovery_file_historys').click(function() { _this.event_ecovery_file(this); }); } }); break; case 'tab': $('.ace_toolbar_menu .menu-tabs').show().siblings().hide(); $('.tabsType').find(_item.softTabs ? '[data-value="nbsp"]' : '[data-value="tabs"]').addClass('active').append(_icon); $('.tabsSize [data-value="' + _item.tabSize + '"]').addClass('active').append(_icon); break; case 'encoding': _this.getEncodingList(_item.encoding); $('.ace_toolbar_menu .menu-encoding').show().siblings().hide(); break; case 'lang': $('.ace_toolbar_menu').hide(); layer.msg(lan.public.can_not_switch_lan, { icon: 6 }); break; } e.stopPropagation(); e.preventDefault(); }); // 隐藏目录 $('.tips_fold_icon .glyphicon').click(function() { if ($(this).hasClass('glyphicon-menu-left')) { $('.ace_conter_tips').css('right', '0'); $('.tips_fold_icon').css('left', '0'); $(this).removeClass('glyphicon-menu-left').addClass('glyphicon-menu-right'); } else { $('.ace_conter_tips').css('right', '-100%'); $('.tips_fold_icon').css('left', '-25px'); $(this).removeClass('glyphicon-menu-right').addClass('glyphicon-menu-left'); } }); // 设置换行符 $('.menu-tabs').on('click', 'li', function(e) { var _val = $(this).attr('data-value'), _item = _this.editor['ace_editor_' + _this.ace_active]; if ($(this).parent().hasClass('tabsType')) { //_item.ace.getSession().setUseSoftTabs(_val == 'nbsp'); _this.aceConfig.aceEditor.useSoftTabs = _val == 'nbsp'; _item.softTabs = _val == 'nbsp'; } else { //_item.ace.getSession().setTabSize(_val); _this.aceConfig.aceEditor.tabSize = _val; _item.tabSize = _val; } _this.saveAceConfig(_this.aceConfig,function(res){ if(res.status){ layer.msg('Successful setup', {icon: 1}); } }); $(this).siblings().removeClass('active').find('.icon').remove(); $(this).addClass('active').append(_icon); _this.currentStatusBar(_item.id); e.stopPropagation(); e.preventDefault(); }); // 设置编码内容 $('.menu-encoding').on('click', 'li', function(e) { var _item = _this.editor['ace_editor_' + _this.ace_active], _icon = '<span class="icon"><i class="glyphicon glyphicon-ok" aria-hidden="true"></i></span>'; layer.msg(lan.public.set_file_encoding + ':' + $(this).attr('data-value')); $('.ace_conter_toolbar [data-type="encoding"]').html(lan.public.encoding + ': <i>' + $(this).attr('data-value') + '</i>'); $(this).addClass('active').append(_icon).siblings().removeClass('active').find('span').remove(); _item.encoding = $(this).attr('data-value'); _this.saveFileMethod(_item); }); // 搜索内容键盘事件 $('.menu-files .menu-input').keyup(function() { _this.searchRelevance($(this).val()); if ($(this).val != '') { $(this).next().show(); } else { $(this).next().hide(); } }); // 清除搜索内容事件 $('.menu-files .menu-conter .fa').click(function() { $('.menu-files .menu-input').val('').next().hide(); _this.searchRelevance() }); // 顶部状态栏 $('.ace_header>span').click(function(e) { var type = $(this).attr('class'), editor_item = _this.editor['ace_editor_' + _this.ace_active]; var _icon = '<span class="icon"><i class="glyphicon glyphicon-ok" aria-hidden="true"></i></span>'; switch (type) { case 'saveFile': //保存当时文件 _this.saveFileMethod(editor_item); break; case 'saveFileAll': //保存全部 var loadT = layer.open({ type: 1, area: ['350px', '180px'], title: 'Tips', content: '<div class="ace-clear-form">\ <div class="clear-icon"></div>\ <div class="clear-title">Do you want to save changes to all files?</div>\ <div class="clear-tips">If you don\'t save, the changes will be lost!</div>\ <div class="ace-clear-btn" style="">\ <button type="button" class="btn btn-sm btn-default clear-btn" style="margin-right:10px;" >Cancel</button>\ <button type="button" class="btn btn-sm btn-success save-all-btn">Save</button>\ </div>\ </div>', success: function(layers, index) { $('.clear-btn').click(function() { layer.close(index); }); $('.save-all-btn').click(function() { var _arry = [], editor = aceEditor['editor']; for (var item in editor) { _arry.push({ path: editor[item]['path'], data: editor[item]['ace'].getValue(), encoding: editor[item]['encoding'], }) } _this.saveAllFileBody(_arry, function() { $('.ace_conter_menu>.item').each(function(el, index) { var _id = $(this).attr('data-id'); $(this).find('i').attr('data-file-state', '0').removeClass('glyphicon-exclamation-sign').addClass('glyphicon-remove') aceEditor.editor['ace_editor_' + _id].fileType = 0; }); layer.close(index); }); }); } }); break; case 'refreshs': //刷新文件 if (editor_item.fileType === 0) { aceEditor.getFileBody({ path: editor_item.path }, function(res) { editor_item.ace.setValue(res.data); editor_item.fileType = 0; $('.item_tab_' + editor_item.id + ' .icon-tool').attr('data-file-state', '0').removeClass('glyphicon-exclamation-sign').addClass('glyphicon-remove'); layer.msg('Refresh successfully', { icon: 1 }); }); return false; } var loadT = layer.open({ type: 1, //area: ['350px', '180px'], title: 'Tips', content: '<div class="ace-clear-form">\ <div class="clear-icon"></div>\ <div class="clear-title">Whether to refresh the current file</div>\ <div class="clear-tips">Refreshing the current file will overwrite the current modification and continue!</div>\ <div class="ace-clear-btn" style="">\ <button type="button" class="btn btn-sm btn-default clear-btn" style="margin-right:10px;" >Cancel</button>\ <button type="button" class="btn btn-sm btn-success save-all-btn">Save</button>\ </div>\ </div>', success: function(layers, index) { $('.clear-btn').click(function() { layer.close(index); }); $('.save-all-btn').click(function() { aceEditor.getFileBody({ path: editor_item.path }, function(res) { layer.close(index); editor_item.ace.setValue(res.data); editor_item.fileType == 0; $('.item_tab_' + editor_item.id + ' .icon-tool').attr('data-file-state', '0').removeClass('glyphicon-exclamation-sign').addClass('glyphicon-remove'); layer.msg('Refresh successfully', { icon: 1 }); }); }); } }); break; // 搜索 case 'searchs': editor_item.ace.execCommand('find'); break; // 替换 case 'replaces': editor_item.ace.execCommand('replace'); break; // 跳转行 case 'jumpLine': $('.ace_toolbar_menu').show().find('.menu-jumpLine').show().siblings().hide(); $('.set_jump_line input').val('').focus(); $('.set_jump_line .btn-save').unbind('click').click(function(){ var _jump_line = $('.set_jump_line input').val(); editor_item.ace.gotoLine(_jump_line); $('.ace_toolbar_menu').hide(); }); $('.set_jump_line input').unbind('keypress keydown keyup').on('keypress keydown keyup',function(e){ if(e.keyCode == 13 || (e.keyCode >= 48 && e.keyCode <= 57) || (e.keyCode >= 96 && e.keyCode <= 105)){ var _jump_line = $('.set_jump_line input').val(); if(_jump_line == '' && typeof parseInt(_jump_line) != 'number') return false; editor_item.ace.gotoLine(_jump_line); } }); break; // 字体 case 'fontSize': $('.ace_toolbar_menu').show().find('.menu-fontSize').show().siblings().hide(); $('.menu-fontSize .set_font_size input').val(_this.aceConfig.aceEditor.fontSize).focus(); $('.menu-fontSize set_font_size input').unbind('keypress onkeydown').on('keypress onkeydown',function (e){ var _val = $(this).val(); if (_val == '') { $(this).css('border', '1px solid red'); $(this).next('.tips').text('Font setting range 12-45'); } else if (!isNaN(_val)) { $(this).removeAttr('style'); if (parseInt(_val) > 11 && parseInt(_val) < 45) { $('.ace_conter_editor .ace_editors').css('fontSize', _val + 'px') } else { $('.ace_conter_editor .ace_editors').css('fontSize', '13px'); $(this).css('border', '1px solid red'); $(this).next('.tips').text('Font setting range 12-45'); } } else { $(this).css('border', '1px solid red'); $(this).next('.tips').text('Font setting range 12-45'); } e.stopPropagation(); e.preventDefault(); }); $('.menu-fontSize .menu-conter .set_font_size input').unbind('change').change(function() { var _val = $(this).val(); $('.ace_conter_editor .ace_editors').css('fontSize', _val + 'px') }); $('.set_font_size .btn-save').unbind('click').click(function(){ var _fontSize = $('.set_font_size input').val(); _this.aceConfig.aceEditor.fontSize = parseInt(_fontSize); _this.saveAceConfig(_this.aceConfig,function(res){ if(res.status){ $('.ace_editors').css('fontSize',_fontSize +'px'); layer.msg('Successful setup', {icon: 1}); $('.ace_toolbar_menu').hide(); } }); }); break; //主题 case 'themes': $('.ace_toolbar_menu').show().find('.menu-themes').show().siblings().hide(); var _html = '',_arry = ['White', 'Black']; for (var i = 0; i < _this.themeList.length; i++) { if (_this.themeList[i] != _this.aceConfig.aceEditor.editorTheme) { _html += '<li data-value="' + _this.themeList[i] + '">' + _this.themeList[i] + '【' + _arry[i] + '】</li>'; } else { _html += '<li data-value="' + _this.themeList[i] + '" class="active">' + _this.themeList[i] + '【' + _arry[i] + '】' + _icon + '</li>'; } } $('.menu-themes ul').html(_html); $('.menu-themes ul li').click(function(){ var _theme = $(this).attr('data-value'); $(this).addClass('active').append(_icon).siblings().removeClass('active').find('.icon').remove(); _this.aceConfig.aceEditor.editorTheme = _theme; _this.saveAceConfig(_this.aceConfig,function(res){ for(var item in _this.editor){ _this.editor[item].ace.setTheme("ace/theme/"+_theme); } layer.msg('Successful setup', {icon: 1}); }); }); break; case 'setUp': $('.ace_toolbar_menu').show().find('.menu-setUp').show().siblings().hide(); $('.menu-setUp .editor_menu li').each(function(index,el){ var _type = _this.aceConfig.aceEditor[$(el).attr('data-type')]; if(_type) $(el).addClass('active').append(_icon); }) $('.menu-setUp .editor_menu li').unbind('click').click(function(){ var _type = $(this).attr('data-type'); _this.aceConfig.aceEditor[_type] = !$(this).hasClass('active'); if($(this).hasClass('active')){ $(this).removeClass('active').find('.icon').remove(); }else{ $(this).addClass('active').append(_icon); } _this.saveAceConfig(_this.aceConfig,function(res){ for(var item in _this.editor){ _this.editor[item].ace.setOption(_type,_this.aceConfig.aceEditor[_type]); } layer.msg('Successful setup', {icon: 1}); }); }); break; case 'helps': layer.open({ type: 1, area: '1300px', title: 'Help', content: '<div class="helps_conter">\ <div class="helps_left">\ <div class="helps_item">Common shortcuts:</div>\ <div class="helps_box">\ ctrl+s Save</br>\ ctrl+a Select all ctrl+x Cut</br>\ ctrl+c Copy ctrl+v Paste</br>\ ctrl+z Cancel ctrl+y Anti-cancel</br>\ ctrl+f Find ctrl+alt+f Replace</br>\ win+alt+0 Collapse all</br>\ win+alt+shift+0 Expand all</br>\ esc [Exit the search and cancel the automatic prompt...]</br>\ ctrl-shift-s Preview</br>\ ctrl-shift-e Show & close function\ </div>\ <div class="helps_item">Select:</div>\ <div class="helps_box">\ Mouse frame selection -- drag</br>\ shift+home/end/up/left/down/right</br>\ shift+pageUp/PageDown Scroll up and down</br>\ ctrl+shift+ home/end Current cursor to the end of the head</br>\ alt+ Mouse drag Block selection</br>\ ctrl+alt+g Batch select current and enter multi-tab editing</br>\ </div>\ </div>\ <div class="helps_left">\ <div class="helps_item">Cursor movement:</div>\ <div class="helps_box">\ home/end/up/left/down/right</br>\ ctrl+home/end Cursor moves to the beginning/end of the document</br>\ ctrl+p Jump to the matching tag</br>\ pageUp/PageDown Cursor up and down</br>\ alt+left/right Cursor moves to the top of the line</br>\ shift+left/right Cursor moves to the beginning & end of the line</br>\ ctrl+l Jump to the specified line</br>\ ctrl+alt+up/down Add cursor to the top (bottom)</br>\ </div>\ <div class="helps_item">Edit:</div>\ <div class="helps_box">\ ctrl+/ Comment & Uncomment ctrl+alt+a Align left and right</br>\ table Tab alignment shift+table Overall advancement table</br>\ delete Delete ctrl+d Delete entire line</br>\ ctrl+delete Delete the word on the right side of the line</br>\ ctrl/shift+backspace Delete the word on the left</br>\ alt+shift+up/down Copy the line and add it to the top (below)</br>\ alt+delete Delete the right side of the cursor</br>\ alt+up/down The current line is swapped with the previous line (the next line)</br>\ ctrl+shift+d Copy the line and add it below</br>\ ctrl+delete Delete the word on the right</br>\ ctrl+shift+u Convert to lowercase</br>\ ctrl+u Convert selected content to uppercase</br>\ </div>\ </div>\ </div>' }); break; } e.stopPropagation(); e.preventDefault(); }); // 菜单状态 $('.ace_toolbar_menu').click(function(e) { e.stopPropagation(); e.preventDefault(); }); // 文件目录选择 $('.ace_catalogue_list').on('click', '.has-children .file_fold', function(e) { var _layers = $(this).attr('data-layer'), _type = $(this).find('data-type'), _path = $(this).parent().attr('data-menu-path'), _menu = $(this).find('.glyphicon'), _group = parseInt($(this).attr('data-group')), _file = $(this).attr('data-file'), _tath = $(this); var _active = $('.ace_catalogue_list .has-children .file_fold.edit_file_group'); if (_active.length > 0 && $(this).attr('data-edit') === undefined) { switch (_active.attr('data-edit')) { case '2': _active.find('.file_input').siblings().show(); _active.find('.file_input').remove(); _active.removeClass('edit_file_group').removeAttr('data-edit'); break; case '1': case '0': _active.parent().remove(); break; } layer.closeAll('tips'); } //$('.ace_catalogue_menu').hide(); $('.ace_toolbar_menu').hide(); $('.ace_toolbar_menu .menu-tabs,.ace_toolbar_menu .menu-encoding,.ace_toolbar_menu .menu-files').hide(); if($(this).hasClass('edit_file_group')) return false; $('.ace_catalogue_list .has-children .file_fold').removeClass('bg'); $(this).addClass('bg'); if ($(this).attr('data-file') == 'Dir') { if (_menu.hasClass('glyphicon-menu-right')) { _menu.removeClass('glyphicon-menu-right').addClass('glyphicon-menu-down'); $(this).next().show(); if ($(this).next().find('li').length == 0) _this.reader_file_dir_menu({ el: $(this).next(), path: _path, group: _group + 1 }); } else { _menu.removeClass('glyphicon-menu-down').addClass('glyphicon-menu-right'); $(this).next().hide(); } } else { _this.openEditorView(_path, function(res) { if (res.status) _tath.addClass('active'); }); } e.stopPropagation(); e.preventDefault(); }); // 禁用目录选择 $('.ace_catalogue').bind("selectstart", function(e) { var omitformtags = ["input", "textarea"]; omitformtags = "|" + omitformtags.join("|") + "|"; if (omitformtags.indexOf("|" + e.target.tagName.toLowerCase() + "|") == -1) { return false; }else{ return true; } }); // 返回目录(文件目录主菜单) $('.ace_dir_tools').on('click','.upper_level',function(){ var _paths = $(this).attr('data-menu-path'); _this.reader_file_dir_menu({path:_paths,is_empty:true}); $('.ace_catalogue_title').html('Directory: '+ _paths).attr('title',_paths); }); // 新建文件(文件目录主菜单) $('.ace_dir_tools').on('click','.new_folder',function(e){ var _paths = $(this).parent().find('.upper_level').attr('data-menu-path'); $(this).find('.folder_down_up').show(); $(document).click(function(){ $('.folder_down_up').hide(); $(this).unbind('click'); return false; }); $('.ace_toolbar_menu').hide(); $('.ace_catalogue_menu').hide(); $('.ace_toolbar_menu .menu-tabs,.ace_toolbar_menu .menu-encoding,.ace_toolbar_menu .menu-files').hide(); e.stopPropagation(); e.preventDefault(); }); // 刷新列表 (文件目录主菜单) $('.ace_dir_tools').on('click','.refresh_dir',function(e){ _this.refresh_config = { el:$('.cd-accordion-menu')[0], path:$('.ace_catalogue_title').attr('title'), group:1, is_empty:true } _this.reader_file_dir_menu(_this.refresh_config,function(){ layer.msg('Refresh success!',{icon:1}); }); }); // 搜索内容 (文件目录主菜单) $('.ace_dir_tools').on('click','.search_file',function(e){ if($(this).parent().find('.search_input_view').length == 0){ $(this).siblings('div').hide(); $(this).css('color','#ec4545').attr({'title':'Close'}).find('.glyphicon').removeClass('glyphicon-search').addClass('glyphicon-remove').next().text("Close"); $(this).before('<div class="search_input_title">Search Catalog File</div>'); $(this).after('<div class="search_input_view">\ <form>\ <input type="text" id="search_input_val" class="ser-text pull-left" placeholder="">\ <button type="button" class="ser-sub pull-left"></button>\ </form>\ <div class="search_boxs">\ <input id="search_alls" type="checkbox">\ <label for="search_alls"><span>Include Subdirectory Files</span></label>\ </div>\ </div>'); $('.ace_catalogue_list').css('top','150px'); $('.ace_dir_tools').css('height','110px'); $('.cd-accordion-menu').empty(); }else{ $(this).siblings('div').show(); $(this).parent().find('.search_input_view,.search_input_title').remove(); $(this).removeAttr('style').attr({'title':'Search Content'}).find('.glyphicon').removeClass('glyphicon-remove').addClass('glyphicon-search').next().text("Search"); $('.ace_catalogue_list').removeAttr('style') $('.ace_dir_tools').removeAttr('style'); _this.refresh_config = { el:$('.cd-accordion-menu')[0], path:$('.ace_catalogue_title').attr('title'), group:1, is_empty:true } _this.reader_file_dir_menu(_this.refresh_config); } }); // 搜索文件内容 $('.ace_dir_tools').on('click','.search_input_view button',function(e){ var path = _this.menu_path, search = $('#search_input_val').val(); _this.reader_file_dir_menu({ el:$('.cd-accordion-menu')[0], path:path, group:1, search:search, all:$('#search_alls').is(':checked')?'True':'False', is_empty:true }) }); // 当前根目录操作,新建文件或目录 $('.ace_dir_tools').on('click','.folder_down_up li',function(e){ var _type = parseInt($(this).attr('data-type')); switch(_type){ case 2: _this.newly_file_type_dom($('.cd-accordion-menu'),0,0); break; case 3: _this.newly_file_type_dom($('.cd-accordion-menu'),0,1); break; } _this.refresh_config = { el:$('.cd-accordion-menu')[0], path:$('.ace_catalogue_title').attr('title'), group:1, is_empty:true } $(this).parent().hide(); $('.ace_toolbar_menu').hide(); $('.ace_toolbar_menu .menu-tabs,.ace_toolbar_menu .menu-encoding,.ace_toolbar_menu .menu-files').hide(); e.preventDefault(); e.stopPropagation(); }); // 返回目录 $('.ace_catalogue_list').on('click', '.has-children.upper_level', function(e) { var _paths = $(this).attr('data-menu-path'); _this.reader_file_dir_menu({ path: _paths, is_empty: true }); $('.ace_catalogue_title').html(lan.public.dir + ': ' + _paths).attr('title', _paths); }); // 移动编辑器文件目录 $('.ace_catalogue_drag_icon .drag_icon_conter').on('mousedown', function(e) { var _left = $('.aceEditors')[0].offsetLeft; $('.ace_gutter-layer').css('cursor', 'col-resize'); $('#ace_conter').unbind().on('mousemove', function(ev) { var _width = (ev.clientX + 1) - _left; if (_width >= 250 && _width <= 400) { $('.ace_catalogue').css('width', _width); $('.ace_editor_main').css('marginLeft', _width); $('.ace_catalogue_drag_icon ').css('left', _width); $('.file_fold .newly_file_input').width($('.file_fold .newly_file_input').parent().parent().parent().width() - ($('.file_fold .newly_file_input').parent().parent().attr('data-group') * 15 - 5) - 20 - 30 - 53); } }).on('mouseup', function(ev) { $('.ace_gutter-layer').css('cursor', 'inherit'); $(this).unbind('mouseup mousemove'); }); }); // 收藏目录显示和隐藏 $('.ace_catalogue_drag_icon .fold_icon_conter').on('click', function(e) { if ($('.ace_overall').hasClass('active')) { $('.ace_overall').removeClass('active'); $('.ace_catalogue').css('left', '0'); $(this).removeClass('active').attr('title', lan.public.hide_dir); $('.ace_editor_main').css('marginLeft', $('.ace_catalogue').width()); } else { $('.ace_overall').addClass('active'); $('.ace_catalogue').css('left', '-' + $('.ace_catalogue').width() + 'px'); $(this).addClass('active').attr('title', lan.public.show_file_dir); $('.ace_editor_main').css('marginLeft', 0); } }); // 恢复历史文件 $('.ace_conter_tips').on('click', 'a', function() { _this.event_ecovery_file(this); }); // 右键菜单 $('.ace_catalogue_list').on('mousedown', '.has-children .file_fold', function(e) { var x = e.clientX, y = e.clientY, _left = $('.aceEditors')[0].offsetLeft, _top = $('.aceEditors')[0].offsetTop, _that = $('.ace_catalogue_list .has-children .file_fold'), _active = $('.ace_catalogue_list .has-children .file_fold.edit_file_group'); $('.ace_toolbar_menu').hide(); if (e.which === 3) { if ($(this).hasClass('edit_file_group')) return false; $('.ace_catalogue_menu').css({ 'display': 'block', 'left': x - _left, 'top': y - _top }); _that.removeClass('bg'); $(this).addClass('bg'); _active.attr('data-edit') != '2' ? _active.parent().remove() : ''; _that.removeClass('edit_file_group').removeAttr('data-edit'); _that.find('.file_input').siblings().show(); _that.find('.file_input').remove(); $('.ace_catalogue_menu li').show(); if ($(this).attr('data-file') == 'Dir') { $('.ace_catalogue_menu li:nth-child(6)').hide(); } else { $('.ace_catalogue_menu li:nth-child(-n+4)').hide(); } $(document).click(function() { $('.ace_catalogue_menu').hide(); $(this).unbind('click'); return false; }); _this.refresh_config = { el:$(this).parent().parent()[0], path:_this.get_file_dir($(this).parent().attr('data-menu-path'),1), group:parseInt($(this).attr('data-group')), is_empty:true } } }); // 文件目录右键功能 $('.ace_catalogue_menu li').click(function(e) { _this.newly_file_type(this); }); // 新建、重命名鼠标事件 $('.ace_catalogue_list').on('click', '.has-children .edit_file_group .glyphicon-ok', function() { var _file_or_dir = $(this).parent().find('input').val(), _file_type = $(this).parent().parent().attr('data-file'), _path = $('.has-children .file_fold.bg').parent().attr('data-menu-path'), _type = parseInt($(this).parent().parent().attr('data-edit')); if($(this).parent().parent().parent().attr('data-menu-path') === undefined && parseInt($(this).parent().parent().attr('data-group')) === 1){ _path = $('.ace_catalogue_title').attr('title'); } if (_file_or_dir === '') { $(this).prev().css('border', '1px solid #f34a4a'); layer.tips(_type === 0 ? lan.public.dir_cannot_empty : (_type === 1 ? lan.public.file_name_empty_err : lan.public.new_name_err), $(this).prev(), { tips: [1, '#f34a4a'], time: 0 }); return false; } else if ($(this).prev().attr('data-type') === 0) { return false; } switch (_type) { case 0: //新建文件夹 _this.event_create_dir({ path: _path + '/' + _file_or_dir }); break; case 1: //新建文件 _this.event_create_file({ path: _path + '/' + _file_or_dir }); break; case 2: //重命名 _this.event_rename_currency({ sfile: _path, dfile: _this.get_file_dir(_path, 1) + '/' + _file_or_dir}); break; } }); // 新建、重命名键盘事件 $('.ace_catalogue_list').on('keyup', '.has-children .edit_file_group input', function(e) { var _type = $(this).parent().parent().attr('data-edit'), _arry = $('.has-children .file_fold.bg+ul>li'); if(_arry.length == 0 && $(this).parent().parent().attr('data-group') == 1) _arry = $('.cd-accordion-menu>li') if(_type != 2){ for(var i=0;i<_arry.length;i++){ if($(_arry[i]).find('.file_title span').html() === $(this).val()){ $(this).css('border','1px solid #f34a4a'); $(this).attr('data-type',0); layer.tips(_type == 0 ? lan.public.same_name_dir : lan.public.same_name_file, $(this)[0], { tips: [1, '#f34a4a'], time: 0 }); return false } } } if (_type == 1 && $(this).val().indexOf('.')) $(this).prev().removeAttr('class').addClass(_this.get_file_suffix($(this).val()) + '-icon'); $(this).attr('data-type',1); $(this).css('border', '1px solid #528bff'); layer.closeAll('tips'); if (e.keyCode === 13) $(this).next().click() $('.ace_toolbar_menu').hide(); $('.ace_toolbar_menu .menu-tabs,.ace_toolbar_menu .menu-encoding,.ace_toolbar_menu .menu-files').hide(); e.stopPropagation(); e.preventDefault(); }); // 新建、重命名鼠标点击取消事件 $('.ace_catalogue_list').on('click', '.has-children .edit_file_group .glyphicon-remove', function() { layer.closeAll('tips'); if($(this).parent().parent().parent().attr('data-menu-path')){ $(this).parent().parent().removeClass('edit_file_group').removeAttr('data-edit'); $(this).parent().siblings().show(); $(this).parent().remove(); return false; } $(this).parent().parent().parent().remove(); }); //屏蔽浏览器右键菜单 $('.ace_catalogue_list')[0].oncontextmenu = function() { return false; } this.setEditorView(); this.reader_file_dir_menu(); }, // 设置本地存储,设置类型type:session或local setStorage:function(type,key,val){ if(type != "local" && type != "session") val = key,key = type,type = 'session'; window[type+'Storage'].setItem(key,val); }, //获取指定本地存储,设置类型type:session或local getStorage:function(type,key){ if(type != "local" && type != "session") key = type,type = 'session'; return window[type+'Storage'].getItem(key); }, //删除指定本地存储,设置类型type:session或local removeStorage:function(type,key){ if(type != "local" && type != "session") key = type,type = 'session'; window[type+'Storage'].removeItem(key); }, // 删除指定类型的所有存储信息 clearStorage:function(type){ if(type != "local" && type != "session") key = type,type = 'session'; window[type+'Storage'].clear(); }, // 新建文件类型 newly_file_type: function(that) { var _type = parseInt($(that).attr('data-type')), _active = $('.ace_catalogue .ace_catalogue_list .has-children .file_fold.bg'), _group = parseInt(_active.attr('data-group')), _path = _active.parent().attr('data-menu-path'), _this = this; switch(_type){ case 0: //刷新目录 _active.next().empty(); _this.reader_file_dir_menu({ el:_active.next(), path:_path, group:parseInt(_active.attr('data-group')) + 1, is_empty:true },function(){ layer.msg('Refresh successfully',{icon:1}); }); break; case 1: //打开文件 _this.menu_path = _path; _this.reader_file_dir_menu({ el:'.cd-accordion-menu', path:_this.menu_path, group:1, is_empty:true }); break; case 2: //新建文件 case 3: if(this.get_file_dir(_path,1) != this.menu_path){ //判断当前文件上级是否为显示根目录 this.reader_file_dir_menu({el:_active,path:_path,group:_group+1},function(res){ _this.newly_file_type_dom(_active,_group, _type == 2?0:1); }); }else{ _this.newly_file_type_dom(_active,_group, _type == 2?0:1); } break; case 4: //文件重命名 var _types = _active.attr('data-file'); if(_active.hasClass('active')){ layer.msg('The file is open and the name cannot be modified',{icon:0}); return false; } _active.attr('data-edit',2); _active.addClass('edit_file_group'); _active.find('.file_title').hide(); _active.find('.glyphicon').hide(); _active.prepend('<span class="file_input"><i class="'+ (_types === 'Dir'?'folder':(_this.get_file_suffix(_active.find('.file_title span').html()))) +'-icon"></i><input type="text" class="newly_file_input" value="'+ (_active.find('.file_title span').html()) +'"><span class="glyphicon glyphicon-ok" aria-hidden="true"></span><span class="glyphicon glyphicon-remove" aria-hidden="true"></span>') $('.file_fold .newly_file_input').width($('.file_fold .newly_file_input').parent().parent().parent().width() - ($('.file_fold .newly_file_input').parent().parent().attr('data-group') * 15 -5)-20-30-53); $('.file_fold .newly_file_input').focus(); break; case 5: GetFileBytes(_path); break; case 6: var is_files = _active.attr('data-file') === 'Files' layer.confirm(lan.get(is_files?'recycle_bin_confirm':'recycle_bin_confirm_dir', [_active.find('.file_title span').html()]), { title: is_files?lan.files.del_file:lan.files.del_dir, closeBtn: 2, icon: 3 }, function (index) { _this[is_files?'del_file_req':'del_dir_req']({path:_path},function(res){ layer.msg(res.msg,{icon:res.status?1:2}); if(res.status){ if(_active.attr('data-group') != 1) _active.parent().parent().prev().addClass('bg') _this.reader_file_dir_menu(_this.refresh_config,function(){ layer.msg(res.msg,{icon:1}); }); } }); }); break; } }, // 新建文件和文件夹 newly_file_type_dom:function(_active,_group,_type,_val){ var _html = '',_this = this,_nextLength = _active.next(':not(.ace_catalogue_menu)').length; if(_nextLength > 0){ _active.next().show(); _active.find('.glyphicon').removeClass('glyphicon-menu-right').addClass('glyphicon-menu-down'); } _html += '<li class="has-children children_'+ (_group+1) +'"><div class="file_fold edit_file_group group_'+ (_group+1) +'" data-group="'+ (_group+1) +'" data-edit="'+ _type +'"><span class="file_input">'; _html += '<i class="'+ (_type == 0?'folder':(_type == 1?'text':(_this.get_file_suffix(_val || '')))) +'-icon"></i>' _html += '<input type="text" class="newly_file_input" value="'+ (_val != undefined?_val:'') +'">' _html += '<span class="glyphicon glyphicon-ok" aria-hidden="true"></span><span class="glyphicon glyphicon-remove" aria-hidden="true"></span></span></div></li>' if(_nextLength > 0){ _active.next().prepend(_html); }else{ _active.prepend(_html); } setTimeout(function(){ $('.newly_file_input').focus() },100) $('.file_fold .newly_file_input').width($('.file_fold .newly_file_input').parent().parent().parent().width() - ($('.file_fold .newly_file_input').parent().parent().attr('data-group') * 15 -5)-20-30-53); return false; }, // newly_file_type_dom: function(_file_fold, _group, _type, _val) { // var _html = '', // _this = this; // _file_fold.next().show(); // _file_fold.find('.glyphicon').removeClass('glyphicon-menu-right').addClass('glyphicon-menu-down'); // _html += '<li class="has-children children_' + (_group + 1) + '"><div class="file_fold edit_file_group group_' + (_group + 1) + '" data-group="' + (_group + 1) + '" data-edit="' + _type + '"><span class="file_input">'; // _html += '<i class="' + (_type == 0 ? 'folder' : (_type == 1 ? 'text' : (_this.get_file_suffix(_val)))) + '-icon"></i>' // _html += '<input type="text" class="newly_file_input" value="' + (_val != undefined ? _val : '') + '">' // _html += '<span class="glyphicon glyphicon-ok" aria-hidden="true"></span><span class="glyphicon glyphicon-remove" aria-hidden="true"></span></span></div></li>' // _file_fold.next().prepend(_html); // $('.file_fold .newly_file_input').width($('.file_fold .newly_file_input').parent().parent().parent().width() - ($('.file_fold .newly_file_input').parent().parent().attr('data-group') * 15 - 5) - 20 - 30 - 53); // $('.newly_file_input').focus(); // }, // 通用重命名事件 event_rename_currency: function(obj, that) { var _active = $('.ace_catalogue_list .has-children .file_fold.edit_file_group'), _this = this; this.rename_currency_req({ sfile: obj.sfile, dfile: obj.dfile }, function(res) { layer.msg(res.msg, { icon: res.status ? 1 : 2 }); if (res.status) { _this.reader_file_dir_menu(_this.refresh_config,function(){ layer.msg(res.msg, { icon: 1 }); }); } else { _active.find('.file_input').siblings().show(); _active.find('.file_input').remove(); _active.removeClass('edit_file_group').removeAttr('data-edit'); } }) }, // 创建文件目录事件 event_create_dir: function(obj, that) { var _this = this; this.create_dir_req({ path: obj.path }, function(res) { layer.msg(res.msg, { icon: res.status ? 1 : 2 }); if (res.status) { _this.reader_file_dir_menu(_this.refresh_config,function(){ layer.msg(res.msg, { icon: 1 }); }); } }) }, // 创建文件事件 event_create_file: function(obj, that) { var _this = this; this.create_file_req({ path: obj.path }, function(res) { layer.msg(res.msg, { icon: res.status ? 1 : 2 }); if (res.status) { _this.reader_file_dir_menu(_this.refresh_config,function(){ layer.msg(res.msg, { icon: 1 }); _this.openEditorView(obj.path); }); } }) }, // 重命名请求 rename_currency_req: function(obj, callback) { var loadT = layer.msg(lan.public.renaming_file, { time: 0, icon: 16, shade: [0.3, '#000'] }); $.post("/files?action=MvFile", { sfile: obj.sfile, dfile: obj.dfile, rename: 'true' }, function(res) { layer.close(loadT); if (callback) callback(res); }); }, // 创建文件事件 create_file_req: function(obj, callback) { var loadT = layer.msg(lan.public.creating_file, { time: 0, icon: 16, shade: [0.3, '#000'] }); $.post("/files?action=CreateFile", { path: obj.path }, function(res) { layer.close(loadT); if (callback) callback(res); }); }, // 创建目录请求 create_dir_req: function(obj, callback) { var loadT = layer.msg(lan.public.creating_dir, { time: 0, icon: 16, shade: [0.3, '#000'] }); $.post("/files?action=CreateDir", { path: obj.path }, function(res) { layer.close(loadT); if (callback) callback(res); }); }, // 删除文件请求 del_file_req: function(obj, callback) { var loadT = layer.msg(lan.public.deleting_file, { time: 0, icon: 16, shade: [0.3, '#000'] }); $.post("/files?action=DeleteFile", { path: obj.path }, function(res) { layer.close(loadT); if (callback) callback(res); }); }, // 删除目录请求 del_dir_req: function(obj, callback) { var loadT = layer.msg(lan.public.deleting_dir, { time: 0, icon: 16, shade: [0.3, '#000'] }); $.post("/files?action=DeleteFile", { path: obj.path }, function(res) { layer.close(loadT); if (callback) callback(res); }); }, // 临时文件保存 auto_save_temp: function(obj, callback) { // var loadT = layer.msg('正在新建目录,请稍后...',{time: 0,icon: 16,shade: [0.3, '#000']}); $.post("/files?action=auto_save_temp", { filename: obj.filename, body: obj.body }, function(res) { layer.close(loadT); if (callback) callback(res); }); }, // 获取临时文件内容 get_auto_save_body: function(obj, callback) { var loadT = layer.msg(lan.public.get_autosave_file, { time: 0, icon: 16, shade: [0.3, '#000'] }); $.post("/files?action=get_auto_save_body", { filename: obj.filename }, function(res) { layer.close(loadT); if (callback) callback(res); }); }, // 刷新菜单列表 refresh_meun_list: function(el, callback) { var _active = $(el), _paths = _active.parent().attr('data-menu-path'), _group = parseInt(_active.attr('data-group')) + 1, _el = _active.next(); _active.next().empty(); if (_active.length === 0) { _el = $('.cd-accordion-menu'); _paths = $('.ace_catalogue_title').attr('title'); _group = 1; $('.cd-accordion-menu').empty(); } this.reader_file_dir_menu({ el: _el, path: _paths, group: _group, }, function(res) { if (callback) callback(res); }); }, // 恢复历史文件事件 event_ecovery_file: function(that) { var _path = $(that).attr('data-path'), _history = new Number($(that).attr('data-history')), _this = this; var loadT = layer.open({ type: 1, //area: ['400px', '180px'], title: lan.public.restore_history_files, content: '<div class="ace-clear-form">\ <div class="clear-icon"></div>\ <div class="clear-title">' + lan.public.confirm_restore_file + ' <span class="size_ellipsis" style="max-width:150px;vertical-align: top;" title="' + bt.format_data(_history) + '">' + bt.format_data(_history) + '</span>?</div>\ <div class="clear-tips">' + lan.public.confirm_restore_file1 + '</div>\ <div class="ace-clear-btn" style="">\ <button type="button" class="btn btn-sm btn-default" style="margin-right:10px;" data-type="1">' + lan.public.cancel + '</button>\ <button type="button" class="btn btn-sm btn-success" data-type="0">' + lan.public.restore_history_files + '</button>\ </div>\ </div>', success: function(layero, index) { $('.ace-clear-btn .btn').click(function() { var _type = $(this).attr('data-type'); switch (_type) { case '0': _this.recovery_file_history({ filename: _path, history: _history }, function(res) { layer.close(index); layer.msg(res.status ? lan.public.restore_history_files + " " + lan.public.success : lan.public.restore_history_files + " " + lan.public.fail, { icon: res.status ? 1 : 2 }); if (res.status) { if (_this.editor['ace_editor_' + _this.ace_active].historys_file) { _this.removeEditor(_this.ace_active); } if ($('.ace_conter_menu>[title="' + _path + '"]').length > 0) { $('.ace_header .refreshs').click(); layer.close(_this.layer_view); } } }); break; case '1': layer.close(index); break; } }); } }); }, // 判断是否为历史文件 is_file_history: function(_item) { if (_item.historys_file) { $('.ace_conter_tips').show(); $('#ace_editor_' + _item.id).css('bottom', '50px'); $('.ace_conter_tips .tips').html(lan.public.read_only_file + _item.path + ', ' + lan.public.history_v + ' [ ' + bt.format_data(new Number(_item.historys_active)) + ' ]<a href="javascript:;" class="ml35 btlink" style="margin-left:35px" data-path="' + _item.path + '" data-history="' + _item.historys_active + '">' + lan.public.restore_history + '</a>'); } else { $('.ace_conter_tips').hide(); } }, // 判断文件是否打开 is_file_open: function(path, callabck) { var is_state = false for (var i = 0; i < this.pathAarry.length; i++) { if (path === this.pathAarry[i]) is_state = true } if (callabck) { callabck(is_state); } else { return is_state; } }, // 恢复文件历史 recovery_file_history: function(obj, callback) { var loadT = layer.msg(lan.public.recover_file, { time: 0, icon: 16, shade: [0.3, '#000'] }); $.post("/files?action=re_history", { filename: obj.filename, history: obj.history }, function(res) { layer.close(loadT); if (callback) callback(res); }); }, // 获取文件列表 get_file_dir_list: function(obj, callback) { var loadT = layer.msg(lan.public.get_file_contents, { time: 0, icon: 16, shade: [0.3, '#000'] }), _this = this; if(obj['p'] === undefined) obj['p'] = 1; if(obj['showRow'] === undefined) obj['showRow'] = 200; if(obj['sort'] === undefined) obj['sort'] = 'name'; if(obj['reverse'] === undefined) obj['reverse'] = 'False'; if(obj['search'] === undefined) obj['search'] = ''; if(obj['all'] === undefined) obj['all'] = 'False'; $.post("/files?action=GetDir&tojs=GetFiles",{p:obj.p,showRow:obj.showRow,sort:obj.sort,reverse:obj.reverse,path:obj.path,search:obj.search}, function(res) { layer.close(loadT); if (callback) callback(res); }); }, // 获取文件列表 get_file_dir_list:function(obj,callback){ var loadT = layer.msg('正在获取文件内容,请稍后...',{time: 0,icon: 16,shade: [0.3, '#000']}),_this = this; if(obj['p'] === undefined) obj['p'] = 1; if(obj['showRow'] === undefined) obj['showRow'] = 200; if(obj['sort'] === undefined) obj['sort'] = 'name'; if(obj['reverse'] === undefined) obj['reverse'] = 'False'; if(obj['search'] === undefined) obj['search'] = ''; if(obj['all'] === undefined) obj['all'] = 'False'; $.post("/files?action=GetDir&tojs=GetFiles",{p:obj.p,showRow:obj.showRow,sort:obj.sort,reverse:obj.reverse,path:obj.path,search:obj.search}, function(res) { layer.close(loadT); if(callback) callback(res); }); }, // 获取历史文件 get_file_history: function(obj, callback) { var loadT = layer.msg(lan.public.get_file_history, { time: 0, icon: 16, shade: [0.3, '#000'] }), _this = this; $.post("/files?action=read_history", { filename: obj.filename, history: obj.history }, function(res) { layer.close(loadT); if (callback) callback(res); }); }, // 渲染文件列表 reader_file_dir_menu: function(obj, callback) { var _path = getCookie('Path'), _this = this; if (obj === undefined) obj = {} if (obj['el'] === undefined) obj['el'] = '.cd-accordion-menu'; if (obj['group'] === undefined) obj['group'] = 1; if (obj['p'] === undefined) obj['p'] = 1; if (obj['path'] === undefined) obj['path'] = _path; if (obj['is_empty'] === undefined) obj['is_empty'] = false; if(obj['search'] === undefined) obj['search'] = ''; if(obj['all'] === undefined) obj['all'] = 'False'; this.get_file_dir_list({p:obj.p,path:obj.path,search:obj.search,all:obj.all},function (res){ var _dir = res.DIR, _files = res.FILES, _dir_dom = '', _files_dom = '', _html = ''; _this.menu_path = res.PATH; for (var i = 0; i < _dir.length; i++) { var _data = _dir[i].split(';'); if (_data[0] === '__pycache__') continue; _dir_dom += '<li class="has-children children_' + obj.group + '" title="' + (obj.path + '/' + _data[0]) + '" data-menu-path="' + (obj.path + '/' + _data[0]) + '" data-size="' + (_data[1]) + '">\ <div class="file_fold group_' + obj.group + '" data-group="' + obj.group + '" data-file="Dir">\ <span class="glyphicon glyphicon-menu-right"></span>\ <span class="file_title"><i class="folder-icon"></i><span>' + _data[0] + '</span></span>\ </div>\ <ul data-group=""></ul>\ <span class="has_children_separator"></span>\ </li>'; } for (var j = 0; j < _files.length; j++) { var _data = _files[j].split(';'); if (_data[0].indexOf('.pyc') !== -1) continue; _files_dom += '<li class="has-children" title="' + (obj.path + '/' + _data[0]) + '" data-menu-path="' + (obj.path + '/' + _data[0]) + '" data-size="' + (_data[1]) + '" data-suffix="' + _this.get_file_suffix(_data[0]) + '">\ <div class="file_fold group_' + obj.group + '" data-group="' + obj.group + '" data-file="Files">\ <span class="file_title"><i class="' + _this.get_file_suffix(_data[0]) + '-icon"></i><span>' + _data[0] + '</span></span>\ </div>\ </li>'; } // if (res.PATH !== '/' && obj['group'] === 1) { // _html = '<li class="has-children upper_level" data-menu-path="' + _this.get_file_dir(res.PATH, 1) + '"><span>'+lan.public.up_level+'</span></li>' // $('.upper_level').attr('data-menu-path', _this.get_file_dir(res.PATH, 1)); // $('.ace_catalogue_title').html(lan.public.dir + ': ' + res.PATH).attr('title', res.PATH); // } if(res.PATH !== '/' && obj['group'] === 1){ $('.upper_level').attr('data-menu-path',_this.get_file_dir(res.PATH,1)); $('.ace_catalogue_title').html(lan.public.dir + ': ' + res.PATH).attr('title',res.PATH); $('.upper_level').html('<i class="glyphicon glyphicon-share-alt" aria-hidden="true"></i>Back') }else if(res.PATH === '/'){ $('.upper_level').html('<i class="glyphicon glyphicon-hdd" aria-hidden="true"></i>Root') } if (obj.is_empty) $(obj.el).empty(); $(obj.el).append(_html + _dir_dom + _files_dom); if (callback) callback(res); }); }, // 获取文件目录位置 get_file_dir: function(path, num) { var _arry = path.split('/'); if (path === '/') return '/'; _arry.splice(-1, num); return _arry == '' ? '/' : _arry.join('/'); }, // 获取文件全称 get_file_suffix: function(fileName) { var filenames = fileName.match(/\.([0-9A-z]*)$/); filenames = (filenames == null ? 'text' : filenames[1]); for (var name in this.supportedModes) { var data = this.supportedModes[name], suffixs = data[0].split('|'), filename = name.toLowerCase(); for (var i = 0; i < suffixs.length; i++) { if (filenames == suffixs[i]) return filename; } } return 'text'; }, // // 设置编辑器视图 // setEditorView: function() { // // var page_height = $('.aceEditors').height(); // // var ace_header = $('.ace_header').height(); // // var ace_conter_menu = $('.ace_conter_menu').height(); // // var ace_conter_toolbar = $('.ace_conter_toolbar').height(); // // var _height = page_height - ace_header - ace_conter_menu; // // //var _height= $('.aceEditors').height()-$('.ace_conter_menu').height()-$('.ace_header').height(); // // //$('.ace_conter_editor').height(_height); // // $('.ace_conter_editor').height(_height); // var page_height = $('.aceEditors').height(); // var aceEditorHeight = $('.aceEditors').height(),_this = this; // var ace_conter_menu = $('.ace_conter_menu').height(); // var ace_conter_toolbar = $('.ace_conter_toolbar').height(); // var _height = page_height - ($('.pull-down .glyphicon').hasClass('glyphicon-menu-down')?35:0) - ace_conter_menu - ace_conter_toolbar - 42; // $('.ace_conter_editor').height(_height); // if(aceEditorHeight == $('.aceEditors').height()){ // if(_this.ace_active) _this.editor[_this.ace_active].ace.resize(); // }else { // aceEditorHeight = $('.aceEditors').height(); // } // $('.aceEditors').height(); // }, // 设置编辑器视图 setEditorView:function () { var aceEditorHeight = $('.aceEditors').height(),_this = this; var autoAceHeight = setInterval(function(){ var page_height = $('.aceEditors').height(); var ace_conter_menu = $('.ace_conter_menu').height(); var ace_conter_toolbar = $('.ace_conter_toolbar').height(); var _height = page_height - ($('.pull-down .glyphicon').hasClass('glyphicon-menu-down')?35:0) - ace_conter_menu - ace_conter_toolbar - 42; $('.ace_conter_editor').height(_height); if(aceEditorHeight == $('.aceEditors').height()){ clearInterval(autoAceHeight); if(_this.ace_active != '') _this.editor['ace_editor_'+_this.ace_active].ace.resize(); }else { aceEditorHeight = $('.aceEditors').height(); } },200); }, // 获取文件编码列表 getEncodingList: function(type) { var _option = ''; for (var i = 0; i < this.encodingList.length; i++) { var item = this.encodingList[i] == type.toUpperCase(); _option += '<li data- data-value="' + this.encodingList[i] + '" ' + (item ? 'class="active"' : '') + '>' + this.encodingList[i] + (item ? '<span class="icon"><i class="glyphicon glyphicon-ok" aria-hidden="true"></i></span>' : '') + '</li>'; } $('.menu-encoding ul').html(_option); }, // 获取文件关联列表 getRelevanceList: function(fileName) { var _option = '', _top = 0, fileType = this.getFileType(fileName), _set_tops = 0; for (var name in this.supportedModes) { var data = this.supportedModes[name], item = (name == fileType.name); _option += '<li data-height="' + _top + '" data-rule="' + this.supportedModes[name] + '" data-value="' + name + '" ' + (item ? 'class="active"' : '') + '>' + (this.nameOverrides[name] || name) + (item ? '<span class="icon"><i class="glyphicon glyphicon-ok" aria-hidden="true"></i></span>' : '') + '</li>' if (item) _set_tops = _top _top += 35; } $('.menu-files ul').html(_option); $('.menu-files ul').scrollTop(_set_tops); }, // 搜索文件关联 searchRelevance: function(search) { if (search == undefined) search = ''; $('.menu-files ul li').each(function(index, el) { var val = $(this).attr('data-value').toLowerCase(), rule = $(this).attr('data-rule'), suffixs = rule.split('|'), _suffixs = false; search = search.toLowerCase(); for (var i = 0; i < suffixs.length; i++) { if (suffixs[i].indexOf(search) > -1) _suffixs = true } if (search == '') { $(this).removeAttr('style'); } else { if (val.indexOf(search) == -1) { $(this).attr('style', 'display:none'); } else { $(this).removeAttr('style'); } if (_suffixs) $(this).removeAttr('style') } }); }, // 设置编码类型 setEncodingType: function(encode) { this.getEncodingList('UTF-8'); $('.menu-encoding ul li').click(function(e) { layer.msg(lan.public.set_file_encoding + ': ' + $(this).attr('data-value')); $(this).addClass('active').append('<span class="icon"><i class="glyphicon glyphicon-ok" aria-hidden="true"></i></span>').siblings().removeClass('active').find('span').remove(); }); }, // 更新状态栏 currentStatusBar: function(id) { var _editor = this.editor['ace_editor_' + id]; $('.ace_conter_toolbar [data-type="history"]').html(lan.public.history_v + ': <i>' + (_editor.historys.length === 0 ? lan.public.empty : _editor.historys.length) + '</i>'); $('.ace_conter_toolbar [data-type="path"]').html(lan.public.dir + ': <i title="' + _editor.path + '">' + _editor.path + '</i>'); $('.ace_conter_toolbar [data-type="tab"]').html(_editor.softTabs ? lan.public.space + ': <i>' + _editor.tabSize + '</i>' : lan.public.tab_length + ': <i>' + _editor.tabSize + '</i>'); $('.ace_conter_toolbar [data-type="encoding"]').html(lan.public.encoding + ': <i>' + _editor.encoding.toUpperCase() + '</i>'); $('.ace_conter_toolbar [data-type="lang"]').html(lan.public.lan + ': <i>' + _editor.type + '</i>'); $('.ace_conter_toolbar span').attr('data-id', id); $('.file_fold').removeClass('bg'); $('[data-menu-path="' + (aceEditor.editor['ace_editor_' + id].path) + '"]').find('.file_fold').addClass('bg'); if (_editor.historys_file) { $('.ace_conter_toolbar [data-type="history"]').hide(); } else { $('.ace_conter_toolbar [data-type="history"]').show(); } _editor.ace.resize(); }, // currentStatusBar: function(id) { // var _item = this.editor['ace_editor_' + id]; // if(_item == undefined){ // this.removerStatusBar(); // return false; // } // $('.ace_conter_toolbar [data-type="cursor"]').html(lan.public.row + '<i class="cursor-row">1</i>,'+ lan.public.column +'<i class="cursor-line">0</i>'); // $('.ace_conter_toolbar [data-type="history"]').html(lan.public.history_v + ': <i>' + (_item.historys.length === 0 ? lan.public.empty : _item.historys.length) + '</i>'); // $('.ace_conter_toolbar [data-type="path"]').html(lan.public.dir + ': <i title="' + _item.path + '">' + _item.path + '</i>'); // $('.ace_conter_toolbar [data-type="tab"]').html(_item.softTabs ? lan.public.space + ': <i>' + _item.tabSize + '</i>' : lan.public.tab_length + ': <i>' + _item.tabSize + '</i>'); // $('.ace_conter_toolbar [data-type="encoding"]').html(lan.public.encoding + ': <i>' + _item.encoding.toUpperCase() + '</i>'); // $('.ace_conter_toolbar [data-type="lang"]').html(lan.public.lan + ': <i>' + _item.type + '</i>'); // $('.ace_conter_toolbar span').attr('data-id', id); // $('.file_fold').removeClass('bg'); // $('[data-menu-path="' + (_item.path) + '"]').find('.file_fold').addClass('bg'); // if (_item.historys_file) { // $('.ace_conter_toolbar [data-type="history"]').hide(); // } else { // $('.ace_conter_toolbar [data-type="history"]').show(); // } // _item.ace.resize(); // }, // 清除状态栏 removerStatusBar: function() { $('.ace_conter_toolbar [data-type="history"]').html(''); $('.ace_conter_toolbar [data-type="path"]').html(''); $('.ace_conter_toolbar [data-type="tab"]').html(''); $('.ace_conter_toolbar [data-type="cursor"]').html(''); $('.ace_conter_toolbar [data-type="encoding"]').html(''); $('.ace_conter_toolbar [data-type="lang"]').html(''); }, // 创建ACE编辑器-对象 creationEditor: function(obj, callabck) { var _this = this; $('#ace_editor_' + obj.id).text(obj.data || ''); $('.ace_conter_editor .ace_editors').css('fontSize', _this.aceConfig.aceEditor.fontSize); if (this.editor == null) this.editor = {}; this.editor['ace_editor_' + obj.id] = { ace: ace.edit("ace_editor_" + obj.id, { theme: "ace/theme/" + _this.aceConfig.aceEditor.editorTheme, //主题 mode: "ace/mode/" + (obj.fileName != undefined ? obj.mode : 'text'), // 语言类型 wrap: _this.aceConfig.aceEditor.wrap, showInvisibles: _this.aceConfig.aceEditor.showInvisibles, showPrintMargin: false, enableBasicAutocompletion: true, enableSnippets: _this.aceConfig.aceEditor.enableSnippets, enableLiveAutocompletion: _this.aceConfig.aceEditor.enableLiveAutocompletion, useSoftTabs: _this.aceConfig.aceEditor.useSoftTabs, tabSize: _this.aceConfig.aceEditor.tabSize, keyboardHandler: 'sublime', readOnly: obj.readOnly === undefined ? false : obj.readOnly }), //ACE编辑器对象 id: obj.id, wrap: _this.aceConfig.aceEditor.wrap, //是否换行 path: obj.path, tabSize:_this.aceConfig.aceEditor.tabSize, softTabs:_this.aceConfig.aceEditor.useSoftTabs, fileName: obj.fileName, enableSnippets: true, //是否代码提示 encoding: (obj.encoding != undefined ? obj.encoding : 'utf-8'), //编码类型 mode: (obj.fileName != undefined ? obj.mode : 'text'), //语言类型 type: obj.type, fileType: 0, //文件状态 historys: obj.historys, historys_file: obj.historys_file === undefined ? false : obj.historys_file, historys_active: obj.historys_active === '' ? false : obj.historys_active }; var ACE = this.editor['ace_editor_' + obj.id]; ACE.ace.moveCursorTo(0, 0); //设置鼠标焦点 ACE.ace.resize(); //设置自适应 ACE.ace.commands.addCommand({ name: lan.public.save, bindKey: { win: 'Ctrl-S', mac: 'Command-S' }, exec: function(editor) { _this.saveFileMethod(ACE); }, readOnly: false // 如果不需要使用只读模式,这里设置false }); // 获取光标位置 ACE.ace.getSession().selection.on('changeCursor', function(e) { var _cursor = ACE.ace.selection.getCursor(); $('[data-type="cursor"]').html(lan.public.row + '<i class="cursor-row">' + (_cursor.row + 1) + '</i>,' + lan.public.column + '<i class="cursor-line">' + _cursor.column + '</i>'); //$('.ace_toolbar_menu').hide(); }); // 触发修改内容 ACE.ace.getSession().on('change', function(editor) { $('.item_tab_' + ACE.id + ' .icon-tool').addClass('glyphicon-exclamation-sign').removeClass('glyphicon-remove').attr('data-file-state', '1'); ACE.fileType = 1; $('.ace_toolbar_menu').hide(); }); this.currentStatusBar(ACE.id); this.is_file_history(ACE); }, // 保存文件方法 saveFileMethod: function(ACE) { this.saveFileBody({ path: ACE.path, data: ACE.ace.getValue(), encoding: ACE.encoding }, function(res) { layer.msg(res.msg, { icon: res.status ? 1 : 2 }); ACE.fileType = 0; $('.item_tab_' + ACE.id + ' .icon-tool').attr('data-file-state', '0').removeClass('glyphicon-exclamation-sign').addClass('glyphicon-remove'); }); }, // 获取文件模型 getFileType: function(fileName) { var filenames = fileName.match(/\.([0-9A-z]*)$/); filenames = (filenames == null ? 'text' : filenames[1]); for (var name in this.supportedModes) { var data = this.supportedModes[name], suffixs = data[0].split('|'), filename = name.toLowerCase(); for (var i = 0; i < suffixs.length; i++) { if (filenames == suffixs[i]) { return { name: name, mode: filename }; } } } return { name: 'Text', mode: 'text' }; }, // 新建编辑器视图-方法 // addEditorView: function() { // var _index = this.editorLength, // _id = bt.get_random(8); // $('.ace_conter_menu .item').removeClass('active'); // $('.ace_conter_editor .ace_editors').removeClass('active'); // $('.ace_conter_menu .ace_editor_add').before('<div class="item active item_tab_' + _id + '" data-type="text" data-id="' + _id + '" data-index="' + _index + '">\ // <span class="icon_file"><i class="fa fa-code" aria-hidden="true"></i></span>\ // <span>Untitled-' + _index + '</span>\ // <i class="fa fa-circle icon-tool" aria-hidden="true" data-file-state="1" data-title="Untitled-' + _index + '"></i>\ // </div>'); // $('.ace_conter_editor').append('<div id="ace_editor_' + _id + '" class="ace_editors active"></div>'); // $('#ace_editor_' + _id).siblings().removeClass('active'); // this.creationEditor({ id: _id }); // this.editorLength = this.editorLength + 1; // }, addEditorView: function (type,conifg) { if(type == undefined) type = 0 var _index = this.editorLength,_id = bt.get_random(8); $('.ace_conter_menu .item').removeClass('active'); $('.ace_conter_editor .ace_editors').removeClass('active'); $('.ace_conter_menu').append('<li class="item active item_tab_'+_id+'" data-type="shortcutKeys" data-id="'+ _id +'" >\ <div class="ace_item_box">\ <span class="icon_file"><i class="text-icon"></i></span>\ <span>'+ (type?conifg.title:('Untitled-'+ _index)) +'</span>\ <i class="glyphicon icon-tool glyphicon-remove" aria-hidden="true" data-file-state="0" data-title="'+ (type?conifg.title:('Untitled-'+ _index)) +'"></i>\ </div>\ </li>'); $('#ace_editor_' + _id).siblings().removeClass('active'); $('.ace_conter_editor').append('<div id="ace_editor_'+_id+'" class="ace_editors active">'+ (type?aceShortcutKeys.innerHTML:'') +'</div>'); switch(type){ case 0: this.creationEditor({ id: _id }); this.editorLength = this.editorLength + 1; break; case 1: this.removerStatusBar(); this.editorLength = this.editorLength + 1; break; } }, // 删除编辑器视图-方法 removeEditor: function (id) { if(id == undefined) id = this.ace_active; if ($('.item_tab_' + id).next('.item').length != 0 && this.editorLength != 1) { $('.item_tab_' + id).next('.item').click(); } else if($('.item_tab_' + id).prev('.item').length != 0 && this.editorLength != 1){ $('.item_tab_' + id).prev('.item').click(); } $('.item_tab_' + id).remove(); $('#ace_editor_' + id).remove(); this.editorLength --; if(this.editor['ace_editor_'+id] == undefined) return false; for(var i=0;i<this.pathAarry.length;i++){ if(this.pathAarry[i] == this.editor['ace_editor_'+id].path){ this.pathAarry.splice(i,1); } } if(!this.editor['ace_editor_'+id].historys_file) $('[data-menu-path="'+ (this.editor['ace_editor_'+id].path) +'"]').find('.file_fold').removeClass('active bg'); delete this.editor['ace_editor_'+id]; if(this.editorLength === 0){ this.ace_active = ''; this.pathAarry = []; this.removerStatusBar(); }else{ this.currentStatusBar(this.ace_active); } if(this.ace_active != '') this.is_file_history(this.editor['ace_editor_'+this.ace_active]); }, // 打开历史文件文件-方法 openHistoryEditorView: function (obj,callback) { // 文件类型(type,列如:JavaScript) 、文件模型(mode,列如:text)、文件标识(id,列如:x8AmsnYn)、文件编号(index,列如:0)、文件路径 (path,列如:/www/root/) var _this = this,path = obj.filename,paths = path.split('/'),_fileName = paths[paths.length - 1],_fileType = this.getFileType(_fileName),_type = _fileType.name,_mode = _fileType.mode,_id = bt.get_random(8),_index = this.editorLength; this.get_file_history({filename:obj.filename,history:obj.history}, function (res) { _this.pathAarry.push(path); $('.ace_conter_menu .item').removeClass('active'); $('.ace_conter_editor .ace_editors').removeClass('active'); $('.ace_conter_menu').append('<li class="item active item_tab_' + _id +'" title="'+ path +'" data-type="'+ _type +'" data-mode="'+ _mode +'" data-id="'+ _id +'" data-fileName="'+ _fileName +'">'+ '<div class="ace_item_box">'+ '<span class="icon_file"><img src="/static/img/ico-history.png"></span><span title="'+ path + lan.public.history_v + ' [ '+ bt.format_data(obj.history) +' ]' +'">' + _fileName +'</span>'+ '<i class="glyphicon glyphicon-remove icon-tool" aria-hidden="true" data-file-state="0" data-title="' + _fileName + '"></i>'+ '</div>'+ '</li>'); $('.ace_conter_editor').append('<div id="ace_editor_'+_id +'" class="ace_editors active"></div>'); $('[data-paths="'+ path +'"]').find('.file_fold').addClass('active bg'); _this.ace_active = _id; _this.editorLength = _this.editorLength + 1; _this.creationEditor({id: _id,fileName: _fileName,path: path,mode:_mode,encoding: res.encoding,data: res.data,type:_type,historys:res.historys,readOnly:true,historys_file:true,historys_active:obj.history}); if(callback) callback(res); }); }, // 打开编辑器文件-方法 // openEditorView: function(path, callback) { // if (path == undefined) return false; // // 文件类型(type,列如:JavaScript) 、文件模型(mode,列如:text)、文件标识(id,列如:x8AmsnYn)、文件编号(index,列如:0)、文件路径 (path,列如:/www/root/) // var _this = this, // paths = path.split('/'), // _fileName = paths[paths.length - 1], // _fileType = this.getFileType(_fileName), // _type = _fileType.name, // _mode = _fileType.mode, // _id = bt.get_random(8), // _index = this.editorLength; // _this.is_file_open(path, function(is_state) { // if (is_state) { // $('.ace_conter_menu').find('[title="' + path + '"]').click(); // } else { // _this.getFileBody({ path: path }, function(res) { // _this.pathAarry.push(path); // $('.ace_conter_menu .item').removeClass('active'); // $('.ace_conter_editor .ace_editors').removeClass('active'); // $('.ace_conter_menu .ace_editor_add').before('<div class="item active item_tab_' + _id + '" title="' + path + '" data-type="' + _type + '" data-mode="' + _mode + '" data-id="' + _id + '" data-index="' + _index + '" data-fileName="' + _fileName + '">\ // <span class="icon_file"><i class="' + _mode + '-icon"></i></span><span title="' + path + '">' + _fileName + '</span>\ // <i class="glyphicon glyphicon-remove icon-tool" aria-hidden="true" data-file-state="0" data-title="' + _fileName + '"></i>\ // </div>'); // $('.ace_conter_editor').append('<div id="ace_editor_' + _id + '" class="ace_editors active"></div>'); // $('[data-menu-path="' + path + '"]').find('.file_fold').addClass('active bg'); // _this.ace_active = _id; // _this.editorLength = _this.editorLength + 1; // _this.creationEditor({ id: _id, fileName: _fileName, path: path, mode: _mode, encoding: res.encoding, data: res.data, type: _type, historys: res.historys }); // if (callback) callback(res); // }); // } // }); // $('.ace_toolbar_menu').hide(); // }, openEditorView: function (path,callback) { if(path == undefined) return false; // 文件类型(type,列如:JavaScript) 、文件模型(mode,列如:text)、文件标识(id,列如:x8AmsnYn)、文件编号(index,列如:0)、文件路径 (path,列如:/www/root/) var _this = this,paths = path.split('/'),_fileName = paths[paths.length - 1],_fileType = this.getFileType(_fileName),_type = _fileType.name,_mode = _fileType.mode,_id = bt.get_random(8),_index = this.editorLength; _this.is_file_open(path,function(is_state){ if(is_state){ $('.ace_conter_menu').find('[title="'+ path +'"]').click(); }else{ _this.getFileBody({path: path}, function (res) { _this.pathAarry.push(path); $('.ace_conter_menu .item').removeClass('active'); $('.ace_conter_editor .ace_editors').removeClass('active'); $('.ace_conter_menu').append('<li class="item active item_tab_' + _id +'" title="'+ path +'" data-type="'+ _type +'" data-mode="'+ _mode +'" data-id="'+ _id +'" data-fileName="'+ _fileName +'">'+ '<div class="ace_item_box">'+ '<span class="icon_file"><i class="'+ _mode +'-icon"></i></span><span title="'+ path +'">' + _fileName + '</span>'+ '<i class="glyphicon glyphicon-remove icon-tool" aria-hidden="true" data-file-state="0" data-title="' + _fileName + '"></i>'+ '</div>'+ '</li>'); $('.ace_conter_editor').append('<div id="ace_editor_'+_id +'" class="ace_editors active" style="font-size:'+ aceEditor.aceConfig.aceEditor.fontSize +'px"></div>'); $('[data-menu-path="'+ path +'"]').find('.file_fold').addClass('active bg'); _this.ace_active = _id; _this.editorLength = _this.editorLength + 1; _this.creationEditor({id: _id,fileName: _fileName,path: path,mode:_mode,encoding: res.encoding,data: res.data,type:_type,historys:res.historys}); if(callback) callback(res); }); } }); $('.ace_toolbar_menu').hide(); }, // 获取收藏夹列表-方法 getFavoriteList: function() {}, // 获取文件列表-请求 getFileList: function() {}, // 获取文件内容-请求 getFileBody: function(obj, callback) { var loadT = layer.msg(lan.public.get_file_contents, { time: 0, icon: 16, shade: [0.3, '#000'] }), _this = this; $.post("/files?action=GetFileBody", "path=" + encodeURIComponent(obj.path), function(res) { layer.close(loadT); if (!res.status) { if (_this.editorLength == 0) layer.closeAll(); layer.msg(res.msg, { icon: 2 }); return false; } else { if (!aceEditor.isAceView) { var _path = obj.path.split('/'); layer.msg(lan.public.opend_file + ' [' + (_path[_path.length - 1]) + ']'); } } if (callback) callback(res); }); }, // 保存文件内容-请求 // saveFileBody: function(obj, callback) { // var loadT = layer.msg(lan.public.save_file_content, { time: 0, icon: 16, shade: [0.3, '#000'] }); // $.post("/files?action=SaveFileBody", { // data:obj.data, // encoding:obj.encoding.toLowerCase(), // path:obj.path // }, function(res) { // layer.close(loadT); // if (callback) callback(res) // }); // }, saveFileBody: function (obj,success,error) { $.ajax({ type:'post', url:'/files?action=SaveFileBody', timeout: 7000, //设置保存超时时间 data:{ data:obj.data, encoding:obj.encoding.toLowerCase(), path:obj.path }, success:function(rdata){ if(rdata.status){ if(success) success(rdata) }else{ if(error) error(rdata) } if(!obj.tips) layer.msg(rdata.msg,{icon:rdata.status?1:2}); }, error:function(err){ if(error) error(err) } }); }, saveAceConfig: function(data,callback){ var loadT = layer.msg(lan.public.save_ace_config,{time: 0,icon: 16,shade: [0.3, '#000']}),_this = this; this.saveFileBody({ path:'/www/server/panel/BTPanel/static/ace/ace.editor.config.json', data:JSON.stringify(data), encoding:'utf-8', tips:true, },function(rdata){ layer.close(loadT); _this.setStorage('aceConfig',JSON.stringify(data)); if(callback) callback(rdata); }); }, // 获取配置文件 getEditorConfig: function(callback) { var loadT = layer.msg(lan.public.get_ace_config,{time: 0,icon: 16,shade: [0.3, '#000']}),_this = this; this.getFileBody({path:'/www/server/panel/BTPanel/static/ace/ace.editor.config.json'},function(rdata){ layer.close(loadT); _this.setStorage('aceConfig',JSON.stringify(rdata.data)); if(callback) callback(JSON.parse(rdata.data)); }); }, getAceConfig:function(callback){ var loadT = layer.msg(lan.public.get_ace_config,{time: 0,icon: 16,shade: [0.3, '#000']}),_this = this; this.getFileBody({path:'/www/server/panel/BTPanel/static/ace/ace.editor.config.json'},function(rdata){ layer.close(loadT); _this.setStorage('aceConfig',JSON.stringify(rdata.data)); if(callback) callback(JSON.parse(rdata.data)); }); }, // 递归保存文件 saveAllFileBody: function(arry, num, callabck) { var _this = this; if (typeof num == "function") { callabck = num; num = 0; } else if (typeof num == "undefined") { num = 0; } if (num == arry.length) { if (callabck) callabck(); layer.msg(lan.public.save_all, { icon: 1 }); return false; } aceEditor.saveFileBody({ path: arry[num].path, data: arry[num].data, encoding: arry[num].encoding }, function() { num = num + 1; aceEditor.saveAllFileBody(arry, num, callabck); }); } } function openEditorView(type, path) { var paths = path.split('/'), _fileName = paths[paths.length - 1], _aceTmplate = document.getElementById("aceTmplate").innerHTML; _aceTmplate = _aceTmplate.replace(/\<\\\/script\>/g, '</script>'); if (aceEditor.editor !== null) { if (aceEditor.isAceView == false) { aceEditor.isAceView = true; $('.aceEditors .layui-layer-max').click() } aceEditor.openEditorView(path); return false; } var r = layer.open({ type: 1, maxmin: true, shade: false, area: ['80%', '80%'], title: lan.public.online_text_editor, skin: 'aceEditors', zIndex: 19999, content: _aceTmplate, success: function(layero, index) { function set_edit_file() { // aceEditor.layer_view = index; aceEditor.ace_active = ''; aceEditor.eventEditor(); $('#ace_conter').addClass(aceEditor.editorTheme); ace.require("/ace/ext/language_tools"); ace.config.set("modePath", "/static/ace"); ace.config.set("workerPath", "/static/ace"); ace.config.set("themePath", "/static/ace"); aceEditor.openEditorView(path); // $('.aceEditors .layui-layer-min').click(function(e) { // aceEditor.isAceView = false; // setTimeout(function() { // var _id = $('.ace_conter_menu .active').attr('data-id'); // aceEditor.editor['ace_editor_' + _id].ace.resize(); // }, 105); // }); // $('.aceEditors .layui-layer-max').click(function(e) { // setTimeout(function() { // aceEditor.setEditorView(); // var _id = $('.ace_conter_menu .active').attr('data-id'); // aceEditor.editor['ace_editor_' + _id].ace.resize(); // }, 105); // }); $('.aceEditors .layui-layer-min').click(function (e){ aceEditor.setEditorView(); }); $('.aceEditors .layui-layer-max').click(function (e){ aceEditor.setEditorView(); }); } var aceConfig = aceEditor.getStorage('aceConfig'); if(aceConfig == null){ // 获取编辑器配置 aceEditor.getAceConfig(function(res){ aceEditor.aceConfig = res; // 赋值配置参数 set_edit_file(); }); }else{ aceEditor.aceConfig = JSON.parse(aceConfig); typeof aceEditor.aceConfig == 'string'?aceEditor.aceConfig = JSON.parse(aceEditor.aceConfig):'' set_edit_file(); } }, cancel: function() { for (var item in aceEditor.editor) { if (aceEditor.editor[item].fileType == 1) { layer.open({ type: 1, area: ['400px', '180px'], title: lan.public.save_tips, content: '<div class="ace-clear-form">\ <div class="clear-icon"></div>\ <div class="clear-title">' + lan.public.save_tips1 + '</div>\ <div class="clear-tips">' + lan.public.save_tips2 + '</div>\ <div class="ace-clear-btn" style="">\ <button type="button" class="btn btn-sm btn-default" style="float:left" data-type="2">' + lan.public.dont_save + '</button>\ <button type="button" class="btn btn-sm btn-default" style="margin-right:10px;" data-type="1">' + lan.public.cancel + '</button>\ <button type="button" class="btn btn-sm btn-success" data-type="0">' + lan.public.save + '</button>\ </div>\ </div>', success: function(layers, indexs) { $('.ace-clear-btn button').click(function() { var _type = $(this).attr('data-type'); switch (_type) { case '2': aceEditor.editor = null; layer.closeAll(); break; case '1': layer.close(indexs); break; case '0': var _arry = [], editor = aceEditor['editor']; for (var item in editor) { _arry.push({ path: editor[item]['path'], data: editor[item]['ace'].getValue(), encoding: editor[item]['encoding'], }) } aceEditor.saveAllFileBody(_arry, function() { $('.ace_conter_menu>.item').each(function(el, indexx) { var _id = $(this).attr('data-id'); $(this).find('i').removeClass('glyphicon-exclamation-sign').addClass('glyphicon-remove').attr('data-file-state', '0') aceEditor.editor['ace_editor_' + _id].fileType = 0; }); aceEditor.editor = null; aceEditor.pathAarry = []; layer.closeAll(); }); break; } }); } }); return false; } } }, end:function(){ aceEditor.ace_active = ''; aceEditor.editor = null; aceEditor.pathAarry = []; aceEditor.menu_path = ''; } }); } /** * AES加密 * @param {string} s_text 等待加密的字符串 * @param {string} s_key 16位密钥 * @param {array} ctx 可选,默认为 { mode: CryptoJS.mode.ECB,padding: CryptoJS.pad.ZeroPadding } * @return {string} */ function aes_encrypt(s_text,s_key,ctx){ if(ctx == undefined) ctx = { mode: CryptoJS.mode.ECB,padding: CryptoJS.pad.ZeroPadding } var key = CryptoJS.enc.Utf8.parse(s_key); var encrypt_data = CryptoJS.AES.encrypt(s_text,key,ctx); return encrypt_data.toString(); } /** * AES解密 * @param {string} s_text 等待解密的密文 * @param {string} s_key 16位密钥 * @param {array} ctx 可选,默认为 { mode: CryptoJS.mode.ECB,padding: CryptoJS.pad.ZeroPadding } * @return {string} */ function aes_decrypt(s_text,s_key,ctx){ if(ctx == undefined) ctx = { mode: CryptoJS.mode.ECB,padding: CryptoJS.pad.ZeroPadding } var key = CryptoJS.enc.Utf8.parse(s_key); var decrypt_data = CryptoJS.AES.decrypt(s_text,key,ctx); return decrypt_data.toString(CryptoJS.enc.Utf8); } /** * ajax内容解密 * @param {string} data 加密的响应数据 * @param {string} stype ajax中定义的数据类型 * @return {string} 解密后的响应数据 */ function ajax_decrypt(data,stype){ if(!data) return data; if(data.substring(0,6) == "BT-CRT"){ var token = $("#request_token_head").attr("token") var pwd = token.substring(0,8) + token.substring(40,48) data = aes_decrypt(data.substring(6),pwd); if(stype == undefined){ stype = ''; } if(stype.toLowerCase() != 'json'){ data = JSON.parse(data); } } return data } /** * 格式化form_data数据,并加密 * @param {string} form_data 加密前的form_data数据 * @return {string} 加密后的form_data数据 */ function format_form_data(form_data){ var data_tmp = form_data.split('&'); var form_info = {} var token = $("#request_token_head").attr("token") if(!token) return form_data; var pwd = token.substring(0,8) + token.substring(40,48) for(var i=0;i<data_tmp.length;i++){ var tmp = data_tmp[i].split('='); if(tmp.length < 2) continue // if(!tmp[1]) continue; var val = decodeURIComponent(tmp[1].replace(/\+/g,'%20')); if(val.length > 3){ form_info[tmp[0]] = 'BT-CRT' + aes_encrypt(val,pwd); }else{ form_info[tmp[0]] = val; } } return $.param(form_info); } function ajax_encrypt(request){ if(!this.type || !this.data || !this.contentType) return; if($("#panel_debug").attr("data") == 'True') return; if($("#panel_debug").attr("data-pyversion") == '2') return; if(this.type == 'POST' && this.data.length > 1){ this.data = format_form_data(this.data); } } function ajaxSetup() { var my_headers = {}; var request_token_ele = document.getElementById("request_token_head"); if (request_token_ele) { var request_token = request_token_ele.getAttribute('token'); if (request_token) { my_headers['x-http-token'] = request_token } } request_token_cookie = getCookie('request_token'); if (request_token_cookie) { my_headers['x-cookie-token'] = request_token_cookie } if (my_headers) { $.ajaxSetup({ headers: my_headers, // dataFilter: ajax_decrypt, // beforeSend: ajax_encrypt }); } } ajaxSetup(); function RandomStrPwd(b) { b = b || 32; var c = "AaBbCcDdEeFfGHhiJjKkLMmNnPpRSrTsWtXwYxZyz2345678"; var a = c.length; var d = ""; for (i = 0; i < b; i++) { d += c.charAt(Math.floor(Math.random() * a)) } return d } function repeatPwd(a) { $("#MyPassword").val(RandomStrPwd(a)) } function refresh() { window.location.reload() } function GetBakPost(b) { $(".baktext").hide().prev().show(); var c = $(".baktext").attr("data-id"); var a = $(".baktext").val(); if (a == "") { a = lan.bt.empty; } setWebPs(b, c, a); $("a[data-id='" + c + "']").html(a); $(".baktext").remove() } function setWebPs(b, e, a) { var d = layer.load({ shade: true, shadeClose: false }); var c = "ps=" + a; $.post("/data?action=setPs", "table=" + b + "&id=" + e + "&" + c, function(f) { if (f == true) { if (b == "sites") { getWeb(1) } else { if (b == "ftps") { getFtp(1) } else { getData(1) } } layer.closeAll(); layer.msg(lan.public.edit_ok, { icon: 1 }); } else { layer.msg(lan.public.edit_err, { icon: 2 }); layer.closeAll(); } }); } $(".menu-icon").click(function() { $(".sidebar-scroll").toggleClass("sidebar-close"); $(".main-content").toggleClass("main-content-open"); if ($(".sidebar-close")) { $(".sub-menu").find(".sub").css("display", "none") } }); var Upload, percentage; Date.prototype.format = function(b) { var c = { "M+": this.getMonth() + 1, "d+": this.getDate(), "h+": this.getHours(), "m+": this.getMinutes(), "s+": this.getSeconds(), "q+": Math.floor((this.getMonth() + 3) / 3), S: this.getMilliseconds() }; if (/(y+)/.test(b)) { b = b.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length)) } for (var a in c) { if (new RegExp("(" + a + ")").test(b)) { b = b.replace(RegExp.$1, RegExp.$1.length == 1 ? c[a] : ("00" + c[a]).substr(("" + c[a]).length)) } } return b }; function getLocalTime(a) { a = a.toString(); if (a.length > 10) { a = a.substring(0, 10) } return new Date(parseInt(a) * 1000).format("yyyy/MM/dd hh:mm:ss") } function ToSize(a) { var d = [" B", " KB", " MB", " GB", " TB", " PB"]; var e = 1024; for (var b = 0; b < d.length; b++) { if (a < e) { return (b == 0 ? a : a.toFixed(2)) + d[b] } a /= e } } function ChangePath(d) { setCookie("SetId", d); setCookie("SetName", ""); var c = layer.open({ type: 1, area: "650px", title: lan.bt.dir, closeBtn: 2, shift: 5, shadeClose: false, content: "<div class='changepath'><div class='path-top'><button type='button' class='btn btn-default btn-sm' onclick='BackFile()'><span class='glyphicon glyphicon-share-alt'></span> " + lan.public.return+"</button><div class='place' id='PathPlace'>" + lan.bt.path + ":<span></span></div></div><div class='path-con'><div class='path-con-left'><dl><dt id='changecomlist' onclick='BackMyComputer()'>" + lan.bt.comp + "</dt></dl></div><div class='path-con-right'><ul class='default' id='computerDefautl'></ul><div class='file-list divtable'><table class='table table-hover' style='border:0 none'><thead><tr class='file-list-head'><th width='40%'>" + lan.bt.filename + "</th><th width='20%'>" + lan.bt.etime + "</th><th width='10%'>" + lan.bt.access + "</th><th width='10%'>" + lan.bt.own + "</th><th width='10%'></th></tr></thead><tbody id='tbody' class='list-list'></tbody></table></div></div></div></div><div class='getfile-btn' style='margin-top:0'><button type='button' class='btn btn-default btn-sm pull-left' onclick='CreateFolder()'>" + lan.bt.adddir + "</button><button type='button' class='btn btn-danger btn-sm mr5' onclick=\"layer.close(getCookie('ChangePath'))\">" + lan.public.close + "</button> <button type='button' class='btn btn-success btn-sm' onclick='GetfilePath()'>" + lan.bt.path_ok + "</button></div>" }); setCookie("ChangePath", c); var b = $("#" + d).val(); tmp = b.split("."); if (tmp[tmp.length - 1] == "gz") { tmp = b.split("/"); b = ""; for (var a = 0; a < tmp.length - 1; a++) { b += "/" + tmp[a] } setCookie("SetName", tmp[tmp.length - 1]) } b = b.replace(/\/\//g, "/"); GetDiskList(b); ActiveDisk() } function GetDiskList(b) { var d = ""; var a = ""; var c = "path=" + b + "&disk=True"; $.post("/files?action=GetDir", c, function(h) { if(h.status == false) { layer.close(layer.index); layer.msg(h.msg,{icon: 2}); return false; } if (h.DISK != undefined) { for (var f = 0; f < h.DISK.length; f++) { a += "<dd onclick=\"GetDiskList('" + h.DISK[f].path + "')\"><span class='glyphicon glyphicon-hdd'></span> " + h.DISK[f].path + "</dd>" } $("#changecomlist").html(a) } for (var f = 0; f < h.DIR.length; f++) { var g = h.DIR[f].split(";"); var e = g[0]; if (e.length > 20) { e = e.substring(0, 20) + "..." } if (isChineseChar(e)) { if (e.length > 10) { e = e.substring(0, 10) + "..." } } d += "<tr><td onclick=\"GetDiskList('" + h.PATH + "/" + g[0] + "')\" title='" + g[0] + "'><span class='glyphicon glyphicon-folder-open'></span>" + e + "</td><td>" + getLocalTime(g[2]) + "</td><td>" + g[3] + "</td><td>" + g[4] + "</td><td><span class='delfile-btn' onclick=\"NewDelFile('" + h.PATH + "/" + g[0] + "')\">X</span></td></tr>" } if (h.FILES != null && h.FILES != "") { for (var f = 0; f < h.FILES.length; f++) { var g = h.FILES[f].split(";"); var e = g[0]; if (e.length > 20) { e = e.substring(0, 20) + "..." } if (isChineseChar(e)) { if (e.length > 10) { e = e.substring(0, 10) + "..." } } d += "<tr><td title='" + g[0] + "'><span class='glyphicon glyphicon-file'></span>" + e + "</td><td>" + getLocalTime(g[2]) + "</td><td>" + g[3] + "</td><td>" + g[4] + "</td><td></td></tr>" } } $(".default").hide(); $(".file-list").show(); $("#tbody").html(d); if (h.PATH.substr(h.PATH.length - 1, 1) != "/") { h.PATH += "/" } $("#PathPlace").find("span").html(h.PATH); ActiveDisk(); return }) } function CreateFolder() { var a = "<tr><td colspan='2'><span class='glyphicon glyphicon-folder-open'></span> <input id='newFolderName' class='newFolderName' type='text' value=''></td><td colspan='3'><button id='nameOk' type='button' class='btn btn-success btn-sm'>" + lan.public.ok + "</button> <button id='nameNOk' type='button' class='btn btn-default btn-sm'>" + lan.public.cancel + "</button></td></tr>"; if ($("#tbody tr").length == 0) { $("#tbody").append(a) } else { $("#tbody tr:first-child").before(a) } $(".newFolderName").focus(); $("#nameOk").click(function() { var c = $("#newFolderName").val(); var b = $("#PathPlace").find("span").text(); newTxt = b.replace(new RegExp(/(\/\/)/g), "/") + c; var d = "path=" + newTxt; $.post("/files?action=CreateDir", d, function(e) { if (e.status == true) { layer.msg(e.msg, { icon: 1 }) } else { layer.msg(e.msg, { icon: 2 }) } GetDiskList(b) }) }); $("#nameNOk").click(function() { $(this).parents("tr").remove() }) } function NewDelFile(c) { var a = $("#PathPlace").find("span").text(); newTxt = c.replace(new RegExp(/(\/\/)/g), "/"); var b = "path=" + newTxt + "&empty=True"; $.post("/files?action=DeleteDir", b, function(d) { if (d.status == true) { layer.msg(d.msg, { icon: 1 }) } else { layer.msg(d.msg, { icon: 2 }) } GetDiskList(a) }) } function ActiveDisk() { var a = $("#PathPlace").find("span").text().substring(0, 1); switch (a) { case "C": $(".path-con-left dd:nth-of-type(1)").css("background", "#eee").siblings().removeAttr("style"); break; case "D": $(".path-con-left dd:nth-of-type(2)").css("background", "#eee").siblings().removeAttr("style"); break; case "E": $(".path-con-left dd:nth-of-type(3)").css("background", "#eee").siblings().removeAttr("style"); break; case "F": $(".path-con-left dd:nth-of-type(4)").css("background", "#eee").siblings().removeAttr("style"); break; case "G": $(".path-con-left dd:nth-of-type(5)").css("background", "#eee").siblings().removeAttr("style"); break; case "H": $(".path-con-left dd:nth-of-type(6)").css("background", "#eee").siblings().removeAttr("style"); break; default: $(".path-con-left dd").removeAttr("style") } } function BackMyComputer() { $(".default").show(); $(".file-list").hide(); $("#PathPlace").find("span").html(""); ActiveDisk() } function BackFile() { var c = $("#PathPlace").find("span").text(); if (c.substr(c.length - 1, 1) == "/") { c = c.substr(0, c.length - 1) } var d = c.split("/"); var a = ""; if (d.length > 1) { var e = d.length - 1; for (var b = 0; b < e; b++) { a += d[b] + "/" } GetDiskList(a.replace("//", "/")) } else { a = d[0] } if (d.length == 1) {} } function GetfilePath() { var a = $("#PathPlace").find("span").text(); a = a.replace(new RegExp(/(\\)/g), "/"); setCookie('path_dir_change', a); $("#" + getCookie("SetId")).val(a + getCookie("SetName")); layer.close(getCookie("ChangePath")) } function setCookie(a, c) { var b = 30; var d = new Date(); d.setTime(d.getTime() + b * 24 * 60 * 60 * 1000); document.cookie = a + "=" + escape(c) + ";expires=" + d.toGMTString() } function getCookie(b) { var a, c = new RegExp("(^| )" + b + "=([^;]*)(;|$)"); if (a = document.cookie.match(c)) { return unescape(a[2]) } else { return null } } function aotuHeight() { var a = $("body").height() - 50; $(".main-content").css("min-height", a) } $(function() { aotuHeight() }); $(window).resize(function() { aotuHeight() }); function showHidePwd() { var a = "glyphicon-eye-open", b = "glyphicon-eye-close"; $(".pw-ico").click(function() { var g = $(this).attr("class"), e = $(this).prev(); if (g.indexOf(a) > 0) { var h = e.attr("data-pw"); $(this).removeClass(a).addClass(b); e.text(h) } else { $(this).removeClass(b).addClass(a); e.text("**********") } var d = $(this).next().position().left; var f = $(this).next().position().top; var c = $(this).next().width(); $(this).next().next().css({ left: d + c + "px", top: f + "px" }) }) } function openPath(a) { setCookie("Path", a); window.location.href = "/files" } function OnlineEditFile(k, f) { if (k != 0) { var l = $("#PathPlace input").val(); var h = encodeURIComponent($("#textBody").val()); var a = $("select[name=encoding]").val(); var loadT = layer.msg(lan.bt.save_file, { icon: 16, time: 0 }); $.post("/files?action=SaveFileBody", "data=" + h + "&path=" + encodeURIComponent(f) + "&encoding=" + a, function(m) { if (k == 1) { layer.close(loadT); } layer.msg(m.msg, { icon: m.status ? 1 : 2 }); }); return } var e = layer.msg(lan.bt.read_file, { icon: 16, time: 0 }); var g = f.split("."); var b = g[g.length - 1]; var d; switch (b) { case "html": var j = { name: "htmlmixed", scriptTypes: [{ matches: /\/x-handlebars-template|\/x-mustache/i, mode: null }, { matches: /(text|application)\/(x-)?vb(a|script)/i, mode: "vbscript" }] }; d = j; break; case "htm": var j = { name: "htmlmixed", scriptTypes: [{ matches: /\/x-handlebars-template|\/x-mustache/i, mode: null }, { matches: /(text|application)\/(x-)?vb(a|script)/i, mode: "vbscript" }] }; d = j; break; case "js": d = "text/javascript"; break; case "json": d = "application/ld+json"; break; case "css": d = "text/css"; break; case "php": d = "application/x-httpd-php"; break; case "tpl": d = "application/x-httpd-php"; break; case "xml": d = "application/xml"; break; case "sql": d = "text/x-sql"; break; case "conf": d = "text/x-nginx-conf"; break; default: var j = { name: "htmlmixed", scriptTypes: [{ matches: /\/x-handlebars-template|\/x-mustache/i, mode: null }, { matches: /(text|application)\/(x-)?vb(a|script)/i, mode: "vbscript" }] }; d = j } $.post("/files?action=GetFileBody", "path=" + encodeURIComponent(f), function(s) { if (s.status === false) { layer.msg(s.msg, { icon: 5 }); return; } layer.close(e); var u = ["utf-8", "GBK", "GB2312", "BIG5"]; var n = ""; var m = ""; var o = ""; for (var p = 0; p < u.length; p++) { m = s.encoding == u[p] ? "selected" : ""; n += '<option value="' + u[p] + '" ' + m + ">" + u[p] + "</option>" } var r = layer.open({ type: 1, shift: 5, closeBtn: 2, area: ["90%", "90%"], title: lan.bt.edit_title + "[" + f + "]", content: '<form class="bt-form pd20 pb70"><div class="line"><p style="color:red;margin-bottom:10px">' + lan.bt.edit_ps + ' <select class="bt-input-text" name="encoding" style="width: 74px;position: absolute;top: 31px;right: 19px;height: 22px;z-index: 9999;border-radius: 0;">' + n + '</select></p><textarea class="mCustomScrollbar bt-input-text" id="textBody" style="width:100%;margin:0 auto;line-height: 1.8;position: relative;top: 10px;" value="" /> </div> <div class="bt-form-submit-btn" style="position:absolute; bottom:0; width:100%"> <button type="button" class="btn btn-danger btn-sm btn-editor-close">' + lan.public.close + '</button> <button id="OnlineEditFileBtn" type="button" class="btn btn-success btn-sm">' + lan.public.save + '</button> </div> </form>' }); $("#textBody").text(s.data); var q = $(window).height() * 0.9; $("#textBody").height(q - 160); var t = CodeMirror.fromTextArea(document.getElementById("textBody"), { extraKeys: { "Ctrl-F": "findPersistent", "Ctrl-H": "replaceAll", "Ctrl-S": function() { $("#textBody").text(t.getValue()); OnlineEditFile(2, f) } }, mode: d, lineNumbers: true, matchBrackets: true, matchtags: true, autoMatchParens: true }); t.focus(); t.setSize("auto", q - 150); $("#OnlineEditFileBtn").click(function() { $("#textBody").text(t.getValue()); OnlineEditFile(1, f); }); $(".btn-editor-close").click(function() { layer.close(r); }); }); } function ServiceAdmin(a, b) { if (!isNaN(a)) { a = "php-fpm-" + a } a = a.replace('_soft', ''); var c = "name=" + a + "&type=" + b; var d = ""; switch (b) { case "stop": d = lan.bt.stop; break; case "start": d = lan.bt.start; break; case "restart": d = lan.bt.restart; break; case "reload": d = lan.bt.reload; break } layer.confirm(lan.get('service_confirm', [d, a]), { icon: 3, closeBtn: 2 }, function() { var e = layer.msg(lan.get('service_the', [d, a]), { icon: 16, time: 0 }); $.post("/system?action=ServiceAdmin", c, function(g) { layer.close(e); var f = g.status ? lan.get('service_ok', [a, d]) : lan.get('service_err', [a, d]); layer.msg(f, { icon: g.status ? 1 : 2 }); if (b != "reload" && g.status == true) { setTimeout(function() { window.location.reload() }, 1000) } if (!g.status) { layer.msg(g.msg, { icon: 2, time: 0, shade: 0.3, shadeClose: true }) } }).error(function() { layer.close(e); layer.msg(lan.public.success, { icon: 1 }) }) }) } function GetConfigFile(a) { var b = ""; switch (a) { case "mysql": b = "/etc/my.cnf"; break; case "nginx": b = "/www/server/nginx/conf/nginx.conf"; break; case "pure-ftpd": b = "/www/server/pure-ftpd/etc/pure-ftpd.conf"; break; case "apache": b = "/www/server/apache/conf/httpd.conf"; break; case "tomcat": b = "/www/server/tomcat/conf/server.xml"; break; default: b = "/www/server/php/" + a + "/etc/php.ini"; break } OnlineEditFile(0, b) } function GetPHPStatus(a) { if (a == "52") { layer.msg(lan.bt.php_status_err, { icon: 2 }); return } $.post("/ajax?action=GetPHPStatus", "version=" + a, function(b) { layer.open({ type: 1, area: "400", title: lan.bt.php_status_title, closeBtn: 2, shift: 5, shadeClose: true, content: "<div style='margin:15px;'><table class='table table-hover table-bordered'> <tr><th>" + lan.bt.php_pool + "</th><td>" + b.pool + "</td></tr> <tr><th>" + lan.bt.php_manager + "</th><td>" + ((b["process manager"] == "dynamic") ? lan.bt.dynamic : lan.bt.static) + "</td></tr> <tr><th>" + lan.bt.php_start + "</th><td>" + b["start time"] + "</td></tr> <tr><th>" + lan.bt.php_accepted + "</th><td>" + b["accepted conn"] + "</td></tr> <tr><th>" + lan.bt.php_queue + "</th><td>" + b["listen queue"] + "</td></tr> <tr><th>" + lan.bt.php_max_queue + "</th><td>" + b["max listen queue"] + "</td></tr> <tr><th>" + lan.bt.php_len_queue + "</th><td>" + b["listen queue len"] + "</td></tr> <tr><th>" + lan.bt.php_idle + "</th><td>" + b["idle processes"] + "</td></tr> <tr><th>" + lan.bt.php_active + "</th><td>" + b["active processes"] + "</td></tr> <tr><th>" + lan.bt.php_total + "</th><td>" + b["total processes"] + "</td></tr> <tr><th>" + lan.bt.php_max_active + "</th><td>" + b["max active processes"] + "</td></tr> <tr><th>" + lan.bt.php_max_children + "</th><td>" + b["max children reached"] + "</td></tr> <tr><th>" + lan.bt.php_slow + "</th><td>" + b["slow requests"] + "</td></tr> </table></div>" }) }) } function GetNginxStatus() { $.post("/ajax?action=GetNginxStatus", "", function(a) { layer.open({ type: 1, area: "400", title: lan.bt.nginx_title, closeBtn: 2, shift: 5, shadeClose: true, content: "<div style='margin:15px;'><table class='table table-hover table-bordered'> <tr><th>" + lan.bt.nginx_active + "</th><td>" + a.active + "</td></tr> <tr><th>" + lan.bt.nginx_accepts + "</th><td>" + a.accepts + "</td></tr> <tr><th>" + lan.bt.nginx_handled + "</th><td>" + a.handled + "</td></tr> <tr><th>" + lan.bt.nginx_requests + "</th><td>" + a.requests + "</td></tr> <tr><th>" + lan.bt.nginx_reading + "</th><td>" + a.Reading + "</td></tr> <tr><th>" + lan.bt.nginx_writing + "</th><td>" + a.Writing + "</td></tr> <tr><th>" + lan.bt.nginx_waiting + "</th><td>" + a.Waiting + "</td></tr> </table></div>" }) }) } function divcenter() { $(".layui-layer").css("position", "absolute"); var c = $(window).width(); var b = $(".layui-layer").outerWidth(); var g = $(window).height(); var f = $(".layui-layer").outerHeight(); var a = (c - b) / 2; var e = (g - f) / 2 > 0 ? (g - f) / 2 : 10; var d = $(".layui-layer").offset().left - $(".layui-layer").position().left; var h = $(".layui-layer").offset().top - $(".layui-layer").position().top; a = a + $(window).scrollLeft() - d; e = e + $(window).scrollTop() - h; $(".layui-layer").css("left", a + "px"); $(".layui-layer").css("top", e + "px") } function btcopy(password) { $("#bt_copys").attr('data-clipboard-text', password); $("#bt_copys").click(); } function loadScript(arry, param, callback) { var ready = 0; if (typeof param === 'function') callback = param for (var i = 0; i < arry.length; i++) { if (!Array.isArray(bt['loadScript'])) bt['loadScript'] = [] if (!is_file_existence(arry[i], true)) { if ((arry.length - 1) === i && callback) callback(); continue; }; var script = document.createElement("script"), _arry_split = arry[i].split('/'); script.type = "text/javascript"; if (typeof(callback) != "undefined") { if (script.readyState) { (function(i) { script.onreadystatechange = function() { console.log(arry[i]); if (script.readyState == "loaded" || script.readyState == "complete") { script.onreadystatechange = null; bt['loadScript'].push(arry[i]); ready++; } }; })(i); } else { (function(i) { script.onload = function() { bt['loadScript'].push(arry[i]); ready++; }; })(i); } } script.src = arry[i]; document.body.appendChild(script); } var time = setInterval(function() { if (ready === arry.length) { clearTimeout(time); callback(); } }, 10); } // 判断文件是否插入 function is_file_existence(name,type){ var arry = type?bt.loadScript:bt.loadLink for(var i=0;i<arry.length;i++){ if(arry[i] === name) return false } return true } // var clipboard = new ClipboardJS('#bt_copys'); // clipboard.on('success', function(e) { // layer.msg(lan.public.cp_success, { icon: 1 }); // }); // clipboard.on('error', function(e) { // layer.msg(lan.index.cp_fail, { icon: 2 }); // }); function isChineseChar(b) { var a = /[\u4E00-\u9FA5\uF900-\uFA2D]/; return a.test(b) } function SafeMessage(j, h, g, f) { if (f == undefined) { f = "" } var d = Math.round(Math.random() * 9 + 1); var c = Math.round(Math.random() * 9 + 1); var e = ""; e = d + c; sumtext = d + " + " + c; setCookie("vcodesum", e); var mess = layer.open({ type: 1, title: j, area: "350px", closeBtn: 2, shadeClose: true, content: "<div class='bt-form webDelete pd20 pb70'><p>" + h + "</p>" + f + "<div class='vcode'>" + lan.bt.cal_msg + "<span class='text'>" + sumtext + "</span>=<input type='number' id='vcodeResult' value=''></div><div class='bt-form-submit-btn'><button type='button' class='btn btn-danger btn-sm bt-cancel'>" + lan.public.cancel + "</button> <button type='button' id='toSubmit' class='btn btn-success btn-sm' >" + lan.public.ok + "</button></div></div>" }); $("#vcodeResult").focus().keyup(function(a) { if (a.keyCode == 13) { $("#toSubmit").click() } }); $(".bt-cancel").click(function() { layer.close(mess); }); $("#toSubmit").click(function() { var a = $("#vcodeResult").val().replace(/ /g, ""); if (a == undefined || a == "") { layer.msg(lan.public.input_calc_result); return } if (a != getCookie("vcodesum")) { layer.msg(lan.public.input_calc_result); return } layer.close(mess); g(); }) } $(function() { $(".fb-ico").hover(function() { $(".fb-text").css({ left: "36px", top: 0, width: "80px" }) }, function() { $(".fb-text").css({ left: 0, width: "36px" }) }).click(function() { $(".fb-text").css({ left: 0, width: "36px" }); $(".zun-feedback-suggestion").show() }); $(".fb-close").click(function() { $(".zun-feedback-suggestion").hide() }); $(".fb-attitudes li").click(function() { $(this).addClass("fb-selected").siblings().removeClass("fb-selected") }) }); $("#dologin").click(function() { layer.confirm(lan.bt.loginout, { icon: 3, closeBtn: 2, title: "Logout" }, function() { window.location.href = "/login?dologin=True" }); return false }); function setPassword(a) { if (a == 1) { p1 = $("#p1").val(); p2 = $("#p2").val(); if (p1 == "" || p1.length < 8) { layer.msg(lan.bt.pass_err_len, { icon: 2 }); return } //准备弱口令匹配元素 var checks = ['admin888', '123123123', '12345678', '45678910', '87654321', 'asdfghjkl', 'password', 'qwerqwer']; pchecks = 'abcdefghijklmnopqrstuvwxyz1234567890'; for (var i = 0; i < pchecks.length; i++) { checks.push(pchecks[i] + pchecks[i] + pchecks[i] + pchecks[i] + pchecks[i] + pchecks[i] + pchecks[i] + pchecks[i]); } //检查弱口令 cps = p1.toLowerCase(); var isError = ""; for (var i = 0; i < checks.length; i++) { if (cps == checks[i]) { isError += '[' + checks[i] + '] '; } } if (isError != "") { layer.msg(lan.bt.pass_err + isError, { icon: 5 }); return; } if (p1 != p2) { layer.msg(lan.bt.pass_err_re, { icon: 2 }); return } $.post("/config?action=setPassword", "password1=" + encodeURIComponent(p1) + "&password2=" + encodeURIComponent(p2), function(b) { if (b.status) { layer.closeAll(); layer.msg(b.msg, { icon: 1 }) } else { layer.msg(b.msg, { icon: 2 }) } }); return } layer.open({ type: 1, area: "290px", title: lan.bt.pass_title, closeBtn: 2, shift: 5, shadeClose: false, content: "<div class='bt-form pd20 pb70'><div class='line'><span class='tname'>" + lan.public.pass + "</span><div class='info-r'><input class='bt-input-text' type='text' name='password1' id='p1' value='' placeholder='" + lan.bt.pass_new_title + "' style='width:100%'/></div></div><div class='line'><span class='tname'>" + lan.bt.pass_re + "</span><div class='info-r'><input class='bt-input-text' type='text' name='password2' id='p2' value='' placeholder='" + lan.bt.pass_re_title + "' style='width:100%' /></div></div><div class='bt-form-submit-btn'><span style='float: left;' title='" + lan.bt.pass_rep + "' class='btn btn-default btn-sm' onclick='randPwd(10)'>" + lan.bt.pass_rep_btn + "</span><button type='button' class='btn btn-danger btn-sm' onclick=\"layer.closeAll()\">" + lan.public.close + "</button> <button type='button' class='btn btn-success btn-sm' onclick=\"setPassword(1)\">" + lan.public.edit + "</button></div></div>" }); } function randPwd() { var pwd = RandomStrPwd(12); $("#p1").val(pwd); $("#p2").val(pwd); layer.msg(lan.bt.pass_rep_ps, { time: 2000 }) } function setUserName(a) { if (a == 1) { p1 = $("#p1").val(); p2 = $("#p2").val(); if (p1 == "" || p1.length < 3) { layer.msg(lan.bt.user_len, { icon: 2 }); return } if (p1 != p2) { layer.msg(lan.bt.user_err_re, { icon: 2 }); return } var checks = ['admin', 'root', 'admin123', '123456']; if ($.inArray(p1, checks) >= 0) { layer.msg(lan.public.usually_username_ban, { icon: 2 }); return; } $.post("/config?action=setUsername", "username1=" + encodeURIComponent(p1) + "&username2=" + encodeURIComponent(p2), function(b) { if (b.status) { layer.closeAll(); layer.msg(b.msg, { icon: 1 }); $("input[name='username_']").val(p1) } else { layer.msg(b.msg, { icon: 2 }) } }); return } layer.open({ type: 1, area: "290px", title: lan.bt.user_title, closeBtn: 2, shift: 5, shadeClose: false, content: "<div class='bt-form pd20 pb70'><div class='line'><span class='tname'>" + lan.bt.user + "</span><div class='info-r'><input class='bt-input-text' type='text' name='password1' id='p1' value='' placeholder='" + lan.bt.user_new + "' style='width:100%'/></div></div><div class='line'><span class='tname'>" + lan.bt.pass_re + "</span><div class='info-r'><input class='bt-input-text' type='text' name='password2' id='p2' value='' placeholder='" + lan.bt.pass_re_title + "' style='width:100%'/></div></div><div class='bt-form-submit-btn'><button type='button' class='btn btn-danger btn-sm' onclick=\"layer.closeAll()\">" + lan.public.close + "</button> <button type='button' class='btn btn-success btn-sm' onclick=\"setUserName(1)\">" + lan.public.edit + "</button></div></div>" }) } var openWindow = null; var downLoad = null; var speed = null; function task() { messagebox(); } function ActionTask() { var a = layer.msg(lan.public.the_del, { icon: 16, time: 0, shade: [0.3, "#000"] }); $.post("/files?action=ActionTask", "", function(b) { layer.close(a); layer.msg(b.msg, { icon: b.status ? 1 : 5 }) }) } function RemoveTask(b) { var a = layer.msg(lan.public.the_del, { icon: 16, time: 0, shade: [0.3, "#000"] }); $.post("/files?action=RemoveTask", "id=" + b, function(c) { layer.close(a); layer.msg(c.msg, { icon: c.status ? 1 : 5 }); }).error(function() { layer.msg(lan.bt.task_close, { icon: 1 }); }); } function GetTaskList(a) { a = a == undefined ? 1 : a; $.post("/data?action=getData", "tojs=GetTaskList&table=tasks&limit=10&p=" + a, function(g) { var e = ""; var b = ""; var c = ""; var f = false; for (var d = 0; d < g.data.length; d++) { switch (g.data[d].status) { case "-1": f = true; if (g.data[d].type != "download") { b = "<li><span class='titlename'>" + g.data[d].name + "</span><span class='state'>" + lan.bt.task_install + " <img src='/static/img/ing.gif'> | <a href=\"javascript:RemoveTask(" + g.data[d].id + ")\">" + lan.public.close + "</a></span><span class='opencmd'></span><pre class='cmd'></pre></li>" } else { b = "<li><div class='line-progress' style='width:0%'></div><span class='titlename'>" + g.data[d].name + "<a id='speed' style='margin-left:130px;'>0.0M/12.5M</a></span><span class='com-progress'>0%</span><span class='state'>" + lan.bt.task_downloading + " <img src='/static/img/ing.gif'> | <a href=\"javascript:RemoveTask(" + g.data[d].id + ")\">" + lan.public.close + "</a></span></li>" } break; case "0": c += "<li><span class='titlename'>" + g.data[d].name + "</span><span class='state'>" + lan.bt.task_sleep + "</span> | <a href=\"javascript:RemoveTask(" + g.data[d].id + ")\">" + lan.public.del + "</a></li>"; break; case "1": e += "<li><span class='titlename'>" + g.data[d].name + "</span><span class='state'>" + g.data[d].addtime + " " + lan.bt.task_ok + " " + lan.bt.time + (g.data[d].end - g.data[d].start) + lan.bt.s + "</span></li>" } } $("#srunning").html(b + c); $("#sbody").html(e); return f }) } function GetTaskCount() { $.post("/ajax?action=GetTaskCount", "", function(a) { if (a.status === false) { window.location.href = '/login?dologin=True'; return; } $(".task").text(a) }) } function setSelectChecked(c, d) { var a = document.getElementById(c); for (var b = 0; b < a.options.length; b++) { if (a.options[b].innerHTML == d) { a.options[b].selected = true; break } } } GetTaskCount(); function RecInstall() { $.getScript('jquery.fly.min.js.js'); $.post("/ajax?action=GetSoftList", "", function(l) { var c = ""; var g = ""; var e = ""; for (var h = 0; h < l.length; h++) { if (l[h].name == "Tomcat") { continue } var o = ""; var m = "<input id='data_" + l[h].name + "' data-info='" + l[h].name + " " + l[h].versions[0].version + "' type='checkbox' checked>"; for (var b = 0; b < l[h].versions.length; b++) { var d = ""; if ((l[h].name == "PHP" && (l[h].versions[b].version == "5.4" || l[h].versions[b].version == "54")) || (l[h].name == "MySQL" && l[h].versions[b].version == "5.5") || (l[h].name == "phpMyAdmin" && l[h].versions[b].version == "4.4")) { d = "selected"; m = "<input id='data_" + l[h].name + "' data-info='" + l[h].name + " " + l[h].versions[b].version + "' type='checkbox' checked>" } o += "<option value='" + l[h].versions[b].version + "' " + d + ">" + l[h].name + " " + l[h].versions[b].version + "</option>" } var f = "<li><span class='ico'><img src='/static/img/" + l[h].name.toLowerCase() + ".png'></span><span class='name'><select id='select_" + l[h].name + "' class='sl-s-info'>" + o + "</select></span><span class='pull-right'>" + m + "</span></li>"; if (l[h].name == "Nginx") { c = f } else { if (l[h].name == "Apache") { g = f } else { e += f } } } c += e; g += e; g = g.replace(new RegExp(/(data_)/g), "apache_").replace(new RegExp(/(select_)/g), "apache_select_"); var k = layer.open({ type: 1, title: lan.bt.install_title, area: ["666px", "473px"], closeBtn: 2, shadeClose: false, content: "<div class='rec-install'><div class='important-title'><p><span class='glyphicon glyphicon-alert' style='color: #f39c12; margin-right: 10px;'></span>" + lan.bt.install_ps + " <a href='javascript:jump()' style='color:#20a53a'>" + lan.bt.install_s + "</a> " + lan.bt.install_s1 + "</p></div><div class='rec-box'><h3>" + lan.bt.install_lnmp + "</h3><div class='rec-box-con'><ul class='rec-list'>" + c + "</ul><p class='fangshi'>" + lan.bt.install_type + ":<label data-title='" + lan.bt.install_rpm_title + "' style='margin-right:0'>" + lan.bt.install_rpm + "<input type='checkbox' checked></label><label data-title='" + lan.bt.install_src_title + "'>" + lan.bt.install_src + "<input type='checkbox'></label></p><div class='onekey'>" + lan.bt.install_key + "</div></div></div><div class='rec-box' style='margin-left:16px'><h3>LAMP</h3><div class='rec-box-con'><ul class='rec-list'>" + g + "</ul><p class='fangshi'>" + lan.bt.install_type + ":<label data-title='" + lan.bt.install_rpm_title + "' style='margin-right:0'>" + lan.bt.install_rpm + "<input type='checkbox' checked></label><label data-title='" + lan.bt.install_src_title + "'>" + lan.bt.install_src + "<input type='checkbox'></label></p><div class='onekey'>" + lan.public.onclick_install + "</div></div></div></div>" }); $(".fangshi input").click(function() { $(this).attr("checked", "checked").parent().siblings().find("input").removeAttr("checked") }); $(".sl-s-info").change(function() { var p = $(this).find("option:selected").text(); var n = $(this).attr("id"); p = p.toLowerCase(); $(this).parents("li").find("input").attr("data-info", p) }); $("#apache_select_PHP").change(function() { var n = $(this).val(); j(n, "apache_select_", "apache_") }); $("#select_PHP").change(function() { var n = $(this).val(); j(n, "select_", "data_") }); function j(p, r, q) { var n = "4.4"; switch (p) { case "5.2": n = "4.0"; break; case "5.3": n = "4.0"; break; case "5.4": n = "4.4"; break; case "5.5": n = "4.4"; break; default: n = "4.7" } $("#" + r + "phpMyAdmin option[value='" + n + "']").attr("selected", "selected").siblings().removeAttr("selected"); $("#" + r + "_phpMyAdmin").attr("data-info", "phpmyadmin " + n) } $("#select_MySQL,#apache_select_MySQL").change(function() { var n = $(this).val(); a(n) }); $("#apache_select_Apache").change(function() { var apacheVersion = $(this).val(); if (apacheVersion == '2.2') { layer.msg(lan.bt.install_apache22); } else { layer.msg(lan.bt.install_apache24); } }); $("#apache_select_PHP").change(function() { var apacheVersion = $("#apache_select_Apache").val(); var phpVersion = $(this).val(); if (apacheVersion == '2.2') { if (phpVersion != '5.2' && phpVersion != '5.3' && phpVersion != '5.4') { layer.msg(lan.bt.insatll_s22 + 'PHP-' + phpVersion, { icon: 5 }); $(this).val("5.4"); $("#apache_PHP").attr('data-info', 'php 5.4'); return false; } } else { if (phpVersion == '5.2') { layer.msg(lan.bt.insatll_s24 + 'PHP-' + phpVersion, { icon: 5 }); $(this).val("5.4"); $("#apache_PHP").attr('data-info', 'php 5.4'); return false; } } }); function a(n) { memSize = getCookie("memSize"); max = 64; msg = "64M"; switch (n) { case "5.1": max = 256; msg = "256M"; break; case "5.7": max = 1500; msg = "2GB"; break; case "5.6": max = 800; msg = "1GB"; break; case "AliSQL": max = 800; msg = "1GB"; break; case "mariadb_10.0": max = 800; msg = "1GB"; break; case "mariadb_10.1": max = 1500; msg = "2GB"; break } if (memSize < max) { layer.msg(lan.bt.insatll_mem.replace("{1}", msg).replace("{2}", n), { icon: 5 }) } } var de = null; $(".onekey").click(function() { if (de) return; var v = $(this).prev().find("input").eq(0).prop("checked") ? "1" : "0"; var r = $(this).parents(".rec-box-con").find(".rec-list li").length; var n = ""; var q = ""; var p = ""; var x = ""; var s = ""; de = true; for (var t = 0; t < r; t++) { var w = $(this).parents(".rec-box-con").find("ul li").eq(t); var u = w.find("input"); if (u.prop("checked")) { n += u.attr("data-info") + "," } } q = n.split(","); loadT = layer.msg(lan.bt.install_to, { icon: 16, time: 0, shade: [0.3, "#000"] }); for (var t = 0; t < q.length - 1; t++) { p = q[t].split(" ")[0].toLowerCase(); x = q[t].split(" ")[1]; s = "name=" + p + "&version=" + x + "&type=" + v + "&id=" + (t + 1); $.ajax({ url: "/files?action=InstallSoft", data: s, type: "POST", async: false, success: function(y) {} }); } layer.close(loadT); layer.close(k); setTimeout(function() { GetTaskCount() }, 2000); layer.msg(lan.bt.install_ok, { icon: 1 }); setTimeout(function() { task() }, 1000) }); InstallTips(); fly("onekey") }) } function jump() { layer.closeAll(); window.location.href = "/soft" } function InstallTips() { $(".fangshi label").mouseover(function() { var a = $(this).attr("data-title"); layer.tips(a, this, { tips: [1, "#787878"], time: 0 }) }).mouseout(function() { $(".layui-layer-tips").remove() }) } function fly(a) { var b = $("#task").offset(); $("." + a).click(function(d) { var e = $(this); var c = $('<span class="yuandian"></span>'); c.fly({ start: { left: d.pageX, top: d.pageY }, end: { left: b.left + 10, top: b.top + 10, width: 0, height: 0 }, onEnd: function() { layer.closeAll(); layer.msg(lan.bt.task_add, { icon: 1 }); GetTaskCount() } }); }); }; //检查选中项 function checkSelect() { setTimeout(function() { var checkList = $("input[name=id]"); var count = 0; for (var i = 0; i < checkList.length; i++) { if (checkList[i].checked) count++; } if (count > 0) { $("#allDelete,#allExecute,#allLog").show(); } else { $("#allDelete,#allExecute,#allLog").hide(); } }, 5); } //处理排序 function listOrder(skey, type, obj) { or = getCookie('order'); orderType = 'desc'; if (or) { if (or.split(' ')[1] == 'desc') { orderType = 'asc'; } } setCookie('order', skey + ' ' + orderType); switch (type) { case 'site': getWeb(1); break; case 'database': getData(1); break; case 'ftp': getFtp(1); break; } $(obj).find(".glyphicon-triangle-bottom").remove(); $(obj).find(".glyphicon-triangle-top").remove(); if (orderType == 'asc') { $(obj).append("<span class='glyphicon glyphicon-triangle-bottom' style='margin-left:5px;color:#bbb'></span>"); } else { $(obj).append("<span class='glyphicon glyphicon-triangle-top' style='margin-left:5px;color:#bbb'></span>"); } } //去关联列表 function GetBtpanelList() { var con = ''; $.post("/config?action=GetPanelList", function(rdata) { for (var i = 0; i < rdata.length; i++) { con += '<h3 class="mypcip mypcipnew" style="opacity:.6" data-url="' + rdata[i].url + '" data-user="' + rdata[i].username + '" data-pw="' + rdata[i].password + '"><span class="f14 cw">' + rdata[i].title + '</span><em class="btedit" onclick="bindBTPanel(0,\'c\',\'' + rdata[i].title + '\',\'' + rdata[i].id + '\',\'' + rdata[i].url + '\',\'' + rdata[i].username + '\',\'' + rdata[i].password + '\')"></em></h3>' } $("#newbtpc").html(con); $(".mypcipnew").hover(function() { $(this).css("opacity", "1"); }, function() { $(this).css("opacity", ".6"); }).click(function() { $("#btpanelform").remove(); var murl = $(this).attr("data-url"); var user = $(this).attr("data-user"); var pw = $(this).attr("data-pw"); layer.open({ type: 2, title: false, closeBtn: 0, //不显示关闭按钮 shade: [0], area: ['340px', '215px'], offset: 'rb', //右下角弹出 time: 5, //2秒后自动关闭 anim: 2, content: [murl + '/login', 'no'] }); var loginForm = '<div id="btpanelform" style="display:none"><form id="toBtpanel" action="' + murl + '/login" method="post" target="btpfrom">\ <input name="username" id="btp_username" value="' + user + '" type="text">\ <input name="password" id="btp_password" value="' + pw + '" type="password">\ <input name="code" id="bt_code" value="12345" type="text">\ </form><iframe name="btpfrom" src=""></iframe></div>'; $("body").append(loginForm); layer.msg(lan.bt.panel_open, { icon: 16, shade: [0.3, '#000'], time: 1000 }); setTimeout(function() { $("#toBtpanel").submit(); }, 500); setTimeout(function() { window.open(murl); }, 1000); }); $(".btedit").click(function(e) { e.stopPropagation(); }); }) } GetBtpanelList(); //添加面板快捷登录 function bindBTPanel(a, type, ip, btid, url, user, pw) { var titleName = lan.bt.panel_add; if (type == "b") { btn = "<button type='button' class='btn btn-success btn-sm' onclick=\"bindBTPanel(1,'b')\">" + lan.public.add + "</button>"; } else { titleName = lan.bt.panel_edit + ip; btn = "<button type='button' class='btn btn-default btn-sm' onclick=\"bindBTPaneldel('" + btid + "')\">" + lan.public.del + "</button><button type='button' class='btn btn-success btn-sm' onclick=\"bindBTPanel(1,'c','" + ip + "','" + btid + "')\" style='margin-left:7px'>" + lan.public.edit + "</button>"; } if (url == undefined) url = "http://"; if (user == undefined) user = ""; if (pw == undefined) pw = ""; if (ip == undefined) ip = ""; if (a == 1) { var gurl = "/config?action=AddPanelInfo"; var btaddress = $("#btaddress").val(); if (!btaddress.match(/^(http|https)+:\/\/([\w-]+\.)+[\w-]+:\d+/)) { layer.msg(lan.bt.panel_err_format + '<p>http://192.168.0.1:8888</p>', { icon: 5, time: 5000 }); return; } var btuser = encodeURIComponent($("#btuser").val()); var btpassword = encodeURIComponent($("#btpassword").val()); var bttitle = $("#bttitle").val(); var data = "title=" + bttitle + "&url=" + encodeURIComponent(btaddress) + "&username=" + btuser + "&password=" + btpassword; if (btaddress == "" || btuser == "" || btpassword == "" || bttitle == "") { layer.msg(lan.bt.panel_err_empty, { icon: 8 }); return; } if (type == "c") { gurl = "/config?action=SetPanelInfo"; data = data + "&id=" + btid; } $.post(gurl, data, function(b) { if (b.status) { layer.closeAll(); layer.msg(b.msg, { icon: 1 }); GetBtpanelList(); } else { layer.msg(b.msg, { icon: 2 }) } }); return } layer.open({ type: 1, area: "400px", title: titleName, closeBtn: 2, shift: 5, shadeClose: false, content: "<div class='bt-form pd20 pb70'>\ <div class='line'><span class='tname'>" + lan.bt.panel_address + "</span>\ <div class='info-r'><input class='bt-input-text' type='text' name='btaddress' id='btaddress' value='" + url + "' placeholder='" + lan.bt.panel_address + "' style='width:100%'/></div>\ </div>\ <div class='line'><span class='tname'>" + lan.bt.panel_user + "</span>\ <div class='info-r'><input class='bt-input-text' type='text' name='btuser' id='btuser' value='" + user + "' placeholder='" + lan.bt.panel_user + "' style='width:100%'/></div>\ </div>\ <div class='line'><span class='tname'>" + lan.bt.panel_pass + "</span>\ <div class='info-r'><input class='bt-input-text' type='password' name='btpassword' id='btpassword' value='" + pw + "' placeholder='" + lan.bt.panel_pass + "' style='width:100%'/></div>\ </div>\ <div class='line'><span class='tname'>" + lan.bt.panel_ps + "</span>\ <div class='info-r'><input class='bt-input-text' type='text' name='bttitle' id='bttitle' value='" + ip + "' placeholder='" + lan.bt.panel_ps + "' style='width:100%'/></div>\ </div>\ <div class='line'><ul class='help-info-text c7'><li>" + lan.bt.panel_ps_1 + "</li><li>" + lan.bt.panel_ps_2 + "</li><li>" + lan.bt.panel_ps_3 + "</li></ul></div>\ <div class='bt-form-submit-btn'><button type='button' class='btn btn-danger btn-sm' onclick=\"layer.closeAll()\">" + lan.public.close + "</button> " + btn + "</div></div>" }); $("#btaddress").on("input", function() { var str = $(this).val(); var isip = /([\w-]+\.){2,6}\w+/; var iptext = str.match(isip); if (iptext) $("#bttitle").val(iptext[0]); }).blur(function() { var str = $(this).val(); var isip = /([\w-]+\.){2,6}\w+/; var iptext = str.match(isip); if (iptext) $("#bttitle").val(iptext[0]); }); } //删除快捷登录 function bindBTPaneldel(id) { $.post("/config?action=DelPanelInfo", "id=" + id, function(rdata) { layer.closeAll(); layer.msg(rdata.msg, { icon: rdata.status ? 1 : 2 }); GetBtpanelList(); }) } function getSpeed(sele) { if (!$(sele)) return; $.get('/ajax?action=GetSpeed', function(speed) { if (speed.title === null) return; mspeed = ''; if (speed.speed > 0) { mspeed = '<span class="pull-right">' + ToSize(speed.speed) + '/s</span>'; } body = '<p>' + speed.title + ' <img src="/static/img/ing.gif"></p>\ <div class="bt-progress"><div class="bt-progress-bar" style="width:' + speed.progress + '%"><span class="bt-progress-text">' + speed.progress + '%</span></div></div>\ <p class="f12 c9"><span class="pull-left">' + speed.used + '/' + speed.total + '</span>' + mspeed + '</p>'; $(sele).prev().hide(); $(sele).css({ "margin-left": "-37px", "width": "380px" }); $(sele).parents(".layui-layer").css({ "margin-left": "-100px" }); $(sele).html(body); setTimeout(function() { getSpeed(sele); }, 1000); }); } //消息盒子 function messagebox() { layer.open({ type: 1, title: lan.bt.task_title, area: "750px", closeBtn: 2, shadeClose: false, content: '<div class="bt-form">\ <div class="bt-w-main">\ <div class="bt-w-menu">\ <p class="bgw" id="taskList" onclick="tasklist()">' + lan.bt.task_list + '(<span class="task_count">0</span>)</p>\ <p onclick="remind()">' + lan.bt.task_msg + '(<span class="msg_count">0</span>)</p>\ <p onclick="execLog()">' + lan.public.exec_log + '</p>\ </div>\ <div class="bt-w-con pd15">\ <div class="taskcon"></div>\ </div>\ </div>\ </div>' }); $(".bt-w-menu p").click(function() { $(this).addClass("bgw").siblings().removeClass("bgw"); }); tasklist(); } //取执行日志 function execLog() { $.post('/files?action=GetExecLog', {}, function(logs) { var lbody = '<textarea readonly="" style="margin: 0px;width: 551px;height: 520px;background-color: #333;color:#fff; padding:0 5px" id="exec_log">' + logs + '</textarea>'; $(".taskcon").html(lbody); var ob = document.getElementById('exec_log'); ob.scrollTop = ob.scrollHeight; }); } function get_msg_data(a, fun) { a = a == undefined ? 1 : a; $.post("/data?action=getData", "tojs=remind&table=tasks&result=2,4,6,8&limit=10&search=1&p=" + a, function(g) { fun(g) }) } function remind(a) { get_msg_data(a, function(g) { var e = ""; var f = false; var task_count = 0; for (var d = 0; d < g.data.length; d++) { if (g.data[d].status != '1') { task_count++; continue; } e += '<tr><td><input type="checkbox"></td><td><div class="titlename c3" title="' + g.data[d].name + g.data[d].addtime + lan.bt.task_ok + lan.bt.time + (g.data[d].end - g.data[d].start) + lan.bt.s +'">' + g.data[d].name + g.data[d].addtime +'</span><span class="rs-status">【' + lan.bt.task_ok + '】<span><span class="rs-time">' + lan.bt.time + (g.data[d].end - g.data[d].start) + lan.bt.s + '</span></div></td><td class="text-right c3">' + g.data[d].addtime + '</td></tr>' } var con = '<div class="divtable"><table class="table table-hover">\ <thead><tr><th width="20"><input id="Rs-checkAll" type="checkbox" onclick="RscheckSelect()"></th><th>' + lan.bt.task_name + '</th><th class="text-right">' + lan.bt.task_time + '</th></tr></thead>\ <tbody id="remind">' + e + '</tbody>\ </table></div>\ <div class="mtb15" style="height:32px">\ <div class="pull-left buttongroup" style="display:none;"><button class="btn btn-default btn-sm mr5 rs-del" disabled="disabled">' + lan.public.del + '</button><button class="btn btn-default btn-sm mr5 rs-read" disabled="disabled">' + lan.bt.task_tip_read + '</button><button class="btn btn-default btn-sm">' + lan.bt.task_tip_all + '</button></div>\ <div id="taskPage" class="page"></div>\ </div>'; var msg_count = g.page.match(/\'Pcount\'>.+<\/span>/)[0].replace(/[^0-9]/ig, ""); $(".msg_count").text(parseInt(msg_count) - task_count); $(".taskcon").html(con); $("#taskPage").html(g.page); $("#Rs-checkAll").click(function() { if ($(this).prop("checked")) { $("#remind").find("input").prop("checked", true) } else { $("#remind").find("input").prop("checked", false) } }); }) } function GetReloads() { var a = 0; var mm = $("#taskList").html() if (mm == undefined || mm.indexOf(lan.bt.task_list) == -1) { clearInterval(speed); a = 0; speed = null; return } if (speed) return; speed = setInterval(function() { var mm = $("#taskList").html() if (mm == undefined || mm.indexOf(lan.bt.task_list) == -1) { clearInterval(speed); speed = null; a = 0; return } a++; $.post("/files?action=GetTaskSpeed", "", function(h) { if (h.task == undefined) { $(".cmdlist").html(lan.bt.task_not_list); return } if (h.status === false) { clearInterval(speed); speed = null; a = 0; return } var b = ""; var d = ""; $("#task").text(h.task.length); $(".task_count").text(h.task.length); for (var g = 0; g < h.task.length; g++) { if (h.task[g].status == "-1") { if (h.task[g].type != "download") { var c = ""; var f = h.msg.split("\n"); for (var e = 0; e < f.length; e++) { c += f[e] + "<br>" } if (h.task[g].name.indexOf(lan.public.scan) != -1) { b = "<li><span class='titlename'>" + h.task[g].name + "</span><span class='state'>" + lan.bt.task_scan + " <img src='/static/img/ing.gif'> | <a href=\"javascript:RemoveTask(" + h.task[g].id + ")\">" + lan.public.close + "</a></span><span class='opencmd'></span><div class='cmd'>" + c + "</div></li>" } else { b = "<li><span class='titlename'>" + h.task[g].name + "</span><span class='state'>" + lan.bt.task_install + " <img src='/static/img/ing.gif'> | <a href=\"javascript:RemoveTask(" + h.task[g].id + ")\">" + lan.public.close + "</a></span><div class='cmd'>" + c + "</div></li>" } } else { b = "<li><div class='line-progress' style='width:" + h.msg.pre + "%'></div><span class='titlename'>" + h.task[g].name + "<a style='margin-left:130px;'>" + (ToSize(h.msg.used) + "/" + ToSize(h.msg.total)) + "</a></span><span class='com-progress'>" + h.msg.pre + "%</span><span class='state'>" + lan.bt.task_downloading + " <img src='/static/img/ing.gif'> | <a href=\"javascript:RemoveTask(" + h.task[g].id + ")\">" + lan.public.close + "</a></span></li>" } } else { d += "<li><span class='titlename'>" + h.task[g].name + "</span><span class='state'>" + lan.bt.task_sleep + " | <a style='color:green' href=\"javascript:RemoveTask(" + h.task[g].id + ')">' + lan.public.del + '</a></span></li>' } } $(".cmdlist").html(b + d); $(".cmd").html(c); try { if ($(".cmd")[0].scrollHeight) $(".cmd").scrollTop($(".cmd")[0].scrollHeight); } catch (e) { return; } }).error(function() {}); }, 1000); } //检查选中项 function RscheckSelect() { setTimeout(function() { var checkList = $("#remind").find("input"); var count = 0; for (var i = 0; i < checkList.length; i++) { if (checkList[i].checked) count++; } if (count > 0) { $(".buttongroup .btn").removeAttr("disabled"); } else { $(".rs-del,.rs-read").attr("disabled", "disabled"); } }, 5); } function tasklist(a) { var con = '<ul class="cmdlist"></ul><span style="position: fixed;bottom: 13px;">' + lan.public.task_long_time_not_exec + '</span>'; $(".taskcon").html(con); a = a == undefined ? 1 : a; $.post("/data?action=getData", "tojs=GetTaskList&table=tasks&limit=10&p=" + a, function(g) { var e = ""; var b = ""; var c = ""; var f = false; var task_count = 0; for (var d = 0; d < g.data.length; d++) { switch (g.data[d].status) { case "-1": f = true; if (g.data[d].type != "download") { b = "<li><span class='titlename'>" + g.data[d].name + "</span><span class='state pull-right c6'>" + lan.bt.task_install + " <img src='/static/img/ing.gif'> | <a class='btlink' href=\"javascript:RemoveTask(" + g.data[d].id + ")\">" + lan.public.close + "</a></span><span class='opencmd'></span><pre class='cmd'></pre></li>" } else { b = "<li><div class='line-progress' style='width:0%'></div><span class='titlename'>" + g.data[d].name + "<a id='speed' style='margin-left:130px;'>0.0M/12.5M</a></span><span class='com-progress'>0%</span><span class='state'>" + lan.bt.task_downloading + " <img src='/static/img/ing.gif'> | <a href=\"javascript:RemoveTask(" + g.data[d].id + ")\">" + lan.public.close + "</a></span></li>" } task_count++; break; case "0": c += "<li><span class='titlename'>" + g.data[d].name + "</span><span class='state pull-right c6'>" + lan.bt.task_sleep + "</span> | <a href=\"javascript:RemoveTask(" + g.data[d].id + ")\" class='btlink'>" + lan.public.del + "</a></li>"; task_count++; break; } } $(".task_count").text(task_count); get_msg_data(1, function(d) { var msg_count = d.page.match(/\'Pcount\'>.+<\/span>/)[0].replace(/[^0-9]/ig, ""); $(".msg_count").text(parseInt(msg_count)); }) $(".cmdlist").html(b + c); GetReloads(); return f }) } //检查登陆状态 function check_login() { $.post('/ajax?action=CheckLogin', {}, function(rdata) { if (rdata === true) return; }); } //登陆跳转 function to_login() { layer.confirm(lan.public.login_expire, { title: lan.public.session_expire, icon: 2, closeBtn: 1, shift: 5 }, function() { location.reload(); }); } //表格头固定 function table_fixed(name) { var tableName = document.querySelector('#' + name); tableName.addEventListener('scroll', scroll_handle); } function scroll_handle(e) { var scrollTop = this.scrollTop; $(this).find("thead").css({ "transform": "translateY(" + scrollTop + "px)", "position": "relative", "z-index": "1" }); } var clipboard, interval, socket, term, ssh_login, term_box; var pdata_socket = { x_http_token: document.getElementById("request_token_head").getAttribute('token') } var Term = { bws: null, //websocket对象 route: '/webssh', //被访问的方法 term: null, term_box: null, ssh_info: {}, last_body:false, last_cd:null, config:{ cols:0, rows:0, fontSize:12 }, // 缩放尺寸 detectZoom:(function(){ var ratio = 0, screen = window.screen, ua = navigator.userAgent.toLowerCase(); if (window.devicePixelRatio !== undefined) { ratio = window.devicePixelRatio; } else if (~ua.indexOf('msie')) { if (screen.deviceXDPI && screen.logicalXDPI) { ratio = screen.deviceXDPI / screen.logicalXDPI; } } else if (window.outerWidth !== undefined && window.innerWidth !== undefined) { ratio = window.outerWidth / window.innerWidth; } if (ratio){ ratio = Math.round(ratio * 100); } return ratio; })(), //连接websocket connect: function() { if (!Term.bws || Term.bws.readyState == 3 || Term.bws.readyState == 2) { //连接 ws_url = (window.location.protocol === 'http:' ? 'ws://' : 'wss://') + window.location.host + Term.route; Term.bws = new WebSocket(ws_url); //绑定事件 Term.bws.addEventListener('message', Term.on_message); Term.bws.addEventListener('close', Term.on_close); Term.bws.addEventListener('error', Term.on_error); Term.bws.addEventListener('open',Term.on_open); //if (Term.ssh_info) Term.send(JSON.stringify(Term.ssh_info)) } }, //连接服务器成功 on_open:function(ws_event){ Term.send(JSON.stringify(Term.ssh_info || {})) // Term.term.FitAddon.fit(); // Term.resize(); var f_path = $("#fileInputPath").val(); if(f_path){ Term.last_cd = "cd " + f_path; Term.send(Term.last_cd + "\n"); } }, //服务器消息事件 // on_message: function(ws_event) { // result = ws_event.data; // if (result === "\r'Server connection failed'!\r" || result === "\rWrong user name or password!\r") { // show_ssh_login(result); // Term.close(); // return; // } // Term.term.write(result); // if (result == '\r\n登出\r\n' || result == '登出\r\n' || result == '\r\nlogout\r\n' || result == 'logout\r\n') { // setTimeout(function() { // layer.close(Term.term_box); // }, 500); // Term.close(); // Term.bws = null; // } // }, on_message: function (ws_event) { result = ws_event.data; if ((result.indexOf("@127.0.0.1:") != -1 || result.indexOf("@localhost:") != -1) && result.indexOf('Authentication failed') != -1) { Term.term.write(result); Term.localhost_login_form(result); Term.close(); return; } if(Term.last_cd){ if(result.indexOf(Term.last_cd) != -1 && result.length - Term.last_cd.length < 3) { Term.last_cd = null; return; } } if (result === "\rServer connection failed!\r" || result == "\rWrong user name or password!\r") { Term.close(); return; } if(result.length > 1 && Term.last_body === false){ Term.last_body = true; } Term.term.write(result); if (result == '\r\n登出\r\n' || result == '\r\n注销\r\n' || result == '注销\r\n' || result == '登出\r\n' || result == '\r\nlogout\r\n' || result == 'logout\r\n') { setTimeout(function () { layer.close(Term.term_box); Term.term.dispose(); }, 500); Term.close(); Term.bws = null; } }, //websocket关闭事件 on_close: function(ws_event) { Term.bws = null; }, //websocket错误事件 // on_error: function(ws_event) { // if(ws_event.target.readyState === 3){ // var msg = 'Error: unable to create websocket connection, please close 【Developer mode】 on the settings page'; // layer.msg(msg,{time:5000}) // if(Term.state === 3) return // Term.term.write(msg) // Term.state = 3; // }else{ // console.log(ws_event) // } // }, on_error: function (ws_event) { if(ws_event.target.readyState === 3){ if(Term.state === 3) return Term.term.write(msg) Term.state = 3; }else{ console.log(ws_event) } }, //关闭连接 close: function () { if(Term.bws){ Term.bws.close(); } }, resize: function () { setTimeout(function(){ $("#term").height($(".term_box_all .layui-layer-content").height()-18) Term.term.FitAddon.fit() Term.send(JSON.stringify({resize:1,rows:Term.term.rows,cols:Term.term.cols})); Term.term.focus(); },100) }, // resize: function() { // var m_width = 100; // var m_height = 34; // Term.term.resize(m_width, m_height); // Term.term.scrollToBottom(); // Term.term.focus(); // Term.send('new_terminal'); // }, //发送数据 //@param event 唯一事件名称 //@param data 发送的数据 //@param collback 服务器返回结果时回调的函数,运行完后将被回收 send: function(data, num) { //如果没有连接,则尝试连接服务器 if (!Term.bws || Term.bws.readyState == 3 || Term.bws.readyState == 2) { Term.connect(); } //判断当前连接状态,如果!=1,则100ms后尝试重新发送 if (Term.bws.readyState === 1) { Term.bws.send(data); } else { if(Term.state === 3) return; if (!num) num = 0; if (num < 5) { num++; setTimeout(function() { Term.send(data, num++); }, 100) } } }, // run: function (ssh_info) { // var termCols = 100; // var termRows = 34; // var loadT = layer.msg('It is loading the files required by the terminal. Please wait...', { icon: 16, time: 0, shade: 0.3 }); // loadScript([ // "/static/build/xterm.min.js", // "/static/build/addons/attach/attach.min.js", // "/static/build/addons/fit/fit.min.js", // "/static/build/addons/fullscreen/fullscreen.min.js", // "/static/build/addons/search/search.min.js", // "/static/build/addons/winptyCompat/winptyCompat.js" // ], function () { // layer.close(loadT); // Term.term = new Terminal({ cols: termCols, rows: termRows, screenKeys: true, useStyle: true }); // Term.term.setOption('cursorBlink', true); // Term.term_box = layer.open({ // type: 1, // title: lan.public.terminal, // area: ['920px', '630px'], // closeBtn: 2, // shadeClose: false, // content: '<link rel="stylesheet" href="/static/build/xterm.min.css" />\ // <link rel="stylesheet" href="/static/build/addons/fullscreen/fullscreen.min.css" />\ // <a class="btlink" onclick="show_ssh_login(1)" style="position: fixed;margin-left: 83px;margin-top: -30px;">[' + lan.public.set + ']</a>\ // <div class="term-box" style="background-color:#000"><div id="term"></div></div>', // cancel: function () { // Term.term.destroy(); // }, // success: function () { // Term.term.open(document.getElementById('term')); // Term.resize(); // } // }); // Term.term.on('data', function (data) { // try { // Term.bws.send(data) // } catch (e) { // Term.term.write('\r\nThe connection is lost and you are trying to reconnect!\r\n') // Term.connect() // } // }); // if (ssh_info) Term.ssh_info = ssh_info // Term.connect(); // }) // }, run: function (ssh_info) { if($("#panel_debug").attr("data") == 'True') { layer.msg('Error: unable to create websocket connection, please close 【Developer mode】 on the settings page!',{icon:2,time:5000}); return; } var loadT = layer.msg('It is loading the files required by the terminal. Please wait...', { icon: 16, time: 0, shade: 0.3 }); loadScript([ "/static/js/xterm.js" ],function(){ layer.close(loadT); Term.term = new Terminal({ rendererType: "canvas", cols: 100, rows: 31, fontSize:15, screenKeys: true, useStyle: true , }); Term.term.setOption('cursorBlink', true); Term.last_body = false; Term.term_box = layer.open({ type: 1, title: lan.public.terminal, area: ['925px', '630px'], closeBtn: 2, shadeClose: false, skin:'term_box_all', content: '<link rel="stylesheet" href="/static/css/xterm.css" />\ <div class="term-box" style="background-color:#000;padding-top: 7px;" id="term"></div>', cancel: function (index,lay) { bt.confirm({msg:'<div style="word-break: break-word;">Closing the SSH session, the command in progress in the current command line session may be aborted. Continute?</div>',title: "Cofirm to close the SSH session?"},function(ix){ Term.term.dispose(); layer.close(index); layer.close(ix); Term.close(); }); return false; }, success: function () { $('.term_box_all').css('background-color','#000'); Term.term.open(document.getElementById('term')); Term.term.FitAddon = new FitAddon.FitAddon(); Term.term.loadAddon(Term.term.FitAddon); Term.term.WebLinksAddon = new WebLinksAddon.WebLinksAddon() Term.term.loadAddon(Term.term.WebLinksAddon) Term.term.focus(); } }); Term.term.onData(function (data) { try { Term.bws.send(data) } catch (e) { Term.term.write('\r\nThe connection is lost and you are trying to reconnect!\r\n') Term.connect() } }); if (ssh_info) Term.ssh_info = ssh_info Term.connect(); }); }, reset_login: function() { var ssh_info = { data: JSON.stringify({ host: $("input[name='host']").val(), port: $("input[name='port']").val(), username: $("input[name='username']").val(), password: $("input[name='password']").val() }) } $.post('/term_open', ssh_info, function(rdata) { if (rdata.status === false) { layer.msg(rdata.msg); return; } layer.closeAll(); Term.connect(); Term.term.scrollToBottom(); Term.term.focus(); }); }, localhost_login_form:function(result){ var template = '<div class="localhost-form-shade"><div class="localhost-form-view bt-form-2x"><div class="localhost-form-title"><i class="localhost-form_tip"></i><span style="vertical-align: middle;">Login failed, please fill the local server information!</span></div>\ <div class="line input_group">\ <span class="tname">Server IP</span>\ <div class="info-r">\ <input type="text" name="host" class="bt-input-text mr5" style="width:240px" placeholder="Server IP" value="127.0.0.1" autocomplete="off" />\ <input type="text" name="port" class="bt-input-text mr5" style="width:60px" placeholder="Port" value="22" autocomplete="off"/>\ </div>\ </div>\ <div class="line">\ <span class="tname">SSH account</span>\ <div class="info-r">\ <input type="text" name="username" class="bt-input-text mr5" style="width:305px" placeholder="SSH account" value="root" autocomplete="off"/>\ </div>\ </div>\ <div class="line">\ <span class="tname">Verification</span>\ <div class="info-r ">\ <div class="btn-group">\ <button type="button" tabindex="-1" class="btn btn-sm auth_type_checkbox btn-success" data-ctype="0">Password</button>\ <button type="button" tabindex="-1" class="btn btn-sm auth_type_checkbox btn-default data-ctype="1">Server key</button>\ </div>\ </div>\ </div>\ <div class="line c_password_view show">\ <span class="tname">Password</span>\ <div class="info-r">\ <input type="text" name="password" class="bt-input-text mr5" placeholder="SSH Password" style="width:305px;" value="" autocomplete="off"/>\ </div>\ </div>\ <div class="line c_pkey_view hidden">\ <span class="tname">Private key</span>\ <div class="info-r">\ <textarea rows="4" name="pkey" class="bt-input-text mr5" placeholder="SSH server key" style="width:305px;height: 80px;line-height: 18px;padding-top:10px;"></textarea>\ </div>\ </div><button type="submit" class="btn btn-sm btn-success">Login</button></div></div>'; $('.term-box').after(template); $('.auth_type_checkbox').click(function(){ var index = $(this).index(); $(this).addClass('btn-success').removeClass('btn-default').siblings().removeClass('btn-success').addClass('btn-default') switch(index){ case 0: $('.c_password_view').addClass('show').removeClass('hidden'); $('.c_pkey_view').addClass('hidden').removeClass('show').find('input').val(''); break; case 1: $('.c_password_view').addClass('hidden').removeClass('show').find('input').val(''); $('.c_pkey_view').addClass('show').removeClass('hidden'); break; } }); $('.localhost-form-view > button').click(function(){ var form = {}; $('.localhost-form-view input,.localhost-form-view textarea').each(function(index,el){ var name = $(this).attr('name'),value = $(this).val(); form[name] = value; switch(name){ case 'port': if(!bt.check_port(value)){ bt.msg({status:false,msg:'Server port format error!'}); return false; } break; case 'username': if(value == ''){ bt.msg({status:false,msg:'Server user name cannot be empty!'}); return false; } break; case 'password': if(value == '' && $('.c_password_view').hasClass('show')){ bt.msg({status:false,msg:'Server password cannot be empty!'}); return false; } break; case 'pkey': if(value == '' && $('.c_pkey_view').hasClass('show')){ bt.msg({status:false,msg:'The server key cannot be empty!'}); return false; } break; } }); form.ps = 'Local server'; if(result){ if(result.indexOf('@127.0.0.1') != -1){ var user = result.split('@')[0].split(',')[1]; var port = result.split('1:')[1] $("input[name='username']").val(user); $("input[name='port']").val(port); } } var loadT = bt.load('Adding server information, please wait...'); bt.send('create_host','xterm/create_host',form,function(res){ loadT.close(); bt.msg(res); if(res.status){ bt.msg({status:true,msg:'Login successful!'}); $('.layui-layer-shade').remove(); $('.term_box_all').remove(); Term.term.dispose(); Term.close(); web_shell(); } }); }); $('.localhost-form-view [name="password"]').keyup(function(e){ if(e.keyCode == 13){ $('.localhost-form-view > button').click(); } }).focus() } } function web_shell() { Term.run(); } socket = { emit: function(data, data2) { if (data === 'webssh') { data = data2 } if (typeof(data) === 'object') { return; } Term.send(data); } } function show_ssh_login(is_config) { if ($("input[name='ssh_user']").attr('autocomplete')) return; var s_body = '<div class="bt-form bt-form pd20 pb70">\ <style>.ssh_check_s1{ display: inline-block;\ height: 38px;\ background-color: #fff;\ color: #050505;\ white-space: nowrap;\ text-align: center;\ cursor: pointer;\ border-radius: 0;\ margin-left: 0px !important;\ position: relative;\ top: 2px;\ line-height: 34px;\ font-size: 13px;\ border-color: #e6e6e6;\ padding: 0 14px;\ border: 1px solid #e0dfdf;}\ .ssh_check_s2{margin-left: 0 !important;\ position: relative;\ top: 2px;\ border-color: #e6e6e6;\ display: inline - block;\ height: 38px;\ line-height: 38px;\ padding: 0 18px;\ background-color: #20a53a;\ color: #fff;\ white-space: nowrap;\ text-align: center;\ font-size: 14px;\ border: none;\ border-radius: 2px;\ cursor: pointer;} </style >\ <div class="line " style="margin-left: -40px;"><span class="tname">IP</span><div class="info-r "><input name="ssh_host" class="bt-input-text mr5" type="text" style="width:330px" value="127.0.0.1" autocomplete="off"></div></div>\ <div class="line " style="margin-left: -40px;"><span class="tname">Port</span><div class="info-r "><input name="ssh_port" class="bt-input-text mr5" type="text" style="width:330px" value="22" autocomplete="off"></div></div>\ <div class="line " style="margin-left: -40px;"><span class="tname">Username</span><div class="info-r "><input name="ssh_user" class="bt-input-text mr5" type="text" style="width:330px" value="root" readonly="readonly" autocomplete="off"></div></div>\ <div class="line " style="margin-left: -40px;"><span class="tname">Method</span><div class="info-r "><button class="ssh_check_s2" id="pass_check" onclick="pass_check()">Password</button><button id="rsa_check" class="ssh_check_s1" onclick="rsa_check()">Key</button></div></div>\ <div class="line ssh_passwd" style="margin-left: -40px;"><span class="tname">Password</span><div class="info-r "><input name="ssh_passwd" readonly="readonly" class="bt-input-text mr5" type="password" style="width:330px" value="" autocomplete="off"></div></div>\ <div class="line ssh_pkey" style="display:none;margin-left: -40px;"><span class="tname">Key</span><div class="info-r "><textarea name="ssh_pkey" class="bt-input-text mr5" style="width:330px;height:80px;" ></textarea></div></div>\ <div class="line " style="margin-left: -40px;"><span class="tname"></span><div class="info-r "><input style="margin-top: 1px;width: 16px;" name="ssh_is_save" id="ssh_is_save" class="bt-input-text mr5" type="checkbox" ><label style="position: absolute;margin-left: 5px;" for="ssh_is_save">Remember password, the next time you use the aaPanel terminal will automatically log in</label></div></div>\ <p style="color: red;margin-top: 10px;text-align: center;margin-left: -62px;">Only support login to this server</p>\ <div class="bt-form-submit-btn"><button type="button" class="btn btn-sm btn-danger" onclick="' + (is_config ? 'layer.close(ssh_login)' : 'layer.closeAll()') + '">Close</button><button type="button" class="btn btn-sm btn-success ssh-login" onclick="send_ssh_info()">' + (is_config ? 'Confirm' : 'Login SSH') + '</button></div></div>'; ssh_login = layer.open({ type: 1, title: is_config ? 'Please fill in the SSH connection configuration' : 'Please enter the SSH login account and password', area: "500px", closeBtn: 0, shadeClose: false, content: s_body }); setTimeout(function removeReadonly() { $("input[name='ssh_user']").removeAttr('readonly'); $("input[name='ssh_passwd']").removeAttr('readonly'); $("input[name='ssh_passwd']").focus(); $("input[name='ssh_passwd']").keydown(function(e) { if (e.keyCode == 13) { $('.ssh-login').click(); } }); }, 500); } function pass_check() { $("#pass_check").attr("class", "ssh_check_s2"); $("#rsa_check").attr("class", "ssh_check_s1"); $(".ssh_pkey").hide(); $(".ssh_passwd").show(); } function rsa_check() { $("#pass_check").attr("class", "ssh_check_s1"); $("#rsa_check").attr("class", "ssh_check_s2"); $(".ssh_pkey").show(); $(".ssh_passwd").hide(); } function send_ssh_info() { pdata = { host: $("input[name='ssh_host']").val(), port: Number($("input[name='ssh_port']").val()), password: $("input[name='ssh_passwd']").val(), username: $("input[name='ssh_user']").val(), pkey: $("textarea[name='ssh_pkey']").val() } if (pdata['host'] !== '127.0.0.1' && pdata['host'] !== 'localhost') { layer.msg("Connection address can only be [ 127.0.0.1 or localhost ]"); $("input[name='ssh_host']").focus(); return; } if (pdata['port'] < 1 || pdata['port'] > 65535) { layer.msg("Port range is incorrect [1-65535]"); $("input[name='ssh_port']").focus(); return; } if (!pdata['username']) { layer.msg("Username can not be empty!"); $("input[name='ssh_user']").focus(); return; } if ($("#rsa_check").attr("class") === "ssh_check_s2") { pdata['c_type'] = 'True' if (!pdata['pkey']) { layer.msg("Private key cannot be empty!"); $("input[name='ssh_pkey']").focus(); return; } } else { if (!pdata['password']) { layer.msg("Password can not be blank!"); $("input[name='ssh_passwd']").focus(); return; } } if ($("#ssh_is_save").prop("checked")) { pdata['is_save'] = '1'; } var loadT = layer.msg('Trying to log in to SSH...', { icon: 16, time: 0, shade: 0.3 }); $.post("/term_open", { data: JSON.stringify(pdata) }, function() { layer.close(loadT) Term.send('reset_connect'); layer.close(ssh_login) Term.term.focus(); }) } acme = { speed_msg: "<pre style='margin-bottom: 0px;height:250px;text-align: left;background-color: #000;color: #fff;white-space: pre-wrap;' id='create_lst'>[MSG]</pre>", loadT: null, //获取订单列表 get_orders: function(callback) { acme.request('get_orders', {}, function(rdata) { callback(rdata) }, 'Getting order list...'); }, //取指定订单 get_find: function(index, callback) { acme.request('get_order_find', { index: index }, function(rdata) { callback(rdata) }, 'Getting order information...') }, //下载指定证书包 download_cert: function(index, callback) { acme.request('update_zip', { index: index }, function(rdata) { if (!rdata.status) { bt.msg(rdata); return; } if (callback) { callback(rdata) } else { window.location.href = '/download?filename=' + rdata.msg } }, 'Preparing to download..'); }, //删除订单 remove: function(index, callback) { acme.request('remove_order', { index: index }, function(rdata) { bt.msg(rdata); if (callback) callback(rdata) }); }, //吊销证书 revoke: function(index, callback) { acme.request('revoke_order', { index: index }, function(rdata) { bt.msg(rdata); if (callback) callback(rdata) }, 'Revoking certificate...'); }, //验证域名(手动DNS申请) auth_domain: function(index, callback) { acme.show_speed_window('Verifying DNS...', function() { acme.request('apply_dns_auth', { index: index }, function(rdata) { callback(rdata) }, false); }); }, //取证书基本信息 get_cert_init: function(pem_file, siteName, callback) { acme.request('get_cert_init_api', { pem_file: pem_file, siteName: siteName }, function(cert_init) { callback(cert_init); }, 'Getting certificate information...'); }, //显示进度 show_speed: function() { bt.send('get_lines', 'ajax/get_lines', { num: 10, filename: "/www/server/panel/logs/letsencrypt.log" }, function(rdata) { if ($("#create_lst").text() === "") return; if (rdata.status === true) { $("#create_lst").text(rdata.msg); $("#create_lst").scrollTop($("#create_lst")[0].scrollHeight); } setTimeout(function() { acme.show_speed(); }, 1000); }); }, //显示进度窗口 show_speed_window: function(msg, callback) { acme.loadT = layer.open({ title: false, type: 1, closeBtn: 0, shade: 0.3, area: "500px", offset: "30%", content: acme.speed_msg.replace('[MSG]', msg), success: function(layers, index) { setTimeout(function() { acme.show_speed(); }, 1000); if (callback) callback(); } }); }, //一键申请 //domain 域名列表 [] //auth_type 验证类型 dns/http //auth_to 验证路径 网站根目录或dnsapi //auto_wildcard 是否自动组合通配符 1.是 0.否 默认0 apply_cert: function(domains, auth_type, auth_to, auto_wildcard, callback) { acme.show_speed_window('Applying for a certificate...', function() { if (auto_wildcard === undefined) auto_wildcard = '0' pdata = { domains: JSON.stringify(domains), auth_type: auth_type, auth_to: auth_to, auto_wildcard: auto_wildcard } if (acme.id) pdata['id'] = acme.id; if (acme.siteName) pdata['siteName'] = acme.siteName; acme.request('apply_cert_api', pdata, function(rdata) { callback(rdata); }, false); }); }, //续签证书 renew: function(index, callback) { acme.show_speed_window('Renewing certificate...', function() { acme.request('renew_cert', { index: index }, function(rdata) { callback(rdata) }, false); }); }, //获取用户信息 get_account_info: function(callback) { acme.request('get_account_info', {}, function(rdata) { callback(rdata) }); }, //设置用户信息 set_account_info: function(account, callback) { acme.request('set_account_info', account, function(rdata) { bt.msg(rdata) if (callback) callback(rdata) }); }, //发送到请求 request: function(action, pdata, callback, msg) { if (msg == undefined) msg = 'Processing, please wait...'; if (msg) { var loadT = layer.msg(msg, { icon: 16, time: 0, shade: 0.3 }); } $.post("/acme?action=" + action, pdata, function(res) { if (msg) layer.close(loadT) if (callback) callback(res) }); } }
変更されたテキスト
ファイルを開く
$(function(){ $.fn.extend({ fixedThead:function(options){ var _that = $(this); console.log(_that); var option = { height:400, shadow:true, resize:true }; options = $.extend(option,options); if($(this).find('table').length === 0){ return false; } var _height = $(this)[0].style.height,_table_config = _height.match(/([0-9]+)([%\w]+)/); if(_table_config === null){ _table_config = [null,options.height,'px']; }else{ $(this).css({ 'boxSizing': 'content-box', 'paddingBottom':$(this).find('thead').height() }); } $(this).css({'position':'relative'}); var _thead = $(this).find('thead')[0].outerHTML, _tbody = $(this).find('tbody')[0].outerHTML, _thead_div = $('<div class="thead_div"><table class="table table-hover mb0"></table></div>'), _shadow_top = $('<div class="tbody_shadow_top"></div>'), _tbody_div = $('<div class="tbody_div" style="height:'+ _table_config[1] + _table_config[2] +';"><table class="table table-hover mb0" style="margin-top:-'+ $(this).find('thead').height() +'px"></table></div>'), _shadow_bottom = $('<div class="tbody_shadow_bottom"></div>'); _thead_div.find('table').append(_thead); _tbody_div.find('table').append(_thead); _tbody_div.find('table').append(_tbody); $(this).html(''); $(this).append(_thead_div); $(this).append(_shadow_top); $(this).append(_tbody_div); $(this).append(_shadow_bottom); var _table_width = _that.find('.thead_div table')[0].offsetWidth, _body_width = _that.find('.tbody_div table')[0].offsetWidth, _length = _that.find('tbody tr:eq(0)>td').length; $(this).find('tbody tr:eq(0)>td').each(function(index,item){ var _item = _that.find('thead tr:eq(0)>th').eq(index); if(index === (_length-1)){ _item.attr('width',$(item)[0].clientWidth + (_table_width - _body_width)); }else{ _item.attr('width',$(item)[0].offsetWidth); } }); if(options.resize){ $(window).resize(function(){ var _table_width = _that.find('.thead_div table')[0].offsetWidth, _body_width = _that.find('.tbody_div table')[0].offsetWidth, _length = _that.find('tbody tr:eq(0)>td').length; _that.find('tbody tr:eq(0)>td').each(function(index,item){ var _item = _that.find('thead tr:eq(0)>th').eq(index); if(index === (_length-1)){ _item.attr('width',$(item)[0].clientWidth + (_table_width - _body_width)); }else{ _item.attr('width',$(item)[0].offsetWidth); } }); }); } if(options.shadow){ var table_body = $(this).find('.tbody_div')[0]; if(_table_config[1] >= table_body.scrollHeight){ $(this).find('.tbody_shadow_top').hide(); $(this).find('.tbody_shadow_bottom').hide(); }else{ $(this).find('.tbody_shadow_top').hide(); $(this).find('.tbody_shadow_bottom').show(); } $(this).find('.tbody_div').scroll(function(e){ var _scrollTop = $(this)[0].scrollTop, _scrollHeight = $(this)[0].scrollHeight, _clientHeight = $(this)[0].clientHeight, _shadow_top = _that.find('.tbody_shadow_top'), _shadow_bottom = _that.find('.tbody_shadow_bottom'); if(_scrollTop == 0){ _shadow_top.hide(); _shadow_bottom.show(); }else if(_scrollTop > 0 && _scrollTop < (_scrollHeight - _clientHeight)){ _shadow_top.show(); _shadow_bottom.show(); }else if(_scrollTop == (_scrollHeight - _clientHeight)){ _shadow_top.show(); _shadow_bottom.hide(); } }) } } }); }(jQuery)) $(document).ready(function() { $(".sub-menu a.sub-menu-a").click(function() { $(this).next(".sub").slideToggle("slow").siblings(".sub:visible").slideUp("slow"); }); }); var aceEditor = { layer_view: '', aceConfig:{}, //ace配置参数 editor: null, supportedModes: { Apache_Conf: ["^htaccess|^htgroups|^htpasswd|^conf|htaccess|htgroups|htpasswd"], BatchFile: ["bat|cmd"], C_Cpp: ["cpp|c|cc|cxx|h|hh|hpp|ino"], CSharp: ["cs"], CSS: ["css"], Dockerfile: ["^Dockerfile"], golang: ["go"], HTML: ["html|htm|xhtml|vue|we|wpy"], Java: ["java"], JavaScript: ["js|jsm|jsx"], 'JSON': ["json"], JSP: ["jsp"], LESS: ["less"], Lua: ["lua"], Makefile: ["^Makefile|^GNUmakefile|^makefile|^OCamlMakefile|make"], Markdown: ["md|markdown"], MySQL: ["mysql"], Nginx: ["nginx|conf"], INI: ["ini|conf|cfg|prefs"], ObjectiveC: ["m|mm"], Perl: ["pl|pm"], Perl6: ["p6|pl6|pm6"], pgSQL: ["pgsql"], PHP_Laravel_blade: ["blade.php"], PHP: ["php|inc|phtml|shtml|php3|php4|php5|phps|phpt|aw|ctp|module"], Powershell: ["ps1"], Python: ["py"], R: ["r"], Ruby: ["rb|ru|gemspec|rake|^Guardfile|^Rakefile|^Gemfile"], Rust: ["rs"], SASS: ["sass"], SCSS: ["scss"], SH: ["sh|bash|^.bashrc"], SQL: ["sql"], SQLServer: ["sqlserver"], Swift: ["swift"], Text: ["txt"], Typescript: ["ts|typescript|str"], VBScript: ["vbs|vb"], Verilog: ["v|vh|sv|svh"], XML: ["xml|rdf|rss|wsdl|xslt|atom|mathml|mml|xul|xbl|xaml"], YAML: ["yaml|yml"], Compress: ['tar|zip|7z|rar|gz|arj|z'], images: ['icon|jpg|jpeg|png|bmp|gif|tif|emf'] }, nameOverrides: { ObjectiveC: "Objective-C", CSharp: "C#", golang: "Go", C_Cpp: "C and C++", PHP_Laravel_blade: "PHP (Blade Template)", Perl6: "Perl 6", }, pathAarry: [], encodingList: ['ASCII', 'UTF-8', 'GBK', 'GB2312', 'BIG5'], themeList: [ 'chrome', 'monokai' ], fontSize: '13px', editorTheme: 'monokai', // 编辑器主题 editorLength: 0, isAceView: true, ace_active: '', is_resizing: false, menu_path:'', //当前文件目录根地址 refresh_config:{ el:{}, // 需要重新获取的元素,为DOM对象 path:'',// 需要获取的路径文件信息 group:1,// 当前列表层级,用来css固定结构 is_empty:true }, //刷新配置参数 // 事件编辑器-方法,事件绑定 eventEditor: function() { var _this = this,_icon = '<span class="icon"><i class="glyphicon glyphicon-ok" aria-hidden="true"></i></span>'; $(window).resize(function(){ if(_this.ace_active != undefined) _this.setEditorView() if( $('.aceEditors .layui-layer-maxmin').length >0){ $('.aceEditors').css({ 'top':0, 'left':0, 'width':$(this)[0].innerWidth, 'height':$(this)[0].innerHeight }); } }) $(document).click(function(e){ $('.ace_toolbar_menu').hide(); $('.ace_conter_editor .ace_editors').css('fontSize', _this.aceConfig.aceEditor.fontSize + 'px'); $('.ace_toolbar_menu .menu-tabs,.ace_toolbar_menu .menu-encoding,.ace_toolbar_menu .menu-files').hide(); }); $('.ace_editor_main').on('click',function(){ $('.ace_toolbar_menu').hide(); }); $('.ace_toolbar_menu').click(function(e){ e.stopPropagation(); e.preventDefault(); }); // 显示工具条 $('.ace_header .pull-down').click(function(){ if($(this).find('i').hasClass('glyphicon-menu-down')){ $('.ace_header').css({'top':'-35px'}); $('.ace_overall').css({'top':'0'}); $(this).css({'top':'35px','height':'40px','line-height':'40px'}); $(this).find('i').addClass('glyphicon-menu-up').removeClass('glyphicon-menu-down'); }else{ $('.ace_header').css({'top':'0'}); $('.ace_overall').css({'top':'35px'}); $(this).removeAttr('style'); $(this).find('i').addClass('glyphicon-menu-down').removeClass('glyphicon-menu-up'); } _this.setEditorView(); }); // 切换TAB视图 $('.ace_conter_menu').on('click', '.item', function (e) { var _id = $(this).attr('data-id'),_item = _this.editor['ace_editor_' + _id]; $('.item_tab_'+ _id).addClass('active').siblings().removeClass('active'); $('#ace_editor_'+ _id).addClass('active').siblings().removeClass('active'); _this.ace_active = _id; _this.currentStatusBar(_id); _this.is_file_history(_item); }); // 移上TAB按钮变化,仅文件被修改后 $('.ace_conter_menu').on('mouseover', '.item .icon-tool', function () { var type = $(this).attr('data-file-state'); if (type != '0') { $(this).removeClass('glyphicon-exclamation-sign').addClass('glyphicon-remove'); } }); // 移出tab按钮变化,仅文件被修改后 $('.ace_conter_menu').on('mouseout', '.item .icon-tool', function () { var type = $(this).attr('data-file-state'); if (type != '0') { $(this).removeClass('glyphicon-remove').addClass('glyphicon-exclamation-sign'); } }); // 关闭编辑视图 $('.ace_conter_menu').on('click', '.item .icon-tool', function(e) { var file_type = $(this).attr('data-file-state'); var file_title = $(this).attr('data-title'); var _path = $(this).parent().parent().attr('title'); var _id = $(this).parent().parent().attr('data-id'); switch (file_type) { // 直接关闭 case '0': _this.removeEditor(_id); break; // 未保存 case '1': var loadT = layer.open({ type: 1, area: ['400px', '180px'], title: 'Tips', content: '<div class="ace-clear-form">\ <div class="clear-icon"></div>\ <div class="clear-title">Do you want to save changes to  <span class="size_ellipsis" style="max-width:150px;vertical-align: top;" title="' + file_title + '">' + file_title + '</span> ?</div>\ <div class="clear-tips">If you don\'t save, the changes will be lost!</div>\ <div class="ace-clear-btn" style="">\ <button type="button" class="btn btn-sm btn-default" style="float:left" data-type="2">Dont save</button>\ <button type="button" class="btn btn-sm btn-default" style="margin-right:10px;" data-type="1">Cancel</button>\ <button type="button" class="btn btn-sm btn-success" data-type="0">Save</button>\ </div>\ </div>', success: function(layers, index) { $('.ace-clear-btn .btn').click(function() { var _type = $(this).attr('data-type'), editor_item = _this.editor['ace_editor_' + _id]; switch (_type) { case '0': //保存文件 _this.saveFileBody({ path: _path, data: editor_item.ace.getValue(), encoding: editor_item.encoding }, function(res) { layer.close(index); _this.removeEditor(editor_item.id); layer.msg(res.msg, { icon: 1 }); editor_item.fileType = 0; $('.item_tab_' + editor_item.id + ' .icon-tool').attr('data-file-state', '0').removeClass('glyphicon-exclamation-sign').addClass('glyphicon-remove'); }); break; case '1': //关闭视图 layer.close(index); break; case '2': //取消保存 _this.removeEditor(_id); layer.close(index); break; } }); } }); break; } $('.ace_toolbar_menu').hide(); $('.ace_toolbar_menu .menu-tabs,.ace_toolbar_menu .menu-encoding,.ace_toolbar_menu .menu-files').hide(); e.stopPropagation(); e.preventDefault(); }); $(window).keyup(function(e){ if(e.keyCode === 116 && $('#ace_conter').length == 1){ layer.msg('Unable to refresh in editor mode. Please close and try again'); } }); // 新建编辑器视图 $('.ace_editor_add').click(function() { _this.addEditorView(); }); // 底部状态栏功能按钮 $('.ace_conter_toolbar .pull-right span').click(function(e) { var _type = $(this).attr('data-type'), _item = _this.editor['ace_editor_' + _this.ace_active]; $('.ace_toolbar_menu').show(); switch (_type) { case 'cursor': $('.ace_toolbar_menu').hide(); $('.ace_header .jumpLine').click(); break; case 'history': $('.ace_toolbar_menu').hide(); if (_item.historys.length === 0) { layer.msg(lan.public.history_file_empty, { icon: 0 }); return false; } _this.layer_view = layer.open({ type: 1, area: '550px', title: lan.public.history_version + '[ ' + _item.fileName + ' ]', skin: 'historys_layer', content: '<div class="pd20">\ <div class="divtable">\ <table class="historys table table-hover">\ <thead><tr><th>' + lan.public.file_name + '</th><th>' + lan.public.v_time + '</th><th style="text-align:right;">' + lan.public.operate + '</th></tr></thead>\ <tbody></tbody>\ </table>\ </div>\ </div>', success: function(layeo, index) { var _html = ''; for (var i = 0; i < _item.historys.length; i++) { _html += '<tr><td><span class="size_ellipsis" style="max-width:200px">' + _item.fileName + '</span></td><td>' + bt.format_data(_item.historys[i]) + '</td><td align="right"><a href="javascript:;" class="btlink open_history_file" data-time="' + _item.historys[i] + '">' + lan.public.open_file + '</a> | <a href="javascript:;" class="btlink recovery_file_historys" data-history="' + _item.historys[i] + '" data-path="' + _item.path + '">' + lan.public.restore + '</a></td></tr>' } if (_html === '') _html += '<tr><td colspan="3">' + lan.public.no_file_history + '</td></tr>' $('.historys tbody').html(_html); $('.historys_layer').css('top', ($(window).height() / 2) - ($('.historys_layer').height() / 2) + 'px') $('.open_history_file').click(function() { var _history = $(this).attr('data-time'); _this.openHistoryEditorView({ filename: _item.path, history: _history }, function() { layer.close(index); $('.ace_conter_tips').show(); $('.ace_conter_tips .tips').html(lan.public.read_only_file + _item.path + ',' + lan.public.history_v + ' [ ' + bt.format_data(new Number(_history)) + ' ]<a href="javascript:;" class="ml35 btlink" data-path="' + _item.path + '" data-history="' + _history + '">' + lan.public.restore_history + '</a>'); }); }); $('.recovery_file_historys').click(function() { _this.event_ecovery_file(this); }); } }); break; case 'tab': $('.ace_toolbar_menu .menu-tabs').show().siblings().hide(); $('.tabsType').find(_item.softTabs ? '[data-value="nbsp"]' : '[data-value="tabs"]').addClass('active').append(_icon); $('.tabsSize [data-value="' + _item.tabSize + '"]').addClass('active').append(_icon); break; case 'encoding': _this.getEncodingList(_item.encoding); $('.ace_toolbar_menu .menu-encoding').show().siblings().hide(); break; case 'lang': $('.ace_toolbar_menu').hide(); layer.msg(lan.public.can_not_switch_lan, { icon: 6 }); break; } e.stopPropagation(); e.preventDefault(); }); // 隐藏目录 $('.tips_fold_icon .glyphicon').click(function() { if ($(this).hasClass('glyphicon-menu-left')) { $('.ace_conter_tips').css('right', '0'); $('.tips_fold_icon').css('left', '0'); $(this).removeClass('glyphicon-menu-left').addClass('glyphicon-menu-right'); } else { $('.ace_conter_tips').css('right', '-100%'); $('.tips_fold_icon').css('left', '-25px'); $(this).removeClass('glyphicon-menu-right').addClass('glyphicon-menu-left'); } }); // 设置换行符 $('.menu-tabs').on('click', 'li', function(e) { var _val = $(this).attr('data-value'), _item = _this.editor['ace_editor_' + _this.ace_active]; if ($(this).parent().hasClass('tabsType')) { //_item.ace.getSession().setUseSoftTabs(_val == 'nbsp'); _this.aceConfig.aceEditor.useSoftTabs = _val == 'nbsp'; _item.softTabs = _val == 'nbsp'; } else { //_item.ace.getSession().setTabSize(_val); _this.aceConfig.aceEditor.tabSize = _val; _item.tabSize = _val; } _this.saveAceConfig(_this.aceConfig,function(res){ if(res.status){ layer.msg('Successful setup', {icon: 1}); } }); $(this).siblings().removeClass('active').find('.icon').remove(); $(this).addClass('active').append(_icon); _this.currentStatusBar(_item.id); e.stopPropagation(); e.preventDefault(); }); // 设置编码内容 $('.menu-encoding').on('click', 'li', function(e) { var _item = _this.editor['ace_editor_' + _this.ace_active], _icon = '<span class="icon"><i class="glyphicon glyphicon-ok" aria-hidden="true"></i></span>'; layer.msg(lan.public.set_file_encoding + ':' + $(this).attr('data-value')); $('.ace_conter_toolbar [data-type="encoding"]').html(lan.public.encoding + ': <i>' + $(this).attr('data-value') + '</i>'); $(this).addClass('active').append(_icon).siblings().removeClass('active').find('span').remove(); _item.encoding = $(this).attr('data-value'); _this.saveFileMethod(_item); }); // 搜索内容键盘事件 $('.menu-files .menu-input').keyup(function() { _this.searchRelevance($(this).val()); if ($(this).val != '') { $(this).next().show(); } else { $(this).next().hide(); } }); // 清除搜索内容事件 $('.menu-files .menu-conter .fa').click(function() { $('.menu-files .menu-input').val('').next().hide(); _this.searchRelevance() }); // 顶部状态栏 $('.ace_header>span').click(function(e) { var type = $(this).attr('class'), editor_item = _this.editor['ace_editor_' + _this.ace_active]; var _icon = '<span class="icon"><i class="glyphicon glyphicon-ok" aria-hidden="true"></i></span>'; switch (type) { case 'saveFile': //保存当时文件 _this.saveFileMethod(editor_item); break; case 'saveFileAll': //保存全部 var loadT = layer.open({ type: 1, area: ['350px', '180px'], title: 'Tips', content: '<div class="ace-clear-form">\ <div class="clear-icon"></div>\ <div class="clear-title">Do you want to save changes to all files?</div>\ <div class="clear-tips">If you don\'t save, the changes will be lost!</div>\ <div class="ace-clear-btn" style="">\ <button type="button" class="btn btn-sm btn-default clear-btn" style="margin-right:10px;" >Cancel</button>\ <button type="button" class="btn btn-sm btn-success save-all-btn">Save</button>\ </div>\ </div>', success: function(layers, index) { $('.clear-btn').click(function() { layer.close(index); }); $('.save-all-btn').click(function() { var _arry = [], editor = aceEditor['editor']; for (var item in editor) { _arry.push({ path: editor[item]['path'], data: editor[item]['ace'].getValue(), encoding: editor[item]['encoding'], }) } _this.saveAllFileBody(_arry, function() { $('.ace_conter_menu>.item').each(function(el, index) { var _id = $(this).attr('data-id'); $(this).find('i').attr('data-file-state', '0').removeClass('glyphicon-exclamation-sign').addClass('glyphicon-remove') aceEditor.editor['ace_editor_' + _id].fileType = 0; }); layer.close(index); }); }); } }); break; case 'refreshs': //刷新文件 if (editor_item.fileType === 0) { aceEditor.getFileBody({ path: editor_item.path }, function(res) { editor_item.ace.setValue(res.data); editor_item.fileType = 0; $('.item_tab_' + editor_item.id + ' .icon-tool').attr('data-file-state', '0').removeClass('glyphicon-exclamation-sign').addClass('glyphicon-remove'); layer.msg('Refresh successfully', { icon: 1 }); }); return false; } var loadT = layer.open({ type: 1, //area: ['350px', '180px'], title: 'Tips', content: '<div class="ace-clear-form">\ <div class="clear-icon"></div>\ <div class="clear-title">Whether to refresh the current file</div>\ <div class="clear-tips">Refreshing the current file will overwrite the current modification and continue!</div>\ <div class="ace-clear-btn" style="">\ <button type="button" class="btn btn-sm btn-default clear-btn" style="margin-right:10px;" >Cancel</button>\ <button type="button" class="btn btn-sm btn-success save-all-btn">Save</button>\ </div>\ </div>', success: function(layers, index) { $('.clear-btn').click(function() { layer.close(index); }); $('.save-all-btn').click(function() { aceEditor.getFileBody({ path: editor_item.path }, function(res) { layer.close(index); editor_item.ace.setValue(res.data); editor_item.fileType == 0; $('.item_tab_' + editor_item.id + ' .icon-tool').attr('data-file-state', '0').removeClass('glyphicon-exclamation-sign').addClass('glyphicon-remove'); layer.msg('Refresh successfully', { icon: 1 }); }); }); } }); break; // 搜索 case 'searchs': editor_item.ace.execCommand('find'); break; // 替换 case 'replaces': editor_item.ace.execCommand('replace'); break; // 跳转行 case 'jumpLine': $('.ace_toolbar_menu').show().find('.menu-jumpLine').show().siblings().hide(); $('.set_jump_line input').val('').focus(); $('.set_jump_line .btn-save').unbind('click').click(function(){ var _jump_line = $('.set_jump_line input').val(); editor_item.ace.gotoLine(_jump_line); $('.ace_toolbar_menu').hide(); }); $('.set_jump_line input').unbind('keypress keydown keyup').on('keypress keydown keyup',function(e){ if(e.keyCode == 13 || (e.keyCode >= 48 && e.keyCode <= 57) || (e.keyCode >= 96 && e.keyCode <= 105)){ var _jump_line = $('.set_jump_line input').val(); if(_jump_line == '' && typeof parseInt(_jump_line) != 'number') return false; editor_item.ace.gotoLine(_jump_line); } }); break; // 字体 case 'fontSize': $('.ace_toolbar_menu').show().find('.menu-fontSize').show().siblings().hide(); $('.menu-fontSize .set_font_size input').val(_this.aceConfig.aceEditor.fontSize).focus(); $('.menu-fontSize set_font_size input').unbind('keypress onkeydown').on('keypress onkeydown',function (e){ var _val = $(this).val(); if (_val == '') { $(this).css('border', '1px solid red'); $(this).next('.tips').text('Font setting range 12-45'); } else if (!isNaN(_val)) { $(this).removeAttr('style'); if (parseInt(_val) > 11 && parseInt(_val) < 45) { $('.ace_conter_editor .ace_editors').css('fontSize', _val + 'px') } else { $('.ace_conter_editor .ace_editors').css('fontSize', '13px'); $(this).css('border', '1px solid red'); $(this).next('.tips').text('Font setting range 12-45'); } } else { $(this).css('border', '1px solid red'); $(this).next('.tips').text('Font setting range 12-45'); } e.stopPropagation(); e.preventDefault(); }); $('.menu-fontSize .menu-conter .set_font_size input').unbind('change').change(function() { var _val = $(this).val(); $('.ace_conter_editor .ace_editors').css('fontSize', _val + 'px') }); $('.set_font_size .btn-save').unbind('click').click(function(){ var _fontSize = $('.set_font_size input').val(); _this.aceConfig.aceEditor.fontSize = parseInt(_fontSize); _this.saveAceConfig(_this.aceConfig,function(res){ if(res.status){ $('.ace_editors').css('fontSize',_fontSize +'px'); layer.msg('Successful setup', {icon: 1}); $('.ace_toolbar_menu').hide(); } }); }); break; //主题 case 'themes': $('.ace_toolbar_menu').show().find('.menu-themes').show().siblings().hide(); var _html = '',_arry = ['White', 'Black']; for (var i = 0; i < _this.themeList.length; i++) { if (_this.themeList[i] != _this.aceConfig.aceEditor.editorTheme) { _html += '<li data-value="' + _this.themeList[i] + '">' + _this.themeList[i] + '【' + _arry[i] + '】</li>'; } else { _html += '<li data-value="' + _this.themeList[i] + '" class="active">' + _this.themeList[i] + '【' + _arry[i] + '】' + _icon + '</li>'; } } $('.menu-themes ul').html(_html); $('.menu-themes ul li').click(function(){ var _theme = $(this).attr('data-value'); $(this).addClass('active').append(_icon).siblings().removeClass('active').find('.icon').remove(); _this.aceConfig.aceEditor.editorTheme = _theme; _this.saveAceConfig(_this.aceConfig,function(res){ for(var item in _this.editor){ _this.editor[item].ace.setTheme("ace/theme/"+_theme); } layer.msg('Successful setup', {icon: 1}); }); }); break; case 'setUp': $('.ace_toolbar_menu').show().find('.menu-setUp').show().siblings().hide(); $('.menu-setUp .editor_menu li').each(function(index,el){ var _type = _this.aceConfig.aceEditor[$(el).attr('data-type')]; if(_type) $(el).addClass('active').append(_icon); }) $('.menu-setUp .editor_menu li').unbind('click').click(function(){ var _type = $(this).attr('data-type'); _this.aceConfig.aceEditor[_type] = !$(this).hasClass('active'); if($(this).hasClass('active')){ $(this).removeClass('active').find('.icon').remove(); }else{ $(this).addClass('active').append(_icon); } _this.saveAceConfig(_this.aceConfig,function(res){ for(var item in _this.editor){ _this.editor[item].ace.setOption(_type,_this.aceConfig.aceEditor[_type]); } layer.msg('Successful setup', {icon: 1}); }); }); break; case 'helps': layer.open({ type: 1, area: '1300px', title: 'Help', content: '<div class="helps_conter">\ <div class="helps_left">\ <div class="helps_item">Common shortcuts:</div>\ <div class="helps_box">\ ctrl+s Save</br>\ ctrl+a Select all ctrl+x Cut</br>\ ctrl+c Copy ctrl+v Paste</br>\ ctrl+z Cancel ctrl+y Anti-cancel</br>\ ctrl+f Find ctrl+alt+f Replace</br>\ win+alt+0 Collapse all</br>\ win+alt+shift+0 Expand all</br>\ esc [Exit the search and cancel the automatic prompt...]</br>\ ctrl-shift-s Preview</br>\ ctrl-shift-e Show & close function\ </div>\ <div class="helps_item">Select:</div>\ <div class="helps_box">\ Mouse frame selection -- drag</br>\ shift+home/end/up/left/down/right</br>\ shift+pageUp/PageDown Scroll up and down</br>\ ctrl+shift+ home/end Current cursor to the end of the head</br>\ alt+ Mouse drag Block selection</br>\ ctrl+alt+g Batch select current and enter multi-tab editing</br>\ </div>\ </div>\ <div class="helps_left">\ <div class="helps_item">Cursor movement:</div>\ <div class="helps_box">\ home/end/up/left/down/right</br>\ ctrl+home/end Cursor moves to the beginning/end of the document</br>\ ctrl+p Jump to the matching tag</br>\ pageUp/PageDown Cursor up and down</br>\ alt+left/right Cursor moves to the top of the line</br>\ shift+left/right Cursor moves to the beginning & end of the line</br>\ ctrl+l Jump to the specified line</br>\ ctrl+alt+up/down Add cursor to the top (bottom)</br>\ </div>\ <div class="helps_item">Edit:</div>\ <div class="helps_box">\ ctrl+/ Comment & Uncomment ctrl+alt+a Align left and right</br>\ table Tab alignment shift+table Overall advancement table</br>\ delete Delete ctrl+d Delete entire line</br>\ ctrl+delete Delete the word on the right side of the line</br>\ ctrl/shift+backspace Delete the word on the left</br>\ alt+shift+up/down Copy the line and add it to the top (below)</br>\ alt+delete Delete the right side of the cursor</br>\ alt+up/down The current line is swapped with the previous line (the next line)</br>\ ctrl+shift+d Copy the line and add it below</br>\ ctrl+delete Delete the word on the right</br>\ ctrl+shift+u Convert to lowercase</br>\ ctrl+u Convert selected content to uppercase</br>\ </div>\ </div>\ </div>' }); break; } e.stopPropagation(); e.preventDefault(); }); // 菜单状态 $('.ace_toolbar_menu').click(function(e) { e.stopPropagation(); e.preventDefault(); }); // 文件目录选择 $('.ace_catalogue_list').on('click', '.has-children .file_fold', function(e) { var _layers = $(this).attr('data-layer'), _type = $(this).find('data-type'), _path = $(this).parent().attr('data-menu-path'), _menu = $(this).find('.glyphicon'), _group = parseInt($(this).attr('data-group')), _file = $(this).attr('data-file'), _tath = $(this); var _active = $('.ace_catalogue_list .has-children .file_fold.edit_file_group'); if (_active.length > 0 && $(this).attr('data-edit') === undefined) { switch (_active.attr('data-edit')) { case '2': _active.find('.file_input').siblings().show(); _active.find('.file_input').remove(); _active.removeClass('edit_file_group').removeAttr('data-edit'); break; case '1': case '0': _active.parent().remove(); break; } layer.closeAll('tips'); } //$('.ace_catalogue_menu').hide(); $('.ace_toolbar_menu').hide(); $('.ace_toolbar_menu .menu-tabs,.ace_toolbar_menu .menu-encoding,.ace_toolbar_menu .menu-files').hide(); if($(this).hasClass('edit_file_group')) return false; $('.ace_catalogue_list .has-children .file_fold').removeClass('bg'); $(this).addClass('bg'); if ($(this).attr('data-file') == 'Dir') { if (_menu.hasClass('glyphicon-menu-right')) { _menu.removeClass('glyphicon-menu-right').addClass('glyphicon-menu-down'); $(this).next().show(); if ($(this).next().find('li').length == 0) _this.reader_file_dir_menu({ el: $(this).next(), path: _path, group: _group + 1 }); } else { _menu.removeClass('glyphicon-menu-down').addClass('glyphicon-menu-right'); $(this).next().hide(); } } else { _this.openEditorView(_path, function(res) { if (res.status) _tath.addClass('active'); }); } e.stopPropagation(); e.preventDefault(); }); // 禁用目录选择 $('.ace_catalogue').bind("selectstart", function(e) { var omitformtags = ["input", "textarea"]; omitformtags = "|" + omitformtags.join("|") + "|"; if (omitformtags.indexOf("|" + e.target.tagName.toLowerCase() + "|") == -1) { return false; }else{ return true; } }); // 返回目录(文件目录主菜单) $('.ace_dir_tools').on('click','.upper_level',function(){ var _paths = $(this).attr('data-menu-path'); _this.reader_file_dir_menu({path:_paths,is_empty:true}); $('.ace_catalogue_title').html('Dir: '+ _paths).attr('title',_paths); }); // 新建文件(文件目录主菜单) $('.ace_dir_tools').on('click','.new_folder',function(e){ var _paths = $(this).parent().find('.upper_level').attr('data-menu-path'); $(this).find('.folder_down_up').show(); $(document).click(function(){ $('.folder_down_up').hide(); $(this).unbind('click'); return false; }); $('.ace_toolbar_menu').hide(); $('.ace_catalogue_menu').hide(); $('.ace_toolbar_menu .menu-tabs,.ace_toolbar_menu .menu-encoding,.ace_toolbar_menu .menu-files').hide(); e.stopPropagation(); e.preventDefault(); }); // 刷新列表 (文件目录主菜单) $('.ace_dir_tools').on('click','.refresh_dir',function(e){ _this.refresh_config = { el:$('.cd-accordion-menu')[0], path:$('.ace_catalogue_title').attr('title'), group:1, is_empty:true } _this.reader_file_dir_menu(_this.refresh_config,function(){ layer.msg('Refresh success!',{icon:1}); }); }); // 搜索内容 (文件目录主菜单) $('.ace_dir_tools').on('click','.search_file',function(e){ if($(this).parent().find('.search_input_view').length == 0){ $(this).siblings('div').hide(); $(this).css('color','#ec4545').attr({'title':'Close'}).find('.glyphicon').removeClass('glyphicon-search').addClass('glyphicon-remove').next().text("Close"); $(this).before('<div class="search_input_title">Search Catalog File</div>'); $(this).after('<div class="search_input_view">\ <form>\ <input type="text" id="search_input_val" class="ser-text pull-left" placeholder="">\ <button type="button" class="ser-sub pull-left"></button>\ </form>\ <div class="search_boxs">\ <input id="search_alls" type="checkbox">\ <label for="search_alls"><span>Include Subdirectory Files</span></label>\ </div>\ </div>'); $('.ace_catalogue_list').css('top','150px'); $('.ace_dir_tools').css('height','110px'); $('.cd-accordion-menu').empty(); }else{ $(this).siblings('div').show(); $(this).parent().find('.search_input_view,.search_input_title').remove(); $(this).removeAttr('style').attr({'title':'Search Content'}).find('.glyphicon').removeClass('glyphicon-remove').addClass('glyphicon-search').next().text("Search"); $('.ace_catalogue_list').removeAttr('style') $('.ace_dir_tools').removeAttr('style'); _this.refresh_config = { el:$('.cd-accordion-menu')[0], path:$('.ace_catalogue_title').attr('title'), group:1, is_empty:true } _this.reader_file_dir_menu(_this.refresh_config); } }); // 搜索文件内容 $('.ace_dir_tools').on('click','.search_input_view button',function(e){ var path = _this.menu_path, search = $('#search_input_val').val(); _this.reader_file_dir_menu({ el:$('.cd-accordion-menu')[0], path:path, group:1, search:search, all:$('#search_alls').is(':checked')?'True':'False', is_empty:true }) }); // 当前根目录操作,新建文件或目录 $('.ace_dir_tools').on('click','.folder_down_up li',function(e){ var _type = parseInt($(this).attr('data-type')); switch(_type){ case 2: _this.newly_file_type_dom($('.cd-accordion-menu'),0,0); break; case 3: _this.newly_file_type_dom($('.cd-accordion-menu'),0,1); break; } _this.refresh_config = { el:$('.cd-accordion-menu')[0], path:$('.ace_catalogue_title').attr('title'), group:1, is_empty:true } $(this).parent().hide(); $('.ace_toolbar_menu').hide(); $('.ace_toolbar_menu .menu-tabs,.ace_toolbar_menu .menu-encoding,.ace_toolbar_menu .menu-files').hide(); e.preventDefault(); e.stopPropagation(); }); // 返回目录 $('.ace_catalogue_list').on('click', '.has-children.upper_level', function(e) { var _paths = $(this).attr('data-menu-path'); _this.reader_file_dir_menu({ path: _paths, is_empty: true }); $('.ace_catalogue_title').html(lan.public.dir + ': ' + _paths).attr('title', _paths); }); // 移动编辑器文件目录 $('.ace_catalogue_drag_icon .drag_icon_conter').on('mousedown', function(e) { var _left = $('.aceEditors')[0].offsetLeft; $('.ace_gutter-layer').css('cursor', 'col-resize'); $('#ace_conter').unbind().on('mousemove', function(ev) { var _width = (ev.clientX + 1) - _left; if (_width >= 250 && _width <= 400) { $('.ace_catalogue').css('width', _width); $('.ace_editor_main').css('marginLeft', _width); $('.ace_catalogue_drag_icon ').css('left', _width); $('.file_fold .newly_file_input').width($('.file_fold .newly_file_input').parent().parent().parent().width() - ($('.file_fold .newly_file_input').parent().parent().attr('data-group') * 15 - 5) - 20 - 30 - 53); } }).on('mouseup', function(ev) { $('.ace_gutter-layer').css('cursor', 'inherit'); $(this).unbind('mouseup mousemove'); }); }); // 收藏目录显示和隐藏 $('.ace_catalogue_drag_icon .fold_icon_conter').on('click', function(e) { if ($('.ace_overall').hasClass('active')) { $('.ace_overall').removeClass('active'); $('.ace_catalogue').css('left', '0'); $(this).removeClass('active').attr('title', lan.public.hide_dir); $('.ace_editor_main').css('marginLeft', $('.ace_catalogue').width()); } else { $('.ace_overall').addClass('active'); $('.ace_catalogue').css('left', '-' + $('.ace_catalogue').width() + 'px'); $(this).addClass('active').attr('title', lan.public.show_file_dir); $('.ace_editor_main').css('marginLeft', 0); } }); // 恢复历史文件 $('.ace_conter_tips').on('click', 'a', function() { _this.event_ecovery_file(this); }); // 右键菜单 $('.ace_catalogue_list').on('mousedown', '.has-children .file_fold', function(e) { var x = e.clientX, y = e.clientY, _left = $('.aceEditors')[0].offsetLeft, _top = $('.aceEditors')[0].offsetTop, _that = $('.ace_catalogue_list .has-children .file_fold'), _active = $('.ace_catalogue_list .has-children .file_fold.edit_file_group'); $('.ace_toolbar_menu').hide(); if (e.which === 3) { if ($(this).hasClass('edit_file_group')) return false; $('.ace_catalogue_menu').css({ 'display': 'block', 'left': x - _left, 'top': y - _top }); _that.removeClass('bg'); $(this).addClass('bg'); _active.attr('data-edit') != '2' ? _active.parent().remove() : ''; _that.removeClass('edit_file_group').removeAttr('data-edit'); _that.find('.file_input').siblings().show(); _that.find('.file_input').remove(); $('.ace_catalogue_menu li').show(); if ($(this).attr('data-file') == 'Dir') { $('.ace_catalogue_menu li:nth-child(6)').hide(); } else { $('.ace_catalogue_menu li:nth-child(-n+4)').hide(); } $(document).click(function() { $('.ace_catalogue_menu').hide(); $(this).unbind('click'); return false; }); _this.refresh_config = { el:$(this).parent().parent()[0], path:_this.get_file_dir($(this).parent().attr('data-menu-path'),1), group:parseInt($(this).attr('data-group')), is_empty:true } } }); // 文件目录右键功能 $('.ace_catalogue_menu li').click(function(e) { _this.newly_file_type(this); }); // 新建、重命名鼠标事件 $('.ace_catalogue_list').on('click', '.has-children .edit_file_group .glyphicon-ok', function() { var _file_or_dir = $(this).parent().find('input').val(), _file_type = $(this).parent().parent().attr('data-file'), _path = $('.has-children .file_fold.bg').parent().attr('data-menu-path'), _type = parseInt($(this).parent().parent().attr('data-edit')); if($(this).parent().parent().parent().attr('data-menu-path') === undefined && parseInt($(this).parent().parent().attr('data-group')) === 1){ _path = $('.ace_catalogue_title').attr('title'); } if (_file_or_dir === '') { $(this).prev().css('border', '1px solid #f34a4a'); layer.tips(_type === 0 ? lan.public.dir_cannot_empty : (_type === 1 ? lan.public.file_name_empty_err : lan.public.new_name_err), $(this).prev(), { tips: [1, '#f34a4a'], time: 0 }); return false; } else if ($(this).prev().attr('data-type') === 0) { return false; } switch (_type) { case 0: //新建文件夹 _this.event_create_dir({ path: _path + '/' + _file_or_dir }); break; case 1: //新建文件 _this.event_create_file({ path: _path + '/' + _file_or_dir }); break; case 2: //重命名 _this.event_rename_currency({ sfile: _path, dfile: _this.get_file_dir(_path, 1) + '/' + _file_or_dir}); break; } }); // 新建、重命名键盘事件 $('.ace_catalogue_list').on('keyup', '.has-children .edit_file_group input', function(e) { var _type = $(this).parent().parent().attr('data-edit'), _arry = $('.has-children .file_fold.bg+ul>li'); if(_arry.length == 0 && $(this).parent().parent().attr('data-group') == 1) _arry = $('.cd-accordion-menu>li') if(_type != 2){ for(var i=0;i<_arry.length;i++){ if($(_arry[i]).find('.file_title span').html() === $(this).val()){ $(this).css('border','1px solid #f34a4a'); $(this).attr('data-type',0); layer.tips(_type == 0 ? lan.public.same_name_dir : lan.public.same_name_file, $(this)[0], { tips: [1, '#f34a4a'], time: 0 }); return false } } } if (_type == 1 && $(this).val().indexOf('.')) $(this).prev().removeAttr('class').addClass(_this.get_file_suffix($(this).val()) + '-icon'); $(this).attr('data-type',1); $(this).css('border', '1px solid #528bff'); layer.closeAll('tips'); if (e.keyCode === 13) $(this).next().click() $('.ace_toolbar_menu').hide(); $('.ace_toolbar_menu .menu-tabs,.ace_toolbar_menu .menu-encoding,.ace_toolbar_menu .menu-files').hide(); e.stopPropagation(); e.preventDefault(); }); // 新建、重命名鼠标点击取消事件 $('.ace_catalogue_list').on('click', '.has-children .edit_file_group .glyphicon-remove', function() { layer.closeAll('tips'); if($(this).parent().parent().parent().attr('data-menu-path')){ $(this).parent().parent().removeClass('edit_file_group').removeAttr('data-edit'); $(this).parent().siblings().show(); $(this).parent().remove(); return false; } $(this).parent().parent().parent().remove(); }); //屏蔽浏览器右键菜单 $('.ace_catalogue_list')[0].oncontextmenu = function() { return false; } this.setEditorView(); this.reader_file_dir_menu(); }, // 设置本地存储,设置类型type:session或local setStorage:function(type,key,val){ if(type != "local" && type != "session") val = key,key = type,type = 'session'; window[type+'Storage'].setItem(key,val); }, //获取指定本地存储,设置类型type:session或local getStorage:function(type,key){ if(type != "local" && type != "session") key = type,type = 'session'; return window[type+'Storage'].getItem(key); }, //删除指定本地存储,设置类型type:session或local removeStorage:function(type,key){ if(type != "local" && type != "session") key = type,type = 'session'; window[type+'Storage'].removeItem(key); }, // 删除指定类型的所有存储信息 clearStorage:function(type){ if(type != "local" && type != "session") key = type,type = 'session'; window[type+'Storage'].clear(); }, // 新建文件类型 newly_file_type: function(that) { var _type = parseInt($(that).attr('data-type')), _active = $('.ace_catalogue .ace_catalogue_list .has-children .file_fold.bg'), _group = parseInt(_active.attr('data-group')), _path = _active.parent().attr('data-menu-path'), _this = this; switch(_type){ case 0: //刷新目录 _active.next().empty(); _this.reader_file_dir_menu({ el:_active.next(), path:_path, group:parseInt(_active.attr('data-group')) + 1, is_empty:true },function(){ layer.msg('Refresh successfully',{icon:1}); }); break; case 1: //打开文件 _this.menu_path = _path; _this.reader_file_dir_menu({ el:'.cd-accordion-menu', path:_this.menu_path, group:1, is_empty:true }); break; case 2: //新建文件 case 3: if(this.get_file_dir(_path,1) != this.menu_path){ //判断当前文件上级是否为显示根目录 this.reader_file_dir_menu({el:_active,path:_path,group:_group+1},function(res){ _this.newly_file_type_dom(_active,_group, _type == 2?0:1); }); }else{ _this.newly_file_type_dom(_active,_group, _type == 2?0:1); } break; case 4: //文件重命名 var _types = _active.attr('data-file'); if(_active.hasClass('active')){ layer.msg('The file is open and the name cannot be modified',{icon:0}); return false; } _active.attr('data-edit',2); _active.addClass('edit_file_group'); _active.find('.file_title').hide(); _active.find('.glyphicon').hide(); _active.prepend('<span class="file_input"><i class="'+ (_types === 'Dir'?'folder':(_this.get_file_suffix(_active.find('.file_title span').html()))) +'-icon"></i><input type="text" class="newly_file_input" value="'+ (_active.find('.file_title span').html()) +'"><span class="glyphicon glyphicon-ok" aria-hidden="true"></span><span class="glyphicon glyphicon-remove" aria-hidden="true"></span>') $('.file_fold .newly_file_input').width($('.file_fold .newly_file_input').parent().parent().parent().width() - ($('.file_fold .newly_file_input').parent().parent().attr('data-group') * 15 -5)-20-30-53); $('.file_fold .newly_file_input').focus(); break; case 5: GetFileBytes(_path); break; case 6: var is_files = _active.attr('data-file') === 'Files' layer.confirm(lan.get(is_files?'recycle_bin_confirm':'recycle_bin_confirm_dir', [_active.find('.file_title span').html()]), { title: is_files?lan.files.del_file:lan.files.del_dir, closeBtn: 2, icon: 3 }, function (index) { _this[is_files?'del_file_req':'del_dir_req']({path:_path},function(res){ layer.msg(res.msg,{icon:res.status?1:2}); if(res.status){ if(_active.attr('data-group') != 1) _active.parent().parent().prev().addClass('bg') _this.reader_file_dir_menu(_this.refresh_config,function(){ layer.msg(res.msg,{icon:1}); }); } }); }); break; } }, // 新建文件和文件夹 newly_file_type_dom:function(_active,_group,_type,_val){ var _html = '',_this = this,_nextLength = _active.next(':not(.ace_catalogue_menu)').length; if(_nextLength > 0){ _active.next().show(); _active.find('.glyphicon').removeClass('glyphicon-menu-right').addClass('glyphicon-menu-down'); } _html += '<li class="has-children children_'+ (_group+1) +'"><div class="file_fold edit_file_group group_'+ (_group+1) +'" data-group="'+ (_group+1) +'" data-edit="'+ _type +'"><span class="file_input">'; _html += '<i class="'+ (_type == 0?'folder':(_type == 1?'text':(_this.get_file_suffix(_val || '')))) +'-icon"></i>' _html += '<input type="text" class="newly_file_input" value="'+ (_val != undefined?_val:'') +'">' _html += '<span class="glyphicon glyphicon-ok" aria-hidden="true"></span><span class="glyphicon glyphicon-remove" aria-hidden="true"></span></span></div></li>' if(_nextLength > 0){ _active.next().prepend(_html); }else{ _active.prepend(_html); } setTimeout(function(){ $('.newly_file_input').focus() },100) $('.file_fold .newly_file_input').width($('.file_fold .newly_file_input').parent().parent().parent().width() - ($('.file_fold .newly_file_input').parent().parent().attr('data-group') * 15 -5)-20-30-53); return false; }, // newly_file_type_dom: function(_file_fold, _group, _type, _val) { // var _html = '', // _this = this; // _file_fold.next().show(); // _file_fold.find('.glyphicon').removeClass('glyphicon-menu-right').addClass('glyphicon-menu-down'); // _html += '<li class="has-children children_' + (_group + 1) + '"><div class="file_fold edit_file_group group_' + (_group + 1) + '" data-group="' + (_group + 1) + '" data-edit="' + _type + '"><span class="file_input">'; // _html += '<i class="' + (_type == 0 ? 'folder' : (_type == 1 ? 'text' : (_this.get_file_suffix(_val)))) + '-icon"></i>' // _html += '<input type="text" class="newly_file_input" value="' + (_val != undefined ? _val : '') + '">' // _html += '<span class="glyphicon glyphicon-ok" aria-hidden="true"></span><span class="glyphicon glyphicon-remove" aria-hidden="true"></span></span></div></li>' // _file_fold.next().prepend(_html); // $('.file_fold .newly_file_input').width($('.file_fold .newly_file_input').parent().parent().parent().width() - ($('.file_fold .newly_file_input').parent().parent().attr('data-group') * 15 - 5) - 20 - 30 - 53); // $('.newly_file_input').focus(); // }, // 通用重命名事件 event_rename_currency: function(obj, that) { var _active = $('.ace_catalogue_list .has-children .file_fold.edit_file_group'), _this = this; this.rename_currency_req({ sfile: obj.sfile, dfile: obj.dfile }, function(res) { layer.msg(res.msg, { icon: res.status ? 1 : 2 }); if (res.status) { _this.reader_file_dir_menu(_this.refresh_config,function(){ layer.msg(res.msg, { icon: 1 }); }); } else { _active.find('.file_input').siblings().show(); _active.find('.file_input').remove(); _active.removeClass('edit_file_group').removeAttr('data-edit'); } }) }, // 创建文件目录事件 event_create_dir: function(obj, that) { var _this = this; this.create_dir_req({ path: obj.path }, function(res) { layer.msg(res.msg, { icon: res.status ? 1 : 2 }); if (res.status) { _this.reader_file_dir_menu(_this.refresh_config,function(){ layer.msg(res.msg, { icon: 1 }); }); } }) }, // 创建文件事件 event_create_file: function(obj, that) { var _this = this; this.create_file_req({ path: obj.path }, function(res) { layer.msg(res.msg, { icon: res.status ? 1 : 2 }); if (res.status) { _this.reader_file_dir_menu(_this.refresh_config,function(){ layer.msg(res.msg, { icon: 1 }); _this.openEditorView(obj.path); }); } }) }, // 重命名请求 rename_currency_req: function(obj, callback) { var loadT = layer.msg(lan.public.renaming_file, { time: 0, icon: 16, shade: [0.3, '#000'] }); $.post("/files?action=MvFile", { sfile: obj.sfile, dfile: obj.dfile, rename: 'true' }, function(res) { layer.close(loadT); if (callback) callback(res); }); }, // 创建文件事件 create_file_req: function(obj, callback) { var loadT = layer.msg(lan.public.creating_file, { time: 0, icon: 16, shade: [0.3, '#000'] }); $.post("/files?action=CreateFile", { path: obj.path }, function(res) { layer.close(loadT); if (callback) callback(res); }); }, // 创建目录请求 create_dir_req: function(obj, callback) { var loadT = layer.msg(lan.public.creating_dir, { time: 0, icon: 16, shade: [0.3, '#000'] }); $.post("/files?action=CreateDir", { path: obj.path }, function(res) { layer.close(loadT); if (callback) callback(res); }); }, // 删除文件请求 del_file_req: function(obj, callback) { var loadT = layer.msg(lan.public.deleting_file, { time: 0, icon: 16, shade: [0.3, '#000'] }); $.post("/files?action=DeleteFile", { path: obj.path }, function(res) { layer.close(loadT); if (callback) callback(res); }); }, // 删除目录请求 del_dir_req: function(obj, callback) { var loadT = layer.msg(lan.public.deleting_dir, { time: 0, icon: 16, shade: [0.3, '#000'] }); $.post("/files?action=DeleteFile", { path: obj.path }, function(res) { layer.close(loadT); if (callback) callback(res); }); }, // 临时文件保存 auto_save_temp: function(obj, callback) { // var loadT = layer.msg('正在新建目录,请稍后...',{time: 0,icon: 16,shade: [0.3, '#000']}); $.post("/files?action=auto_save_temp", { filename: obj.filename, body: obj.body }, function(res) { layer.close(loadT); if (callback) callback(res); }); }, // 获取临时文件内容 get_auto_save_body: function(obj, callback) { var loadT = layer.msg(lan.public.get_autosave_file, { time: 0, icon: 16, shade: [0.3, '#000'] }); $.post("/files?action=get_auto_save_body", { filename: obj.filename }, function(res) { layer.close(loadT); if (callback) callback(res); }); }, // 刷新菜单列表 refresh_meun_list: function(el, callback) { var _active = $(el), _paths = _active.parent().attr('data-menu-path'), _group = parseInt(_active.attr('data-group')) + 1, _el = _active.next(); _active.next().empty(); if (_active.length === 0) { _el = $('.cd-accordion-menu'); _paths = $('.ace_catalogue_title').attr('title'); _group = 1; $('.cd-accordion-menu').empty(); } this.reader_file_dir_menu({ el: _el, path: _paths, group: _group, }, function(res) { if (callback) callback(res); }); }, // 恢复历史文件事件 event_ecovery_file: function(that) { var _path = $(that).attr('data-path'), _history = new Number($(that).attr('data-history')), _this = this; var loadT = layer.open({ type: 1, //area: ['400px', '180px'], title: lan.public.restore_history_files, content: '<div class="ace-clear-form">\ <div class="clear-icon"></div>\ <div class="clear-title">' + lan.public.confirm_restore_file + ' <span class="size_ellipsis" style="max-width:150px;vertical-align: top;" title="' + bt.format_data(_history) + '">' + bt.format_data(_history) + '</span>?</div>\ <div class="clear-tips">' + lan.public.confirm_restore_file1 + '</div>\ <div class="ace-clear-btn" style="">\ <button type="button" class="btn btn-sm btn-default" style="margin-right:10px;" data-type="1">' + lan.public.cancel + '</button>\ <button type="button" class="btn btn-sm btn-success" data-type="0">' + lan.public.restore_history_files + '</button>\ </div>\ </div>', success: function(layero, index) { $('.ace-clear-btn .btn').click(function() { var _type = $(this).attr('data-type'); switch (_type) { case '0': _this.recovery_file_history({ filename: _path, history: _history }, function(res) { layer.close(index); layer.msg(res.status ? lan.public.restore_history_files + " " + lan.public.success : lan.public.restore_history_files + " " + lan.public.fail, { icon: res.status ? 1 : 2 }); if (res.status) { if (_this.editor['ace_editor_' + _this.ace_active].historys_file) { _this.removeEditor(_this.ace_active); } if ($('.ace_conter_menu>[title="' + _path + '"]').length > 0) { $('.ace_header .refreshs').click(); layer.close(_this.layer_view); } } }); break; case '1': layer.close(index); break; } }); } }); }, // 判断是否为历史文件 is_file_history: function(_item) { if (_item.historys_file) { $('.ace_conter_tips').show(); $('#ace_editor_' + _item.id).css('bottom', '50px'); $('.ace_conter_tips .tips').html(lan.public.read_only_file + _item.path + ', ' + lan.public.history_v + ' [ ' + bt.format_data(new Number(_item.historys_active)) + ' ]<a href="javascript:;" class="ml35 btlink" style="margin-left:35px" data-path="' + _item.path + '" data-history="' + _item.historys_active + '">' + lan.public.restore_history + '</a>'); } else { $('.ace_conter_tips').hide(); } }, // 判断文件是否打开 is_file_open: function(path, callabck) { var is_state = false for (var i = 0; i < this.pathAarry.length; i++) { if (path === this.pathAarry[i]) is_state = true } if (callabck) { callabck(is_state); } else { return is_state; } }, // 恢复文件历史 recovery_file_history: function(obj, callback) { var loadT = layer.msg(lan.public.recover_file, { time: 0, icon: 16, shade: [0.3, '#000'] }); $.post("/files?action=re_history", { filename: obj.filename, history: obj.history }, function(res) { layer.close(loadT); if (callback) callback(res); }); }, // 获取文件列表 get_file_dir_list: function(obj, callback) { var loadT = layer.msg(lan.public.get_file_contents, { time: 0, icon: 16, shade: [0.3, '#000'] }), _this = this; if(obj['p'] === undefined) obj['p'] = 1; if(obj['showRow'] === undefined) obj['showRow'] = 200; if(obj['sort'] === undefined) obj['sort'] = 'name'; if(obj['reverse'] === undefined) obj['reverse'] = 'False'; if(obj['search'] === undefined) obj['search'] = ''; if(obj['all'] === undefined) obj['all'] = 'False'; $.post("/files?action=GetDir&tojs=GetFiles",{p:obj.p,showRow:obj.showRow,sort:obj.sort,reverse:obj.reverse,path:obj.path,search:obj.search}, function(res) { layer.close(loadT); if (callback) callback(res); }); }, // 获取文件列表 get_file_dir_list:function(obj,callback){ var loadT = layer.msg('正在获取文件内容,请稍后...',{time: 0,icon: 16,shade: [0.3, '#000']}),_this = this; if(obj['p'] === undefined) obj['p'] = 1; if(obj['showRow'] === undefined) obj['showRow'] = 200; if(obj['sort'] === undefined) obj['sort'] = 'name'; if(obj['reverse'] === undefined) obj['reverse'] = 'False'; if(obj['search'] === undefined) obj['search'] = ''; if(obj['all'] === undefined) obj['all'] = 'False'; $.post("/files?action=GetDir&tojs=GetFiles",{p:obj.p,showRow:obj.showRow,sort:obj.sort,reverse:obj.reverse,path:obj.path,search:obj.search}, function(res) { layer.close(loadT); if(callback) callback(res); }); }, // 获取历史文件 get_file_history: function(obj, callback) { var loadT = layer.msg(lan.public.get_file_history, { time: 0, icon: 16, shade: [0.3, '#000'] }), _this = this; $.post("/files?action=read_history", { filename: obj.filename, history: obj.history }, function(res) { layer.close(loadT); if (callback) callback(res); }); }, // 渲染文件列表 reader_file_dir_menu: function(obj, callback) { var _path = getCookie('Path'), _this = this; if (obj === undefined) obj = {} if (obj['el'] === undefined) obj['el'] = '.cd-accordion-menu'; if (obj['group'] === undefined) obj['group'] = 1; if (obj['p'] === undefined) obj['p'] = 1; if (obj['path'] === undefined) obj['path'] = _path; if (obj['is_empty'] === undefined) obj['is_empty'] = false; if(obj['search'] === undefined) obj['search'] = ''; if(obj['all'] === undefined) obj['all'] = 'False'; this.get_file_dir_list({p:obj.p,path:obj.path,search:obj.search,all:obj.all},function (res){ var _dir = res.DIR, _files = res.FILES, _dir_dom = '', _files_dom = '', _html = ''; _this.menu_path = res.PATH; for (var i = 0; i < _dir.length; i++) { var _data = _dir[i].split(';'); if (_data[0] === '__pycache__') continue; _dir_dom += '<li class="has-children children_' + obj.group + '" title="' + (obj.path + '/' + _data[0]) + '" data-menu-path="' + (obj.path + '/' + _data[0]) + '" data-size="' + (_data[1]) + '">\ <div class="file_fold group_' + obj.group + '" data-group="' + obj.group + '" data-file="Dir">\ <span class="glyphicon glyphicon-menu-right"></span>\ <span class="file_title"><i class="folder-icon"></i><span>' + _data[0] + '</span></span>\ </div>\ <ul data-group=""></ul>\ <span class="has_children_separator"></span>\ </li>'; } for (var j = 0; j < _files.length; j++) { var _data = _files[j].split(';'); if (_data[0].indexOf('.pyc') !== -1) continue; _files_dom += '<li class="has-children" title="' + (obj.path + '/' + _data[0]) + '" data-menu-path="' + (obj.path + '/' + _data[0]) + '" data-size="' + (_data[1]) + '" data-suffix="' + _this.get_file_suffix(_data[0]) + '">\ <div class="file_fold group_' + obj.group + '" data-group="' + obj.group + '" data-file="Files">\ <span class="file_title"><i class="' + _this.get_file_suffix(_data[0]) + '-icon"></i><span>' + _data[0] + '</span></span>\ </div>\ </li>'; } // if (res.PATH !== '/' && obj['group'] === 1) { // _html = '<li class="has-children upper_level" data-menu-path="' + _this.get_file_dir(res.PATH, 1) + '"><span>'+lan.public.up_level+'</span></li>' // $('.upper_level').attr('data-menu-path', _this.get_file_dir(res.PATH, 1)); // $('.ace_catalogue_title').html(lan.public.dir + ': ' + res.PATH).attr('title', res.PATH); // } if(res.PATH !== '/' && obj['group'] === 1){ $('.upper_level').attr('data-menu-path',_this.get_file_dir(res.PATH,1)); $('.ace_catalogue_title').html(lan.public.dir + ': ' + res.PATH).attr('title',res.PATH); $('.upper_level').html('<i class="glyphicon glyphicon-share-alt" aria-hidden="true"></i>Back') }else if(res.PATH === '/'){ $('.upper_level').html('<i class="glyphicon glyphicon-hdd" aria-hidden="true"></i>Root') } if (obj.is_empty) $(obj.el).empty(); $(obj.el).append(_html + _dir_dom + _files_dom); if (callback) callback(res); }); }, // 获取文件目录位置 get_file_dir: function(path, num) { var _arry = path.split('/'); if (path === '/') return '/'; _arry.splice(-1, num); return _arry == '' ? '/' : _arry.join('/'); }, // 获取文件全称 get_file_suffix: function(fileName) { var filenames = fileName.match(/\.([0-9A-z]*)$/); filenames = (filenames == null ? 'text' : filenames[1]); for (var name in this.supportedModes) { var data = this.supportedModes[name], suffixs = data[0].split('|'), filename = name.toLowerCase(); for (var i = 0; i < suffixs.length; i++) { if (filenames == suffixs[i]) return filename; } } return 'text'; }, // // 设置编辑器视图 // setEditorView: function() { // // var page_height = $('.aceEditors').height(); // // var ace_header = $('.ace_header').height(); // // var ace_conter_menu = $('.ace_conter_menu').height(); // // var ace_conter_toolbar = $('.ace_conter_toolbar').height(); // // var _height = page_height - ace_header - ace_conter_menu; // // //var _height= $('.aceEditors').height()-$('.ace_conter_menu').height()-$('.ace_header').height(); // // //$('.ace_conter_editor').height(_height); // // $('.ace_conter_editor').height(_height); // var page_height = $('.aceEditors').height(); // var aceEditorHeight = $('.aceEditors').height(),_this = this; // var ace_conter_menu = $('.ace_conter_menu').height(); // var ace_conter_toolbar = $('.ace_conter_toolbar').height(); // var _height = page_height - ($('.pull-down .glyphicon').hasClass('glyphicon-menu-down')?35:0) - ace_conter_menu - ace_conter_toolbar - 42; // $('.ace_conter_editor').height(_height); // if(aceEditorHeight == $('.aceEditors').height()){ // if(_this.ace_active) _this.editor[_this.ace_active].ace.resize(); // }else { // aceEditorHeight = $('.aceEditors').height(); // } // $('.aceEditors').height(); // }, // 设置编辑器视图 setEditorView:function () { var aceEditorHeight = $('.aceEditors').height(),_this = this; var autoAceHeight = setInterval(function(){ var page_height = $('.aceEditors').height(); var ace_conter_menu = $('.ace_conter_menu').height(); var ace_conter_toolbar = $('.ace_conter_toolbar').height(); var _height = page_height - ($('.pull-down .glyphicon').hasClass('glyphicon-menu-down')?35:0) - ace_conter_menu - ace_conter_toolbar - 42; $('.ace_conter_editor').height(_height); if(aceEditorHeight == $('.aceEditors').height()){ clearInterval(autoAceHeight); if(_this.ace_active != '') _this.editor['ace_editor_'+_this.ace_active].ace.resize(); }else { aceEditorHeight = $('.aceEditors').height(); } },200); }, // 获取文件编码列表 getEncodingList: function(type) { var _option = ''; for (var i = 0; i < this.encodingList.length; i++) { var item = this.encodingList[i] == type.toUpperCase(); _option += '<li data- data-value="' + this.encodingList[i] + '" ' + (item ? 'class="active"' : '') + '>' + this.encodingList[i] + (item ? '<span class="icon"><i class="glyphicon glyphicon-ok" aria-hidden="true"></i></span>' : '') + '</li>'; } $('.menu-encoding ul').html(_option); }, // 获取文件关联列表 getRelevanceList: function(fileName) { var _option = '', _top = 0, fileType = this.getFileType(fileName), _set_tops = 0; for (var name in this.supportedModes) { var data = this.supportedModes[name], item = (name == fileType.name); _option += '<li data-height="' + _top + '" data-rule="' + this.supportedModes[name] + '" data-value="' + name + '" ' + (item ? 'class="active"' : '') + '>' + (this.nameOverrides[name] || name) + (item ? '<span class="icon"><i class="glyphicon glyphicon-ok" aria-hidden="true"></i></span>' : '') + '</li>' if (item) _set_tops = _top _top += 35; } $('.menu-files ul').html(_option); $('.menu-files ul').scrollTop(_set_tops); }, // 搜索文件关联 searchRelevance: function(search) { if (search == undefined) search = ''; $('.menu-files ul li').each(function(index, el) { var val = $(this).attr('data-value').toLowerCase(), rule = $(this).attr('data-rule'), suffixs = rule.split('|'), _suffixs = false; search = search.toLowerCase(); for (var i = 0; i < suffixs.length; i++) { if (suffixs[i].indexOf(search) > -1) _suffixs = true } if (search == '') { $(this).removeAttr('style'); } else { if (val.indexOf(search) == -1) { $(this).attr('style', 'display:none'); } else { $(this).removeAttr('style'); } if (_suffixs) $(this).removeAttr('style') } }); }, // 设置编码类型 setEncodingType: function(encode) { this.getEncodingList('UTF-8'); $('.menu-encoding ul li').click(function(e) { layer.msg(lan.public.set_file_encoding + ': ' + $(this).attr('data-value')); $(this).addClass('active').append('<span class="icon"><i class="glyphicon glyphicon-ok" aria-hidden="true"></i></span>').siblings().removeClass('active').find('span').remove(); }); }, // 更新状态栏 currentStatusBar: function(id) { var _editor = this.editor['ace_editor_' + id]; $('.ace_conter_toolbar [data-type="history"]').html(lan.public.history_v + ': <i>' + (_editor.historys.length === 0 ? lan.public.empty : _editor.historys.length) + '</i>'); $('.ace_conter_toolbar [data-type="path"]').html(lan.public.dir + ': <i title="' + _editor.path + '">' + _editor.path + '</i>'); $('.ace_conter_toolbar [data-type="tab"]').html(_editor.softTabs ? lan.public.space + ': <i>' + _editor.tabSize + '</i>' : lan.public.tab_length + ': <i>' + _editor.tabSize + '</i>'); $('.ace_conter_toolbar [data-type="encoding"]').html(lan.public.encoding + ': <i>' + _editor.encoding.toUpperCase() + '</i>'); $('.ace_conter_toolbar [data-type="lang"]').html(lan.public.lan + ': <i>' + _editor.type + '</i>'); $('.ace_conter_toolbar span').attr('data-id', id); $('.file_fold').removeClass('bg'); $('[data-menu-path="' + (aceEditor.editor['ace_editor_' + id].path) + '"]').find('.file_fold').addClass('bg'); if (_editor.historys_file) { $('.ace_conter_toolbar [data-type="history"]').hide(); } else { $('.ace_conter_toolbar [data-type="history"]').show(); } _editor.ace.resize(); }, // currentStatusBar: function(id) { // var _item = this.editor['ace_editor_' + id]; // if(_item == undefined){ // this.removerStatusBar(); // return false; // } // $('.ace_conter_toolbar [data-type="cursor"]').html(lan.public.row + '<i class="cursor-row">1</i>,'+ lan.public.column +'<i class="cursor-line">0</i>'); // $('.ace_conter_toolbar [data-type="history"]').html(lan.public.history_v + ': <i>' + (_item.historys.length === 0 ? lan.public.empty : _item.historys.length) + '</i>'); // $('.ace_conter_toolbar [data-type="path"]').html(lan.public.dir + ': <i title="' + _item.path + '">' + _item.path + '</i>'); // $('.ace_conter_toolbar [data-type="tab"]').html(_item.softTabs ? lan.public.space + ': <i>' + _item.tabSize + '</i>' : lan.public.tab_length + ': <i>' + _item.tabSize + '</i>'); // $('.ace_conter_toolbar [data-type="encoding"]').html(lan.public.encoding + ': <i>' + _item.encoding.toUpperCase() + '</i>'); // $('.ace_conter_toolbar [data-type="lang"]').html(lan.public.lan + ': <i>' + _item.type + '</i>'); // $('.ace_conter_toolbar span').attr('data-id', id); // $('.file_fold').removeClass('bg'); // $('[data-menu-path="' + (_item.path) + '"]').find('.file_fold').addClass('bg'); // if (_item.historys_file) { // $('.ace_conter_toolbar [data-type="history"]').hide(); // } else { // $('.ace_conter_toolbar [data-type="history"]').show(); // } // _item.ace.resize(); // }, // 清除状态栏 removerStatusBar: function() { $('.ace_conter_toolbar [data-type="history"]').html(''); $('.ace_conter_toolbar [data-type="path"]').html(''); $('.ace_conter_toolbar [data-type="tab"]').html(''); $('.ace_conter_toolbar [data-type="cursor"]').html(''); $('.ace_conter_toolbar [data-type="encoding"]').html(''); $('.ace_conter_toolbar [data-type="lang"]').html(''); }, // 创建ACE编辑器-对象 creationEditor: function(obj, callabck) { var _this = this; $('#ace_editor_' + obj.id).text(obj.data || ''); $('.ace_conter_editor .ace_editors').css('fontSize', _this.aceConfig.aceEditor.fontSize); if (this.editor == null) this.editor = {}; this.editor['ace_editor_' + obj.id] = { ace: ace.edit("ace_editor_" + obj.id, { theme: "ace/theme/" + _this.aceConfig.aceEditor.editorTheme, //主题 mode: "ace/mode/" + (obj.fileName != undefined ? obj.mode : 'text'), // 语言类型 wrap: _this.aceConfig.aceEditor.wrap, showInvisibles: _this.aceConfig.aceEditor.showInvisibles, showPrintMargin: false, enableBasicAutocompletion: true, enableSnippets: _this.aceConfig.aceEditor.enableSnippets, enableLiveAutocompletion: _this.aceConfig.aceEditor.enableLiveAutocompletion, useSoftTabs: _this.aceConfig.aceEditor.useSoftTabs, tabSize: _this.aceConfig.aceEditor.tabSize, keyboardHandler: 'sublime', readOnly: obj.readOnly === undefined ? false : obj.readOnly }), //ACE编辑器对象 id: obj.id, wrap: _this.aceConfig.aceEditor.wrap, //是否换行 path: obj.path, tabSize:_this.aceConfig.aceEditor.tabSize, softTabs:_this.aceConfig.aceEditor.useSoftTabs, fileName: obj.fileName, enableSnippets: true, //是否代码提示 encoding: (obj.encoding != undefined ? obj.encoding : 'utf-8'), //编码类型 mode: (obj.fileName != undefined ? obj.mode : 'text'), //语言类型 type: obj.type, fileType: 0, //文件状态 historys: obj.historys, historys_file: obj.historys_file === undefined ? false : obj.historys_file, historys_active: obj.historys_active === '' ? false : obj.historys_active }; var ACE = this.editor['ace_editor_' + obj.id]; ACE.ace.moveCursorTo(0, 0); //设置鼠标焦点 ACE.ace.resize(); //设置自适应 ACE.ace.commands.addCommand({ name: lan.public.save, bindKey: { win: 'Ctrl-S', mac: 'Command-S' }, exec: function(editor) { _this.saveFileMethod(ACE); }, readOnly: false // 如果不需要使用只读模式,这里设置false }); // 获取光标位置 ACE.ace.getSession().selection.on('changeCursor', function(e) { var _cursor = ACE.ace.selection.getCursor(); $('[data-type="cursor"]').html(lan.public.row + '<i class="cursor-row">' + (_cursor.row + 1) + '</i>,' + lan.public.column + '<i class="cursor-line">' + _cursor.column + '</i>'); //$('.ace_toolbar_menu').hide(); }); // 触发修改内容 ACE.ace.getSession().on('change', function(editor) { $('.item_tab_' + ACE.id + ' .icon-tool').addClass('glyphicon-exclamation-sign').removeClass('glyphicon-remove').attr('data-file-state', '1'); ACE.fileType = 1; $('.ace_toolbar_menu').hide(); }); this.currentStatusBar(ACE.id); this.is_file_history(ACE); }, // 保存文件方法 saveFileMethod: function(ACE) { this.saveFileBody({ path: ACE.path, data: ACE.ace.getValue(), encoding: ACE.encoding }, function(res) { layer.msg(res.msg, { icon: res.status ? 1 : 2 }); ACE.fileType = 0; $('.item_tab_' + ACE.id + ' .icon-tool').attr('data-file-state', '0').removeClass('glyphicon-exclamation-sign').addClass('glyphicon-remove'); }); }, // 获取文件模型 getFileType: function(fileName) { var filenames = fileName.match(/\.([0-9A-z]*)$/); filenames = (filenames == null ? 'text' : filenames[1]); for (var name in this.supportedModes) { var data = this.supportedModes[name], suffixs = data[0].split('|'), filename = name.toLowerCase(); for (var i = 0; i < suffixs.length; i++) { if (filenames == suffixs[i]) { return { name: name, mode: filename }; } } } return { name: 'Text', mode: 'text' }; }, // 新建编辑器视图-方法 // addEditorView: function() { // var _index = this.editorLength, // _id = bt.get_random(8); // $('.ace_conter_menu .item').removeClass('active'); // $('.ace_conter_editor .ace_editors').removeClass('active'); // $('.ace_conter_menu .ace_editor_add').before('<div class="item active item_tab_' + _id + '" data-type="text" data-id="' + _id + '" data-index="' + _index + '">\ // <span class="icon_file"><i class="fa fa-code" aria-hidden="true"></i></span>\ // <span>Untitled-' + _index + '</span>\ // <i class="fa fa-circle icon-tool" aria-hidden="true" data-file-state="1" data-title="Untitled-' + _index + '"></i>\ // </div>'); // $('.ace_conter_editor').append('<div id="ace_editor_' + _id + '" class="ace_editors active"></div>'); // $('#ace_editor_' + _id).siblings().removeClass('active'); // this.creationEditor({ id: _id }); // this.editorLength = this.editorLength + 1; // }, addEditorView: function (type,conifg) { if(type == undefined) type = 0 var _index = this.editorLength,_id = bt.get_random(8); $('.ace_conter_menu .item').removeClass('active'); $('.ace_conter_editor .ace_editors').removeClass('active'); $('.ace_conter_menu').append('<li class="item active item_tab_'+_id+'" data-type="shortcutKeys" data-id="'+ _id +'" >\ <div class="ace_item_box">\ <span class="icon_file"><i class="text-icon"></i></span>\ <span>'+ (type?conifg.title:('Untitled-'+ _index)) +'</span>\ <i class="glyphicon icon-tool glyphicon-remove" aria-hidden="true" data-file-state="0" data-title="'+ (type?conifg.title:('Untitled-'+ _index)) +'"></i>\ </div>\ </li>'); $('#ace_editor_' + _id).siblings().removeClass('active'); $('.ace_conter_editor').append('<div id="ace_editor_'+_id+'" class="ace_editors active">'+ (type?aceShortcutKeys.innerHTML:'') +'</div>'); switch(type){ case 0: this.creationEditor({ id: _id }); this.editorLength = this.editorLength + 1; break; case 1: this.removerStatusBar(); this.editorLength = this.editorLength + 1; break; } }, // 删除编辑器视图-方法 removeEditor: function (id) { if(id == undefined) id = this.ace_active; if ($('.item_tab_' + id).next('.item').length != 0 && this.editorLength != 1) { $('.item_tab_' + id).next('.item').click(); } else if($('.item_tab_' + id).prev('.item').length != 0 && this.editorLength != 1){ $('.item_tab_' + id).prev('.item').click(); } $('.item_tab_' + id).remove(); $('#ace_editor_' + id).remove(); this.editorLength --; if(this.editor['ace_editor_'+id] == undefined) return false; for(var i=0;i<this.pathAarry.length;i++){ if(this.pathAarry[i] == this.editor['ace_editor_'+id].path){ this.pathAarry.splice(i,1); } } if(!this.editor['ace_editor_'+id].historys_file) $('[data-menu-path="'+ (this.editor['ace_editor_'+id].path) +'"]').find('.file_fold').removeClass('active bg'); delete this.editor['ace_editor_'+id]; if(this.editorLength === 0){ this.ace_active = ''; this.pathAarry = []; this.removerStatusBar(); }else{ this.currentStatusBar(this.ace_active); } if(this.ace_active != '') this.is_file_history(this.editor['ace_editor_'+this.ace_active]); }, // 打开历史文件文件-方法 openHistoryEditorView: function (obj,callback) { // 文件类型(type,列如:JavaScript) 、文件模型(mode,列如:text)、文件标识(id,列如:x8AmsnYn)、文件编号(index,列如:0)、文件路径 (path,列如:/www/root/) var _this = this,path = obj.filename,paths = path.split('/'),_fileName = paths[paths.length - 1],_fileType = this.getFileType(_fileName),_type = _fileType.name,_mode = _fileType.mode,_id = bt.get_random(8),_index = this.editorLength; this.get_file_history({filename:obj.filename,history:obj.history}, function (res) { _this.pathAarry.push(path); $('.ace_conter_menu .item').removeClass('active'); $('.ace_conter_editor .ace_editors').removeClass('active'); $('.ace_conter_menu').append('<li class="item active item_tab_' + _id +'" title="'+ path +'" data-type="'+ _type +'" data-mode="'+ _mode +'" data-id="'+ _id +'" data-fileName="'+ _fileName +'">'+ '<div class="ace_item_box">'+ '<span class="icon_file"><img src="/static/img/ico-history.png"></span><span title="'+ path + lan.public.history_v + ' [ '+ bt.format_data(obj.history) +' ]' +'">' + _fileName +'</span>'+ '<i class="glyphicon glyphicon-remove icon-tool" aria-hidden="true" data-file-state="0" data-title="' + _fileName + '"></i>'+ '</div>'+ '</li>'); $('.ace_conter_editor').append('<div id="ace_editor_'+_id +'" class="ace_editors active"></div>'); $('[data-paths="'+ path +'"]').find('.file_fold').addClass('active bg'); _this.ace_active = _id; _this.editorLength = _this.editorLength + 1; _this.creationEditor({id: _id,fileName: _fileName,path: path,mode:_mode,encoding: res.encoding,data: res.data,type:_type,historys:res.historys,readOnly:true,historys_file:true,historys_active:obj.history}); if(callback) callback(res); }); }, // 打开编辑器文件-方法 // openEditorView: function(path, callback) { // if (path == undefined) return false; // // 文件类型(type,列如:JavaScript) 、文件模型(mode,列如:text)、文件标识(id,列如:x8AmsnYn)、文件编号(index,列如:0)、文件路径 (path,列如:/www/root/) // var _this = this, // paths = path.split('/'), // _fileName = paths[paths.length - 1], // _fileType = this.getFileType(_fileName), // _type = _fileType.name, // _mode = _fileType.mode, // _id = bt.get_random(8), // _index = this.editorLength; // _this.is_file_open(path, function(is_state) { // if (is_state) { // $('.ace_conter_menu').find('[title="' + path + '"]').click(); // } else { // _this.getFileBody({ path: path }, function(res) { // _this.pathAarry.push(path); // $('.ace_conter_menu .item').removeClass('active'); // $('.ace_conter_editor .ace_editors').removeClass('active'); // $('.ace_conter_menu .ace_editor_add').before('<div class="item active item_tab_' + _id + '" title="' + path + '" data-type="' + _type + '" data-mode="' + _mode + '" data-id="' + _id + '" data-index="' + _index + '" data-fileName="' + _fileName + '">\ // <span class="icon_file"><i class="' + _mode + '-icon"></i></span><span title="' + path + '">' + _fileName + '</span>\ // <i class="glyphicon glyphicon-remove icon-tool" aria-hidden="true" data-file-state="0" data-title="' + _fileName + '"></i>\ // </div>'); // $('.ace_conter_editor').append('<div id="ace_editor_' + _id + '" class="ace_editors active"></div>'); // $('[data-menu-path="' + path + '"]').find('.file_fold').addClass('active bg'); // _this.ace_active = _id; // _this.editorLength = _this.editorLength + 1; // _this.creationEditor({ id: _id, fileName: _fileName, path: path, mode: _mode, encoding: res.encoding, data: res.data, type: _type, historys: res.historys }); // if (callback) callback(res); // }); // } // }); // $('.ace_toolbar_menu').hide(); // }, openEditorView: function (path,callback) { if(path == undefined) return false; // 文件类型(type,列如:JavaScript) 、文件模型(mode,列如:text)、文件标识(id,列如:x8AmsnYn)、文件编号(index,列如:0)、文件路径 (path,列如:/www/root/) var _this = this,paths = path.split('/'),_fileName = paths[paths.length - 1],_fileType = this.getFileType(_fileName),_type = _fileType.name,_mode = _fileType.mode,_id = bt.get_random(8),_index = this.editorLength; _this.is_file_open(path,function(is_state){ if(is_state){ $('.ace_conter_menu').find('[title="'+ path +'"]').click(); }else{ _this.getFileBody({path: path}, function (res) { _this.pathAarry.push(path); $('.ace_conter_menu .item').removeClass('active'); $('.ace_conter_editor .ace_editors').removeClass('active'); $('.ace_conter_menu').append('<li class="item active item_tab_' + _id +'" title="'+ path +'" data-type="'+ _type +'" data-mode="'+ _mode +'" data-id="'+ _id +'" data-fileName="'+ _fileName +'">'+ '<div class="ace_item_box">'+ '<span class="icon_file"><i class="'+ _mode +'-icon"></i></span><span title="'+ path +'">' + _fileName + '</span>'+ '<i class="glyphicon glyphicon-remove icon-tool" aria-hidden="true" data-file-state="0" data-title="' + _fileName + '"></i>'+ '</div>'+ '</li>'); $('.ace_conter_editor').append('<div id="ace_editor_'+_id +'" class="ace_editors active" style="font-size:'+ aceEditor.aceConfig.aceEditor.fontSize +'px"></div>'); $('[data-menu-path="'+ path +'"]').find('.file_fold').addClass('active bg'); _this.ace_active = _id; _this.editorLength = _this.editorLength + 1; _this.creationEditor({id: _id,fileName: _fileName,path: path,mode:_mode,encoding: res.encoding,data: res.data,type:_type,historys:res.historys}); if(callback) callback(res); }); } }); $('.ace_toolbar_menu').hide(); }, // 获取收藏夹列表-方法 getFavoriteList: function() {}, // 获取文件列表-请求 getFileList: function() {}, // 获取文件内容-请求 getFileBody: function(obj, callback) { var loadT = layer.msg(lan.public.get_file_contents, { time: 0, icon: 16, shade: [0.3, '#000'] }), _this = this; $.post("/files?action=GetFileBody", "path=" + encodeURIComponent(obj.path), function(res) { layer.close(loadT); if (!res.status) { if (_this.editorLength == 0) layer.closeAll(); layer.msg(res.msg, { icon: 2 }); return false; } else { if (!aceEditor.isAceView) { var _path = obj.path.split('/'); layer.msg(lan.public.opend_file + ' [' + (_path[_path.length - 1]) + ']'); } } if (callback) callback(res); }); }, // 保存文件内容-请求 // saveFileBody: function(obj, callback) { // var loadT = layer.msg(lan.public.save_file_content, { time: 0, icon: 16, shade: [0.3, '#000'] }); // $.post("/files?action=SaveFileBody", { // data:obj.data, // encoding:obj.encoding.toLowerCase(), // path:obj.path // }, function(res) { // layer.close(loadT); // if (callback) callback(res) // }); // }, saveFileBody: function (obj,success,error) { $.ajax({ type:'post', url:'/files?action=SaveFileBody', timeout: 7000, //设置保存超时时间 data:{ data:obj.data, encoding:obj.encoding.toLowerCase(), path:obj.path }, success:function(rdata){ if(rdata.status){ if(success) success(rdata) }else{ if(error) error(rdata) } if(!obj.tips) layer.msg(rdata.msg,{icon:rdata.status?1:2}); }, error:function(err){ if(error) error(err) } }); }, saveAceConfig: function(data,callback){ var loadT = layer.msg(lan.public.save_ace_config,{time: 0,icon: 16,shade: [0.3, '#000']}),_this = this; this.saveFileBody({ path:'/www/server/panel/BTPanel/static/ace/ace.editor.config.json', data:JSON.stringify(data), encoding:'utf-8', tips:true, },function(rdata){ layer.close(loadT); _this.setStorage('aceConfig',JSON.stringify(data)); if(callback) callback(rdata); }); }, // 获取配置文件 getEditorConfig: function(callback) { var loadT = layer.msg(lan.public.get_ace_config,{time: 0,icon: 16,shade: [0.3, '#000']}),_this = this; this.getFileBody({path:'/www/server/panel/BTPanel/static/ace/ace.editor.config.json'},function(rdata){ layer.close(loadT); _this.setStorage('aceConfig',JSON.stringify(rdata.data)); if(callback) callback(JSON.parse(rdata.data)); }); }, getAceConfig:function(callback){ var loadT = layer.msg(lan.public.get_ace_config,{time: 0,icon: 16,shade: [0.3, '#000']}),_this = this; this.getFileBody({path:'/www/server/panel/BTPanel/static/ace/ace.editor.config.json'},function(rdata){ layer.close(loadT); _this.setStorage('aceConfig',JSON.stringify(rdata.data)); if(callback) callback(JSON.parse(rdata.data)); }); }, // 递归保存文件 saveAllFileBody: function(arry, num, callabck) { var _this = this; if (typeof num == "function") { callabck = num; num = 0; } else if (typeof num == "undefined") { num = 0; } if (num == arry.length) { if (callabck) callabck(); layer.msg(lan.public.save_all, { icon: 1 }); return false; } aceEditor.saveFileBody({ path: arry[num].path, data: arry[num].data, encoding: arry[num].encoding }, function() { num = num + 1; aceEditor.saveAllFileBody(arry, num, callabck); }); } } function openEditorView(type, path) { var paths = path.split('/'), _fileName = paths[paths.length - 1], _aceTmplate = document.getElementById("aceTmplate").innerHTML; _aceTmplate = _aceTmplate.replace(/\<\\\/script\>/g, '</script>'); if (aceEditor.editor !== null) { if (aceEditor.isAceView == false) { aceEditor.isAceView = true; $('.aceEditors .layui-layer-max').click() } aceEditor.openEditorView(path); return false; } var r = layer.open({ type: 1, maxmin: true, shade: false, area: ['80%', '80%'], title: lan.public.online_text_editor, skin: 'aceEditors', zIndex: 19999, content: _aceTmplate, success: function(layero, index) { function set_edit_file() { // aceEditor.layer_view = index; aceEditor.ace_active = ''; aceEditor.eventEditor(); $('#ace_conter').addClass(aceEditor.editorTheme); ace.require("/ace/ext/language_tools"); ace.config.set("modePath", "/static/ace"); ace.config.set("workerPath", "/static/ace"); ace.config.set("themePath", "/static/ace"); aceEditor.openEditorView(path); var _left = parseInt( $(layero).css('left')),_top = parseInt( $(layero).css('top')); _left<0?$(layero).css('left',Math.abs(_left)):$(layero).css('left',_left) _top<0?$(layero).css('top',Math.abs(_top)):$(layero).css('top',_top) // $('.aceEditors .layui-layer-min').click(function(e) { // aceEditor.isAceView = false; // setTimeout(function() { // var _id = $('.ace_conter_menu .active').attr('data-id'); // aceEditor.editor['ace_editor_' + _id].ace.resize(); // }, 105); // }); // $('.aceEditors .layui-layer-max').click(function(e) { // setTimeout(function() { // aceEditor.setEditorView(); // var _id = $('.ace_conter_menu .active').attr('data-id'); // aceEditor.editor['ace_editor_' + _id].ace.resize(); // }, 105); // }); $('.aceEditors .layui-layer-min').click(function (e){ aceEditor.setEditorView(); }); $('.aceEditors .layui-layer-max').click(function (e){ aceEditor.setEditorView(); }); } var aceConfig = aceEditor.getStorage('aceConfig'); if(aceConfig == null){ // 获取编辑器配置 aceEditor.getAceConfig(function(res){ aceEditor.aceConfig = res; // 赋值配置参数 set_edit_file(); }); }else{ aceEditor.aceConfig = JSON.parse(aceConfig); typeof aceEditor.aceConfig == 'string'?aceEditor.aceConfig = JSON.parse(aceEditor.aceConfig):'' set_edit_file(); } }, cancel: function() { for (var item in aceEditor.editor) { if (aceEditor.editor[item].fileType == 1) { layer.open({ type: 1, area: ['400px', '180px'], title: lan.public.save_tips, content: '<div class="ace-clear-form">\ <div class="clear-icon"></div>\ <div class="clear-title">' + lan.public.save_tips1 + '</div>\ <div class="clear-tips">' + lan.public.save_tips2 + '</div>\ <div class="ace-clear-btn" style="">\ <button type="button" class="btn btn-sm btn-default" style="float:left" data-type="2">' + lan.public.dont_save + '</button>\ <button type="button" class="btn btn-sm btn-default" style="margin-right:10px;" data-type="1">' + lan.public.cancel + '</button>\ <button type="button" class="btn btn-sm btn-success" data-type="0">' + lan.public.save + '</button>\ </div>\ </div>', success: function(layers, indexs) { $('.ace-clear-btn button').click(function() { var _type = $(this).attr('data-type'); switch (_type) { case '2': aceEditor.editor = null; layer.closeAll(); break; case '1': layer.close(indexs); break; case '0': var _arry = [], editor = aceEditor['editor']; for (var item in editor) { _arry.push({ path: editor[item]['path'], data: editor[item]['ace'].getValue(), encoding: editor[item]['encoding'], }) } aceEditor.saveAllFileBody(_arry, function() { $('.ace_conter_menu>.item').each(function(el, indexx) { var _id = $(this).attr('data-id'); $(this).find('i').removeClass('glyphicon-exclamation-sign').addClass('glyphicon-remove').attr('data-file-state', '0') aceEditor.editor['ace_editor_' + _id].fileType = 0; }); aceEditor.editor = null; aceEditor.pathAarry = []; layer.closeAll(); }); break; } }); } }); return false; } } }, end:function(){ aceEditor.ace_active = ''; aceEditor.editor = null; aceEditor.pathAarry = []; aceEditor.menu_path = ''; } }); } /** * AES加密 * @param {string} s_text 等待加密的字符串 * @param {string} s_key 16位密钥 * @param {array} ctx 可选,默认为 { mode: CryptoJS.mode.ECB,padding: CryptoJS.pad.ZeroPadding } * @return {string} */ function aes_encrypt(s_text,s_key,ctx){ if(ctx == undefined) ctx = { mode: CryptoJS.mode.ECB,padding: CryptoJS.pad.ZeroPadding } var key = CryptoJS.enc.Utf8.parse(s_key); var encrypt_data = CryptoJS.AES.encrypt(s_text,key,ctx); return encrypt_data.toString(); } /** * AES解密 * @param {string} s_text 等待解密的密文 * @param {string} s_key 16位密钥 * @param {array} ctx 可选,默认为 { mode: CryptoJS.mode.ECB,padding: CryptoJS.pad.ZeroPadding } * @return {string} */ function aes_decrypt(s_text,s_key,ctx){ if(ctx == undefined) ctx = { mode: CryptoJS.mode.ECB,padding: CryptoJS.pad.ZeroPadding } var key = CryptoJS.enc.Utf8.parse(s_key); var decrypt_data = CryptoJS.AES.decrypt(s_text,key,ctx); return decrypt_data.toString(CryptoJS.enc.Utf8); } /** * ajax内容解密 * @param {string} data 加密的响应数据 * @param {string} stype ajax中定义的数据类型 * @return {string} 解密后的响应数据 */ function ajax_decrypt(data,stype){ if(!data) return data; if(data.substring(0,6) == "BT-CRT"){ var token = $("#request_token_head").attr("token") var pwd = token.substring(0,8) + token.substring(40,48) data = aes_decrypt(data.substring(6),pwd); if(stype == undefined){ stype = ''; } if(stype.toLowerCase() != 'json'){ data = JSON.parse(data); } } return data } /** * 格式化form_data数据,并加密 * @param {string} form_data 加密前的form_data数据 * @return {string} 加密后的form_data数据 */ function format_form_data(form_data){ var data_tmp = form_data.split('&'); var form_info = {} var token = $("#request_token_head").attr("token") if(!token) return form_data; var pwd = token.substring(0,8) + token.substring(40,48) for(var i=0;i<data_tmp.length;i++){ var tmp = data_tmp[i].split('='); if(tmp.length < 2) continue // if(!tmp[1]) continue; var val = decodeURIComponent(tmp[1].replace(/\+/g,'%20')); if(val.length > 3){ form_info[tmp[0]] = 'BT-CRT' + aes_encrypt(val,pwd); }else{ form_info[tmp[0]] = val; } } return $.param(form_info); } function ajax_encrypt(request){ if(!this.type || !this.data || !this.contentType) return; if($("#panel_debug").attr("data") == 'True') return; if($("#panel_debug").attr("data-pyversion") == '2') return; if(this.type == 'POST' && this.data.length > 1){ this.data = format_form_data(this.data); } } function ajaxSetup() { var my_headers = {}; var request_token_ele = document.getElementById("request_token_head"); if (request_token_ele) { var request_token = request_token_ele.getAttribute('token'); if (request_token) { my_headers['x-http-token'] = request_token } } request_token_cookie = getCookie('request_token'); if (request_token_cookie) { my_headers['x-cookie-token'] = request_token_cookie } if (my_headers) { $.ajaxSetup({ headers: my_headers, // dataFilter: ajax_decrypt, // beforeSend: ajax_encrypt }); } } ajaxSetup(); function RandomStrPwd(b) { b = b || 32; var c = "AaBbCcDdEeFfGHhiJjKkLMmNnPpRSrTsWtXwYxZyz2345678"; var a = c.length; var d = ""; for (i = 0; i < b; i++) { d += c.charAt(Math.floor(Math.random() * a)) } return d } function repeatPwd(a) { $("#MyPassword").val(RandomStrPwd(a)) } function refresh() { window.location.reload() } function GetBakPost(b) { $(".baktext").hide().prev().show(); var c = $(".baktext").attr("data-id"); var a = $(".baktext").val(); if (a == "") { a = lan.bt.empty; } setWebPs(b, c, a); $("a[data-id='" + c + "']").html(a); $(".baktext").remove() } function setWebPs(b, e, a) { var d = layer.load({ shade: true, shadeClose: false }); var c = "ps=" + a; $.post("/data?action=setPs", "table=" + b + "&id=" + e + "&" + c, function(f) { if (f == true) { if (b == "sites") { getWeb(1) } else { if (b == "ftps") { getFtp(1) } else { getData(1) } } layer.closeAll(); layer.msg(lan.public.edit_ok, { icon: 1 }); } else { layer.msg(lan.public.edit_err, { icon: 2 }); layer.closeAll(); } }); } $(".menu-icon").click(function() { $(".sidebar-scroll").toggleClass("sidebar-close"); $(".main-content").toggleClass("main-content-open"); if ($(".sidebar-close")) { $(".sub-menu").find(".sub").css("display", "none") } }); var Upload, percentage; Date.prototype.format = function(b) { var c = { "M+": this.getMonth() + 1, "d+": this.getDate(), "h+": this.getHours(), "m+": this.getMinutes(), "s+": this.getSeconds(), "q+": Math.floor((this.getMonth() + 3) / 3), S: this.getMilliseconds() }; if (/(y+)/.test(b)) { b = b.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length)) } for (var a in c) { if (new RegExp("(" + a + ")").test(b)) { b = b.replace(RegExp.$1, RegExp.$1.length == 1 ? c[a] : ("00" + c[a]).substr(("" + c[a]).length)) } } return b }; function getLocalTime(a) { a = a.toString(); if (a.length > 10) { a = a.substring(0, 10) } return new Date(parseInt(a) * 1000).format("yyyy/MM/dd hh:mm:ss") } function ToSize(a) { var d = [" B", " KB", " MB", " GB", " TB", " PB"]; var e = 1024; for (var b = 0; b < d.length; b++) { if (a < e) { return (b == 0 ? a : a.toFixed(2)) + d[b] } a /= e } } function ChangePath(d) { setCookie("SetId", d); setCookie("SetName", ""); var c = layer.open({ type: 1, area: "650px", title: lan.bt.dir, closeBtn: 2, shift: 5, shadeClose: false, content: "<div class='changepath'><div class='path-top'><button type='button' class='btn btn-default btn-sm' onclick='BackFile()'><span class='glyphicon glyphicon-share-alt'></span> " + lan.public.return+"</button><div class='place' id='PathPlace'>" + lan.bt.path + ":<span></span></div></div><div class='path-con'><div class='path-con-left'><dl><dt id='changecomlist' onclick='BackMyComputer()'>" + lan.bt.comp + "</dt></dl></div><div class='path-con-right'><ul class='default' id='computerDefautl'></ul><div class='file-list divtable'><table class='table table-hover' style='border:0 none'><thead><tr class='file-list-head'><th width='40%'>" + lan.bt.filename + "</th><th width='20%'>" + lan.bt.etime + "</th><th width='10%'>" + lan.bt.access + "</th><th width='10%'>" + lan.bt.own + "</th><th width='10%'></th></tr></thead><tbody id='tbody' class='list-list'></tbody></table></div></div></div></div><div class='getfile-btn' style='margin-top:0'><button type='button' class='btn btn-default btn-sm pull-left' onclick='CreateFolder()'>" + lan.bt.adddir + "</button><button type='button' class='btn btn-danger btn-sm mr5' onclick=\"layer.close(getCookie('ChangePath'))\">" + lan.public.close + "</button> <button type='button' class='btn btn-success btn-sm' onclick='GetfilePath()'>" + lan.bt.path_ok + "</button></div>" }); setCookie("ChangePath", c); var b = $("#" + d).val(); tmp = b.split("."); if (tmp[tmp.length - 1] == "gz") { tmp = b.split("/"); b = ""; for (var a = 0; a < tmp.length - 1; a++) { b += "/" + tmp[a] } setCookie("SetName", tmp[tmp.length - 1]) } b = b.replace(/\/\//g, "/"); GetDiskList(b); ActiveDisk() } function GetDiskList(b) { var d = ""; var a = ""; var c = "path=" + b + "&disk=True"; $.post("/files?action=GetDir", c, function(h) { if(h.status == false) { layer.close(layer.index); layer.msg(h.msg,{icon: 2}); return false; } if (h.DISK != undefined) { for (var f = 0; f < h.DISK.length; f++) { a += "<dd onclick=\"GetDiskList('" + h.DISK[f].path + "')\"><span class='glyphicon glyphicon-hdd'></span> " + h.DISK[f].path + "</dd>" } $("#changecomlist").html(a) } for (var f = 0; f < h.DIR.length; f++) { var g = h.DIR[f].split(";"); var e = g[0]; if (e.length > 20) { e = e.substring(0, 20) + "..." } if (isChineseChar(e)) { if (e.length > 10) { e = e.substring(0, 10) + "..." } } d += "<tr><td onclick=\"GetDiskList('" + h.PATH + "/" + g[0] + "')\" title='" + g[0] + "'><span class='glyphicon glyphicon-folder-open'></span>" + e + "</td><td>" + getLocalTime(g[2]) + "</td><td>" + g[3] + "</td><td>" + g[4] + "</td><td><span class='delfile-btn' onclick=\"NewDelFile('" + h.PATH + "/" + g[0] + "')\">X</span></td></tr>" } if (h.FILES != null && h.FILES != "") { for (var f = 0; f < h.FILES.length; f++) { var g = h.FILES[f].split(";"); var e = g[0]; if (e.length > 20) { e = e.substring(0, 20) + "..." } if (isChineseChar(e)) { if (e.length > 10) { e = e.substring(0, 10) + "..." } } d += "<tr><td title='" + g[0] + "'><span class='glyphicon glyphicon-file'></span>" + e + "</td><td>" + getLocalTime(g[2]) + "</td><td>" + g[3] + "</td><td>" + g[4] + "</td><td></td></tr>" } } $(".default").hide(); $(".file-list").show(); $("#tbody").html(d); if (h.PATH.substr(h.PATH.length - 1, 1) != "/") { h.PATH += "/" } $("#PathPlace").find("span").html(h.PATH); ActiveDisk(); return }) } function CreateFolder() { var a = "<tr><td colspan='2'><span class='glyphicon glyphicon-folder-open'></span> <input id='newFolderName' class='newFolderName' type='text' value=''></td><td colspan='3'><button id='nameOk' type='button' class='btn btn-success btn-sm'>" + lan.public.ok + "</button> <button id='nameNOk' type='button' class='btn btn-default btn-sm'>" + lan.public.cancel + "</button></td></tr>"; if ($("#tbody tr").length == 0) { $("#tbody").append(a) } else { $("#tbody tr:first-child").before(a) } $(".newFolderName").focus(); $("#nameOk").click(function() { var c = $("#newFolderName").val(); var b = $("#PathPlace").find("span").text(); newTxt = b.replace(new RegExp(/(\/\/)/g), "/") + c; var d = "path=" + newTxt; $.post("/files?action=CreateDir", d, function(e) { if (e.status == true) { layer.msg(e.msg, { icon: 1 }) } else { layer.msg(e.msg, { icon: 2 }) } GetDiskList(b) }) }); $("#nameNOk").click(function() { $(this).parents("tr").remove() }) } function NewDelFile(c) { var a = $("#PathPlace").find("span").text(); newTxt = c.replace(new RegExp(/(\/\/)/g), "/"); var b = "path=" + newTxt + "&empty=True"; $.post("/files?action=DeleteDir", b, function(d) { if (d.status == true) { layer.msg(d.msg, { icon: 1 }) } else { layer.msg(d.msg, { icon: 2 }) } GetDiskList(a) }) } function ActiveDisk() { var a = $("#PathPlace").find("span").text().substring(0, 1); switch (a) { case "C": $(".path-con-left dd:nth-of-type(1)").css("background", "#eee").siblings().removeAttr("style"); break; case "D": $(".path-con-left dd:nth-of-type(2)").css("background", "#eee").siblings().removeAttr("style"); break; case "E": $(".path-con-left dd:nth-of-type(3)").css("background", "#eee").siblings().removeAttr("style"); break; case "F": $(".path-con-left dd:nth-of-type(4)").css("background", "#eee").siblings().removeAttr("style"); break; case "G": $(".path-con-left dd:nth-of-type(5)").css("background", "#eee").siblings().removeAttr("style"); break; case "H": $(".path-con-left dd:nth-of-type(6)").css("background", "#eee").siblings().removeAttr("style"); break; default: $(".path-con-left dd").removeAttr("style") } } function BackMyComputer() { $(".default").show(); $(".file-list").hide(); $("#PathPlace").find("span").html(""); ActiveDisk() } function BackFile() { var c = $("#PathPlace").find("span").text(); if (c.substr(c.length - 1, 1) == "/") { c = c.substr(0, c.length - 1) } var d = c.split("/"); var a = ""; if (d.length > 1) { var e = d.length - 1; for (var b = 0; b < e; b++) { a += d[b] + "/" } GetDiskList(a.replace("//", "/")) } else { a = d[0] } if (d.length == 1) {} } function GetfilePath() { var a = $("#PathPlace").find("span").text(); a = a.replace(new RegExp(/(\\)/g), "/"); setCookie('path_dir_change', a); $("#" + getCookie("SetId")).val(a + getCookie("SetName")); layer.close(getCookie("ChangePath")) } function setCookie(a, c) { var b = 30; var d = new Date(); d.setTime(d.getTime() + b * 24 * 60 * 60 * 1000); document.cookie = a + "=" + escape(c) + ";expires=" + d.toGMTString() } function getCookie(b) { var a, c = new RegExp("(^| )" + b + "=([^;]*)(;|$)"); if (a = document.cookie.match(c)) { return unescape(a[2]) } else { return null } } function aotuHeight() { var a = $("body").height() - 50; $(".main-content").css("min-height", a) } $(function() { aotuHeight() }); $(window).resize(function() { aotuHeight() }); function showHidePwd() { var a = "glyphicon-eye-open", b = "glyphicon-eye-close"; $(".pw-ico").click(function() { var g = $(this).attr("class"), e = $(this).prev(); if (g.indexOf(a) > 0) { var h = e.attr("data-pw"); $(this).removeClass(a).addClass(b); e.text(h) } else { $(this).removeClass(b).addClass(a); e.text("**********") } var d = $(this).next().position().left; var f = $(this).next().position().top; var c = $(this).next().width(); $(this).next().next().css({ left: d + c + "px", top: f + "px" }) }) } function openPath(a) { setCookie("Path", a); window.location.href = "/files" } function OnlineEditFile(k, f) { if (k != 0) { var l = $("#PathPlace input").val(); var h = encodeURIComponent($("#textBody").val()); var a = $("select[name=encoding]").val(); var loadT = layer.msg(lan.bt.save_file, { icon: 16, time: 0 }); $.post("/files?action=SaveFileBody", "data=" + h + "&path=" + encodeURIComponent(f) + "&encoding=" + a, function(m) { if (k == 1) { layer.close(loadT); } layer.msg(m.msg, { icon: m.status ? 1 : 2 }); }); return } var e = layer.msg(lan.bt.read_file, { icon: 16, time: 0 }); var g = f.split("."); var b = g[g.length - 1]; var d; switch (b) { case "html": var j = { name: "htmlmixed", scriptTypes: [{ matches: /\/x-handlebars-template|\/x-mustache/i, mode: null }, { matches: /(text|application)\/(x-)?vb(a|script)/i, mode: "vbscript" }] }; d = j; break; case "htm": var j = { name: "htmlmixed", scriptTypes: [{ matches: /\/x-handlebars-template|\/x-mustache/i, mode: null }, { matches: /(text|application)\/(x-)?vb(a|script)/i, mode: "vbscript" }] }; d = j; break; case "js": d = "text/javascript"; break; case "json": d = "application/ld+json"; break; case "css": d = "text/css"; break; case "php": d = "application/x-httpd-php"; break; case "tpl": d = "application/x-httpd-php"; break; case "xml": d = "application/xml"; break; case "sql": d = "text/x-sql"; break; case "conf": d = "text/x-nginx-conf"; break; default: var j = { name: "htmlmixed", scriptTypes: [{ matches: /\/x-handlebars-template|\/x-mustache/i, mode: null }, { matches: /(text|application)\/(x-)?vb(a|script)/i, mode: "vbscript" }] }; d = j } $.post("/files?action=GetFileBody", "path=" + encodeURIComponent(f), function(s) { if (s.status === false) { layer.msg(s.msg, { icon: 5 }); return; } layer.close(e); var u = ["utf-8", "GBK", "GB2312", "BIG5"]; var n = ""; var m = ""; var o = ""; for (var p = 0; p < u.length; p++) { m = s.encoding == u[p] ? "selected" : ""; n += '<option value="' + u[p] + '" ' + m + ">" + u[p] + "</option>" } var r = layer.open({ type: 1, shift: 5, closeBtn: 2, area: ["90%", "90%"], title: lan.bt.edit_title + "[" + f + "]", content: '<form class="bt-form pd20 pb70"><div class="line"><p style="color:red;margin-bottom:10px">' + lan.bt.edit_ps + ' <select class="bt-input-text" name="encoding" style="width: 74px;position: absolute;top: 31px;right: 19px;height: 22px;z-index: 9999;border-radius: 0;">' + n + '</select></p><textarea class="mCustomScrollbar bt-input-text" id="textBody" style="width:100%;margin:0 auto;line-height: 1.8;position: relative;top: 10px;" value="" /> </div> <div class="bt-form-submit-btn" style="position:absolute; bottom:0; width:100%"> <button type="button" class="btn btn-danger btn-sm btn-editor-close">' + lan.public.close + '</button> <button id="OnlineEditFileBtn" type="button" class="btn btn-success btn-sm">' + lan.public.save + '</button> </div> </form>' }); $("#textBody").text(s.data); var q = $(window).height() * 0.9; $("#textBody").height(q - 160); var t = CodeMirror.fromTextArea(document.getElementById("textBody"), { extraKeys: { "Ctrl-F": "findPersistent", "Ctrl-H": "replaceAll", "Ctrl-S": function() { $("#textBody").text(t.getValue()); OnlineEditFile(2, f) } }, mode: d, lineNumbers: true, matchBrackets: true, matchtags: true, autoMatchParens: true }); t.focus(); t.setSize("auto", q - 150); $("#OnlineEditFileBtn").click(function() { $("#textBody").text(t.getValue()); OnlineEditFile(1, f); }); $(".btn-editor-close").click(function() { layer.close(r); }); }); } function ServiceAdmin(a, b) { if (!isNaN(a)) { a = "php-fpm-" + a } a = a.replace('_soft', ''); var c = "name=" + a + "&type=" + b; var d = ""; switch (b) { case "stop": d = lan.bt.stop; break; case "start": d = lan.bt.start; break; case "restart": d = lan.bt.restart; break; case "reload": d = lan.bt.reload; break } layer.confirm(lan.get('service_confirm', [d, a]), { icon: 3, closeBtn: 2 }, function() { var e = layer.msg(lan.get('service_the', [d, a]), { icon: 16, time: 0 }); $.post("/system?action=ServiceAdmin", c, function(g) { layer.close(e); var f = g.status ? lan.get('service_ok', [a, d]) : lan.get('service_err', [a, d]); layer.msg(f, { icon: g.status ? 1 : 2 }); if (b != "reload" && g.status == true) { setTimeout(function() { window.location.reload() }, 1000) } if (!g.status) { layer.msg(g.msg, { icon: 2, time: 0, shade: 0.3, shadeClose: true }) } }).error(function() { layer.close(e); layer.msg(lan.public.success, { icon: 1 }) }) }) } function GetConfigFile(a) { var b = ""; switch (a) { case "mysql": b = "/etc/my.cnf"; break; case "nginx": b = "/www/server/nginx/conf/nginx.conf"; break; case "pure-ftpd": b = "/www/server/pure-ftpd/etc/pure-ftpd.conf"; break; case "apache": b = "/www/server/apache/conf/httpd.conf"; break; case "tomcat": b = "/www/server/tomcat/conf/server.xml"; break; default: b = "/www/server/php/" + a + "/etc/php.ini"; break } OnlineEditFile(0, b) } function GetPHPStatus(a) { if (a == "52") { layer.msg(lan.bt.php_status_err, { icon: 2 }); return } $.post("/ajax?action=GetPHPStatus", "version=" + a, function(b) { layer.open({ type: 1, area: "400", title: lan.bt.php_status_title, closeBtn: 2, shift: 5, shadeClose: true, content: "<div style='margin:15px;'><table class='table table-hover table-bordered'> <tr><th>" + lan.bt.php_pool + "</th><td>" + b.pool + "</td></tr> <tr><th>" + lan.bt.php_manager + "</th><td>" + ((b["process manager"] == "dynamic") ? lan.bt.dynamic : lan.bt.static) + "</td></tr> <tr><th>" + lan.bt.php_start + "</th><td>" + b["start time"] + "</td></tr> <tr><th>" + lan.bt.php_accepted + "</th><td>" + b["accepted conn"] + "</td></tr> <tr><th>" + lan.bt.php_queue + "</th><td>" + b["listen queue"] + "</td></tr> <tr><th>" + lan.bt.php_max_queue + "</th><td>" + b["max listen queue"] + "</td></tr> <tr><th>" + lan.bt.php_len_queue + "</th><td>" + b["listen queue len"] + "</td></tr> <tr><th>" + lan.bt.php_idle + "</th><td>" + b["idle processes"] + "</td></tr> <tr><th>" + lan.bt.php_active + "</th><td>" + b["active processes"] + "</td></tr> <tr><th>" + lan.bt.php_total + "</th><td>" + b["total processes"] + "</td></tr> <tr><th>" + lan.bt.php_max_active + "</th><td>" + b["max active processes"] + "</td></tr> <tr><th>" + lan.bt.php_max_children + "</th><td>" + b["max children reached"] + "</td></tr> <tr><th>" + lan.bt.php_slow + "</th><td>" + b["slow requests"] + "</td></tr> </table></div>" }) }) } function GetNginxStatus() { $.post("/ajax?action=GetNginxStatus", "", function(a) { layer.open({ type: 1, area: "400", title: lan.bt.nginx_title, closeBtn: 2, shift: 5, shadeClose: true, content: "<div style='margin:15px;'><table class='table table-hover table-bordered'> <tr><th>" + lan.bt.nginx_active + "</th><td>" + a.active + "</td></tr> <tr><th>" + lan.bt.nginx_accepts + "</th><td>" + a.accepts + "</td></tr> <tr><th>" + lan.bt.nginx_handled + "</th><td>" + a.handled + "</td></tr> <tr><th>" + lan.bt.nginx_requests + "</th><td>" + a.requests + "</td></tr> <tr><th>" + lan.bt.nginx_reading + "</th><td>" + a.Reading + "</td></tr> <tr><th>" + lan.bt.nginx_writing + "</th><td>" + a.Writing + "</td></tr> <tr><th>" + lan.bt.nginx_waiting + "</th><td>" + a.Waiting + "</td></tr> </table></div>" }) }) } function divcenter() { $(".layui-layer").css("position", "absolute"); var c = $(window).width(); var b = $(".layui-layer").outerWidth(); var g = $(window).height(); var f = $(".layui-layer").outerHeight(); var a = (c - b) / 2; var e = (g - f) / 2 > 0 ? (g - f) / 2 : 10; var d = $(".layui-layer").offset().left - $(".layui-layer").position().left; var h = $(".layui-layer").offset().top - $(".layui-layer").position().top; a = a + $(window).scrollLeft() - d; e = e + $(window).scrollTop() - h; $(".layui-layer").css("left", a + "px"); $(".layui-layer").css("top", e + "px") } function btcopy(password) { $("#bt_copys").attr('data-clipboard-text', password); $("#bt_copys").click(); } function loadScript(arry, param, callback) { var ready = 0; if (typeof param === 'function') callback = param for (var i = 0; i < arry.length; i++) { if (!Array.isArray(bt['loadScript'])) bt['loadScript'] = [] if (!is_file_existence(arry[i], true)) { if ((arry.length - 1) === i && callback) callback(); continue; }; var script = document.createElement("script"), _arry_split = arry[i].split('/'); script.type = "text/javascript"; if (typeof(callback) != "undefined") { if (script.readyState) { (function(i) { script.onreadystatechange = function() { console.log(arry[i]); if (script.readyState == "loaded" || script.readyState == "complete") { script.onreadystatechange = null; bt['loadScript'].push(arry[i]); ready++; } }; })(i); } else { (function(i) { script.onload = function() { bt['loadScript'].push(arry[i]); ready++; }; })(i); } } script.src = arry[i]; document.body.appendChild(script); } var time = setInterval(function() { if (ready === arry.length) { clearTimeout(time); callback(); } }, 10); } // 判断文件是否插入 function is_file_existence(name,type){ var arry = type?bt.loadScript:bt.loadLink for(var i=0;i<arry.length;i++){ if(arry[i] === name) return false } return true } // var clipboard = new ClipboardJS('#bt_copys'); // clipboard.on('success', function(e) { // layer.msg(lan.public.cp_success, { icon: 1 }); // }); // clipboard.on('error', function(e) { // layer.msg(lan.index.cp_fail, { icon: 2 }); // }); function isChineseChar(b) { var a = /[\u4E00-\u9FA5\uF900-\uFA2D]/; return a.test(b) } function SafeMessage(j, h, g, f) { if (f == undefined) { f = "" } var d = Math.round(Math.random() * 9 + 1); var c = Math.round(Math.random() * 9 + 1); var e = ""; e = d + c; sumtext = d + " + " + c; setCookie("vcodesum", e); var mess = layer.open({ type: 1, title: j, area: "350px", closeBtn: 2, shadeClose: true, content: "<div class='bt-form webDelete pd20 pb70'><p>" + h + "</p>" + f + "<div class='vcode'>" + lan.bt.cal_msg + "<span class='text'>" + sumtext + "</span>=<input type='number' id='vcodeResult' value=''></div><div class='bt-form-submit-btn'><button type='button' class='btn btn-danger btn-sm bt-cancel'>" + lan.public.cancel + "</button> <button type='button' id='toSubmit' class='btn btn-success btn-sm' >" + lan.public.ok + "</button></div></div>" }); $("#vcodeResult").focus().keyup(function(a) { if (a.keyCode == 13) { $("#toSubmit").click() } }); $(".bt-cancel").click(function() { layer.close(mess); }); $("#toSubmit").click(function() { var a = $("#vcodeResult").val().replace(/ /g, ""); if (a == undefined || a == "") { layer.msg(lan.public.input_calc_result); return } if (a != getCookie("vcodesum")) { layer.msg(lan.public.input_calc_result); return } layer.close(mess); g(); }) } $(function() { $(".fb-ico").hover(function() { $(".fb-text").css({ left: "36px", top: 0, width: "80px" }) }, function() { $(".fb-text").css({ left: 0, width: "36px" }) }).click(function() { $(".fb-text").css({ left: 0, width: "36px" }); $(".zun-feedback-suggestion").show() }); $(".fb-close").click(function() { $(".zun-feedback-suggestion").hide() }); $(".fb-attitudes li").click(function() { $(this).addClass("fb-selected").siblings().removeClass("fb-selected") }) }); $("#dologin").click(function() { layer.confirm(lan.bt.loginout, { icon: 3, closeBtn: 2, title: "Logout" }, function() { window.location.href = "/login?dologin=True" }); return false }); function setPassword(a) { if (a == 1) { p1 = $("#p1").val(); p2 = $("#p2").val(); if (p1 == "" || p1.length < 8) { layer.msg(lan.bt.pass_err_len, { icon: 2 }); return } //准备弱口令匹配元素 var checks = ['admin888', '123123123', '12345678', '45678910', '87654321', 'asdfghjkl', 'password', 'qwerqwer']; pchecks = 'abcdefghijklmnopqrstuvwxyz1234567890'; for (var i = 0; i < pchecks.length; i++) { checks.push(pchecks[i] + pchecks[i] + pchecks[i] + pchecks[i] + pchecks[i] + pchecks[i] + pchecks[i] + pchecks[i]); } //检查弱口令 cps = p1.toLowerCase(); var isError = ""; for (var i = 0; i < checks.length; i++) { if (cps == checks[i]) { isError += '[' + checks[i] + '] '; } } if (isError != "") { layer.msg(lan.bt.pass_err + isError, { icon: 5 }); return; } if (p1 != p2) { layer.msg(lan.bt.pass_err_re, { icon: 2 }); return } $.post("/config?action=setPassword", "password1=" + encodeURIComponent(p1) + "&password2=" + encodeURIComponent(p2), function(b) { if (b.status) { layer.closeAll(); layer.msg(b.msg, { icon: 1 }) } else { layer.msg(b.msg, { icon: 2 }) } }); return } layer.open({ type: 1, area: "290px", title: lan.bt.pass_title, closeBtn: 2, shift: 5, shadeClose: false, content: "<div class='bt-form pd20 pb70'><div class='line'><span class='tname'>" + lan.public.pass + "</span><div class='info-r'><input class='bt-input-text' type='text' name='password1' id='p1' value='' placeholder='" + lan.bt.pass_new_title + "' style='width:100%'/></div></div><div class='line'><span class='tname'>" + lan.bt.pass_re + "</span><div class='info-r'><input class='bt-input-text' type='text' name='password2' id='p2' value='' placeholder='" + lan.bt.pass_re_title + "' style='width:100%' /></div></div><div class='bt-form-submit-btn'><span style='float: left;' title='" + lan.bt.pass_rep + "' class='btn btn-default btn-sm' onclick='randPwd(10)'>" + lan.bt.pass_rep_btn + "</span><button type='button' class='btn btn-danger btn-sm' onclick=\"layer.closeAll()\">" + lan.public.close + "</button> <button type='button' class='btn btn-success btn-sm' onclick=\"setPassword(1)\">" + lan.public.edit + "</button></div></div>" }); } function randPwd() { var pwd = RandomStrPwd(12); $("#p1").val(pwd); $("#p2").val(pwd); layer.msg(lan.bt.pass_rep_ps, { time: 2000 }) } function setUserName(a) { if (a == 1) { p1 = $("#p1").val(); p2 = $("#p2").val(); if (p1 == "" || p1.length < 3) { layer.msg(lan.bt.user_len, { icon: 2 }); return } if (p1 != p2) { layer.msg(lan.bt.user_err_re, { icon: 2 }); return } var checks = ['admin', 'root', 'admin123', '123456']; if ($.inArray(p1, checks) >= 0) { layer.msg(lan.public.usually_username_ban, { icon: 2 }); return; } $.post("/config?action=setUsername", "username1=" + encodeURIComponent(p1) + "&username2=" + encodeURIComponent(p2), function(b) { if (b.status) { layer.closeAll(); layer.msg(b.msg, { icon: 1 }); $("input[name='username_']").val(p1) } else { layer.msg(b.msg, { icon: 2 }) } }); return } layer.open({ type: 1, area: "290px", title: lan.bt.user_title, closeBtn: 2, shift: 5, shadeClose: false, content: "<div class='bt-form pd20 pb70'><div class='line'><span class='tname'>" + lan.bt.user + "</span><div class='info-r'><input class='bt-input-text' type='text' name='password1' id='p1' value='' placeholder='" + lan.bt.user_new + "' style='width:100%'/></div></div><div class='line'><span class='tname'>" + lan.bt.pass_re + "</span><div class='info-r'><input class='bt-input-text' type='text' name='password2' id='p2' value='' placeholder='" + lan.bt.pass_re_title + "' style='width:100%'/></div></div><div class='bt-form-submit-btn'><button type='button' class='btn btn-danger btn-sm' onclick=\"layer.closeAll()\">" + lan.public.close + "</button> <button type='button' class='btn btn-success btn-sm' onclick=\"setUserName(1)\">" + lan.public.edit + "</button></div></div>" }) } var openWindow = null; var downLoad = null; var speed = null; function task() { messagebox(); } function ActionTask() { var a = layer.msg(lan.public.the_del, { icon: 16, time: 0, shade: [0.3, "#000"] }); $.post("/files?action=ActionTask", "", function(b) { layer.close(a); layer.msg(b.msg, { icon: b.status ? 1 : 5 }) }) } function RemoveTask(b) { var a = layer.msg(lan.public.the_del, { icon: 16, time: 0, shade: [0.3, "#000"] }); $.post("/files?action=RemoveTask", "id=" + b, function(c) { layer.close(a); layer.msg(c.msg, { icon: c.status ? 1 : 5 }); }).error(function() { layer.msg(lan.bt.task_close, { icon: 1 }); }); } function GetTaskList(a) { a = a == undefined ? 1 : a; $.post("/data?action=getData", "tojs=GetTaskList&table=tasks&limit=10&p=" + a, function(g) { var e = ""; var b = ""; var c = ""; var f = false; for (var d = 0; d < g.data.length; d++) { switch (g.data[d].status) { case "-1": f = true; if (g.data[d].type != "download") { b = "<li><span class='titlename'>" + g.data[d].name + "</span><span class='state'>" + lan.bt.task_install + " <img src='/static/img/ing.gif'> | <a href=\"javascript:RemoveTask(" + g.data[d].id + ")\">" + lan.public.close + "</a></span><span class='opencmd'></span><pre class='cmd'></pre></li>" } else { b = "<li><div class='line-progress' style='width:0%'></div><span class='titlename'>" + g.data[d].name + "<a id='speed' style='margin-left:130px;'>0.0M/12.5M</a></span><span class='com-progress'>0%</span><span class='state'>" + lan.bt.task_downloading + " <img src='/static/img/ing.gif'> | <a href=\"javascript:RemoveTask(" + g.data[d].id + ")\">" + lan.public.close + "</a></span></li>" } break; case "0": c += "<li><span class='titlename'>" + g.data[d].name + "</span><span class='state'>" + lan.bt.task_sleep + "</span> | <a href=\"javascript:RemoveTask(" + g.data[d].id + ")\">" + lan.public.del + "</a></li>"; break; case "1": e += "<li><span class='titlename'>" + g.data[d].name + "</span><span class='state'>" + g.data[d].addtime + " " + lan.bt.task_ok + " " + lan.bt.time + (g.data[d].end - g.data[d].start) + lan.bt.s + "</span></li>" } } $("#srunning").html(b + c); $("#sbody").html(e); return f }) } function GetTaskCount() { $.post("/ajax?action=GetTaskCount", "", function(a) { if (a.status === false) { window.location.href = '/login?dologin=True'; return; } $(".task").text(a) }) } function setSelectChecked(c, d) { var a = document.getElementById(c); for (var b = 0; b < a.options.length; b++) { if (a.options[b].innerHTML == d) { a.options[b].selected = true; break } } } GetTaskCount(); function RecInstall() { $.getScript('jquery.fly.min.js.js'); $.post("/ajax?action=GetSoftList", "", function(l) { var c = ""; var g = ""; var e = ""; for (var h = 0; h < l.length; h++) { if (l[h].name == "Tomcat") { continue } var o = ""; var m = "<input id='data_" + l[h].name + "' data-info='" + l[h].name + " " + l[h].versions[0].version + "' type='checkbox' checked>"; for (var b = 0; b < l[h].versions.length; b++) { var d = ""; if ((l[h].name == "PHP" && (l[h].versions[b].version == "5.4" || l[h].versions[b].version == "54")) || (l[h].name == "MySQL" && l[h].versions[b].version == "5.5") || (l[h].name == "phpMyAdmin" && l[h].versions[b].version == "4.4")) { d = "selected"; m = "<input id='data_" + l[h].name + "' data-info='" + l[h].name + " " + l[h].versions[b].version + "' type='checkbox' checked>" } o += "<option value='" + l[h].versions[b].version + "' " + d + ">" + l[h].name + " " + l[h].versions[b].version + "</option>" } var f = "<li><span class='ico'><img src='/static/img/" + l[h].name.toLowerCase() + ".png'></span><span class='name'><select id='select_" + l[h].name + "' class='sl-s-info'>" + o + "</select></span><span class='pull-right'>" + m + "</span></li>"; if (l[h].name == "Nginx") { c = f } else { if (l[h].name == "Apache") { g = f } else { e += f } } } c += e; g += e; g = g.replace(new RegExp(/(data_)/g), "apache_").replace(new RegExp(/(select_)/g), "apache_select_"); var k = layer.open({ type: 1, title: lan.bt.install_title, area: ["666px", "473px"], closeBtn: 2, shadeClose: false, content: "<div class='rec-install'><div class='important-title'><p><span class='glyphicon glyphicon-alert' style='color: #f39c12; margin-right: 10px;'></span>" + lan.bt.install_ps + " <a href='javascript:jump()' style='color:#20a53a'>" + lan.bt.install_s + "</a> " + lan.bt.install_s1 + "</p></div><div class='rec-box'><h3>" + lan.bt.install_lnmp + "</h3><div class='rec-box-con'><ul class='rec-list'>" + c + "</ul><p class='fangshi'>" + lan.bt.install_type + ":<label data-title='" + lan.bt.install_rpm_title + "' style='margin-right:0'>" + lan.bt.install_rpm + "<input type='checkbox' checked></label><label data-title='" + lan.bt.install_src_title + "'>" + lan.bt.install_src + "<input type='checkbox'></label></p><div class='onekey'>" + lan.bt.install_key + "</div></div></div><div class='rec-box' style='margin-left:16px'><h3>LAMP</h3><div class='rec-box-con'><ul class='rec-list'>" + g + "</ul><p class='fangshi'>" + lan.bt.install_type + ":<label data-title='" + lan.bt.install_rpm_title + "' style='margin-right:0'>" + lan.bt.install_rpm + "<input type='checkbox' checked></label><label data-title='" + lan.bt.install_src_title + "'>" + lan.bt.install_src + "<input type='checkbox'></label></p><div class='onekey'>" + lan.public.onclick_install + "</div></div></div></div>" }); $(".fangshi input").click(function() { $(this).attr("checked", "checked").parent().siblings().find("input").removeAttr("checked") }); $(".sl-s-info").change(function() { var p = $(this).find("option:selected").text(); var n = $(this).attr("id"); p = p.toLowerCase(); $(this).parents("li").find("input").attr("data-info", p) }); $("#apache_select_PHP").change(function() { var n = $(this).val(); j(n, "apache_select_", "apache_") }); $("#select_PHP").change(function() { var n = $(this).val(); j(n, "select_", "data_") }); function j(p, r, q) { var n = "4.4"; switch (p) { case "5.2": n = "4.0"; break; case "5.3": n = "4.0"; break; case "5.4": n = "4.4"; break; case "5.5": n = "4.4"; break; default: n = "4.7" } $("#" + r + "phpMyAdmin option[value='" + n + "']").attr("selected", "selected").siblings().removeAttr("selected"); $("#" + r + "_phpMyAdmin").attr("data-info", "phpmyadmin " + n) } $("#select_MySQL,#apache_select_MySQL").change(function() { var n = $(this).val(); a(n) }); $("#apache_select_Apache").change(function() { var apacheVersion = $(this).val(); if (apacheVersion == '2.2') { layer.msg(lan.bt.install_apache22); } else { layer.msg(lan.bt.install_apache24); } }); $("#apache_select_PHP").change(function() { var apacheVersion = $("#apache_select_Apache").val(); var phpVersion = $(this).val(); if (apacheVersion == '2.2') { if (phpVersion != '5.2' && phpVersion != '5.3' && phpVersion != '5.4') { layer.msg(lan.bt.insatll_s22 + 'PHP-' + phpVersion, { icon: 5 }); $(this).val("5.4"); $("#apache_PHP").attr('data-info', 'php 5.4'); return false; } } else { if (phpVersion == '5.2') { layer.msg(lan.bt.insatll_s24 + 'PHP-' + phpVersion, { icon: 5 }); $(this).val("5.4"); $("#apache_PHP").attr('data-info', 'php 5.4'); return false; } } }); function a(n) { memSize = getCookie("memSize"); max = 64; msg = "64M"; switch (n) { case "5.1": max = 256; msg = "256M"; break; case "5.7": max = 1500; msg = "2GB"; break; case "5.6": max = 800; msg = "1GB"; break; case "AliSQL": max = 800; msg = "1GB"; break; case "mariadb_10.0": max = 800; msg = "1GB"; break; case "mariadb_10.1": max = 1500; msg = "2GB"; break } if (memSize < max) { layer.msg(lan.bt.insatll_mem.replace("{1}", msg).replace("{2}", n), { icon: 5 }) } } var de = null; $(".onekey").click(function() { if (de) return; var v = $(this).prev().find("input").eq(0).prop("checked") ? "1" : "0"; var r = $(this).parents(".rec-box-con").find(".rec-list li").length; var n = ""; var q = ""; var p = ""; var x = ""; var s = ""; de = true; for (var t = 0; t < r; t++) { var w = $(this).parents(".rec-box-con").find("ul li").eq(t); var u = w.find("input"); if (u.prop("checked")) { n += u.attr("data-info") + "," } } q = n.split(","); loadT = layer.msg(lan.bt.install_to, { icon: 16, time: 0, shade: [0.3, "#000"] }); for (var t = 0; t < q.length - 1; t++) { p = q[t].split(" ")[0].toLowerCase(); x = q[t].split(" ")[1]; s = "name=" + p + "&version=" + x + "&type=" + v + "&id=" + (t + 1); $.ajax({ url: "/files?action=InstallSoft", data: s, type: "POST", async: false, success: function(y) {} }); } layer.close(loadT); layer.close(k); setTimeout(function() { GetTaskCount() }, 2000); layer.msg(lan.bt.install_ok, { icon: 1 }); setTimeout(function() { task() }, 1000) }); InstallTips(); fly("onekey") }) } function jump() { layer.closeAll(); window.location.href = "/soft" } function InstallTips() { $(".fangshi label").mouseover(function() { var a = $(this).attr("data-title"); layer.tips(a, this, { tips: [1, "#787878"], time: 0 }) }).mouseout(function() { $(".layui-layer-tips").remove() }) } function fly(a) { var b = $("#task").offset(); $("." + a).click(function(d) { var e = $(this); var c = $('<span class="yuandian"></span>'); c.fly({ start: { left: d.pageX, top: d.pageY }, end: { left: b.left + 10, top: b.top + 10, width: 0, height: 0 }, onEnd: function() { layer.closeAll(); layer.msg(lan.bt.task_add, { icon: 1 }); GetTaskCount() } }); }); }; //检查选中项 function checkSelect() { setTimeout(function() { var checkList = $("input[name=id]"); var count = 0; for (var i = 0; i < checkList.length; i++) { if (checkList[i].checked) count++; } if (count > 0) { $("#allDelete,#allExecute,#allLog").show(); } else { $("#allDelete,#allExecute,#allLog").hide(); } }, 5); } //处理排序 function listOrder(skey, type, obj) { or = getCookie('order'); orderType = 'desc'; if (or) { if (or.split(' ')[1] == 'desc') { orderType = 'asc'; } } setCookie('order', skey + ' ' + orderType); switch (type) { case 'site': getWeb(1); break; case 'database': getData(1); break; case 'ftp': getFtp(1); break; } $(obj).find(".glyphicon-triangle-bottom").remove(); $(obj).find(".glyphicon-triangle-top").remove(); if (orderType == 'asc') { $(obj).append("<span class='glyphicon glyphicon-triangle-bottom' style='margin-left:5px;color:#bbb'></span>"); } else { $(obj).append("<span class='glyphicon glyphicon-triangle-top' style='margin-left:5px;color:#bbb'></span>"); } } //去关联列表 function GetBtpanelList() { var con = ''; $.post("/config?action=GetPanelList", function(rdata) { for (var i = 0; i < rdata.length; i++) { con += '<h3 class="mypcip mypcipnew" style="opacity:.6" data-url="' + rdata[i].url + '" data-user="' + rdata[i].username + '" data-pw="' + rdata[i].password + '"><span class="f14 cw">' + rdata[i].title + '</span><em class="btedit" onclick="bindBTPanel(0,\'c\',\'' + rdata[i].title + '\',\'' + rdata[i].id + '\',\'' + rdata[i].url + '\',\'' + rdata[i].username + '\',\'' + rdata[i].password + '\')"></em></h3>' } $("#newbtpc").html(con); $(".mypcipnew").hover(function() { $(this).css("opacity", "1"); }, function() { $(this).css("opacity", ".6"); }).click(function() { $("#btpanelform").remove(); var murl = $(this).attr("data-url"); var user = $(this).attr("data-user"); var pw = $(this).attr("data-pw"); layer.open({ type: 2, title: false, closeBtn: 0, //不显示关闭按钮 shade: [0], area: ['340px', '215px'], offset: 'rb', //右下角弹出 time: 5, //2秒后自动关闭 anim: 2, content: [murl + '/login', 'no'] }); var loginForm = '<div id="btpanelform" style="display:none"><form id="toBtpanel" action="' + murl + '/login" method="post" target="btpfrom">\ <input name="username" id="btp_username" value="' + user + '" type="text">\ <input name="password" id="btp_password" value="' + pw + '" type="password">\ <input name="code" id="bt_code" value="12345" type="text">\ </form><iframe name="btpfrom" src=""></iframe></div>'; $("body").append(loginForm); layer.msg(lan.bt.panel_open, { icon: 16, shade: [0.3, '#000'], time: 1000 }); setTimeout(function() { $("#toBtpanel").submit(); }, 500); setTimeout(function() { window.open(murl); }, 1000); }); $(".btedit").click(function(e) { e.stopPropagation(); }); }) } GetBtpanelList(); //添加面板快捷登录 function bindBTPanel(a, type, ip, btid, url, user, pw) { var titleName = lan.bt.panel_add; if (type == "b") { btn = "<button type='button' class='btn btn-success btn-sm' onclick=\"bindBTPanel(1,'b')\">" + lan.public.add + "</button>"; } else { titleName = lan.bt.panel_edit + ip; btn = "<button type='button' class='btn btn-default btn-sm' onclick=\"bindBTPaneldel('" + btid + "')\">" + lan.public.del + "</button><button type='button' class='btn btn-success btn-sm' onclick=\"bindBTPanel(1,'c','" + ip + "','" + btid + "')\" style='margin-left:7px'>" + lan.public.edit + "</button>"; } if (url == undefined) url = "http://"; if (user == undefined) user = ""; if (pw == undefined) pw = ""; if (ip == undefined) ip = ""; if (a == 1) { var gurl = "/config?action=AddPanelInfo"; var btaddress = $("#btaddress").val(); if (!btaddress.match(/^(http|https)+:\/\/([\w-]+\.)+[\w-]+:\d+/)) { layer.msg(lan.bt.panel_err_format + '<p>http://192.168.0.1:8888</p>', { icon: 5, time: 5000 }); return; } var btuser = encodeURIComponent($("#btuser").val()); var btpassword = encodeURIComponent($("#btpassword").val()); var bttitle = $("#bttitle").val(); var data = "title=" + bttitle + "&url=" + encodeURIComponent(btaddress) + "&username=" + btuser + "&password=" + btpassword; if (btaddress == "" || btuser == "" || btpassword == "" || bttitle == "") { layer.msg(lan.bt.panel_err_empty, { icon: 8 }); return; } if (type == "c") { gurl = "/config?action=SetPanelInfo"; data = data + "&id=" + btid; } $.post(gurl, data, function(b) { if (b.status) { layer.closeAll(); layer.msg(b.msg, { icon: 1 }); GetBtpanelList(); } else { layer.msg(b.msg, { icon: 2 }) } }); return } layer.open({ type: 1, area: "400px", title: titleName, closeBtn: 2, shift: 5, shadeClose: false, content: "<div class='bt-form pd20 pb70'>\ <div class='line'><span class='tname'>" + lan.bt.panel_address + "</span>\ <div class='info-r'><input class='bt-input-text' type='text' name='btaddress' id='btaddress' value='" + url + "' placeholder='" + lan.bt.panel_address + "' style='width:100%'/></div>\ </div>\ <div class='line'><span class='tname'>" + lan.bt.panel_user + "</span>\ <div class='info-r'><input class='bt-input-text' type='text' name='btuser' id='btuser' value='" + user + "' placeholder='" + lan.bt.panel_user + "' style='width:100%'/></div>\ </div>\ <div class='line'><span class='tname'>" + lan.bt.panel_pass + "</span>\ <div class='info-r'><input class='bt-input-text' type='password' name='btpassword' id='btpassword' value='" + pw + "' placeholder='" + lan.bt.panel_pass + "' style='width:100%'/></div>\ </div>\ <div class='line'><span class='tname'>" + lan.bt.panel_ps + "</span>\ <div class='info-r'><input class='bt-input-text' type='text' name='bttitle' id='bttitle' value='" + ip + "' placeholder='" + lan.bt.panel_ps + "' style='width:100%'/></div>\ </div>\ <div class='line'><ul class='help-info-text c7'><li>" + lan.bt.panel_ps_1 + "</li><li>" + lan.bt.panel_ps_2 + "</li><li>" + lan.bt.panel_ps_3 + "</li></ul></div>\ <div class='bt-form-submit-btn'><button type='button' class='btn btn-danger btn-sm' onclick=\"layer.closeAll()\">" + lan.public.close + "</button> " + btn + "</div></div>" }); $("#btaddress").on("input", function() { var str = $(this).val(); var isip = /([\w-]+\.){2,6}\w+/; var iptext = str.match(isip); if (iptext) $("#bttitle").val(iptext[0]); }).blur(function() { var str = $(this).val(); var isip = /([\w-]+\.){2,6}\w+/; var iptext = str.match(isip); if (iptext) $("#bttitle").val(iptext[0]); }); } //删除快捷登录 function bindBTPaneldel(id) { $.post("/config?action=DelPanelInfo", "id=" + id, function(rdata) { layer.closeAll(); layer.msg(rdata.msg, { icon: rdata.status ? 1 : 2 }); GetBtpanelList(); }) } function getSpeed(sele) { if (!$(sele)) return; $.get('/ajax?action=GetSpeed', function(speed) { if (speed.title === null) return; mspeed = ''; if (speed.speed > 0) { mspeed = '<span class="pull-right">' + ToSize(speed.speed) + '/s</span>'; } body = '<p>' + speed.title + ' <img src="/static/img/ing.gif"></p>\ <div class="bt-progress"><div class="bt-progress-bar" style="width:' + speed.progress + '%"><span class="bt-progress-text">' + speed.progress + '%</span></div></div>\ <p class="f12 c9"><span class="pull-left">' + speed.used + '/' + speed.total + '</span>' + mspeed + '</p>'; $(sele).prev().hide(); $(sele).css({ "margin-left": "-37px", "width": "380px" }); $(sele).parents(".layui-layer").css({ "margin-left": "-100px" }); $(sele).html(body); setTimeout(function() { getSpeed(sele); }, 1000); }); } //消息盒子 function messagebox() { layer.open({ type: 1, title: lan.bt.task_title, area: "750px", closeBtn: 2, shadeClose: false, content: '<div class="bt-form">\ <div class="bt-w-main">\ <div class="bt-w-menu">\ <p class="bgw" id="taskList" onclick="tasklist()">' + lan.bt.task_list + '(<span class="task_count">0</span>)</p>\ <p onclick="remind()">' + lan.bt.task_msg + '(<span class="msg_count">0</span>)</p>\ <p onclick="execLog()">' + lan.public.exec_log + '</p>\ </div>\ <div class="bt-w-con pd15">\ <div class="taskcon"></div>\ </div>\ </div>\ </div>' }); $(".bt-w-menu p").click(function() { $(this).addClass("bgw").siblings().removeClass("bgw"); }); tasklist(); } //取执行日志 function execLog() { $.post('/files?action=GetExecLog', {}, function(logs) { var lbody = '<textarea readonly="" style="margin: 0px;width: 551px;height: 520px;background-color: #333;color:#fff; padding:0 5px" id="exec_log">' + logs + '</textarea>'; $(".taskcon").html(lbody); var ob = document.getElementById('exec_log'); ob.scrollTop = ob.scrollHeight; }); } function get_msg_data(a, fun) { a = a == undefined ? 1 : a; $.post("/data?action=getData", "tojs=remind&table=tasks&result=2,4,6,8&limit=10&search=1&p=" + a, function(g) { fun(g) }) } function remind(a) { get_msg_data(a, function(g) { var e = ""; var f = false; var task_count = 0; for (var d = 0; d < g.data.length; d++) { if (g.data[d].status != '1') { task_count++; continue; } e += '<tr><td><input type="checkbox"></td><td><div class="titlename c3" title="' + g.data[d].name + g.data[d].addtime + lan.bt.task_ok + lan.bt.time + (g.data[d].end - g.data[d].start) + lan.bt.s +'">' + g.data[d].name + g.data[d].addtime +'</span><span class="rs-status">【' + lan.bt.task_ok + '】<span><span class="rs-time">' + lan.bt.time + (g.data[d].end - g.data[d].start) + lan.bt.s + '</span></div></td><td class="text-right c3">' + g.data[d].addtime + '</td></tr>' } var con = '<div class="divtable"><table class="table table-hover">\ <thead><tr><th width="20"><input id="Rs-checkAll" type="checkbox" onclick="RscheckSelect()"></th><th>' + lan.bt.task_name + '</th><th class="text-right">' + lan.bt.task_time + '</th></tr></thead>\ <tbody id="remind">' + e + '</tbody>\ </table></div>\ <div class="mtb15" style="height:32px">\ <div class="pull-left buttongroup" style="display:none;"><button class="btn btn-default btn-sm mr5 rs-del" disabled="disabled">' + lan.public.del + '</button><button class="btn btn-default btn-sm mr5 rs-read" disabled="disabled">' + lan.bt.task_tip_read + '</button><button class="btn btn-default btn-sm">' + lan.bt.task_tip_all + '</button></div>\ <div id="taskPage" class="page"></div>\ </div>'; var msg_count = g.page.match(/\'Pcount\'>.+<\/span>/)[0].replace(/[^0-9]/ig, ""); $(".msg_count").text(parseInt(msg_count) - task_count); $(".taskcon").html(con); $("#taskPage").html(g.page); $("#Rs-checkAll").click(function() { if ($(this).prop("checked")) { $("#remind").find("input").prop("checked", true) } else { $("#remind").find("input").prop("checked", false) } }); }) } function GetReloads() { var a = 0; var mm = $("#taskList").html() if (mm == undefined || mm.indexOf(lan.bt.task_list) == -1) { clearInterval(speed); a = 0; speed = null; return } if (speed) return; speed = setInterval(function() { var mm = $("#taskList").html() if (mm == undefined || mm.indexOf(lan.bt.task_list) == -1) { clearInterval(speed); speed = null; a = 0; return } a++; $.post("/files?action=GetTaskSpeed", "", function(h) { if (h.task == undefined) { $(".cmdlist").html(lan.bt.task_not_list); return } if (h.status === false) { clearInterval(speed); speed = null; a = 0; return } var b = ""; var d = ""; $("#task").text(h.task.length); $(".task_count").text(h.task.length); for (var g = 0; g < h.task.length; g++) { if (h.task[g].status == "-1") { if (h.task[g].type != "download") { var c = ""; var f = h.msg.split("\n"); for (var e = 0; e < f.length; e++) { c += f[e] + "<br>" } if (h.task[g].name.indexOf(lan.public.scan) != -1) { b = "<li><span class='titlename'>" + h.task[g].name + "</span><span class='state'>" + lan.bt.task_scan + " <img src='/static/img/ing.gif'> | <a href=\"javascript:RemoveTask(" + h.task[g].id + ")\">" + lan.public.close + "</a></span><span class='opencmd'></span><div class='cmd'>" + c + "</div></li>" } else { b = "<li><span class='titlename'>" + h.task[g].name + "</span><span class='state'>" + lan.bt.task_install + " <img src='/static/img/ing.gif'> | <a href=\"javascript:RemoveTask(" + h.task[g].id + ")\">" + lan.public.close + "</a></span><div class='cmd'>" + c + "</div></li>" } } else { b = "<li><div class='line-progress' style='width:" + h.msg.pre + "%'></div><span class='titlename'>" + h.task[g].name + "<a style='margin-left:130px;'>" + (ToSize(h.msg.used) + "/" + ToSize(h.msg.total)) + "</a></span><span class='com-progress'>" + h.msg.pre + "%</span><span class='state'>" + lan.bt.task_downloading + " <img src='/static/img/ing.gif'> | <a href=\"javascript:RemoveTask(" + h.task[g].id + ")\">" + lan.public.close + "</a></span></li>" } } else { d += "<li><span class='titlename'>" + h.task[g].name + "</span><span class='state'>" + lan.bt.task_sleep + " | <a style='color:green' href=\"javascript:RemoveTask(" + h.task[g].id + ')">' + lan.public.del + '</a></span></li>' } } $(".cmdlist").html(b + d); $(".cmd").html(c); try { if ($(".cmd")[0].scrollHeight) $(".cmd").scrollTop($(".cmd")[0].scrollHeight); } catch (e) { return; } }).error(function() {}); }, 1000); } //检查选中项 function RscheckSelect() { setTimeout(function() { var checkList = $("#remind").find("input"); var count = 0; for (var i = 0; i < checkList.length; i++) { if (checkList[i].checked) count++; } if (count > 0) { $(".buttongroup .btn").removeAttr("disabled"); } else { $(".rs-del,.rs-read").attr("disabled", "disabled"); } }, 5); } function tasklist(a) { var con = '<ul class="cmdlist"></ul><span style="position: fixed;bottom: 13px;">' + lan.public.task_long_time_not_exec + '</span>'; $(".taskcon").html(con); a = a == undefined ? 1 : a; $.post("/data?action=getData", "tojs=GetTaskList&table=tasks&limit=10&p=" + a, function(g) { var e = ""; var b = ""; var c = ""; var f = false; var task_count = 0; for (var d = 0; d < g.data.length; d++) { switch (g.data[d].status) { case "-1": f = true; if (g.data[d].type != "download") { b = "<li><span class='titlename'>" + g.data[d].name + "</span><span class='state pull-right c6'>" + lan.bt.task_install + " <img src='/static/img/ing.gif'> | <a class='btlink' href=\"javascript:RemoveTask(" + g.data[d].id + ")\">" + lan.public.close + "</a></span><span class='opencmd'></span><pre class='cmd'></pre></li>" } else { b = "<li><div class='line-progress' style='width:0%'></div><span class='titlename'>" + g.data[d].name + "<a id='speed' style='margin-left:130px;'>0.0M/12.5M</a></span><span class='com-progress'>0%</span><span class='state'>" + lan.bt.task_downloading + " <img src='/static/img/ing.gif'> | <a href=\"javascript:RemoveTask(" + g.data[d].id + ")\">" + lan.public.close + "</a></span></li>" } task_count++; break; case "0": c += "<li><span class='titlename'>" + g.data[d].name + "</span><span class='state pull-right c6'>" + lan.bt.task_sleep + "</span> | <a href=\"javascript:RemoveTask(" + g.data[d].id + ")\" class='btlink'>" + lan.public.del + "</a></li>"; task_count++; break; } } $(".task_count").text(task_count); get_msg_data(1, function(d) { var msg_count = d.page.match(/\'Pcount\'>.+<\/span>/)[0].replace(/[^0-9]/ig, ""); $(".msg_count").text(parseInt(msg_count)); }) $(".cmdlist").html(b + c); GetReloads(); return f }) } //检查登陆状态 function check_login() { $.post('/ajax?action=CheckLogin', {}, function(rdata) { if (rdata === true) return; }); } //登陆跳转 function to_login() { layer.confirm(lan.public.login_expire, { title: lan.public.session_expire, icon: 2, closeBtn: 1, shift: 5 }, function() { location.reload(); }); } //表格头固定 function table_fixed(name) { var tableName = document.querySelector('#' + name); tableName.addEventListener('scroll', scroll_handle); } function scroll_handle(e) { var scrollTop = this.scrollTop; $(this).find("thead").css({ "transform": "translateY(" + scrollTop + "px)", "position": "relative", "z-index": "1" }); } var clipboard, interval, socket, term, ssh_login, term_box; var pdata_socket = { x_http_token: document.getElementById("request_token_head").getAttribute('token') } var Term = { bws: null, //websocket对象 route: '/webssh', //被访问的方法 term: null, term_box: null, ssh_info: {}, last_body:false, last_cd:null, config:{ cols:0, rows:0, fontSize:12 }, // 缩放尺寸 detectZoom:(function(){ var ratio = 0, screen = window.screen, ua = navigator.userAgent.toLowerCase(); if (window.devicePixelRatio !== undefined) { ratio = window.devicePixelRatio; } else if (~ua.indexOf('msie')) { if (screen.deviceXDPI && screen.logicalXDPI) { ratio = screen.deviceXDPI / screen.logicalXDPI; } } else if (window.outerWidth !== undefined && window.innerWidth !== undefined) { ratio = window.outerWidth / window.innerWidth; } if (ratio){ ratio = Math.round(ratio * 100); } return ratio; })(), //连接websocket connect: function() { if (!Term.bws || Term.bws.readyState == 3 || Term.bws.readyState == 2) { //连接 ws_url = (window.location.protocol === 'http:' ? 'ws://' : 'wss://') + window.location.host + Term.route; Term.bws = new WebSocket(ws_url); //绑定事件 Term.bws.addEventListener('message', Term.on_message); Term.bws.addEventListener('close', Term.on_close); Term.bws.addEventListener('error', Term.on_error); Term.bws.addEventListener('open',Term.on_open); //if (Term.ssh_info) Term.send(JSON.stringify(Term.ssh_info)) } }, //连接服务器成功 on_open:function(ws_event){ Term.send(JSON.stringify(Term.ssh_info || {})) // Term.term.FitAddon.fit(); // Term.resize(); // var f_path = $("#fileInputPath").val(); var f_path = $("#fileInputPath").attr('data-path'); if(f_path){ Term.last_cd = "cd " + f_path; Term.send(Term.last_cd + "\n"); } }, //服务器消息事件 // on_message: function(ws_event) { // result = ws_event.data; // if (result === "\r'Server connection failed'!\r" || result === "\rWrong user name or password!\r") { // show_ssh_login(result); // Term.close(); // return; // } // Term.term.write(result); // if (result == '\r\n登出\r\n' || result == '登出\r\n' || result == '\r\nlogout\r\n' || result == 'logout\r\n') { // setTimeout(function() { // layer.close(Term.term_box); // }, 500); // Term.close(); // Term.bws = null; // } // }, on_message: function (ws_event) { result = ws_event.data; if ((result.indexOf("@127.0.0.1:") != -1 || result.indexOf("@localhost:") != -1) && result.indexOf('Authentication failed') != -1) { Term.term.write(result); Term.localhost_login_form(result); Term.close(); return; } if(Term.last_cd){ if(result.indexOf(Term.last_cd) != -1 && result.length - Term.last_cd.length < 3) { Term.last_cd = null; return; } } if (result === "\rServer connection failed!\r" || result == "\rWrong user name or password!\r") { Term.close(); return; } if(result.length > 1 && Term.last_body === false){ Term.last_body = true; } Term.term.write(result); if (result == '\r\n登出\r\n' || result == '\r\n注销\r\n' || result == '注销\r\n' || result == '登出\r\n' || result == '\r\nlogout\r\n' || result == 'logout\r\n') { setTimeout(function () { layer.close(Term.term_box); Term.term.dispose(); }, 500); Term.close(); Term.bws = null; } }, //websocket关闭事件 on_close: function(ws_event) { Term.bws = null; }, //websocket错误事件 // on_error: function(ws_event) { // if(ws_event.target.readyState === 3){ // var msg = 'Error: unable to create websocket connection, please close 【Developer mode】 on the settings page'; // layer.msg(msg,{time:5000}) // if(Term.state === 3) return // Term.term.write(msg) // Term.state = 3; // }else{ // console.log(ws_event) // } // }, on_error: function (ws_event) { if(ws_event.target.readyState === 3){ if(Term.state === 3) return Term.term.write(msg) Term.state = 3; }else{ console.log(ws_event) } }, //关闭连接 close: function () { if(Term.bws){ Term.bws.close(); } }, resize: function () { setTimeout(function(){ $("#term").height($(".term_box_all .layui-layer-content").height()-18) Term.term.FitAddon.fit() Term.send(JSON.stringify({resize:1,rows:Term.term.rows,cols:Term.term.cols})); Term.term.focus(); },100) }, // resize: function() { // var m_width = 100; // var m_height = 34; // Term.term.resize(m_width, m_height); // Term.term.scrollToBottom(); // Term.term.focus(); // Term.send('new_terminal'); // }, //发送数据 //@param event 唯一事件名称 //@param data 发送的数据 //@param collback 服务器返回结果时回调的函数,运行完后将被回收 send: function(data, num) { //如果没有连接,则尝试连接服务器 if (!Term.bws || Term.bws.readyState == 3 || Term.bws.readyState == 2) { Term.connect(); } //判断当前连接状态,如果!=1,则100ms后尝试重新发送 if (Term.bws.readyState === 1) { Term.bws.send(data); } else { if(Term.state === 3) return; if (!num) num = 0; if (num < 5) { num++; setTimeout(function() { Term.send(data, num++); }, 100) } } }, // run: function (ssh_info) { // var termCols = 100; // var termRows = 34; // var loadT = layer.msg('It is loading the files required by the terminal. Please wait...', { icon: 16, time: 0, shade: 0.3 }); // loadScript([ // "/static/build/xterm.min.js", // "/static/build/addons/attach/attach.min.js", // "/static/build/addons/fit/fit.min.js", // "/static/build/addons/fullscreen/fullscreen.min.js", // "/static/build/addons/search/search.min.js", // "/static/build/addons/winptyCompat/winptyCompat.js" // ], function () { // layer.close(loadT); // Term.term = new Terminal({ cols: termCols, rows: termRows, screenKeys: true, useStyle: true }); // Term.term.setOption('cursorBlink', true); // Term.term_box = layer.open({ // type: 1, // title: lan.public.terminal, // area: ['920px', '630px'], // closeBtn: 2, // shadeClose: false, // content: '<link rel="stylesheet" href="/static/build/xterm.min.css" />\ // <link rel="stylesheet" href="/static/build/addons/fullscreen/fullscreen.min.css" />\ // <a class="btlink" onclick="show_ssh_login(1)" style="position: fixed;margin-left: 83px;margin-top: -30px;">[' + lan.public.set + ']</a>\ // <div class="term-box" style="background-color:#000"><div id="term"></div></div>', // cancel: function () { // Term.term.destroy(); // }, // success: function () { // Term.term.open(document.getElementById('term')); // Term.resize(); // } // }); // Term.term.on('data', function (data) { // try { // Term.bws.send(data) // } catch (e) { // Term.term.write('\r\nThe connection is lost and you are trying to reconnect!\r\n') // Term.connect() // } // }); // if (ssh_info) Term.ssh_info = ssh_info // Term.connect(); // }) // }, run: function (ssh_info) { if($("#panel_debug").attr("data") == 'True') { layer.msg('Error: unable to create websocket connection, please close 【Developer mode】 on the settings page!',{icon:2,time:5000}); return; } var loadT = layer.msg('It is loading the files required by the terminal. Please wait...', { icon: 16, time: 0, shade: 0.3 }); loadScript([ "/static/js/xterm.js" ],function(){ layer.close(loadT); Term.term = new Terminal({ rendererType: "canvas", cols: 100, rows: 31, fontSize:15, screenKeys: true, useStyle: true , }); Term.term.setOption('cursorBlink', true); Term.last_body = false; Term.term_box = layer.open({ type: 1, title: lan.public.terminal, area: ['925px', '630px'], closeBtn: 2, shadeClose: false, skin:'term_box_all', content: '<link rel="stylesheet" href="/static/css/xterm.css" />\ <div class="term-box" style="background-color:#000;padding-top: 7px;" id="term"></div>', cancel: function (index,lay) { bt.confirm({msg:'<div style="word-break: break-word;">Closing the SSH session, the command in progress in the current command line session may be aborted. Continute?</div>',title: "Cofirm to close the SSH session?"},function(ix){ Term.term.dispose(); layer.close(index); layer.close(ix); Term.close(); }); return false; }, success: function () { $('.term_box_all').css('background-color','#000'); Term.term.open(document.getElementById('term')); Term.term.FitAddon = new FitAddon.FitAddon(); Term.term.loadAddon(Term.term.FitAddon); Term.term.WebLinksAddon = new WebLinksAddon.WebLinksAddon() Term.term.loadAddon(Term.term.WebLinksAddon) Term.term.focus(); } }); Term.term.onData(function (data) { try { Term.bws.send(data) } catch (e) { Term.term.write('\r\nThe connection is lost and you are trying to reconnect!\r\n') Term.connect() } }); if (ssh_info) Term.ssh_info = ssh_info Term.connect(); }); }, reset_login: function() { var ssh_info = { data: JSON.stringify({ host: $("input[name='host']").val(), port: $("input[name='port']").val(), username: $("input[name='username']").val(), password: $("input[name='password']").val() }) } $.post('/term_open', ssh_info, function(rdata) { if (rdata.status === false) { layer.msg(rdata.msg); return; } layer.closeAll(); Term.connect(); Term.term.scrollToBottom(); Term.term.focus(); }); }, localhost_login_form:function(result){ var template = '<div class="localhost-form-shade"><div class="localhost-form-view bt-form-2x"><div class="localhost-form-title"><i class="localhost-form_tip"></i><span style="vertical-align: middle;">Login failed, please fill the local server information!</span></div>\ <div class="line input_group">\ <span class="tname">Server IP</span>\ <div class="info-r">\ <input type="text" name="host" class="bt-input-text mr5" style="width:240px" placeholder="Server IP" value="127.0.0.1" autocomplete="off" />\ <input type="text" name="port" class="bt-input-text mr5" style="width:60px" placeholder="Port" value="22" autocomplete="off"/>\ </div>\ </div>\ <div class="line">\ <span class="tname">SSH account</span>\ <div class="info-r">\ <input type="text" name="username" class="bt-input-text mr5" style="width:305px" placeholder="SSH account" value="root" autocomplete="off"/>\ </div>\ </div>\ <div class="line">\ <span class="tname">Verification</span>\ <div class="info-r ">\ <div class="btn-group">\ <button type="button" tabindex="-1" class="btn btn-sm auth_type_checkbox btn-success" data-ctype="0">Password</button>\ <button type="button" tabindex="-1" class="btn btn-sm auth_type_checkbox btn-default data-ctype="1">Server key</button>\ </div>\ </div>\ </div>\ <div class="line c_password_view show">\ <span class="tname">Password</span>\ <div class="info-r">\ <input type="text" name="password" class="bt-input-text mr5" placeholder="SSH Password" style="width:305px;" value="" autocomplete="off"/>\ </div>\ </div>\ <div class="line c_pkey_view hidden">\ <span class="tname">Private key</span>\ <div class="info-r">\ <textarea rows="4" name="pkey" class="bt-input-text mr5" placeholder="SSH server key" style="width:305px;height: 80px;line-height: 18px;padding-top:10px;"></textarea>\ </div>\ </div><button type="submit" class="btn btn-sm btn-success">Login</button></div></div>'; $('.term-box').after(template); $('.auth_type_checkbox').click(function(){ var index = $(this).index(); $(this).addClass('btn-success').removeClass('btn-default').siblings().removeClass('btn-success').addClass('btn-default') switch(index){ case 0: $('.c_password_view').addClass('show').removeClass('hidden'); $('.c_pkey_view').addClass('hidden').removeClass('show').find('input').val(''); break; case 1: $('.c_password_view').addClass('hidden').removeClass('show').find('input').val(''); $('.c_pkey_view').addClass('show').removeClass('hidden'); break; } }); $('.localhost-form-view > button').click(function(){ var form = {}; $('.localhost-form-view input,.localhost-form-view textarea').each(function(index,el){ var name = $(this).attr('name'),value = $(this).val(); form[name] = value; switch(name){ case 'port': if(!bt.check_port(value)){ bt.msg({status:false,msg:'Server port format error!'}); return false; } break; case 'username': if(value == ''){ bt.msg({status:false,msg:'Server user name cannot be empty!'}); return false; } break; case 'password': if(value == '' && $('.c_password_view').hasClass('show')){ bt.msg({status:false,msg:'Server password cannot be empty!'}); return false; } break; case 'pkey': if(value == '' && $('.c_pkey_view').hasClass('show')){ bt.msg({status:false,msg:'The server key cannot be empty!'}); return false; } break; } }); form.ps = 'Local server'; if(result){ if(result.indexOf('@127.0.0.1') != -1){ var user = result.split('@')[0].split(',')[1]; var port = result.split('1:')[1] $("input[name='username']").val(user); $("input[name='port']").val(port); } } var loadT = bt.load('Adding server information, please wait...'); bt.send('create_host','xterm/create_host',form,function(res){ loadT.close(); bt.msg(res); if(res.status){ bt.msg({status:true,msg:'Login successful!'}); $('.layui-layer-shade').remove(); $('.term_box_all').remove(); Term.term.dispose(); Term.close(); web_shell(); } }); }); $('.localhost-form-view [name="password"]').keyup(function(e){ if(e.keyCode == 13){ $('.localhost-form-view > button').click(); } }).focus() } } function web_shell() { Term.run(); } socket = { emit: function(data, data2) { if (data === 'webssh') { data = data2 } if (typeof(data) === 'object') { return; } Term.send(data); } } function show_ssh_login(is_config) { if ($("input[name='ssh_user']").attr('autocomplete')) return; var s_body = '<div class="bt-form bt-form pd20 pb70">\ <style>.ssh_check_s1{ display: inline-block;\ height: 38px;\ background-color: #fff;\ color: #050505;\ white-space: nowrap;\ text-align: center;\ cursor: pointer;\ border-radius: 0;\ margin-left: 0px !important;\ position: relative;\ top: 2px;\ line-height: 34px;\ font-size: 13px;\ border-color: #e6e6e6;\ padding: 0 14px;\ border: 1px solid #e0dfdf;}\ .ssh_check_s2{margin-left: 0 !important;\ position: relative;\ top: 2px;\ border-color: #e6e6e6;\ display: inline - block;\ height: 38px;\ line-height: 38px;\ padding: 0 18px;\ background-color: #20a53a;\ color: #fff;\ white-space: nowrap;\ text-align: center;\ font-size: 14px;\ border: none;\ border-radius: 2px;\ cursor: pointer;} </style >\ <div class="line " style="margin-left: -40px;"><span class="tname">IP</span><div class="info-r "><input name="ssh_host" class="bt-input-text mr5" type="text" style="width:330px" value="127.0.0.1" autocomplete="off"></div></div>\ <div class="line " style="margin-left: -40px;"><span class="tname">Port</span><div class="info-r "><input name="ssh_port" class="bt-input-text mr5" type="text" style="width:330px" value="22" autocomplete="off"></div></div>\ <div class="line " style="margin-left: -40px;"><span class="tname">Username</span><div class="info-r "><input name="ssh_user" class="bt-input-text mr5" type="text" style="width:330px" value="root" readonly="readonly" autocomplete="off"></div></div>\ <div class="line " style="margin-left: -40px;"><span class="tname">Method</span><div class="info-r "><button class="ssh_check_s2" id="pass_check" onclick="pass_check()">Password</button><button id="rsa_check" class="ssh_check_s1" onclick="rsa_check()">Key</button></div></div>\ <div class="line ssh_passwd" style="margin-left: -40px;"><span class="tname">Password</span><div class="info-r "><input name="ssh_passwd" readonly="readonly" class="bt-input-text mr5" type="password" style="width:330px" value="" autocomplete="off"></div></div>\ <div class="line ssh_pkey" style="display:none;margin-left: -40px;"><span class="tname">Key</span><div class="info-r "><textarea name="ssh_pkey" class="bt-input-text mr5" style="width:330px;height:80px;" ></textarea></div></div>\ <div class="line " style="margin-left: -40px;"><span class="tname"></span><div class="info-r "><input style="margin-top: 1px;width: 16px;" name="ssh_is_save" id="ssh_is_save" class="bt-input-text mr5" type="checkbox" ><label style="position: absolute;margin-left: 5px;" for="ssh_is_save">Remember password, the next time you use the aaPanel terminal will automatically log in</label></div></div>\ <p style="color: red;margin-top: 10px;text-align: center;margin-left: -62px;">Only support login to this server</p>\ <div class="bt-form-submit-btn"><button type="button" class="btn btn-sm btn-danger" onclick="' + (is_config ? 'layer.close(ssh_login)' : 'layer.closeAll()') + '">Close</button><button type="button" class="btn btn-sm btn-success ssh-login" onclick="send_ssh_info()">' + (is_config ? 'Confirm' : 'Login SSH') + '</button></div></div>'; ssh_login = layer.open({ type: 1, title: is_config ? 'Please fill in the SSH connection configuration' : 'Please enter the SSH login account and password', area: "500px", closeBtn: 0, shadeClose: false, content: s_body }); setTimeout(function removeReadonly() { $("input[name='ssh_user']").removeAttr('readonly'); $("input[name='ssh_passwd']").removeAttr('readonly'); $("input[name='ssh_passwd']").focus(); $("input[name='ssh_passwd']").keydown(function(e) { if (e.keyCode == 13) { $('.ssh-login').click(); } }); }, 500); } function pass_check() { $("#pass_check").attr("class", "ssh_check_s2"); $("#rsa_check").attr("class", "ssh_check_s1"); $(".ssh_pkey").hide(); $(".ssh_passwd").show(); } function rsa_check() { $("#pass_check").attr("class", "ssh_check_s1"); $("#rsa_check").attr("class", "ssh_check_s2"); $(".ssh_pkey").show(); $(".ssh_passwd").hide(); } function send_ssh_info() { pdata = { host: $("input[name='ssh_host']").val(), port: Number($("input[name='ssh_port']").val()), password: $("input[name='ssh_passwd']").val(), username: $("input[name='ssh_user']").val(), pkey: $("textarea[name='ssh_pkey']").val() } if (pdata['host'] !== '127.0.0.1' && pdata['host'] !== 'localhost') { layer.msg("Connection address can only be [ 127.0.0.1 or localhost ]"); $("input[name='ssh_host']").focus(); return; } if (pdata['port'] < 1 || pdata['port'] > 65535) { layer.msg("Port range is incorrect [1-65535]"); $("input[name='ssh_port']").focus(); return; } if (!pdata['username']) { layer.msg("Username can not be empty!"); $("input[name='ssh_user']").focus(); return; } if ($("#rsa_check").attr("class") === "ssh_check_s2") { pdata['c_type'] = 'True' if (!pdata['pkey']) { layer.msg("Private key cannot be empty!"); $("input[name='ssh_pkey']").focus(); return; } } else { if (!pdata['password']) { layer.msg("Password can not be blank!"); $("input[name='ssh_passwd']").focus(); return; } } if ($("#ssh_is_save").prop("checked")) { pdata['is_save'] = '1'; } var loadT = layer.msg('Trying to log in to SSH...', { icon: 16, time: 0, shade: 0.3 }); $.post("/term_open", { data: JSON.stringify(pdata) }, function() { layer.close(loadT) Term.send('reset_connect'); layer.close(ssh_login) Term.term.focus(); }) } acme = { speed_msg: "<pre style='margin-bottom: 0px;height:250px;text-align: left;background-color: #000;color: #fff;white-space: pre-wrap;' id='create_lst'>[MSG]</pre>", loadT: null, //获取订单列表 get_orders: function(callback) { acme.request('get_orders', {}, function(rdata) { callback(rdata) }, 'Getting order list...'); }, //取指定订单 get_find: function(index, callback) { acme.request('get_order_find', { index: index }, function(rdata) { callback(rdata) }, 'Getting order information...') }, //下载指定证书包 download_cert: function(index, callback) { acme.request('update_zip', { index: index }, function(rdata) { if (!rdata.status) { bt.msg(rdata); return; } if (callback) { callback(rdata) } else { window.location.href = '/download?filename=' + rdata.msg } }, 'Preparing to download..'); }, //删除订单 remove: function(index, callback) { acme.request('remove_order', { index: index }, function(rdata) { bt.msg(rdata); if (callback) callback(rdata) }); }, //吊销证书 revoke: function(index, callback) { acme.request('revoke_order', { index: index }, function(rdata) { bt.msg(rdata); if (callback) callback(rdata) }, 'Revoking certificate...'); }, //验证域名(手动DNS申请) auth_domain: function(index, callback) { acme.show_speed_window('Verifying DNS...', function() { acme.request('apply_dns_auth', { index: index }, function(rdata) { callback(rdata) }, false); }); }, //取证书基本信息 get_cert_init: function(pem_file, siteName, callback) { acme.request('get_cert_init_api', { pem_file: pem_file, siteName: siteName }, function(cert_init) { callback(cert_init); }, 'Getting certificate information...'); }, //显示进度 show_speed: function() { bt.send('get_lines', 'ajax/get_lines', { num: 10, filename: "/www/server/panel/logs/letsencrypt.log" }, function(rdata) { if ($("#create_lst").text() === "") return; if (rdata.status === true) { $("#create_lst").text(rdata.msg); $("#create_lst").scrollTop($("#create_lst")[0].scrollHeight); } setTimeout(function() { acme.show_speed(); }, 1000); }); }, //显示进度窗口 show_speed_window: function(msg, callback) { acme.loadT = layer.open({ title: false, type: 1, closeBtn: 0, shade: 0.3, area: "500px", offset: "30%", content: acme.speed_msg.replace('[MSG]', msg), success: function(layers, index) { setTimeout(function() { acme.show_speed(); }, 1000); if (callback) callback(); } }); }, //一键申请 //domain 域名列表 [] //auth_type 验证类型 dns/http //auth_to 验证路径 网站根目录或dnsapi //auto_wildcard 是否自动组合通配符 1.是 0.否 默认0 apply_cert: function(domains, auth_type, auth_to, auto_wildcard, callback) { acme.show_speed_window('Applying for a certificate...', function() { if (auto_wildcard === undefined) auto_wildcard = '0' pdata = { domains: JSON.stringify(domains), auth_type: auth_type, auth_to: auth_to, auto_wildcard: auto_wildcard } if (acme.id) pdata['id'] = acme.id; if (acme.siteName) pdata['siteName'] = acme.siteName; acme.request('apply_cert_api', pdata, function(rdata) { callback(rdata); }, false); }); }, //续签证书 renew: function(index, callback) { acme.show_speed_window('Renewing certificate...', function() { acme.request('renew_cert', { index: index }, function(rdata) { callback(rdata) }, false); }); }, //获取用户信息 get_account_info: function(callback) { acme.request('get_account_info', {}, function(rdata) { callback(rdata) }); }, //设置用户信息 set_account_info: function(account, callback) { acme.request('set_account_info', account, function(rdata) { bt.msg(rdata) if (callback) callback(rdata) }); }, //发送到请求 request: function(action, pdata, callback, msg) { if (msg == undefined) msg = 'Processing, please wait...'; if (msg) { var loadT = layer.msg(msg, { icon: 16, time: 0, shade: 0.3 }); } $.post("/acme?action=" + action, pdata, function(res) { if (msg) layer.close(loadT) if (callback) callback(res) }); } }
違いを見つける