Ext 在线实时聊天系统的开发(1)

最近在做毕业设计,是用Ext,ibatis,spring,struts2,和comet来做一个实时的聊天系统,这个应用其实用这个多技术,尤其是Spring和struts2,ibatis,有点大炮打苍蝇的感觉,但是这是实习公司要求的,所以也就这么做了。
刚开始入手这个系统的时候,最大的难点就是关于长连接,也就是服务器推技术的应用,当时感觉无从下手,找了pushlet的example,但是感觉实现起来有点困难。
最终决定采用dwr反转来实现长连接。
现在这个应用还在制作当中,我会定期更新,把主要的代码都放上来,供大家参考!

下面这个是主界面的设计

Ext.onReady(function() {
Ext.QuickTips.init();
Ext.BLANK_IMAGE_URL = 'ext/s.gif';
// ---------------------------------------------好友列表树
var Tree = Ext.tree;
// 定义(可以异步加载)根节点
var root = new Tree.AsyncTreeNode({
id : '0',
text : '目录根节点'
});
// 开始构建树面板
var treePanel = new Tree.TreePanel({
id : 'im-tree',
root : root,
loader : new Tree.TreeLoader({
// 从数据库加载树形结构数据
dataUrl : '/graduationPrj/treePro.action'
}),
deferredRender : false,
region : 'west',
title : '在线用户',
border : false,
rootVisible : false,
lines : false,
autoScroll : true,
enableDD : false,
animate : false,
split : true,
width : 200,
minSize : 175,
maxSize : 400,
collapsible : false,
selModel : new Ext.tree.MultiSelectionModel(),
margins : '0 0 0 5'
});

/**
* @method expandAll
* @private
* @description 展开所有节点
*/
var expandAll = function() {
treePanel.root.expand(true, false);
}

/**
* @method updateUserList
* @private
* @description 定时更新在线用户列表,刷新时间为10分钟
*/
var updateUserList = function() {
treePanel.root.reload();
treePanel.root.expand(true, false);
setTimeout(updateUserList, 1000 * 10);
}

/**
* @method treeDoubleClick
* @private
* @description 添加‘双击事件’处理 当双击节点时,弹出聊天对话框
*/
var treeDoubleClick = function(node, e) {
if (node.isLeaf()) {
addOrOpenTab(node.text);
}
}
treePanel.on('dblclick', treeDoubleClick);


/**
* @method treeDoubleClick
* @private
* @description 判断tab有没有存在,如果不存在添加新tab
*/
var addOrOpenTab = function(nodeText) {
var n = tabs.getComponent(nodeText);
if (!n) {
n = tabs.add({
'id' : nodeText,
'title' : nodeText,
layout : 'border',
closable : true,
items : [new Ext.Panel({
region : 'center',
title : '聊天记录 ',
autoScroll : true,
html : '<div id=' + nodeText + 'div></div>',
tools : [{
id : 'refresh',
qtip : '注意:如果长时间没有收到对方回应,试一下',
// hidden:true,
handler : function(event, toolEl, panel) {
// refresh logic
}
}]
})]
});
}
tabs.setActiveTab(n);
}


// ---------------------------------------------公共聊天室
var logPanel = new Ext.Panel({
region : 'center',
title : '聊天记录 ',
id : 'history_panel',
autoScroll : true,
html : '<div id=publicChat></div>',
tools : [{
id : 'refresh',
qtip : '注意:如果长时间没有收到对方回应,试一下',
// hidden:true,
handler : function(event, toolEl, panel) {
// refresh logic
}
}]
});
/**
* @method treeDoubleClick
* @private
* @description 公用的输入文本框
*/
var chatPanel = new Ext.Panel({
region : 'south',
title : '聊天啦',
layout : 'fit',
// split:true,
autoScroll : true,
height : 250,
// minSize: 200,
// maxSize: 500,
collapsible : true,

margins : '0 0 0 0',
items : {
xtype : 'form',
baseCls : 'x-plain',
autoHeight : true,
autoWidth : true,
bodyStyle : 'padding:10 10px 0;',
defaults : {
anchor : '98%'
},
items : [{
xtype : 'htmleditor',
height : 150,
id : 'htmleditor',
hideLabel : true
}]
},
bbar : [{
text : '发送请输入Ctrl-Enter',
handler : function() {
var t = tabs.getActiveTab().getId();
if (t == 'allChat') {
sendPublicMsg();
} else {
sendPrivateMsg();
}
}
}

, '-', {
text : '清除',
handler : function() {
Ext.getCmp("htmleditor").reset();
}
}]
});

var allChatPanel = new Ext.Panel({
id : 'allChat',
title : '公共聊天室',
layout : 'border',
items : [logPanel]
});

/**
* 构建标签面板,出现在主显示页面,用于显示信息
*/
var tabs = new Ext.TabPanel({
region : 'center',
deferredRender : false,
id : 'tabs',
resizeTabs : true,
minTabWidth : 115,
tabWidth : 135,
height : 100,
autoScroll : true,
enableTabScroll : true,
plugins : new Ext.ux.TabCloseMenu(),
items : [allChatPanel]
});
tabs.setActiveTab(allChatPanel);

var sendPublicMsg = function() {
var content_value = Ext.getCmp("htmleditor").getValue();
var t = tabs.getActiveTab().getId();
if (content_value.trim() == '') {
Ext.Msg.alert("消息提示", "您没有输入消息文本内容!");
Ext.getCmp("htmleditor").focus();
return;
}

var receivers_values = [];
var tree = Ext.getCmp('im-tree');
var receivers = tree.getSelectionModel().getSelectedNodes();
for (i = 0; i < receivers.length; ++i) {

receivers_values.push(receivers[i].attributes.sessionId);

}
if (receivers_values.length == 0) {
Ext.Msg.alert("消息提示", '您没有选择接收者!');
tree.focus();
return;
}
// alert(receivers_values.length);
if (receivers_values.length > 1) {
Ext.Msg.alert("消息提示", '只能选择一个接收者!');
tree.focus();
return;
}
document.getElementById('publicChat').innerHTML = t + '中的aaadasdasdasd';
}

var sendPrivateMsg = function() {
var content_value = Ext.getCmp("htmleditor").getValue();
var t = tabs.getActiveTab().getId();
if (content_value.trim() == '') {
Ext.Msg.alert("消息提示", "您没有输入消息文本内容!");
Ext.getCmp("htmleditor").focus();
return;
}

document.getElementById(t + 'div').innerHTML = t + '中的aaadasdasdasd';
document.getElementById("publicChat").innerHTML = t + '中的aaadasdasdasd';
}

/**
* @method treeDoubleClick
* @private
* @description 主界面,添加各个元素
*/

var viewport = new Ext.Viewport({
layout : 'border',
items : [treePanel, {
region : 'center',
layout : 'border',
autoScroll : true,
items : [tabs, chatPanel]
}

]
});
expandAll();
updateUserList();
});

// -------------------------------------------------------------------
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
资源包主要包含以下内容: ASP项目源码:每个资源包中都包含完整的ASP项目源码,这些源码采用了经典的ASP技术开发,结构清晰、注释详细,帮助用户轻松理解整个项目的逻辑和实现方式。通过这些源码,用户可以学习到ASP的基本语法、服务器端脚本编写方法、数据库操作、用户权限管理等关键技术。 数据库设计文件:为了方便用户更好地理解系统的后台逻辑,每个项目中都附带了完整的数据库设计文件。这些文件通常包括数据库结构图、数据表设计文档,以及示例数据SQL脚本。用户可以通过这些文件快速搭建项目所需的数据库环境,并了解各个数据表之间的关系和作用。 详细的开发文档:每个资源包都附有详细的开发文档,文档内容包括项目背景介绍、功能模块说明、系统流程图、用户界面设计以及关键代码解析等。这些文档为用户提供了深入的学习材料,使得即便是从零开始的开发者也能逐步掌握项目开发的全过程。 项目演示与使用指南:为帮助用户更好地理解和使用这些ASP项目,每个资源包中都包含项目的演示文件和使用指南。演示文件通常以视频或图文形式展示项目的主要功能和操作流程,使用指南则详细说明了如何配置开发环境、部署项目以及常见问题的解决方法。 毕业设计参考:对于正在准备毕业设计的学生来说,这些资源包是绝佳的参考材料。每个项目不仅功能完善、结构清晰,还符合常见的毕业设计要求和标准。通过这些项目,学生可以学习到如何从零开始构建一个完整的Web系统,并积累丰富的项目经验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值