mirror of
https://github.com/aaPanel/aaPanel.git
synced 2026-08-17 21:25:47 +02:00
4106 lines
175 KiB
JavaScript
4106 lines
175 KiB
JavaScript
$(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() {
|
||
var _id = $('.ace_conter_menu .active').attr('data-id');
|
||
if (_id != undefined) {
|
||
aceEditor.editor['ace_editor_' + _id].ace.resize();
|
||
//_this.setEditorView()
|
||
}
|
||
});
|
||
$('.ace_editor_main').on('click',function(){
|
||
$('.ace_toolbar_menu').hide();
|
||
});
|
||
$(document).click(function(e) {
|
||
$('.ace_toolbar_menu').hide();
|
||
$('.ace_toolbar_menu .menu-tabs,.ace_toolbar_menu .menu-encoding,.ace_toolbar_menu .menu-files').hide();
|
||
})
|
||
// 显示工具条
|
||
$('.ace_header .pull-down').click(function() {
|
||
if ($(this).find('i').hasClass('glyphicon-menu-down')) {
|
||
$('.ace_header').css({ 'marginTop': '-35px', 'height': '0' });
|
||
$(this).css({ 'top': '35px', 'height': '40px', 'line-height': '40px' });
|
||
$(this).find('i').addClass('glyphicon-menu-up').removeClass('glyphicon-menu-down');
|
||
} else {
|
||
$('.ace_header').removeAttr('style');
|
||
$(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().attr('title');
|
||
var _id = $(this).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;
|
||
}
|
||
e.stopPropagation();
|
||
});
|
||
// 新建编辑器视图
|
||
$('.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();
|
||
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');
|
||
_item.softTabs = _val == 'nbsp';
|
||
} else {
|
||
_item.ace.getSession().setTabSize(_val);
|
||
_item.tabSize = _val;
|
||
}
|
||
$(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.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('目录:'+ _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;
|
||
}
|
||
console.log(_type)
|
||
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();
|
||
},
|
||
// 新建文件类型
|
||
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();
|
||
},
|
||
// 清除状态栏
|
||
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.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;
|
||
},
|
||
// 删除编辑器视图-方法
|
||
removeEditor: function(id) {
|
||
if ($('.item_tab_' + id).next('.item').length == 0) {
|
||
$('.item_tab_' + id).prev('.item').addClass('active');
|
||
$('#ace_editor_' + id).prev('.ace_editor').addClass('active');
|
||
this.ace_active = $('.item_tab_' + id).prev('.item').attr('data-id');
|
||
} else {
|
||
$('.item_tab_' + id).next('.item').addClass('active');
|
||
$('#ace_editor_' + id).next('.ace_editor').addClass('active');
|
||
this.ace_active = $('.item_tab_' + id).next('.item').attr('data-id');
|
||
}
|
||
$('.item_tab_' + id).remove();
|
||
$('#ace_editor_' + id).remove();
|
||
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 (!aceEditor.editor['ace_editor_' + id].historys_file) $('[data-menu-path="' + (aceEditor.editor['ace_editor_' + id].path) + '"]').find('.file_fold').removeClass('active bg');
|
||
delete this.editor['ace_editor_' + id];
|
||
this.editorLength--;
|
||
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();
|
||
},
|
||
// 获取收藏夹列表-方法
|
||
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)
|
||
});
|
||
},
|
||
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);
|
||
setCookie('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);
|
||
setCookie('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);
|
||
setCookie('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 = getCookie('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;
|
||
}
|
||
}
|
||
aceEditor.editor = null;
|
||
aceEditor.pathAarry = [];
|
||
aceEditor.editorLength = 0;
|
||
}
|
||
});
|
||
}
|
||
|
||
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 });
|
||
}
|
||
}
|
||
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.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.index.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() {
|
||
$.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: null,
|
||
|
||
//连接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);
|
||
|
||
if (Term.ssh_info) Term.send(JSON.stringify(Term.ssh_info))
|
||
}
|
||
},
|
||
|
||
//服务器消息事件
|
||
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;
|
||
}
|
||
},
|
||
//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)
|
||
}
|
||
},
|
||
|
||
//关闭连接
|
||
close: function() {
|
||
Term.bws.close();
|
||
},
|
||
|
||
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) {
|
||
// var termCols = 100;
|
||
// var termRows = 34;
|
||
// 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: '<a class="btlink" onclick="show_ssh_login(1)" style="position: fixed;margin-left: 140px;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();
|
||
// },
|
||
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();
|
||
});
|
||
}
|
||
}
|
||
|
||
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)
|
||
});
|
||
}
|
||
} |