Files
s2f/run.md
T
2026-07-06 22:03:22 +08:00

587 lines
11 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.
# 财务 AI 助手运行手册(第一模块:薪财通 AI)
**项目**: 财务 AI 助手(项目编号:S2F,第一模块:薪财通 AI)
**产品定位**: 面向金蝶中小企业客户的财务 AI 助手
**当前运行模块**: 第一阶段薪酬财务对账 MVP
**范围说明**: 本运行手册对应第一模块 Excel 闭环;发票报销、预算执行、现金流异常、往来对账、经营分析属于后续模块
**更新日期**: 2026-07-06
## 技术栈
### 前端
- **框架**: Next.js 14+ (React 18+)
- **语言**: TypeScript 5+
- **样式**: Tailwind CSS 3+
- **UI 组件**: Shadcn/ui (基于 Radix UI)
- **状态管理**: React Context + Zustand
- **HTTP 客户端**: Axios
- **表单**: React Hook Form + Zod
- **图表**: Recharts
- **图标**: Lucide Icons
- **文件上传**: React Dropzone
- **Excel 处理**: SheetJS (xlsx)
### 后端
- **框架**: FastAPI 0.110+
- **语言**: Python 3.11+
- **验证**: Pydantic 2+
- **ORM**: SQLAlchemy 2+ with asyncio
- **数据库驱动**: asyncpg (PostgreSQL)
- **认证**: JWT (python-jose)
- **密码**: bcrypt
- **文件处理**: openpyxl, pandas
- **AI**: OpenAI SDK / 国产大模型 SDK
- **任务队列**: Celery + Redis (第二阶段)
- **日志**: structlog
### 数据库
- **主库**: PostgreSQL 15+
- **缓存**: Redis 7+ (第二阶段)
### 部署
- **容器**: Docker + Docker Compose
- **Web 服务器**: Nginx (反向代理)
- **进程管理**: Uvicorn (FastAPI ASGI)
## 本地环境要求
### 必需
- Node.js 20+ 和 npm 10+
- Python 3.11+
- PostgreSQL 15+
- Docker 和 Docker Compose (推荐)
### 可选
- Redis 7+ (第二阶段)
## 环境变量
### 前端 `.env.local`
```bash
# API 地址
NEXT_PUBLIC_API_URL=http://localhost:8000
# 应用配置
NEXT_PUBLIC_APP_NAME="财务 AI 助手(薪财通 AI"
NEXT_PUBLIC_APP_VERSION=1.0.0
```
### 后端 `.env`
```bash
# 应用配置
APP_NAME="财务 AI 助手 API"
APP_VERSION=1.0.0
DEBUG=true
SECRET_KEY=your-secret-key-change-in-production
ALLOWED_ORIGINS=http://localhost:3000
# 数据库
DATABASE_URL=postgresql+asyncpg://s2f_user:s2f_password@localhost:5432/s2f_db
# JWT
JWT_SECRET_KEY=your-jwt-secret-key-change-in-production
JWT_ALGORITHM=HS256
JWT_ACCESS_TOKEN_EXPIRE_MINUTES=60
# AI 模型
OPENAI_API_KEY=your-openai-api-key
OPENAI_MODEL=gpt-4-turbo-preview
# 默认使用智谱,也可切换 openai / qwen / baidu
AI_PROVIDER=zhipu
ZHIPU_API_KEY=your-zhipu-api-key
AI_API_KEY=your-ai-api-key
# 文件存储
UPLOAD_DIR=./uploads
MAX_UPLOAD_SIZE=10485760 # 10MB
# 日志
LOG_LEVEL=INFO
```
## 项目结构
```
s2f/
├── frontend/ # Next.js 前端
│ ├── src/
│ │ ├── app/ # App Router 页面
│ │ ├── components/ # React 组件
│ │ ├── lib/ # 工具函数、API 客户端
│ │ ├── hooks/ # 自定义 Hooks
│ │ ├── types/ # TypeScript 类型
│ │ └── styles/ # 全局样式
│ ├── public/ # 静态资源
│ ├── package.json
│ └── tsconfig.json
├── backend/ # FastAPI 后端
│ ├── app/
│ │ ├── api/ # API 路由
│ │ ├── core/ # 核心配置
│ │ ├── models/ # SQLAlchemy 模型
│ │ ├── schemas/ # Pydantic 模式
│ │ ├── services/ # 业务逻辑
│ │ ├── utils/ # 工具函数
│ │ └── main.py # 应用入口
│ ├── migrations/ # Alembic 迁移
│ ├── tests/ # 测试
│ ├── requirements.txt
│ └── pyproject.toml
├── pmdocs/ # 项目管理文档
│ ├── 0-req-S2F.md
│ ├── 1-prd-S2F.md
│ └── 2-task-S2F.md
├── docker-compose.yml # Docker Compose 配置
├── .gitignore
├── README.md
└── run.md # 本文件
```
## 安装与初始化
### 方式 1:使用 Docker Compose(推荐)
```bash
# 克隆项目
cd /Users/freedak/Documents/AIDashboard/s2f
# 启动所有服务
docker-compose up -d
# 查看日志
docker-compose logs -f
# 前端: http://localhost:3000
# 后端 API: http://localhost:8000
# API 文档: http://localhost:8000/docs
```
### 方式 2:本地开发
#### 1. 数据库初始化
```bash
# 安装 PostgreSQL (macOS)
brew install postgresql@15
brew services start postgresql@15
# 创建数据库和用户
psql postgres
CREATE DATABASE s2f_db;
CREATE USER s2f_user WITH PASSWORD 's2f_password';
GRANT ALL PRIVILEGES ON DATABASE s2f_db TO s2f_user;
\q
```
#### 2. 后端初始化
```bash
cd backend
# 创建虚拟环境
python3.11 -m venv venv
source venv/bin/activate # Windows: venv\Scripts\activate
# 安装依赖
pip install -r requirements.txt
# 配置环境变量
cp .env.example .env
# 编辑 .env 填入真实配置
# 数据库迁移
alembic upgrade head
# 创建初始管理员账号
python scripts/create_admin.py
```
#### 3. 前端初始化
```bash
cd frontend
# 安装依赖
npm install
# 配置环境变量
cp .env.example .env.local
# 编辑 .env.local 填入 API 地址
```
## 开发命令
### 前端开发
```bash
cd frontend
# 启动开发服务器 (http://localhost:3000)
npm run dev
# 类型检查
npm run type-check
# Lint 检查
npm run lint
# 代码格式化
npm run format
```
### 后端开发
```bash
cd backend
source venv/bin/activate
# 启动开发服务器 (http://localhost:8000)
uvicorn app.main:app --reload --host 0.0.0.0 --port 8000
# 或使用 FastAPI CLI
fastapi dev app/main.py
# 查看 API 文档
# http://localhost:8000/docs (Swagger UI)
# http://localhost:8000/redoc (ReDoc)
```
## 构建命令
### 前端构建
```bash
cd frontend
# 生产构建
npm run build
# 启动生产服务器
npm run start
```
### 后端构建
```bash
cd backend
# FastAPI 不需要构建,直接运行
uvicorn app.main:app --host 0.0.0.0 --port 8000
```
## 测试命令
### 前端测试
```bash
cd frontend
# 运行所有测试
npm run test
# 监听模式
npm run test:watch
# 覆盖率报告
npm run test:coverage
```
### 后端测试
```bash
cd backend
source venv/bin/activate
# 运行所有测试
pytest
# 监听模式
pytest-watch
# 覆盖率报告
pytest --cov=app --cov-report=html
```
### 端到端测试
```bash
cd frontend
# 运行 E2E 测试 (Playwright)
npm run test:e2e
# 打开 Playwright UI
npm run test:e2e:ui
```
## 数据库命令
### Alembic 迁移
```bash
cd backend
source venv/bin/activate
# 创建迁移
alembic revision --autogenerate -m "描述变更"
# 执行迁移
alembic upgrade head
# 回滚迁移
alembic downgrade -1
# 查看迁移历史
alembic history
# 查看当前版本
alembic current
```
### 数据库管理
```bash
# 连接数据库
psql -U s2f_user -d s2f_db
# 备份数据库
pg_dump -U s2f_user s2f_db > backup.sql
# 恢复数据库
psql -U s2f_user s2f_db < backup.sql
# 重置数据库(危险!)
psql -U s2f_user
DROP DATABASE s2f_db;
CREATE DATABASE s2f_db;
\q
cd backend && alembic upgrade head
```
## 代码质量
### 前端
```bash
cd frontend
# ESLint 检查
npm run lint
# 自动修复
npm run lint:fix
# Prettier 格式化
npm run format
# TypeScript 类型检查
npm run type-check
```
### 后端
```bash
cd backend
source venv/bin/activate
# Ruff Lint 检查
ruff check app/
# 自动修复
ruff check --fix app/
# Black 格式化
black app/
# MyPy 类型检查
mypy app/
```
## Docker 命令
```bash
# 构建镜像
docker-compose build
# 启动服务
docker-compose up -d
# 停止服务
docker-compose down
# 查看日志
docker-compose logs -f [service_name]
# 进入容器
docker-compose exec backend bash
docker-compose exec frontend sh
# 重建并重启
docker-compose up -d --build
# 清理所有数据(危险!)
docker-compose down -v
```
## 常见问题
### 1. 前端无法连接后端
**问题**:前端显示网络错误
**解决**
```bash
# 确认后端正在运行
curl http://localhost:8000/api/health
# 检查 CORS 配置
# backend/app/core/config.py 中 ALLOWED_ORIGINS 需包含前端地址
```
### 2. 数据库连接失败
**问题**`sqlalchemy.exc.OperationalError: could not connect to server`
**解决**
```bash
# 确认 PostgreSQL 正在运行
pg_isready -h localhost -p 5432
# 确认数据库存在
psql -U s2f_user -l | grep s2f_db
# 检查 DATABASE_URL 配置
echo $DATABASE_URL
```
### 3. AI 字段识别失败
**问题**:上传文件后识别超时或失败
**解决**
```bash
# 检查 AI API Key
echo $OPENAI_API_KEY
# 测试 API 连接
curl https://api.openai.com/v1/models \
-H "Authorization: Bearer $OPENAI_API_KEY"
# 查看后端日志
docker-compose logs backend | grep -i "openai\|error"
```
### 4. 文件上传失败
**问题**:上传文件时显示 413 或 500 错误
**解决**
```bash
# 检查文件大小限制
# backend/.env 中 MAX_UPLOAD_SIZE=10485760 (10MB)
# 确认上传目录权限
ls -la backend/uploads/
chmod 755 backend/uploads/
# 检查磁盘空间
df -h
```
### 5. 前端构建失败
**问题**`npm run build` 报错
**解决**
```bash
# 清理缓存
rm -rf frontend/.next frontend/node_modules
cd frontend && npm install
# 检查 TypeScript 错误
npm run type-check
# 检查环境变量
cat frontend/.env.local
```
## 部署检查清单
部署前确认:
- [ ] 环境变量已配置(生产环境不使用默认密钥)
- [ ] 数据库迁移已执行
- [ ] 前端已构建 (`npm run build`)
- [ ] HTTPS 已配置
- [ ] CORS 已正确配置生产域名
- [ ] 文件上传目录有正确权限
- [ ] 日志目录可写
- [ ] 备份策略已配置
- [ ] 监控和告警已配置
## 性能优化建议
### 前端
- 使用 Next.js 的 Image 组件优化图片
- 启用 React Server Components 减少客户端 JS
- 使用动态导入按需加载组件
- 配置合理的缓存策略
### 后端
- 为频繁查询添加数据库索引
- 使用连接池优化数据库连接
- 对 AI 请求添加缓存(第二阶段)
- 启用 Gzip 压缩
### 数据库
- 定期 VACUUM 和 ANALYZE
- 监控慢查询日志
- 合理设置连接池大小
## 安全建议
- 生产环境必须更改所有默认密钥
- 使用 HTTPS
- 启用 CSRF 保护
- 限制文件上传类型和大小
- 定期更新依赖
- 启用日志审计
- 配置防火墙规则
- 数据库使用强密码并限制访问
## 监控与日志
### 日志位置
```bash
# 前端日志
frontend/.next/
# 后端日志
backend/logs/
# Docker 日志
docker-compose logs
```
### 推荐监控指标
- API 响应时间
- 数据库查询时间
- AI 识别准确率
- 文件上传成功率
- 错误率和异常日志
- 磁盘使用率
- 内存使用率
## 更新记录
| 日期 | 版本 | 变更内容 |
|---|---|---|
| 2026-07-06 | v1.0 | 初始版本,MVP 技术栈和运行命令 |
---
**下一步**: 参考 `pmdocs/2-task-S2F.md` 开始开发任务