基于.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中配置中间件。
效果
目前还没有根据访问记录做分析,所以只能截个数据库的图片

OK,接下来可以根据这些数据来做分析了(后面管理后台开发的部分再来写)
基于.NetCore开发博客项目 StarBlog - (11) 实现访问统计的更多相关文章
- 基于.NetCore开发博客项目 StarBlog - (12) Razor页面动态编译
系列文章 基于.NetCore开发博客项目 StarBlog - (1) 为什么需要自己写一个博客? 基于.NetCore开发博客项目 StarBlog - (2) 环境准备和创建项目 基于.NetC ...
- 基于.NetCore开发博客项目 StarBlog - (13) 加入友情链接功能
系列文章 基于.NetCore开发博客项目 StarBlog - (1) 为什么需要自己写一个博客? 基于.NetCore开发博客项目 StarBlog - (2) 环境准备和创建项目 基于.NetC ...
- 基于.NetCore开发博客项目 StarBlog - (14) 实现主题切换功能
系列文章 基于.NetCore开发博客项目 StarBlog - (1) 为什么需要自己写一个博客? 基于.NetCore开发博客项目 StarBlog - (2) 环境准备和创建项目 基于.NetC ...
- 基于.NetCore开发博客项目 StarBlog - (15) 生成随机尺寸图片
系列文章 基于.NetCore开发博客项目 StarBlog - (1) 为什么需要自己写一个博客? 基于.NetCore开发博客项目 StarBlog - (2) 环境准备和创建项目 基于.NetC ...
- 基于.NetCore开发博客项目 StarBlog - (16) 一些新功能 (监控/统计/配置/初始化)
系列文章 基于.NetCore开发博客项目 StarBlog - (1) 为什么需要自己写一个博客? 基于.NetCore开发博客项目 StarBlog - (2) 环境准备和创建项目 基于.NetC ...
- 基于.NetCore开发博客项目 StarBlog - (17) 自动下载文章里的外部图片
系列文章 基于.NetCore开发博客项目 StarBlog - (1) 为什么需要自己写一个博客? 基于.NetCore开发博客项目 StarBlog - (2) 环境准备和创建项目 基于.NetC ...
- 基于.NetCore开发博客项目 StarBlog - (18) 实现本地Typora文章打包上传
前言 九月太忙,只更新了三篇文章,本来这个功能是从九月初就开始做的,结果一直拖到现在国庆假期才有时间完善并且写文章~ 之前我更新了几篇关于 Python 的文章,有朋友留言问是不是不更新 .Net 了 ...
- 基于.NetCore开发博客项目 StarBlog - (19) Markdown渲染方案探索
前言 笔者认为,一个博客网站,最核心的是阅读体验. 在开发StarBlog的过程中,最耗时的恰恰也是文章的展示部分功能. 最开始还没研究出来如何很好的使用后端渲染,所以只能先用Editor.md组件做 ...
- 基于.NetCore开发博客项目 StarBlog - (6) 页面开发之博客文章列表
系列文章 基于.NetCore开发博客项目 StarBlog - (1) 为什么需要自己写一个博客? 基于.NetCore开发博客项目 StarBlog - (2) 环境准备和创建项目 基于.NetC ...
随机推荐
- SQL语句总结---数据库操作
https://blog.csdn.net/hallomrzhang/article/details/85010014 数据库操作 查看所有数据库 show databases; 1 查看当前使用的数 ...
- vue简单的父子组件之间传值
todo-list为例子: 代码: 父传子--------------属性 v-bind 子传父--------------$emit <!DOCTYPE html> <html ...
- vue过滤金额自动补全小数点
watch:{ //监听input双向绑定 balance(value) { //保留2位小数点过滤器 不四舍五入 var toFixedNum = Number(value).toFixed(3); ...
- Druid 1.1.24 在控制台打印"discard long time none received connection. , jdbcUrl : jdbc:mysql://...."错误日志
Druid 1.1.24 在控制台打印"discard long time none received connection. , jdbcUrl : jdbc:mysql://...&qu ...
- 认识python-个人笔记篇
认识python 1 .python 的发展历史 一种广泛使用的解释型.高级编程.通用型编程语言,由"龟叔"吉多·范罗苏姆创造,第一版发布于1991年. Python的设计哲学强调 ...
- js 修改页面样式的两种方式
1. element.style 行内样式操作 代码示例 : <!DOCTYPE html> <html lang="en"> <hea ...
- PDCA循环——快速提升软件质量的必备工具
近年来,软件项目的规模及其复杂性正在以空前的速度增长,互联网用户市场庞大,互联网公司和相应的软件产品层出不穷.快速响应需求变化往往是互联网行业的常态,软件产品的快速开发迭代对于公司迅速占领市场.抢占商 ...
- zookeeper篇-watch命令
点赞再看,养成习惯,微信搜索「小大白日志」关注这个搬砖人. 文章不定期同步公众号,还有各种一线大厂面试原题.我的学习系列笔记. 每个路径节点都有一个watcher监控,当该节点数据改变时(CRUD), ...
- Django-ORM-连表正反操作
一.A表男生,B表女生,C表关系 1通过A表查与某个男生有关系的所有女生 思想1:在A表中确认男生后,通过反查到C表,获取相关内容(QuerySet),然后再跨到B表获取所有女生信息. obj=mod ...
- 基于Koa与umi实现服务端(SSR)渲染
工具: umijs:react前端应用框架. koa:基于 Node.js 平台的web 开发框架. 介绍: 本文主要是简单介绍,利用umi开发前端页面,打包成服务端渲染工程包.由Koa实现服务端渲染 ...