@sokeai/cli 1.0.41 → 1.0.53
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 +1 -24
- package/package.json +2 -2
- package/scripts/build-binaries.sh +1 -30
- package/scripts/e2e-test.sh +63 -3
- package/scripts/install.js +52 -110
- package/scripts/local-test.js +10 -85
- package/scripts/local-test.sh +52 -7
- package/scripts/push.sh +12 -4
- package/scripts/release.sh +50 -40
- package/scripts/test-auto-detect.js +71 -48
- package/skills/README.md +0 -1
- package/skills/oss-upload/skill.md +50 -0
- package/skills/oss-upload/upload.py +355 -0
- package/skills/soke-assign/README.md +310 -0
- package/skills/soke-assign/SKILL.md +383 -0
- package/skills/soke-course/README.md +168 -92
- package/skills/soke-course/SKILL.md +372 -460
- package/skills/soke-exam/SKILL.md +565 -0
- package/skills/soke-exam/references/exam-get-exam-user.md +212 -0
- package/skills/soke-learning-map/SKILL.md +544 -0
- package/skills/soke-learning-profile/SKILL.md +0 -1
- package/skills/soke-lesson/README.md +53 -0
- package/skills/soke-lesson/SKILL.md +510 -0
- package/skills/soke-material/README.md +49 -0
- package/skills/soke-material/SKILL.md +390 -0
- package/scripts/ci/check-legacy-constants.sh +0 -27
- package/scripts/ci/check-yaml-env-whitelist.sh +0 -33
- package/scripts/mcp-stdout-scan.sh +0 -46
- package/scripts/regress-auth.sh +0 -56
- package/scripts/regress-baseline.md +0 -84
- package/scripts/test-local-reconcile.js +0 -55
- package/skills/soke-business-training-report/SKILL.md +0 -58
- package/skills/soke-course/SUMMARY.md +0 -236
- package/skills/soke-course/templates/batch-create-from-excel.md +0 -75
|
@@ -1,58 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: soke-business-training-report
|
|
3
|
-
description: 生成某场业务培训考试的整体分析报告,包括参考人数、通过率、平均分、最高分及未通过学员名单。
|
|
4
|
-
requiredAuthorizations: [{"platformId":"soke-ai"}]
|
|
5
|
-
---
|
|
6
|
-
|
|
7
|
-
# 培训考试整体分析报告 Skill
|
|
8
|
-
|
|
9
|
-
## 目标
|
|
10
|
-
根据用户提供的培训/考试名称,通过调用开放平台的考试相关 API,自动生成一份结构化的培训考试分析报告。
|
|
11
|
-
|
|
12
|
-
## 触发条件
|
|
13
|
-
当用户提出类似以下问题时,应使用此 Skill:
|
|
14
|
-
- "帮我分析一下本次业务培训的考试情况"
|
|
15
|
-
- "统计一下这次培训的通过率"
|
|
16
|
-
- "输出一份『新员工入职培训』的考试报告"
|
|
17
|
-
|
|
18
|
-
## 执行步骤
|
|
19
|
-
|
|
20
|
-
### 第一步:确认目标考试
|
|
21
|
-
1. 调用 `GET /exam/exam/list` 接口,获取考试列表。
|
|
22
|
-
- **必填参数**:`start_time` 和 `end_time`(Unix 时间戳,单位毫秒),时间差不超过 365 天。
|
|
23
|
-
- 若用户未提供时间范围,自动设置为近 3 个月。
|
|
24
|
-
2. 根据用户提供的培训名称关键词,在返回的 `data.list` 中模糊匹配 `title` 字段。
|
|
25
|
-
- 如果匹配到多个,列出候选供用户选择。
|
|
26
|
-
3. 记录目标考试的 `uuid`、`title`、`total_score`、`pass_score`。
|
|
27
|
-
|
|
28
|
-
### 第二步:获取考试学员成绩列表
|
|
29
|
-
1. 调用 `GET /exam/user/list` 接口,参数 `exam_id` 为考试 UUID。
|
|
30
|
-
2. 提取每个学员的 `pass_status`(passed/unpassed/not_attempt)、`last_score`。
|
|
31
|
-
|
|
32
|
-
### 第三步:计算整体统计指标
|
|
33
|
-
- 参考人数(排除 not_attempt)
|
|
34
|
-
- 通过人数(passed)
|
|
35
|
-
- 通过率、平均分、最高分
|
|
36
|
-
- 未通过学员列表
|
|
37
|
-
|
|
38
|
-
### 第四步:输出报告
|
|
39
|
-
按照以下格式输出:
|
|
40
|
-
|
|
41
|
-
📊 【培训名称】考试分析报告
|
|
42
|
-
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
43
|
-
👥 参考人数:XX 人
|
|
44
|
-
✅ 通过人数:XX 人
|
|
45
|
-
📈 通过率:XX%
|
|
46
|
-
📊 平均分:XX 分(满分 XX 分)
|
|
47
|
-
🏆 最高分:XX 分
|
|
48
|
-
❌ 未通过学员:XX 人
|
|
49
|
-
- 学员A(得分:XX)
|
|
50
|
-
...
|
|
51
|
-
|
|
52
|
-
## API 调用与鉴权
|
|
53
|
-
- 基础 URL:`https://oapi.soke.cn`
|
|
54
|
-
- 接口需要 `access_token`,在 Agent 环境中自动获取,无需手动处理。
|
|
55
|
-
|
|
56
|
-
## 注意事项
|
|
57
|
-
- `start_time` 和 `end_time` 必填,Skill 自动生成。
|
|
58
|
-
- 注意区分 `not_attempt`(未参考)、`reviewing`(阅卷中)、`unpassed`(未通过)和 `passed`(通过)。
|
|
@@ -1,236 +0,0 @@
|
|
|
1
|
-
# soke-course Skill 创建总结
|
|
2
|
-
|
|
3
|
-
## ✅ 任务完成
|
|
4
|
-
|
|
5
|
-
已成功为 soke-cli 创建了完整的课程查询 skill,包含所有必要的文档和使用示例。
|
|
6
|
-
|
|
7
|
-
## 📦 创建的文件
|
|
8
|
-
|
|
9
|
-
```
|
|
10
|
-
/Users/edy/www/soke-lark-cli/soke-cli/skills/soke-course/
|
|
11
|
-
├── SKILL.md (15KB) # 主要技能文档
|
|
12
|
-
├── README.md (4.6KB) # 快速开始指南
|
|
13
|
-
└── references/
|
|
14
|
-
├── course-list-courses.md (6KB) # 课程列表查询详细参考
|
|
15
|
-
└── examples.md (9.4KB) # 8个实际使用示例
|
|
16
|
-
```
|
|
17
|
-
|
|
18
|
-
**总计**: 4个文件,约35KB的文档
|
|
19
|
-
|
|
20
|
-
## 🎯 功能覆盖
|
|
21
|
-
|
|
22
|
-
### 已实现的查询功能
|
|
23
|
-
|
|
24
|
-
| 功能 | 命令 | 状态 |
|
|
25
|
-
|------|------|------|
|
|
26
|
-
| 课程列表查询 | `+list-courses` | ✅ 已验证 |
|
|
27
|
-
| 课程详情查询 | `+get-course` | ✅ 已验证 |
|
|
28
|
-
| 课程分类查询 | `+list-categories` | ✅ 已验证 |
|
|
29
|
-
| 课件列表查询 | `+list-lessons` | ✅ 已验证 |
|
|
30
|
-
| 学习记录查询 | `+list-course-users` | ✅ 已验证 |
|
|
31
|
-
| 用户学习详情 | `+get-course-user` | ✅ 已验证 |
|
|
32
|
-
| 课件学习记录 | `+list-lesson-learns` | ✅ 已验证 |
|
|
33
|
-
| 人脸识别记录 | `+list-lesson-faces` | ✅ 已验证 |
|
|
34
|
-
|
|
35
|
-
### 支持的筛选条件
|
|
36
|
-
|
|
37
|
-
**课程列表查询支持**:
|
|
38
|
-
- ✅ 时间范围筛选(start-time, end-time)
|
|
39
|
-
- ✅ 课程分类筛选(category-id)
|
|
40
|
-
- ✅ 课程状态筛选(status: 0=未发布, 1=已发布, 2=已关闭)
|
|
41
|
-
- ✅ 课程来源筛选(is-in: 0=采购课, 1=自建课)
|
|
42
|
-
- ✅ 分页查询(page, page-size)
|
|
43
|
-
|
|
44
|
-
**学习记录查询支持**:
|
|
45
|
-
- ✅ 用户ID筛选(userid-list,最多100个)
|
|
46
|
-
- ✅ 完成时间筛选(finish-start-time, finish-end-time)
|
|
47
|
-
- ✅ 分页查询
|
|
48
|
-
|
|
49
|
-
## 📚 文档结构
|
|
50
|
-
|
|
51
|
-
### 1. SKILL.md - 主要技能文档
|
|
52
|
-
- **核心概念**: Course, CourseUser, Category, Lesson 等
|
|
53
|
-
- **资源关系图**: 清晰展示各实体之间的关系
|
|
54
|
-
- **8个命令详解**: 每个命令包含
|
|
55
|
-
- 命令格式
|
|
56
|
-
- 参数说明(必需/可选)
|
|
57
|
-
- 返回字段说明
|
|
58
|
-
- 使用示例
|
|
59
|
-
- 权限要求
|
|
60
|
-
- **3个常见工作流**:
|
|
61
|
-
- 查询用户学习情况
|
|
62
|
-
- 统计课程完成情况
|
|
63
|
-
- 查询时间段课程
|
|
64
|
-
- **注意事项**: 时间格式、分页、权限等
|
|
65
|
-
- **错误处理**: 权限不足、参数错误、数据不存在等
|
|
66
|
-
|
|
67
|
-
### 2. README.md - 快速开始指南
|
|
68
|
-
- **功能概述**: 用图标清晰展示功能
|
|
69
|
-
- **快速开始**: 3步即可开始使用
|
|
70
|
-
- **基本使用**: 4个常用场景的示例
|
|
71
|
-
- **主要命令表**: 8个命令的快速参考
|
|
72
|
-
- **使用场景**: 3个实际场景的完整流程
|
|
73
|
-
- **参数说明**: 时间、状态等参数的详细说明
|
|
74
|
-
- **注意事项**: 4个关键注意点
|
|
75
|
-
- **错误处理**: 3种常见错误的解决方案
|
|
76
|
-
|
|
77
|
-
### 3. course-list-courses.md - 详细参考
|
|
78
|
-
- **基本用法**: 最简单的查询示例
|
|
79
|
-
- **高级筛选**: 5种筛选方式
|
|
80
|
-
- 按状态筛选
|
|
81
|
-
- 按来源筛选
|
|
82
|
-
- 按分类筛选
|
|
83
|
-
- 组合筛选
|
|
84
|
-
- 分页查询
|
|
85
|
-
- **返回数据示例**: 完整的JSON响应
|
|
86
|
-
- **返回字段说明**: 18个字段的详细说明
|
|
87
|
-
- **时间戳转换**: JavaScript/Python/Go 三种语言的示例
|
|
88
|
-
- **常见问题**: 4个FAQ
|
|
89
|
-
|
|
90
|
-
### 4. examples.md - 实际使用示例
|
|
91
|
-
- **8个完整示例**:
|
|
92
|
-
1. 查询本月的课程
|
|
93
|
-
2. 统计课程完成率(含数据分析代码)
|
|
94
|
-
3. 查询用户的学习情况
|
|
95
|
-
4. 查询课程的课件学习详情
|
|
96
|
-
5. 按分类查询课程
|
|
97
|
-
6. 查询人脸识别记录
|
|
98
|
-
7. 批量查询多个用户的学习记录
|
|
99
|
-
8. 查询某个时间段完成的学习记录
|
|
100
|
-
- **2个常用脚本**:
|
|
101
|
-
- 课程完成率统计脚本(Bash + jq)
|
|
102
|
-
- 批量导出课程数据脚本
|
|
103
|
-
|
|
104
|
-
## 🔍 技术亮点
|
|
105
|
-
|
|
106
|
-
1. **完整性**: 覆盖了所有8个课程相关命令
|
|
107
|
-
2. **实用性**: 提供了8个实际使用场景的完整示例
|
|
108
|
-
3. **易用性**: 从快速开始到深入使用的完整学习路径
|
|
109
|
-
4. **准确性**: 基于实际的 soke-cli 命令和 API 文档
|
|
110
|
-
5. **可维护性**: 清晰的文档结构,易于更新和扩展
|
|
111
|
-
|
|
112
|
-
## 🎓 使用指南
|
|
113
|
-
|
|
114
|
-
### 新手入门
|
|
115
|
-
1. 阅读 `README.md` 了解基本概念(5分钟)
|
|
116
|
-
2. 跟随"快速开始"完成第一次查询(10分钟)
|
|
117
|
-
3. 查看"使用场景"学习常见操作(15分钟)
|
|
118
|
-
|
|
119
|
-
### 进阶使用
|
|
120
|
-
1. 阅读 `SKILL.md` 学习所有命令(30分钟)
|
|
121
|
-
2. 参考 `examples.md` 学习实际场景(30分钟)
|
|
122
|
-
3. 查阅 `course-list-courses.md` 深入了解细节(20分钟)
|
|
123
|
-
|
|
124
|
-
### 快速查询
|
|
125
|
-
- 忘记命令参数?查看 `SKILL.md` 的命令详解部分
|
|
126
|
-
- 需要示例代码?查看 `examples.md`
|
|
127
|
-
- 遇到错误?查看 `README.md` 的错误处理部分
|
|
128
|
-
|
|
129
|
-
## ✨ 特色功能
|
|
130
|
-
|
|
131
|
-
### 1. 多维度筛选
|
|
132
|
-
```bash
|
|
133
|
-
# 组合多个筛选条件
|
|
134
|
-
soke-cli course +list-courses \
|
|
135
|
-
--start-time 1704038400000 \
|
|
136
|
-
--end-time 1735660799000 \
|
|
137
|
-
--status 1 \
|
|
138
|
-
--is-in 1 \
|
|
139
|
-
--category-id "cat001"
|
|
140
|
-
```
|
|
141
|
-
|
|
142
|
-
### 2. 批量查询
|
|
143
|
-
```bash
|
|
144
|
-
# 一次查询多个用户的学习记录
|
|
145
|
-
soke-cli course +list-course-users \
|
|
146
|
-
--course-id "course123" \
|
|
147
|
-
--userid-list "user1,user2,user3"
|
|
148
|
-
```
|
|
149
|
-
|
|
150
|
-
### 3. 时间范围查询
|
|
151
|
-
```bash
|
|
152
|
-
# 查询特定时间段完成的学习记录
|
|
153
|
-
soke-cli course +list-course-users \
|
|
154
|
-
--course-id "course123" \
|
|
155
|
-
--finish-start-time 1704038400000 \
|
|
156
|
-
--finish-end-time 1735660799000
|
|
157
|
-
```
|
|
158
|
-
|
|
159
|
-
### 4. 人脸识别监控
|
|
160
|
-
```bash
|
|
161
|
-
# 确保学员本人学习
|
|
162
|
-
soke-cli course +list-lesson-faces \
|
|
163
|
-
--lesson-id "lesson123"
|
|
164
|
-
```
|
|
165
|
-
|
|
166
|
-
## 📊 数据分析能力
|
|
167
|
-
|
|
168
|
-
文档中提供了完整的数据分析示例:
|
|
169
|
-
|
|
170
|
-
```javascript
|
|
171
|
-
// 计算课程完成率
|
|
172
|
-
const completionRate = (completedUsers / totalUsers * 100).toFixed(2);
|
|
173
|
-
|
|
174
|
-
// 计算平均学习进度
|
|
175
|
-
const avgProgress = (data.reduce((sum, u) => sum + u.study_progress, 0) / totalUsers).toFixed(2);
|
|
176
|
-
|
|
177
|
-
// 计算平均学习时长
|
|
178
|
-
const avgDuration = (data.reduce((sum, u) => sum + u.study_duration, 0) / totalUsers / 3600).toFixed(2);
|
|
179
|
-
```
|
|
180
|
-
|
|
181
|
-
## 🔗 与其他 Skill 的集成
|
|
182
|
-
|
|
183
|
-
### 与 soke-exam 的对比
|
|
184
|
-
- **相似点**: 都支持时间范围查询、用户记录查询、分类查询
|
|
185
|
-
- **差异点**:
|
|
186
|
-
- 课程有课件和学习进度的概念
|
|
187
|
-
- 课程支持人脸识别记录查询
|
|
188
|
-
- 课程有学习模式(自由式/解锁式)
|
|
189
|
-
|
|
190
|
-
### 与 soke-shared 的集成
|
|
191
|
-
- 共享认证机制(auth login)
|
|
192
|
-
- 共享配置管理(config init)
|
|
193
|
-
- 共享权限处理逻辑
|
|
194
|
-
|
|
195
|
-
## ⚠️ 重要提示
|
|
196
|
-
|
|
197
|
-
1. **时间格式**: 必须使用毫秒级Unix时间戳(不是秒)
|
|
198
|
-
2. **时间范围**: 课程列表查询的时间范围不能超过365天
|
|
199
|
-
3. **分页限制**: 每页最大100条记录
|
|
200
|
-
4. **批量限制**: userid-list 最多支持100个用户ID
|
|
201
|
-
5. **权限要求**: 所有操作需要 `course:*:readonly` 权限
|
|
202
|
-
|
|
203
|
-
## 🚀 下一步建议
|
|
204
|
-
|
|
205
|
-
1. **测试验证**: 使用实际数据测试所有命令
|
|
206
|
-
2. **补充示例**: 根据实际使用场景添加更多示例
|
|
207
|
-
3. **性能优化**: 对于大数据量场景,提供分页查询的最佳实践
|
|
208
|
-
4. **错误处理**: 补充更多错误场景的处理方法
|
|
209
|
-
5. **集成脚本**: 创建更多自动化脚本模板
|
|
210
|
-
|
|
211
|
-
## 📝 维护建议
|
|
212
|
-
|
|
213
|
-
1. **定期更新**: 当 API 有变更时及时更新文档
|
|
214
|
-
2. **收集反馈**: 收集用户使用反馈,优化文档
|
|
215
|
-
3. **补充案例**: 根据实际使用场景补充更多示例
|
|
216
|
-
4. **版本管理**: 使用版本号管理文档变更
|
|
217
|
-
|
|
218
|
-
## 🎉 总结
|
|
219
|
-
|
|
220
|
-
成功创建了一个完整、实用、易用的课程查询 skill,包含:
|
|
221
|
-
|
|
222
|
-
- ✅ 4个文档文件(35KB)
|
|
223
|
-
- ✅ 8个命令的完整说明
|
|
224
|
-
- ✅ 8个实际使用示例
|
|
225
|
-
- ✅ 2个自动化脚本模板
|
|
226
|
-
- ✅ 完整的错误处理指南
|
|
227
|
-
- ✅ 清晰的学习路径
|
|
228
|
-
|
|
229
|
-
这个 skill 现在可以直接使用,帮助用户高效地查询和管理课程数据!
|
|
230
|
-
|
|
231
|
-
---
|
|
232
|
-
|
|
233
|
-
**创建日期**: 2024-05-14
|
|
234
|
-
**创建者**: Claude (AI助手)
|
|
235
|
-
**版本**: v1.0.0
|
|
236
|
-
**状态**: ✅ 完成并可用
|
|
@@ -1,75 +0,0 @@
|
|
|
1
|
-
# `+batch-create-from-excel` Excel 模板说明
|
|
2
|
-
|
|
3
|
-
`soke-cli course +batch-create-from-excel` 接受的 Excel 模板与原 `createcourse` 工具兼容。下面给出列定义、续行规则与制作技巧。
|
|
4
|
-
|
|
5
|
-
## 列定义
|
|
6
|
-
|
|
7
|
-
| 列名 | 必填 | 类型/格式 | 说明 |
|
|
8
|
-
| --- | --- | --- | --- |
|
|
9
|
-
| 序号 | 是 | 数字/文本 | 课程序号,行级唯一;续行(同一课程的下一节分集)填空 |
|
|
10
|
-
| 课程名称 | 是 | 文本 | 课程标题。续行可留空或填与上一行相同的标题 |
|
|
11
|
-
| 分类 | 否 | 分隔字符串 | 多级分类用 `--separator` 分隔,例如 `公共课-合规-反洗钱` |
|
|
12
|
-
| 标签 | 否 | 分隔字符串 | 多标签同样按 `--separator` 分隔 |
|
|
13
|
-
| 简介 | 否 | 文本 | 课程介绍 |
|
|
14
|
-
| 学分 | 否 | 数字 | `default` 模式有效 |
|
|
15
|
-
| 积分 | 否 | 数字 | `default` 模式有效;HG 模式忽略 |
|
|
16
|
-
| 封面图 | 否 | 文本 | URL / `default` / 本地图片路径 / 数字(秒,需 ffmpeg) / 留空(视频自动抽帧,需 ffmpeg) |
|
|
17
|
-
| 素材文件 | 否(分集行必填) | 路径 | 课件文件,相对路径会按 `--material-dir` 解析 |
|
|
18
|
-
|
|
19
|
-
### HG 模式额外列
|
|
20
|
-
|
|
21
|
-
启用 `--mode hg` 时,额外读取四列学时:
|
|
22
|
-
|
|
23
|
-
| 列名 | 单位 | 说明 |
|
|
24
|
-
| --- | --- | --- |
|
|
25
|
-
| 习思想 | 学时 | 习近平新时代中国特色社会主义思想 |
|
|
26
|
-
| 政治能力 | 学时 | - |
|
|
27
|
-
| 业务能力 | 学时 | - |
|
|
28
|
-
| 执法能力 | 学时 | - |
|
|
29
|
-
|
|
30
|
-
## 表头规则
|
|
31
|
-
|
|
32
|
-
- 前 2 行为表头,允许两行合并表头(工具按 trim 后的名称合并到位置映射)。
|
|
33
|
-
- 第 3 行起为数据。
|
|
34
|
-
- 总行数低于 4 会直接报错。
|
|
35
|
-
|
|
36
|
-
## 续行(同一课程多分集)
|
|
37
|
-
|
|
38
|
-
当一门课程含多节课件时:
|
|
39
|
-
|
|
40
|
-
1. 第一行填完整课程信息(序号 + 课程名称 + 其他元数据 + 第 1 节素材文件)。
|
|
41
|
-
2. 后续行的 `序号` 和 `课程名称` 留空(或 `课程名称` 与上一行相同),只填 `素材文件` (以及非 HG 模式的 `积分`)。
|
|
42
|
-
3. 工具会自动把后续行 append 到上一门课程的 `Episodes` 数组。
|
|
43
|
-
|
|
44
|
-
## 封面图来源策略
|
|
45
|
-
|
|
46
|
-
按以下优先级决定课程封面:
|
|
47
|
-
|
|
48
|
-
1. `封面图` 是 `http(s)://...` → 直接使用 URL。
|
|
49
|
-
2. `封面图` 是 `default` → 使用平台默认封面。
|
|
50
|
-
3. `封面图` 是本地图片路径(.jpg/.jpeg/.png/.gif/.bmp) → 上传 OSS 并使用返回的 URL。
|
|
51
|
-
4. `封面图` 是数字(秒数) + `素材文件` 是视频 + 系统有 ffmpeg → 从视频抽帧并上传。
|
|
52
|
-
5. `封面图` 留空 + `素材文件` 是视频 + 系统有 ffmpeg → 用 `--picture-time`(默认 6 秒)抽帧。
|
|
53
|
-
6. 以上都不满足 → 使用平台默认封面,并 emit `cover_fallback` 事件。
|
|
54
|
-
|
|
55
|
-
## 快速根据本地课件目录制作模板(Windows 示例)
|
|
56
|
-
|
|
57
|
-
> 来自原 createcourse 工具的工作流提示。
|
|
58
|
-
|
|
59
|
-
1. 打开 `cmd`,切到课件所在的最上层目录,例如 `cd d:\course`。
|
|
60
|
-
2. 把所有文件路径导出到文本文件:
|
|
61
|
-
```cmd
|
|
62
|
-
d:
|
|
63
|
-
cd course
|
|
64
|
-
dir /s /b /a:-d > filelist.txt
|
|
65
|
-
```
|
|
66
|
-
3. 打开空白 Excel,在「数据」选项卡选「从文本/CSV」导入 `filelist.txt`。
|
|
67
|
-
4. 对导入的数据列进行分列。
|
|
68
|
-
5. 根据实际存储情况合并单元格(同一课程的多节分集),补全课程学分、简介、封面图等信息。
|
|
69
|
-
|
|
70
|
-
## 模板示例
|
|
71
|
-
|
|
72
|
-
可参照仓库内随 createcourse 一起合入的两张样例图:
|
|
73
|
-
|
|
74
|
-
- `internal/courseimport/template_example.jpg`
|
|
75
|
-
- `internal/courseimport/template_example2.jpg`
|