587 lines
11 KiB
Markdown
587 lines
11 KiB
Markdown
# 财务 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` 开始开发任务 |