文档章节

基于HTML5的云虚拟主机配置界面

nosand
 nosand
发布于 2014/06/19 21:26
字数 1051
阅读 5183
收藏 104
点赞 6
评论 5

云计算大行其道,上期开源中国的原创会就有好几位云计算专家演讲,从底层的虚拟化技术,到上层的云存储和应用API,耳濡目染,也受益匪浅,算是大势所趋,回头看看Qunee组件,借这个趋势,可以在云计算可视化上发挥作用,最近就有客户用Qunee实现VPC配置图,并对交互做了定制,细节不便多说,本文主要介绍Qunee交互扩展方面的思路

VPC配置图

参考示例 - visualops

云平台可视化这块儿国外做的不错,有不少开放的示例可以学习和参考,客户看中了这家云管理系统http://www.visualops.io/ ,这个系统使用的是SVG技术,体验了一下,效果不错,参照着实现

从界面上看,一个云节点上有多个子网,每个子网内有多台虚拟主机,然后每个云节点有统一的路由Router管理(或者网关Gateway)

visualops

界面呈现

参照原型实现,使用Q.Path描出子网和云节点范围,虚拟机则用普通节点,连线使用正交连线类型,此外还有些外观配置,比如虚线,背景颜色,网格等,设置style或者css即可

创建矩形元素(子网、云节点)

function createRect(name, left, top, width, height, fillColor) {
    var rect = graph.createNode(name, left, top);
    rect.type = "rectGroup";
    rect.anchorPosition = Q.Position.LEFT_TOP;
    rect.image = Q.Shapes.getRect(0, 0, 100, 100);
    rect.size = {width: width, height: height};
    rect.setStyle(Q.Styles.IMAGE_BACKGROUND_COLOR, fillColor || Q.toColor(0x88FFFFFF));
    rect.setStyle(Q.Styles.SHAPE_STROKE, 0);
    rect.setStyle(Q.Styles.BORDER, 1);
    rect.setStyle(Q.Styles.BORDER_COLOR, "#32c02f");
    rect.setStyle(Q.Styles.BORDER_LINE_DASH, [5, 6]);
    rect.setStyle(Q.Styles.LABEL_PADDING, 5);
    rect.setStyle(Q.Styles.LABEL_ANCHOR_POSITION, Q.Position.LEFT_TOP);
    rect.setStyle(Q.Styles.LABEL_POSITION, Q.Position.LEFT_TOP);
    rect.setBounds = function (bounds) {
        this.x = bounds.x;
        this.y = bounds.y;
        this.size = new Q.Size(bounds.width, bounds.height);
    }
    rect.getBounds = function () {
        return new Q.Rect(this.x, this.y, this.size.width, this.size.height);
    }
    rect.inBounds = function (x, y) {
        return this.getBounds().contains(x, y);
    }
    rect.intersectsRect = function (rect) {
        return rect.intersectsRect(this.x, this.y, this.size.width, this.size.height);
    }
    rect.containsRect = function (rect) {
        return Q.containsRect(this.x, this.y, this.size.width, this.size.height, rect.x, rect.y, rect.width, rect.height);
    }
    rect.updateBoundsByChildren = function () {
        var bounds = new Q.Rect();
        Q.forEachChild(this, function (child) {
            bounds.add(graph.getUIBounds(child));
        });
        this.location = new Q.Point(bounds.x, bounds.y - 15);
        this.size = new Q.Size(Math.max(200, bounds.width), Math.max(70, bounds.height + 15));
    }
    return rect;
}

注意到对Rect增加了一些标定节点范围、计算自身大小的方法,后面交互时会用到

创建虚拟主机

function createPC(name, x, y, parent) {
    var node = graph.createNode(name, x, y);
    node.image = Q.Graphs.server;
    node.parent = node.host = parent;
    node.zIndex = 10;
    return node;
}

创建连接关系

function createEdge(from, to) {
    var name = from.name + "->" + to.name;
    var edge = graph.createEdge(name, from, to);
    edge.edgeType = Q.Consts.EDGE_TYPE_VERTICAL_HORIZONTAL;
    edge.setStyle(Q.Styles.EDGE_FROM_OFFSET, {x: 20});
    edge.setStyle(Q.Styles.EDGE_CORNER_RADIUS, 0);
    return edge;
}

定制交互

呈现出来不难,业务的体现在于交互,客户需求要求虚拟主机不得超出云节点范围,超出时需要回撤操作,此外可以将一台虚拟机从一个子网移到另一个子网,另外还要控制路由的移动范围,限定在云节点的左边框上......

实现思路是通过交互监听,分别对移动(ELEMENT_MOVING),调整大小(RESIZING)等情况做处理,Qunee交互事件通常有三个状态:开始、进行时、结束,比如移动交互的三个过程:开始移动(ELEMENT_MOVE_START),移动中(ELEMENT_MOVING),完成移动(ELEMENT_MOVE_END),我们可以在开始时记录节点原始位置,结束时判断节点位置是否允许,如果不允许则作调整

var oldLocation = {};
graph.interactionDispatcher.addListener(function (evt) {
    var data = evt.data;
    if (evt.kind == Q.InteractionEvent.RESIZE_START) {
        oldLocation[data.id] = {x: data.x, y: data.y, width: data.size.width, height: data.size.height};
    }
    if (evt.kind == Q.InteractionEvent.RESIZING) {
        if (data == mainNode) {
            label.updateLocation();
        }
        return;
    }
    if (evt.kind == Q.InteractionEvent.RESIZE_END) {
        var oldBounds = oldLocation[data.id];
        oldLocation = {};
        if ((data != mainNode && isGroup(data) && groupIntersected(data)) || childrenOutParent(data)) {
            data.setBounds(oldBounds);
        }
        if (data == mainNode) {
            label.updateLocation();
        }
        return;
    }
    if (data.atLeft) {
        if (evt.kind == Q.InteractionEvent.ELEMENT_MOVING) {
            data.updateLocation();
        }
        return;
    }

    if (evt.kind == Q.InteractionEvent.ELEMENT_MOVE_START) {
        oldLocation[data.id] = {x: data.x, y: data.y};
        return;
    }
    if (evt.kind == Q.InteractionEvent.ELEMENT_MOVING) {
        if (!isGroup(data)) {
            var g = findGroup(evt.event);
            highlight(g);
        }
        return;
    }
    if (evt.kind == Q.InteractionEvent.ELEMENT_MOVE_END) {
        highlight();
        if (isGroup(data)) {
            if (groupIntersected(data)) {
                var old = oldLocation[data.id];
                graph.moveElements([data], old.x - data.x, old.y - data.y);
            }
            return;
        }
        var g = findGroup(evt.event);
        if (g) {
            data.parent = data.host = g;
            fixNode(data);
        } else {
            data.location = oldLocation[data.id];
        }
        oldLocation = {};
    }
})

最终效果

VPC配置图

在线演示

http://demo.qunee.com/#VPC Manager Demo

© 著作权归作者所有

共有 人打赏支持
nosand
粉丝 78
博文 40
码字总数 33601
作品 0
徐汇
加载中

评论(5)

nosand
nosand

引用来自“滔哥”的评论

http://jiagouyun.com/
kineticjs做的,不错
诸葛非卿
诸葛非卿
www.jncao.com
滔哥
滔哥
http://jiagouyun.com/
晒太阳的小猪
晒太阳的小猪
现在网站内容下载收藏好像不行呢
hentai
hentai
超级绚丽,20款前端动画特效,轰炸你的眼睛

前言 HTML5一个相当出色的web技术,它不仅可以让你更加方便地操纵页面元素,而且可以通过canvas实现更多的动画特效,引进HTML5标准后,CSS3也就可以发挥更大的作用。本文主要介绍了一些基于H...

浪漫程序员 ⋅ 04/25 ⋅ 0

扣丁学堂HTML5培训课程怎么样

  在如今,随着移动互联网技术的发展和进步,比如HTML5在移动互联端的应用,让更多人了解到它的丰富性趣味性便利性,但HTML5就包括这些么?扣丁学堂HTML5培训课程怎么样?零基础能学会么?...

扣丁学堂 ⋅ 06/01 ⋅ 0

HTML5学习之Web Storage基础知识

HTML5 Web 存储 在HTML5 Web Storage还没出来之前,本地存储使用的是 cookie. 但是Web 存储需要更加的安全与快速,这些数据不会被保存在服务器上,但是这些数据只用于用户请求网站数据上.它也可...

CHIEMINCHAN ⋅ 05/11 ⋅ 0

html5-web本地存储

在html5中为我们提供了一种本地缓存机制,它将取代我们的cookie,并且它是不会随浏览器发会我们的服务器端的。我们可以采用js在客户端自由的操作本地缓存。html5中缓存主要有localStorage,和...

zting科技 ⋅ 2017/01/10 ⋅ 0

WEB前端开发学习HTML5到底有多厉害?

Web前端开发工程师是一个很新的职业,是从事Web前端开发工作的工程师。主要进行网站开发,优化,完善的工作。网页制作是Web 1.0时代的产物,那时网站的主要内容都是静态的,用户使用网站的行...

web前端小辰 ⋅ 05/23 ⋅ 0

实现多个标签页之间通信的几种方法(sharedworker)

示例地址 prologue 之前在网上看到一个面试题:如何实现浏览器中多个标签页之间的通信。我目前想到的方法有三种:使用websocket协议、通过localstorage、以及使用html5浏览器的新特性SharedW...

ITgecko ⋅ 04/11 ⋅ 0

Chrome将在年底前彻底屏蔽Adobe Flash

各家软件厂商对于Adobe Flash的态度越来越强硬,包括谷歌在内。现在谷歌拿出了目前最强硬的手段来遏制Adobe Flash的继续推行,那就是屏蔽Adobe Flash内容。 谷歌日前计划在今年年底之前将HTM...

玄学酱 ⋅ 05/18 ⋅ 0

php canvas 前端JS压缩,获取图片二进制流数据并上传

效果图(canvas压缩图片会失真): 参考: php canvas 前端JS压缩,获取图片二进制流数据并上传 https://www.cnblogs.com/-mrl/p/8708114.html js+php如何实现上传图片 https://www.jianshu....

豆花饭烧土豆 ⋅ 05/30 ⋅ 0

Safari无痕模式下,storage被禁用问题

前言 Safari开启无痕模式后,localStorage和sessionStorage为空,对其进行set操作也会报错,也就是说这种情况下,storage是被禁止使用了。接下来说一下解决方法。 解决方案 我们项目框架上的...

ITgecko ⋅ 05/02 ⋅ 0

Express + JWT用户认证最轻实践

最近给自己列了一个list,Ummm...列来列去大概是下面这个样子: React SSR服务端渲染 jwt用户认证 Vue全家桶 微信小程序开发 ... 等等 好吧,谁让自己菜呢,没什么好抱怨的,一个一个来吧。正...

luffyZhou ⋅ 05/28 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Redis 单线程 为何却需要事务处理并发问题

Redis是单线程处理,也就是命令会顺序执行。那么为什么会存在并发问题呢? 个人理解是,虽然redis是单线程,但是可以同时有多个客户端访问,每个客户端会有 一个线程。客户端访问之间存在竞争...

码代码的小司机 ⋅ 41分钟前 ⋅ 0

到底会改名吗?微软GVFS 改名之争

微软去年透露了 Git Virtual File System(GVFS)项目,GVFS 是 Git 版本控制系统的一个开源插件,允许 Git 处理 TB 规模的代码库,比如 270 GB 的 Windows 代码库。该项目公布之初就引发了争...

linux-tao ⋅ 51分钟前 ⋅ 0

笔试题之Java基础部分【简】【二】

1.静态变量和实例变量的区别 在语法定义上的区别:静态变量前要加static关键字,而实例变量前则不加。在程序运行时的区别:实例变量属于某个对象的属性,必须创建了实例对象,其中的实例变...

anlve ⋅ 今天 ⋅ 0

Lombok简单介绍及使用

官网 通过简单注解来精简代码达到消除冗长代码的目的 优点 提高编程效率 使代码更简洁 消除冗长代码 避免修改字段名字时忘记修改方法名 4.idea中安装lombnok pom.xml引入 <dependency> <grou...

to_ln ⋅ 今天 ⋅ 0

【转】JS浮点数运算Bug的解决办法

37.5*5.5=206.08 (JS算出来是这样的一个结果,我四舍五入取两位小数) 我先怀疑是四舍五入的问题,就直接用JS算了一个结果为:206.08499999999998 怎么会这样,两个只有一位小数的数字相乘,怎...

NickSoki ⋅ 今天 ⋅ 0

table eg

user_id user_name full_name 1 zhangsan 张三 2 lisi 李四 `` ™ [========] 2018-06-18 09:42:06 星期一½ gdsgagagagdsgasgagadsgdasgagsa...

qwfys ⋅ 今天 ⋅ 0

一个有趣的Java问题

先来看看源码: public class TestDemo { public static void main(String[] args) { Integer a = 10; Integer b = 20; swap(a, b); System.out......

linxyz ⋅ 今天 ⋅ 0

十五周二次课

十五周二次课 17.1mysql主从介绍 17.2准备工作 17.3配置主 17.4配置从 17.5测试主从同步 17.1mysql主从介绍 MySQL主从介绍 MySQL主从又叫做Replication、AB复制。简单讲就是A和B两台机器做主...

河图再现 ⋅ 今天 ⋅ 0

docker安装snmp rrdtool环境

以Ubuntu16:04作为基础版本 docker pull ubuntu:16.04 启动一个容器 docker run -d -i -t --name flow_mete ubuntu:16.04 bash 进入容器 docker exec -it flow_mete bash cd ~ 安装基本软件 ......

messud4312 ⋅ 今天 ⋅ 0

OSChina 周一乱弹 —— 快别开心了,你还没有女友呢。

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @莱布妮子 :分享吴彤的单曲《好春光》 《好春光》- 吴彤 手机党少年们想听歌,请使劲儿戳(这里) @clouddyy :小萝莉街上乱跑,误把我认错成...

小小编辑 ⋅ 今天 ⋅ 9

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部