LayIM 3.9.1与ASP.NET SignalR实现Web聊天室快速入门(三)之LayIM初始化数据

前言

本系列文章特点:使用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的方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值