使用ExtJS创建前端WebQQ界面,使用ASP.NET处理数据存取,为了演示方便用Sqlite3存储数据。
功能概述:
实现了最基础的一对一的通讯功能,实时收发信息,离线保存信息。来信自动弹出窗口。
实现思路:
借鉴了早些年的聊天室思想。
获取聊天信息是客户端定时向服务器请求,按照发送的用户名来查询此用户是否有新信息。有信息则返回信息。如何获取?思路如下:
数据库中为每个用户设置一个LastID,获取信息的时候比较聊天信息表中最大的ChatID。如果ChatID大于LastID,则表明有新的聊天信息,接着从对应数据库获取聊天信息( ChatID-LastID表明新信息条数), 返回给客户端。客户端再根据不同的用户名,将信息追加到相应的聊天窗口。这里还有一步,设置LastID,将这个最大的ChatID保存为LastID。
发送聊天信息比较好理解,POST数据至服务器端的处理页面,进行保存即可。
实现细节:
客户端:
主要有4个处理函数:
双击用户名节点创建聊天窗口:webQQDblClick()
来信动态创建聊天窗口:autoshowQQWindow()
定时从服务器获取聊天消息:loadMessage()
向聊天窗口追加聊天信息:addMessage()
发送聊天信息的处理语句分别在webQQDblClick()和autoshowQQWindow()里面都有。当然这样处理是不符合一些设计思想的,多敲了很多代码。我是懒得封装成一个方法。
服务器端:
有两个处理页面:
一个保存提交的聊天信息页面:SendChatMessage.aspx
一个获取聊天信息的页面:GetChatMessage.aspx
主要的获取数据和保存信息的处理方法是在Chat类中定义的。
申明一下:我仅仅是实现了WebQQ的部分功能。并非实现合理。首先我的编码不是很规范。请谅解。其次WebQQ界面是ExtJS的Desktop例子
中的那个。稍稍把代码改一下,就可以独立了!还有QQ好友不是异步动态获取的。
我为每个用户都创建了一个数据库文件,这是因为Sqlite操作方便。还有每个用户都有很多不同的数据要存储,不仅仅是保存了聊天信息,所以才这样的。其
实你可以把Sqlite看成是一个文本文件,只不过是用关系数据库的方式来思考和存取。想象一下,如果你的一个文本文件,有10M大小。你用文本编辑器打
开时什么感觉。我宁可把它分解成50个,500个文本进行读取。这是我的看法!
还有使用Sqlite是为了演示方便,不需要任何安装、配置、管理。
(其他数据库估计就不能这样了!如果我用MSSQL也绝不会像处理Sqlite这样为每个用户创建一个数据库,因时因地而异。)
我还是先贴个图,诱惑一下。^_^
这里也有全部源代码地址:http://download.csdn.net/source/499268
下面贴部分代码:
- GetChatMessage.aspx
-
-
publicpartialclassGetChatMessage:System.Web.UI.Page
- {
-
protectedvoidPage_Load(objectsender,EventArgse)
- {
-
stringuserinfoPath=Request.MapPath(@"//db/userinfo.db3");
-
stringuserPath=Request.MapPath(@"/db/userdb/");
-
-
stringusername=Request.Params["username"];
-
if(username!=null)
- {
-
IChatchat=newChat(userinfoPath,userPath);
-
stringstr=chat.GetChatMessage(username);
- Response.Write(str);
- }
- Response.End();
- }
- }
-
publicpartialclassGetChatMessage:System.Web.UI.Page
- {
-
protectedvoidPage_Load(objectsender,EventArgse)
- {
-
stringuserinfoPath=Request.MapPath(@"//db/userinfo.db3");
-
stringuserPath=Request.MapPath(@"/db/userdb/");
-
-
stringusername=Request.Params["username"];
-
if(username!=null)
- {
-
IChatchat=newChat(userinfoPath,userPath);
-
stringstr=chat.GetChatMessage(username);
- Response.Write(str);
- }
- Response.End();
- }
- }
-
- SendChatMessage.aspx
- SendChatMessage.aspx
-
-
publicpartialclassSendChatMessage:System.Web.UI.Page
- {
-
protectedvoidPage_Load(objectsender,EventArgse)
- {
-
stringuserinfoPath=Request.MapPath(@"/db/userinfo.db3");
-
stringuserPath=Request.MapPath(@"/db/userdb/");
-
-
stringfromusername=Request.Params["fromusername"];
-
stringtousername=Request.Params["tousername"];
-
stringmessage=Request.Params["message"];
-
if(fromusername!=null&&tousername!=null&&message!=null)
- {
-
IChatchat=newChat(userinfoPath,userPath);
- chat.SendChatMessage(fromusername,tousername,message);
-
Response.Write("{success:true}");
- }
-
else
-
Response.Write("{success:false}");
- Response.End();
- }
- }
聊天消息处理接口:
-
-
interfaceIChat
- {
-
stringGetChatMessage(stringuserName);
-
voidSendChatMessage(stringtoUserName,stringfromUserName,stringmessage);
- }
- (数据库,我临时使用Sqlite3,创建了一个userinfo.db3存储全部用户的信
息,并且创建chatlastid表,存储每个用户的LastChatID。我为每个用户都创建了一个个人的数据库文件,如
snail.db3,oo.db3.存储他自己的消息(chatmsg表).)
-
publicclassChat:IChat
- {
-
privatestringuserinfoDBPath="";
-
privatestringuserDBPath="";
-
publicChat(stringuserinfoStr,stringuserStr)
- {
-
this.userinfoDBPath=userinfoStr;
-
this.userDBPath=userStr;
- }
-
-
-
-
-
privateintGetLastChatID(stringuserName)
- {
-
intreturnValue=-1;
-
using(SQLiteConnectionconn=newSQLiteConnection("DataSource="+userinfoDBPath))
- {
-
try
- {
- conn.Open();
-
stringstrsql="select[lastchatid]from[chatlastid]whereusername=@userName";
-
SQLiteCommandcmd=newSQLiteCommand(strsql,conn);
-
cmd.Parameters.AddWithValue("@userName",userName);
-
objectresult=cmd.ExecuteScalar();
- conn.Clone();
-
if(result==null)
- SetDefaultLastChatID(userName);
-
else
- returnValue=Convert.ToInt32(result);
- }
-
catch(Exceptionex)
- {
- }
-
finally
- {
- }
- }
-
returnreturnValue;
- }
-
-
-
-
-
privatevoidSetDefaultLastChatID(stringuserName)
- {
-
intdefaultLastID=-1;
-
using(SQLiteConnectionconn=newSQLiteConnection("DataSource="+userinfoDBPath))
- {
-
try
- {
- conn.Open();
-
stringstrsql="insertintochatlastid(username,lastchatid)values(@userName,@lastchatid)";
-
SQLiteCommandcmd=newSQLiteCommand(strsql,conn);
-
cmd.Parameters.AddWithValue("@userName",userName);
-
cmd.Parameters.AddWithValue("@lastchatid",defaultLastID);
- cmd.ExecuteNonQuery();
- }
-
catch(Exceptionex)
- {
- }
-
finally
- {
- conn.Clone();
- }
- }
- }
-
-
-
-
-
publicstringGetChatMessage(stringuserName)
- {
-
stringreturnStr="";
-
intlastID=GetLastChatID(userName);
-
intfreshID=GetFreshChatID(userName);
-
if(freshID>lastID)
- {
-
stringdatapath=userDBPath+userName+@".db3";
-
intgetChatID=freshID-lastID;
-
using(SQLiteConnectionconn=newSQLiteConnection("DataSource="+datapath))
- {
-
DataSetds=newDataSet();
-
try
- {
- conn.Open();
-
stringstrsql="select[chatid],[fromusername],[message],[senddate]from(Select[chatid],[fromusername],[message],[senddate]From[chatmsg]orderbychatiddesclimit"+getChatID+")orderbychatidasc";
-
SQLiteDataAdaptersdap=newSQLiteDataAdapter(strsql,conn);
- sdap.Fill(ds);
- conn.Clone();
-
- returnStr=JSONHelper.Convert2Json(ds);
-
- SetLastChatID(userName,freshID);
- }
-
catch(Exceptionex)
- {
- }
-
finally
- {
- }
- }
- }
-
returnreturnStr;
- }
-
-
-
-
-
-
-
publicvoidSendChatMessage(stringfromUserName,stringtoUserName,stringmessage)
- {
-
stringsenddate=DateTime.Now.ToString("u").TrimEnd('Z');
-
stringdatapath=userDBPath+toUserName+@".db3";
-
using(SQLiteConnectionconn=newSQLiteConnection("DataSource="+datapath))
- {
-
try
- {
- conn.Open();
-
stringstrsql="insertintochatmsg(fromusername,message,senddate)values(@fromUserName,@message,@senddate);";
-
SQLiteCommandcmd=newSQLiteCommand(strsql,conn);
-
cmd.Parameters.AddWithValue("@fromUserName",fromUserName);
-
cmd.Parameters.AddWithValue("@message",message);
-
cmd.Parameters.AddWithValue("@senddate",senddate);
- cmd.ExecuteNonQuery();
- }
-
catch(Exceptionex)
- {
- }
-
finally
- {
- conn.Clone();
- }
- }
- }
-
-
-
-
-
privatevoidSetLastChatID(stringuserName,intlastchatid)
- {
-
using(SQLiteConnectionconn=newSQLiteConnection("DataSource="+userinfoDBPath))
- {
-
try
- {
- conn.Open();
-
stringstrsql="update[chatlastid]set[lastchatid]=@lastchatidwhere[username]=@userName";
-
SQLiteCommandcmd=newSQLiteCommand(strsql,conn);
-
cmd.Parameters.AddWithValue("@userName",userName);
-
cmd.Parameters.AddWithValue("@lastchatid",lastchatid);
- cmd.ExecuteNonQuery();
- }
-
catch(Exceptionex)
- {
- }
-
finally
- {
- conn.Clone();
- }
- }
- }
-
-
-
-
-
privateintGetFreshChatID(stringuserName)
- {
-
intreturnValue=0;
-
stringdatapath=userDBPath+userName+@".db3";
-
using(SQLiteConnectionconn=newSQLiteConnection("DataSource="+datapath))
- {
-
try
- {
- conn.Open();
-
stringstrsql="Selectmax(chatid)From[chatmsg];";
-
SQLiteCommandcmd=newSQLiteCommand(strsql,conn);
- returnValue=Convert.ToInt32(cmd.ExecuteScalar());
- }
-
catch(Exceptionex)
- {
- }
-
finally
- {
- conn.Clone();
- }
- }
-
returnreturnValue;
- }
- }
chatmsg 表:
chatmsg 表:
-
Create[chatmsg](
-
[chatid]INTEGERPRIMARYKEYNOTNULL
-
,[fromusername]nvarchar(20)NOTNULL
-
,[message]nvarchar(200)
-
,[senddate]nvarchar(20)
- );
-
Create[chatlastid](
-
[username]nvarCHAR(20)PRIMARYKEYNOTNULL
-
,[lastchatid]INTEGERNOTNULLDEFAULT '0'
- );
-
这个WebQQ有很多的不足之处,很多编码思想,编码规范等等都由这个自己来的,怎么想就做么做了,呵呵。如果你有好的建议,意见,咱多聊聊。^_^
-
-
<PRE class=jscriptname="code"></PRE>
分享到:
相关推荐
ExtJS实现WebQQ即时通信,超级给力,下载吧! ExtJS实现WebQQ即时通信,超级给力,下载吧! ExtJS实现WebQQ即时通信,超级给力,下载吧! ExtJS实现WebQQ即时通信,超级给力,下载吧!
ssh整合实现登录的例子,包含源代码,用extjs做的登录界面,作为新手入门的好东西,不下会后悔的。。。
ExtJS是一个用javascript写的,主要用于创建前端用户界面,是一个与后台技术无关的前端ajax框架。因此,可以把ExtJS用在.Net、Java、Php等各种开发语言开发的应用中。 ExtJs最开始基于YUI技术,由开发人员Jack ...
用ExtJS做的QQ 采用struts1.2 由于时间原因 该WebQQ还有很多bug 希望有兴趣的朋友继续研究 作者Email:haoyingsong@163.com 大家可以看一下: ... 版本已更新: ...实现单聊,群聊,声音提示等,无需数据库
extjs界面生成器extjs界面生成器extjs界面生成器extjs界面生成器extjs界面生成器
xtJs已经升级到了5.0了,目前可能多数应用还在使用ExtJs 3.系列。 从开发大型的web后台或者企业管理系统来看,ExtJs3的缺陷还是比较明显的,从ExtJs4 开始引入了MVC架构,从而能够从容的组织系统的JS文件了。 从...
前端ExtjsAPI 前端ExtjsAPI 前端ExtjsAPI
extjs通用后台管理界面 非常的好看,打击可以下载参考一下 也可以在项目中应用
extjs用户登录界面 博文链接:https://hyj0903.iteye.com/blog/691273
extjs实现一个后台管理框架,界面美观,可换主题颜色
用ExtJS做的QQ 采用struts1.2 依旧有很多bug 希望有兴趣的朋友继续研究 Email:haoyingsong@163.com 可以看一下: http://hi.baidu.com/ccutshyhao/blog/item/3e889f118f149a07203f2e32.html 版本已更新: ...
extjs界面生成,页面设计,可以用可视化的方式,生成一套extjs系统界面
基于WebSocket的企业级即时通讯WebIM,使用EXTJS做为前端设计工具,通过WebSocket的长连接技术,实现在线实时通讯,可以创建工作组,绑定组织结构,提供WebService服务接口。
自己根据网上教程写的一段小代码,可以直接用,正在学习中先保存起来,继续努力
Extjs 之主界面简单布局,适合刚刚接触ext的新手学习,就一个html页面。 现在拿来分享。
采用ExtJS-4.0.7版本,使得前端也有MVC开发模式,并且利用json来配置管理界面,将界面分成了3个部分,一个是查询界面,一个是操作条,一个是表格,一个操作打开一个新界面,操作按钮执行什么操作均可配置,可以配置...
1.先安装 xds_preview.air(要安装AIR环境) 2.把Ext Designer Preview.7z解压后,覆盖一下安装目录的文件,就可以了!
ExtJS 是一个用 javascript 写的 主要用于创建前端用户界面 是一个与后台技术无关的 前端 ajax 框架 因此 可以把 ExtJS 用在 Net Java Php 等各种开发语言开发的应用中 ExtJs 最开始基于 UI 技术 由开发人员 Jack ...
绝对可以,有数据库建表脚本,有较全的extjs展示界面,可供学习。
类似extjs架构的简单c++界面库,extjs是个javascript的界面库