asp.net MVC 统计在线人数功能实现

今天开发一个设计一个统计在线人数的统计。实现方式是在MVC 中,用户次执行一个Action请求完成后,向数据表中插入一条用户心跳记录,统计在线人数则是根据该记录,30分钟内有记录的用户则为在线状态。

首先设计表心跳记录表结构MOdel

asp.net MVC 统计在线人数功能实现

接下来添加 CheckACAttribute 类继承 ActionFilterAttribute基类,并在FilterConfig类中注册。

public class FilterConfig
    {
        public static void RegisterGlobalFilters(GlobalFilterCollection filters)
        {
            filters.Add(new HandleErrorAttribute());
       filters.Add(new ASSFramework.Web.Common.CheckACAttribute());
        }
    }

CheckACAttribute类的拦截器方法实现如下

public override void OnActionExecuted(ActionExecutedContext filterContext) {
   if (isInsertOpenLog == true) {  //判断是否写入心跳记录
    //每一个action 执行后记录一下操作日志,用于统计用户在线。
    ASSFramework.Services.BLL.sysOpenLogBLL bll = new ASSFramework.Services.BLL.sysOpenLogBLL();
    BaseController baseController = (BaseController)filterContext.Controller;
    sysOpenLog model = new sysOpenLog();
    model.userID = baseController.GetSysUser().userID;      //获取用户ID
    model.userNameCn = baseController.GetSysUser().userNameCn;  //用户名称
    model.createdDate = DateTime.Now;
    model.flag = 1;
    bll.Insert(model);
   }
   base.OnActionExecuted(filterContext);
  }

业务逻辑层

public class sysOpenLogBLL {

DAL.sysOpenLogDAL dal = new DAL.sysOpenLogDAL();

/// <summary>

  /// 统计在线人数

/// </summary>

/// <returns></returns>

   public IList<Hashtable> GetOnLinelList() {

    return dal.GetOnLinelList();

   }

}

数据访问层,数据访问使用到的是IBatisNet框架,该框架轻小灵活,第一次使用就深深的喜欢上了。

public class sysOpenLogDAL {
  /// <summary>
  /// 统计在线人数
  /// </summary>
  /// <returns></returns>
  public IList<Hashtable> GetOnLinelList() {
   string stmtId = "sysOpenLog.GetOnLinelList";
   return ASSMapper.Instance().QueryForList<Hashtable>(stmtId, "");
  }

表映射xml文件如下

<statements>

<!--统计在线人数,近半个小时有活动的用户-->

  <select id="GetOnLinelList" parameterClass="map" resultClass="Hashtable">

    select userID,userNameCn,MAX(createdDate)

    from sysOpenLog

    group by userID,userNameCn

    having MAX(createdDate) >= DATEADD(MINUTE,-30,GETDATE())

</select>

   <!--添加-->

  <insert id="Insert" parameterClass="sysOpenLog" resultClass="Int32">

    Insert into sysOpenLog(   userID,   userNameCn,   createdDate,   flag   )values(   #userID#,   #userNameCn#,   #createdDate#,   #flag#   )         SELECT @@IDENTITY

  </insert>

</statements>

基础数据通过action 请求后写入心跳记录表,接下来就要展示出来在线人数信息

在控制器中添加  Index()

public ActionResult Index()
        {
       ASSFramework.Services.BLL.sysOpenLogBLL bll = new Services.BLL.sysOpenLogBLL();
       IList<Hashtable> model = bll.GetOnLinelList();
       return View(model);
        }

添加Idex视图页面

@{

  Layout = "~/Views/Shared/_Layout.cshtml";

}

@using System.Collections;

@using ASSFramework.Models;

@model IList<Hashtable>

<!--导航-->

@Html.place("首页;用户管理;在线统计")

<div class="formbody">

  <div class="formtitle"><span>在线人数</span></div>

    <div class="toolsli">

      <ul class="toollist">

      @foreach (var item in Model) {

        <li><a><img src="~/Content/theme/images/i07.png" /></a><h2>@item["userNameCn"] </h2></li>

      }

      </ul>

  </div>

</div>

最终显示结果如下

asp.net MVC 统计在线人数功能实现

这次只贴出来了大致的实现思路和简单的代码贴图。

统计在线人数的功能基本实现了,但是这时要考虑到这心跳记录表如果用户量多,而且操作频繁的话,数据量会越来越大,这里我们只需要统计半小时以内的用户活动记录,所以在sql server 数据库中添加一个作业,定时删除垃圾数据。

上一篇:第四节,Linux基础命令


下一篇:spark sql 对接 HDFS