优化首页报表
This commit is contained in:
@@ -7,6 +7,8 @@
|
||||
- [backend/src/models/Ota.js](file://backend/src/models/Ota.js)
|
||||
- [backend/src/models/DashboardUser.js](file://backend/src/models/DashboardUser.js)
|
||||
- [backend/src/models/ShareCodeLog.js](file://backend/src/models/ShareCodeLog.js)
|
||||
- [backend/src/models/UserActive.js](file://backend/src/models/UserActive.js)
|
||||
- [backend/src/models/UserDevice.js](file://backend/src/models/UserDevice.js)
|
||||
- [backend/src/models/index.js](file://backend/src/models/index.js)
|
||||
- [backend/src/config/database.js](file://backend/src/config/database.js)
|
||||
- [backend/src/validators/brand.js](file://backend/src/validators/brand.js)
|
||||
@@ -17,8 +19,17 @@
|
||||
- [backend/src/routes/brands.js](file://backend/src/routes/brands.js)
|
||||
- [backend/src/routes/models.js](file://backend/src/routes/models.js)
|
||||
- [backend/src/routes/ota.js](file://backend/src/routes/ota.js)
|
||||
- [scripts/user_active.sql](file://scripts/user_active.sql)
|
||||
- [scripts/user_device.sql](file://scripts/user_device.sql)
|
||||
</cite>
|
||||
|
||||
## 更新摘要
|
||||
**变更内容**
|
||||
- 新增用户活动记录表(UserActive)用于存储日活报表数据
|
||||
- 新增设备信息表(UserDevice)用于管理用户设备关联关系
|
||||
- 扩展核心实体关系图,包含新表的字段定义和索引策略
|
||||
- 更新数据访问模式和性能考量,涵盖新增表的使用场景
|
||||
|
||||
## 目录
|
||||
1. [简介](#简介)
|
||||
2. [项目结构](#项目结构)
|
||||
@@ -32,7 +43,7 @@
|
||||
10. [附录](#附录)
|
||||
|
||||
## 简介
|
||||
本文件系统性梳理后端数据库模型与相关数据访问模式,覆盖实体关系、字段定义、数据类型、主键/外键、索引与约束、数据验证与业务规则,并给出数据库模式图、示例数据、缓存策略、性能优化建议、数据生命周期与归档策略、迁移与版本管理思路,以及数据安全与访问控制要点。重点实体包括 Brand、Model、Ota、DashboardUser、ShareCodeLog。
|
||||
本文件系统性梳理后端数据库模型与相关数据访问模式,覆盖实体关系、字段定义、数据类型、主键/外键、索引与约束、数据验证与业务规则,并给出数据库模式图、示例数据、缓存策略、性能优化建议、数据生命周期与归档策略、迁移与版本管理思路,以及数据安全与访问控制要点。重点实体包括 Brand、Model、Ota、DashboardUser、ShareCodeLog、UserActive、UserDevice。
|
||||
|
||||
## 项目结构
|
||||
- 数据模型采用 Sequelize ORM 定义,位于 backend/src/models,统一通过 backend/src/models/index.js 暴露。
|
||||
@@ -48,6 +59,8 @@ M_Model["Model<br/>型号"]
|
||||
M_Ota["Ota<br/>OTA 版本"]
|
||||
M_User["DashboardUser<br/>后台用户"]
|
||||
M_Share["ShareCodeLog<br/>分享码日志"]
|
||||
M_Active["UserActive<br/>用户活动"]
|
||||
M_Device["UserDevice<br/>用户设备"]
|
||||
end
|
||||
subgraph "配置与入口"
|
||||
C_DB["database.js<br/>MySQL 连接"]
|
||||
@@ -72,11 +85,15 @@ C_DB --> M_Model
|
||||
C_DB --> M_Ota
|
||||
C_DB --> M_User
|
||||
C_DB --> M_Share
|
||||
C_DB --> M_Active
|
||||
C_DB --> M_Device
|
||||
I_Index --> M_Brand
|
||||
I_Index --> M_Model
|
||||
I_Index --> M_Ota
|
||||
I_Index --> M_User
|
||||
I_Index --> M_Share
|
||||
I_Index --> M_Active
|
||||
I_Index --> M_Device
|
||||
V_Brand --> R_Brand
|
||||
V_Model --> R_Model
|
||||
V_Ota --> R_Ota
|
||||
@@ -92,6 +109,8 @@ R_Ota --> S_Ota
|
||||
- [backend/src/models/Ota.js:1-97](file://backend/src/models/Ota.js#L1-L97)
|
||||
- [backend/src/models/DashboardUser.js:1-58](file://backend/src/models/DashboardUser.js#L1-L58)
|
||||
- [backend/src/models/ShareCodeLog.js:1-60](file://backend/src/models/ShareCodeLog.js#L1-L60)
|
||||
- [backend/src/models/UserActive.js](file://backend/src/models/UserActive.js)
|
||||
- [backend/src/models/UserDevice.js](file://backend/src/models/UserDevice.js)
|
||||
- [backend/src/validators/brand.js:1-12](file://backend/src/validators/brand.js#L1-L12)
|
||||
- [backend/src/validators/model.js:1-22](file://backend/src/validators/model.js#L1-L22)
|
||||
- [backend/src/validators/ota.js:1-36](file://backend/src/validators/ota.js#L1-L36)
|
||||
@@ -106,7 +125,7 @@ R_Ota --> S_Ota
|
||||
- [backend/src/models/index.js:1-8](file://backend/src/models/index.js#L1-L8)
|
||||
|
||||
## 核心组件
|
||||
本节聚焦五个核心实体的字段、类型、约束与业务含义。
|
||||
本节聚焦七个核心实体的字段、类型、约束与业务含义。
|
||||
|
||||
- 品牌 Brand
|
||||
- 字段与类型:id(INTEGER, 主键, 自增)、name(STRING(100), 唯一, 非空)
|
||||
@@ -138,12 +157,28 @@ R_Ota --> S_Ota
|
||||
- 业务规则:记录导出/导入分享码的操作明细;expire_at 与导出快照关联
|
||||
- 参考路径:[ShareCodeLog 模型定义:1-60](file://backend/src/models/ShareCodeLog.js#L1-L60)
|
||||
|
||||
- 用户活动 UserActive **新增**
|
||||
- 字段与类型:id(INTEGER, 主键, 自增)、user_id(INTEGER, 非空)、device_id(INTEGER, 非空)、activity_type(ENUM('login','logout','active'), 非空)、activity_time(DATETIME, 非空)、ip_address(STRING(45))、user_agent(STRING(255))、session_id(STRING(128))、create_at(TIMESTAMP, 默认 CURRENT_TIMESTAMP)
|
||||
- 索引:idx_user_id、idx_device_id、idx_activity_time、idx_activity_type
|
||||
- 业务规则:记录用户登录、登出、活跃状态变化;支持日活统计报表生成
|
||||
- 参考路径:[UserActive 模型定义](file://backend/src/models/UserActive.js)、[user_active.sql](file://scripts/user_active.sql)
|
||||
|
||||
- 用户设备 UserDevice **新增**
|
||||
- 字段与类型:id(INTEGER, 主键, 自增)、user_id(INTEGER, 非空)、device_mac(STRING(17), 非空)、device_model(STRING(100))、device_version(STRING(50))、bind_time(DATETIME, 非空)、unbind_time(DATETIME)、status(TINYINT, 默认1)、last_active_time(DATETIME)、create_at(TIMESTAMP, 默认 CURRENT_TIMESTAMP)
|
||||
- 索引:idx_user_id、idx_device_mac、idx_status、idx_bind_time
|
||||
- 业务规则:管理用户与设备的绑定关系;跟踪设备激活状态和最后活跃时间
|
||||
- 参考路径:[UserDevice 模型定义](file://backend/src/models/UserDevice.js)、[user_device.sql](file://scripts/user_device.sql)
|
||||
|
||||
章节来源
|
||||
- [backend/src/models/Brand.js:1-23](file://backend/src/models/Brand.js#L1-L23)
|
||||
- [backend/src/models/Model.js:1-53](file://backend/src/models/Model.js#L1-L53)
|
||||
- [backend/src/models/Ota.js:1-97](file://backend/src/models/Ota.js#L1-L97)
|
||||
- [backend/src/models/DashboardUser.js:1-58](file://backend/src/models/DashboardUser.js#L1-L58)
|
||||
- [backend/src/models/ShareCodeLog.js:1-60](file://backend/src/models/ShareCodeLog.js#L1-L60)
|
||||
- [backend/src/models/UserActive.js](file://backend/src/models/UserActive.js)
|
||||
- [backend/src/models/UserDevice.js](file://backend/src/models/UserDevice.js)
|
||||
- [scripts/user_active.sql](file://scripts/user_active.sql)
|
||||
- [scripts/user_device.sql](file://scripts/user_device.sql)
|
||||
|
||||
## 架构总览
|
||||
数据库层采用 MySQL,ORM 层为 Sequelize。路由层负责请求接入与参数校验,服务层封装外部存储(S3、本地文件系统、Redis)与业务逻辑。核心实体间的关系如下:
|
||||
@@ -201,9 +236,35 @@ json eq_data
|
||||
datetime expire_at
|
||||
datetime create_at
|
||||
}
|
||||
USER_ACTIVE {
|
||||
int id PK
|
||||
int user_id
|
||||
int device_id
|
||||
enum activity_type
|
||||
datetime activity_time
|
||||
varchar ip_address
|
||||
varchar user_agent
|
||||
varchar session_id
|
||||
timestamp create_at
|
||||
}
|
||||
USER_DEVICE {
|
||||
int id PK
|
||||
int user_id
|
||||
varchar device_mac
|
||||
varchar device_model
|
||||
varchar device_version
|
||||
datetime bind_time
|
||||
datetime unbind_time
|
||||
tinyint status
|
||||
datetime last_active_time
|
||||
timestamp create_at
|
||||
}
|
||||
MODEL }o--|| BRAND : "brand_name 关联"
|
||||
OTA ||--o{ OTA : "同 model 的多版本"
|
||||
DASHBOARD_USER ||--o{ SHARE_CODE_LOG : "操作记录"
|
||||
DASHBOARD_USER ||--o{ USER_ACTIVE : "用户活动记录"
|
||||
DASHBOARD_USER ||--o{ USER_DEVICE : "设备绑定关系"
|
||||
USER_DEVICE ||--o{ USER_ACTIVE : "设备活动记录"
|
||||
```
|
||||
|
||||
图表来源
|
||||
@@ -212,6 +273,8 @@ DASHBOARD_USER ||--o{ SHARE_CODE_LOG : "操作记录"
|
||||
- [backend/src/models/Ota.js:1-97](file://backend/src/models/Ota.js#L1-L97)
|
||||
- [backend/src/models/DashboardUser.js:1-58](file://backend/src/models/DashboardUser.js#L1-L58)
|
||||
- [backend/src/models/ShareCodeLog.js:1-60](file://backend/src/models/ShareCodeLog.js#L1-L60)
|
||||
- [backend/src/models/UserActive.js](file://backend/src/models/UserActive.js)
|
||||
- [backend/src/models/UserDevice.js](file://backend/src/models/UserDevice.js)
|
||||
|
||||
## 详细组件分析
|
||||
|
||||
@@ -319,6 +382,54 @@ Route-->>Device : "返回升级信息"
|
||||
章节来源
|
||||
- [backend/src/models/ShareCodeLog.js:1-60](file://backend/src/models/ShareCodeLog.js#L1-L60)
|
||||
|
||||
### 用户活动 UserActive **新增**
|
||||
- 设计理念:专门用于记录用户活动轨迹,支持日活报表数据统计与分析。
|
||||
- 关系映射:通过 user_id 关联 DashboardUser,通过 device_id 关联 UserDevice。
|
||||
- 索引策略:针对用户ID、设备ID、活动时间、活动类型建立复合索引,优化报表查询性能。
|
||||
- 数据访问模式:
|
||||
- 活动记录:记录用户登录、登出、活跃状态变化。
|
||||
- 报表统计:按日期、用户、设备维度聚合统计数据。
|
||||
- 实时分析:支持近实时活跃度监控。
|
||||
- 参考路径:
|
||||
- [UserActive 模型定义](file://backend/src/models/UserActive.js)
|
||||
- [user_active.sql](file://scripts/user_active.sql)
|
||||
|
||||
```mermaid
|
||||
sequenceDiagram
|
||||
participant App as "应用"
|
||||
participant Active as "UserActive 模型"
|
||||
participant DB as "MySQL"
|
||||
App->>Active : "创建活动记录"
|
||||
Active->>DB : "INSERT INTO user_active"
|
||||
DB-->>Active : "插入成功"
|
||||
Active-->>App : "返回记录ID"
|
||||
Note over App,DB : "定时任务聚合统计数据用于报表"
|
||||
```
|
||||
|
||||
图表来源
|
||||
- [backend/src/models/UserActive.js](file://backend/src/models/UserActive.js)
|
||||
- [scripts/user_active.sql](file://scripts/user_active.sql)
|
||||
|
||||
章节来源
|
||||
- [backend/src/models/UserActive.js](file://backend/src/models/UserActive.js)
|
||||
- [scripts/user_active.sql](file://scripts/user_active.sql)
|
||||
|
||||
### 用户设备 UserDevice **新增**
|
||||
- 设计理念:管理用户与设备的绑定关系,跟踪设备状态和活跃情况。
|
||||
- 关系映射:通过 user_id 关联 DashboardUser,被 UserActive 通过 device_id 引用。
|
||||
- 索引策略:针对用户ID、设备MAC地址、状态、绑定时间建立索引,支持快速查询和统计。
|
||||
- 数据访问模式:
|
||||
- 设备绑定:用户注册设备时创建绑定关系。
|
||||
- 状态管理:跟踪设备激活、停用、解绑状态。
|
||||
- 活跃追踪:记录设备最后活跃时间,支持在线状态判断。
|
||||
- 参考路径:
|
||||
- [UserDevice 模型定义](file://backend/src/models/UserDevice.js)
|
||||
- [user_device.sql](file://scripts/user_device.sql)
|
||||
|
||||
章节来源
|
||||
- [backend/src/models/UserDevice.js](file://backend/src/models/UserDevice.js)
|
||||
- [scripts/user_device.sql](file://scripts/user_device.sql)
|
||||
|
||||
## 依赖分析
|
||||
- 模型依赖:各模型通过 Sequelize 连接 MySQL;models/index.js 统一导出,供路由层引用。
|
||||
- 校验依赖:路由层在写入操作前使用 Zod Schema 校验请求体,减少脏数据进入数据库。
|
||||
@@ -335,6 +446,9 @@ R_O --> S_Ota["otaStorage.js"]
|
||||
V_B["validators/brand.js"] --> R_B
|
||||
V_Mod["validators/model.js"] --> R_M
|
||||
V_O["validators/ota.js"] --> R_O
|
||||
M_Active["UserActive.js"] --> M_User["DashboardUser.js"]
|
||||
M_Active --> M_Device["UserDevice.js"]
|
||||
M_Device --> M_User["DashboardUser.js"]
|
||||
```
|
||||
|
||||
图表来源
|
||||
@@ -349,6 +463,8 @@ V_O["validators/ota.js"] --> R_O
|
||||
- [backend/src/validators/ota.js:1-36](file://backend/src/validators/ota.js#L1-L36)
|
||||
- [backend/src/services/eqCacheStorage.js:1-73](file://backend/src/services/eqCacheStorage.js#L1-L73)
|
||||
- [backend/src/services/otaStorage.js:1-113](file://backend/src/services/otaStorage.js#L1-L113)
|
||||
- [backend/src/models/UserActive.js](file://backend/src/models/UserActive.js)
|
||||
- [backend/src/models/UserDevice.js](file://backend/src/models/UserDevice.js)
|
||||
|
||||
章节来源
|
||||
- [backend/src/models/index.js:1-8](file://backend/src/models/index.js#L1-L8)
|
||||
@@ -358,9 +474,12 @@ V_O["validators/ota.js"] --> R_O
|
||||
- 查询性能
|
||||
- Model 列表:支持按 brand_name/name 过滤与按 id/create_at 排序,建议在相应列建立索引以优化分页查询。
|
||||
- ShareCodeLog:已建立 idx_mac_addr、idx_share_code、idx_create_at,满足常见筛选场景。
|
||||
- UserActive:针对用户活动统计查询,建立了 idx_user_id、idx_activity_time、idx_activity_type 复合索引,优化日活报表生成。
|
||||
- UserDevice:针对设备管理和状态查询,建立了 idx_user_id、idx_device_mac、idx_status 索引,提升设备关联查询效率。
|
||||
- 缓存策略
|
||||
- EQ 缓存:使用 Redis Hash 存储型号 EQ 数据,提供字段列表与单字段读取接口,避免一次性传输大体积 JSON。
|
||||
- OTA 包:X8 使用 S3,X9 使用本地目录,结合 MD5 前缀组织目录,便于快速定位与去重。
|
||||
- 用户活动缓存:可考虑使用 Redis 缓存热点用户的活跃状态,减少数据库压力。
|
||||
- IO 与网络
|
||||
- 测量文件与 OTA 包上传/下载涉及大量 IO 与网络,建议:
|
||||
- 限制上传文件大小与格式;
|
||||
@@ -368,6 +487,7 @@ V_O["validators/ota.js"] --> R_O
|
||||
- 对热点数据进行本地缓存或 CDN 加速。
|
||||
- 时间字段
|
||||
- create_at/update_at 默认使用数据库时间,注意时区与同步问题。
|
||||
- UserActive 和 UserDevice 使用 TIMESTAMP 类型,自动维护创建时间,便于审计和统计。
|
||||
|
||||
章节来源
|
||||
- [backend/src/models/ShareCodeLog.js:51-56](file://backend/src/models/ShareCodeLog.js#L51-L56)
|
||||
@@ -375,16 +495,18 @@ V_O["validators/ota.js"] --> R_O
|
||||
- [backend/src/services/otaStorage.js:1-113](file://backend/src/services/otaStorage.js#L1-L113)
|
||||
- [backend/src/routes/models.js:133-181](file://backend/src/routes/models.js#L133-L181)
|
||||
- [backend/src/routes/ota.js:107-143](file://backend/src/routes/ota.js#L107-L143)
|
||||
- [backend/src/models/UserActive.js](file://backend/src/models/UserActive.js)
|
||||
- [backend/src/models/UserDevice.js](file://backend/src/models/UserDevice.js)
|
||||
|
||||
## 故障排查指南
|
||||
- 品牌/型号重复
|
||||
- 现象:创建/更新时报“已存在”。
|
||||
- 现象:创建/更新时报"已存在"。
|
||||
- 排查:确认品牌名称或型号组合是否已在数据库中存在。
|
||||
- 参考路径:
|
||||
- [brands 路由重复校验:68-72](file://backend/src/routes/brands.js#L68-L72)
|
||||
- [models 路由重复校验:313-317](file://backend/src/routes/models.js#L313-L317)
|
||||
- OTA 版本冲突
|
||||
- 现象:创建/更新时报“该版本已存在”。
|
||||
- 现象:创建/更新时报"该版本已存在"。
|
||||
- 排查:verCode+model 组合唯一,检查是否已有相同版本。
|
||||
- 参考路径:
|
||||
- [ota 路由重复校验:175-181](file://backend/src/routes/ota.js#L175-L181)
|
||||
@@ -406,6 +528,18 @@ V_O["validators/ota.js"] --> R_O
|
||||
- [brands/ota/models 路由中间件:12-12](file://backend/src/routes/brands.js#L12-L12)
|
||||
- [backend/src/routes/ota.js#L105-L105:105-105](file://backend/src/routes/ota.js#L105-L105)
|
||||
- [backend/src/routes/models.js:71-71](file://backend/src/routes/models.js#L71-L71)
|
||||
- 用户活动数据异常 **新增**
|
||||
- 现象:日活报表数据不准确或缺失。
|
||||
- 排查:检查 UserActive 表索引是否正常、活动记录是否完整写入、时间字段时区是否正确。
|
||||
- 参考路径:
|
||||
- [UserActive 模型定义](file://backend/src/models/UserActive.js)
|
||||
- [user_active.sql](file://scripts/user_active.sql)
|
||||
- 设备绑定异常 **新增**
|
||||
- 现象:设备无法正确关联用户或状态不同步。
|
||||
- 排查:检查 UserDevice 表数据完整性、设备MAC地址格式、状态字段值范围。
|
||||
- 参考路径:
|
||||
- [UserDevice 模型定义](file://backend/src/models/UserDevice.js)
|
||||
- [user_device.sql](file://scripts/user_device.sql)
|
||||
|
||||
章节来源
|
||||
- [backend/src/routes/brands.js:68-72](file://backend/src/routes/brands.js#L68-L72)
|
||||
@@ -417,9 +551,11 @@ V_O["validators/ota.js"] --> R_O
|
||||
- [backend/src/routes/brands.js:12-12](file://backend/src/routes/brands.js#L12-L12)
|
||||
- [backend/src/routes/ota.js:105-105](file://backend/src/routes/ota.js#L105-L105)
|
||||
- [backend/src/routes/models.js:71-71](file://backend/src/routes/models.js#L71-L71)
|
||||
- [backend/src/models/UserActive.js](file://backend/src/models/UserActive.js)
|
||||
- [backend/src/models/UserDevice.js](file://backend/src/models/UserDevice.js)
|
||||
|
||||
## 结论
|
||||
本数据库设计以简洁的实体与清晰的业务边界为核心,通过校验层与服务层实现输入约束与外部集成解耦。Model 与 Brand 通过文本字段关联,Ota 以 verCode+model 组合唯一,ShareCodeLog 提供完整审计轨迹。建议后续完善外键约束、补充索引与分区策略,并制定数据生命周期与归档规范。
|
||||
本数据库设计以简洁的实体与清晰的业务边界为核心,通过校验层与服务层实现输入约束与外部集成解耦。Model 与 Brand 通过文本字段关联,Ota 以 verCode+model 组合唯一,ShareCodeLog 提供完整审计轨迹。**新增的 UserActive 和 UserDevice 表完善了用户活动和设备管理能力,为日活报表统计提供了坚实的数据基础**。建议后续完善外键约束、补充索引与分区策略,并制定数据生命周期与归档规范。
|
||||
|
||||
## 附录
|
||||
|
||||
@@ -433,11 +569,19 @@ V_O["validators/ota.js"] --> R_O
|
||||
- OTA
|
||||
- verCode 整数;verName、url、md5 长度限制;force/target/beta/status 0/1 限定
|
||||
- 参考路径:[OTA 校验:1-36](file://backend/src/validators/ota.js#L1-L36)
|
||||
- 用户活动 **新增**
|
||||
- 用户ID和设备ID必填;活动类型限定为 login/logout/active;活动时间必须有效
|
||||
- 参考路径:[UserActive 模型定义](file://backend/src/models/UserActive.js)
|
||||
- 用户设备 **新增**
|
||||
- 用户ID和设备MAC必填;设备状态限定为 0/1;绑定时间必须早于解绑时间
|
||||
- 参考路径:[UserDevice 模型定义](file://backend/src/models/UserDevice.js)
|
||||
|
||||
章节来源
|
||||
- [backend/src/validators/brand.js:1-12](file://backend/src/validators/brand.js#L1-L12)
|
||||
- [backend/src/validators/model.js:1-22](file://backend/src/validators/model.js#L1-L22)
|
||||
- [backend/src/validators/ota.js:1-36](file://backend/src/validators/ota.js#L1-L36)
|
||||
- [backend/src/models/UserActive.js](file://backend/src/models/UserActive.js)
|
||||
- [backend/src/models/UserDevice.js](file://backend/src/models/UserDevice.js)
|
||||
|
||||
### 示例数据
|
||||
- 品牌 Brand
|
||||
@@ -450,6 +594,10 @@ V_O["validators/ota.js"] --> R_O
|
||||
- id: 1, username: "admin", password_hash: "$2b$...", is_super_admin: 1, status: 1, create_at: "2025-01-01 12:00:00", update_at: "2025-01-01 12:00:00"
|
||||
- 分享码日志 ShareCodeLog
|
||||
- id: 1, mac_addr: "AA:BB:CC:DD:EE:FF", share_code: "ABCDE", action: "export", ip_addr: "::ffff:127.0.0.1", eq_data: "{}", create_at: "2025-01-01 12:00:00"
|
||||
- 用户活动 UserActive **新增**
|
||||
- id: 1, user_id: 1, device_id: 1, activity_type: "login", activity_time: "2025-01-01 12:00:00", ip_address: "192.168.1.100", user_agent: "Mozilla/5.0", session_id: "abc123def456", create_at: "2025-01-01 12:00:00"
|
||||
- 用户设备 UserDevice **新增**
|
||||
- id: 1, user_id: 1, device_mac: "AA:BB:CC:DD:EE:FF", device_model: "X8", device_version: "v1.0.0", bind_time: "2025-01-01 12:00:00", unbind_time: null, status: 1, last_active_time: "2025-01-01 12:00:00", create_at: "2025-01-01 12:00:00"
|
||||
|
||||
### 数据访问模式与缓存策略
|
||||
- Model
|
||||
@@ -460,35 +608,52 @@ V_O["validators/ota.js"] --> R_O
|
||||
- 上传包:S3 或本地存储,返回下载地址
|
||||
- 最新版本查询:按 verCode 与 hw 过滤
|
||||
- 参考路径:[ota 路由:24-102](file://backend/src/routes/ota.js#L24-L102), [otaStorage:1-113](file://backend/src/services/otaStorage.js#L1-L113)
|
||||
- 用户活动 **新增**
|
||||
- 活动记录:异步写入,支持批量插入优化
|
||||
- 报表统计:定时任务聚合,按日/周/月维度统计
|
||||
- 参考路径:[UserActive 模型定义](file://backend/src/models/UserActive.js)
|
||||
- 用户设备 **新增**
|
||||
- 设备绑定:事务处理,确保数据一致性
|
||||
- 状态同步:实时更新设备最后活跃时间
|
||||
- 参考路径:[UserDevice 模型定义](file://backend/src/models/UserDevice.js)
|
||||
|
||||
章节来源
|
||||
- [backend/src/routes/models.js:133-569](file://backend/src/routes/models.js#L133-L569)
|
||||
- [backend/src/services/eqCacheStorage.js:1-73](file://backend/src/services/eqCacheStorage.js#L1-L73)
|
||||
- [backend/src/routes/ota.js:24-102](file://backend/src/routes/ota.js#L24-L102)
|
||||
- [backend/src/services/otaStorage.js:1-113](file://backend/src/services/otaStorage.js#L1-L113)
|
||||
- [backend/src/models/UserActive.js](file://backend/src/models/UserActive.js)
|
||||
- [backend/src/models/UserDevice.js](file://backend/src/models/UserDevice.js)
|
||||
|
||||
### 数据生命周期、保留策略与归档规则
|
||||
- 建议
|
||||
- ShareCodeLog:按月清理历史日志,保留必要审计周期(如 90 天)。
|
||||
- OTA:旧版本保留 3-6 个月或按产品策略归档;S3/本地定期清理过期包。
|
||||
- Model:测量文件与 EQ 缓存按访问频率与容量阈值进行轮转。
|
||||
- UserActive:**新增** 用户活动数据按季度归档,保留 1-2 年用于趋势分析,原始数据超过 6 个月可压缩存储。
|
||||
- UserDevice:**新增** 设备绑定关系永久保留,但停用设备信息可标记归档,减少热数据量。
|
||||
- 实施要点
|
||||
- 为 ShareCodeLog 增加 expire_at 字段与自动清理任务。
|
||||
- 为 OTA 增加归档标记与版本保留策略。
|
||||
- 对 S3/本地存储建立配额与过期清理机制。
|
||||
|
||||
[本节为通用建议,不直接分析具体文件]
|
||||
- **新增** 为 UserActive 建立分区表,按时间分区便于历史数据清理。
|
||||
- **新增** 为 UserDevice 建立冷热数据分离策略,长期不活跃设备移至归档表。
|
||||
|
||||
### 数据迁移路径与版本管理
|
||||
- 建议
|
||||
- 使用数据库迁移工具(如 Sequelize CLI)管理结构变更。
|
||||
- 新增字段采用非空默认值或分阶段上线,避免影响在线服务。
|
||||
- 对于索引与约束,先添加再回填数据,最后替换为严格约束。
|
||||
- **新增** UserActive 和 UserDevice 表应作为独立迁移脚本执行,确保向后兼容。
|
||||
- 参考路径
|
||||
- [database.js 定义:1-24](file://backend/src/config/database.js#L1-L24)
|
||||
- [user_active.sql](file://scripts/user_active.sql)
|
||||
- [user_device.sql](file://scripts/user_device.sql)
|
||||
|
||||
章节来源
|
||||
- [backend/src/config/database.js:1-24](file://backend/src/config/database.js#L1-L24)
|
||||
- [scripts/user_active.sql](file://scripts/user_active.sql)
|
||||
- [scripts/user_device.sql](file://scripts/user_device.sql)
|
||||
|
||||
### 数据安全、隐私与访问控制
|
||||
- 访问控制
|
||||
@@ -496,10 +661,14 @@ V_O["validators/ota.js"] --> R_O
|
||||
- 参考路径:[brands/ota/models 路由中间件:12-12](file://backend/src/routes/brands.js#L12-L12), [backend/src/routes/ota.js#L105-L105:105-105](file://backend/src/routes/ota.js#L105-L105), [backend/src/routes/models.js:71-71](file://backend/src/routes/models.js#L71-L71)
|
||||
- 数据脱敏
|
||||
- 日志中避免输出敏感字段(如密码哈希);对外接口仅返回必要字段。
|
||||
- **新增** UserActive 中的 user_agent 和 session_id 应在日志中脱敏处理。
|
||||
- 合规
|
||||
- 对用户数据与操作日志遵循最小化原则,遵守隐私政策与数据保留期限。
|
||||
- **新增** 用户活动数据收集应符合 GDPR 等隐私法规要求,提供用户数据删除选项。
|
||||
|
||||
章节来源
|
||||
- [backend/src/routes/brands.js:12-12](file://backend/src/routes/brands.js#L12-L12)
|
||||
- [backend/src/routes/ota.js:105-105](file://backend/src/routes/ota.js#L105-L105)
|
||||
- [backend/src/routes/models.js:71-71](file://backend/src/routes/models.js#L71-L71)
|
||||
- [backend/src/routes/models.js:71-71](file://backend/src/routes/models.js#L71-L71)
|
||||
- [backend/src/models/UserActive.js](file://backend/src/models/UserActive.js)
|
||||
- [backend/src/models/UserDevice.js](file://backend/src/models/UserDevice.js)
|
||||
Reference in New Issue
Block a user