# FastAPI **Repository Path**: duanzhao0265/fast-api ## Basic Information - **Project Name**: FastAPI - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-07-28 - **Last Updated**: 2026-07-28 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # FastAPI 学习项目与 Toutiao MVP 这是一个以 FastAPI 为主线的学习仓库,同时包含一个可运行的 Toutiao 新闻资讯 MVP。 课程 Demo 用于按天学习;`backend/app` 与 `frontend` 则是当前可联调的前后端应用。 产品范围、优先级与验收依据见 [Toutiao 需求规格](docs/toutiao-requirements.md);技术选型、架构、部署和接口契约见 [Toutiao 技术设计与接口规范](docs/toutiao-technical-design.md)。本文档只描述当前仓库已经落地、可以运行和验证的实现。 ## 当前状态 已实现: - FastAPI + SQLAlchemy + SQLite 后端,按 `config`、`models`、`schemas`、`crud`、`routers`、`cache`、`utils` 分层。 - Vue 3 + Vite + Vant 4 移动端界面,包含新闻、认证、收藏、历史、资料、设置和 AI 问答页面。 - `/api` 统一响应、Bearer Token、CORS、分页、SSE 流式响应、本地 TTL 缓存和自动化测试。 - 七天 FastAPI 学习资料和独立 Demo。 当前不包含:MySQL 迁移、Redis、真实大模型供应商、英文 UI 全量翻译、Docker/Nginx 生产配置。这些能力不能视为已交付功能。 ## 快速启动 环境要求:Python 3.11、[uv](https://docs.astral.sh/uv/)、Node.js 18+、npm。 在两个终端分别启动后端和前端: ```powershell # 终端 1:后端 cd E:\codes\fastapi\backend uv sync uv run uvicorn main:app --reload --host 127.0.0.1 --port 8000 ``` ```powershell # 终端 2:前端 cd E:\codes\fastapi\frontend npm.cmd install npm.cmd run dev -- --host 127.0.0.1 --port 5173 ``` 打开以下地址: - Web UI: - Swagger UI: - ReDoc: - OpenAPI: 前端开发服务器会把 `/api/*` 自动代理到 `http://127.0.0.1:8000`。部署到其他 API 地址时,可在 `frontend/.env` 设置: ```dotenv VITE_API_BASE_URL=https://api.example.com/api ``` 示例见 `frontend/.env.example`。本地 SQLite 数据库默认写入 `backend/toutiao.db`;可通过 `TOUTIAO_DATABASE_URL` 覆盖: ```powershell $env:TOUTIAO_DATABASE_URL = 'sqlite:///E:/data/toutiao.db' ``` ## 验证 ```powershell cd E:\codes\fastapi\backend uv run python -m compileall app main.py toutiao_api.py tests uv run pytest cd E:\codes\fastapi\frontend npm.cmd run build ``` 当前后端测试覆盖新闻、认证、收藏、历史、AI SSE、CORS 和改密后的 Token 失效。前端构建会验证所有页面路由和 Vant 组件导入。 ## 项目结构 ```text fastapi/ ├── backend/ │ ├── app/ │ │ ├── config/ # 数据库 URL、Engine、Session、ORM Base │ │ ├── models/ # SQLAlchemy 实体 │ │ ├── schemas/ # Pydantic 请求模型 │ │ ├── crud/ # 用户、新闻、互动、AI 的业务与持久化逻辑 │ │ ├── routers/ # 按业务模块划分的 APIRouter │ │ ├── cache/ # 本地 TTL 缓存抽象 │ │ ├── utils/ # 响应、认证、Token、密码工具 │ │ └── main.py # FastAPI 组合根、CORS、生命周期、路由注册 │ ├── demos/ # Day 1 - Day 7 学习 Demo │ ├── tests/ # FastAPI TestClient 测试 │ ├── main.py # 兼容 ASGI 入口,导出 app.main:app │ └── pyproject.toml ├── frontend/ │ └── src/ │ ├── api/ # Axios、SSE、Token 和统一错误处理 │ ├── components/ # 可复用展示组件 │ ├── composables/ # 主题和格式化逻辑 │ ├── layouts/ # 顶部导航与 TabBar │ ├── router/ # 路由与登录守卫 │ ├── stores/ # Pinia 领域状态 │ └── views/ # 路由页面 ├── docs/ # 七天学习资料与课件 └── README.md ``` ## 后端架构 请求处理路径如下: ```text HTTP Request -> CORS / validation / exception handler -> routers/ 路由和依赖注入 -> crud/ 业务逻辑与数据库查询 -> models/ / cache/ SQLAlchemy ORM 与本地 TTL 缓存 -> utils/response.py { code, message, data } ``` ### 分层职责 | 目录 | 职责 | | --- | --- | | `app/config` | 读取 `TOUTIAO_DATABASE_URL`,创建 SQLAlchemy Engine、Session 和 Base。 | | `app/models` | 用户、Token、新闻分类、新闻、收藏和历史的 ORM 映射。 | | `app/schemas` | 请求体校验,例如用户名、密码、资料、新闻 ID 与 AI 消息。 | | `app/crud` | 查询、分页、Token 更新、收藏历史变更、种子数据和 AI 演示逻辑。 | | `app/routers` | `/api/user`、`/api/news`、`/api/favorite`、`/api/history`、`/api/ai`。 | | `app/cache` | 默认 600 秒本地内存缓存,缓存分类和新闻列表;可替换为 Redis 实现。 | | `app/utils` | PBKDF2-HMAC-SHA256 密码散列、Bearer Token、统一成功和错误响应。 | `backend/toutiao_api.py` 仅为历史测试和课程示例提供兼容导出,新代码不应继续写入该文件。 ### 数据与认证 - 首次启动会建表并写入三类、六条演示新闻。 - 用户名唯一;收藏和历史记录在数据库层按 `(user_id, news_id)` 唯一。 - Token 有效期为 7 天;同一用户新登录会覆盖旧 Token。 - 修改密码会撤销该用户所有旧 Token,客户端必须重新登录。 - 密码使用 PBKDF2-HMAC-SHA256 存储,不保存明文。 ## API 约定 基础路径:`/api`。除 SSE 外,所有接口均使用: ```json { "code": 200, "message": "success", "data": {} } ``` 受保护接口请求头: ```http Authorization: Bearer ``` | 模块 | 方法 | 路径 | 是否认证 | 说明 | | --- | --- | --- | --- | --- | | 用户 | POST | `/api/user/register` | 否 | 注册并返回 Token | | 用户 | POST | `/api/user/login` | 否 | 登录并返回新 Token | | 用户 | GET | `/api/user/info` | 是 | 获取当前用户资料 | | 用户 | PUT | `/api/user/update` | 是 | 部分更新昵称、简介、头像、性别、手机号 | | 用户 | PUT | `/api/user/password` | 是 | 修改密码并撤销旧 Token | | 新闻 | GET | `/api/news/categories` | 否 | `skip`、`limit` 分页分类 | | 新闻 | GET | `/api/news/list` | 否 | `categoryId`、`page`、`pageSize` 新闻列表 | | 新闻 | GET | `/api/news/detail` | 否 | `id` 新闻详情与相关推荐 | | 收藏 | POST | `/api/favorite/add` | 是 | 请求体 `{ "newsId": 1 }` | | 收藏 | DELETE | `/api/favorite/remove` | 是 | 请求体 `{ "newsId": 1 }` | | 收藏 | GET | `/api/favorite/list` | 是 | 收藏分页列表 | | 收藏 | GET | `/api/favorite/check` | 是 | `newsId` 收藏状态 | | 历史 | POST | `/api/history/add` | 是 | 添加或更新阅读历史 | | 历史 | GET | `/api/history/list` | 是 | 历史分页列表 | | 历史 | DELETE | `/api/history/delete/{history_id}` | 是 | 删除单条历史 | | 历史 | DELETE | `/api/history/clear` | 是 | 清空当前用户历史 | | AI | POST | `/api/ai/chat` | 否 | 普通 JSON 或 `stream: true` 的 SSE 响应 | API 的可执行参数和示例以 Swagger UI 为准。 ## 前端架构 前端采用 Vue 3、Vue Router、Pinia、Axios 与 Vant 4。 - `App.vue` 只挂载 `AppLayout`;页面不再集中在单一组件。 - 路由页面按需加载;受保护页面由路由元数据统一守卫。 - API 模块统一注入 Bearer Token,处理超时、统一响应和 401 跳转。 - AI 流式响应在 `api` 层处理 SSE,页面卸载时中止未完成请求。 - Pinia 划分 `user`、`news`、`favorite`、`history`、`theme`、`language` 状态。 - 图片使用 Vant 懒加载、加载态和缺图占位;列表使用 `List`、`PullRefresh`、`Skeleton`、`Empty` 与 `SwipeCell`。 - Vant 在 `main.js` 显式注册实际使用的组件和样式,不再全量注册。 当前界面全部为简体中文。语言状态已持久化,但英文翻译字典和完整切换尚未实现。 ## 七天学习课程 学习 Demo 与完整 MVP 独立,按日学习时请运行对应目录的应用,不要直接修改完整 MVP 代码。 | Day | 主题 | Demo | | --- | --- | --- | | 1 | API、HTTP、路由与状态码 | `backend/demos/lesson_01_api_basics/` | | 2 | 路径、查询、请求体与 Pydantic | `backend/demos/lesson_02_request_validation/` | | 3 | 响应模型、异常与 CRUD | `backend/demos/lesson_03_response_crud/` | | 4 | APIRouter、Depends 与项目结构 | `backend/demos/lesson_04_structure_dependencies/` | | 5 | SQLAlchemy 与 SQLite | `backend/demos/lesson_05_database/` | | 6 | Token、权限与 pytest | `backend/demos/lesson_06_auth_testing/` | | 7 | 异步、部署与综合实践 | `backend/demos/lesson_07_deployment_capstone/` | 更多学习安排见: - [七天快速入门](docs/7-day-fastapi-quickstart.md) - [课程总览](docs/README.md) - [每日课程目标](docs/courseware/README.md) - [学习进度](docs/progress.md) ## 开发约定 - 新后端功能按 `router -> schema -> crud -> model` 的边界实现,避免回写到 `toutiao_api.py`。 - 前端新增页面放入 `views/`,共享 UI 放入 `components/`,跨页状态放入 `stores/`,HTTP 调用只能通过 `api/`。 - 运行测试前不要删除本地 `.venv`、`uv.lock` 或课程 Demo。 - 不提交 `backend/toutiao.db`、虚拟环境、缓存、`node_modules`、本地 `.env` 或密钥。