今天開發一個設計一個統計在線人數的統計。實現方式是在MVC 中,用戶次執行一個Action請求完成後,向數據表中插入一條用戶心跳記錄,統計在線人數則是根據該記錄,30分鐘內有記錄的用戶則爲在線狀態。html
首先設計表心跳記錄表結構MOdelsql
接下來添加 CheckACAttribute 類繼承 ActionFilterAttribute基類,並在FilterConfig類中註冊。數據庫
public class FilterConfig
{
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new HandleErrorAttribute());
filters.Add(new ASSFramework.Web.Common.CheckACAttribute());
}
}app
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);
}ide
業務邏輯層spa
public class sysOpenLogBLL {設計
DAL.sysOpenLogDAL dal = new DAL.sysOpenLogDAL();3d
/// <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 數據庫中添加一個做業,定時刪除垃圾數據。