# 插件使用统计功能设计思路 为了实现对用户触发的指令进行统计,我需要设计一个完整的数据收集和分析系统。以下是我的思路整理: ## 1. 数据收集层 ### 核心需求 - 记录每次插件被调用的详细信息 - 包括调用者、调用时间、调用结果等 - 尽量不影响现有插件的性能 ### 实现方式 1. **装饰器模式**:创建一个装饰器函数,包装插件的`process_message`方法 2. **钩子函数**:在消息处理前后添加钩子函数,记录调用信息 3. **中间件**:在消息处理流程中添加统计中间件 ## 2. 数据存储层 ### 表结构设计 - **插件使用记录表**:记录每次调用的原始数据 - **用户使用统计表**:按用户汇总的使用情况 - **群组使用统计表**:按群组汇总的使用情况 - **插件统计汇总表**:按插件和时间维度汇总的数据 - **错误日志表**:记录插件执行错误的详细信息 ### 数据字段 - 基础信息:插件名、命令、用户ID、群组ID等 - 时间信息:调用时间、处理耗时等 - 结果信息:成功/失败、返回消息等 - 统计信息:调用次数、成功率、平均响应时间等 ## 3. 数据分析层 ### 统计维度 - 时间维度:按小时、天、周、月统计 - 用户维度:用户活跃度、偏好插件等 - 群组维度:群组活跃度、特征插件等 - 插件维度:使用频率、成功率、响应时间等 ### 分析指标 - 插件使用频率排行 - 用户活跃度排行 - 群组活跃度排行 - 命令成功率分析 - 响应时间分析 ## 4. 实现方案 ### 方案一:基于现有消息处理流程的改造 1. 在`MessagePluginInterface`中添加统计方法 2. 修改`Robot`类的消息处理流程,添加统计逻辑 3. 创建数据库操作类,处理统计数据的存储和查询 ### 方案二:独立的统计模块 1. 创建独立的统计插件,通过事件系统监听消息处理事件 2. 实现数据收集、存储和分析功能 3. 提供API接口,供Web管理界面调用 ## 5. 数据可视化 ### 看板设计 - 插件使用趋势图 - 用户活跃度热力图 - 群组活跃度排行榜 - 命令成功率饼图 - 响应时间分布图 ### 报表功能 - 定期生成使用报告 - 异常监控报警 - 性能分析报告 这个设计思路全面考虑了数据收集、存储、分析和可视化的各个环节,可以为后期的看板数据分析提供丰富的数据支持。 # 方案二:独立统计模块实现方案 如果采用方案二(独立的统计模块),我们可以创建一个专门的插件来处理统计功能。这种方式的优点是与现有代码耦合度低,可以独立开发和部署。 ## 项目目录结构 ``` d:\learn\WeChatRobot\ ├── plugins\ │ ├── stats_collector\ # 统计收集插件 │ │ ├── __init__.py # 插件初始化文件 │ │ ├── main.py # 插件主入口 │ │ ├── stats_collector.py # 统计收集核心逻辑 │ │ ├── event_handlers.py # 事件处理器 │ │ ├── config.yaml # 插件配置文件 │ │ └── README.md # 插件说明文档 │ │ │ └── stats_dashboard\ # 统计看板插件(可选) │ ├── __init__.py # 插件初始化文件 │ ├── main.py # 插件主入口 │ ├── dashboard_server.py # 看板服务器 │ ├── templates\ # 前端模板 │ │ ├── index.html # 主页 │ │ ├── plugins.html # 插件统计页 │ │ ├── users.html # 用户统计页 │ │ └── groups.html # 群组统计页 │ ├── static\ # 静态资源 │ │ ├── css\ # 样式文件 │ │ ├── js\ # JavaScript文件 │ │ └── img\ # 图片资源 │ ├── config.yaml # 插件配置文件 │ └── README.md # 插件说明文档 │ ├── db\ │ ├── stats_db.py # 统计数据库操作类 │ └── models\ │ ├── plugin_stats.py # 插件使用记录模型 │ ├── user_stats.py # 用户统计模型 │ ├── group_stats.py # 群组统计模型 │ └── error_log.py # 错误日志模型 │ ├── event_system\ │ └── events\ │ ├── plugin_events.py # 添加插件相关事件定义 │ └── stats_events.py # 统计相关事件定义 │ └── web_manager\ # Web管理界面(可选) ├── api\ │ └── stats_api.py # 统计数据API └── templates\ └── stats_dashboard.html # 统计看板页面 ``` ## 实现思路 ### 1. 事件系统扩展 在现有的事件系统中添加以下事件类型: - `PluginCallStartEvent`: 插件调用开始事件 - `PluginCallEndEvent`: 插件调用结束事件 - `PluginCallErrorEvent`: 插件调用错误事件 ### 2. 统计收集插件 `stats_collector` 插件负责: - 监听插件调用相关事件 - 收集调用信息(插件名、命令、用户、群组、时间等) - 计算处理时间 - 将数据存储到数据库 ### 3. 数据库模型 创建以下数据库表: - `t_plugin_stats`: 记录每次插件调用的详细信息 - `t_user_stats`: 按用户汇总的统计信息 - `t_group_stats`: 按群组汇总的统计信息 - `t_plugin_stats`: 按插件汇总的统计信息 - `t_error_logs`: 记录插件执行错误的详细信息 ### 4. 机器人核心修改 在 `Robot` 类的消息处理流程中添加事件触发点: - 在调用插件前触发 `PluginCallStartEvent` - 在调用插件后触发 `PluginCallEndEvent` - 在捕获到异常时触发 `PluginCallErrorEvent` ### 5. 统计看板插件(可选) `stats_dashboard` 插件负责: - 启动一个轻量级Web服务器 - 提供统计数据的可视化界面 - 支持多种维度的数据查询和展示 ### 6. Web管理界面集成(可选) 在现有的Web管理界面中添加统计看板页面,展示: - 插件使用趋势图 - 用户活跃度排行 - 群组活跃度排行 - 命令成功率分析 - 响应时间分析 ## 工作流程 1. 用户发送消息 2. 机器人处理消息,找到匹配的插件 3. 触发 `PluginCallStartEvent` 事件 4. `stats_collector` 插件记录开始时间和基本信息 5. 插件处理消息 6. 触发 `PluginCallEndEvent` 事件 7. `stats_collector` 插件计算处理时间,记录结果 8. 数据存储到数据库 9. 统计看板实时更新数据 这种实现方式可以最小化对现有代码的修改,同时提供全面的统计功能。