Files
jizhi/docs/DEVELOPER.md
T

144 lines
5.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 喵记账 · 开发手册
> 最后更新:2026-07-26
## 版本号规范
三端统一版本号格式:`YYYYMMDD-HHMM`(年月日-时分)。**每次构建必须更新版本号**。
### 后端版本号
- 文件:`backend/MiaoJiZhang.Api/Program.cs`
- 配置:`Build:Version`(未注入时默认为 `dev`
- 显示位置:
- `GET /api/ping` 返回 JSON `{ "version": "...", "built": "..." }`
- `GET /api/version` 同上
- 更新方法:通过环境变量或部署配置注入 `Build__Version`,重启后端
### Flutter App 版本号
- 文件:`frontend/lib/shared/version.dart`
- 变量:通过 `--dart-define=APP_VERSION=xxx` 构建时注入,默认 `"dev"`
- 显示位置:
- 启动页(SplashPageLogo 下方
- 登录页底部
- 「我的」页底部
- 构建命令:
```powershell
flutter clean
flutter build apk --release --dart-define=APP_VERSION=20260821-135
```
⚠️ **必须加 `--dart-define`,否则 App 显示 `vdev`**
### Admin Web 版本号
- Admin Web 不再维护独立硬编码版本号,以同次后端发布版本为准。
- 更新方法:重新构建并完整替换后端静态资源目录。
```bash
cd admin-web && npm run build
Copy-Item -Recurse -Force dist\* ..\backend\MiaoJiZhang.Api\wwwroot\
```
---
## 构建与部署
### 1. 后端
```bash
cd backend
export Admin__BootstrapUsername='admin'
export Admin__BootstrapPassword='replace-with-a-password-longer-than-5-characters'
dotnet build
# 重启
powershell -Command "Get-Process dotnet | Stop-Process -Force"
dotnet run --project MiaoJiZhang.Api
```
首次启动必须设置 `Admin__BootstrapUsername` 和 `Admin__BootstrapPassword`,用于创建第一个
`super_admin`。首次登录后后台会强制修改密码;管理员创建成功后可从运行环境中移除这两个
引导变量。正式环境必须使用 HTTPS 并保持 `Admin__CookieSecure=true`。本地纯 HTTP 调试时才可
临时设置 `Admin__CookieSecure=false`。
后台“AI 配置 → 模型服务”可以直接保存和替换 LLM API Key。实际 API Key 使用 AES-GCM
加密后写入配置表,加密密钥由服务端从必填的 `Jwt__Secret` 自动派生,无需增加部署变量;
页面和接口只显示 API Key 尾号。旧的 `LLM_API_KEY` 仍作为回退配置,后台保存的密钥优先。
### 2. Admin Web
```powershell
cd admin-web
npm run build
Copy-Item -Recurse -Force dist\* ..\backend\MiaoJiZhang.Api\wwwroot\
```
浏览器打开 `http://localhost:5000/` 或 `http://{电脑IP}:5000/`。如界面未更新请 **Ctrl+Shift+R** 强制刷新。
### 3. Flutter APK
```bash
cd frontend
flutter clean
flutter pub get
flutter build apk --release --dart-define=APP_VERSION=20260821-135
adb install -r build/app/outputs/flutter-apk/app-release.apk
```
---
## 项目结构
```
jizhang/
├── backend/
│ └── MiaoJiZhang.sln
│ ├── MiaoJiZhang.Api/ # Web API 控制器、JWT、配置
│ │ ├── Program.cs # ★ 启动入口 + 版本号
│ │ ├── Controllers/
│ │ │ ├── AuthController.cs
│ │ │ ├── ChatController.cs # ★ AI 聊天(LLM only
│ │ │ ├── AdminController.cs
│ │ │ ├── UsersController.cs
│ │ │ ├── TransactionsController.cs
│ │ │ └── ...
│ │ ├── Services/
│ │ │ ├── OpenAiVisionClient.cs # LLM 客户端
│ │ │ ├── AiServices.cs # 规则版(已废弃)
│ │ │ └── ...
│ │ └── wwwroot/ # Admin Web 发布目标
│ ├── MiaoJiZhang.Domain/ # 实体 + 枚举
│ └── MiaoJiZhang.Infrastructure/ # EF Core + MySQL
├── frontend/
│ └── lib/
│ ├── main.dart
│ ├── app/app.dart # 路由
│ ├── shared/
│ │ ├── version.dart # ★ App 版本号
│ │ ├── api/ # API 客户端
│ │ ├── theme/ # 设计规范色
│ │ └── widgets/ # 图标/组件
│ └── features/ # 业务页面
├── admin-web/ # Vue3 + Ant Design 后台
│ └── src/
│ ├── App.vue # Admin 壳与导航
│ └── views/ # 管理页面
├── design/ # UI 稿、UX 原型、配色探索
└── docs/ # 项目状态、设计、开发与客户端对接文档
```
---
## 验证构建是否生效
1. **后端**:浏览器访问 `http://localhost:5000/api/ping`,看返回的 `version` 字段
2. **Admin Web**:打开 `http://localhost:5000/`,看左下角版本号,对不上就 Ctrl+Shift+R
3. **App**:打开 App 看启动页 Logo 下方的版本号,或登录页/我的页底部
**版本号对不上 = 没构建进去 = 代码没生效。不要继续测试其他功能,先排查构建问题。**
---
## 常见错误
| 现象 | 原因 | 解决 |
|------|------|------|
| 修改了代码但 App 不变 | 没有 clean 构建,或没加 dart-define | `flutter clean && flutter build apk --release --dart-define=APP_VERSION=...` |
| 修改了代码但后台不变 | 后端还在跑旧进程 | 先 `Stop-Process -Name dotnet -Force` 再 `dotnet run` |
| Admin Web 界面不变 | 浏览器缓存 | Ctrl+Shift+R 强制刷新,或用无痕模式打开 |
| 数据库结构不一致 | 未执行最新 EF Migration | `dotnet ef database update` 后再启动服务 |
| Windows 文件路径错误 | 中文路径编码 | 用 python3 读文件时加 `encoding='utf-8'` |
| sed 破坏代码 | git-bash 的 sed 不兼容 | 禁止用 sed 改 dart/vue 源码,用 Write/Edit 工具 |