系统架构
Portal 是 Django 单体 + 服务端渲染。没有独立 SPA、没有 Django REST Framework 作为主 API。少量 JSON 端点仅用于 Drive 状态/激活和教室回执解析。
运行时拓扑(生产)
静态资源由 WhiteNoise 在 gunicorn 进程内提供(collectstatic 之后)。DEBUG=False 时 Django 不自动挂 media;未配 R2 时需 Nginx 自行暴露 MEDIA_ROOT。
仓库不包含 systemd unit、Nginx site 配置和 /home/ubuntu/deploy.sh。部署步骤以服务器实际文件为准,见 Production Deployment。
应用分层
业务规则优先放在 services / registry,而不是堆在模板里。招新状态机几乎全部在 recruitment/services.py。
请求内横切
| 机制 | 位置 |
|---|---|
| 认证 | django-allauth,SOCIALACCOUNT_ONLY=True |
| 权限 | Mixin + accounts.utils |
| 导航可见性 | core.context_processors.treasury_nav |
| 志愿排序弹窗 | core.context_processors.preference_rank_prompt |
| 邮件异步 | mailing.async_notify.schedule_notification(transaction.on_commit + 后台线程) |
| 提交幂等 | submit_token + core/submit_guard.py |
| 审计 | core.ActivityLog |
时区
TIME_ZONE = America/New_York,USE_TZ = True。表单 datetime-local 与页面展示按美东处理。Cron 若跑在 UTC 主机上需要换算,见 Scheduled Jobs。