zoukankan      html  css  js  c++  java
  • 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 数据库中添加一个作业,定时删除垃圾数据。

  • 相关阅读:
    C 指针运算 指针访问数组
    C 字符串操作函数
    C putchar getchar
    C语言 指向函数的指针变量基础
    Openstack L2GW Plugin installation
    nova + ironic node
    cgroup
    ironic pxe tftp(二)Permission denied
    ironic bind port neutron port
    Failed to start OpenBSD Secure Shell server
  • 原文地址:https://www.cnblogs.com/zhuifengnianshao/p/4827584.html
Copyright © 2011-2022 走看看