# QAFrame
控件功能:实现一个问答交互框架,支持通过 WebSocket 接收课程内容(如音视频、图片、Markdown)、题目信息和结果反馈,并允许用户提交文本或音频答案。适用于在线教学、测验等场景。
类型:容器控件
父类控件:`bricks.VBox`
## 初始化参数
| 参数名 | 类型 | 说明 |
|-------|------|------|
| `ws_url` | String | WebSocket 连接地址,用于与后端通信 |
| `ws_params` | Object (可选) | 要附加到 `ws_url` 上的查询参数对象,将被转换为 URL 查询字符串 |
| `title` | String (可选) | 页面标题(未在代码中直接使用,可能由外部传入) |
| `description` | String (可选) | 描述信息 |
| `courseware` | Object (可选) | 初始课程资源配置,包含:
- `type`: `"audio"`, `"video"`, `"image"`, `"markdown"`
- `url`: 资源地址
- `timeout`: 播放超时时间(秒),0 表示无超时 |
| `timeout` | Number | 整体超时控制(秒),0 表示不设超时 |
> 注:初始化时会创建内部子控件 `top_w`(HBox)、`main_w`(Filler)和 `bottom_w`(HBox),并建立 WebSocket 连接。
## 主要事件
| 事件名 | 触发条件 | 数据格式说明 |
|--------|---------|-------------|
| `onopen` | WebSocket 连接打开时 | 自动触发 `start_question_answer()` 方法,发送启动消息 `{ type: 'qa_start', data: { d: 'test data', v: 100 } }` |
| `onquestion` | 收到问题数据时 | 数据结构:
`{ q_desc: 题目描述, total_q: 总题数, cur_q: 当前题号 }`
调用 `show_question(d)` 显示题目 |
| `oncourseware` | 收到课程资源数据时 | 数据结构:
`{ type: "audio"/"video"/"image"/"markdown", url: 资源链接 }`
调用 `show_courseware(d)` 展示对应媒体内容 |
| `onaskstart` | 服务端请求确认开始时 | 触发显示“Start ?”按钮,点击后调用 `start_question_answer()` 发送启动信号 |
| `click`(自定义按钮) | 用户点击“press to start”或“Start ?”按钮时 | 调用 `conform_start()` 向服务器发送 `{ type: 'conform_start', data: null }` 消息 |
### 接收的数据类型(来自服务端)
1. **courseware**:播放指定类型的课程内容
```json
{
"type": "courseware",
"data": {
"type": "audio|video|image|markdown",
"url": "资源URL"
}
}
```
2. **askready**:询问是否准备就绪
```json
{
"type": "askready",
"data": {
"total_q": 5,
"cur_q": 1
}
}
```
3. **question**:下发题目
```json
{
"type": "question",
"data": {
"q_desc": "题目HTML或MD文本",
"total_q": 5,
"cur_q": 1
}
}
```
4. **result**:返回答题结果统计
```json
{
"type": "result",
"data": {
"total_q": 5,
"correct_cnt": 3,
"error_cnt": 2
}
}
```
5. **error_list**:错误详情列表
```json
{
"type": "error_list",
"data": {
"error_cnt": 2,
"rows": [
{
"pos": 1,
"q_desc": "第1题题干",
"your_a": "你的答案",
"corrent_a": "正确答案",
"error_desc": "错误原因说明"
}
]
}
}
```
### 发送的消息类型(客户端 → 服务端)
1. **qa_start**:连接成功后自动发送,表示可以开始流程
```json
{ "type": "qa_start", "data": { "d": "test data", "v": 100 } }
```
2. **conform_start**:用户点击开始按钮后发送
```json
{ "type": "conform_start", "data": null }
```
3. **text_answer**:提交文本答案
```json
{ "type": "text_answer", "data": "用户输入的内容" }
```
4. **audio_answer**:提交录音答案(Base64 编码)
```json
{ "type": "audio_answer", "data": "base64音频字符串" }
```
> 所有消息通过内置的 `WebSocket` 实例发送,使用 `this.ws.send(message)`。