## 一类消息
- [WsMessage](#ws_message)
- [Cmd](#cmd)
- [Signal](#signal)
### Cmd
<a id="cmd"></a>
```javascript
{
type: "cmd",
hash: "",
key: ""
// show_control_panel_from_native
// lesson_begin
// ppt_finish
}
```
### Signal
<a id="signal"></a>
`Signal`消息白板不作处理,接受的消息转发到客户端,提供发送接口供客户端调用。
```javascript
{
type: "signal",
hash: "",
payload: ""
}
```
### WsMessage
<a id="ws_message"></a>
```javscript
{
hash: string, // 消息的唯一标识
key: string, // message的名称
pageIndex: number, // 消息所属的课件页码
// 消息体
extra: string,
stime: string,
time: number,
[message]<T: IMessage>: T // 其他的消息类
}
```
**IMessage**的类型:
- [KeyFrameMessage](#keyframe)
- [BroadcastMessage](#broadcast)
- [Connection](#connection)
- TemplateMessage
- [MediaMessage](#media)
- [SyncMediaMessage](#media)
- AnimationMessage
- SyncObjectMessage 未使用
- PluginMessage 未使用
#### KeyFrameMessage
<a id="keyframe"></a>
记录所有的消息,用于同步当前白板状态(中途进入教室、回放),白板客户端仅接受不发出(白板初始化时会发出一个空的`KeyFrame`消息用以请求当前的白板状态)。
```javascript
{
hash: "",
key: "keyframe",
pageIndex: 0,
keyframe: {
currentKeyFrame: string // 压缩过的
}
}
```
### BroadcastMessage
<a id="broadcast"></a>
所有工具面板产生的消息。
```javascript
{
hash: "",
key: "broadcast",
broadcast: {
hashKey: string,
action: string,
cid: string,
owner: string,
pageName: string, // 所在课件页的名字/页码
toolName: string, // 面板工具的名字
type: string,
data: string, // JSON.Stringify
targetCid: string,
mode: number
}
}
```
#### 消息触发者:
- 激光笔
```javascript
// 选中激光笔
{
hashKey: "",
action: "pointer-start",
data: {x: 0, y: 0} // 或者为上次激光笔最后的坐标
}
// 移动激光笔
{
hashKey: "",
action: "pointer-move",
data: {x: 0, y: 0} // 100ms发送一次,为触发时最后的坐标
}
// 选中其他工具(取消选中激光笔)
{
hashKey: "",
action: "pointer-end"
}
```
- 画笔
```javascript
// 鼠标按下
{
hashKey: "",
cid: "",
key: "broadcast",
type: "component.ToolEvent.tool_update",
toolName: "Component.Graphics",
owner: "", // 当前用户ID
mode: 10, // 笔画类型:曲线、直线等
pageName: "", // 当前课件页名称
action: "Component.ToolEvent.Actions.start",
data: "" // color、thickness、startX、startY
}
// 鼠标移动
{
hashKey: "",
cid: "",
key: "broadcast",
type: "component.ToolEvent.tool_update",
toolName: "Component.Graphics",
owner: "", // 当前用户ID
mode: 10, // 笔画类型:曲线、直线等
pageName: "", // 当前课件页名称
action: "Component.ToolEvent.Actions.updating",
data: "" // {x, y} or [[x, y], ...]
}
// 鼠标抬起
{
hashKey: "",
cid: "",
key: "broadcast",
type: "component.ToolEvent.tool_update",
toolName: "Component.Graphics",
owner: "", // 当前用户ID
mode: null, // 笔画类型:曲线、直线等
pageName: "", // 当前课件页名称
action: "Component.ToolEvent.Actions.end",
data: "" // 之前的mode
}
```
- 文本
```javascript
// 鼠标按下 插入光标
{
hashKey: "",
cid: "",
key: "broadcast",
type: "component.ToolEvent.tool_update",
toolName: "Component.TextInput",
owner: "", // 当前用户ID
mode: null,
pageName: "", // 当前课件页名称
action: "Component.ToolEvent.Actions.start",
data: "" // fontSize、textColor、x、y
}
// 输入
{
hashKey: "",
cid: "",
key: "broadcast",
type: "component.ToolEvent.tool_update",
toolName: "Component.TextInput",
owner: "", // 当前用户ID
mode: null,
pageName: "", // 当前课件页名称
action: "Component.ToolEvent.Actions.updating",
data: "" // text、width
// width 为字体所占宽度和最大宽度中较小的一个,防止文本超出课件范围
}
// 选中其他工具
{
hashKey: "",
cid: "",
key: "broadcast",
type: "component.ToolEvent.tool_update",
toolName: "Component.TextInput",
owner: "", // 当前用户ID
mode: null,
pageName: "", // 当前课件页名称
action: "Component.ToolEvent.Actions.end",
data: null
}
```
- 撤销
```javascript
{
hashKey: "",
key: "broadcst",
pageName: "",
targetCid: "", // 针对哪一个动作撤销
toolName: "undo",
type: "Control.once_do"
}
```
- 删除
```javascript
{
hashKey: "",
key: "broadcst",
pageName: "",
toolName: "clear",
type: "Control.once_do"
}
```
- 放大镜
```javascript
// 放大、缩小、重置
{
hashKey: "",
action: "zoom",
data: "" // 缩放倍数
}
// 放大情况下移动
{
hashKey: "",
action: "zoom-move",
data: "" // {x, y} 中心点相对于舞台的坐标
}
```
- 白板(草稿)
```javascript
// 显示、隐藏草稿
{
hashKey: "",
action: "Draft.Enable" | "Draft.Disable"
}
```
- 翻页
```javascript
{
hashKey: "",
key: "broadcast",
pageName: "", // 新一页的名称
type: "Component.FlipEvent.pageChange"
}
```
### MediaMessage & SyncMediaMessage
<a id="media"></a>
视频相关事件。包括视频选择面板中选中的视频和课件内嵌的视频。
其中,`SyncMediaMessage`用于表示当前视频的状态,一般在学生端一个媒体类型的课件初始化时,会发送一个空的`SyncMediaMessage`,服务端返回当时的课件状态用以同步,和`KeyFrame`用法类似。
```javascript
// MediaMessage
{
hash: "",
key: "media",
pageIndex: 0,
media: {
objectId: string, // 视频ID
payload: string, // 进度、音量等
state: number // 0-开始 1-暂停 2-停止(关闭视频插件) 3-重置 4-跳转进度 5-播放完成(回放) 6-音量
}
}
// SyncMediaMessage
{
hash: "",
key: "syncMedia",
pageIndex: 0,
syncMedia: {
objectId: string, // 视频ID
paused: boolean, // 是否暂停
position: number, // 播放进度
volume: number // 音量大小
}}
}
```
### Connection
<a id="connection"></a>
每当服务端一个新的socket链接创建,或者一个连接断开,向班级里所有的连接广播一个`Connection`消息。
```javascript
{
hash: "",
key: "connection",
connection: {
identity: "", // 身份
state: 0, // 0-连接 1-断开
userId: ""
}
}
```
### 其他Message
- StartTime
白板初始化时会发送一个空的StartTime消息,来请求本节课开始的时长等信息。
```javascript
{
key: "startTime",
stime: string, // 服务器时间
time: number // 本节课进行时长 -1表示未开始
}
```
- 相关资源链接
- 米乐星球小程序内调研
- 项目结构说明
- 交互课件说明
- server项目说明
- 项目说明
- 项目启动
- app.js做的事情
- 获取互动课件的地址
- 分析互动课件地址的参数
- policy目录--lesson.js
- 解析ppt--api/lesson.js
- 信令中的key:template
- 信令中的key:media
- kk-talkee-engine.js
- Message
- 课件模板页的识别过程
- 解析课件模板的源文件
- 场景与模板的对应关系
- 所有场景的基类
- choiceScence为例
- 注意事项
- ws
- online项目的说明
- online消息
- 课件编辑项目
- 资源链接
- 基本项目信息
- electron项目结构分析
- ipc
- 模板题组
- 普通题组
- 游戏题组
- 课件导出内容分析
- 课件模板分类明细
- 图片题
- 视频题
- 音频题
- 选择题
- 判断题
- 转盘
- 筛子
- 图层拖拽
- 动画题
- 翻拍题
- 语音题
- 201908变更
- 课件制作流程分析
- 菜单配置
- 入口操作
- 定义模板布局与初始化
- 选择素材
- 导出过程
- egret
- interface
- ad选择器模板
- ab选择器模板
- 图层拖拽模板
- 判断题模板
- xml
- 转盘
- events
- components
- 父类组件
- 基本组件
- 判断题组件
- 龙骨动画调研
- 基本了解
- 产品原型
- 白板Client项目
- 消息类型
- 白板项目分析
- 入口