# 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

配置说明:

配置项 说明 默认值
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

# 🔐 权限系统设计

# 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. 收藏管理

[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

# 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

# 权限解析结果

权限编码 说明 访问级别
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

# 二、统计数据

# 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. 日统计实体

[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

# 三、用户行为

# 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. 点赞实体

[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

# 🔧 核心服务接口

# 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

# 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

# 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

# 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

# 🖥️ 前端组件说明

# 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

# 组件目录结构

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

# 📦 通用组件详解

# 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

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

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

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. 统计数据更新

统计组件会自动更新数据,也可以手动刷新:

<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

# 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

# 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

# 🔍 常见问题

# 1. 统计数据不准确

问题: 统计数据与实际不符

解决:

# 检查统计任务是否正常运行
# 检查是否有重复记录

# 手动刷新统计数据
# 查看详细错误日志
tail -f logs/record.log
1
2
3
4
5
6

# 2. 收藏/点赞重复提交

问题: 用户快速点击导致重复提交

解决:

  1. 前端添加防抖处理
  2. 后端检查是否已收藏/点赞
  3. 使用事务保证数据一致性
  4. 添加提交状态锁定
// 前端防抖示例
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

# 3. 访问记录过多

问题: Visits 表数据量过大

解决:

# 定期清理历史数据
# 设置合理的记录保留天数
# 使用分区表存储
# 归档旧数据到历史表
1
2
3
4

# 4. 匿名访问无法统计

问题: 未登录用户访问无法统计

解决:

  1. 检查是否开启匿名访问记录
  2. 使用 Cookie 或 LocalStorage 标识匿名用户
  3. 基于 IP 地址进行统计
  4. 合并匿名和登录用户数据

# 📚 相关文档


# 🔗 参考链接


最后更新: 2026-03-20