pull/109/head
midoks 6 years ago
parent 909e7497da
commit d478a697d2
  1. 2
      plugins/webssh/index.html
  2. 198
      route/static/app/public.js
  3. 3
      route/static/js/socket.io.min.js
  4. 1
      route/templates/default/layout.html

@ -2,7 +2,7 @@
$.getScript( "/plugins/file?name=webssh&f=js/webssh.js", function() {
if ($(".term-box #term").text() != 'W') {
layer.closeAll();
web_shell();
webShell();
}
});
</script>

@ -1201,6 +1201,204 @@ function loadImage(){
});
}
function webShell() {
var termCols = 100;
var termRows = 29;
var sendTotal = 0;
if(!socket)socket = io.connect();
var term = new Terminal({ cols: termCols, rows: termRows, screenKeys: true, useStyle: true});
term.open();
gterm = term
term.setOption('cursorBlink', true);
socket.on('server_response', function (data) {
term.write(data.data);
if (data.data == '\r\n登出\r\n' || data.data == '登出\r\n' || data.data == '\r\nlogout\r\n' || data.data == 'logout\r\n') {
setTimeout(function () {
layer.closeAll();
}, 500);
}
});
if (socket) {
socket.emit('connect_event', '');
interval = setInterval(function () {
socket.emit('connect_event', '');
}, 1000);
}
term.on('data', function (data) {
socket.emit('webssh', data);
});
var term_box = layer.open({
type: 1,
title: "宝塔终端",
area: ['920px','640px'],
closeBtn: 2,
shadeClose: false,
content: '<div class="term-box"><div id="term"></div></div>\
<div class="shell-text-input">\
<textarea type="text" class="bt-input-text-shell" placeholder="请将命令粘贴到此处.." value="" name="ssh_copy" />\
<div class="shell-btn-group">\
<button class="shellbutton btn btn-success btn-sm pull-right shell_btn_1">发送(Ctrl+Enter)</button>\
<button class="shellbutton btn btn-default btn-sm pull-right shell_btn_close">关闭</button>\
</div>\
</div>',
cancel: function () {
term.destroy();
clearInterval(interval)
}
});
$(".shell_btn_close").click(function(){
layer.close(term_box);
term.destroy();
clearInterval(interval)
})
setTimeout(function () {
$('.terminal').detach().appendTo('#term');
$("#term").show();
socket.emit('webssh', "\n");
term.focus();
// 鼠标右键事件
var can = $("#term");
can.contextmenu(function (e) {
var winWidth = can.width();
var winHeight = can.height();
var mouseX = e.pageX;
var mouseY = e.pageY;
var menuWidth = $(".contextmenu").width();
var menuHeight = $(".contextmenu").height();
var minEdgeMargin = 10;
if (mouseX + menuWidth + minEdgeMargin >= winWidth &&
mouseY + menuHeight + minEdgeMargin >= winHeight) {
menuLeft = mouseX - menuWidth - minEdgeMargin + "px";
menuTop = mouseY - menuHeight - minEdgeMargin + "px";
}
else if (mouseX + menuWidth + minEdgeMargin >= winWidth) {
menuLeft = mouseX - menuWidth - minEdgeMargin + "px";
menuTop = mouseY + minEdgeMargin + "px";
}
else if (mouseY + menuHeight + minEdgeMargin >= winHeight) {
menuLeft = mouseX + minEdgeMargin + "px";
menuTop = mouseY - menuHeight - minEdgeMargin + "px";
}
else {
menuLeft = mouseX + minEdgeMargin + "px";
menuTop = mouseY + minEdgeMargin + "px";
};
var selectText = term.getSelection()
var style_str = '';
var paste_str = '';
if (!selectText) {
if (!getCookie('shell_copy_body')) {
paste_str = 'style="color: #bbb;" disable';
}
style_str = 'style="color: #bbb;" disable';
} else {
setCookie('ssh_selection', selectText);
}
var menudiv = '<ul class="contextmenu">\
<li>\
<a class="shell_copy_btn menu_ssh" data-clipboard-text="'+ selectText + '" ' + style_str + '>复制到剪切板</a>\
</li>\
<li>\
<a onclick="shell_paste_text()" '+ paste_str+'>粘贴选中项</a>\
</li>\
<li>\
<a onclick="shell_translate_text()" ' + style_str + '>翻译</a>\
</li>\
<li>\
<a onclick="shell_to_baidu()" ' + style_str + '>百度搜索</a>\
</li>\
</ul>';
$("body").append(menudiv);
$(".contextmenu").css({
"left": menuLeft,
"top": menuTop
});
return false;
});
can.click(function () {
remove_ssh_menu();
});
clipboard = new ClipboardJS('.shell_copy_btn');
clipboard.on('success', function (e) {
layer.msg('复制成功!');
setCookie('shell_copy_body', e.text)
remove_ssh_menu();
term.focus();
});
clipboard.on('error', function (e) {
layer.msg('复制失败,浏览器不兼容!');
setCookie('shell_copy_body', e.text)
remove_ssh_menu();
term.focus();
});
$(".shellbutton").click(function () {
var tobj = $("textarea[name='ssh_copy']");
var ptext = tobj.val();
tobj.val('');
if ($(this).text().indexOf('Alt') != -1) {
ptext +="\n";
}
socket.emit('webssh', ptext);
term.focus();
})
$("textarea[name='ssh_copy']").keydown(function (e) {
if (e.ctrlKey && e.keyCode == 13) {
$(".shell_btn_1").click();
} else if (e.altKey && e.keyCode == 13) {
$(".shell_btn_1").click();
}
});
}, 100)
}
function shell_translate_text() {
remove_ssh_menu();
var selectText = getCookie('ssh_selection');
var loadT = layer.msg('正在翻译...', { icon: 16, time: 1000 * 60, });
$.get('https://www.bt.cn/api/index/fanyi', { query: selectText }, function (rdata) {
layer.close(loadT);
layer.msg("原文: " + rdata.src + '<br>译文: ' + rdata.dst, { time: 1000 * 10, shadeClose: true, shade: 0.01 });
}, 'JSONP');
gterm.focus();
}
function shell_to_baidu() {
var selectText = getCookie('ssh_selection');
remove_ssh_menu();
window.open('https://www.baidu.com/s?wd=' + selectText)
gterm.focus();
}
function shell_paste_text(){
socket.emit('webssh', getCookie('ssh_selection'));
remove_ssh_menu();
gterm.focus();
}
function remove_ssh_menu() {
$(".contextmenu").remove();
}
/*** 其中功能,针对插件通过库使用 start ***/
function pluginService(_name, version){
var data = {name:_name, func:'status'}

File diff suppressed because one or more lines are too long

@ -47,6 +47,7 @@
<script src="/static/app/public.js?v={{config.version}}"></script>
<script src="/static/js/echarts.min.js?v={{config.version}}"></script>
<script type="text/javascript" src="/static/js/jquery.dragsort-0.5.2.min.js?v={{config.version}}"></script>
<script src="/static/js/socket.io.min.js?v={{config.version}}"></script>
{% block content %}{% endblock %}
<div class="footer bgw">mdserver-web &copy;2018-∞ 面板 (<a style="color:#20a53a;" target="_blank" href="//github.com/midoks/mdserver-web">源码</a>)<a style="margin-left:20px;color:#20a53a;" href="//github.com/midoks/mdserver-web/wiki/mdserver-web" target="_blank">wiki</a>
</div>

Loading…
Cancel
Save