`
yiminghe
  • 浏览: 1471135 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Ext 聊天窗口的实现 - 续

阅读更多
<filter>
        <filter-name>Set Character Encoding</filter-name>
        <filter-class>filters.SetCharacterEncodingFilter</filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>GBK</param-value>
        </init-param>
         <init-param>
<!--
Ajax important , charset=utf-8
其他都为gbk
-->
            <param-name>ignore</param-name>
            <param-value>false</param-value>
        </init-param>
    </filter> 



<listener>
        <listener-class>hyjc.listener.CustomSessionListener</listener-class>
    </listener>
 

还是利用了 poll 的 方案 ,定时 刷新信息, 下一步打算利用长连接 来试试

 

生成了一个 Ext.window 就是聊天窗口了

 

Ext.onReady(function() {
  
    var chatWin = new Ext.Window({
    		width:800,
    		height:500,
    		title:'Ext聊天窗口测试版',
    		renderTo:document.body,
    		border :false,
    		hidden :true,
        layout:'border',
        closeAction :'hide',
        collapsible :true,
        constrain :true,
        iconCls :'my-userCommentIcon',
        maximizable :true,
        items:[
            {
                region:'west',
                id:'chat-west-panel',
                title:'用户面板',
                split:true,
                width: 170,
                minSize: 100,
                maxSize: 200,
                collapsible: true,
                constrain :true,
                //margins:'0 0 0 5',
                layout:'accordion',
                layoutConfig:{
                    animate:true
                },
                items: [{
                    items:

                      
                            new Ext.tree.TreePanel({
                                id:'im-tree',
                              
                                rootVisible:false,
                                lines:false,
                               
                                border :false,
                                dataUrl: 'chat/updateChat.jsp',
                                singleExpand :true,
                                selModel:new Ext.tree.MultiSelectionModel(),
                               
                                root: new Ext.tree.AsyncTreeNode({
                                    text:'Online',
                                    children:[{
                                        text:'Sunrise',
                                        id:'SunriseIm',
                                        nodeType: 'async',
                                        singleClickExpand :true,
                                        expandable:true,
                                        expanded:true
                                    }]
                                })
                            })
                    ,
                    title:'在线人员',
                    //layout:'form',
                    border:false,
                    autoScroll:true,
                    iconCls:'im_list',
                    tools:[{
                        id:'refresh',
                        qtip: '刷新在线信息',
                        // hidden:true,
                        handler: function(event, toolEl, panel) {
                            reloadUser();
                        }
                    },
                        {
                            id:'close',
                            qtip: '清除选定',
                            // hidden:true,
                            handler: function(event, toolEl, panel) {
                                Ext.getCmp('im-tree').getSelectionModel().clearSelections();
                            }
                        }
                    ]

                },{
                    title:'Settings',
                    html:'<p>Some settings in here.</p>',
                    border:false,
                    iconCls:'settings'
                }]
            },
            {
                region:'center',
                layout:'border',   items:[
                {
                    region:'center',
                    title:'历史记录  ',
                    id:'history_panel',
                    autoScroll:true,
                    iconCls :'my-userCommentIcon',
                    tools:[{
                        id:'refresh',
                        qtip: '注意:如果长时间没有收到对方回应,试一下',
                        // hidden:true,
                        handler: function(event, toolEl, panel) {
                            // refresh logic
                        }
                    }]
                },
                {
                    region:'south',
                    title:'聊天啦',
                    layout:'fit',
                
                    iconCls :'user_edit',
                    autoScroll:true,
                    height: 200,
                
                    collapsible: true,

                    //margins:'0 0 0 0',
                    items:{
                        xtype:'form',
                        baseCls: 'x-plain',
                        autoHeight:true,
                        autoWidth:true,
                        bodyStyle: 'padding:10 10px 0;',
                        defaults: {
                            anchor: '95%'
                        },
                        items:[
                           
                            {
                                xtype:'htmleditor',
                                height:130,
                                id:'htmleditor',
                                hideLabel :true
                            }
                        ]
                    }
                    ,bbar :[{
                    text:'发送请输入Ctrl-Enter',
                    handler:function() {
                        sendmsg();
                    },
                    iconCls:'my-sendingIcon'
                }

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


            ]
            }
        ]
    });

    var query = location.search.substring(1);//获取查询串
    var sessionId = SESSION;//Ext.urlDecode(query).sid;
    // 发送消息
    function sendmsg() {
Ext.getCmp("htmleditor").syncValue();
        var content_value = Ext.getCmp("htmleditor").getValue();
        if (content_value.trim() == '') {
            alert("您没有输入消息文本内容!");
            Ext.getCmp("htmleditor").focus(true);
            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) {
            alert("您没有选择接收者!");
            tree.focus();
            return;
        }
        //alert(receivers_values.length);
        if (receivers_values.length > 1) {
            if (!confirm("您选择了多个接收者,是否继续?")) {
                return;
            }
        }

        var nickname_value = 'forget';

        var pars = {
            "content":content_value,
            "receivers":"" + receivers_values,
            "sender":sessionId
            // "nickname":'forget'
        };

        var conn = new Ext.data.Connection();
        // 发送异步请求
        conn.request({
            // 请求地址
            url: 'chat/sendmsg.jsp',
            method: 'post',
            params: pars,
            // 指定回调函数
            callback: msgsent
        });


    }

    function msgsent(options, success, response) {
        requestCount--;
        if (success) {
            try {
                var jsonObj = Ext.util.JSON.decode(response.responseText);
            } catch(e) {

            }
            if (jsonObj && jsonObj.success)
            {
                var cur = jsonObj.cur;
                var sessions = [];

                var c = node.childNodes;
                for (var i = 0; i < c.length; i++) {
                    sessions[c[i].attributes.sessionId] = c[i].attributes;
                }


             if (cur) {
                    var a = [];
                    for (var j = 0; j < cur.receivers.length; j++) {

                        a.push(sessions[cur.receivers[j]].loginName);
                    }

   var msg = '<div style="margin:20px 5px 10px 5px">   <img src="js/ext/user_comment.png"/> {0} <b>{1}</b> 对 <b>{2}</b> 说:<br> </div>' ;
                
var chat_record =new Ext.Element(document.createElement('div'));
chat_record.addClass('chat_record');


	
chat_record.update('<span style="margin:0px 5px 0px 5px">'+cur.content+'</span>');

Ext.getCmp("history_panel").body.appendChild(chat_record);
var canvas=new Ext.Element(document.createElement('canvas'));
var size_chat=chat_record.getSize();
if(!Ext.isIE && size_chat.height < 100) {
	chat_record.setHeight(100);
	size_chat.height=100;
}
canvas.setSize(size_chat.width-30,size_chat.height);
//canvas.setSize(size_chat.width-,40);
chat_record.appendChild(canvas);


if(window['G_vmlCanvasManager'] ) {
					G_vmlCanvasManager.initElement(canvas.dom);
}


draw_m(chat_record.dom.lastChild,'#FFB100');



                    var mc = String.format(msg, cur.time, sessions[cur.sender].loginName, a);
                    
                    Ext.getCmp("history_panel").body.insertHtml('beforeEnd',
                            mc);
                            
                           
                  
                    Ext.getCmp("history_panel").body.scroll('b', 10000, {
                        duration:0.1
                    });
                }
                Ext.getCmp("htmleditor").reset();
            }
            else if(response.result)
                alert(response.result);
        } else {
        	if(response.responseText)
            alert(response.responseText);
        }

    }
    //event for source editing mode
    new Ext.KeyMap(Ext.getCmp("htmleditor").getEl(), [
        {
            key: 13,
            ctrl:true,
            stopEvent :true,
            fn: sendmsg
        }
    ]);


    //event for normal mode
    
    Ext.getCmp("htmleditor").onEditorEvent = function(e) {
        this.updateToolbar();
        var keyCode = (document.layers) ? keyStroke.which : e.keyCode;
        if (keyCode == 13 && e.ctrlKey) sendmsg(); //it'a my handler
    }

    var tree = Ext.getCmp('im-tree');
    var node = tree.getNodeById('SunriseIm');
    var requestCount = 0;

    function reloadUser() {
        if (requestCount == 10) {
            alert('服务器连接失败');
            window.location = 'login.jsp';
            return;
        }
        requestCount++;
        var conn = new Ext.data.Connection();
        // 发送异步请求
        conn.request({
            // 请求地址
            url: 'chat/updateChat.jsp',
            method: 'post',
            // 指定回调函数
            callback: callback
        });

        //回调函数
        function callback(options, success, response) {
            requestCount--;
            if (success) {
                try {
                    var jsonObj = Ext.util.JSON.decode(response.responseText);
                } catch(e) {

                }
                if (jsonObj)
                {
                    var jsonNodes = jsonObj.nodes;
                    var msgs = jsonObj.msgs;

                    var cs = node.childNodes ;
                    var nodes = {};
                    var sessions = {};
                    for (var i = 0; i < cs.length; i++) {
                        nodes[cs[i].id] = cs[i];

                    }


                    var user;
                    for (var i = 0; i < jsonNodes.length; i++) {
                        user = jsonNodes[i];
                        // alert(user.sessionId);
                        sessions[user.sessionId] = user;
                        if (nodes[user.id]) {
                            nodes[user.id] = null;
                            continue;
                        }
                        node.appendChild(user);

                    }

                    for (var id in nodes) {
                        if (nodes[id])
                            node.removeChild(nodes[id]);
                    }


                     var msg = '<div style="margin:20px 5px 10px 5px">   <img src="js/ext/user_comment.png"/> {0} <b>{1}</b> 对 <b>{2}</b> 说:<br> </div>' ;
      
                    
                    if (msgs) {
                        for (var i = 0; i < msgs.length; i++) {
                            var a = [];
                            for (var j = 0; j < msgs[i].receivers.length; j++) {

                                a.push(sessions[msgs[i].receivers[j]].loginName);
                            }

                            
                            
                                      
var chat_record =new Ext.Element(document.createElement('div'));
chat_record.addClass('chat_record');


	
chat_record.update('<span style="margin:0px 5px 0px 5px">'+msgs[i].content+'</span>');

Ext.getCmp("history_panel").body.appendChild(chat_record);
var canvas=new Ext.Element(document.createElement('canvas'));
var size_chat=chat_record.getSize();
if(!Ext.isIE && size_chat.height < 100) {
	chat_record.setHeight(100);
	size_chat.height=100;
}
canvas.setSize(size_chat.width-10,size_chat.height);
//canvas.setSize(size_chat.width-,40);
chat_record.appendChild(canvas);


if(window['G_vmlCanvasManager'] ) {
					G_vmlCanvasManager.initElement(canvas.dom);
}


draw_m(chat_record.dom.lastChild,'#FFB100');



                            var mc = String.format(msg, msgs[i].time, sessions[msgs[i].sender].loginName, a);
                            Ext.getCmp("history_panel").body.insertHtml('beforeEnd',
                                    mc);
                          
                            Ext.getCmp("history_panel").body.scroll('b', 10000, {
                                duration:0.1
                            });
                        }
                      
                      if(!chatWin.isVisible()){
                     		 self.focus();
        								Ext.example.msg('叮当', 
        								'您有新的短消息     <a href="javascript:window.startChatWin()">查看</a>');
                      }
                     }


                }
                else if(response.responseText)
                    alert(response.responseText);
            } else {
            	if(response.responseText)
                alert(response.responseText);
            }

        }

    }
//chatWin.show();
//chatWin.setSize(0,0);
//chatWin.hide();
if(!Ext.isIE) {
	chatWin.collapse();
}
    var chatTask = {
        run:reloadUser,
        //scope:this,
        interval: 5000 //1 second
    };
    time_pro = new Ext.util.TaskRunner();
    time_pro.start(chatTask);
    //chatWin.hide();
		window.startChatWin = function (){
		
			chatWin.show();
				chatWin.center();
			//Ext.getCmp('htmleditor').focus();
		};


function draw_m(canvas,color){
		
			var context = canvas.getContext("2d");
			var width=canvas.width;
			var height2=canvas.height-4.5;
			var height=canvas.height;
			context.beginPath();
			context.strokeStyle = color;
			context.moveTo(0.5,0.5+5);
			context.arc(5.5,5.5,5,-Math.PI,-Math.PI/2,false);
			context.lineTo(width-0.5-5,0.5);
			context.arc(width-0.5-5,5.5,5,-Math.PI/2,0,false);
			context.lineTo(width-0.5,height2-5);
			context.arc(width-0.5-5,height2-5,5,0,Math.PI/2,false);
			context.lineTo(width/2+3,height2);
			context.lineTo(width/2,height);
			context.lineTo(width/2-3,height2);
			context.lineTo(0.5+5,height2);
			context.arc(0.5+5,height2-5,5,Math.PI/2,Math.PI,false);
			context.lineTo(0.5,0.5+5);
			context.stroke();
		}	
});

 

 

后台 见附件 ,主要是还要设一下  sessionListener 

 

 

  • 大小: 68.4 KB
分享到:
评论
2 楼 gutiti 2012-03-26  
,下来看下
1 楼 zqb666kkk 2012-01-05  
东西不全啊 兄弟 能否完整的贴出来 啊 哪些extjs  图片什么的都没有啊

相关推荐

    perl516-perl-Locale-Maketext-1.22-19.el6.centos.alt.noarch.rpm

    perl516-perl-Locale-Maketext-1.22-19.el6.centos.alt.noarch.rpm

    MATLAB仿真平台下的含碳捕集与垃圾焚烧虚拟电厂的协同优化调度策略研究:电转气技术下的能源利用与需求响应管理,MATLAB代码:计及电转气协同的含碳捕集与垃圾焚烧电厂优化调度 关键词:碳捕集 电厂

    MATLAB仿真平台下的含碳捕集与垃圾焚烧虚拟电厂的协同优化调度策略研究:电转气技术下的能源利用与需求响应管理,MATLAB代码:计及电转气协同的含碳捕集与垃圾焚烧电厂优化调度 关键词:碳捕集 电厂 需求响应 优化调度 电转气协同调度 参考文档:《计及电转气协同的含碳捕集与垃圾焚烧电厂优化调度》完全复现 仿真平台:MATLAB+CPLEX 主要内容:代码主要做的是一个计及电转气协同的含碳捕集与垃圾焚烧电厂优化调度问题,基本调度框架是碳捕集电厂–电转气–燃气机组协同利用框架,碳捕集的 CO2 可作为电转气原料, 生成的天然气则供应给燃气机组; 并通过联合调度将碳捕集能耗和烟气处理能耗进行负荷转移以平抑可再生能源波动,使得风电 光伏实现间接可调度而被灵活利用,代码采用的是非智能算法求解,因为本文问题复杂智能算法难以求解,故使用的是yalmip+cplex求解器完成求解 这段代码是一个关于电转气协同的含碳捕集与垃圾焚烧电厂优化调度的程序。下面我将对程序进行详细分析。 首先,程序开始时进行了一些初始化的操作,包括清空命令窗口、清除变量和关闭所有图形窗口。 然后,定义了一系列的参数,这

    温州市乡镇边界,shp格式

    shp格式,可直接导入arcgis使用

    snappy-1.1.0-3.el7.x64-86.rpm.tar.gz

    1、文件内容:snappy-1.1.0-3.el7.rpm以及相关依赖 2、文件形式:tar.gz压缩包 3、安装指令: #Step1、解压 tar -zxvf /mnt/data/output/snappy-1.1.0-3.el7.tar.gz #Step2、进入解压后的目录,执行安装 sudo rpm -ivh *.rpm 4、安装指导:私信博主,全程指导安装

    perl516-perl-libs-5.16.3-19.el6.centos.alt.x86_64.rpm

    perl516-perl-libs-5.16.3-19.el6.centos.alt.x86_64.rpm

    si-units-0.6.5-1.el7.x64-86.rpm.tar.gz

    1、文件内容:si-units-0.6.5-1.el7.rpm以及相关依赖 2、文件形式:tar.gz压缩包 3、安装指令: #Step1、解压 tar -zxvf /mnt/data/output/si-units-0.6.5-1.el7.tar.gz #Step2、进入解压后的目录,执行安装 sudo rpm -ivh *.rpm 4、安装指导:私信博主,全程指导安装

    svrcore-devel-4.1.3-2.el7.x64-86.rpm.tar.gz

    1、文件内容:svrcore-devel-4.1.3-2.el7.rpm以及相关依赖 2、文件形式:tar.gz压缩包 3、安装指令: #Step1、解压 tar -zxvf /mnt/data/output/svrcore-devel-4.1.3-2.el7.tar.gz #Step2、进入解压后的目录,执行安装 sudo rpm -ivh *.rpm 4、安装指导:私信博主,全程指导安装

    宠物管理系统(源码+数据库+论文+ppt)java开发ssm框架javaweb,可做计算机毕业设计或课程设计

    宠物管理系统(源码+数据库+论文+ppt)java开发ssm框架javaweb,可做计算机毕业设计或课程设计 【功能需求】 整个网上宠物管理系统的设计与实现,主要实现的功能有以下几点: (1)前台用户:首页、宠物用品、宠物商店、宠物领养、宠物挂失、论坛信息、宠物资讯、个人中心、后台管理、购物车、客服咨询 (2)管理员:首页、个人中心、宠物分类管理、商品分类管理、宠物用品管理、宠物商店管理、宠物领养管理、用户管理、宠物寄存管理、用户领养管理、宠物挂失管理、论坛管理、管理员管理、系统管理、订单管理等功能; 【环境需要】 1.运行环境:最好是java jdk 1.8,我们在这个平台上运行的。其他版本理论上也可以。 2.IDE环境:IDEA,Eclipse,Myeclipse都可以。 3.tomcat环境:Tomcat 7.x,8.x,9.x版本均可 4.数据库:MySql 5.7/8.0等版本均可; 【购买须知】 本源码项目经过严格的调试,项目已确保无误,可直接用于课程实训或毕业设计提交。里面都有配套的运行环境软件,讲解视频,部署视频教程,一应俱全,可以自己按照教程导入运行。附有论文参考,使学习者能够快速掌握系统设计和实现的核心技术。

    一个功能强大的图表生成工具,支持多种图表类型和数据可视化

    ## 功能特点 1. 数据导入 - 支持Excel文件 - 支持CSV文件 - 数据预览 - 自动识别列 2. 图表类型 - 折线图 - 柱状图 - 饼图 - 散点图 - 箱线图 - 热力图 3. 图表设置 - 自定义标题 - 主题选择 - 轴标签设置 - 样式调整 4. 其他功能 - 实时预览 - 高清导出 - 多种格式 - 简单操作

    perl516-perl-DBI-1.630-4.el6.centos.alt.x86_64.rpm

    perl516-perl-DBI-1.630-4.el6.centos.alt.x86_64.rpm

    strace-4.24-7.el7-9.x64-86.rpm.tar.gz

    1、文件内容:strace-4.24-7.el7_9.rpm以及相关依赖 2、文件形式:tar.gz压缩包 3、安装指令: #Step1、解压 tar -zxvf /mnt/data/output/strace-4.24-7.el7_9.tar.gz #Step2、进入解压后的目录,执行安装 sudo rpm -ivh *.rpm 4、安装指导:私信博主,全程指导安装

    sos-3.9-5.el7.centos.12.x64-86.rpm.tar.gz

    1、文件内容:sos-3.9-5.el7.centos.12.rpm以及相关依赖 2、文件形式:tar.gz压缩包 3、安装指令: #Step1、解压 tar -zxvf /mnt/data/output/sos-3.9-5.el7.centos.12.tar.gz #Step2、进入解压后的目录,执行安装 sudo rpm -ivh *.rpm 4、安装指导:私信博主,全程指导安装

    srp-daemon-22.4-6.el7-9.x64-86.rpm.tar.gz

    1、文件内容:srp_daemon-22.4-6.el7_9.rpm以及相关依赖 2、文件形式:tar.gz压缩包 3、安装指令: #Step1、解压 tar -zxvf /mnt/data/output/srp_daemon-22.4-6.el7_9.tar.gz #Step2、进入解压后的目录,执行安装 sudo rpm -ivh *.rpm 4、安装指导:私信博主,全程指导安装

    supermin5-devel-5.1.19-1.el7.x64-86.rpm.tar.gz

    1、文件内容:supermin5-devel-5.1.19-1.el7.rpm以及相关依赖 2、文件形式:tar.gz压缩包 3、安装指令: #Step1、解压 tar -zxvf /mnt/data/output/supermin5-devel-5.1.19-1.el7.tar.gz #Step2、进入解压后的目录,执行安装 sudo rpm -ivh *.rpm 4、安装指导:私信博主,全程指导安装

    国土变更小飞机工具分享

    找到image文件扫一扫获取授权

    一个将 Ollama 与 Flask 框架结合的 Python 源码

    一个将 Ollama 与 Flask 框架结合的 Python 源码,创建一个 Web 服务,用户可以通过浏览器或其他工具向该服务发送请求,调用 Ollama 模型生成文本。

    perl516-perl-DateTime-1.06-3.el6.centos.alt.x86_64.rpm

    perl516-perl-DateTime-1.06-3.el6.centos.alt.x86_64.rpm

    Python IDE PyCharm的多平台安装指南和技术应用入门

    内容概要:本文档详细介绍了如何在不同操作系统(Windows、macOS 和 Linux)上安装 PyCharm这一集成开发环境(IDE)。文档不仅讲解了具体的下载渠道以及步骤指引——涵盖社区版和专业版的选择,而且还引导用户进行首次配置,包括外观定制、键盘布局选定以及必要的组件启用,并指出在首次使用的各个阶段可能会遇到的关键事项,像是授权激活。此外,也提到了在启动过程中,针对不同平台的一些特定注意事项,例如在 Mac 中的安全性和隐私设置、Linux 下基于命令行的解压缩与启动方法。 适合人群:初次接触 Python 编程或有意向使用 PyCharm 提高生产力的程序员,尤其是对 PyCharm 不太熟悉的技术新手。 使用场景及目标:为希望使用 PyCharm 开发 Python程序的学生或专业人士提供详尽的操作指南,使其能够顺利完成安装,并熟悉 IDE 的基本特性及高级特性的初步认识,从而快速着手实际项目的开发。 阅读建议:用户可以按自己的操作系统直接跳转相关章节,逐步依照文档步骤来进行安装与配置。同时关注每段文字末提到的独特提醒项以保证顺利地使用 IDE 进行编码工作。对于计划长期使用 PyCharm 的用户来说,还可以探索更多高级插件以满足自身开发需求。

    perl516-perl-DateTime-TimeZone-1.63-5.el6.centos.alt.noarch.rpm

    perl516-perl-DateTime-TimeZone-1.63-5.el6.centos.alt.noarch.rpm

    爆火付费进群流量源码 吃瓜玩法变现

    全新前端UI界面,多种前端交互特效让页面不再单调,进群页面群成员数,群成员头像名称,每次刷新页面随机更新不重复,最下面评论和点赞也是如此随机刷新不重复 进群页面简介,群聊名称,群内展示,常见问题后台一键开关方便控制,付费进群系统后台自定义你的内容,底部显示你所设置的进群金额,也可以修改付费获取某些资源,搭建者自己集思广益,搭建的知识工具里面的内容才是内核,运营起来才是王道

Global site tag (gtag.js) - Google Analytics