码迷,mamicode.com
首页 > Web开发 > 详细

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

时间:2015-09-21 23:50:49      阅读:238      评论:0      收藏:0      [点我收藏+]

标签:

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

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

 技术分享

接下来添加 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>

 

最终显示结果如下

 

 技术分享

 

 

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

 

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

 

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

标签:

原文地址:http://www.cnblogs.com/zhuifengnianshao/p/4827584.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!