【CSDN开源夏令营】 基于Web的SSH客户端,实现跨平台的云服务管理(四)文件树功能的实现
来源:互联网 发布:淘宝网店数据分析 编辑:程序博客网 时间:2024/05/01 07:17
【CSDN开源夏令营】 基于Web的SSH客户端,实现跨平台的云服务管理(四)文件树功能的实现
一.实现思路
二.开发前所需的知识储备(思路中所有篮框为所需知识储备)
如果想完成该功能的实现需要下列知识储备:
1.了解ssh客户端功能
2.了解bootstrap,jquery,熟悉tty.js的交互流程,理解我博客第三章登录功能实现的方法
3.熟悉linux命令
4.熟悉html属性
5.熟悉websocket,nodejs特性,jqueryAPI。
文件树功能前后台交互流程:
只增加远程登陆功能后交互流程:
增加了远程登陆和文件树功能后交互流程:
流程介绍:
为文件树单开一个ssh模拟器,先执行博客所说的登陆功能,登录到用户远程主机后执行下面流程:
步骤1+2与3:前台通过socket.io.js向term.js发送ls -F 路径 | grep /$\r(得到路径下所有文件夹)使用setTimeout()函数50毫秒后在发送ls -F 路径 | grep -v /$\r命令(得到路径下所有文件)
步骤4,5,6,7:term将命令发送给跳板机,由于跳板机已经登录用户远程主机,跳板机将要执行的命令发送给用户远程主机,用户远程主机收到命令执行后将结果发送给跳板机,跳板机接收到的命令又被term.js监听到。
步骤8,9+10:term.js将结果通过socket.io.js跳过term.js直接发送给前台。
核心代码如下:
1+2箭头左边发送代码(登陆用户远程主机后)
<span style="font-size:14px;">tty.socket.emit('login', gid, "ls -F "+ obj.getAttribute('title') +" | grep /$\r");setTimeout(function(){tty.socket.emit('login', gid, "ls -F "+obj.getAttribute('title')+" | grep -v /$\r");},500);</span>
9+10箭头左边接受判断代码
tty.socket.on('data', function(id, data) { ///////////////后台返回信息,可以在这里做write判断。 if (!tty.terms[id]) return; tty.terms[id].write(data); if(data.indexOf("Last login")>=0){output=true;} if(output){ var flag = data.split('\r\n')[0]; if(flag.indexOf("ls -F")>=0||flag.indexOf("~]#")>=0||flag.indexOf("Last login")>=0){} else{if(folders==''&&data.indexOf('/\r\n')){folders = data;}else{files = data; } } } });
前台文件树核心代码如下
html
<span style="font-size:14px;"><div class="tree well"> <ul> <li class="parent_li"> <span title="/" onclick="spanClick(this);" ><i class="icon-folder-close"></i> <%=user%>@<%=ip%>(我的主机)</span> <ul></ul> </li> </ul> </div></span>css
<span style="font-size:12px;">.tree { min-height:20px; padding:19px; margin-bottom:20px; background-color:#fbfbfb; border:1px solid #999; -webkit-border-radius:4px; -moz-border-radius:4px; border-radius:4px; -webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.05); -moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.05); box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.05)}.tree li { list-style-type:none; margin:0; padding:10px 5px 0 5px; position:relative}.tree li::before, .tree li::after { content:''; left:-20px; position:absolute; right:auto}.tree li::before { border-left:1px solid #999; bottom:50px; height:100%; top:0; width:1px}.tree li::after { border-top:1px solid #999; height:20px; top:25px; width:25px}.tree li span { -moz-border-radius:5px; -webkit-border-radius:5px; border:1px solid #999; border-radius:5px; display:inline-block; padding:3px 8px; text-decoration:none}.tree li.parent_li>span { cursor:pointer}.tree>ul>li::before, .tree>ul>li::after { border:0}.tree li:last-child::before { height:30px}.tree li.parent_li>span:hover, .tree li.parent_li>span:hover+ul li span { background:#eee; border:1px solid #94a0b4; color:#000}</span>js代码(由于js文件过于庞大只展示html中onclick方法的实现代码)
<span style="font-size:12px;">function spanClick(obj) { var children = $(obj).parent('li.parent_li').find(' > ul > li'); if (children.is(":visible")) { children.hide('fast'); setTimeout(function(){children.remove();},1000); //为了使jquery的折叠效果更佳顺滑,所以需要等待1秒后,让jquery完成折叠特效后再删除他的所有子类。使下次展开的时候能从新去远程主机来去文件结构,保证信息的实时性。 $(obj).find(' > i').addClass('icon-folder-close').removeClass('icon-folder-open'); } else { //写一个函数拿到该文件下文件来添加child tty.socket.emit('login', gid, "ls -F "+ obj.getAttribute('title') +" | grep /$\r"); setTimeout(function(){tty.socket.emit('login', gid, "ls -F "+obj.getAttribute('title')+" | grep -v /$\r");},500); setTimeout(function(){ if(folders!='') { var folderArray = folders.split("\r\n"); for(var i=0;i<folderArray.length-1;i++) { $(obj).next().append('<li class="parent_li"><span title="'+obj.getAttribute('title') + folderArray[i]+'"onclick="spanClick(this)"><i class="icon-folder-close"></i>'+folderArray[i]+'</span><ul></ul></li>'); //添加一个文件夹,并给他赋予onclick方法。title属性 } } if(files!='') { var fileArray = files.split("\r\n"); for(var i=0;i<fileArray.length-1;i++) { $(obj).next().append('<li><span><i class="icon-leaf"></i>'+ fileArray[i]+'</span></li>'); //添加一个文件 } } folders = ''; files = ''; children.show('fast'); $(obj).find(' > i').addClass('icon-folder-open').removeClass('icon-folder-close'); },3000); //等待3s后执行该函数,也可以新建一个线程监听信息是否来临。 }</span>
到此文件树就实现了
0 0
- 【CSDN开源夏令营】 基于Web的SSH客户端,实现跨平台的云服务管理(四)文件树功能的实现
- 【CSDN开源夏令营】 基于Web的SSH客户端,实现跨平台的云服务管理(三)远程登录功能的实现
- 【CSDN开源夏令营】 基于Web的SSH客户端,实现跨平台的云服务管理(五)模拟复制粘贴功能的实现
- 【CSDN开源夏令营】 基于Web的SSH客户端,实现跨平台的云服务管理(一)前言
- 【CSDN开源夏令营】 基于Web的SSH客户端,实现跨平台的云服务管理(二)环境搭配
- 【CSDN开源夏令营】 基于Web的SSH客户端,实现跨平台的云服务管理(六)前台美化
- 【CSDN开源夏令营】 基于Web的SSH客户端,实现跨平台的云服务管理(七)关于文件上传下载实现的设想
- 【CSDN开源夏令营】 基于Web的SSH客户端,实现跨平台的云服务管理(八)结题总结
- CSDN开源夏令营 基于Compiz的switcher插件设计与实现之熟悉switcher的功能(ccsm)
- CSDN开源夏令营 基于Compiz的switcher插件设计与实现之前言
- CSDN开源夏令营 基于Compiz的switcher插件设计与实现之编译compiz源码
- CSDN开源夏令营 基于Compiz的switcher插件设计与实现之compiz特效插件介绍及特效实现
- CSDN开源夏令营 基于Compiz的switcher插件设计与实现之前期准备 ubuntu环境的搭建
- CSDN开源夏令营 基于Compiz的switcher插件设计与实现之前期准备 git的简单使用
- 使用Exchange服务实现跨平台(PC+Web + 移动端)日历的日程管理
- 基于SAAJ的Web服务----(四)使用原始的XML源和DOM创建web服务客户端
- 基于.NET平台的Windows编程实战(五)—— 问卷管理功能的实现
- 基于.NET平台的Windows编程实战(六)—— 题目管理功能的实现
- 凯美瑞保养准备 1
- iOS 面试题(九)
- 黑马程序员_Java基础——IO框架(下)(第6篇)
- json_encode与json_decode使用细节
- mongo db backup 2
- 【CSDN开源夏令营】 基于Web的SSH客户端,实现跨平台的云服务管理(四)文件树功能的实现
- 顺序容器和关联容器
- js动态给下拉列表赋值
- 你的户外广告有创意么?
- Firefox方式时浏览器会提示“此地址访问受限
- 查询时按回车界面变空白-一个缺陷引起的思考
- 华为机试题:洞穴逃生
- POJ 3071
- 拼音翻译为阿拉伯数字