新增 6 个模块,把好感度变化的全部副作用收敛到一个调用入口:
- counters.py (P2-02):Redis 三类计数器
- affinity💿{device_id}:{rule_key} 冷却
- affinity:daily:{device_id}:{rule_key}:{YYYYMMDD} 单规则日上限
- affinity:daily:{device_id}:_global:{YYYYMMDD} 全局正向日上限
- 自然日按 AffinitySetting.timezone (Asia/Shanghai 默认) 通过 zoneinfo 计算
- cache.add + cache.incr 实现 set-if-not-exists + atomic-incr 语义,TTL 48h
- event_id 60s 去重防客户端重复上报
- levels.py (P2-03):等级映射
- map_value_to_level / update_device_level / progress_to_next_level
- update_device_level 仅 level 变化时 save(update_fields=['affinity_level'])
- ws.py (P2-05):WebSocket 推送 helper
- 3 类事件 affinity_update / level_up / level_down
- asgiref.async_to_sync 包装 channel_layer.group_send
- 推送故障 fire-and-forget 仅日志记录,不阻塞主流程
- rewards.py (P2-04):跨级奖励发放(A3 方案 B)
- grant_levels(user_device, from_level, to_level) 逐级独立事务
- UserLevelRewardGrant 唯一约束保证幂等(决策 11:衰减回升不补发)
- _dispatch_reward_to_external_systems 是 STUB,P3/P4 接虚拟货币/道具 app 时实现
- services.py (P2-01):AffinityService 主入口
- apply(user_id, device_id, rule_key, source, event_id, metadata, operator_admin_id, reason)
- 10 步流水线 [event_id 去重 → 取规则 → 冷却 → 取 UserDevice.active → 计算 + single_cap 钳位 → 规则日上限 → 全局日上限 → 原子写库 → Redis 累加 → 奖励 → WS 推送]
- admin_adjust 绕过 rule 与冷却,但走 [0, max_affinity] 钳位 + log + 等级缓存 + 奖励 + WS
- 返回 ApplyResult dataclass 含 ApplyOutcome 枚举(applied / noop_no_rule / noop_cooldown / noop_*_daily_cap / noop_event_duplicate / noop_value_boundary / error)
- permissions.py:IsAdminUserStaff 复用 IsAuthenticated + is_staff 检查
Smoke test 6 项全 PASS:no_rule / chat applied / event_id 去重 / 冷却拦截 / admin_adjust / max_affinity 钳位。
AffinityLog 写库 / UserLevelRewardGrant 幂等 / level 缓存更新 均经事务原子保证。
设计依据:docs/好感度系统功能与规则设计.md §4.3 触发流程 + §6 等级规则 + §9 数据契约。
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
用户管理模块 (userapp)
概述
用户管理模块提供了完整的用户账号管理功能,包括:
- 多种方式的用户注册(用户名注册)
- 多种方式的用户登录(用户名登录、邮箱登录、手机验证码登录)
- 用户信息管理
- 密码重置
- 第三方账号登录(通过 allauth 支持)
API 文档
详细的API文档请参考:
- 用户认证API文档 - 包含所有认证相关接口
- Swagger API文档:运行服务后访问
/swagger/路径
认证方式
系统支持两种认证方式:
- Token认证:基于自定义的Redis存储Token,用于API访问
- Session认证:基于Django内置的session机制,主要用于管理后台
目录结构
userapp/
├── models.py # 用户模型定义
├── views.py # API视图
├── serializers.py # 序列化器
├── urls.py # URL路由配置
├── utils.py # 工具函数
└── authentication.py # 自定义认证类
登录注册流程
注册流程
- 用户名注册:
- 访问
/api/user/auth/register/ - 提供用户名、密码、确认密码
- 可选提供邮箱和手机号
- 访问
登录流程
系统支持多种登录方式:
-
用户名登录:
- 访问
/api/user/auth/username/login/ - 提供用户名和密码
- 获取返回的令牌Token
- 访问
-
邮箱登录:
- 访问
/api/user/auth/email/login/ - 提供邮箱和密码
- 获取返回的令牌Token
- 访问
-
手机验证码登录:
- 先访问
/api/user/auth/phone/verify/获取验证码 - 然后访问
/api/user/auth/phone/login/提供手机号和验证码 - 获取返回的令牌Token
- 先访问
使用令牌
获取令牌后,在后续请求中添加以下请求头:
Authorization: Bearer {token}