@plasosdk/plaso-electron-sdk 1.2.10 → 1.2.14
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +271 -257
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,55 +1,59 @@
|
|
|
1
|
-
# 支持的环境与electron版本
|
|
2
|
-
|
|
3
|
-
- macOs支持 x64 、arm64
|
|
4
|
-
- windows支持 ia32 、 x64
|
|
5
|
-
- electron支持 14.0.0~22.3.27
|
|
1
|
+
# 支持的环境与 electron 版本
|
|
6
2
|
|
|
3
|
+
- MacOS 支持 x64、arm64
|
|
4
|
+
- windows 支持 x86、x64
|
|
5
|
+
- electron 支持 14.0.0~22.3.27
|
|
7
6
|
|
|
7
|
+
- macOs 支持 x64 、arm64
|
|
8
|
+
- windows 支持 ia32 、 x64
|
|
9
|
+
- electron 支持 14.0.0~22.3.27
|
|
8
10
|
|
|
9
11
|
# 1、接入步骤
|
|
10
12
|
|
|
11
13
|
## 1.1、安装
|
|
12
14
|
|
|
13
|
-
|
|
15
|
+
**<font color=red>注意: 不同平台依赖包不互通</font>**
|
|
14
16
|
|
|
15
|
-
|
|
17
|
+
**第一步:安装 @electron/remote**
|
|
18
|
+
|
|
19
|
+
```shell
|
|
16
20
|
npm install @electron/remote --global-style --legacy-peer-deps
|
|
17
21
|
```
|
|
18
22
|
|
|
19
|
-
|
|
23
|
+
**第二步:安装 plaso-electron-sdk**
|
|
20
24
|
|
|
21
|
-
```
|
|
25
|
+
```shell
|
|
22
26
|
npm install @plasosdk/plaso-electron-sdk --global-style
|
|
23
27
|
```
|
|
24
|
-
**<font color=red>注意: 不同平台需要单独安装</font>**
|
|
25
28
|
|
|
29
|
+
**<font color=red>注意: 不同平台需要单独安装</font>**
|
|
26
30
|
|
|
27
31
|
## 1.2、使用
|
|
28
32
|
|
|
29
|
-
### 1.2.1、npm包位置
|
|
33
|
+
### 1.2.1、npm 包位置
|
|
30
34
|
|
|
31
|
-
将下载的npm包放到
|
|
35
|
+
将下载的 npm 包放到 应用本地的`node_modules`目录下,一般是 electron 应用的`resources/app`目录下
|
|
32
36
|
|
|
33
37
|
### 1.2.2、主进程
|
|
34
38
|
|
|
35
|
-
|
|
39
|
+
需要在主进程加载 `@plasosdk/plaso-electron-sdk` 依赖包
|
|
36
40
|
|
|
37
|
-
```
|
|
38
|
-
require('@plasosdk/plaso-electron-sdk')
|
|
41
|
+
```ts
|
|
42
|
+
require('@plasosdk/plaso-electron-sdk');
|
|
39
43
|
|
|
40
44
|
// electron 版本>=14.0.0 时:需要在主进程里 初始化、启动 remote
|
|
41
45
|
const electronVersion = process.versions['electron'];
|
|
42
46
|
if (electronVersion && versionComp(electronVersion, '14.0.0') >= 0) {
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
+
const electronStore = require('@electron/remote/main');
|
|
48
|
+
electronStore.initialize();
|
|
49
|
+
// mainWindow: 主进程打开的渲染进程窗口
|
|
50
|
+
electronStore.enable(mainWindow.webContents);
|
|
47
51
|
}
|
|
48
52
|
|
|
49
53
|
// 通过 initRemoteMain方法 传入 remoteMain
|
|
50
54
|
const remoteMain = require('@electron/remote/main');
|
|
51
|
-
const { initRemoteMain } = require('@plasosdk/plaso-electron-sdk')
|
|
52
|
-
initRemoteMain(remoteMain)
|
|
55
|
+
const { initRemoteMain } = require('@plasosdk/plaso-electron-sdk');
|
|
56
|
+
initRemoteMain(remoteMain);
|
|
53
57
|
```
|
|
54
58
|
|
|
55
59
|
### 1.2.3、渲染进程
|
|
@@ -60,267 +64,293 @@ initRemoteMain(remoteMain)
|
|
|
60
64
|
|
|
61
65
|
(2)入参参考: [2、实时课堂参数说明](#2、实时课堂入参说明)
|
|
62
66
|
|
|
63
|
-
|
|
64
|
-
|
|
65
67
|
#### 1.2.3.2、打开备课课堂
|
|
66
68
|
|
|
67
69
|
(1)调用方法:**createPrepareClassWindow**
|
|
68
70
|
|
|
69
71
|
(2)入参参考:[3、备课课堂参数说明](#3、备课课堂入参说明)
|
|
70
72
|
|
|
71
|
-
|
|
72
|
-
|
|
73
73
|
#### 1.2.3.3、[确定日志的写入位置](#5.1、initLogConfig)
|
|
74
74
|
|
|
75
|
-
```
|
|
75
|
+
```ts
|
|
76
76
|
// 代码示例
|
|
77
77
|
const PlasoElectronSdk = window.require('@plasosdk/plaso-electron-sdk');
|
|
78
|
-
const logFilePath =
|
|
78
|
+
const logFilePath = 'C:/Users/userName/Desktop/electronDemo/electron12.0.18_x32/resources/app';
|
|
79
79
|
PlasoElectronSdk.initLogConfig(logFilePath);
|
|
80
|
-
|
|
81
80
|
```
|
|
82
81
|
|
|
83
|
-
|
|
84
|
-
|
|
85
82
|
#### 1.2.3.4、[创建 课堂/备课 窗口](#5.3、createLiveClassWindow)
|
|
86
83
|
|
|
87
|
-
```
|
|
84
|
+
```ts
|
|
85
|
+
interface CreateClassPamras {
|
|
86
|
+
classOptions: Object;
|
|
87
|
+
electronWinOptions?: Object;
|
|
88
|
+
onClassWindowReadyFn?: (winId: number) => void
|
|
89
|
+
onClassWindowLeaveFn?: (winId: number) => void
|
|
90
|
+
onClassFinishedFn?: (meetingId: string) => void;
|
|
91
|
+
onSaveBoardFn?: (
|
|
92
|
+
params: {
|
|
93
|
+
fileInfo: FileParams[];
|
|
94
|
+
fileName?: string;
|
|
95
|
+
},
|
|
96
|
+
callback: (result: boolean) => void,
|
|
97
|
+
) => void;
|
|
98
|
+
onOpenResourceCenterFn?: () => void;
|
|
99
|
+
onGetExtFileNameFn?: (...args: any[]) => Promise<string>;
|
|
100
|
+
}
|
|
101
|
+
|
|
88
102
|
// 代码示例
|
|
89
103
|
const PlasoElectronSdk = window.require('@plasosdk/plaso-electron-sdk');
|
|
90
|
-
const
|
|
104
|
+
const createClassParams: CreateClassPamras = { classOptions: { query } };
|
|
91
105
|
|
|
92
106
|
//创建实时课堂
|
|
93
|
-
PlasoElectronSdk.createLiveClassWindow(
|
|
107
|
+
PlasoElectronSdk.createLiveClassWindow(createClassParams);
|
|
94
108
|
// or 创建备课课堂
|
|
95
|
-
PlasoElectronSdk.createPrepareClassWindow(
|
|
109
|
+
PlasoElectronSdk.createPrepareClassWindow(createClassParams);
|
|
96
110
|
```
|
|
97
111
|
|
|
98
|
-
|
|
99
|
-
|
|
100
112
|
# 2、实时课堂入参说明
|
|
101
113
|
|
|
102
|
-
## 2.1、参数classOptions
|
|
114
|
+
## 2.1、参数 classOptions
|
|
103
115
|
|
|
104
116
|
```
|
|
105
117
|
类型:Object
|
|
106
118
|
```
|
|
107
119
|
|
|
108
|
-
### 2.1.1
|
|
109
|
-
|
|
110
|
-
| 参数
|
|
111
|
-
|
|
|
112
|
-
|
|
|
113
|
-
|
|
|
114
|
-
|
|
|
115
|
-
|
|
|
116
|
-
|
|
|
117
|
-
| supportShowResourceCenter | 否
|
|
118
|
-
| supportSaveBoard
|
|
119
|
-
| env
|
|
120
|
-
| enableLiveNewShareRegion
|
|
121
|
-
| enableLiveNewShareInTouch | 否
|
|
122
|
-
| enableLiveNewShare
|
|
123
|
-
| enableLiveSign
|
|
124
|
-
| residentCamera
|
|
125
|
-
|
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
120
|
+
### 2.1.1、属性列表
|
|
121
|
+
|
|
122
|
+
| 参数 | 是否必传 | 类型 | 默认值 | 说明 |
|
|
123
|
+
| --- | --- | --- | --- | --- |
|
|
124
|
+
| query | 是 | string | 无 | 进课堂必传字段,具体拼接逻辑见下文[query 属性说明](#211query-属性) |
|
|
125
|
+
| displayAvatarUrl | 否 | string | 无 | 用户头像地址 |
|
|
126
|
+
| classMembers | 否 | object[] | 无 | 1、课对应的班级用户信息<br />2、初始化课堂参与人<br /><br />3、最多支持 2000 人,需要支持更多学生需要联系伯索平台进行额外申请<br />{<br /><br />/** 唯一标识该用户的 id \*/<br />loginName: string,<br /><br />/** 用户显示的姓名 _/<br />name: string,<br />/\*\* 用户角色,"speaker","assistant","listener","superlistener" 之一 _/<br />upimeRole: string,<br />/** 用户的 id,和云学堂业务强相关,sdk 用户非必要 \*/<br />unique_id: number \| string<br />/** 用户头像图片的 url,非必要 \*/<br />displayAvatarUrl: string,<br />} |
|
|
127
|
+
| enableENC | 否 | boolean | true | 是否启用降噪 |
|
|
128
|
+
| enableRTC3A | 否 | boolean | true | 是否启用 3A。<br />false:关闭回音消除、关闭降噪、关闭增益控制 |
|
|
129
|
+
| supportShowResourceCenter | 否 | boolean | false | true:工具栏显示 资料中心 按钮,但资料中心的逻辑需要用户自己实现 |
|
|
130
|
+
| supportSaveBoard | 否 | boolean | false | 是否支持保存板书,依赖于资料中心实现保存和插入板书文件 |
|
|
131
|
+
| env | 否 | string | 无 | sdk 数据环境参数,支持 dev、test、itest、ftest、www |
|
|
132
|
+
| enableLiveNewShareRegion | 否 | boolean | false | 是否允许区域共享 |
|
|
133
|
+
| enableLiveNewShareInTouch | 否 | boolean | false | 是否支持触屏模式下的新桌面共享(左侧新增按钮窗口来切换显示工具栏)<br />建议开启 |
|
|
134
|
+
| enableLiveNewShare | 否 | boolean | false | 是否支持新桌面共享<br />开启新桌面共享需要开启 electron 透明窗口,且可能触发 electron 本身存在的长时间透传导致的在应用上鼠标失焦问题 |
|
|
135
|
+
| enableLiveSign | 否 | boolean | false | 是否支持签到 |
|
|
136
|
+
| residentCamera | 否 | boolean | false | 常驻摄像头:只对学生或游客生效 |
|
|
137
|
+
| | | | | |
|
|
138
|
+
|
|
139
|
+
### 2.1.1、query 属性
|
|
140
|
+
|
|
141
|
+
**query 属性格式示例**:
|
|
142
|
+
|
|
143
|
+
```
|
|
144
|
+
appId=plaso&appType=liveclassSDK&d_dimension=1280x720&dhost=https%3A%2F%2Fdev.plaso.cn%2F&enableHiliter=true&enableNewClassExam=1&enableVideoMark=true&env=dev&loginName=t_1&mediaType=video&meetingId=test_1742442362&meetingType=public&signature=A226198904A392579B98987FB4CD5478AB3F5587&upimeTeacherTool=1151&userName=%E8%80%81%E5%B8%881&userType=speaker&validBegin=1742442364&validTime=99999&vendorType=2&videoStream=2
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
#### 2.1.1.1、组成 queryParams 对象
|
|
148
|
+
|
|
149
|
+
```ts
|
|
150
|
+
interface IQueryParams {
|
|
151
|
+
appId: string;
|
|
152
|
+
signature: string;
|
|
153
|
+
validBegin: number;
|
|
154
|
+
validTime: number;
|
|
155
|
+
endTime: number;
|
|
156
|
+
appType: string;
|
|
157
|
+
userType: string;
|
|
158
|
+
meetingType: string;
|
|
159
|
+
mediaType: string;
|
|
160
|
+
meetingId: string;
|
|
161
|
+
loginName: string;
|
|
162
|
+
userName: string;
|
|
163
|
+
d_dimension: string;
|
|
164
|
+
vendorType: number;
|
|
165
|
+
videoStream: number;
|
|
166
|
+
enableNewClassExam: number;
|
|
167
|
+
d_enableReRecording: number;
|
|
168
|
+
|
|
169
|
+
topic?: string;
|
|
170
|
+
onlineMode?: number;
|
|
171
|
+
d_enableOMO?: number;
|
|
172
|
+
d_delayEndTimes?: number;
|
|
173
|
+
d_delayEnd?: number;
|
|
174
|
+
d_restrictAssistantPerm?: number;
|
|
175
|
+
d_enableAvatarFreeScale?: number;
|
|
176
|
+
d_enableObjectEraser?: number;
|
|
177
|
+
d_vote?: number;
|
|
178
|
+
d_sharpness?: number;
|
|
179
|
+
isNewMT?: number;
|
|
180
|
+
d_enableDualCamera?: number;
|
|
181
|
+
}
|
|
182
|
+
```
|
|
134
183
|
|
|
135
184
|
##### 2.1.1.1.1、必传参数表格说明
|
|
136
185
|
|
|
137
|
-
| 参数
|
|
138
|
-
|
|
|
139
|
-
| appId
|
|
140
|
-
|
|
|
141
|
-
|
|
|
142
|
-
|
|
|
143
|
-
|
|
|
144
|
-
|
|
|
145
|
-
|
|
|
146
|
-
|
|
|
147
|
-
|
|
|
148
|
-
|
|
|
149
|
-
|
|
|
150
|
-
|
|
|
151
|
-
|
|
|
152
|
-
|
|
|
153
|
-
|
|
|
154
|
-
|
|
|
155
|
-
|
|
|
156
|
-
|
|
|
186
|
+
| 参数 | 类型 | 说明 |
|
|
187
|
+
| --- | --- | --- |
|
|
188
|
+
| appId | string | 在申请接入时,伯索平台给予的 appId |
|
|
189
|
+
| signature | string | 签名字符串,根据queryParams中除去signature参数的其他参数生成,生成示例参考[根据queryParams对象生成签名字符串](#2112根据-queryParams-对象生成签名字符串) |
|
|
190
|
+
| validBegin | number | 请求课堂**开始生效起始时间**的 Unix Epoch 时间戳,单位秒:(时间戳/1000 再取整) |
|
|
191
|
+
| validTime | number | 请求的**签名在课堂的有效时间段**(断网重连后会重新校验签名),单位秒,建议: 24 _ 60 _ 60 s |
|
|
192
|
+
| endTime | number | 请求课堂**结束时间**的 Unix Epoch 时间戳,单位秒:(时间戳/1000 再取整) |
|
|
193
|
+
| appType | string | 应用类型,必填,目前为固定值:liveclassSDK |
|
|
194
|
+
| userType | string | 用户类型,目前有三个值可选: speaker,assistant,listener; <br />speaker:主讲,有控制其他 listener 是否可写可说话的权限;<br />assistant:助教,也有控制权限<br />listener:学生 |
|
|
195
|
+
| meetingType | string | 课堂类型,传入值:private。 当选择 private 类型时,每一个进入课堂者,必须提供 loginName,这是唯一标识该用户的 id,相同的 loginName 登录,后进入者会使前一个强制登出 |
|
|
196
|
+
| mediaType | string | 媒体类型:audio, video<br />audio: 语音实时课堂<br />video:有头像权限的课堂,含语音权限 |
|
|
197
|
+
| meetingId | string | 课堂 ID,唯一标识该课堂;使用 ASSIIC 字符,不得包含/,,空格等;长度在 40 字节以内的字符串 |
|
|
198
|
+
| loginName | string | **唯一标识该用户的 id**,不能为空,相同的 loginName 登录,后面一个会使前面一个登出; |
|
|
199
|
+
| d_dimension | string | 1280x720 定义界面尺寸为 16:9 界面 |
|
|
200
|
+
| userName | string | 登录的用户名,在列表中显示用 |
|
|
201
|
+
| vendorType | number | rtc 类型 <br />2:agora |
|
|
202
|
+
| videoStream | number | 课堂类型,与 mediaType 需要对应上<br />2:视频课堂<br />1:语音课堂 |
|
|
203
|
+
| enableNewClassExam | number | 新版随堂测选择题:1;<br />新版随堂测填空题:2;<br />新版随堂测选择+填空:3,建议:3 |
|
|
204
|
+
| d_enableReRecording | number | 主讲、助教都可以重新录制课堂:3 |
|
|
205
|
+
| | | |
|
|
206
|
+
| | | |
|
|
157
207
|
|
|
158
208
|
##### 2.1.1.1.2、可选参数表格说明
|
|
159
209
|
|
|
160
|
-
|
|
|
161
|
-
|
|
|
162
|
-
|
|
|
163
|
-
|
|
|
164
|
-
|
|
|
165
|
-
|
|
|
166
|
-
|
|
|
167
|
-
| d_restrictAssistantPerm | number |
|
|
168
|
-
| d_enableAvatarFreeScale | number |
|
|
169
|
-
|
|
|
170
|
-
|
|
|
171
|
-
|
|
|
172
|
-
|
|
|
173
|
-
|
|
|
174
|
-
|
|
|
175
|
-
|
|
|
176
|
-
|
|
177
|
-
|
|
210
|
+
| 参数 | 类型 | 默认值 | 建议值 | 说明 |
|
|
211
|
+
| :-: | :-: | :-: | :-: | :-- |
|
|
212
|
+
| topic | string | 无 | 非空 | 显示该课堂的名称 |
|
|
213
|
+
| onlineMode | number | 6 | 无 | 上台学生数,1:最大上台 1 个学生,6:最大上台 6 个学生,12:最大上台 12 个学生。默认:6 |
|
|
214
|
+
| d_enableOMO | number | 0 | 无 | 是否开启站播模式,1:开启;0:关闭 |
|
|
215
|
+
| d_delayEndTimes | number | 0 | 无 | 单节课最大延迟下课次数:1、2、3、4 |
|
|
216
|
+
| d_delayEnd | number | 0 | 无 | 单次延时时间,单位秒:5*60、10 * 60、15*60、20 * 60、30\*60 |
|
|
217
|
+
| d_restrictAssistantPerm | number | 0 | 无 | 是否开启了:大班课限制助教权限<br />1:开启<br />0:关闭 |
|
|
218
|
+
| d_enableAvatarFreeScale | number | 0 | 无 | 开启头像任意比例缩放<br />0:关闭 1:开启,默认关闭 (非录制课堂、非无头像录制模式下,裁剪掉的老师/助教头像也会被录到回放中) |
|
|
219
|
+
| d_enableObjectEraser | number | 0 | 无 | 新板书配置,二进制位存储<br />default: 0;默认关闭对象擦<br />7:手写(对象擦);<br /> |
|
|
220
|
+
| d_vote | number | 0 | 1 | 0:未开放投票;1:开放投票 |
|
|
221
|
+
| d_sharpness | number | 10 | 无 | 头像推流清晰度、桌面共享清晰度<br />**仅 onlineMode 为 1 时生效**:<br />10:标清 20:高清 21: 高清流畅 30:超清 31: 超清流畅 |
|
|
222
|
+
| isNewMT | number | 0 | 1 | 是否支持 移动授课模式;<br />建议传 1 |
|
|
223
|
+
| d_enableDualCamera | number | 0 | 无 | 是否开启双摄,1:开启,0: 关闭 |
|
|
224
|
+
| recordType | number | 无 | 无 | 配置 recordAvartor 设置录制对象,参数说明参考[附录 9-1](#91recordtype) |
|
|
225
|
+
| recordAvator | string | '' | 无 | 传入老师/助教的`loginName`表示录制对应人的头像 |
|
|
226
|
+
| recordScreen | string | '' | 无 | 传入'screen'表示录制屏幕(当前仅支持录制老师屏幕)|
|
|
227
|
+
| | | | | |
|
|
178
228
|
|
|
179
|
-
#### 2.1.1.2、根据
|
|
229
|
+
#### 2.1.1.2、根据 queryParams 对象生成签名字符串
|
|
180
230
|
|
|
181
|
-
(1)**用户把
|
|
231
|
+
(1)**用户把 queryParams 作为参数传给自己的接口,接口返回值必须返回签名字符串:signature**
|
|
182
232
|
|
|
183
|
-
(2)获取signature后需要把 signature加到
|
|
233
|
+
(2)获取 signature 后需要把 signature 加到 queryParams 中作为一个参数
|
|
184
234
|
|
|
185
|
-
```
|
|
186
|
-
|
|
235
|
+
```ts
|
|
236
|
+
queryParams.signature = signature;
|
|
187
237
|
```
|
|
188
238
|
|
|
189
239
|
(3)**服务端接口生成 signature 规则**如下:
|
|
190
240
|
|
|
191
241
|
https://open.plaso.cn/doc-6285173?nav=01HEQ5Y5RXKMCPBPF6S8T3VK56
|
|
192
242
|
|
|
193
|
-
**signKey**:机构申请接入时,伯索平台给予的key
|
|
243
|
+
**signKey**:机构申请接入时,伯索平台给予的 key
|
|
194
244
|
|
|
195
|
-
```
|
|
245
|
+
```ts
|
|
196
246
|
/*!----------演示签名代码------------- */
|
|
197
247
|
|
|
198
248
|
// 业务参数,根据接口文档中定义,自行生成填写
|
|
199
|
-
const
|
|
249
|
+
const queryParams = { name: 'test' };
|
|
200
250
|
|
|
201
251
|
//平台分配给机构的key
|
|
202
|
-
const signKey = 'a_secret';
|
|
252
|
+
const signKey = 'a_secret';
|
|
203
253
|
|
|
204
254
|
// 业务参数和签名验证混合后排序
|
|
205
|
-
const afterSortParam = Object.keys(
|
|
255
|
+
const afterSortParam = Object.keys(queryParams).sort();
|
|
206
256
|
|
|
207
|
-
const res = []
|
|
257
|
+
const res = [];
|
|
208
258
|
for (let key of afterSortParam) {
|
|
209
|
-
res.push(`${key}=${
|
|
259
|
+
res.push(`${key}=${queryParams[key]}`);
|
|
210
260
|
}
|
|
211
261
|
|
|
212
262
|
// 排序后连接成字符串
|
|
213
|
-
const content = res.join(
|
|
263
|
+
const content = res.join('&');
|
|
214
264
|
|
|
215
265
|
const crypto = require('crypto');
|
|
216
266
|
|
|
217
267
|
// 使用分配的signKey来加密生成签名串signature
|
|
218
268
|
const signature = crypto.createHmac('sha1', signKey).update(content).digest('hex').toUpperCase();
|
|
219
|
-
|
|
220
269
|
```
|
|
221
270
|
|
|
271
|
+
#### 2.1.1.3、生成 query 字符串
|
|
222
272
|
|
|
223
|
-
|
|
224
|
-
#### 2.1.1.3、生成query 字符串
|
|
225
|
-
|
|
226
|
-
(1)获取 完整的featureObj后,遍历对象生成query 字符串
|
|
273
|
+
(1)获取 完整的 queryParams 后,遍历对象生成 query 字符串
|
|
227
274
|
|
|
228
275
|
每个参数值用 encodeURIComponent 编码
|
|
229
276
|
|
|
230
|
-
```
|
|
231
|
-
// 代码示例:其中
|
|
232
|
-
function genQuery(
|
|
233
|
-
const keys = Object.keys(
|
|
277
|
+
```ts
|
|
278
|
+
// 代码示例:其中 queryParams 对象包含signature
|
|
279
|
+
function genQuery(queryParams) {
|
|
280
|
+
const keys = Object.keys(queryParams).sort();
|
|
234
281
|
const res = [];
|
|
235
282
|
for (let key of keys) {
|
|
236
|
-
res.push(key +
|
|
283
|
+
res.push(key + '=' + encodeURIComponent(queryParams[key]));
|
|
237
284
|
}
|
|
238
|
-
return res.join(
|
|
285
|
+
return res.join('&');
|
|
239
286
|
}
|
|
240
|
-
genQuery(
|
|
287
|
+
genQuery(queryParams);
|
|
241
288
|
```
|
|
242
289
|
|
|
243
|
-
**query字符串格式示例**:
|
|
244
|
-
|
|
245
|
-
appId=plaso&appType=liveclassSDK&d_dimension=1280x720&dhost=https%3A%2F%2Fdev.plaso.cn%2F&enableHiliter=true&enableNewClassExam=1&enableVideoMark=true&env=dev&loginName=t_1&mediaType=video&meetingId=test_1742442362&meetingType=public&**signature**=A226198904A392579B98987FB4CD5478AB3F5587&upimeTeacherTool=1151&userName=%E8%80%81%E5%B8%881&userType=speaker&validBegin=1742442364&validTime=99999&vendorType=2&videoStream=2'
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
## 2.2、参数回调 onClassFinishedFn
|
|
250
|
-
|
|
251
|
-
```
|
|
252
|
-
// 课堂结束后的回调,回调参数为 课堂的meetingId
|
|
253
|
-
(meetingId: string)=>void
|
|
254
|
-
|
|
255
|
-
```
|
|
256
|
-
|
|
257
|
-
|
|
258
290
|
|
|
259
291
|
# 3、备课课堂入参说明
|
|
260
292
|
|
|
261
|
-
## 3.1、参数classOptions
|
|
293
|
+
## 3.1、参数 classOptions
|
|
262
294
|
|
|
263
295
|
```
|
|
264
296
|
类型:Object
|
|
265
297
|
```
|
|
266
298
|
|
|
267
|
-
|
|
268
|
-
|
|
269
299
|
### 3.1.1、必传参数
|
|
270
300
|
|
|
271
|
-
| 参数 | 类型 | 说明
|
|
272
|
-
| --------- | ------ |
|
|
273
|
-
| loginName | String | **唯一标识该用户的id**,不能为空,相同的loginName登录,后面一个会使前面一个登出; |
|
|
274
|
-
|
|
|
275
|
-
| | |
|
|
301
|
+
| 参数 | 类型 | 说明 |
|
|
302
|
+
| --------- | ------ | ------------------------------------------------------------------------------------ |
|
|
303
|
+
| loginName | String | **唯一标识该用户的 id**,不能为空,相同的 loginName 登录,后面一个会使前面一个登出; |
|
|
304
|
+
| userName | String | 登录的用户名,在列表中显示用 |
|
|
305
|
+
| | | |
|
|
276
306
|
|
|
277
307
|
### 3.1.2、可选参数
|
|
278
308
|
|
|
279
|
-
| 参数
|
|
280
|
-
|
|
|
281
|
-
| displayAvatarUrl
|
|
282
|
-
| topic
|
|
309
|
+
| 参数 | 类型 | 说明 |
|
|
310
|
+
| --- | --- | --- |
|
|
311
|
+
| displayAvatarUrl | String | 用户头像地址 |
|
|
312
|
+
| topic | String | 默认值是中文的 “备课课堂” |
|
|
283
313
|
| **d_enableObjectEraser** | number | 新板书配置,二进制位存储<br />default: 0;默认关闭对象擦<br />7:手写(对象擦);<br />**注意:该值需要和实时课堂的传值一样** |
|
|
284
|
-
| env
|
|
285
|
-
|
|
|
314
|
+
| env | String | sdk 数据环境参数,支持:dev、test、itest、ftest、www |
|
|
315
|
+
| | | |
|
|
286
316
|
|
|
287
317
|
**注意:**
|
|
288
318
|
|
|
289
319
|
1、备课课堂直接通过任务栏关闭不会清空本地记录的板书内容,下次进入后会 板书交互会和上次进入的板书 配置一致(即使 d_enableObjectEraser 参数 值变动了)
|
|
290
320
|
|
|
291
|
-
|
|
292
|
-
|
|
293
321
|
# 4、实时课堂&备课课堂 通用参数说明
|
|
294
322
|
|
|
295
323
|
## 4.1、参数 electronWinOptions
|
|
296
324
|
|
|
297
|
-
electron 的窗口参数,详情参考 [electron官方文档](https://www.electronjs.org/zh/docs/latest/api/browser-window#winwebcontents-%E5%8F%AA%E8%AF%BB)
|
|
325
|
+
electron 的窗口参数,详情参考 [electron 官方文档](https://www.electronjs.org/zh/docs/latest/api/browser-window#winwebcontents-%E5%8F%AA%E8%AF%BB)
|
|
298
326
|
|
|
299
|
-
```
|
|
327
|
+
```ts
|
|
300
328
|
type electronWinOptions = object;
|
|
301
329
|
```
|
|
302
330
|
|
|
303
|
-
|
|
304
|
-
|
|
305
331
|
## 4.2、参数回调 onClassWindowReadyFn
|
|
306
332
|
|
|
307
|
-
```
|
|
333
|
+
```ts
|
|
308
334
|
// 课堂窗口打开渲染成功后的回调,回调参数为 窗口id
|
|
309
|
-
type onClassWindowReadyFn = (winId: number)=>void;
|
|
335
|
+
type onClassWindowReadyFn = (winId: number) => void;
|
|
310
336
|
```
|
|
311
337
|
|
|
312
|
-
|
|
313
|
-
|
|
314
338
|
## 4.3、参数回调 onClassWindowLeaveFn
|
|
315
339
|
|
|
316
|
-
```
|
|
340
|
+
```ts
|
|
317
341
|
// 课堂窗口关闭后的回调,回调参数为 窗口id
|
|
318
|
-
type onClassWindowLeaveFn = (winId: number)=>void;
|
|
342
|
+
type onClassWindowLeaveFn = (winId: number) => void;
|
|
319
343
|
```
|
|
320
344
|
|
|
345
|
+
## 4.4、参数回调 onClassFinishedFn
|
|
346
|
+
|
|
347
|
+
```ts
|
|
348
|
+
// 课堂结束后的回调,回调参数为 课堂的meetingId
|
|
349
|
+
type onClassFinishedFn = (meetingId: string) => void;
|
|
321
350
|
|
|
351
|
+
```
|
|
322
352
|
|
|
323
|
-
## 4.
|
|
353
|
+
## 4.5、参数回调 onSaveBoardFn
|
|
324
354
|
|
|
325
355
|
**注意:**
|
|
326
356
|
|
|
@@ -330,90 +360,79 @@ type onClassWindowLeaveFn = (winId: number)=>void;
|
|
|
330
360
|
|
|
331
361
|
3、**备课保存的资源文件名 不能更改,info.pb 是固定的文件名**
|
|
332
362
|
|
|
333
|
-
```
|
|
363
|
+
```ts
|
|
334
364
|
// 保存板书方法,具体的保存逻辑由外部实现,取消保存板书时,callback传false, 不然传true
|
|
335
|
-
|
|
365
|
+
|
|
336
366
|
type FileParams = {
|
|
337
|
-
|
|
338
|
-
filePath: string[]
|
|
367
|
+
/** 备课相关资源文件的本地地址*/
|
|
368
|
+
filePath: string[];
|
|
339
369
|
/** 备课文件 类型*/
|
|
340
|
-
fileType: 'png' | 'pb' | string
|
|
341
|
-
}
|
|
370
|
+
fileType: 'png' | 'pb' | string;
|
|
371
|
+
};
|
|
342
372
|
|
|
343
373
|
type onSaveBoardFn = (
|
|
344
374
|
params: {
|
|
345
|
-
|
|
346
|
-
|
|
375
|
+
fileInfo: FileParams[];
|
|
376
|
+
fileName?: string;
|
|
347
377
|
},
|
|
348
|
-
callback: (result: boolean) => void
|
|
378
|
+
callback: (result: boolean) => void,
|
|
349
379
|
) => void;
|
|
350
380
|
```
|
|
351
381
|
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-

|
|
355
|
-
|
|
382
|
+
## 4.6、参数回调 onOpenResourceCenterFn
|
|
356
383
|
|
|
357
|
-
|
|
358
|
-
## 4.5、参数回调 onOpenResourceCenterFn
|
|
359
|
-
|
|
360
|
-
```
|
|
384
|
+
```ts
|
|
361
385
|
// 通知外部用户打开自己的资料中心,资料中心的具体ui和逻辑由外部用户自己实现
|
|
362
386
|
type onOpenResourceCenterFn = () => void;
|
|
363
387
|
```
|
|
364
388
|
|
|
389
|
+
## 4.7、参数回调 onGetExtFileNameFn
|
|
365
390
|
|
|
366
|
-
|
|
367
|
-
## 4.6、参数回调 onGetExtFileNameFn
|
|
368
|
-
|
|
369
|
-
```
|
|
391
|
+
```ts
|
|
370
392
|
// 通过 insertObject 插入的文件传入 参数 info 时,怎么从info中获取文件的可访问地址的逻辑在用户那,所以需要函数从外部用户获取外部用户传入的文件地址
|
|
371
393
|
// 其中info会作为args中的第一个参数回传
|
|
372
394
|
|
|
373
|
-
type onGetExtFileNameFn = (...args: any[])=>Promise<string
|
|
395
|
+
type onGetExtFileNameFn = (...args: any[]) => Promise<string>;
|
|
374
396
|
```
|
|
375
397
|
|
|
376
|
-
|
|
377
|
-
|
|
378
398
|
# 5、对外的交互方法
|
|
379
399
|
|
|
380
400
|
## 5.1、initLogConfig
|
|
381
401
|
|
|
382
|
-
**初始化课堂窗口日志位置**,窗口崩溃时会在同级目录下生成reports 文件夹存储dump,**在 调用createLiveClassWindow 前设置**
|
|
402
|
+
**初始化课堂窗口日志位置**,窗口崩溃时会在同级目录下生成 reports 文件夹存储 dump,**在 调用 createLiveClassWindow 前设置**
|
|
383
403
|
|
|
384
404
|
**日志默认位置**:
|
|
385
405
|
|
|
386
|
-
windows:C:\Users\\${userName}\AppData\Roaming\\${appName}\P403FileTemp
|
|
387
|
-
|
|
388
406
|
```
|
|
389
|
-
|
|
407
|
+
windows:C:\Users\${userName}\AppData\Roaming\\${appName}\P403FileTemp
|
|
408
|
+
```
|
|
409
|
+
|
|
410
|
+
```ts
|
|
411
|
+
path.join(remote.app.getPath('userData'), '/P403FileTemp/');
|
|
390
412
|
```
|
|
391
413
|
|
|
392
414
|
参数示例:
|
|
393
415
|
|
|
394
|
-
```
|
|
416
|
+
```ts
|
|
395
417
|
// 代码示例
|
|
396
418
|
const PlasoElectronSdk = window.require('@plasosdk/plaso-electron-sdk');
|
|
397
|
-
const logFilePath =
|
|
419
|
+
const logFilePath = 'C:/Users/userName/Desktop/electronDemo/electron12.0.18_x32/resources/app';
|
|
398
420
|
PlasoElectronSdk.initLogConfig(logFilePath);
|
|
399
|
-
|
|
400
421
|
```
|
|
401
422
|
|
|
402
423
|
## 5.2、getVersion
|
|
403
424
|
|
|
404
425
|
返回包的版本,格式:x.x.x
|
|
405
426
|
|
|
427
|
+
```ts
|
|
428
|
+
type getVersion = () => string;
|
|
406
429
|
```
|
|
407
|
-
type getVersion = ()=>string;
|
|
408
|
-
```
|
|
409
|
-
|
|
410
|
-
|
|
411
430
|
|
|
412
431
|
## 5.3、createLiveClassWindow
|
|
413
432
|
|
|
414
433
|
**创建实时课堂窗口**,入参参考 见 “[**2、实时课堂入参说明**](#2、实时课堂入参说明)”
|
|
415
434
|
|
|
416
|
-
```
|
|
435
|
+
```ts
|
|
417
436
|
/**
|
|
418
437
|
* @typedef {Object} classOptionsType
|
|
419
438
|
* @property {boolean} [debug] - 是否开启课堂窗口debug模式
|
|
@@ -479,8 +498,6 @@ function createLiveClassWindow({
|
|
|
479
498
|
}
|
|
480
499
|
```
|
|
481
500
|
|
|
482
|
-
|
|
483
|
-
|
|
484
501
|
## 5.4、createPrepareClassWindow
|
|
485
502
|
|
|
486
503
|
**创建备课课堂窗口**,入参参考 见 “[**3、备课课堂入参说明**](#3、备课课堂入参说明)”
|
|
@@ -489,13 +506,11 @@ function createLiveClassWindow({
|
|
|
489
506
|
参数详情 参考 createLiveClassWindow方法的说明
|
|
490
507
|
```
|
|
491
508
|
|
|
492
|
-
|
|
493
|
-
|
|
494
509
|
## 5.5、insertObject
|
|
495
510
|
|
|
496
511
|
用户从自己的云盘 **往 实时课堂/备课课堂 插入文件**
|
|
497
512
|
|
|
498
|
-
```
|
|
513
|
+
```ts
|
|
499
514
|
/** 插入的文件类型 */
|
|
500
515
|
const FILE_TYPE = {
|
|
501
516
|
IMAGE: 2,
|
|
@@ -507,13 +522,13 @@ const FILE_TYPE = {
|
|
|
507
522
|
DOC: 14,
|
|
508
523
|
XLS: 15,
|
|
509
524
|
// ppt
|
|
510
|
-
NPPT:17,
|
|
525
|
+
NPPT: 17,
|
|
511
526
|
// 备课文件
|
|
512
527
|
PREPARE_LESSONS: 22,
|
|
513
528
|
};
|
|
514
529
|
```
|
|
515
530
|
|
|
516
|
-
```
|
|
531
|
+
```ts
|
|
517
532
|
/** 插入外部云盘里的文件,文件需要遵循特定的数据结构 */
|
|
518
533
|
/**
|
|
519
534
|
* @typedef {Object} fileDataObj
|
|
@@ -529,48 +544,44 @@ const FILE_TYPE = {
|
|
|
529
544
|
type insertObject = (webContentId, fileData) => void;
|
|
530
545
|
```
|
|
531
546
|
|
|
532
|
-
|
|
533
|
-
|
|
534
547
|
### 5.5.1、插入备课文件
|
|
535
548
|
|
|
536
|
-
1、 插入 备课文件 的格式如下,其中 fileLocationPath为 插入的备课文件资源的地址前缀,比如要本地插入一个备课文件(info.pb),其完整地址为C:\Users\xxx\AppData\Roaming\plaso_sdk\prepareLessonsTemp\draft.swap\info.pb,则此时fileLocationPath = C:\Users\xxx\AppData\Roaming\plaso_sdk\prepareLessonsTemp\draft.swap
|
|
549
|
+
1、 插入 备课文件 的格式如下,其中 fileLocationPath 为 插入的备课文件资源的地址前缀,比如要本地插入一个备课文件(info.pb),其完整地址为 C:\Users\xxx\AppData\Roaming\plaso_sdk\prepareLessonsTemp\draft.swap\info.pb,则此时 fileLocationPath = C:\Users\xxx\AppData\Roaming\plaso_sdk\prepareLessonsTemp\draft.swap
|
|
537
550
|
|
|
538
|
-
```
|
|
551
|
+
```ts
|
|
539
552
|
// 备课的fileData格式
|
|
540
553
|
const fileData = {
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
}
|
|
554
|
+
type: 22,
|
|
555
|
+
info: ['pb', , , fileLocationPath],
|
|
556
|
+
};
|
|
544
557
|
```
|
|
545
558
|
|
|
546
559
|
**注意**:
|
|
547
560
|
|
|
548
561
|
1、**保存备课文件时,需要把 info.pb 和其他的图片文件放在同一个目录下,这样才可以通过一个 目录地址获取 备课的所有资源**
|
|
549
562
|
|
|
550
|
-
|
|
551
|
-
|
|
552
563
|
### 5.5.2、插入图片
|
|
553
564
|
|
|
554
565
|
1、**title 需要带有文件后缀名**
|
|
555
566
|
|
|
556
|
-
```
|
|
567
|
+
```ts
|
|
557
568
|
// 图片的fileData格式,不需要info属性
|
|
558
569
|
const fileData = {
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
}
|
|
570
|
+
type: 2,
|
|
571
|
+
title: 'xxxxxx.xxx',
|
|
572
|
+
url: 'xxxxxx',
|
|
573
|
+
};
|
|
563
574
|
```
|
|
564
575
|
|
|
565
|
-
### 5.5.3、插入ppt
|
|
576
|
+
### 5.5.3、插入 ppt
|
|
566
577
|
|
|
567
|
-
```
|
|
578
|
+
```ts
|
|
568
579
|
// ppt的fileData格式,不需要info属性
|
|
569
580
|
const fileData = {
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
}
|
|
581
|
+
type: 17,
|
|
582
|
+
title: 'xxxxxx',
|
|
583
|
+
url: 'xxxxxx',
|
|
584
|
+
};
|
|
574
585
|
```
|
|
575
586
|
|
|
576
587
|
### 5.5.4、插入 音视频
|
|
@@ -579,7 +590,7 @@ const fileData = {
|
|
|
579
590
|
|
|
580
591
|
2、或者设置**info**属性为表示文件信息的数组,可以通过 进课堂时传入的 **getExtFileName** 方法 可以获取文件有效路径
|
|
581
592
|
|
|
582
|
-
```
|
|
593
|
+
```ts
|
|
583
594
|
// audio、video 的fileData格式
|
|
584
595
|
const fileData = {
|
|
585
596
|
type: 6 或 7,
|
|
@@ -600,7 +611,7 @@ const fileData = {
|
|
|
600
611
|
|
|
601
612
|
2、或者设置 **info**属性 为表示文件信息的数组,可以通过 进课堂时传入的 **getExtFileName** 方法 可以获取文件有效路径
|
|
602
613
|
|
|
603
|
-
```
|
|
614
|
+
```ts
|
|
604
615
|
// pdf、word、execl 的fileData格式,不需要info属性
|
|
605
616
|
const fileData = {
|
|
606
617
|
type: 3 或 4 或 5 或 14 或 15,
|
|
@@ -615,29 +626,21 @@ const fileData = {
|
|
|
615
626
|
}
|
|
616
627
|
```
|
|
617
628
|
|
|
618
|
-
|
|
619
|
-
|
|
620
629
|
# 6、资料中心
|
|
621
630
|
|
|
622
631
|
step1、进课堂时,对象 **classOptions.supportShowResourceCenter** 需要是 true
|
|
623
632
|
|
|
624
|
-
step2、在课堂内点击资料中心后,会触发进课堂时传入的回调函数 **onOpenResourceCenterFn**,此时用户在 onOpenResourceCenterFn函数内打开自己的云盘
|
|
625
|
-
|
|
626
|
-
step3、选择号文件后,通过 **PlasoElectronSdk.insertObject** 方法插入文件,方法入参参考 insertObject说明
|
|
627
|
-
|
|
628
|
-
step4、insertObject 方法 入参 有info 时,此时 会触发进课堂时传入的回调函数 **onGetExtFileNameFn** 来获取文件的线上地址
|
|
633
|
+
step2、在课堂内点击资料中心后,会触发进课堂时传入的回调函数 **onOpenResourceCenterFn**,此时用户在 onOpenResourceCenterFn 函数内打开自己的云盘
|
|
629
634
|
|
|
635
|
+
step3、选择号文件后,通过 **PlasoElectronSdk.insertObject** 方法插入文件,方法入参参考 insertObject 说明
|
|
630
636
|
|
|
637
|
+
step4、insertObject 方法 入参 有 info 时,此时 会触发进课堂时传入的回调函数 **onGetExtFileNameFn** 来获取文件的线上地址
|
|
631
638
|
|
|
632
639
|
# 7、历史课堂
|
|
633
640
|
|
|
634
641
|
1、参考文档: [历史课堂接入方式](https://open.plaso.cn/folder-24752679?nav=01HEQ5Y5RXKMCPBPF6S8T3VK56)
|
|
635
642
|
|
|
636
|
-
2、课堂里插入需要 调用 回调 onGetExtFileNameFn 方法的文件时,对应的历史课堂 则需要自己包装一层,具体逻辑参考 :**[播放历史课堂-jssdk集成](https://open.plaso.cn/folder-24752679?nav=01HEQ5Y5RXKMCPBPF6S8T3VK56)**
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
|
|
643
|
+
2、课堂里插入需要 调用 回调 onGetExtFileNameFn 方法的文件时,对应的历史课堂 则需要自己包装一层,具体逻辑参考 :**[播放历史课堂-jssdk 集成](https://open.plaso.cn/folder-24752679?nav=01HEQ5Y5RXKMCPBPF6S8T3VK56)**
|
|
641
644
|
|
|
642
645
|
# 8、注意点
|
|
643
646
|
|
|
@@ -645,21 +648,32 @@ step4、insertObject 方法 入参 有info 时,此时 会触发进课堂时传
|
|
|
645
648
|
|
|
646
649
|
(2)electron 版本>=14.0.0 时:需要在主进程里 启动 remote
|
|
647
650
|
|
|
648
|
-
```
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
|
|
651
|
+
```ts
|
|
652
|
+
try {
|
|
653
|
+
const electronStore = require('@electron/remote/main');
|
|
654
|
+
electronStore.initialize();
|
|
655
|
+
// mainWindow 预期的渲染进程窗口
|
|
656
|
+
electronStore.enable(mainWindow.webContents);
|
|
657
|
+
} catch (error) {
|
|
658
|
+
console.error(
|
|
659
|
+
'Module not found',
|
|
660
|
+
'Please run `npm install @electron/remote` to enable remote module and update electron version to 22.0.0 or higher',
|
|
661
|
+
);
|
|
662
|
+
}
|
|
657
663
|
```
|
|
658
664
|
|
|
659
|
-
(3)**基于 此包封装新包时**:注意 @electron/remote 这个包的位置需要 和新包处于同级目录,需要把 和该包同级的@electron/remote移到新包的同级目录处
|
|
665
|
+
(3)**基于 此包封装新包时**:注意 @electron/remote 这个包的位置需要 和新包处于同级目录,需要把 和该包同级的@electron/remote 移到新包的同级目录处
|
|
660
666
|
|
|
661
|
-
(4)确保 仅最后的node_moudles 的顶层有 @electron/remote
|
|
667
|
+
(4)确保 仅最后的 node_moudles 的顶层有 @electron/remote
|
|
662
668
|
|
|
669
|
+
# 9、附录参数说明
|
|
663
670
|
|
|
671
|
+
## 9.1、RecordType
|
|
664
672
|
|
|
665
|
-
|
|
673
|
+
| 值 | 说明 |
|
|
674
|
+
| --- | ------------------------------- |
|
|
675
|
+
| 1 | 无头像录制(仅录制板书) |
|
|
676
|
+
| 2 | 录老师头像(录制老师头像+板书) |
|
|
677
|
+
| 3 | 录助教头像(录制助教头像+板书) |
|
|
678
|
+
| 4 | 录制课堂(录制整个屏幕和头像) |
|
|
679
|
+
| 5 | 仅录老师头像 |
|