基于.NetCore開發博客項目 StarBlog - (11) 實現訪問統計

系列文章

  • 基于.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中配置中間件。

效果

目前還沒有根據訪問記錄做分析,所以只能截個數據庫的圖片

a80e68414d4d23880913d033a8ea7eba.png
數據庫

OK,接下來可以根據這些數據來做分析了(后面管理后臺開發的部分再來寫)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/286234.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/286234.shtml
英文地址,請注明出處:http://en.pswp.cn/news/286234.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【SPSS統計分析】SPSS19.0簡體中文版安裝教程(附SPSS19.0簡體中文版下載)

spss19.0中文版是一款專業數據統計軟件,受到各種社會學科的研究生、研究員的歡迎。軟件能夠對信息的采集、處理、分析進行全面評估和預測。spss19.0中文版新增加了廣義線性混合模型、自動線性模型、一個統計網頁入口portal和直復營銷direct marketing功能等。另外,IBM 針對SP…

Java 比較兩個版本號的大小 (通用)

/*** 版本號比較** param v1* param v2* return 0代表相等&#xff0c;1代表左邊大&#xff0c;-1代表右邊大* Utils.compareVersion("1.0.358_20180820090554","1.0.358_20180820090553")1*/public static int compareVersion(String v1, String v2) {if …

四、登錄注冊頁功能實現《iVX低代碼/無代碼個人博客制作》

注&#xff1a;iVX也有免費直播課《第八期直播課》 首先打開在線編輯器進入我們的項目&#xff1a;https://editor.ivx.cn/ 一、登錄頁功能實現 上一節中已經完成了登錄頁的頁面制作&#xff0c;那么這一節就開始對應的完成登錄頁的功能實現。 登錄頁的功能實現主要是對用戶…

Oracle 12c應用連接VIP輪訓負載均衡?

目前很多生產數據庫都是兩節點RAC&#xff0c;應用連接的數據庫通常會連接SCAN IP或者VIP,這里做一個小實驗&#xff0c;如果我們使用VIP連接&#xff0c; 應該怎樣配置我們的客戶端&#xff0c;負載均衡是否是嚴格意義上的輪訓機制&#xff0c;只有通過自己的測試才能得到準備…

C語言試題三十一之判斷字符串是否為回文?若是則函數返回1,主函數中輸出yes,否則返回0,主函數中輸出no。回文是指順讀和倒讀都是一樣的字符串。

??個人主頁:個人主頁 ??系列專欄:C語言試題200例目錄 ??推薦一款刷算法、筆試、面經、拿大公司offer神器 ?? 點擊跳轉進入網站 ?作者簡介:大家好,我是碼莎拉蒂,CSDN博客專家(全站排名Top 50),阿里云博客專家、51CTO博客專家、華為云享專家 1、題目 請編寫函數…

關于html5

html5 是用來 將 js 和 css 結合起來 從而實現 各種功能 javascript 用來定義 html5 頁面的邏輯 css 來定義 html5 中的顯示樣式

【SignalR全套系列】之在.Net6中實現SignalR分組通信

微信公眾號&#xff1a;趣編程ACE關注可了解更多的.NET日常實戰開發技巧&#xff0c;如需源碼 請公眾號后臺留言 源碼;[如果覺得本公眾號對您有幫助&#xff0c;歡迎關注]前文回顧【SignalR全套系列】之在.Net6中實SignalR通信SignalR中給客戶端分組調用演示服務端代碼實現1.Pr…

【ArcGIS風暴】中國756個氣象臺站分布Shapefile數據下載

在寫論文時,通常要做研究區概況圖,需要添加氣象站點分布,或者在做氣溫或降水空間插值時,需要將氣溫和降水數據鏈接到氣象臺站上。氣象數據通常可以到資源環境科學與數據中心去下載,為了使用的方便,本文分享中國區域756個氣象臺站shp格式矢量數據,如果你的研究區是西北五…

web上傳大文件的配置

1、項目本身的webconfig 在<system.web>字段下 <httpRuntime targetFramework"4.5" requestLengthDiskThreshold"256" maxRequestLength"1000000000" executionTimeout"120"/> 2、找到C:\Windows\System32\inetsrv\confi…

七、文章管理頁面及功能實現《iVX低代碼/無代碼個人博客制作》

注&#xff1a;iVX也有免費直播課《第八期直播課》 一、文章管理頁頁面制作 文章管理頁的基本結構與首頁類似&#xff0c;我們復制一個首頁&#xff0c;并且重命名首頁的名稱為文章管理頁&#xff1a; 我們接著刪除如下圖所框選部分內容&#xff1a; 接著重命名導航為內容…

Android 發起加入QQ群、打開網址、啟動撥打電話界面

/****************** 發起添加群流程。 ** param key 由官網生成的key* return 返回true表示呼起手Q成功&#xff0c;返回fals表示呼起失敗******************/public static void joinQQGroup(Activity _this, String key){Intent intent new Intent();intent.setData(Ur…

C語言試題三十二之編寫函數function,它的功能是:將一個字符串轉換為一個整數(不得調用c語言提供的將字符串轉換為整數的函數)。

??個人主頁:個人主頁 ??系列專欄:C語言試題200例目錄 ??推薦一款刷算法、筆試、面經、拿大公司offer神器 ?? 點擊跳轉進入網站 ?作者簡介:大家好,我是碼莎拉蒂,CSDN博客專家(全站排名Top 50),阿里云博客專家、51CTO博客專家、華為云享專家 1、題目 請編寫函數…

【ArcGIS風暴】ArcGIS快捷鍵大全

使用快捷鍵能提高工作效率,本文總結了ArcGIS快捷鍵大全。當然了,為了個性化定制,也可以在ArcGIS中自定義快捷鍵。 擴展閱讀: 【ArcGIS微課1000例】0015:ArcGIS如何創建/自定義快捷鍵? 文章目錄 1. 訪問 ArcMap 菜單命令2. 窗口操縱3. 刷新或暫停地圖繪制4. 通過拖放進行…

游戲引擎cocos2d-android使用大全

做手機游戲需要三個核心的類&#xff0c;即&#xff1a;SurfaceView&#xff0c;SurfaceHolder&#xff0c;Thread。幀數要在30幀左右是最好的。 cocos2d游戲引擎 封裝好的框架&#xff0c;可直接使用 cocos2d-android &#xff08;用java編程&#xff09; 導演&#xff1a;控…

禁用CMFCRibbonApplicationButton的單擊和雙擊事件

為了禁用CMFCRibbonApplicationButton的單擊和雙擊事件&#xff0c;我重載了CMFCRibbonApplicationButton如下: 1. MyRibbonApplicationButton.h文件內容&#xff1a; #pragma once class CMyRibbonApplicationButton : public CMFCRibbonApplicationButton{public: CMyRibbonA…

.net core 拋異常對性能影響的求證之路

一、前言在.net 社區中曾經聽到過很多關于大量拋異常會影響性能這樣的結論&#xff0c;心中一直就存在各種疑問。項目中使用自定義異常來處理業務很爽&#xff0c;但是又擔心大量拋業務異常存在性能問題。查閱了各種文檔&#xff0c;微軟官方對性能優化這一塊也不建議使用過多的…

Android Bootloader LittleKernel的兩篇文章 【轉】

轉自&#xff1a;http://blog.csdn.net/loongembedded/article/details/41747523 2014-12-05 14:37 3599人閱讀 評論(2) 收藏 舉報分類&#xff1a;Android Bootloader&#xff08;68&#xff09; Android 開發之 ---- bootloader &#xff08;LK&#xff09; LK是什么 LK 是 L…

Android Fragment 監聽返回鍵

直接給代碼*-* Fragment&#xff1a; public boolean onKeyDown(int keyCode, KeyEvent event){if ((keyCode KeyEvent.KEYCODE_BACK)){//執行操作((MainActivity) Objects.requireNonNull(getActivity())).viewPager.setCurrentItem(3); }return true;} MainActivity&#…

C語言試題三十三之比較兩個字符串的長度,(不得調用c語言提供的求字符串長度的函數),函數返回較長的字符串。若兩個字符串長度相同,則返回第一個字符串。

??個人主頁:個人主頁 ??系列專欄:C語言試題200例目錄 ??推薦一款刷算法、筆試、面經、拿大公司offer神器 ?? 點擊跳轉進入網站 ?作者簡介:大家好,我是碼莎拉蒂,CSDN博客專家(全站排名Top 50),阿里云博客專家、51CTO博客專家、華為云享專家 1、題目 請編寫函數…

一、首頁第一個首頁欄制作【仿淘票票系統前后端完全制作(除支付外)】

首頁一共分為3個頁面&#xff0c;分別是首頁&#xff1a; 影院&#xff1a; 我的&#xff1a; 一、標題頭制作 首先我們新建一個 web 相對應用&#xff0c;隨后點擊前臺&#xff0c;在前臺新建一個頁面&#xff1a; 接著給予這個頁面一個背景色&#xff1a; 為了使頁面…