原文链接
https://nvuai.cc/en/en/docs/business-services/common-business-services/user-preference-service.md用户偏好服务
本文引用的源码与文档
本文引用的文件
- backend/app/services/common/user_preference_service.py
- backend/app/services/common/notification_preference_service.py
- backend/app/models/common/user_preference.py
- backend/app/models/common/notification_preference.py
- backend/app/enums/role.py
- backend/app/api/tenant/preferences.py
- backend/app/api/admin/preferences.py
- backend/app/api/tenant/notification_preferences.py
- backend/app/api/admin/notification_preferences.py
- backend/app/services/common/notification_service.py
- backend/migrations/versions/20260314_0927_add_user_preferences_table.py
目录
简介
本技术文档围绕“用户偏好服务” 展开,系统性阐述两类偏好能力:
- 用户偏好设置:支持系统默认、全局基线与个人覆盖的三层分层合并,具备默认值管理、批量更新与权限控制。
- 通知偏好管理:支持按通知分类的渠道偏好(实时推送、站内信、邮件),并提供全局默认到个人覆盖的继承规则。
文档同时涵盖:
- 偏好数据模型与约束
- 分层继承策略与权限控制机制
- 与认证系统的集成方式与数据一致性保障
- API 接口说明、使用示例与扩展建议
项目结构
用户偏好服务主要由以下层次构成:
- 模型层:用户偏好与通知偏好的数据库映射
- 服务层:用户偏好服务与通知偏好服务,负责读取、合并、更新与清理
- API 层:面向租户与管理端的偏好与通知偏好接口
- 业务集成:通知服务在发送前统一查询用户通知偏好
图表来源
- backend/app/models/common/user_preference.py:15-78
- backend/app/models/common/notification_preference.py:16-88
- backend/app/services/common/user_preference_service.py:133-414
- backend/app/services/common/notification_preference_service.py:38-287
- backend/app/api/tenant/preferences.py:1-200
- backend/app/api/admin/preferences.py:1-200
- backend/app/api/tenant/notification_preferences.py:1-200
- backend/app/api/admin/notification_preferences.py:1-200
- backend/app/services/common/notification_service.py:1-600
章节来源
- backend/app/models/common/user_preference.py:1-78
- backend/app/models/common/notification_preference.py:1-88
- backend/app/services/common/user_preference_service.py:1-414
- backend/app/services/common/notification_preference_service.py:1-287
- backend/app/api/tenant/preferences.py:1-200
- backend/app/api/admin/preferences.py:1-200
- backend/app/api/tenant/notification_preferences.py:1-200
- backend/app/api/admin/notification_preferences.py:1-200
- backend/app/services/common/notification_service.py:1-600
核心组件
- 用户偏好服务(UserPreferenceService)
- 提供系统默认、全局与个人三层合并读取
- 支持全局更新并精确清理受影响的个人覆盖键
- 支持个人覆盖更新与重置
- 通知偏好服务(NotificationPreferenceService)
- 支持按通知分类的渠道偏好(WS/站内信/邮件)
- 支持全局默认到个人覆盖的继承
- 支持批量更新与个人偏好重置
章节来源
- backend/app/services/common/user_preference_service.py:133-414
- backend/app/services/common/notification_preference_service.py:38-287
架构总览
用户偏好与通知偏好均采用“分层继承 + 权限隔离”的设计:
- 分层继承
- 用户偏好:系统默认 → 全局基线 → 个人覆盖
- 通知偏好:个人 → 全局(按用户类型映射)→ 默认值
- 权限隔离
- 平台级与租户级分别维护独立的全局基线
- 管理端与租户端分别维护独立的作用域
- 数据一致性
- 全局更新时,对受影响的个人覆盖键进行精确清理,避免脏合并
- 通过唯一约束确保同一作用域/租户/用户的偏好记 录唯一
图表来源
- backend/app/services/common/user_preference_service.py:143-166
- backend/app/services/common/notification_preference_service.py:168-225
详细组件分析
用户偏好服务(UserPreferenceService)
- 数据模型
- 存储字段:scope、tenant_id、user_id、preferences(JSON)、version
- 唯一约束:scope + tenant_id + user_id
- 分层策略
- 系统默认:内置默认值集合
- 全局基线:按 scope 与 tenant_id 查询
- 个人覆盖:按 scope、tenant_id 与 user_id 查询
- 关键流程
- 合并读取:系统默认 + 全局基线 + 个人覆盖
- 全局更新:过滤合法键、计算变更键、更新全局记录、精确清理受影响的个人键
- 个人更新:过滤全局专属键、更新个人记录
- 重置个人: 清空个人覆盖,返回全局默认
图表来源
- backend/app/models/common/user_preference.py:15-78
- backend/app/services/common/user_preference_service.py:133-414
章节来源
- backend/app/models/common/user_preference.py:15-78
- backend/app/services/common/user_preference_service.py:133-414
通知偏好服务(NotificationPreferenceService)
- 数据模型
- 存储字段:user_type、tenant_id、user_id、category、channel_ws、channel_email、channel_inbox
- 唯一约束:user_type + tenant_id + user_id + category
- 分类与默认
- 通知分类:system、ai、task、biz、audit
- 默认值:WS/站内信默认开启,邮件默认关闭
- 分层策略
- 个人偏好优先;若不存在则回退到全局偏好(按 user_type 映射);若仍不存在则使用默认值
- 关键流程
- 全局更新:批量 upsert、记录变更分类、精确删除受影响的个人行
- 个人读取:逐分类合并(个人 > 全局 > 默认)
- 个人更新:批量 upsert
- 重置个人:删除个人偏好记录,回退到全局默认
图表来源
- backend/app/models/common/notification_preference.py:16-88
- backend/app/services/common/notification_preference_service.py:38-287
章节来源
- backend/app/models/common/notification_preference.py:16-88
- backend/app/services/common/notification_preference_service.py:38-287