|
|
- ## 📌 软件框架概述
- 该架构是一个单机前后端BS架构,没有并发,而且也不可能并发,因为设备层没有那么多冗余资源。
- 软件采用前后端分离的架构,前端采用Vue,后端采用FastAPI,数据库选用向量数据库Postgresql。
-
- ## 📋 页面1:用户注册页面 (扫码)
- - **说明**: 此页面通过二维码引导用户进行自助注册,适用于现场排队等候的场景。管理员可在管理后台生成或展示此注册页面的二维码。
- - **跳转条件**:
- - 新用户注册成功后跳转到基本信息确认页面
- - **路由**: /api/v3/register
- - **访问方式**:POST
- - **注意事项**:
- - 新用户填写完毕后也需要跳信息确认,确认前不要弹给后端
- - 确认后等待后端返回,除非确认成功否则不跳转,提示用户修改对应字段
- - 后端在确认无误后会插入数据库的`patient_info`表单。
- - **请求参数**:
- ```json
- {
- "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", // 身高(cm)
- "weight_kg": "number", // 体重(kg)
- "contact": "string", // 联系方式
- "inpatient_number": "string", // 住院号 (可选)
- "bed_number": "string", // 床号 (可选)
- "education_level": "string", // 教育程度 (可选)
- "education_years": "number", // 教育年数 (可选)
- "remarks": "string" // 备注 (可选)
- }
- ```
- - **响应格式**:
- ```json
- // 注册成功响应
- {
- "status": "success",
- "code": 200,
- "data": {
- "access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
- "token_type": "Bearer",
- "is_admin": false,
- "user_info": {
- "user_id": "user-abc-123",
- "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": ""
- }
- },
- "message": "注册成功并自动登录"
- }
-
- // 用户名已存在响应
- {
- "status": "error",
- "code": 400,
- "message": "Username Already Exists",
- "error_details": {
- "type": "duplicate_username",
- "description": "该用户名已被注册"
- }
- }
-
- // 邮箱已存在响应
- {
- "status": "error",
- "code": 400,
- "message": "Email Already Exists",
- "error_details": {
- "type": "duplicate_email",
- "description": "该邮箱已被注册"
- }
- }
-
- // 参数验证失败响应
- {
- "status": "error",
- "code": 400,
- "message": "Invalid Parameters",
- "error_details": {
- "type": "validation_error",
- "description": "参数验证失败",
- "fields": {
- "email": "邮箱格式不正确",
- "password": "密码长度必须大于6位"
- }
- }
- }
- ```
-
- ## 📋 页面2:登录页面
- - 功能要求:输入用户名密码,发后端验证
- - 跳转条件:登录成功后根据用户类型跳转
- - 管理员用户:跳转到数据库可视化页面
- - 普通用户:跳转到基本信息确认页面
- - 路由: /api/v3/login
- - 访问方式:POST
- - 请求参数:
- ```json
- {
- "username": "string", // 用户名
- "password": "string" // 密码
- }
- ```
- - 响应格式:
- ```json
- // 管理员用户响应
- {
- "status": "success",
- "code": 200,
- "data": {
- "access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
- "token_type": "Bearer",
- "is_admin": true,
- "active_log_table": "log_20240401_1"
- },
- "message": "管理员登录成功,已创建新的测试会话日志表"
- }
-
- // 普通用户响应
- {
- "status": "success",
- "code": 200,
- "data": {
- "access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
- "token_type": "Bearer",
- "is_admin": false,
- "user_info": {
- "user_id": "user-abc-123",
- "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": ""
- }
- },
- "message": "登录成功,令牌长期有效,用户信息已包含在令牌中"
- }
-
- // 错误响应
- {
- "status": "error",
- "code": 401,
- "message": "Unauthorized",
- "error_details": {
- "type": "invalid_credentials",
- "description": "Invalid username or password"
- }
- }
- ```
-
- ## 📋 页面3:基本信息确认页面
- # 功能1:基本信息确认
- - 跳转条件:
- - 普通用户登录或新用户注册成功后直接跳转至此页面
- - 确认信息后跳转到姿态识别页面
- - 路由: 无独立后端API。此页面为纯前端页面,用于展示登录时获取的`user_info`,用户确认后前端负责路由跳转。
- - 如果页面1验证为普通用户,跳转后让他直接确认
-
- ## 📋 页面4:姿态识别页面
- - 跳转条件:
- - 基本信息确认完成后跳转至此页面
- - 测试时间结束显示"功能测试1已结束,将在X秒后跳转下一页面"
- - 结束方式:时间到自动结束,计时由前端执行。
-
- # 功能1:开始姿态识别推流
- - 路由: /api/v3/streams
- - 访问:POST
- - 请求头:
- ```
- Authorization: Bearer {access_token} // 登录接口获取的token
- ```
- - 请求参数:无
- - 响应:
- ```json
- // 开始推流成功响应
- {
- "status": "success",
- "code": 200,
- "data": {
- "stream_id": "stream_123456", // 流ID,用于后续停止推流
- "ws_url": "ws://{host}/api/v3/ws/streams/{stream_id}?token={access_token}",
- "message": "推流服务已启动,请建立WebSocket连接"
- }
- }
-
- // 错误响应 - 摄像头未就绪
- {
- "status": "error",
- "code": 503,
- "message": "摄像头未就绪",
- "error_details": {
- "type": "camera_not_ready",
- "description": "请检查摄像头连接"
- }
- }
-
- // 错误响应 - 服务繁忙
- {
- "status": "error",
- "code": 503,
- "message": "服务繁忙",
- "error_details": {
- "type": "service_busy",
- "description": "当前服务负载过高,请稍后重试"
- }
- }
-
- // 错误响应 - 未授权
- {
- "status": "error",
- "code": 401,
- "message": "未授权访问",
- "error_details": {
- "type": "unauthorized",
- "description": "请先登录"
- }
- }
- ```
-
- # 功能2:停止姿态识别推流
- - 路由: /api/v3/streams/{stream_id}
- - 访问:DELETE
- - 请求头:
- ```
- Authorization: Bearer {access_token} // 登录接口获取的token
- ```
- - 响应:
- ```json
- // 停止推流成功响应
- {
- "status": "success",
- "code": 200,
- "data": {
- "message": "推流服务已停止"
- }
- }
-
- // 错误响应 - 无效的流ID
- {
- "status": "error",
- "code": 400,
- "message": "无效的流ID",
- "error_details": {
- "type": "invalid_stream_id",
- "description": "指定的流ID不存在或已过期"
- }
- }
-
- // 错误响应 - 未授权
- {
- "status": "error",
- "code": 401,
- "message": "未授权访问",
- "error_details": {
- "type": "unauthorized",
- "description": "请先登录"
- }
- }
- ```
-
- # 功能3:WebSocket通信
- - 连接地址:由`POST /api/v3/streams`响应中的`ws_url`提供
- - **说明**: 此WebSocket连接用于实现实时的医患交互引导。后端通过姿态识别算法实时分析视频流,判断用户当前所处的测试阶段,并将阶段标识 (`stage`) 推送给前端。
- - **工作流程**:
- 1. 后端实时分析视频流中的姿态数据,并维护一个测试流程的状态机。
- 2. 当检测到阶段变化时(如用户从"坐姿"变为"站立"),后端向前端推送新的阶段`stage`。
- 3. 前端接收到`stage`后,负责根据该标识查找并显示对应的提示文本,以及播放对应的语音提示。所有提示内容(文本、音频文件名)都预置在前端。
- - **服务端推送数据**:
- ```json
- {
- "video_frame": "base64_encoded_image",
- "timestamp": "2024-03-15T14:30:00Z",
- "stream_id": "stream_123456",
- "analysis_data": {
- "stage": "stand_up" // 当前阶段。可能的值: 'initial', 'stand_up', 'walk_to_target', 'turn', 'walk_back', 'sit_down', 'complete', 'error'
- }
- }
- ```
- ## 📋 页面5:视频交互页面
- - **说明**: 在这个页面,用户将观看一个预设的视频,并回答相关问题。
- - **跳转条件**:
- - 页面4结束后跳转。
-
- # 功能1:获取视频及问卷列表
- - **路由**: /api/v3/videos
- - **访问方式**: GET
- - **说明**: 一次性获取所有可用的视频及其关联的问卷。前端加载此页面时调用,简化后续API请求。
- - **请求头**:
- ```
- Authorization: Bearer {access_token}
- ```
- - **响应**:
- ```json
- // 成功响应
- {
- "status": "success",
- "code": 200,
- "data": {
- "videos": [
- {
- "video_id": "video_123456",
- "title": "场景一:公园散步",
- "description": "一段描述在公园里散步的视频。",
- "duration": 300,
- "questions": [
- { "id": "q1", "type": "text", "content": "请描述视频中展示的主要问题是什么?", "required": true, "max_length": 500 },
- { "id": "q2", "type": "text", "content": "您认为应该如何解决这个问题?", "required": true, "max_length": 1000 }
- ]
- },
- {
- "video_id": "video_789012",
- "title": "场景二:超市购物",
- "description": "一段模拟在超市购物场景的视频。",
- "duration": 240,
- "questions": [
- { "id": "q3", "type": "text", "content": "您对这个解决方案有什么建议?", "required": false, "max_length": 800 }
- ]
- }
- ]
- }
- }
- ```
-
- # 功能2:获取视频文件
- - **路由**: /api/v3/videos/{video_id}.mp4
- - **访问方式**:GET
- - **描述**: 此接口用于前端播放器实际获取视频文件流。为简化访问,视频ID本身已是不可猜测的,此接口可不要求JWT认证。
- - **响应**: 视频文件流 (MIME类型: `video/mp4`)
-
-
- # 功能3:多模态实时交互 (WebSocket)
- - **后端架构**: 为了确保数据采集的独立性和实时性,后端采用多进程架构。当会话启动时,会生成一个主控进程 (`session_manager.py`),该进程会进一步启动三个独立的子进程:
- - **`eye_data_collector.py`**: 专职采集眼动数据,并实时写入本地CSV文件,不受其他进程干扰。
- - **`face_data_collector.py`**: 专职采集面部表情数据,并实时写入本地CSV文件,不受其他进程干扰。
- - **`handwriting_server.py`**: 专职运行WebSocket服务器,用于处理与前端的手写交互。
- - **WebSocket URL**: 由 `POST /api/v3/video-sessions` 接口动态返回,格式类似于 `ws://127.0.0.1:{port}`。前端必须使用此接口返回的URL进行连接。
- - **说明**: 此架构确保了不同设备的数据采集(眼动、面部)可以真正并行,避免了因Python的GIL(全局解释器锁)或设备采样率不同导致的时序问题。
- - **工作流程与阶段**:
- 1. **会话启动与被动采集**: API (`POST /video-sessions`) 启动后端的 `session_manager.py`,后者立即启动 `eye_data_collector` 和 `face_data_collector` 进程,开始在后台静默采集数据。
- 2. **建立连接**: 前端使用API返回的`ws_url`与 `handwriting_server.py` 建立WebSocket连接。
- 3. **手写交互**: 前端可以随时向WebSocket发送手写数据(例如 `{"type": "handwriting_stroke", "payload": ...}`)。`handwriting_server` 负责接收。
- 4. **会话结束**: 前端发送会话结束指令 (例如: `{"command": "end_session"}`) 给WebSocket。
- 5. **服务关闭**: `handwriting_server` 收到结束指令后,通过进程间通信通知 `session_manager`。`session_manager` 随即安全地关闭所有相关的子进程(眼动、面部和WebSocket),完成数据保存和资源清理。
- - **数据格式**:
- - 通信主要由前端发起的指令和数据构成。
- - **前端 -> 后端 (WebSocket)**:
- - 指令: `{"command": "end_session"}`
- - 数据: `{"type": "handwriting_stroke", "payload": ...}`
-
-
-
-
- ## 📋 页面6:语音交互页面
- - **说明**: 采用异步处理模式。用户上传录音后,后端立即响应并开始处理。前端通过SSE(服务器发送事件)连接接收处理进度(语音识别 -> AI对话 -> 语音合成),并实时更新UI,为用户提供流畅的交互反馈。
- - **跳转条件**:
- - 页面8提交问卷后,或页面8按下手动结束跳转(这里需要提示内容为空,是否强制跳转)
- - **工作流程**:
- 1. **创建会话**: 前端通过 `POST /api/v3/audio-sessions` 创建新会话。
- 2. **上传音频**: 用户完成录音后,前端调用 `POST /api/v3/audio-sessions/{session_id}/interact` 上传音频。
- 3. **启动处理**: 后端立即返回一个 `request_id` 和一个SSE连接地址,并开始在后台异步处理音频。
- 4. **监听事件**: 前端使用返回的地址建立SSE连接,开始监听来自服务器的进度事件。
- 5. **阶段一:语音识别 (ASR)**: 后端完成ASR后,通过SSE推送 `asr_result` 事件。前端接收到后,在界面上显示识别出的用户文本。
- 6. **阶段二:AI对话**: 后端将ASR文本送入AI模型,完成后通过SSE推送 `ai_result` 事件。前端接收后,显示AI的文本回复。
- 7. **阶段三:语音合成 (TTS)**: 后端将AI文本进行TTS,完成后通过SSE推送 `tts_result` 事件,包含音频文件的URL。
- 8. **播放与结束**: 前端接收到音频URL后,播放AI的语音回复。最后,服务器推送 `done` 事件,关闭SSE连接。
-
- # 功能1:开始语音交互会话
- - **路由**: /api/v3/audio-sessions
- - **访问方式**:POST
- - **请求头**:
- ```
- Authorization: Bearer {access_token}
- ```
- - **请求参数 (可选)**:
- ```json
- {
- "system_prompt": "你是一个聊天机器人,请根据用户需求进行回应。",
- "max_history": 10
- }
- ```
- - **响应**:
- ```json
- // 开始会话成功响应
- {
- "status": "success",
- "code": 200,
- "data": {
- "session_id": "session_123456",
- "message": "语音交互会话已启动"
- }
- }
- ```
-
- # 功能2:发起异步语音对话
- - **路由**: /api/v3/audio-sessions/{session_id}/interact
- - **访问方式**:POST
- - **说明**: 这是一个异步接口。它会立即返回,并启动一个后台任务来处理音频。处理进度通过SSE推送。
- - **请求头**:
- ```
- Authorization: Bearer {access_token}
- Content-Type: multipart/form-data
- ```
- - **请求体**:
- - `audio`: 用户录制的音频文件 (例如 `blob` 或 `.wav` 格式)
- - **响应 (HTTP 202 Accepted)**:
- ```json
- // 成功接收请求
- {
- "status": "accepted",
- "code": 202,
- "data": {
- "request_id": "req_abc123",
- "events_url": "/api/v3/audio-sessions/{session_id}/events/{request_id}",
- "message": "请求已接收,请连接到events_url获取实时进度"
- }
- }
- ```
-
- # 功能3:监听处理事件 (SSE)
- - **路由**: /api/v3/audio-sessions/{session_id}/events/{request_id}
- - **协议**: `text/event-stream`
- - **说明**: 前端与此端点建立连接以接收实时事件。
- - **服务端推送事件格式**:
- - **ASR完成**:
- ```
- event: asr_result
- data: {"status": "success", "text": "用户说的话", "confidence": 0.95}
- ```
- - **AI回复完成**:
- ```
- event: ai_result
- data: {"status": "success", "text": "AI的回复文本"}
- ```
- - **TTS完成**:
- ```
- 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处理失败"}
- ```
-
- # 功能4:获取对话历史
- - **路由**: /api/v3/audio-sessions/{session_id}/history
- - **访问方式**: GET
- - **请求头**:
- ```
- Authorization: Bearer {access_token}
- ```
- - **响应**:
- ```json
- // 成功响应
- {
- "status": "success",
- "code": 200,
- "data": {
- "conversation_history": [
- { "role": "user", "content": "你好" },
- { "role": "assistant", "content": "你好,有什么可以帮你的吗?" }
- ]
- }
- }
- ```
-
- # 功能5:结束语音交互会话
- - **路由**: /api/v3/audio-sessions/{session_id}
- - **访问方式**:DELETE
- - **请求头**:
- ```
- Authorization: Bearer {access_token}
- ```
- - **响应**:
- ```json
- // 结束会话成功响应
- {
- "status": "success",
- "code": 200,
- "data": { "message": "语音交互会话已结束" }
- }
- ```
-
- # 功能6:获取音频文件
- - **路由**: /api/v3/audios/{audio_id}.wav
- - **访问方式**:GET
- - **描述**: 此接口用于前端播放器实际获取TTS生成的音频文件。
- - **响应**: 音频文件内容 (e.g., `audio/wav`)
-
-
- ## 📋 页面7:历史测试记录查询页面
- # 功能1:获取用户的历史测试记录表
- - 跳转条件:仅管理员用户可访问。登录成功后,管理员将直接跳转到此页面。普通用户无权访问。
- - 路由: /api/v3/admin/logs
- - 方法: GET
- - 认证: `Authorization: Bearer {access_token}`
- - 返回:
- ```json
- // 成功响应
- {
- "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日第二次测试"
- }
- ]
- }
- }
-
- // 无数据响应
- {
- "status": "success",
- "code": 200,
- "data": {
- "tables": []
- }
- }
-
- // 失败响应
- {
- "status": "error",
- "code": 403,
- "message": "Forbidden",
- "error_details": {
- "type": "permission_denied",
- "description": "You don't have permission to access test records"
- }
- }
- ```
-
- ## 📋 页面8:单次测试记录列表页面
- # 功能1:查询单次测试的所有记录
- - **说明**: 从历史测试记录页面选择一个批次后,跳转到此页面,展示该批次下的所有测试者记录。
- - **路由**: /api/v3/admin/logs/{table_name}
- - **方法**: GET
- - **认证**: `Authorization: Bearer {access_token}`
- - **请求参数 (Query Parameters)**:
- - `page` (number, optional, default: 1): 页码,从1开始
- - `page_size` (number, optional, default: 50): 每页记录数
- - **示例**: `/api/v3/admin/logs/log_20240315_1?page=1&page_size=50`
- - **返回**:
- ```json
- // 成功响应
- {
- "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"
- },
- {
- "log_id": 2,
- "medical_record_number": "J0012346",
- "name": "李四",
- "created_at": "2024-03-15T08:31:00Z",
- "status": "pending_review"
- },
- {
- "log_id": 3,
- "medical_record_number": "J0012347",
- "name": "王五",
- "created_at": "2024-03-15T08:32:00Z",
- "status": "initialized"
- }
- ]
- }
- }
-
- - **`status` 字段说明**:
- - `initialized`: 已初始化。记录已创建,等待用户录入数据。
- - `processing`: 数据处理中。用户已完成记录,系统正在后台分析数据。
- - `pending_review`: 待专家审核。系统分析完成,等待专家进行评级和确认。
- - `completed`: 已完成。专家已完成确认,记录归档。
-
- // 查询失败响应
- {
- "status": "error",
- "code": 404,
- "message": "Not Found",
- "error_details": {
- "type": "invalid_table",
- "description": "Log table does not exist"
- }
- }
-
- // 权限失败响应
- {
- "status": "error",
- "code": 403,
- "message": "Access Denied",
- "error_details": {
- "type": "permission_denied",
- "description": "You don't have permission to access this test record"
- }
- }
- ```
-
- ## 📋 页面9:分析模块详情与编辑
- 本部分包含所有针对单个测试记录的具体分析模块。用户从记录列表页选择具体项目后,前端访问对应的页面URL进入编辑与查看。
-
- ### 4.1 步态分析页面
- # 功能1:获取步态分析数据
- - **路由**: `GET /api/v3/admin/logs/{table_name}/{log_id}/gait`
- - **认证**: `Authorization: Bearer {access_token}`
- - **说明**: 进入步态分析页面时调用,获取该记录中所有行走分段的步态分析结果。一次记录可能包含多次行走,每次行走都是一个独立的分析单元。
- - **响应**:
- ```json
- {
- "status": "success",
- "code": 200,
- "data": {
- "procedural_events": [
- { "event": "stand_up", "frame": 85 },
- { "event": "turn_around", "frame": 755 },
- { "event": "sit_down", "frame": 1560 }
- ],
- "walk_segments": [
- {
- "segment_id": 1,
- "start_frame": 153,
- "end_frame": 750,
- "calculated_metrics": {
- "gait_speed": 1.2,
- "stride_length": 0.75,
- "step_speed": 1.1,
- "swing_speed": 2.5,
- "cadence": 110.0,
- "single_support_phase_ratio": 0.4,
- "swing_phase_ratio": 0.4,
- "double_support_ratio": 0.2,
- "step_height": 0.15,
- "step_width": 0.2
- },
- "events": [
- { "event": "left_heel_strike", "frame": 165 },
- { "event": "right_toe_off", "frame": 168 },
- { "event": "double_support", "frame": 170 },
- { "event": "right_heel_strike", "frame": 180 },
- { "event": "left_toe_off", "frame": 183 },
- ]
- },
- ...
- ]
- }
- }
- ```
-
- # 功能2:编辑事件并重新计算步态参数
- - **路由**: `POST /api/v3/admin/logs/{table_name}/{log_id}/gait/events`
- - **认证**: `Authorization: Bearer {access_token}`
- - **说明**: 此功能用于提交修正后的所有关键事件标记(包括`stand_up`, `turn_around`, `sit_down`等过程性事件,以及定义行走分段的`walk_start`, `walk_end`事件)。后端接收到新的事件列表后,将立即执行重新计算,并返回更新后的完整步态分析数据。
- - **请求体**:
- ```json
- {
- "events": [
- { "event": "stand_up", "frame": 85 },
- { "event": "walk_start", "frame": 180 },
- { "event": "walk_end", "frame": 840 },
- { "event": "turn_around", "frame": 900 },
- { "event": "sit_down", "frame": 1600 }
- ]
- }
- ```
- - **响应**:
- ```json
-
- - 成功响应:返回更新后的完整步态分析数据,结构同`功能1:获取步态分析数据`的响应。
-
- - 请求无效响应
- {
- "status": "error",
- "code": 400,
- "message": "Bad Request",
- "error_details": {
- "type": "invalid_event_format",
- "description": "The submitted event data is incorrectly formatted or frames are invalid."
- }
- }
-
- - 未授权响应
- {
- "status": "error",
- "code": 403,
- "message": "Forbidden",
- "error_details": {
- "type": "permission_denied",
- "description": "You do not have permission to modify this resource."
- }
- }
- ```
-
- # 功能3:下载原始时序数据 (CSV)
- - **路由**: `GET /api/v3/admin/logs/{table_name}/{log_id}/raw`
- - **认证**: `Authorization: Bearer {access_token}`
- - **说明**: 为支持后续的研究和算法改进,系统需保留原始的时序数据。此接口提供对指定记录的原始数据(包含COCO骨骼节点时序信息的CSV文件)的下载功能。
- - **响应**:
- - 后端直接返回文件流。
- - **响应头 (Headers)**:
- - **Content-Type**: `text/csv`
- - **Content-Disposition**: `attachment; filename="raw_data_{log_id}.csv"`
-
- ### 4.2 面部表情分析页面 (UPDRS评级)
- 此部分提供对视频中的整体面部表情进行UPDRS评级的功能。评级是针对整个视频的单个分数。
- - **UPDRS面部表情评级标准**:
- - **0**: 正常
- - **1**: 极轻微的表情异常
- - **2**: 轻度而肯定的表情呆板
- - **3**: 中度的面部表情损害,仍能张口
- - **4**: 呈面具脸,面部表情严重或完全消失
-
- # 功能1:获取面部表情视频及当前评级
- - **路由**: `GET /api/v3/admin/logs/{table_name}/{log_id}/facial`
- - **认证**: `Authorization: Bearer {access_token}`
- - **说明**: 获取用于评级的面部表情视频,以及该记录当前已有的UPDRS分数。
- - **响应**:
- ```json
- // 成功响应
- {
- "status": "success",
- "code": 200,
- "data": {
- "log_id": 1,
- "video_url": "/api/v3/videos/facial_expression_video_abc.mp4",
- "updrs_rating": 1 // 当前UPDRS分数,如果未评级则为null
- }
- }
-
- // 记录不存在响应
- {
- "status": "error",
- "code": 404,
- "message": "Not Found",
- "error_details": {
- "type": "record_not_found",
- "description": "The specified record does not exist."
- }
- }
-
- // 未授权响应
- {
- "status": "error",
- "code": 403,
- "message": "Forbidden",
- "error_details": {
- "type": "permission_denied",
- "description": "You do not have permission to access this resource."
- }
- }
- ```
-
- # 功能2:提交/更新UPDRS评级
- - **路由**: `POST /api/v3/admin/logs/{table_name}/{log_id}/facial/rating`
- - **认证**: `Authorization: Bearer {access_token}`
- - **说明**: 为整个视频提交一个UPDRS评级分数(0-4)。
- - **请求体**:
- ```json
- {
- "rating": 2
- }
- ```
- - **响应**:
- ```json
- // 成功响应
- {
- "status": "success",
- "code": 200,
- "data": {
- "message": "UPDRS rating updated successfully."
- }
- }
-
- // 请求无效响应
- {
- "status": "error",
- "code": 400,
- "message": "Bad Request",
- "error_details": {
- "type": "invalid_rating_value",
- "description": "Rating must be an integer between 0 and 4."
- }
- }
-
- // 未授权响应
- {
- "status": "error",
- "code": 403,
- "message": "Forbidden",
- "error_details": {
- "type": "permission_denied",
- "description": "You do not have permission to modify this resource."
- }
- }
- ```
-
- ### 4.3 眼动分析页面 (UPDRS评级)
- 此部分提供对眼动追踪视频进行评级的功能。评级主要关注扫视和凝视的稳定性。
- - **眼动功能评级标准 (参考UPDRS)**:
- - **0**: 正常,眼跳和凝视稳定、准确。
- - **1**: 轻微异常,扫视速度轻度减慢或偶有不准确。
- - **2**: 轻度异常,扫视速度变慢,凝视不稳定。
- - **3**: 中度异常,扫视启动困难,有明显的凝视不稳或眼球震颤。
- - **4**: 严重异常,无法完成扫视任务或持续的凝视不稳。
-
- # 功能1:获取眼动分析数据及当前评级
- - **路由**: `GET /api/v3/admin/logs/{table_name}/{log_id}/eyetracking`
- - **认证**: `Authorization: Bearer {access_token}`
- - **说明**: 获取指定记录的眼动追踪视频和当前已有的评级分数。
- - **响应**:
- ```json
- // 成功响应
- {
- "status": "success",
- "code": 200,
- "data": {
- "video_url": "/api/v3/videos/eyetracking_video_abc.mp4",
- "rating": 2 // 当前评级分数,如果未评级则为null
- }
- }
-
- // 记录不存在响应
- {
- "status": "error",
- "code": 404,
- "message": "Not Found",
- "error_details": {
- "type": "record_not_found",
- "description": "The specified record does not exist."
- }
- }
-
- // 未授权响应
- {
- "status": "error",
- "code": 403,
- "message": "Forbidden",
- "error_details": {
- "type": "permission_denied",
- "description": "You do not have permission to access this resource."
- }
- }
- ```
-
- # 功能2:提交/更新眼动功能评级
- - **路由**: `POST /api/v3/admin/logs/{table_name}/{log_id}/eyetracking/rating`
- - **认证**: `Authorization: Bearer {access_token}`
- - **说明**: 提交对眼动功能的评级分数(0-4)。
- - **请求体**:
- ```json
- {
- "rating": 3
- }
- ```
- - **响应**:
- ```json
- // 成功响应
- {
- "status": "success",
- "code": 200,
- "data": {
- "message": "Eyetracking rating updated successfully."
- }
- }
-
- // 请求无效响应
- {
- "status": "error",
- "code": 400,
- "message": "Bad Request",
- "error_details": {
- "type": "invalid_rating_value",
- "description": "Rating must be an integer between 0 and 4."
- }
- }
-
- // 未授权响应
- {
- "status": "error",
- "code": 403,
- "message": "Forbidden",
- "error_details": {
- "type": "permission_denied",
- "description": "You do not have permission to modify this resource."
- }
- }
- ```
-
- ### 4.4 手写笔迹分析页面 (UPDRS评级)
- 此部分提供对手写笔迹(如螺旋测试)的评级功能,主要评估运动震颤和书写过小症(Micrographia)。
- - **手写功能评级标准 (参考UPDRS)**:
- - **0**: 正常,线条流畅,无明显震颤,大小正常。
- - **1**: 轻微异常,线条有极轻微的震颤或轻微的书写变小。
- - **2**: 轻度异常,线条有肯定的震颤,书写大小一致性变差,但仍清晰可辨。
- - **3**: 中度异常,震颤明显,书写过小症显著,辨认有一定困难。
- - **4**: 严重异常,震颤严重导致无法完成绘制,或字迹小到无法辨认。
-
- # 功能1:获取手写数据及当前评级
- - **路由**: `GET /api/v3/admin/logs/{table_name}/{log_id}/handwriting`
- - **认证**: `Authorization: Bearer {access_token}`
- - **说明**: 获取用于分析的手写笔迹视频和当前已有的评级分数。
- - **响应**:
- ```json
- // 成功响应
- {
- "status": "success",
- "code": 200,
- "data": {
- "video_url": "/api/v3/videos/handwriting_spiral_abc.mp4",
- "rating": 1 // 当前评级分数,如果未评级则为null
- }
- }
-
- // 记录不存在响应
- {
- "status": "error",
- "code": 404,
- "message": "Not Found",
- "error_details": {
- "type": "record_not_found",
- "description": "The specified record does not exist."
- }
- }
-
- // 未授权响应
- {
- "status": "error",
- "code": 403,
- "message": "Forbidden",
- "error_details": {
- "type": "permission_denied",
- "description": "You do not have permission to access this resource."
- }
- }
- ```
-
- # 功能2:提交/更新手写功能评级
- - **路由**: `POST /api/v3/admin/logs/{table_name}/{log_id}/handwriting/rating`
- - **认证**: `Authorization: Bearer {access_token}`
- - **说明**: 提交对手写功能的评级分数(0-4)。
- - **请求体**:
- ```json
- {
- "rating": 2
- }
- ```
- - **响应**:
- ```json
- // 成功响应
- {
- "status": "success",
- "code": 200,
- "data": {
- "message": "Handwriting rating updated successfully."
- }
- }
-
- // 请求无效响应
- {
- "status": "error",
- "code": 400,
- "message": "Bad Request",
- "error_details": {
- "type": "invalid_rating_value",
- "description": "Rating must be an integer between 0 and 4."
- }
- }
-
- // 未授权响应
- {
- "status": "error",
- "code": 403,
- "message": "Forbidden",
- "error_details": {
- "type": "permission_denied",
- "description": "You do not have permission to modify this resource."
- }
- }
- ```
-
- ### 4.5 语音分析页面 (UPDRS评级)
- 此部分提供对语音样本的评级,主要评估音量、音调、清晰度等言语功能。
- - **言语功能评级标准 (参考UPDRS)**:
- - **0**: 正常,语言清晰,音量正常。
- - **1**: 轻微异常,音量轻度减弱或发音偶有含糊。
- - **2**: 轻度异常,语言单调、含糊,但尚能听懂。
- - **3**: 中度异常,语言严重含糊,听懂有较大困难。
- - **4**: 严重异常,语言基本无法听懂或失语。
-
- # 功能1:获取语音及当前评级
- - **路由**: `GET /api/v3/admin/logs/{table_name}/{log_id}/speech`
- - **认证**: `Authorization: Bearer {access_token}`
- - **说明**: 获取用于分析的语音文件和当前已有的评级分数。
- - **响应**:
- ```json
- // 成功响应
- {
- "status": "success",
- "code": 200,
- "data": {
- "audio_url": "/api/v3/audios/speech_sample_abc.wav",
- "rating": 3 // 当前评级分数,如果未评级则为null
- }
- }
-
- // 记录不存在响应
- {
- "status": "error",
- "code": 404,
- "message": "Not Found",
- "error_details": {
- "type": "record_not_found",
- "description": "The specified record does not exist."
- }
- }
-
- // 未授权响应
- {
- "status": "error",
- "code": 403,
- "message": "Forbidden",
- "error_details": {
- "type": "permission_denied",
- "description": "You do not have permission to access this resource."
- }
- }
- ```
-
- # 功能2:提交/更新言语功能评级
- - **路由**: `POST /api/v3/admin/logs/{table_name}/{log_id}/speech/rating`
- - **认证**: `Authorization: Bearer {access_token}`
- - **说明**: 提交对言语功能的评级分数(0-4)。
- - **请求体**:
- ```json
- {
- "rating": 3
- }
- ```
- - **响应**:
- ```json
- // 成功响应
- {
- "status": "success",
- "code": 200,
- "data": {
- "message": "Speech rating updated successfully."
- }
- }
-
- // 请求无效响应
- {
- "status": "error",
- "code": 400,
- "message": "Bad Request",
- "error_details": {
- "type": "invalid_rating_value",
- "description": "Rating must be an integer between 0 and 4."
- }
- }
-
- // 未授权响应
- {
- "status": "error",
- "code": 403,
- "message": "Forbidden",
- "error_details": {
- "type": "permission_denied",
- "description": "You do not have permission to modify this resource."
- }
- }
- ```
-
- ### 4.6 语义分析页面 (认知评级)
- 此部分提供对文本(例如,语音识别结果)的评级,主要评估思维连贯性、逻辑性和复杂性。
- - **认知与语义连贯性评级标准 (自定义)**:
- - **0**: 正常,思维清晰,表达连贯,逻辑性强。
- - **1**: 轻微异常,偶有思维中断或逻辑不连贯之处。
- - **2**: 轻度异常,思维迟缓,表达重复,逻辑性差。
- - **3**: 中度异常,思维混乱,难以组织语言,表达缺乏逻辑。
- - **4**: 严重异常,无法形成有意义的句子或表达与问题完全无关。
-
- # 功能1:获取文本及当前评级
- - **路由**: `GET /api/v3/admin/logs/{table_name}/{log_id}/semantics`
- - **认证**: `Authorization: Bearer {access_token}`
- - **说明**: 获取指定记录的文本内容和当前已有的认知评级分数。
- - **响应**:
- ```json
- // 成功响应
- {
- "status": "success",
- "code": 200,
- "data": {
- "text_content": "今天天气真好,我感觉心情非常愉快,虽然昨天有点不舒服,但现在好多了。",
- "rating": 0 // 当前评级分数,如果未评级则为null
- }
- }
-
- // 记录不存在响应
- {
- "status": "error",
- "code": 404,
- "message": "Not Found",
- "error_details": {
- "type": "record_not_found",
- "description": "The specified record does not exist."
- }
- }
-
- // 未授权响应
- {
- "status": "error",
- "code": 403,
- "message": "Forbidden",
- "error_details": {
- "type": "permission_denied",
- "description": "You do not have permission to access this resource."
- }
- }
- ```
-
- # 功能2:提交/更新认知评级
- - **路由**: `POST /api/v3/admin/logs/{table_name}/{log_id}/semantics/rating`
- - **认证**: `Authorization: Bearer {access_token}`
- - **说明**: 提交对认知与语义连贯性的评级分数(0-4)。
- - **请求体**:
- ```json
- {
- "rating": 1
- }
- ```
- - **响应**:
- ```json
- // 成功响应
- {
- "status": "success",
- "code": 200,
- "data": {
- "message": "Semantic rating updated successfully."
- }
- }
-
- // 请求无效响应
- {
- "status": "error",
- "code": 400,
- "message": "Bad Request",
- "error_details": {
- "type": "invalid_rating_value",
- "description": "Rating must be an integer between 0 and 4."
- }
- }
-
- // 未授权响应
- {
- "status": "error",
- "code": 403,
- "message": "Forbidden",
- "error_details": {
- "type": "permission_denied",
- "description": "You do not have permission to modify this resource."
- }
- }
- ```
|