前言
本系列文章特点:使用ASP.NET SignalR和LayIM快速入门对接,实现一对一聊天,群聊,添加聊天群组,查找聊天记录等功能。源代码不包含LayIM的源代码,因为官方并没开源属于收费资源,所以得遵从官方的规则,但包含Demo的数据库脚本和改造之后的find.html,源代码在最后一节。
文章目录:
LayIM 3.9.1与ASP.NET SignalR实现Web聊天室快速入门(一)之效果展示与关键技术简介
LayIM 3.9.1与ASP.NET SignalR实现Web聊天室快速入门(二)之后台数据库创建
LayIM 3.9.1与ASP.NET SignalR实现Web聊天室快速入门(三)之LayIM初始化数据
LayIM 3.9.1与ASP.NET SignalR实现Web聊天室快速入门(四)之ASP.NET SignalR核心功能介绍
LayIM 3.9.1与ASP.NET SignalR实现Web聊天室快速入门(五)之使用RabbitMQ缓存消息
LayIM 3.9.1与ASP.NET SignalR实现Web聊天室快速入门(六)之SignalR与MVC结合封装消息发送与接收
LayIM 3.9.1与ASP.NET SignalR实现Web聊天室快速入门(七)之LayIM与MVC数据交互实现单聊和群聊
LayIM 3.9.1与ASP.NET SignalR实现Web聊天室快速入门(八)之改造查找页面实现拉取好友创建群
一、本文目标与简介
前面一篇文章讲述了后台数据的逻辑与设计,本文主要讲解如何初始化LayIM的数据,本节的目标是在LayIM界面展示后台数据库的好友列表与分组信息,不涉及聊天消息发送与接收,仅仅展示如何在项目中初始化LayIM。
本文也只是讲述大概思路与关键点地方,只涉及部分代码,在本系列最后一节的有所有源码下载地址。
二、构造数据模型
LayIM初始化的核心是从后台取得固定格式json数据,数据格式在LayIM官网说明的很清楚,详见官网。官网给的格式如下:
{
"code": 0 //0表示成功,其它表示失败
,"msg": "" //失败信息
,"data": {
//我的信息
"mine": {
"username": "纸飞机" //我的昵称
,"id": "100000" //我的ID
,"status": "online" //在线状态 online:在线、hide:隐身
,"sign": "在深邃的编码世界,做一枚轻盈的纸飞机" //我的签名
,"avatar": "a.jpg" //我的头像
}
//好友列表
,"friend": [{
"groupname": "前端码屌" //好友分组名
,"id": 1 //分组ID
,"list": [{ //分组下的好友列表
"username": "贤心" //好友昵称
,"id": "100001" //好友ID
,"avatar": "a.jpg" //好友头像
,"sign": "这些都是测试数据,实际使用请严格按照该格式返回" //好友签名
,"status": "online" //若值为offline代表离线,online或者不填为在线
}, …… ]
}, …… ]
//群组列表
,"group": [{
"groupname": "前端群" //群组名
,"id": "101" //群组ID
,"avatar": "a.jpg" //群组头像
}, …… ]
}
}
所以,按照官网的数据格式,构造如下模型:
/// <summary>
/// 界面初始化返回的数据实体
/// </summary>
public class LIMInitDoEntity
{
public int code { get; set; } = 0; //0表示成功,其它表示失败
public string msg { get; set; }//失败信息
public LIMInitData data { get; set; } = new LIMInitData();
}
public class LIMInitData
{
/// <summary>
/// 我的信息
/// </summary>
public LIMMemberInfo mine { get; set; }
/// <summary>
/// 好友列表
/// </summary>
public List<LIMFriendInfo> friend { get; set; } = new List<LIMFriendInfo>();
/// <summary>
/// 群组列表
/// </summary>
public List<LIMGroupInfo> group { get; set; } = new List<LIMGroupInfo>();
}
public class LIMFriendInfo
{
public int id { get; set; }//分组ID
public string groupname { get; set; }//好友分组名
public List<LIMMemberInfo> list { get; set; } = new List<LIMMemberInfo>();//好友列表
}
public class LIMGroupInfo
{
public int id { get; set; }//群组ID
public string groupname { get; set; }//群组名
public string avatar { get; set; }//群组头像
}
public class LIMMemberInfo
{
public int id { get; set; } //好友ID
public string username { get; set; }//好友昵称
public string avatar { get; set; }//好友头像
public string sign { get; set; }//好友签名
public string status { get; set; }//若值为offline代表离线,online或者不填为在线
}
三、取得数据数据
由于本系列demo使用的SQLServer数据库,所有使用Ado.net与数据交互,假如EF使用熟练的同学,可以使用EF。在本Demo的源码中对应的数据库模型如下图所示,但是不完整,也没有提供EF示例,所以使用EF的可在此目录下扩展数据模型使用EF,另外同级目录DoEntity文件下放的是返回给前端的实体模型如上文提到的LayIM初始化所要求的数据模型。
1.获取数据库数据
本文所使用的Ado.net的代码不再展示,可自己编写或者查看源代码,返回的数据代码如下,另本代码并没有获取好友分组,但已设置一个默认分组示例:
/// <summary>
/// 获取当前用户的初始化数据
/// </summary>
/// <param name="userId">当前用户id</param>
/// <returns></returns>
public static LIMInitDoEntity GetInitData(int userId)
{
LIMInitDoEntity initdata = new LIMInitDoEntity();
initdata.data.mine = new LIMMemberInfo();
string sql = @"select UserId id,UserName username,UserSign sign,UserAvatar avatar from [LIM].[User]";
DataTable dt = SQLServerHelper.QueryForDataTatable(sql);
LIMFriendInfo friend = new LIMFriendInfo();
friend.id = 1;
friend.groupname = "时代精英";
foreach (DataRow item in dt.Rows)
{
if (int.Parse(item["id"].ToString()) == userId)
{
initdata.data.mine.id = userId;
initdata.data.mine.username = item["username"].ToString();
initdata.data.mine.status = "online";
initdata.data.mine.sign = item["sign"].ToString(); ;
initdata.data.mine.avatar = item["avatar"].ToString();
}
LIMMemberInfo mem = new LIMMemberInfo();
mem.id = int.Parse(item["id"].ToString());
mem.username = item["username"].ToString();
mem.sign = item["sign"].ToString();
mem.avatar = item["avatar"].ToString();
friend.list.Add(mem);
}
initdata.data.friend.Add(friend);//获取所有的好友
initdata.data.group = GetUserRoomList(userId);//获取所有的群组聊天室
return initdata;
}
public static List<LIMGroupInfo> GetUserRoomList(int userId)
{
List<LIMGroupInfo> grouplist = new List<LIMGroupInfo>();
string groupstr = @"select r.RoomId,r.RoomName,r.RoomAvatar from[LIM].[RoomMember] m
inner join[LIM].[Room] r on m.RoomId=r.RoomId
where m.UserId=@UserId";
List<SqlParameter> parameters = new List<SqlParameter>();
parameters.Add(new SqlParameter() { ParameterName = "@UserId", SqlDbType = SqlDbType.VarChar, Value = userId });
DataTable gdt = SQLServerHelper.QueryForDataTatable(groupstr, parameters);
foreach (DataRow item in gdt.Rows)
{
LIMGroupInfo groupInfo = new LIMGroupInfo();
groupInfo.id = int.Parse(item["RoomId"].ToString());
groupInfo.groupname = item["RoomName"].ToString();
groupInfo.avatar = item["RoomAvatar"].ToString();
grouplist.Add(groupInfo);
}
return grouplist;
}
2.数据返回给前端
在解决方案中创建一个MVC项目,取名“LIM.Web”,包括登录设置,config文件等设置不再赘述,可自行实现或者查看源代码。本demo中,使用Session存储了用户名和用户id,实际项目中可自行实现身份认证,这一块不是本文的重点,所以仅仅使用Session来进行身份认证,具体代码可查看源代码,在LIM.Web的Controllers的文件夹右键添加控制器LIMController,这里需要注意,为什么要添加这个控制器,原因是后续的其他功能都在这个控制器里进行数据交互,当然不添加也可以,本系列的Demo的思路可以做抛砖引玉。
添加好控制后,在LIMController下创建一个返回数据的Action,代码如下:
public ActionResult GetInitData()
{
if (Session["UserId"] != null)
{
string userid = Session["UserId"].ToString();
var result = LIMRepository.GetInitData(int.Parse(userid));
return Json(result, JsonRequestBehavior.AllowGet);
}
else
{
return Redirect("/Home/Login");
}
}
3.获得LayIM包部署到项目中
目前LayIM3.9.1是付费版本,详情参见官网,获得解压包后放在LIM.Web项目Scripts文件下即可,然后配置引用,在LIM.Web的BundleConfig文件中添加LayIM的js和css引用路径,具体路径为LayIM的存放路径,按照本文的思路,js路径是 "~/Scripts/layui/layui.js",css路径是"~/Scripts/layui/css/layui.css",具体代码见源代码。需要注意的是jquery的版本不能使用高版本,具体到哪个版本不清楚,本系列demo使用的jQuery JavaScript Library v1.11.1。高版本的jquery,LayIM不支持,官网暂时也没有给出解决方案。
4.LayIM绑定初始化数据
通过上文,数据已经可以从DB到Action了,LayIM也部署到项目中了,然后按照官网的步骤操作即可,官网给的初始化代码示例如下:
init: {
url: '' //接口地址(返回的数据格式见下文)
,type: 'get' //默认get,一般可不填
,data: {} //额外参数
}
所以我们只需要在url中填写我们的Controller和action即可,本demo的代码如下:
另外,本demo的LayIM放在home的index页面里,详见源代码,至于为什么放在这里,是因为登录成功之后,会跳转到这个页面,实际项目中放在哪个cshtml文件里可根据实际项目需求。到此,登录成功之后就能看到LayIM初始化后的好友列表,假如按照本系列的Demo,使用数据库中的任意用户登录,都会看到一样的好友列表,因为本demo默认登录之后都会获取所有的用户作为好友,具体详见源代码的GetInitData的方法。