- system_settings 单行 CRUD:GET/PUT(AdminUser)+ GET /public(无鉴权, SettingPublicOut 白名单仅 company_name/logo_url 两字段,短缓存 300s) - logo 上传:后缀+magic bytes+2MB 三重校验,固定名覆盖落盘 uploads/logo/ (不使用上传方文件名,杜绝路径拼接);旧扩展名文件清理;文件流端点 no-cache,URL 带 update_time 版本参数破缓存 - logo 存目录不存库:图片入 DB 让每次读取与 mysqldump 放大传输且无法 独立替换;DB 只持一行相对路径 - 新增依赖 python-multipart(FastAPI UploadFile 必备传输层);.gitignore 增 backend/uploads/ 与 db/backups/ - 集成 11 例:单行语义/白名单字段/三重校验/越权 403/匿名 401/审计留痕 Co-Authored-By: Claude Code <noreply@anthropic.com>
29 lines
782 B
Python
29 lines
782 B
Python
"""系统设置(公司信息)请求/响应模型。
|
||
|
||
`SettingPublicOut` 与 `SettingOut` **刻意不共用**:public 端点无鉴权,
|
||
响应字段必须白名单显式列出——将来往 SettingOut 加敏感字段时不会
|
||
顺着复用链泄漏到匿名端点。
|
||
"""
|
||
|
||
from pydantic import BaseModel, Field
|
||
|
||
|
||
class SettingOut(BaseModel):
|
||
"""公司信息(管理端)。"""
|
||
|
||
company_name: str
|
||
logo_url: str | None = None
|
||
|
||
|
||
class SettingPublicOut(BaseModel):
|
||
"""公司信息(匿名端点白名单):登录页展示所需的两个字段。"""
|
||
|
||
company_name: str
|
||
logo_url: str | None = None
|
||
|
||
|
||
class SettingUpdateIn(BaseModel):
|
||
"""公司信息更新。"""
|
||
|
||
company_name: str = Field(min_length=1, max_length=64, description="公司名称")
|