pmc 7c79b72544 feat(affinity-P2): admin API — Rule/Level CRUD + Setting + Logs + Stats + Devices + Adjust (P2-06~P2-12)
新增 admin 管理端完整 API,挂载在 /api/v1/admin/affinity/ 路径下:

- serializers.py:9 个序列化器
  - AffinityRuleSerializer / AffinityLevelSerializer / AffinitySettingSerializer
    含跨字段 validate(min/max 关系、区间重叠、衰减区间、companion_time 字段必填等)
  - AffinityLogSerializer 只读 + 关联字段展开(user_username/device_code/rule_name)
  - UserDeviceAffinitySerializer 含 device_code/mac/status/level_name
  - AffinityAdjust + AffinityAdjustBatch 用 Serializer 而非 ModelSerializer
  - permissions.py 中 IsAdminUserStaff 复用,所有 view 默认 RedisTokenAuthentication + IsAdminUserStaff

- views.py:7 个视图
  - AffinityRuleAdminViewSet (P2-06):ModelViewSet + 软删 (is_deleted+is_enabled=False) + restore action;?include_deleted=true 返回全集
  - AffinityLevelAdminViewSet (P2-07):同上软删;serializer 跨字段校验区间重叠
  - AffinitySettingView (P2-08):APIView 单例 GET/PUT/PATCH;pk=1 硬约束
  - AffinityLogListView (P2-09):过滤 user_id/device_id/rule_key/source/date_from/date_to;分页 page_size 上限 200;select_related 防 N+1
  - AffinityStatsView (P2-10):avg/max/top_count/active_7d/total_devices/today_interactions/today_change_sum/rule_freq_top/level_distribution;全部基于 UserDevice.active 聚合;今日按 AffinitySetting.timezone 取 local date
  - UserAffinityDevicesView (P2-11):?user_id= 必传 + 404 校验;?include_unbound=true 含历史;默认仅 is_bound=True
  - AffinityAdjustView + AffinityAdjustBatchView (P2-12):委托 AffinityService.admin_adjust;批量遍历 UserDevice.active 逐台调用,返回 per-device 结果数组

- urls.py:DRF DefaultRouter 注册 rules/levels CRUD + 5 个独立 path 挂 settings/logs/stats/devices/adjust*
- admin_urls.py:引入 include 并新增 path('affinity/', include('userapp.affinity.urls'))

Django check 通过,6 URL reverse 全部解析正确:
  /api/v1/admin/affinity/settings/
  /api/v1/admin/affinity/logs/
  /api/v1/admin/affinity/stats/
  /api/v1/admin/affinity/devices/
  /api/v1/admin/affinity/adjust/
  /api/v1/admin/affinity/adjust-batch/

旧的 /api/user/affinity-rules/ 与 /affinity-levels/ 暂保留兼容,前端切到 admin 后即可清理。

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-14 09:36:11 +08:00
..
2026-03-17 13:17:02 +08:00
2026-03-17 13:17:02 +08:00
2026-03-17 13:17:02 +08:00
2026-03-17 13:17:02 +08:00
2026-03-17 13:17:02 +08:00
2026-03-17 13:17:02 +08:00
2026-04-13 11:05:23 +08:00
2026-03-17 13:17:02 +08:00

用户管理模块 (userapp)

概述

用户管理模块提供了完整的用户账号管理功能,包括:

  • 多种方式的用户注册(用户名注册)
  • 多种方式的用户登录(用户名登录、邮箱登录、手机验证码登录)
  • 用户信息管理
  • 密码重置
  • 第三方账号登录(通过 allauth 支持)

API 文档

详细的API文档请参考

  • 用户认证API文档 - 包含所有认证相关接口
  • Swagger API文档运行服务后访问 /swagger/ 路径

认证方式

系统支持两种认证方式:

  1. Token认证基于自定义的Redis存储Token用于API访问
  2. Session认证基于Django内置的session机制主要用于管理后台

目录结构

userapp/
├── models.py      # 用户模型定义
├── views.py       # API视图
├── serializers.py # 序列化器
├── urls.py        # URL路由配置  
├── utils.py       # 工具函数
└── authentication.py # 自定义认证类

登录注册流程

注册流程

  1. 用户名注册:
    • 访问 /api/user/auth/register/
    • 提供用户名、密码、确认密码
    • 可选提供邮箱和手机号

登录流程

系统支持多种登录方式:

  1. 用户名登录:

    • 访问 /api/user/auth/username/login/
    • 提供用户名和密码
    • 获取返回的令牌Token
  2. 邮箱登录:

    • 访问 /api/user/auth/email/login/
    • 提供邮箱和密码
    • 获取返回的令牌Token
  3. 手机验证码登录:

    • 先访问 /api/user/auth/phone/verify/ 获取验证码
    • 然后访问 /api/user/auth/phone/login/ 提供手机号和验证码
    • 获取返回的令牌Token

使用令牌

获取令牌后,在后续请求中添加以下请求头:

Authorization: Bearer {token}