优化首页报表

This commit is contained in:
eafonyang
2026-07-24 15:12:15 +08:00
parent 3a0108dc54
commit 22a24056d6
18 changed files with 1312 additions and 184 deletions
@@ -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, 主键, 自增)、nameSTRING(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_idINTEGER, 非空)、device_idINTEGER, 非空)、activity_typeENUM('login','logout','active'), 非空)、activity_timeDATETIME, 非空)、ip_addressSTRING(45))、user_agentSTRING(255))、session_idSTRING(128))、create_atTIMESTAMP, 默认 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_idINTEGER, 非空)、device_macSTRING(17), 非空)、device_modelSTRING(100))、device_versionSTRING(50))、bind_timeDATETIME, 非空)、unbind_timeDATETIME)、statusTINYINT, 默认1)、last_active_timeDATETIME)、create_atTIMESTAMP, 默认 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)
## 架构总览
数据库层采用 MySQLORM 层为 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 连接 MySQLmodels/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)