chore: 初始化项目结构与登录鉴权模块
后端 FastAPI 六层结构(api/services/repositories/models/schemas/core), 统一响应信封、全局异常、日志脱敏;6 张表经 Alembic 迁移建库,SQL 留存 db/migration;登录鉴权含图形验证码(Redis GETDEL 防重放)、JWT、登录限流、 登出黑名单(TTL=令牌剩余有效期)、登录日志。 前端 Vue3 + TS + Element Plus 骨架,含登录页、路由守卫、请求封装与 Vite 代理。 工程配置:uv 锁定 Python 3.12、ruff 检查与格式化、editorconfig、gitattributes。 测试 184 项(单元 155 / 集成 29)全绿,浏览器端到端 8 项通过。 Co-Authored-By: Claude Code <noreply@anthropic.com>
This commit is contained in:
commit
273ebf4657
101 files changed
+8725
No files matched your search
@@ -0,0 +1,38 @@
|
||||
"""全局常量。
|
||||
|
||||
集中定义 Redis 键模板、响应码、角色编码等跨模块共享的字面量,
|
||||
避免各处硬编码字符串导致拼写漂移。
|
||||
"""
|
||||
|
||||
# ===== 响应码(与 HTTP 状态码保持一致,见 PROJECT_STANDARDS 第 9 节)=====
|
||||
CODE_SUCCESS = 200
|
||||
CODE_BAD_REQUEST = 400
|
||||
CODE_UNAUTHORIZED = 401
|
||||
CODE_FORBIDDEN = 403
|
||||
CODE_NOT_FOUND = 404
|
||||
CODE_SERVER_ERROR = 500
|
||||
|
||||
# ===== Redis 键模板 =====
|
||||
# 规范第 6 节:键格式 {项目缩写}:{业务}:{标识},项目缩写为 ys
|
||||
REDIS_KEY_CAPTCHA = "ys:captcha:{captcha_id}"
|
||||
REDIS_KEY_LOGIN_FAIL = "ys:login:fail:{username}"
|
||||
REDIS_KEY_TOKEN_BLACKLIST = "ys:token:blacklist:{jti}"
|
||||
|
||||
# ===== JWT =====
|
||||
JWT_ALGORITHM = "HS256"
|
||||
TOKEN_TYPE_BEARER = "Bearer"
|
||||
|
||||
# ===== 角色编码(与 db/migration 初始化数据保持一致)=====
|
||||
ROLE_ADMIN = "admin"
|
||||
ROLE_USER = "user"
|
||||
|
||||
# ===== 密码策略 =====
|
||||
# bcrypt 5.0 起对超过 72 字节的密码由「静默截断」改为「抛 ValueError」,
|
||||
# 而中文一个字符占 3 字节,因此必须按字节数校验,按字符数校验是错的。
|
||||
PASSWORD_MIN_BYTES = 8
|
||||
PASSWORD_MAX_BYTES = 72
|
||||
|
||||
# ===== 验证码 =====
|
||||
# 剔除易混淆字符 0/O/1/I/l,降低人工识别错误率
|
||||
CAPTCHA_CHARSET = "23456789ABCDEFGHJKLMNPQRSTUVWXYZ"
|
||||
CAPTCHA_LENGTH = 4
|
||||
Reference in new issue
Block a user