# Record 访问记录模块
Record 模块是 DarkM 框架的访问记录和统计模块,提供了完整的访问追踪和统计功能。支持访问记录、收藏、点赞、分享、下载等功能,满足企业用户行为分析需求。
# 📋 模块概述
| 属性 | 说明 |
|---|---|
| 模块名称 | Record(访问记录) |
| 模块类型 | 业务模块 |
| 依赖关系 | 依赖 Admin 模块、Common 模块 |
| 必需性 | 可选(用户行为分析必需) |
| Git 仓库 | framework/darkm/darkm (opens new window) |
# 🎯 核心功能
# 功能清单
| 功能分类 | 功能 | 说明 | 重要性 |
|---|---|---|---|
| 访问记录 | 访问记录 | 用户访问记录 | ⭐⭐⭐⭐⭐ |
| 搜索记录 | 用户搜索记录 | ⭐⭐⭐⭐ | |
| 统计数据 | 总统计 | 总访问统计 | ⭐⭐⭐⭐⭐ |
| 日统计 | 每日访问统计 | ⭐⭐⭐⭐⭐ | |
| 月统计 | 每月访问统计 | ⭐⭐⭐⭐ | |
| 账户统计 | 账户维度统计 | ⭐⭐⭐⭐ | |
| 用户行为 | 收藏 | 用户收藏记录 | ⭐⭐⭐⭐ |
| 点赞 | 用户点赞记录 | ⭐⭐⭐⭐ | |
| 分享 | 用户分享记录 | ⭐⭐⭐⭐ | |
| 下载 | 用户下载记录 | ⭐⭐⭐⭐ |
# 📦 安装配置
# NuGet 包安装
Install-Package DarkM.Module.Record.Web -Version 1.0.0
1
# NPM 包安装
npm i -S darkm-module-record
1
# 配置文件
{
"Db": {
"Modules": [
{
"Name": "Record",
"Database": "Nm_Record",
"Prefix": ""
}
]
},
"Record": {
// 是否开启访问记录服务
"Enable": true,
// 访问记录保留天数
"LogKeepDays": 180,
// 是否开启匿名访问记录
"EnableAnonymous": true
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
配置说明:
| 配置项 | 说明 | 默认值 |
|---|---|---|
Enable | 是否开启访问记录服务 | true |
LogKeepDays | 访问记录保留天数 | 180 |
EnableAnonymous | 是否开启匿名访问记录 | true |
# 🗄️ 数据库表结构
# 访问统计表
| 表名 | 说明 | 主键 |
|---|---|---|
Visits | 访问记录表 | Id (long) |
CounterTotal | 总统计表 | Id (long) |
CounterDay | 日统计表 | Id (long) |
CounterMonth | 月统计表 | Id (long) |
CounterAccount | 账户统计表 | Id (long) |
# 用户行为表
| 表名 | 说明 | 主键 |
|---|---|---|
Favorites | 收藏记录表 | Id (long) |
Thumbs | 点赞记录表 | Id (long) |
Share | 分享记录表 | Id (long) |
Downloads | 下载记录表 | Id (long) |
Seek | 搜索记录表 | Id (long) |
# 统计基类
/// <summary>
/// 计数器基类实体
/// </summary>
public abstract class CounterBaseEntity
{
/// <summary>
/// 访问次数
/// </summary>
public long VisitCount { get; set; }
/// <summary>
/// 收藏次数
/// </summary>
public long FavoriteCount { get; set; }
/// <summary>
/// 点赞次数
/// </summary>
public long ThumbsCount { get; set; }
/// <summary>
/// 分享次数
/// </summary>
public long ShareCount { get; set; }
/// <summary>
/// 下载次数
/// </summary>
public long DownloadCount { get; set; }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# 🔐 权限系统设计
# Controller 定义
# 1. 访问记录管理
[Description("访问记录管理")]
public class VisitsController : ModuleController
{
private readonly IVisitsService _service;
public VisitsController(IVisitsService service)
{
_service = service;
}
[HttpGet]
[Description("查询")]
public Task<IResultModel> Query([FromQuery]VisitsQueryModel model)
{
return _service.Query(model);
}
[HttpPost]
[Description("添加")]
public Task<IResultModel> Add(VisitsAddModel model)
{
return _service.Add(model);
}
[HttpDelete]
[Description("删除")]
public Task<IResultModel> Delete([BindRequired]long id)
{
return _service.Delete(id);
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
# 2. 收藏管理
[Description("收藏管理")]
public class FavoritesController : ModuleController
{
private readonly IFavoritesService _service;
public FavoritesController(IFavoritesService service)
{
_service = service;
}
[HttpGet]
[Description("查询")]
public Task<IResultModel> Query([FromQuery]FavoritesQueryModel model)
{
return _service.Query(model);
}
[HttpPost]
[Description("添加收藏")]
public Task<IResultModel> Add(FavoritesAddModel model)
{
return _service.Add(model);
}
[HttpDelete]
[Description("取消收藏")]
public Task<IResultModel> Delete([BindRequired]long id)
{
return _service.Delete(id);
}
[HttpGet]
[Description("检查是否已收藏")]
public Task<IResultModel<bool>> IsFavorite([FromQuery]FavoritesQueryModel model)
{
return _service.IsFavorite(model);
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
# 3. 点赞管理
[Description("点赞管理")]
public class ThumbsController : ModuleController
{
private readonly IThumbsService _service;
public ThumbsController(IThumbsService service)
{
_service = service;
}
[HttpPost]
[Description("点赞")]
public Task<IResultModel> Thumb(ThumbsAddModel model)
{
return _service.Thumb(model);
}
[HttpDelete]
[Description("取消点赞")]
public Task<IResultModel> CancelThumb([BindRequired]long id)
{
return _service.CancelThumb(id);
}
[HttpGet]
[Description("检查是否已点赞")]
public Task<IResultModel<bool>> IsThumb([FromQuery]ThumbsQueryModel model)
{
return _service.IsThumb(model);
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
# 权限解析结果
| 权限编码 | 说明 | 访问级别 |
|---|---|---|
record_visits_query_get | 访问记录 - 查询 | 需授权 |
record_visits_add_post | 访问记录 - 添加 | 需授权 |
record_counterTotal_query_get | 总统计 - 查询 | 需授权 |
record_counterDay_query_get | 日统计 - 查询 | 需授权 |
record_counterMonth_query_get | 月统计 - 查询 | 需授权 |
record_favorites_query_get | 收藏 - 查询 | 需授权 |
record_favorites_add_post | 收藏 - 添加 | 需授权 |
record_favorites_delete_delete | 收藏 - 删除 | 需授权 |
record_thumbs_thumb_post | 点赞 - 点赞 | 需授权 |
record_thumbs_cancelThumb_delete | 点赞 - 取消 | 需授权 |
record_share_post | 分享 - 分享 | 需授权 |
record_downloads_add_post | 下载 - 添加 | 需授权 |
# 🎨 核心功能详解
# 一、访问记录
# 1. 访问记录实体
[Table("Visits")]
public partial class VisitsEntity : EntityBase
{
/// <summary>
/// 用户 ID
/// </summary>
[Nullable]
public Guid? AccountId { get; set; }
/// <summary>
/// 访问目标类型(Article/Product 等)
/// </summary>
[Length(50)]
public string TargetType { get; set; }
/// <summary>
/// 访问目标 ID
/// </summary>
public long TargetId { get; set; }
/// <summary>
/// IP 地址
/// </summary>
[Length(50)]
public string IPAddress { get; set; }
/// <summary>
/// User-Agent
/// </summary>
[Length(500)]
public string UserAgent { get; set; }
/// <summary>
/// 访问时间
/// </summary>
public DateTime VisitTime { get; set; }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
# 二、统计数据
# 1. 总统计实体
[Table("CounterTotal")]
public partial class CounterTotalEntity : CounterBaseEntity
{
/// <summary>
/// 目标类型
/// </summary>
[Length(50)]
public string TargetType { get; set; }
/// <summary>
/// 目标 ID
/// </summary>
public long TargetId { get; set; }
/// <summary>
/// 最后更新时间
/// </summary>
public DateTime LastUpdateTime { get; set; }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 2. 日统计实体
[Table("CounterDay")]
public partial class CounterDayEntity : CounterBaseEntity
{
/// <summary>
/// 目标类型
/// </summary>
[Length(50)]
public string TargetType { get; set; }
/// <summary>
/// 目标 ID
/// </summary>
public long TargetId { get; set; }
/// <summary>
/// 统计日期
/// </summary>
public DateTime StatDate { get; set; }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 三、用户行为
# 1. 收藏实体
[Table("Favorites")]
public partial class FavoritesEntity : EntityBase
{
/// <summary>
/// 用户 ID
/// </summary>
public Guid AccountId { get; set; }
/// <summary>
/// 目标类型
/// </summary>
[Length(50)]
public string TargetType { get; set; }
/// <summary>
/// 目标 ID
/// </summary>
public long TargetId { get; set; }
/// <summary>
/// 收藏时间
/// </summary>
public DateTime FavoriteTime { get; set; }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 2. 点赞实体
[Table("Thumbs")]
public partial class ThumbsEntity : EntityBase
{
/// <summary>
/// 用户 ID
/// </summary>
public Guid AccountId { get; set; }
/// <summary>
/// 目标类型
/// </summary>
[Length(50)]
public string TargetType { get; set; }
/// <summary>
/// 目标 ID
/// </summary>
public long TargetId { get; set; }
/// <summary>
/// 点赞时间
/// </summary>
public DateTime ThumbTime { get; set; }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 🔧 核心服务接口
# IVisitsService(访问记录服务)
public interface IVisitsService
{
/// <summary>
/// 查询访问记录列表
/// </summary>
Task<IResultModel> Query(VisitsQueryModel model);
/// <summary>
/// 添加访问记录
/// </summary>
Task<IResultModel> Add(VisitsAddModel model);
/// <summary>
/// 删除访问记录
/// </summary>
Task<IResultModel> Delete(long id);
/// <summary>
/// 记录访问
/// </summary>
Task<IResultModel> RecordVisit(string targetType, long targetId, Guid? accountId = null);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# IFavoritesService(收藏服务)
public interface IFavoritesService
{
/// <summary>
/// 查询收藏列表
/// </summary>
Task<IResultModel> Query(FavoritesQueryModel model);
/// <summary>
/// 添加收藏
/// </summary>
Task<IResultModel> Add(FavoritesAddModel model);
/// <summary>
/// 删除收藏
/// </summary>
Task<IResultModel> Delete(long id);
/// <summary>
/// 检查是否已收藏
/// </summary>
Task<IResultModel<bool>> IsFavorite(FavoritesQueryModel model);
/// <summary>
/// 切换收藏状态
/// </summary>
Task<IResultModel<bool>> ToggleFavorite(FavoritesAddModel model);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# IThumbsService(点赞服务)
public interface IThumbsService
{
/// <summary>
/// 查询点赞列表
/// </summary>
Task<IResultModel> Query(ThumbsQueryModel model);
/// <summary>
/// 点赞
/// </summary>
Task<IResultModel> Thumb(ThumbsAddModel model);
/// <summary>
/// 取消点赞
/// </summary>
Task<IResultModel> CancelThumb(long id);
/// <summary>
/// 检查是否已点赞
/// </summary>
Task<IResultModel<bool>> IsThumb(ThumbsQueryModel model);
/// <summary>
/// 获取点赞数量
/// </summary>
Task<IResultModel<long>> GetThumbCount(string targetType, long targetId);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# ICounterTotalService(总统计服务)
public interface ICounterTotalService
{
/// <summary>
/// 查询总统计列表
/// </summary>
Task<IResultModel> Query(CounterTotalQueryModel model);
/// <summary>
/// 增加访问次数
/// </summary>
Task<IResultModel> IncrementVisit(string targetType, long targetId);
/// <summary>
/// 增加收藏次数
/// </summary>
Task<IResultModel> IncrementFavorite(string targetType, long targetId);
/// <summary>
/// 增加点赞次数
/// </summary>
Task<IResultModel> IncrementThumb(string targetType, long targetId);
/// <summary>
/// 获取统计数据
/// </summary>
Task<IResultModel<CounterTotalEntity>> GetStat(string targetType, long targetId);
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# 🖥️ 前端组件说明
# NPM 包信息
{
"name": "darkm-module-record",
"version": "1.5.0-beta-2.0",
"code": "record",
"title": "访问记录",
"dependencies": {
"darkm-module-admin": "^1.5.0-beta-2.0",
"darkm-module-common": "^1.5.0-beta-2.0",
"darkm-ui": "^1.5.0-beta-2.0"
}
}
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
# 组件目录结构
src/UI/module-record/
├── src/
│ ├── views/ # 页面组件
│ │ ├── counterTotal/ # 总统计
│ │ ├── counterDay/ # 日统计
│ │ ├── counterMonth/ # 月统计
│ │ ├── visits/ # 访问记录
│ │ ├── favorites/ # 收藏记录
│ │ ├── thumbs/ # 点赞记录
│ │ └── seek/ # 搜索记录
│ └── components/ # 通用组件
│ ├── record-counter-total/ # 总统计组件
│ ├── record-counter-day/ # 日统计组件
│ ├── record-counter-month/ # 月统计组件
│ └── config-record/ # 记录配置组件
└── package.json
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 📦 通用组件详解
# 1. RecordCounterTotal 总统计组件
组件路径: components/record-counter-total
功能: 显示目标总统计数据(访问、收藏、点赞等)
使用示例:
<template>
<record-counter-total
:targetType="targetType"
:targetId="targetId"
@visit="handleVisit"
@favorite="handleFavorite"
@thumb="handleThumb"
/>
</template>
<script>
import { components } from 'darkm-module-record'
const { RecordCounterTotal } = components
export default {
components: { RecordCounterTotal },
data() {
return {
targetType: 'Article',
targetId: 1
}
},
methods: {
handleVisit() {
console.log('访问 +1')
},
handleFavorite() {
console.log('收藏状态变化')
},
handleThumb() {
console.log('点赞状态变化')
}
}
}
</script>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
Props 参数:
| 参数 | 类型 | 必填 | 默认值 | 说明 |
|---|---|---|---|---|
targetType | String | 是 | - | 目标类型(Article/Product 等) |
targetId | Number | 是 | - | 目标 ID |
showVisit | Boolean | 否 | true | 是否显示访问数 |
showFavorite | Boolean | 否 | true | 是否显示收藏数 |
showThumb | Boolean | 否 | true | 是否显示点赞数 |
showShare | Boolean | 否 | false | 是否显示分享数 |
showDownload | Boolean | 否 | false | 是否显示下载数 |
Events 事件:
| 事件名 | 参数 | 说明 |
|---|---|---|
visit | - | 点击访问时触发 |
favorite | (isFavorite: Boolean) | 收藏状态变化时触发 |
thumb | (isThumb: Boolean) | 点赞状态变化时触发 |
share | - | 点击分享时触发 |
download | - | 点击下载时触发 |
# 2. RecordCounterDay 日统计组件
组件路径: components/record-counter-day
功能: 显示目标日统计数据
使用示例:
<template>
<record-counter-day
:targetType="targetType"
:targetId="targetId"
:date="currentDate"
/>
</template>
<script>
import { components } from 'darkm-module-record'
const { RecordCounterDay } = components
export default {
components: { RecordCounterDay },
data() {
return {
targetType: 'Article',
targetId: 1,
currentDate: '2026-03-20'
}
}
}
</script>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Props 参数:
| 参数 | 类型 | 必填 | 默认值 | 说明 |
|---|---|---|---|---|
targetType | String | 是 | - | 目标类型 |
targetId | Number | 是 | - | 目标 ID |
date | String | 否 | 今天 | 统计日期(YYYY-MM-DD) |
# 3. RecordCounterMonth 月统计组件
组件路径: components/record-counter-month
功能: 显示目标月统计数据
使用示例:
<template>
<record-counter-month
:targetType="targetType"
:targetId="targetId"
:yearMonth="currentMonth"
/>
</template>
<script>
import { components } from 'darkm-module-record'
const { RecordCounterMonth } = components
export default {
components: { RecordCounterMonth },
data() {
return {
targetType: 'Article',
targetId: 1,
currentMonth: '2026-03'
}
}
}
</script>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Props 参数:
| 参数 | 类型 | 必填 | 默认值 | 说明 |
|---|---|---|---|---|
targetType | String | 是 | - | 目标类型 |
targetId | Number | 是 | - | 目标 ID |
yearMonth | String | 否 | 本月 | 统计年月(YYYY-MM) |
# 📋 组件使用注意事项
# 1. 组件引入方式
// 方式一:引入单个组件
import { components } from 'darkm-module-record'
const { RecordCounterTotal } = components
// 方式二:全局注册
import Record from 'darkm-module-record'
Vue.use(Record)
1
2
3
4
5
6
7
2
3
4
5
6
7
# 2. 统计数据更新
统计组件会自动更新数据,也可以手动刷新:
<template>
<record-counter-total
ref="counter"
:targetType="targetType"
:targetId="targetId"
/>
</template>
<script>
export default {
methods: {
refreshStat() {
this.$refs.counter.refresh()
}
}
}
</script>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 3. 用户行为记录
记录用户行为时,建议先检查登录状态:
async function handleFavorite() {
// 检查登录状态
if (!this.isLoggedIn) {
this.$message.warning('请先登录')
return
}
// 调用收藏接口
await this.$api.record.favorite.toggle({
targetType: 'Article',
targetId: this.articleId
})
}
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
# 4. 数据格式
所有组件返回的数据格式:
- 统计数据: 返回对象
{ visitCount, favoriteCount, thumbsCount, shareCount, downloadCount } - 事件回调: 返回相应的状态或数据
# 5. 组件依赖
Record 模块依赖以下模块:
darkm-module-admin- 权限管理darkm-module-common- 通用模块darkm-ui- UI 组件库
确保先安装依赖:
npm install darkm-module-admin --registry http://npm.woowis.com
npm install darkm-module-common --registry http://npm.woowis.com
npm install darkm-ui --registry http://npm.woowis.com
1
2
3
2
3
# 🔍 常见问题
# 1. 统计数据不准确
问题: 统计数据与实际不符
解决:
# 检查统计任务是否正常运行
# 检查是否有重复记录
# 手动刷新统计数据
# 查看详细错误日志
tail -f logs/record.log
1
2
3
4
5
6
2
3
4
5
6
# 2. 收藏/点赞重复提交
问题: 用户快速点击导致重复提交
解决:
- 前端添加防抖处理
- 后端检查是否已收藏/点赞
- 使用事务保证数据一致性
- 添加提交状态锁定
// 前端防抖示例
let isSubmitting = false
async function handleThumb() {
if (isSubmitting) return
isSubmitting = true
try {
await api.thumb()
} finally {
isSubmitting = false
}
}
1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
# 3. 访问记录过多
问题: Visits 表数据量过大
解决:
# 定期清理历史数据
# 设置合理的记录保留天数
# 使用分区表存储
# 归档旧数据到历史表
1
2
3
4
2
3
4
# 4. 匿名访问无法统计
问题: 未登录用户访问无法统计
解决:
- 检查是否开启匿名访问记录
- 使用 Cookie 或 LocalStorage 标识匿名用户
- 基于 IP 地址进行统计
- 合并匿名和登录用户数据
# 📚 相关文档
- Admin 权限管理 - 权限配置
- PageForm 页面表单 - 页面配置
- Common 通用模块 - 通用功能
- 系统架构 - 整体架构
# 🔗 参考链接
- 访问统计最佳实践 (opens new window)
- 用户行为分析 (opens new window)
- 数据性能优化 (opens new window)
- GitLab 仓库 (opens new window)
最后更新: 2026-03-20