- 接入火山引擎豆包 Chat API 生成儿童故事(SSE 流式进度) - 新增 /api/stories 接口加载历史故事到书架 - 新增 /api/playlist 接口加载历史歌曲到唱片架 - 书架排序:预设故事在前,AI 生成在后 - AI 生成的故事显示"暂无封面"淡紫渐变占位 - 保存故事时传回真实标题+内容(不再用 mock) - 修复 Windows GBK 编码导致的中文乱码问题 - 新增 MusicGenerationService 单例管理音乐生成 - 音乐页心情卡片 UI 重做 + 歌词可读性优化 - 添加豆包 API 参考文档和故事创作 prompt Co-authored-by: Cursor <cursoragent@cursor.com>
131 lines
3.7 KiB
Markdown
131 lines
3.7 KiB
Markdown
# Flutter Web 本地调试启动指南
|
||
|
||
> 本文档供 AI 编码助手阅读,用于在本项目中正确启动 Flutter Web 调试环境。
|
||
|
||
## 项目结构
|
||
|
||
- Flutter 应用目录:`airhub_app/`
|
||
- 后端服务入口:`server.py`(根目录,FastAPI + Uvicorn,端口 3000)
|
||
- 前端端口:`8080`
|
||
|
||
## 环境要求
|
||
|
||
- Flutter SDK(3.x)
|
||
- Python 3.x(后端服务)
|
||
- PowerShell(Windows 环境)
|
||
|
||
## 操作系统
|
||
|
||
Windows(所有命令均为 PowerShell 语法)
|
||
|
||
---
|
||
|
||
## 启动流程(严格按顺序执行)
|
||
|
||
### 1. 杀掉旧进程并确认端口空闲
|
||
|
||
```powershell
|
||
# 杀掉占用 8080 和 3000 的旧进程
|
||
Get-NetTCPConnection -LocalPort 8080 -ErrorAction SilentlyContinue | ForEach-Object { taskkill /F /PID $_.OwningProcess 2>$null }
|
||
Get-NetTCPConnection -LocalPort 3000 -ErrorAction SilentlyContinue | ForEach-Object { taskkill /F /PID $_.OwningProcess 2>$null }
|
||
|
||
# 等待端口释放
|
||
Start-Sleep -Seconds 3
|
||
|
||
# 确认端口已空闲(无输出 = 空闲)
|
||
Get-NetTCPConnection -LocalPort 8080 -ErrorAction SilentlyContinue
|
||
Get-NetTCPConnection -LocalPort 3000 -ErrorAction SilentlyContinue
|
||
```
|
||
|
||
### 2. 启动后端服务器(音乐生成功能依赖此服务)
|
||
|
||
```powershell
|
||
# 工作目录:项目根目录
|
||
cd d:\Airhub
|
||
python server.py
|
||
```
|
||
|
||
成功标志:
|
||
```
|
||
INFO: Uvicorn running on http://0.0.0.0:3000 (Press CTRL+C to quit)
|
||
[Server] Music Server running on http://localhost:3000
|
||
```
|
||
|
||
### 3. 设置国内镜像源 + 启动 Flutter Web Server
|
||
|
||
```powershell
|
||
# 工作目录:airhub_app 子目录
|
||
cd d:\Airhub\airhub_app
|
||
|
||
# 设置镜像源(必须,否则网络超时)
|
||
$env:PUB_HOSTED_URL = "https://pub.flutter-io.cn"
|
||
$env:FLUTTER_STORAGE_BASE_URL = "https://storage.flutter-io.cn"
|
||
|
||
# 启动 web-server 模式
|
||
flutter run -d web-server --web-port=8080 --no-pub
|
||
```
|
||
|
||
成功标志:
|
||
```
|
||
lib\main.dart is being served at http://localhost:8080
|
||
```
|
||
|
||
### 4. 访问应用
|
||
|
||
浏览器打开:`http://localhost:8080`
|
||
|
||
---
|
||
|
||
## 关键规则
|
||
|
||
### 必须使用 `web-server` 模式
|
||
- **禁止**使用 `flutter run -d chrome`(会弹出系统 Chrome 窗口,不可控)
|
||
- **必须**使用 `flutter run -d web-server`(只启动 HTTP 服务,手动用浏览器访问)
|
||
|
||
### `--no-pub` 的使用条件
|
||
- 仅修改 Dart 代码(无新依赖、无新 asset)→ 加 `--no-pub`,编译更快
|
||
- 新增了 `pubspec.yaml` 依赖或 `assets/` 资源文件 → **不能**加 `--no-pub`
|
||
|
||
### 端口管理
|
||
- 固定使用 8080(Flutter)和 3000(后端),不要换端口绕过占用
|
||
- 每次启动前必须先确认端口空闲
|
||
- 停止服务后等 3 秒再重新启动
|
||
|
||
### 热重载
|
||
- 在 Flutter 终端按 `r` = 热重载(保留页面状态)
|
||
- 按 `R` = 热重启(重置页面状态)
|
||
- 浏览器 `Ctrl+Shift+R` = 强制刷新
|
||
|
||
---
|
||
|
||
## 停止服务
|
||
|
||
```powershell
|
||
# 方法1:在 Flutter 终端按 q 退出
|
||
|
||
# 方法2:强制杀进程
|
||
Get-NetTCPConnection -LocalPort 8080 | ForEach-Object { taskkill /F /PID $_.OwningProcess }
|
||
Get-NetTCPConnection -LocalPort 3000 | ForEach-Object { taskkill /F /PID $_.OwningProcess }
|
||
```
|
||
|
||
---
|
||
|
||
## 常见问题排查
|
||
|
||
| 问题 | 原因 | 解决方案 |
|
||
|------|------|---------|
|
||
| 端口被占用 | 旧进程未退出 | 执行第1步杀进程,等3秒 |
|
||
| 编译报错找不到包 | 使用了 `--no-pub` 但有新依赖 | 去掉 `--no-pub` 重新编译 |
|
||
| 网络超时 | 未设置镜像源 | 设置 `PUB_HOSTED_URL` 和 `FLUTTER_STORAGE_BASE_URL` |
|
||
| 页面白屏 | 缓存问题 | 浏览器 `Ctrl+Shift+R` 强刷 |
|
||
| 音乐功能不工作 | 后端未启动 | 先启动 `python server.py` |
|
||
|
||
---
|
||
|
||
## 编译耗时参考
|
||
|
||
- 首次完整编译(含 pub get):90-120 秒
|
||
- 增量编译(`--no-pub`):60-90 秒
|
||
- 热重载(按 r):3-5 秒
|
||
- 热重启(按 R):10-20 秒
|