feat: add AI学习助手 agent (KG+RAG ideal) and renshenguo feishu bot
- Add AI学习助手 agent creation script with all 39 tools, 3-layer KG+RAG memory - Add renshenguo (人参果) feishu bot integration (app_service + ws_handler) - Register renshenguo WS client in main.py startup - Add RENSHENGUO_APP_ID / RENSHENGUO_APP_SECRET / RENSHENGUO_AGENT_ID config - Reorganize docs from root into docs/ subdirectories - Move startup scripts to scripts/startup/ - Various backend optimizations and tool improvements Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
70
docs/bugfixes/401错误解决.md
Normal file
70
docs/bugfixes/401错误解决.md
Normal file
@@ -0,0 +1,70 @@
|
||||
# 401未授权错误解决方案
|
||||
|
||||
## 问题原因
|
||||
|
||||
控制台出现401错误的原因:
|
||||
1. **未登录**:用户还没有登录,但前端代码尝试获取用户信息和工作流列表
|
||||
2. **Token过期**:之前的token已过期或无效
|
||||
3. **Token丢失**:localStorage中的token被清除
|
||||
|
||||
## 已修复
|
||||
|
||||
### 1. 优化Home页面数据获取逻辑 ✅
|
||||
|
||||
修改了 `Home.vue`,确保:
|
||||
- 只有在有token的情况下才尝试获取数据
|
||||
- 如果获取用户信息失败,自动清除token并跳转到登录页
|
||||
- 只有在成功获取用户信息后才获取工作流列表
|
||||
|
||||
### 2. 优化用户信息获取 ✅
|
||||
|
||||
修改了 `user.ts` 中的 `fetchUser` 函数:
|
||||
- 如果401错误,自动清除token
|
||||
- 更好的错误处理
|
||||
|
||||
## 解决方案
|
||||
|
||||
### 如果看到401错误:
|
||||
|
||||
1. **检查是否已登录**
|
||||
- 如果未登录,请先登录
|
||||
- 登录后token会自动保存
|
||||
|
||||
2. **清除旧的token**
|
||||
- 打开浏览器控制台(F12)
|
||||
- 在Console中输入:`localStorage.removeItem('token')`
|
||||
- 刷新页面,重新登录
|
||||
|
||||
3. **检查登录状态**
|
||||
- 打开浏览器控制台(F12)
|
||||
- 在Console中输入:`localStorage.getItem('token')`
|
||||
- 如果有值,说明token存在
|
||||
- 如果为null,说明需要重新登录
|
||||
|
||||
## 正常流程
|
||||
|
||||
1. **访问首页** → 如果没有token,自动跳转到登录页
|
||||
2. **登录** → 获取token并保存
|
||||
3. **自动跳转** → 跳转到首页
|
||||
4. **获取数据** → 使用token获取用户信息和工作流列表
|
||||
|
||||
## 测试步骤
|
||||
|
||||
1. **清除token**(如果需要):
|
||||
```javascript
|
||||
localStorage.removeItem('token')
|
||||
```
|
||||
|
||||
2. **刷新页面** → 应该自动跳转到登录页
|
||||
|
||||
3. **登录** → 输入用户名和密码
|
||||
|
||||
4. **检查** → 登录成功后应该:
|
||||
- 自动跳转到首页
|
||||
- 不再出现401错误
|
||||
- 显示工作流列表
|
||||
|
||||
---
|
||||
|
||||
**状态**: ✅ 已修复
|
||||
**时间**: 2024年
|
||||
71
docs/bugfixes/CORS问题解决.md
Normal file
71
docs/bugfixes/CORS问题解决.md
Normal file
@@ -0,0 +1,71 @@
|
||||
# CORS问题解决方案
|
||||
|
||||
## 问题描述
|
||||
|
||||
前端从 `http://101.43.95.130:8038` 访问后端 `http://localhost:8037` 时,浏览器阻止了跨域请求。
|
||||
|
||||
错误信息:
|
||||
```
|
||||
Access to XMLHttpRequest at 'http://localhost:8037/auth/register' from origin 'http://101.43.95.130:8038'
|
||||
has been blocked by CORS policy: The request client is not a secure context and the resource is in
|
||||
more-private address space `local`.
|
||||
```
|
||||
|
||||
## 解决方案
|
||||
|
||||
### 1. 更新后端CORS配置 ✅
|
||||
|
||||
在 `backend/app/core/config.py` 中添加了允许的来源:
|
||||
|
||||
```python
|
||||
CORS_ORIGINS: str = "http://localhost:3000,http://127.0.0.1:3000,http://localhost:8038,http://101.43.95.130:8038"
|
||||
```
|
||||
|
||||
### 2. 更新前端API地址 ✅
|
||||
|
||||
修改了 `frontend/src/api/index.ts`,使其能够根据当前主机自动推断后端地址:
|
||||
|
||||
- 如果前端运行在 `localhost`,后端使用 `http://localhost:8037`
|
||||
- 如果前端运行在公网IP(如 `101.43.95.130:8038`),后端使用 `http://101.43.95.130:8037`
|
||||
|
||||
### 3. 更新Docker Compose配置 ✅
|
||||
|
||||
在 `docker-compose.dev.yml` 中:
|
||||
- 前端环境变量:`VITE_API_URL=http://101.43.95.130:8037`
|
||||
- 后端环境变量:添加 `CORS_ORIGINS` 配置
|
||||
|
||||
## 验证
|
||||
|
||||
重启服务后,CORS问题应该已解决:
|
||||
|
||||
```bash
|
||||
# 重启服务
|
||||
docker-compose -f docker-compose.dev.yml restart frontend backend
|
||||
|
||||
# 验证CORS配置
|
||||
curl -X OPTIONS http://localhost:8037/api/v1/auth/register \
|
||||
-H "Origin: http://101.43.95.130:8038" \
|
||||
-H "Access-Control-Request-Method: POST" \
|
||||
-v
|
||||
```
|
||||
|
||||
应该看到 `Access-Control-Allow-Origin: http://101.43.95.130:8038` 响应头。
|
||||
|
||||
## 注意事项
|
||||
|
||||
1. **生产环境配置**:在生产环境中,应该:
|
||||
- 使用HTTPS
|
||||
- 限制CORS来源为实际的前端域名
|
||||
- 不要使用 `*` 作为允许的来源
|
||||
|
||||
2. **API路径**:确保API路径正确:
|
||||
- 注册API:`/api/v1/auth/register`(不是 `/auth/register`)
|
||||
|
||||
3. **网络配置**:确保:
|
||||
- 后端服务监听在 `0.0.0.0:8037`(不是 `127.0.0.1`)
|
||||
- 防火墙允许8037端口访问
|
||||
|
||||
---
|
||||
|
||||
**状态**: ✅ 已修复
|
||||
**时间**: 2024年
|
||||
110
docs/bugfixes/保存失败问题解决.md
Normal file
110
docs/bugfixes/保存失败问题解决.md
Normal file
@@ -0,0 +1,110 @@
|
||||
# 保存失败问题解决方案
|
||||
|
||||
## 问题描述
|
||||
|
||||
点击保存工作流时出现两个错误:
|
||||
1. **CORS错误**:`Access to XMLHttpRequest... blocked by CORS policy`
|
||||
2. **500内部服务器错误**:`POST /api/v1/workflows 500 (Internal Server Error)`
|
||||
|
||||
## 问题原因
|
||||
|
||||
### 1. 500错误 ✅ 已修复
|
||||
|
||||
**原因**:`WorkflowResponse` 模型期望 `created_at` 和 `updated_at` 是字符串类型,但数据库模型返回的是 `datetime` 对象,导致响应验证失败。
|
||||
|
||||
**修复**:将 `WorkflowResponse` 中的 `created_at` 和 `updated_at` 从 `str` 改为 `datetime` 类型。
|
||||
|
||||
```python
|
||||
# 修复前
|
||||
created_at: str
|
||||
updated_at: str
|
||||
|
||||
# 修复后
|
||||
from datetime import datetime
|
||||
created_at: datetime
|
||||
updated_at: datetime
|
||||
```
|
||||
|
||||
### 2. CORS错误
|
||||
|
||||
**原因**:虽然配置中包含了 `http://101.43.95.130:8038`,但可能:
|
||||
- CORS中间件配置需要重启服务才能生效
|
||||
- 或者浏览器缓存了旧的CORS响应
|
||||
|
||||
**解决方案**:
|
||||
1. 后端服务已重启,CORS配置应该已生效
|
||||
2. 如果仍有问题,请清除浏览器缓存或使用无痕模式
|
||||
|
||||
## 修复内容
|
||||
|
||||
### 1. 修复响应模型 ✅
|
||||
|
||||
**文件**:`backend/app/api/workflows.py`
|
||||
|
||||
- 添加 `from datetime import datetime`
|
||||
- 将 `WorkflowResponse` 中的 `created_at` 和 `updated_at` 改为 `datetime` 类型
|
||||
|
||||
### 2. 重启后端服务 ✅
|
||||
|
||||
- 重启后端服务以应用修复
|
||||
|
||||
## 测试步骤
|
||||
|
||||
1. **清除浏览器缓存**(推荐):
|
||||
- 按 `Ctrl+Shift+Delete` 清除缓存
|
||||
- 或使用无痕模式(`Ctrl+Shift+N`)
|
||||
|
||||
2. **刷新页面**:
|
||||
- 按 `Ctrl+F5` 强制刷新
|
||||
|
||||
3. **测试保存**:
|
||||
- 创建工作流
|
||||
- 添加节点和连接
|
||||
- 点击"保存"按钮
|
||||
- 应该看到"工作流已创建"或"工作流已保存"的成功提示
|
||||
|
||||
4. **检查控制台**:
|
||||
- 打开浏览器控制台(F12)
|
||||
- 应该不再出现500错误
|
||||
- 如果仍有CORS错误,请清除缓存后重试
|
||||
|
||||
## 如果仍有问题
|
||||
|
||||
### 检查CORS配置
|
||||
|
||||
1. **确认后端CORS配置**:
|
||||
```bash
|
||||
docker-compose -f docker-compose.dev.yml exec backend python -c "from app.core.config import settings; print(settings.CORS_ORIGINS)"
|
||||
```
|
||||
应该包含:`http://101.43.95.130:8038`
|
||||
|
||||
2. **检查后端日志**:
|
||||
```bash
|
||||
docker-compose -f docker-compose.dev.yml logs --tail=50 backend
|
||||
```
|
||||
|
||||
3. **测试API**:
|
||||
```bash
|
||||
curl -X POST http://101.43.95.130:8037/api/v1/workflows \
|
||||
-H "Content-Type: application/json" \
|
||||
-H "Authorization: Bearer YOUR_TOKEN" \
|
||||
-H "Origin: http://101.43.95.130:8038" \
|
||||
-d '{"name":"test","nodes":[],"edges":[]}'
|
||||
```
|
||||
|
||||
### 常见问题
|
||||
|
||||
1. **仍然出现CORS错误**:
|
||||
- 清除浏览器缓存
|
||||
- 使用无痕模式
|
||||
- 检查后端服务是否正常运行
|
||||
|
||||
2. **仍然出现500错误**:
|
||||
- 检查后端日志:`docker-compose -f docker-compose.dev.yml logs backend`
|
||||
- 确认数据库连接正常
|
||||
- 确认用户已登录(有有效的token)
|
||||
|
||||
---
|
||||
|
||||
**状态**: ✅ 已修复
|
||||
**时间**: 2024年
|
||||
83
docs/bugfixes/修复说明.md
Normal file
83
docs/bugfixes/修复说明.md
Normal file
@@ -0,0 +1,83 @@
|
||||
# CORS和Private Network Access问题修复
|
||||
|
||||
## 问题原因
|
||||
|
||||
浏览器阻止了从公网IP (`101.43.95.130:8038`) 访问 `localhost:8037` 的请求,这是浏览器的**Private Network Access (PNA)**安全策略。
|
||||
|
||||
错误信息:
|
||||
```
|
||||
Access to XMLHttpRequest at 'http://localhost:8037/api/v1/auth/register'
|
||||
from origin 'http://101.43.95.130:8038' has been blocked by CORS policy:
|
||||
The request client is not a secure context and the resource is in more-private address space `local`.
|
||||
```
|
||||
|
||||
## 解决方案
|
||||
|
||||
### 1. 前端API地址自动推断 ✅
|
||||
|
||||
修改了 `frontend/src/api/index.ts`,使其能够:
|
||||
- 检测当前访问的主机名
|
||||
- 如果是从公网IP访问,自动使用相同的IP地址访问后端
|
||||
- 例如:前端在 `101.43.95.130:8038`,后端自动使用 `101.43.95.130:8037`
|
||||
|
||||
### 2. 后端CORS配置 ✅
|
||||
|
||||
已在后端配置中允许来自 `http://101.43.95.130:8038` 的请求。
|
||||
|
||||
### 3. 后端监听地址 ✅
|
||||
|
||||
确保后端监听在 `0.0.0.0:8000`(容器内),映射到主机的 `8037` 端口。
|
||||
|
||||
## 验证步骤
|
||||
|
||||
1. **刷新浏览器页面**(清除缓存)
|
||||
2. **打开浏览器控制台**,查看是否有新的错误
|
||||
3. **尝试注册**,应该不再出现CORS错误
|
||||
|
||||
## 如果仍有问题
|
||||
|
||||
### 检查1:后端是否可访问
|
||||
|
||||
```bash
|
||||
# 从服务器测试
|
||||
curl http://101.43.95.130:8037/health
|
||||
|
||||
# 应该返回: {"status":"healthy"}
|
||||
```
|
||||
|
||||
### 检查2:CORS响应头
|
||||
|
||||
```bash
|
||||
curl -X OPTIONS http://101.43.95.130:8037/api/v1/auth/register \
|
||||
-H "Origin: http://101.43.95.130:8038" \
|
||||
-H "Access-Control-Request-Method: POST" \
|
||||
-v
|
||||
```
|
||||
|
||||
应该看到 `Access-Control-Allow-Origin: http://101.43.95.130:8038` 响应头。
|
||||
|
||||
### 检查3:防火墙
|
||||
|
||||
确保服务器的8037端口对外开放:
|
||||
|
||||
```bash
|
||||
# 检查端口是否开放
|
||||
netstat -tlnp | grep 8037
|
||||
# 或
|
||||
ss -tlnp | grep 8037
|
||||
```
|
||||
|
||||
### 检查4:浏览器控制台
|
||||
|
||||
打开浏览器开发者工具(F12),查看:
|
||||
- Network标签:检查实际请求的URL
|
||||
- Console标签:查看是否有新的错误信息
|
||||
|
||||
## 关键点
|
||||
|
||||
**重要**:前端从公网IP访问时,**绝对不能**使用 `localhost` 作为后端地址,必须使用相同的公网IP地址。
|
||||
|
||||
---
|
||||
|
||||
**状态**: ✅ 已修复
|
||||
**时间**: 2024年
|
||||
101
docs/bugfixes/最终修复说明.md
Normal file
101
docs/bugfixes/最终修复说明.md
Normal file
@@ -0,0 +1,101 @@
|
||||
# CORS问题最终修复方案
|
||||
|
||||
## 问题根源
|
||||
|
||||
浏览器阻止从公网IP (`101.43.95.130:8038`) 访问 `localhost:8037`,这是浏览器的**Private Network Access (PNA)**安全策略,无法通过CORS配置绕过。
|
||||
|
||||
## 解决方案
|
||||
|
||||
### 核心修复:前端API地址自动推断
|
||||
|
||||
修改了 `frontend/src/api/index.ts`,**优先使用浏览器当前主机名**来推断API地址,而不是依赖环境变量:
|
||||
|
||||
```typescript
|
||||
// 关键逻辑:
|
||||
// 1. 如果前端在 localhost,后端使用 localhost:8037
|
||||
// 2. 如果前端在公网IP (101.43.95.130:8038),后端使用 101.43.95.130:8037
|
||||
// 3. 这样避免了从公网访问localhost的问题
|
||||
```
|
||||
|
||||
### 为什么这样修复?
|
||||
|
||||
1. **浏览器安全策略**:浏览器不允许从公网IP访问localhost,这是硬性限制
|
||||
2. **环境变量问题**:即使设置了环境变量,如果设置为localhost,仍然会被阻止
|
||||
3. **自动推断**:根据当前访问的主机名自动推断,确保前后端在同一网络地址空间
|
||||
|
||||
## 验证步骤
|
||||
|
||||
1. **强制刷新浏览器**(重要!)
|
||||
- Windows/Linux: `Ctrl + F5` 或 `Ctrl + Shift + R`
|
||||
- Mac: `Cmd + Shift + R`
|
||||
|
||||
2. **打开浏览器控制台**(F12)
|
||||
- 查看Console标签,应该看到:`[API] 自动检测API地址: http://101.43.95.130:8037`
|
||||
- 如果看到这个日志,说明API地址已正确设置
|
||||
|
||||
3. **尝试注册**
|
||||
- 应该不再出现CORS错误
|
||||
- 请求应该发送到 `http://101.43.95.130:8037/api/v1/auth/register`
|
||||
|
||||
## 如果仍有问题
|
||||
|
||||
### 检查1:查看浏览器控制台日志
|
||||
|
||||
打开控制台,应该看到:
|
||||
```
|
||||
[API] 自动检测API地址: http://101.43.95.130:8037 (当前主机: 101.43.95.130)
|
||||
```
|
||||
|
||||
如果没有看到,说明代码没有正确加载,需要:
|
||||
- 清除浏览器缓存
|
||||
- 强制刷新页面
|
||||
|
||||
### 检查2:查看Network标签
|
||||
|
||||
1. 打开开发者工具(F12)
|
||||
2. 切换到Network标签
|
||||
3. 尝试注册
|
||||
4. 查看请求的URL,应该是 `http://101.43.95.130:8037/api/v1/auth/register`
|
||||
5. 如果仍然是 `localhost:8037`,说明代码没有生效
|
||||
|
||||
### 检查3:后端可访问性
|
||||
|
||||
```bash
|
||||
# 测试后端是否可以从公网访问
|
||||
curl http://101.43.95.130:8037/health
|
||||
|
||||
# 应该返回: {"status":"healthy"}
|
||||
```
|
||||
|
||||
### 检查4:CORS响应头
|
||||
|
||||
```bash
|
||||
curl -X OPTIONS http://101.43.95.130:8037/api/v1/auth/register \
|
||||
-H "Origin: http://101.43.95.130:8038" \
|
||||
-H "Access-Control-Request-Method: POST" \
|
||||
-v 2>&1 | grep -i "access-control"
|
||||
```
|
||||
|
||||
应该看到:
|
||||
```
|
||||
< Access-Control-Allow-Origin: http://101.43.95.130:8038
|
||||
```
|
||||
|
||||
## 关键点总结
|
||||
|
||||
1. ✅ **前端代码已修复**:自动根据当前主机名推断API地址
|
||||
2. ✅ **后端CORS已配置**:允许来自 `101.43.95.130:8038` 的请求
|
||||
3. ✅ **后端监听正确**:监听在 `0.0.0.0:8000`,映射到主机 `8037` 端口
|
||||
4. ⚠️ **必须强制刷新浏览器**:清除缓存,加载新代码
|
||||
|
||||
## 下一步
|
||||
|
||||
如果修复后仍然有问题,请提供:
|
||||
1. 浏览器控制台的完整错误信息
|
||||
2. Network标签中实际请求的URL
|
||||
3. 后端日志(`docker-compose logs backend`)
|
||||
|
||||
---
|
||||
|
||||
**状态**: ✅ 已修复(需要强制刷新浏览器)
|
||||
**时间**: 2024年
|
||||
176
docs/bugfixes/错误处理优化说明.md
Normal file
176
docs/bugfixes/错误处理优化说明.md
Normal file
@@ -0,0 +1,176 @@
|
||||
# 错误处理优化说明
|
||||
|
||||
## ✅ 已完成
|
||||
|
||||
已实现统一的错误处理机制,包括后端错误处理和前端错误提示优化。
|
||||
|
||||
## 功能特性
|
||||
|
||||
### 1. 后端错误处理
|
||||
|
||||
#### 自定义异常类 (`backend/app/core/exceptions.py`)
|
||||
|
||||
- `BaseAPIException`: 基础API异常类
|
||||
- `ValidationError`: 验证错误 (400)
|
||||
- `NotFoundError`: 资源未找到错误 (404)
|
||||
- `UnauthorizedError`: 未授权错误 (401)
|
||||
- `ForbiddenError`: 禁止访问错误 (403)
|
||||
- `ConflictError`: 资源冲突错误 (409)
|
||||
- `InternalServerError`: 内部服务器错误 (500)
|
||||
- `WorkflowExecutionError`: 工作流执行错误 (500)
|
||||
|
||||
#### 全局错误处理器 (`backend/app/core/error_handler.py`)
|
||||
|
||||
- `validation_exception_handler`: 处理请求验证错误
|
||||
- `api_exception_handler`: 处理自定义API异常
|
||||
- `sqlalchemy_exception_handler`: 处理数据库错误
|
||||
- `general_exception_handler`: 处理通用异常
|
||||
|
||||
#### 统一错误响应格式
|
||||
|
||||
所有错误响应都遵循以下格式:
|
||||
|
||||
```json
|
||||
{
|
||||
"error": "ERROR_CODE",
|
||||
"message": "错误描述信息",
|
||||
"details": [] // 可选,详细错误信息
|
||||
}
|
||||
```
|
||||
|
||||
### 2. 前端错误处理
|
||||
|
||||
#### API拦截器优化 (`frontend/src/api/index.ts`)
|
||||
|
||||
- **401未授权**: 自动清除token并跳转到登录页
|
||||
- **403禁止访问**: 显示无权访问提示
|
||||
- **404未找到**: 显示资源不存在提示
|
||||
- **422验证错误**: 显示详细的字段验证错误
|
||||
- **500服务器错误**: 显示服务器错误提示
|
||||
- **网络错误**: 显示网络连接错误提示
|
||||
|
||||
#### 错误提示优化
|
||||
|
||||
- 使用Element Plus的`ElMessage`组件显示错误
|
||||
- 根据错误类型显示不同的错误信息
|
||||
- 记录错误日志到控制台
|
||||
|
||||
### 3. 工作流执行错误处理
|
||||
|
||||
#### 详细错误信息
|
||||
|
||||
- 节点执行失败时,记录节点ID和节点类型
|
||||
- 包含详细的错误堆栈信息
|
||||
- 错误信息包含上下文信息
|
||||
|
||||
#### 错误日志
|
||||
|
||||
- 使用Python logging模块记录错误
|
||||
- 记录请求日志(方法、路径、状态码、耗时)
|
||||
- 记录异常堆栈信息
|
||||
|
||||
## 使用示例
|
||||
|
||||
### 后端使用自定义异常
|
||||
|
||||
```python
|
||||
from app.core.exceptions import NotFoundError, ConflictError, ValidationError
|
||||
|
||||
# 资源未找到
|
||||
if not workflow:
|
||||
raise NotFoundError("工作流", workflow_id)
|
||||
|
||||
# 资源冲突
|
||||
if user_exists:
|
||||
raise ConflictError("用户名已存在")
|
||||
|
||||
# 验证错误
|
||||
if not valid_data:
|
||||
raise ValidationError("数据验证失败")
|
||||
```
|
||||
|
||||
### 前端错误处理
|
||||
|
||||
前端会自动处理所有HTTP错误,并显示相应的提示信息:
|
||||
|
||||
```typescript
|
||||
// 自动处理,无需手动处理
|
||||
try {
|
||||
await api.post('/api/v1/workflows', workflowData)
|
||||
} catch (error) {
|
||||
// 错误已在拦截器中处理,这里可以添加额外逻辑
|
||||
console.error('保存失败:', error)
|
||||
}
|
||||
```
|
||||
|
||||
## 错误响应示例
|
||||
|
||||
### 验证错误 (422)
|
||||
|
||||
```json
|
||||
{
|
||||
"error": "VALIDATION_ERROR",
|
||||
"message": "请求参数验证失败",
|
||||
"details": [
|
||||
{
|
||||
"field": "name",
|
||||
"message": "字段不能为空",
|
||||
"type": "value_error.missing"
|
||||
}
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
### 资源未找到 (404)
|
||||
|
||||
```json
|
||||
{
|
||||
"error": "NOT_FOUND",
|
||||
"message": "工作流不存在: abc123"
|
||||
}
|
||||
```
|
||||
|
||||
### 工作流执行错误 (500)
|
||||
|
||||
```json
|
||||
{
|
||||
"error": "WORKFLOW_EXECUTION_ERROR",
|
||||
"message": "节点 node-1 执行失败: LLM调用失败"
|
||||
}
|
||||
```
|
||||
|
||||
## 日志记录
|
||||
|
||||
### 请求日志
|
||||
|
||||
```
|
||||
2024-01-17 00:25:49 - INFO - POST /api/v1/workflows - 客户端: 192.168.1.1
|
||||
2024-01-17 00:25:49 - INFO - POST /api/v1/workflows - 状态码: 201 - 耗时: 0.123s
|
||||
```
|
||||
|
||||
### 错误日志
|
||||
|
||||
```
|
||||
2024-01-17 00:25:49 - ERROR - API异常: 工作流不存在 (错误码: NOT_FOUND)
|
||||
2024-01-17 00:25:49 - ERROR - 节点执行失败: node-1 (llm) - LLM调用失败
|
||||
```
|
||||
|
||||
## 优势
|
||||
|
||||
1. **统一格式**: 所有错误响应遵循统一格式
|
||||
2. **详细日志**: 记录完整的错误信息和堆栈
|
||||
3. **用户友好**: 前端自动显示友好的错误提示
|
||||
4. **易于调试**: 错误信息包含上下文信息
|
||||
5. **类型安全**: 使用自定义异常类,类型明确
|
||||
|
||||
## 后续计划
|
||||
|
||||
- [ ] 添加错误监控和告警
|
||||
- [ ] 实现错误重试机制
|
||||
- [ ] 添加错误统计和分析
|
||||
- [ ] 实现错误恢复机制
|
||||
|
||||
---
|
||||
|
||||
**状态**: ✅ 已完成
|
||||
**时间**: 2024年
|
||||
67
docs/bugfixes/问题解决.md
Normal file
67
docs/bugfixes/问题解决.md
Normal file
@@ -0,0 +1,67 @@
|
||||
# 注册失败问题 - 已解决 ✅
|
||||
|
||||
## 问题原因
|
||||
|
||||
注册失败有两个原因:
|
||||
|
||||
1. **数据库不存在** - 数据库 `agent_db` 不存在
|
||||
2. **密码哈希错误** - passlib的bcrypt在初始化时遇到密码长度限制问题
|
||||
|
||||
## 解决方案
|
||||
|
||||
### 1. 创建数据库 ✅
|
||||
|
||||
已成功创建数据库和所有表结构:
|
||||
|
||||
```bash
|
||||
# 创建数据库
|
||||
docker-compose -f docker-compose.dev.yml exec backend python /app/scripts/create_database.py
|
||||
|
||||
# 创建表结构
|
||||
docker-compose -f docker-compose.dev.yml exec backend python -c "from app.core.database import init_db; init_db(); print('✅ 数据库表创建成功')"
|
||||
```
|
||||
|
||||
### 2. 修复密码哈希 ✅
|
||||
|
||||
将密码加密从 `passlib` 改为直接使用 `bcrypt` 库,避免初始化时的bug检测问题:
|
||||
|
||||
- 使用 `bcrypt.hashpw()` 和 `bcrypt.checkpw()` 直接处理密码
|
||||
- 正确处理72字节长度限制
|
||||
- 移除了对 `passlib` 的依赖
|
||||
|
||||
## 验证
|
||||
|
||||
✅ 数据库创建成功
|
||||
✅ 表结构创建成功
|
||||
✅ 注册功能测试通过
|
||||
|
||||
### 测试结果
|
||||
|
||||
```bash
|
||||
curl -X POST http://localhost:8037/api/v1/auth/register \
|
||||
-H "Content-Type: application/json" \
|
||||
-d '{"username":"demo","email":"demo@test.com","password":"demo123"}'
|
||||
|
||||
# 返回: {"id":"...","username":"demo","email":"demo@test.com","role":"user"}
|
||||
```
|
||||
|
||||
## 已创建的表
|
||||
|
||||
- ✅ `users` - 用户表
|
||||
- ✅ `workflows` - 工作流表
|
||||
- ✅ `agents` - 智能体表
|
||||
- ✅ `executions` - 执行记录表
|
||||
- ✅ `model_configs` - 模型配置表
|
||||
|
||||
## 下一步
|
||||
|
||||
现在可以:
|
||||
1. ✅ 注册新用户
|
||||
2. ✅ 登录系统
|
||||
3. ✅ 创建工作流
|
||||
4. ✅ 使用可视化编辑器
|
||||
|
||||
---
|
||||
|
||||
**状态**: ✅ 已解决
|
||||
**时间**: 2024年
|
||||
Reference in New Issue
Block a user