feat: 初始化考培练系统项目

- 从服务器拉取完整代码
- 按框架规范整理项目结构
- 配置 Drone CI 测试环境部署
- 包含后端(FastAPI)、前端(Vue3)、管理端

技术栈: Vue3 + TypeScript + FastAPI + MySQL
This commit is contained in:
111
2026-01-24 19:33:28 +08:00
commit 998211c483
1197 changed files with 228429 additions and 0 deletions

View File

@@ -0,0 +1,186 @@
"""
团队看板API测试脚本
用于验证团队看板所有接口的功能
"""
import asyncio
import httpx
# 配置
BASE_URL = "http://localhost:8000"
# 需要先登录获取token
TOKEN = "your_token_here" # 替换为实际的token
headers = {
"Authorization": f"Bearer {TOKEN}",
"Content-Type": "application/json"
}
async def test_overview():
"""测试团队概览接口"""
print("\n=== 测试团队概览接口 ===")
async with httpx.AsyncClient() as client:
response = await client.get(
f"{BASE_URL}/api/v1/team/dashboard/overview",
headers=headers
)
print(f"状态码: {response.status_code}")
data = response.json()
print(f"响应数据: {data}")
if data.get("code") == 200:
result = data.get("data", {})
print(f"✅ 团队成员数: {result.get('member_count')}")
print(f"✅ 平均学习进度: {result.get('avg_progress')}%")
print(f"✅ 平均考试成绩: {result.get('avg_score')}")
print(f"✅ 课程完成率: {result.get('course_completion_rate')}%")
else:
print(f"❌ 失败: {data.get('message')}")
async def test_progress():
"""测试学习进度接口"""
print("\n=== 测试学习进度接口 ===")
async with httpx.AsyncClient() as client:
response = await client.get(
f"{BASE_URL}/api/v1/team/dashboard/progress",
headers=headers
)
print(f"状态码: {response.status_code}")
data = response.json()
if data.get("code") == 200:
result = data.get("data", {})
print(f"✅ 成员列表: {result.get('members')}")
print(f"✅ 周数: {len(result.get('weeks', []))}")
print(f"✅ 数据条数: {len(result.get('data', []))}")
else:
print(f"❌ 失败: {data.get('message')}")
async def test_course_distribution():
"""测试课程分布接口"""
print("\n=== 测试课程分布接口 ===")
async with httpx.AsyncClient() as client:
response = await client.get(
f"{BASE_URL}/api/v1/team/dashboard/course-distribution",
headers=headers
)
print(f"状态码: {response.status_code}")
data = response.json()
if data.get("code") == 200:
result = data.get("data", {})
print(f"✅ 已完成: {result.get('completed')}")
print(f"✅ 进行中: {result.get('in_progress')}")
print(f"✅ 未开始: {result.get('not_started')}")
else:
print(f"❌ 失败: {data.get('message')}")
async def test_ability_analysis():
"""测试能力分析接口"""
print("\n=== 测试能力分析接口 ===")
async with httpx.AsyncClient() as client:
response = await client.get(
f"{BASE_URL}/api/v1/team/dashboard/ability-analysis",
headers=headers
)
print(f"状态码: {response.status_code}")
data = response.json()
if data.get("code") == 200:
result = data.get("data", {})
radar = result.get('radar_data', {})
print(f"✅ 能力维度: {radar.get('dimensions')}")
print(f"✅ 能力分数: {radar.get('values')}")
print(f"✅ 短板数量: {len(result.get('weaknesses', []))}")
else:
print(f"❌ 失败: {data.get('message')}")
async def test_rankings():
"""测试排行榜接口"""
print("\n=== 测试排行榜接口 ===")
async with httpx.AsyncClient() as client:
response = await client.get(
f"{BASE_URL}/api/v1/team/dashboard/rankings",
headers=headers
)
print(f"状态码: {response.status_code}")
data = response.json()
if data.get("code") == 200:
result = data.get("data", {})
study_ranking = result.get('study_time_ranking', [])
score_ranking = result.get('score_ranking', [])
print(f"✅ 学习时长排行: {len(study_ranking)}")
if study_ranking:
print(f" 第一名: {study_ranking[0].get('name')} - {study_ranking[0].get('study_time')}小时")
print(f"✅ 成绩排行: {len(score_ranking)}")
if score_ranking:
print(f" 第一名: {score_ranking[0].get('name')} - {score_ranking[0].get('avg_score')}")
else:
print(f"❌ 失败: {data.get('message')}")
async def test_activities():
"""测试团队动态接口"""
print("\n=== 测试团队动态接口 ===")
async with httpx.AsyncClient() as client:
response = await client.get(
f"{BASE_URL}/api/v1/team/dashboard/activities",
headers=headers
)
print(f"状态码: {response.status_code}")
data = response.json()
if data.get("code") == 200:
result = data.get("data", {})
activities = result.get('activities', [])
print(f"✅ 活动记录数: {len(activities)}")
if activities:
print(f" 最新活动: {activities[0].get('user_name')} {activities[0].get('action')} {activities[0].get('target')}")
else:
print(f"❌ 失败: {data.get('message')}")
async def main():
"""运行所有测试"""
print("=" * 60)
print("团队看板API测试")
print("=" * 60)
# 检查token是否设置
if TOKEN == "your_token_here":
print("\n⚠️ 请先设置TOKEN变量在文件顶部")
print(" 可以通过以下步骤获取:")
print(" 1. 访问 http://localhost:3001")
print(" 2. 登录系统admin账号")
print(" 3. 打开浏览器开发者工具 -> Application -> Local Storage")
print(" 4. 找到 token 或 access_token")
return
try:
await test_overview()
await test_progress()
await test_course_distribution()
await test_ability_analysis()
await test_rankings()
await test_activities()
print("\n" + "=" * 60)
print("✅ 所有测试完成!")
print("=" * 60)
except Exception as e:
print(f"\n❌ 测试失败: {e}")
import traceback
traceback.print_exc()
if __name__ == "__main__":
asyncio.run(main())