初始提交: Qihu-AIFlow v2.0.1 完整项目

- 前端 React+TypeScript (源码+构建产物)
- 后端 Python FastAPI
- 数据库迁移 001-015
- Docker部署配置
- 微信ClawBot API频道绑定
- 项目文档 README.md
This commit is contained in:
qyyfw committed 2026-07-02 14:40:46 +08:00
commit 78ff261b5a
199 files changed
+69126

No files matched your search

+154
View File
@@ -0,0 +1,154 @@
#!/usr/bin/env python3
"""回归验证:对之前失败的25项接口进行重新测试"""
import requests
import json
from datetime import datetime
BASE_URL = "http://localhost:18080"
API_PREFIX = "/app/api"
ts = int(datetime.now().timestamp())
def api_get(path, token=None, params=None):
h = {"Authorization": f"Bearer {token}"} if token else {}
return requests.get(f"{BASE_URL}{API_PREFIX}{path}", headers=h, params=params, timeout=10)
def api_post(path, token=None, json_data=None):
h = {"Authorization": f"Bearer {token}"} if token else {}
return requests.post(f"{BASE_URL}{API_PREFIX}{path}", headers=h, json=json_data, timeout=10)
def api_put(path, token=None, json_data=None, params=None):
h = {"Authorization": f"Bearer {token}"} if token else {}
return requests.put(f"{BASE_URL}{API_PREFIX}{path}", headers=h, json=json_data, params=params, timeout=10)
passed = 0
failed = 0
failed_list = []
def test(name, method, path, token, data_or_params, expected_check):
global passed, failed
if method == "GET":
resp = api_get(path, token=token, params=data_or_params)
elif method == "POST":
resp = api_post(path, token=token, json_data=data_or_params)
elif method == "PUT":
resp = api_put(path, token=token, json_data=data_or_params)
else:
return
ok = expected_check(resp)
if ok:
passed += 1
print(f" [PASS] {name} | status={resp.status_code}")
else:
failed += 1
failed_list.append((name, resp))
print(f" [FAIL] {name} | status={resp.status_code} | body={resp.text[:150]}")
print("=" * 60)
print("接口回归验证 - 25项失败接口")
print(f"时间: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}")
print("=" * 60)
# 0. 登录
resp = api_post("/auth/login", json_data={"username": "admin", "password": "admin123"})
admin_token = resp.json()["data"]["access_token"]
# 注册测试用户
resp = api_post("/auth/register", json_data={"username": f"regtest_{ts}", "password": "Test123456", "email": f"reg_{ts}@test.com", "phone": f"138{str(ts)[-8:]}"})
user_token = resp.json()["data"]["access_token"]
user_id = resp.json()["data"]["user"]["id"]
print("\n[回归1] AI聊天 - 创建对话 (之前500)")
def check_200(resp):
return resp is not None and resp.status_code == 200 and resp.json().get("code") == 0
test("创建对话", "POST", "/chat/conversations", user_token, {"title": "回归测试对话"}, check_200)
print("\n[回归2] 频道 - 创建频道 (之前500)")
test("创建频道", "POST", "/channels/", user_token, {"name": "回归测试频道", "type": "public"}, check_200)
print("\n[回归3] 知识库 - 创建目录 (之前500)")
resp = api_post("/knowledge/bases", token=user_token, json_data={"name": "回归知识库"})
kb_id = resp.json()["data"]["id"] if resp.status_code == 200 else None
test("创建目录", "POST", "/knowledge/directories", user_token, {"name": "回归目录", "base_id": kb_id}, check_200)
print("\n[回归4] 应用市场 - 上传应用 (之前500)")
test("上传应用", "POST", "/market/apps", user_token, {"name": "回归应用", "type": "skill", "price": 0}, check_200)
print("\n[回归5] Token驾驶舱 - 充值 (之前500)")
test("Token充值", "POST", "/token/recharge", user_token, {"amount": 500}, check_200)
print("\n[回归6] 付费中心 - 获取增值服务列表 (之前500)")
def check_200_any(resp):
return resp is not None and resp.status_code == 200
test("增值服务列表", "GET", "/payment/services", user_token, None, check_200_any)
print("\n[回归7] 付费中心 - 获取优惠券列表 (之前500)")
test("优惠券列表", "GET", "/payment/coupons", user_token, None, check_200_any)
print("\n[回归8] 付费中心 - 创建订单 (之前422)")
plans_resp = api_get("/payment/plans", token=user_token)
plans = plans_resp.json().get("data", []) if plans_resp.status_code == 200 else []
if plans:
test("创建订单", "POST", "/payment/orders", user_token, {"plan_id": plans[0]["id"]}, check_200)
else:
print(" [SKIP] 无可用会员计划")
print("\n[回归9] 个人中心 - 获取个人信息 (之前500)")
test("个人信息", "GET", "/profile/", user_token, None, check_200_any)
print("\n[回归10] 个人中心 - 更新个人信息 (之前500)")
test("更新信息", "PUT", "/profile/", user_token, {"nickname": "回归昵称"}, check_200)
print("\n[回归11] 个人中心 - 修改密码 (之前500)")
test("修改密码", "PUT", "/profile/password", user_token, {"old_password": "Test123456", "new_password": "NewPwd789"}, check_200)
print("\n[回归12] 个人中心 - 获取登录日志 (之前500)")
test("登录日志", "GET", "/profile/login-logs", user_token, None, check_200_any)
print("\n[回归13] 个人中心 - 创建API密钥 (之前500)")
test("创建API密钥", "POST", "/profile/api-keys", user_token, {"name": "回归密钥"}, check_200)
print("\n[回归14] 资产管理 - 创建资产 (之前500)")
test("创建资产", "POST", "/assets/", user_token, {"name": "回归资产.txt", "description": "test"}, check_200)
print("\n[回归15] 资产管理 - 获取分类列表 (之前404)")
def check_200_ok(resp):
return resp is not None and resp.status_code == 200
test("分类列表", "GET", "/assets/categories", user_token, None, check_200_ok)
print("\n[回归16] 用户管理 - 获取注册设置 (之前N/A)")
test("注册设置", "GET", "/admin/users/register-settings", admin_token, None, check_200_ok)
print("\n[回归17] 核心检查 - Token计费 (创建对话,之前N/A)")
# 先获取model_id
resp = api_get("/chat/models")
models = resp.json().get("data", []) if resp.status_code == 200 else []
model_id = models[0]["id"] if models else None
test("Token计费-创建对话", "POST", "/chat/conversations", user_token, {"title": "计费测试", "model_id": model_id}, check_200)
# 其他各项:AI聊天系列 (重命名、置顶、发送消息、消息历史、清空、删除、归档 - 之前都是404)
print("\n[回归18] AI聊天 - 对话管理系列 (之前404-对话不存在)")
# 先创建一个新对话
resp = api_post("/chat/conversations", token=user_token, json_data={"title": "管理测试对话"})
conv_id = resp.json()["data"]["id"] if resp.status_code == 200 else None
if conv_id:
test("对话重命名", "PUT", f"/chat/conversations/{conv_id}", user_token, {"title": "已重命名"}, check_200)
test("对话置顶", "PUT", f"/chat/conversations/{conv_id}", user_token, {"pinned": True}, check_200)
test("发送消息", "POST", f"/chat/conversations/{conv_id}/messages", user_token, {"content": "Hello"}, check_200)
test("消息历史", "GET", f"/chat/conversations/{conv_id}/messages", user_token, None, check_200_any)
test("清空上下文", "POST", f"/chat/conversations/{conv_id}/clear", user_token, None, check_200)
test("对话归档", "PUT", f"/chat/conversations/{conv_id}", user_token, {"status": "archived"}, check_200)
# 创建一个用于删除的对话
resp = api_post("/chat/conversations", token=user_token, json_data={"title": "待删除对话"})
del_conv_id = resp.json()["data"]["id"] if resp.status_code == 200 else None
if del_conv_id:
test("删除对话", "DELETE", f"/chat/conversations/{del_conv_id}", user_token, None, check_200)
print("\n" + "=" * 60)
print(f"回归验证完成: 通过 {passed}, 失败 {failed}")
print(f"通过率: {passed/(passed+failed)*100:.1f}%" if (passed+failed) > 0 else "N/A")
if failed_list:
print("失败项:")
for name, resp in failed_list:
print(f" - {name}: status={resp.status_code}, body={resp.text[:200]}")
print("=" * 60)