TWaver HTML5 + Node.js + express + socket.io + redis(三)

2024-04-28 14:38

本文主要是介绍TWaver HTML5 + Node.js + express + socket.io + redis(三),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

原文出处:http://twaver.servasoft.com/?p=3617

在上一篇TWaver HTML5 + Node.js + express + socket.io + redis(二)中,您应该对Node.js的web框架express、实时通讯框架Socket.IO、redis客户端:redis有所了解了。这一篇将介绍TWaver HTML5的拓扑和通用组件功能,您将了解到:

1. 拓扑组件:twaver.network.Network
2. 树组件: twaver.controls.Tree
3. 属性页: twaver.controls.PropertySheet
4. 表格组件:twaver.controls.Table
5. 布局组件:twaver.controls.SplitPane、BorderPane等

一. 实现经典的左树右图效果
首先构造网元容器, 树和拓扑组件

//构造网元容器
var box = new twaver.ElementBox();
//构造拓扑
var network = new twaver.network.Network(box);
//构造树
var tree = new twaver.controls.Tree(box);


再构造SplitPane, 添加树和拓扑组件

function init() {
//构造左右分割面板, 左边为树, 右边为拓扑, 树占30%宽度
var split = new twaver.controls.SplitPane(tree, network, 'horizontal', 0.3);
var view = split.getView();
//设置分割面板占满屏幕
view.style.position = 'absolute';
view.style.left = '0px';
view.style.right = '0px';
view.style.top = '0px';
view.style.bottom = '0px';
//添加分割面板
document.body.appendChild(view);
//窗口变化后, 重画分割面板
window.onresize = function () {
split.invalidate();
}
}


二. 填充数据
TWaver HTML5和TWaver其他分支一样, 所有组件都体现了MVC思想. 用户使用时, 只需要将业务数据和TWaver的数据模型绑定, 既可以显示数据.
twaver.Data是所有数据模型的基类, 此类的构造函数支持Object类型的参数, Object对象里的属性和twaver.Data的属性一一对应. 所以, 拿到上一篇后台的数据后,

var data = {
id: 'from',
name: 'From',
location: { x: 100, y: 100 }
}


可以直接这样构造节点对象:

var node = new twaver.Node(data);


修改上一篇的onGetData方法, 构造节点和连线

//getData消息处理方法
function onGetData(datas) {
var i, n, nodes, links, node, link, data, from, to;
//添加节点
for(i=0, nodes=datas.nodes, n=nodes.length; i<n; i++) {
data = nodes[i];
//构造节点
node = new twaver.Node(data);
//添加节点
box.add(node);
}
//添加连线
for(i=0, links=datas.links, n=links.length; i<n; i++) {
data = links[i];
//查找from节点
from = box.getDataById(data.from);
//查找to节点
to = box.getDataById(data.to);
//构造连线
link = new twaver.Link(data.id, from, to);
//添加连线
box.add(link);
}
}

运行效果如下:


三. 添加工具条: 缩放拓扑, 添加节点和连线
首先创建工具条:

//创建工具条
function createToolbar () {
var toolbar = document.createElement('div');
//默认交互模式
addButton(toolbar, 'Default Interaction', 'images/select.png', function () {
network.setDefaultInteractions();
});
//放大
addButton(toolbar, 'Zoom In', 'images/zoomIn.png', function () {
network.zoomIn();
});
//缩小
addButton(toolbar, 'Zoom Out', 'images/zoomOut.png', function () {
network.zoomOut();
});
//缩放到全图
addButton(toolbar, 'Zoom Overview', 'images/zoomOverview.png', function () {
network.zoomOverview();
});
//还原缩放
addButton(toolbar, 'Zoom Reset', 'images/zoomReset.png', function () {
network.zoomReset();
});
//创建节点
addButton(toolbar, 'Create Node', 'images/node_icon.png', function () {
network.setCreateElementInteractions();
});
//创建连线
addButton(toolbar, 'Create Link', 'images/link_icon.png', function () {
network.setCreateLinkInteractions();
});
return toolbar;
}


然后将工具条和拓扑放入BorderPane

//创建工具条
var toolbar = createToolbar();
//创建拓扑面板
var networkPane = new twaver.controls.BorderPane(network, toolbar);
//设置拓扑面板上方组件高度为20
networkPane.setTopHeight(20);
//构造左右分割面板, 左边为树, 右边为拓扑, 树占30%宽度
var split = new twaver.controls.SplitPane(tree, networkPane, 'horizontal', 0.3);


添加按钮代码如下:

//添加按钮
function addButton (div, name, src, callback) {
var button = document.createElement('input');
button.setAttribute('type', src ? 'image' : 'button');
button.setAttribute('title', name);
if (src) {
button.style.padding = '4px 4px 4px 4px';
button.setAttribute('src', src);
} else {
button.value = name;
}
button.onclick = callback;
div.appendChild(button);
return button;
}


效果如下:


四. 添加表格
首先创建表格

//构造表格
var table = new twaver.controls.Table(box);


然后初始化表格的列

//初始化表格列
function initTable () {
table.setEditable(true);
//网元名称
createColumn(table, 'Name', 'name', 'accessor', 'string', true);
//网元位置
var column = createColumn(table, 'Location', 'location', 'accessor', 'string', false);
column.getValue = function (data) {
if (data.getLocation) {
var location = data.getLocation();
return 'X:' + Math.round(location.x) + ', Y:' + Math.round(location.y);
}
return '';
};
//网元宽度
column = createColumn(table, 'Width', 'width', 'accessor', 'number', true);
column.getValue = function (data) {
if (data.getWidth) {
return Math.round(data.getWidth());
}
return '';
};
column.setWidth(50);
//网元高度
column = createColumn(table, 'Height', 'height', 'accessor', 'number', true);
column.getValue = function (data) {
if (data.getHeight) {
return Math.round(data.getHeight());
}
return '';
};
column.setWidth(50);
//连线起始节点
column = createColumn(table, 'From', 'from', 'accessor', 'string', false);
column.getValue = function (data) {
if (data.getFromNode) {
return data.getFromNode().getName();
}
return '';
};
//连线结束节点
column = createColumn(table, 'To', 'to', 'accessor', 'string', false);
column.getValue = function (data) {
if (data.getToNode) {
return data.getToNode().getName();
}
return '';
};
}


添加表格:

//初始化表格列
initTable();
//构造表格面板
var tablePane = new twaver.controls.TablePane(table);
//中间分割面板, 包含拓扑面板和表格面板
var centerSplite = new twaver.controls.SplitPane(networkPane, tablePane, 'vertical', 0.7);
//构造左右分割面板, 左边为树, 右边为拓扑, 树占30%宽度
var split = new twaver.controls.SplitPane(tree, centerSplite, 'horizontal', 0.3);


创建表格列代码如下:

//创建表格列
function createColumn (table, name, propertyName, propertyType, valueType, editable) {
var column = new twaver.Column(name);
column.setName(name);
column.setPropertyName(propertyName);
column.setPropertyType(propertyType);
if (valueType) column.setValueType(valueType);
column.setEditable(editable);
column.renderHeader = function (div) {
var span = document.createElement('span');
span.style.whiteSpace = 'nowrap';
span.style.verticalAlign = 'middle';
span.style.padding = '1px 2px 1px 2px';
span.innerHTML = column.getName() ? column.getName() : column.getPropertyName();
span.setAttribute('title', span.innerHTML);
span.style.font = 'bold 12px Helvetica';
div.style.textAlign = 'center';
div.appendChild(span);
};
table.getColumnBox().add(column);
return column;
};


最后效果如下:

五. 添加属性页
首先创建属性页

//构造属性页
var sheet = new twaver.controls.PropertySheet(box);


然后初始化属性页的属性

//初始化属性页
function initPropertySheet () {
sheet.setEditable(true);
var sheetBox = sheet.getPropertyBox();
//网元标识
addProperty(sheetBox, 'id', 'Id', 'string', 'accessor', false);
//网元名称
addProperty(sheetBox, 'name', 'Name', 'string', 'accessor', true);
//网元提示信息
addProperty(sheetBox, 'toolTip', 'ToolTip', 'string', 'accessor', true);
//仅节点可见
var isNodeVisible = function (data) {
return data instanceof twaver.Node;
};
//网元x坐标
addProperty(sheetBox, 'x', 'X', 'number', 'accessor', true, isNodeVisible);
//网元y坐标
addProperty(sheetBox, 'y', 'Y', 'number', 'accessor', true, isNodeVisible);
//网元宽度
addProperty(sheetBox, 'width', 'Width', 'number', 'accessor', true, isNodeVisible);
//网元高度
addProperty(sheetBox, 'height', 'Height', 'number', 'accessor', true, isNodeVisible);
//仅连线可见
var isLinkVisible = function (data) {
return data instanceof twaver.Link;
};
//网元x坐标
addProperty(sheetBox, 'fromNode', 'From Node', 'string', 'accessor', false, isLinkVisible);
//网元y坐标
addProperty(sheetBox, 'toNode', 'To Node', 'string', 'accessor', false, isLinkVisible);
}

最后添加属性页

//初始化属性页
initPropertySheet();
//左分割面板, 包含树和属性页
var leftSplite = new twaver.controls.SplitPane(tree, sheet, 'vertical', 0.7);
//构造左右分割面板, 左边为树, 右边为拓扑, 树占30%宽度
var split = new twaver.controls.SplitPane(leftSplite, centerSplite, 'horizontal', 0.3);


创建属性页属性的代码如下:

//添加属性页属性
function addProperty (box, propertyName, name, valueType, propertyType, editable, isVisible) {
var property = new twaver.Property();
property.setEditable(editable);
property.setPropertyType(propertyType);
property.setPropertyName(propertyName);
property.setName(name);
property.setValueType(valueType);
property.isVisible = isVisible;
box.add(property);
return property;
}


最后效果如下:

本文完整代码见附件TWaver HTML5 Demo(附件只包含demo代码, 如需要TWaver HTML5产品包, 请参见论坛TWaver HTML5版本即将发布,敬请期待)


 

这篇关于TWaver HTML5 + Node.js + express + socket.io + redis(三)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/943512

相关文章

Python将博客内容html导出为Markdown格式

《Python将博客内容html导出为Markdown格式》Python将博客内容html导出为Markdown格式,通过博客url地址抓取文章,分析并提取出文章标题和内容,将内容构建成html,再转... 目录一、为什么要搞?二、准备如何搞?三、说搞咱就搞!抓取文章提取内容构建html转存markdown

在React中引入Tailwind CSS的完整指南

《在React中引入TailwindCSS的完整指南》在现代前端开发中,使用UI库可以显著提高开发效率,TailwindCSS是一个功能类优先的CSS框架,本文将详细介绍如何在Reac... 目录前言一、Tailwind css 简介二、创建 React 项目使用 Create React App 创建项目

vue使用docxtemplater导出word

《vue使用docxtemplater导出word》docxtemplater是一种邮件合并工具,以编程方式使用并处理条件、循环,并且可以扩展以插入任何内容,下面我们来看看如何使用docxtempl... 目录docxtemplatervue使用docxtemplater导出word安装常用语法 封装导出方

揭秘Python Socket网络编程的7种硬核用法

《揭秘PythonSocket网络编程的7种硬核用法》Socket不仅能做聊天室,还能干一大堆硬核操作,这篇文章就带大家看看Python网络编程的7种超实用玩法,感兴趣的小伙伴可以跟随小编一起... 目录1.端口扫描器:探测开放端口2.简易 HTTP 服务器:10 秒搭个网页3.局域网游戏:多人联机对战4.

用js控制视频播放进度基本示例代码

《用js控制视频播放进度基本示例代码》写前端的时候,很多的时候是需要支持要网页视频播放的功能,下面这篇文章主要给大家介绍了关于用js控制视频播放进度的相关资料,文中通过代码介绍的非常详细,需要的朋友可... 目录前言html部分:JavaScript部分:注意:总结前言在javascript中控制视频播放

Java的IO模型、Netty原理解析

《Java的IO模型、Netty原理解析》Java的I/O是以流的方式进行数据输入输出的,Java的类库涉及很多领域的IO内容:标准的输入输出,文件的操作、网络上的数据传输流、字符串流、对象流等,这篇... 目录1.什么是IO2.同步与异步、阻塞与非阻塞3.三种IO模型BIO(blocking I/O)NI

Redis 中的热点键和数据倾斜示例详解

《Redis中的热点键和数据倾斜示例详解》热点键是指在Redis中被频繁访问的特定键,这些键由于其高访问频率,可能导致Redis服务器的性能问题,尤其是在高并发场景下,本文给大家介绍Redis中的热... 目录Redis 中的热点键和数据倾斜热点键(Hot Key)定义特点应对策略示例数据倾斜(Data S

Vue中组件之间传值的六种方式(完整版)

《Vue中组件之间传值的六种方式(完整版)》组件是vue.js最强大的功能之一,而组件实例的作用域是相互独立的,这就意味着不同组件之间的数据无法相互引用,针对不同的使用场景,如何选择行之有效的通信方式... 目录前言方法一、props/$emit1.父组件向子组件传值2.子组件向父组件传值(通过事件形式)方

css中的 vertical-align与line-height作用详解

《css中的vertical-align与line-height作用详解》:本文主要介绍了CSS中的`vertical-align`和`line-height`属性,包括它们的作用、适用元素、属性值、常见使用场景、常见问题及解决方案,详细内容请阅读本文,希望能对你有所帮助... 目录vertical-ali

redis+lua实现分布式限流的示例

《redis+lua实现分布式限流的示例》本文主要介绍了redis+lua实现分布式限流的示例,可以实现复杂的限流逻辑,如滑动窗口限流,并且避免了多步操作导致的并发问题,具有一定的参考价值,感兴趣的可... 目录为什么使用Redis+Lua实现分布式限流使用ZSET也可以实现限流,为什么选择lua的方式实现