@sokeai/cli 1.0.61 → 1.0.62
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/package.json +1 -1
- package/scripts/e2e-test.sh +11 -7
- package/skills/SKILL.md +195 -0
- package/skills/soke-ai-training/SKILL.md +93 -0
- package/skills/soke-cli/345/256/211/350/243/205/346/214/207/345/215/227.md +416 -0
- package/skills/soke-course/soke-cli/345/256/211/350/243/205/346/214/207/345/215/227.md +98 -79
- package/skills/soke-learning-map/SKILL.md +24 -14
- package/skills/soke-learning-map/soke-cli/345/256/211/350/243/205/346/214/207/345/215/227.md +99 -80
- package/skills/soke-lesson/SKILL.md +37 -34
- package/skills/soke-photo-gallery/SKILL.md +287 -0
- package/skills/oss-upload/skill.md +0 -50
- package/skills/oss-upload/upload.py +0 -355
|
@@ -40,7 +40,7 @@ soke-cli config show # 验证登录状态
|
|
|
40
40
|
│ 6. 创建学习地图阶段 → 添加课程内容,获取 stage-uuid │
|
|
41
41
|
│ 7. 发布学习地图 → 学员可见 │
|
|
42
42
|
│ 8. (可选) 指派 → 分配给部门/学员 → 学员开始学习 │
|
|
43
|
-
│ 9.
|
|
43
|
+
│ 9. 查询学习地图详情 → 查看地图完整信息 │
|
|
44
44
|
└─────────────────────────────────────────────────────────────────────┘
|
|
45
45
|
```
|
|
46
46
|
|
|
@@ -83,6 +83,7 @@ soke-cli config show # 验证登录状态
|
|
|
83
83
|
| 5 | `+check-item-status` | `data.availabelIds[]` | 步骤6 `--item-uuids`(只传可用 UUID) |
|
|
84
84
|
| 6 | `+create-stage` | `data.info.uuid` | 可创建多个阶段 |
|
|
85
85
|
| 7 | `+publish` | `data.info.status=1` | 发布成功 |
|
|
86
|
+
| 9 | `+detail` | `data.info.*` | 查看完整地图信息 |
|
|
86
87
|
|
|
87
88
|
---
|
|
88
89
|
|
|
@@ -132,7 +133,7 @@ soke-cli learning-map +create-map \
|
|
|
132
133
|
|------|------|------|
|
|
133
134
|
| `--path` | 是 | 所属分类 UUID(步骤1 获取) |
|
|
134
135
|
| `--title` | 是 | 学习地图名称 |
|
|
135
|
-
| `--type` | 是 | `
|
|
136
|
+
| `--type` | 是 | `fixed`(固定时间)/ `cycle`(周期型) |
|
|
136
137
|
| `--template` | 是 | 模板 ID,如 `14` |
|
|
137
138
|
| `--picture` | 是 | 封面图片 URL |
|
|
138
139
|
| `--description` | 否 | 简介(支持 HTML) |
|
|
@@ -321,23 +322,30 @@ soke-cli assign +create \
|
|
|
321
322
|
|
|
322
323
|
---
|
|
323
324
|
|
|
324
|
-
## 步骤9
|
|
325
|
+
## 步骤9:查询学习地图详情
|
|
325
326
|
|
|
326
327
|
```bash
|
|
327
|
-
|
|
328
|
-
soke-cli learning-map +list-map-users --map-id "MAP-UUID"
|
|
328
|
+
soke-cli learning-map +detail --uuid "MAP-UUID"
|
|
329
329
|
|
|
330
|
-
#
|
|
331
|
-
soke-cli learning-map +
|
|
332
|
-
--map-id "MAP-UUID" \
|
|
333
|
-
--dept-user-id "DEPT-USER-ID"
|
|
334
|
-
|
|
335
|
-
# 查询阶段学员进度
|
|
336
|
-
soke-cli learning-map +list-stage-users \
|
|
337
|
-
--map-id "MAP-UUID" \
|
|
338
|
-
--stage-id "STAGE-UUID"
|
|
330
|
+
# JSON 输出:
|
|
331
|
+
soke-cli learning-map +detail --uuid "MAP-UUID" --format json
|
|
339
332
|
```
|
|
340
333
|
|
|
334
|
+
**参数说明**:
|
|
335
|
+
|
|
336
|
+
| 参数 | 必填 | 说明 |
|
|
337
|
+
|------|------|------|
|
|
338
|
+
| `--uuid` | 是 | 学习地图 UUID |
|
|
339
|
+
|
|
340
|
+
**响应关键字段**:
|
|
341
|
+
- `data.info.uuid` → 地图 UUID
|
|
342
|
+
- `data.info.title` → 地图名称
|
|
343
|
+
- `data.info.status` → 状态(`0` 未发布 / `1` 已发布)
|
|
344
|
+
- `data.info.stage_number` → 阶段数量
|
|
345
|
+
- `data.info.learning_num` → 学习人数
|
|
346
|
+
- `data.info.finish_num` → 完成人数
|
|
347
|
+
- `data.info.point` / `data.info.credit` → 积分 / 学分
|
|
348
|
+
|
|
341
349
|
---
|
|
342
350
|
|
|
343
351
|
## 可用命令全览
|
|
@@ -359,6 +367,7 @@ soke-cli learning-map +list-stage-users \
|
|
|
359
367
|
|------|------|------|
|
|
360
368
|
| `+list-categories` | 查询学习地图分类 | read |
|
|
361
369
|
| `+list-maps` | 查询学习地图列表 | read |
|
|
370
|
+
| `+detail` | 查询学习地图详情 | read |
|
|
362
371
|
| `+list-stages` | 查询阶段列表 | read |
|
|
363
372
|
| `+list-items` | 查询阶段内容列表 | read |
|
|
364
373
|
|
|
@@ -510,6 +519,7 @@ soke-cli learning-map +list-maps \
|
|
|
510
519
|
| `learning-map +check-item-status` | `/skills/learningMap/item/checkUseStatus` | POST (form) |
|
|
511
520
|
| `learning-map +create-stage` | `/skills/learningMap/stage/create` | POST (form) |
|
|
512
521
|
| `learning-map +publish` | `/skills/learningMap/update/{uuid}` | PUT (form) |
|
|
522
|
+
| `learning-map +detail` | `/skills/learningMap/detail/{uuid}` | GET |
|
|
513
523
|
| `learning-map +list-stages` | `/learningMap/stage/list` | GET |
|
|
514
524
|
| `learning-map +list-items` | `/learningMap/item/list` | GET |
|
|
515
525
|
| `learning-map +list-map-users` | `/learningMap/user/list` | GET |
|
package/skills/soke-learning-map/soke-cli/345/256/211/350/243/205/346/214/207/345/215/227.md
CHANGED
|
@@ -30,79 +30,102 @@
|
|
|
30
30
|
|
|
31
31
|
## 安装步骤
|
|
32
32
|
|
|
33
|
-
|
|
33
|
+
> ⚠️ **先看这里**:以下步骤会将 `soke-cli` 安装到用户专属目录(`~/.npm-global`),无需 sudo、不依赖任何 AI 工具,任何终端打开即用。
|
|
34
|
+
>
|
|
35
|
+
> **三步走:① 改 npm prefix → ② 加 PATH → ③ 安装**
|
|
34
36
|
|
|
35
|
-
|
|
37
|
+
### 第一步:配置 npm prefix(所有平台通用)
|
|
36
38
|
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
39
|
+
设置 npm 全局安装路径为用户专属目录,这样:
|
|
40
|
+
- **不需要 sudo/管理员权限**
|
|
41
|
+
- **不会装到奇怪的系统目录**
|
|
42
|
+
- **任何终端都能找到**
|
|
40
43
|
|
|
41
44
|
```bash
|
|
42
|
-
|
|
45
|
+
mkdir -p ~/.npm-global
|
|
46
|
+
npm config set prefix ~/.npm-global
|
|
43
47
|
```
|
|
44
48
|
|
|
45
|
-
|
|
49
|
+
> 💡 这一步只需执行一次,之后所有通过 `npm install -g` 安装的工具都会放到统一位置。
|
|
46
50
|
|
|
47
|
-
|
|
51
|
+
---
|
|
48
52
|
|
|
49
|
-
|
|
50
|
-
- 按 `Win + X`,选择"Windows PowerShell (管理员)"
|
|
51
|
-
- 或在开始菜单搜索"PowerShell",右键选择"以管理员身份运行"
|
|
53
|
+
### 第二步:把 npm 全局 bin 目录加入 PATH
|
|
52
54
|
|
|
53
|
-
|
|
54
|
-
```powershell
|
|
55
|
-
npm install -g @sokeai/cli@latest
|
|
56
|
-
```
|
|
55
|
+
把 `~/.npm-global/bin` 加入 shell 搜索路径,这样终端才能找到 `soke-cli`。
|
|
57
56
|
|
|
58
|
-
|
|
57
|
+
#### macOS / Linux
|
|
59
58
|
|
|
60
|
-
|
|
61
|
-
- 按 `Win + R`,输入 `cmd`,按 `Ctrl + Shift + Enter`
|
|
62
|
-
- 或在开始菜单搜索"cmd",右键选择"以管理员身份运行"
|
|
59
|
+
在 `~/.zshrc`(Zsh)或 `~/.bashrc`(Bash)末尾追加一行:
|
|
63
60
|
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
61
|
+
```bash
|
|
62
|
+
echo 'export PATH="$HOME/.npm-global/bin:$PATH"' >> ~/.zshrc
|
|
63
|
+
source ~/.zshrc
|
|
64
|
+
```
|
|
68
65
|
|
|
69
|
-
> 💡 **
|
|
70
|
-
> - 如果提示"npm 不是内部或外部命令",请先安装 [Node.js](https://nodejs.org/)
|
|
71
|
-
> - 安装过程中可能需要管理员权限
|
|
72
|
-
> - 如果遇到权限问题,确保以管理员身份运行终端
|
|
66
|
+
> 💡 **Apple Silicon (M1/M2/M3) 用户**如果用 Homebrew 安装 Node.js,npm prefix 可能已指向 `/opt/homebrew`(arm64)或 `/usr/local`(x64)。上述 `npm config set prefix` 会覆盖默认值,所有全局工具统一走 `~/.npm-global`,不影响 Homebrew 自有工具。
|
|
73
67
|
|
|
74
|
-
|
|
68
|
+
#### Windows
|
|
69
|
+
|
|
70
|
+
**PowerShell**:
|
|
71
|
+
```powershell
|
|
72
|
+
# 查看当前用户 PATH
|
|
73
|
+
[Environment]::GetEnvironmentVariable('Path', 'User')
|
|
75
74
|
|
|
76
|
-
|
|
75
|
+
# 追加 npm-global 路径
|
|
76
|
+
$npmGlobal = "$env:USERPROFILE\.npm-global\bin"
|
|
77
|
+
[Environment]::SetEnvironmentVariable('Path', "$(([Environment]::GetEnvironmentVariable('Path', 'User') -split ';' -notlike '' -join ';'));$npmGlobal", 'User')
|
|
78
|
+
|
|
79
|
+
# 验证(需要重新打开 PowerShell 使改动生效,或手动刷新)
|
|
80
|
+
$env:Path = [Environment]::GetEnvironmentVariable('Path', 'User')
|
|
81
|
+
```
|
|
77
82
|
|
|
78
|
-
|
|
83
|
+
**CMD**:
|
|
84
|
+
```cmd
|
|
85
|
+
setx PATH "%PATH%;%USERPROFILE%\.npm-global\bin"
|
|
86
|
+
```
|
|
79
87
|
|
|
80
|
-
|
|
81
|
-
2. 安装脚本会根据你的操作系统(macOS/Linux/Windows)和架构(x64/arm64)自动下载对应的二进制文件
|
|
82
|
-
3. 二进制文件会被放置在对应的目录:
|
|
83
|
-
- **macOS/Linux**: `$(npm root -g)/@sokeai/cli/bin/soke-cli`
|
|
84
|
-
- **Windows**: `%APPDATA%\npm\node_modules\@sokeai\cli\bin\soke-cli.exe`
|
|
85
|
-
4. 如果你安装了 AI Agent(如 Claude Code),相关的 Skills 会自动同步到对应目录
|
|
88
|
+
> ⚠️ **Windows**: `setx` 修改的是**系统环境变量**,需要新的 CMD/PowerShell 窗口才能生效(当前窗口不会变)。
|
|
86
89
|
|
|
87
90
|
---
|
|
88
91
|
|
|
89
|
-
###
|
|
92
|
+
### 第三步:安装 soke-cli
|
|
90
93
|
|
|
91
|
-
|
|
94
|
+
PATH 配置完成后,新开一个终端窗口(或 `source` 刚改的文件),然后安装:
|
|
92
95
|
|
|
93
|
-
**macOS / Linux
|
|
96
|
+
**macOS / Linux**:
|
|
94
97
|
```bash
|
|
95
|
-
|
|
98
|
+
npm install -g @sokeai/cli@latest
|
|
96
99
|
```
|
|
97
100
|
|
|
98
|
-
**Windows (PowerShell / CMD)
|
|
99
|
-
```
|
|
101
|
+
**Windows (PowerShell / CMD)**:
|
|
102
|
+
```powershell
|
|
103
|
+
npm install -g @sokeai/cli@latest
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
> 💡 安装脚本会自动根据操作系统(macOS / Linux / Windows)和芯片架构(x64 / arm64)下载对应二进制文件,无需手动选择。
|
|
107
|
+
|
|
108
|
+
---
|
|
109
|
+
|
|
110
|
+
### 安装后验证
|
|
111
|
+
|
|
112
|
+
新开一个终端(让 PATH 生效),依次执行:
|
|
113
|
+
|
|
114
|
+
```bash
|
|
115
|
+
# 确认路径
|
|
116
|
+
which soke-cli
|
|
117
|
+
# 预期输出类似: /Users/你的用户名/.npm-global/bin/soke-cli
|
|
118
|
+
|
|
119
|
+
# 确认版本
|
|
100
120
|
soke-cli --version
|
|
121
|
+
# 预期输出: soke-cli version x.x.x
|
|
101
122
|
```
|
|
102
123
|
|
|
103
|
-
|
|
124
|
+
如果显示版本号,说明安装成功 ✅。
|
|
104
125
|
|
|
105
|
-
|
|
126
|
+
**如果 `which soke-cli` 无输出**,说明 PATH 未生效:
|
|
127
|
+
- macOS/Linux: 确认 `echo $PATH | tr ':' '\n' | grep npm-global` 有输出,若没有请重新执行第二步
|
|
128
|
+
- Windows: 确认环境变量中已添加 `C:\Users\你的用户名\.npm-global\bin`
|
|
106
129
|
|
|
107
130
|
---
|
|
108
131
|
|
|
@@ -246,51 +269,47 @@ soke-cli exam +list-exams --page 1 --page-size 10
|
|
|
246
269
|
|
|
247
270
|
**原因**: 二进制文件不在系统 PATH 中。
|
|
248
271
|
|
|
249
|
-
|
|
272
|
+
**解决方案(重新做安装步骤第二步)**:
|
|
250
273
|
|
|
251
|
-
**macOS/Linux
|
|
274
|
+
**macOS / Linux**:
|
|
252
275
|
```bash
|
|
253
|
-
#
|
|
276
|
+
# 确认 npm-global/bin 是否已在 PATH
|
|
254
277
|
which soke-cli
|
|
255
278
|
|
|
256
|
-
#
|
|
257
|
-
|
|
279
|
+
# 若无输出,检查路径是否存在
|
|
280
|
+
ls ~/.npm-global/bin/soke-cli 2>/dev/null && echo "存在,但 PATH 未生效"
|
|
281
|
+
|
|
282
|
+
# 重新追加 PATH 并生效
|
|
283
|
+
echo 'export PATH="$HOME/.npm-global/bin:$PATH"' >> ~/.zshrc
|
|
284
|
+
source ~/.zshrc
|
|
285
|
+
|
|
286
|
+
# 再次验证
|
|
287
|
+
which soke-cli
|
|
288
|
+
soke-cli --version
|
|
258
289
|
```
|
|
259
290
|
|
|
260
|
-
**Windows
|
|
291
|
+
**Windows**:
|
|
292
|
+
```powershell
|
|
293
|
+
# 检查 .npm-global/bin 是否存在
|
|
294
|
+
Test-Path "$env:USERPROFILE\.npm-global\bin\soke-cli.exe"
|
|
261
295
|
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
打开 PowerShell,执行:
|
|
265
|
-
```powershell
|
|
266
|
-
npm config get prefix
|
|
267
|
-
```
|
|
268
|
-
|
|
269
|
-
记下输出的路径(例如:`C:\Users\YourName\AppData\Roaming\npm`)
|
|
296
|
+
# 若存在但命令找不到,手动刷新 PATH
|
|
297
|
+
$env:Path = [Environment]::GetEnvironmentVariable('Path', 'User')
|
|
270
298
|
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
- 点击"高级系统设置"
|
|
275
|
-
- 点击"环境变量"
|
|
276
|
-
- 在"用户变量"或"系统变量"中找到 `Path`
|
|
277
|
-
- 点击"编辑",添加上面的 NPM 路径
|
|
278
|
-
- 点击"确定"保存
|
|
279
|
-
|
|
280
|
-
3. **重启终端**
|
|
281
|
-
|
|
282
|
-
关闭并重新打开 PowerShell 或 CMD,再次尝试:
|
|
283
|
-
```cmd
|
|
284
|
-
soke-cli --version
|
|
285
|
-
```
|
|
299
|
+
# 确认
|
|
300
|
+
where.exe soke-cli
|
|
301
|
+
```
|
|
286
302
|
|
|
287
|
-
|
|
288
|
-
```cmd
|
|
289
|
-
# Windows 示例
|
|
290
|
-
%APPDATA%\npm\soke-cli --version
|
|
303
|
+
**直接运行(临时方案,不推荐长期使用)**:
|
|
291
304
|
|
|
292
|
-
|
|
293
|
-
|
|
305
|
+
**macOS / Linux**:
|
|
306
|
+
```bash
|
|
307
|
+
~/.npm-global/bin/soke-cli --version
|
|
308
|
+
```
|
|
309
|
+
|
|
310
|
+
**Windows**:
|
|
311
|
+
```cmd
|
|
312
|
+
%USERPROFILE%\.npm-global\bin\soke-cli.exe --version
|
|
294
313
|
```
|
|
295
314
|
|
|
296
315
|
### Q3: 登录时浏览器没有自动打开
|
|
@@ -394,4 +413,4 @@ npx skills add liuchenlong1111/soke-cli -y -g
|
|
|
394
413
|
|
|
395
414
|
---
|
|
396
415
|
|
|
397
|
-
**祝你使用愉快!** 🎉
|
|
416
|
+
**祝你使用愉快!** 🎉
|
|
@@ -141,6 +141,31 @@ soke-cli course +lesson-get --lesson-id "LESSON-UUID"
|
|
|
141
141
|
**返回:**
|
|
142
142
|
- 课件详细信息(包含素材信息、转换状态等)
|
|
143
143
|
|
|
144
|
+
### 课件排序
|
|
145
|
+
|
|
146
|
+
#### `course +lesson-sort` - 调整课程课件顺序
|
|
147
|
+
|
|
148
|
+
按指定顺序重新排列课程下的课件。
|
|
149
|
+
|
|
150
|
+
**参数:**
|
|
151
|
+
- `--course-id` (必填): 课程 UUID
|
|
152
|
+
- `--sort-list` (必填): 课件 ID 有序列表,多个 ID 用逗号分隔,顺序即为最终显示顺序
|
|
153
|
+
|
|
154
|
+
**示例:**
|
|
155
|
+
```bash
|
|
156
|
+
# 将两个课件按指定顺序排列
|
|
157
|
+
soke-cli course +lesson-sort \
|
|
158
|
+
--course-id "F23F32C5-8586-45E5-B98D-5D005FD596B1" \
|
|
159
|
+
--sort-list "29F629AB-3FF6-4EC0-A7C5-CC6D7124518E,058B89B2-95CA-45EF-9F52-231E58AF2E91"
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
**返回:**
|
|
163
|
+
- 调整成功提示及课件数量
|
|
164
|
+
|
|
165
|
+
**说明:**
|
|
166
|
+
- `--sort-list` 中课件 ID 的顺序即为调整后的最终排列顺序
|
|
167
|
+
- 先使用 `course +lesson-list` 查出所有课件 UUID,再按需排列后传入
|
|
168
|
+
|
|
144
169
|
|
|
145
170
|
## 使用场景
|
|
146
171
|
|
|
@@ -248,44 +273,20 @@ soke-cli course +lesson-create \
|
|
|
248
273
|
soke-cli course +lesson-list --course-id "{course_id}" --format json
|
|
249
274
|
```
|
|
250
275
|
|
|
251
|
-
**响应示例**:
|
|
252
|
-
```json
|
|
253
|
-
{
|
|
254
|
-
"success": true,
|
|
255
|
-
"data": {
|
|
256
|
-
"list": [
|
|
257
|
-
{
|
|
258
|
-
"uuid": "lesson-123",
|
|
259
|
-
"title": "第一课",
|
|
260
|
-
"type": "video",
|
|
261
|
-
"length": 600,
|
|
262
|
-
"sort_order": 1
|
|
263
|
-
}
|
|
264
|
-
]
|
|
265
|
-
}
|
|
266
|
-
}
|
|
267
|
-
```
|
|
268
|
-
|
|
269
276
|
**获取课件详情**:
|
|
270
277
|
```
|
|
271
278
|
soke-cli course +lesson-get --lesson-id "{lesson_id}" --format json
|
|
272
279
|
```
|
|
273
280
|
|
|
274
|
-
|
|
275
|
-
```
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
"media_id": "media-456",
|
|
284
|
-
"filename": "lesson1.mp4",
|
|
285
|
-
"filesize": 10485760,
|
|
286
|
-
"object": "uploads/2024/01/abc123.mp4"
|
|
287
|
-
}
|
|
288
|
-
}
|
|
281
|
+
**调整课件顺序**:
|
|
282
|
+
```
|
|
283
|
+
# 先查询出所有课件 UUID
|
|
284
|
+
soke-cli course +lesson-list --course-id "{course_id}" --format json
|
|
285
|
+
|
|
286
|
+
# 按期望顺序传入 UUID 列表(逗号分隔,第一个排在最前)
|
|
287
|
+
soke-cli course +lesson-sort \
|
|
288
|
+
--course-id "{course_id}" \
|
|
289
|
+
--sort-list "{lesson_id_1},{lesson_id_2},{lesson_id_3}"
|
|
289
290
|
```
|
|
290
291
|
|
|
291
292
|
## API 接口映射
|
|
@@ -295,6 +296,7 @@ soke-cli course +lesson-get --lesson-id "{lesson_id}" --format json
|
|
|
295
296
|
| `course +lesson-create` | `/skills/course/lesson/create` | POST | 创建课件 |
|
|
296
297
|
| `course +lesson-list` | `/skills/course/lesson/list` | GET | 列出课件列表 |
|
|
297
298
|
| `course +lesson-get` | `/skills/course/lesson/{id}` | GET | 获取课件详情 |
|
|
299
|
+
| `course +lesson-sort` | `/skills/course/lesson/sort/{course_id}` | PUT | 调整课件顺序 |
|
|
298
300
|
| `course +lesson-update` | `/skills/course/lesson/{id}` | PUT | 更新课件信息 |
|
|
299
301
|
## 课件与素材的关系
|
|
300
302
|
|
|
@@ -481,7 +483,8 @@ soke-cli file +upload --file "lesson.mp4" --format json
|
|
|
481
483
|
1. **素材必须先上传**: 创建课件前必须先上传素材到素材库
|
|
482
484
|
2. **类型匹配**: 课件类型必须与素材类型匹配
|
|
483
485
|
3. **时长设置**: 视频和音频必须设置正确的时长,文档类型填 0
|
|
484
|
-
4. **排序规则**:
|
|
486
|
+
4. **排序规则**: 课件按创建时间自动排序,可通过 `course +lesson-sort` 手动调整顺序
|
|
487
|
+
5. **排序需覆盖全部课件**: 调用 `+lesson-sort` 时建议传入课程下所有课件的 UUID,避免遗漏
|
|
485
488
|
6. **发布要求**: 课程至少需要一个课件才能发布
|
|
486
489
|
|
|
487
490
|
## 权限要求
|