標籤:
今天開發一個設計一個統計線上人數的統計。實現方式是在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 統計線上人數功能實現