本文档旨在为前端开发人员提供与后端API交互所需的所有信息。
/api/v3 为前缀 (具体URL需根据部署情况配置)。POST /api/v3/register 接口进行注册。POST /api/v3/login 接口进行登录。access_token 和 user_info 对象。access_token (例如,使用 localStorage、sessionStorage 或 cookie)。access_token。
Authorization: Bearer {your_access_token}
user_info注册或登录成功后,前端会收到一个 user_info 对象,建议将其保存在全局状态管理器中 (如 Pinia/Vuex),以便在各个页面和组件中使用。
"user_info": {
"user_id": "user-abc-123", // 用户的唯一、固定ID,安全
"medical_record_number": "J0012345", // 就诊号,用于登录
"name": "张三",
"gender": "男",
"dominant_hand": "右",
"diagnosis": "无",
"dob": "1960-01-15",
"height_cm": 175,
"weight_kg": 70,
"contact": "13800138000",
"inpatient_number": "Z67890",
"bed_number": "503",
"education_level": "本科",
"education_years": 16,
"remarks": ""
}
API会返回标准化的错误响应,前端可以根据 code 和 error_details.type 来实现精细化的错误提示。
// 示例:参数验证失败
{
"status": "error",
"code": 400,
"message": "Invalid Parameters",
"error_details": {
"type": "validation_error",
"description": "参数验证失败",
"fields": {
"field_name": "错误描述"
}
}
}
POST /api/v3/register{
"medical_record_number": "string", // 就诊号, 将作为登录用户名
"id_last_six": "string", // 身份证后六位, 将作为登录密码
"name": "string",
"gender": "string",
"dominant_hand": "string",
"diagnosis": "string",
"dob": "string", // 格式: YYYY-MM-DD
"height_cm": "number",
"weight_kg": "number",
"contact": "string",
"inpatient_number": "string", // 可选
"bed_number": "string", // 可选
"education_level": "string", // 可选
"education_years": "number", // 可选
"remarks": "string" // 可选
}
access_token 和 user_info。
{
"status": "success",
"code": 200,
"data": {
"access_token": "...",
"token_type": "Bearer",
"is_admin": false,
"user_info": { ... }
},
"message": "注册成功并自动登录"
}
POST /api/v3/login{
"username": "string", // medical_record_number 或管理员用户名
"password": "string" // id_last_six 或管理员密码
}
access_token 和 user_info。access_token 和 is_admin: true。user_info。用户确认后,前端负责路由跳转到下一页。POST /api/v3/streams (开始推流){
"status": "success",
"code": 200,
"data": {
"stream_id": "stream_123456",
"ws_url": "ws://{host}/api/v3/ws/streams/{stream_id}?token={access_token}",
"message": "推流服务已启动,请建立WebSocket连接"
}
}
ws_url 后,立即建立WebSocket连接。DELETE /api/v3/streams/{stream_id} (停止推流)POST /api/v3/streams 接口返回。{
"video_frame": "base64_encoded_image", // Base64编码的视频帧
"timestamp": "...",
"stream_id": "...",
"analysis_data": {
"stage": "stand_up" // 当前阶段标识
}
}
stage 后,根据该标识显示对应的提示文本和播放语音。所有提示内容(文本、音频文件)预置在前端。GET /api/v3/videos (获取视频及问卷列表){
"status": "success",
"code": 200,
"data": {
"videos": [
{
"video_id": "video_123456",
"title": "...",
"description": "...",
"questions": [ ... ]
}
]
}
}
GET /api/v3/videos/{video_id}.mp4 (获取视频文件)<video> 标签的 src 属性,播放视频。POST /api/v3/video-sessions 接口动态返回(注意:此API尚未在文档中明确定义,需与后端确认)。{"type": "handwriting_stroke", "payload": ...}{"command": "end_session"}此页面交互是异步的,前端需要使用 SSE (Server-Sent Events) 来接收实时进度。
POST /api/v3/audio-sessions (开始会话)session_id。POST /api/v3/audio-sessions/{session_id}/interact (上传音频并发起处理)multipart/form-data,包含名为 audio 的文件。{
"status": "accepted",
"code": 202,
"data": {
"request_id": "req_abc123",
"events_url": "/api/v3/audio-sessions/{session_id}/events/{request_id}",
"message": "请求已接收,请连接到events_url获取实时进度"
}
}
GET /api/v3/audio-sessions/{session_id}/events/{request_id} (监听事件)events_url 建立SSE连接。text/event-streamevent: asr_result
data: {"status": "success", "text": "用户说的话"}
event: ai_result
data: {"status": "success", "text": "AI的回复文本"}
event: tts_result
data: {"status": "success", "audio_url": "/api/v3/audios/audio_xyz.wav"}
event: done
data: {"status": "success", "message": "处理完成"}
event: error
data: {"status": "error", "stage": "asr", "message": "ASR处理失败"}
GET /api/v3/audios/{audio_id}.wav (获取音频文件)GET /api/v3/admin/logs{
"status": "success",
"code": 200,
"data": {
"tables": [
{
"table_name": "test_20240315_1",
"created_at": "2024-03-15T14:30:00Z",
"description": "2024年3月15日第一次测试"
},
{
"table_name": "test_20240315_2",
"created_at": "2024-03-15T16:30:00Z",
"description": "2024年3月15日第二次测试"
}
]
}
}
GET /api/v3/admin/logs/{table_name}page (number, optional, default: 1): 页码page_size (number, optional, default: 50): 每页数量{
"status": "success",
"code": 200,
"data": {
"total": 100,
"total_pages": 2,
"current_page": 1,
"page_size": 50,
"records": [
{
"log_id": 1,
"medical_record_number": "J0012345",
"name": "张三",
"created_at": "2024-03-15T08:30:00Z",
"status": "completed"
}
]
}
}
status 字段说明:
initialized: 已初始化processing: 数据处理中pending_review: 待专家审核completed: 已完成所有此部分的API都需要认证,并使用路径参数 /api/v3/admin/logs/{table_name}/{log_id}/...
GET .../gait: 获取步态分析数据(包含事件、分段和计算指标)。POST .../gait/events: 提交修正后的事件标记,后端将重新计算并返回更新后的数据。
{
"events": [
{ "event": "stand_up", "frame": 85 },
{ "event": "walk_start", "frame": 180 },
{ "event": "walk_end", "frame": 840 }
]
}
GET .../facial: 获取面部表情视频URL及当前UPDRS评级。POST .../facial/rating: 提交或更新UPDRS评级。
{"rating": 2} (评级范围: 0-4)GET .../eyetracking: 获取眼动分析视频URL及当前评级。POST .../eyetracking/rating: 提交或更新评级。
{"rating": 3} (评级范围: 0-4)GET .../handwriting: 获取手写数据视频URL及当前评级。POST .../handwriting/rating: 提交或更新评级。{"rating": 1} (评级范围: 0-4)GET .../speech: 获取语音样本URL及当前评级。POST .../speech/rating: 提交或更新评级。{"rating": 3} (评级范围: 0-4)GET .../semantics: 获取文本内容及当前评级。POST .../semantics/rating: 提交或更新评级。{"rating": 1} (评级范围: 0-4)GET .../raw: 下载原始时序数据 (CSV文件)。Content-Type: text/csv, Content-Disposition: attachment; filename="..."