系列文章
- 基於.NetCore開發部落格專案 StarBlog - (1) 為什麼需要自己寫一個部落格?
- 基於.NetCore開發部落格專案 StarBlog - (2) 環境準備和建立專案
- 基於.NetCore開發部落格專案 StarBlog - (3) 模型設計
- 基於.NetCore開發部落格專案 StarBlog - (4) markdown部落格批量匯入
- 基於.NetCore開發部落格專案 StarBlog - (5) 開始搭建Web專案
- 基於.NetCore開發部落格專案 StarBlog - (6) 頁面開發之部落格文章列表
- 基於.NetCore開發部落格專案 StarBlog - (7) 頁面開發之文章詳情頁面
- 基於.NetCore開發部落格專案 StarBlog - (8) 分類層級結構展示
- 基於.NetCore開發部落格專案 StarBlog - (9) 圖片批量匯入
- 基於.NetCore開發部落格專案 StarBlog - (10) 圖片瀑布流
- 基於.NetCore開發部落格專案 StarBlog - (11) 實現訪問統計
- ...
前言
放完端午假期回來,我的部落格還沒上線,看著各位大佬的網站都辦得風生水起,我隱約感覺到一絲緊迫感,得抓緊時間寫程式碼了~!
前面的文章已經把部落格網站的基本功能實現起來了,距離網站上線只有一步之遙,然而還有一些細枝末節之處,對網站的運營或者使用者體驗有很大影響,必須完善的,比如:
- 網站訪問統計
- 圖床
按照先後順序,本文先解決訪問統計的問題。
一提到訪問統計,眾所周知的就是Google Analytics或者百度統計,前者在國內無法使用,後者應該是唯一選擇了,但考慮到兩者的功能差距以及該公司的口碑,對我這個小破站來說,我寧願自己實現一個~
實現
實現起來應該是不難的,為了實現統計、分析,我們需要先記錄,記錄的內容包括使用者的IP、裝置、訪問路徑、訪問時間,然後再對這些資料進行分析,就可以得出每篇文章、圖片、分類的閱讀量/訪問量。
為了記錄這些資料,需要在使用者發起每一個請求時都進行處理,在AspNetCore中有多種實現,比如Filter、比如Middleware
這裡我選的是中介軟體的方式
PS:我看到網上有一篇文章介紹Django實現訪問統計的,那個作者寫了一個方法,在每個介面裡呼叫一次,看得我頭皮發麻
在中介軟體中注入Repo,然後每次請求都把IP、裝置、請求路徑等資料儲存在資料庫中。這樣看起來應該是會有一些影響效能的,不過考慮到部落格網站的併發應該很小,帶來的效能損失應該可以忽略不計。(說白了就是懶)
後續有效能瓶頸時再來優化吧~
模型定義
在StarBlog.Data/Models
中新建一個VisitRecord.cs
為了節省篇幅,註釋啥的就不放了,具體程式碼可見github
public class VisitRecord {
public int Id { get; set; }
public string Ip { get; set; }
public string RequestPath { get; set; }
public string? RequestQueryString { get; set; }
public string RequestMethod { get; set; }
public string UserAgent { get; set; }
public DateTime Time { get; set; }
}
寫個中介軟體
在StarBlog.Web/Middlewares
中新建一個VisitRecordMiddleware.cs
public class VisitRecordMiddleware {
private readonly RequestDelegate _next;
public VisitRecordMiddleware(RequestDelegate requestDelegate) {
_next = requestDelegate;
}
public Task Invoke(HttpContext context, IBaseRepository<VisitRecord> visitRecordRepo) {
var request = context.Request;
var response = context.Response;
visitRecordRepo.InsertAsync(new VisitRecord {
Ip = "",
RequestPath = request.Path,
RequestQueryString = request.QueryString.Value,
RequestMethod = request.Method,
UserAgent = request.Headers.UserAgent,
Time = DateTime.Now
});
return _next(context);
}
}
這裡有個地方要注
意的,我的visitRecordRepo
是在Invoke
方法中注入的,為什麼不在構造方法中注入呢?
因為AspNetCore中介軟體的構造方法是Singleton的,所以只能注入Singleton方式的服務,而FreeSQL的Repository是Scoped的,如果在構造方法中注入就會報錯
所以只能在Invoke
方法中注入~
使用中介軟體
編輯StarBlog.Web/Programs.cs
,增加中介軟體配置
app.UseMiddleware<VisitRecordMiddleware>();
PS:本專案基於.Net6,Startup和Program合二為一了;如果是.NetCore3.1及以下版本,則是在Startup.cs中配置中介軟體。
效果
目前還沒有根據訪問記錄做分析,所以只能截個資料庫的圖片
OK,接下來可以根據這些資料來做分析了(後面管理後臺開發的部分再來寫)