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


    今天开发一个设计一个统计在线人数的统计。实现方式是在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 数据库中添加一个作业,定时删除垃圾数据。

  • 相关阅读:
    HDU 1863 畅通工程(Kruskal)
    HDU 1879 继续畅通工程(Kruskra)
    HDU 1102 Constructing Roads(Kruskal)
    POJ 3150 Cellular Automaton(矩阵快速幂)
    POJ 3070 Fibonacci(矩阵快速幂)
    ZOJ 1648 Circuit Board(计算几何)
    ZOJ 3498 Javabeans
    ZOJ 3490 String Successor(模拟)
    Java实现 LeetCode 749 隔离病毒(DFS嵌套)
    Java实现 LeetCode 749 隔离病毒(DFS嵌套)
  • 原文地址:https://www.cnblogs.com/zhuifengnianshao/p/4827584.html
Copyright © 2020-2023  润新知