"""qrcode login (Phase 1.1) Revision ID: 022_qrcode_login Revises: 021_rbac Create Date: 2026-06-21 Phase 1.1 扫码登录后端接口(task #14)。 设计说明: 扫码登录的所有状态都存在 Redis(无需新增数据库表): - qrcode:ticket:{ticket} → {created_at, expires_at}, TTL 120s - qrcode:scan:{ticket} → {employee_id, name, scanned_at}, TTL 120s - qrcode:confirm:{ticket} → {token, confirmed_at, roles}, TTL 60s 不动 User / Agent 模型(MFA 字段留给 Phase 2.1)。 不动 auth2fa.py(SMS 备用通道保留)。 为什么仍然生成这个 migration 文件: 1. alembic 版本链不能断,021 → 022 必须存在(后续 023+ 需要接续) 2. 标记 Phase 1.1 上线,方便运维追溯和回滚标记 3. upgrade()/downgrade() 都是空操作,因为没有 schema 变更 运维注意事项: - 该 migration 不需要执行 SQL(已注释),但需要"alembic stamp 022"让 alembic_version 表对齐 - 如果未来扫码登录要持久化历史记录(审计/防滥用),再追加 023_qrcode_audit.py 加 qrcode_login_logs 表 """ from alembic import op import sqlalchemy as sa # revision identifiers, used by Alembic. revision = "022_qrcode_login" down_revision = "021_rbac" branch_labels = None depends_on = None def upgrade() -> None: """Phase 1.1 扫码登录无 schema 变更,upgrade 留空。 预留说明: 如果部署时 alembic stamp 未执行,导致 backend 启动报 "alembic_version" mismatch,只需 `alembic stamp 022` 即可对齐。 """ # 故意 pass:扫码登录的所有数据存 Redis,无 DB schema 变更 pass def downgrade() -> None: """Phase 1.1 扫码登录无 schema 变更,downgrade 留空。""" # 故意 pass pass