README.md 4.0 KB
Newer Older
M
Mars Liu 已提交
1
# skill_tree_oceanbase
M
Mars Liu 已提交
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18

## 初始化

```
pip install -r requirement.txt
```


## 目录结构说明

* 技能树`骨架文件`
    * 位置:`data/tree.json` 
    * 说明:该文件是执行 `python main.py` 生成的,请勿人工编辑
* 技能树`根节点`配置文件:
    * 位置:`data/config.json`
    * 说明:可编辑配置关键词等字段,其中 `node_id` 字段是生成的,请勿编辑
* 技能树`难度节点`
M
Mars Liu 已提交
19
    * 位置:`data/xxx`,例如: `data/1.Oceanbase初阶`
M
Mars Liu 已提交
20 21 22 23
    * 说明:
        * 每个技能树有 3 个等级,目录前的序号是必要的,用来保持文件夹目录的顺序
        * 每个目录下有一个 `config.json` 可配置关键词信息,其中 `node_id` 字段是生成的,请勿编辑
* 技能树`章节点`
M
Mars Liu 已提交
24
    * 位置:`data/xxx/xxx`,例如:`data/1.OceanBase初阶/1.快速入门`
M
Mars Liu 已提交
25 26 27 28
    * 说明:
        * 每个技能树的每个难度等级有 n 个章节,目录前的序号是必要的,用来保持文件夹目录的顺序
        * 每个目录下有一个 `config.json` 可配置关键词信息,其中 `node_id` 字段是生成的,请勿编辑
* 技能树`知识节点`
M
Mars Liu 已提交
29
    * 位置:`data/xxx/xxx/xxx`,例如:`data/1.OceanBase初阶/1.快速入门/1.安装OBD`
M
Mars Liu 已提交
30 31 32 33 34 35 36 37 38 39 40
    * 说明:
        * 每个技能树的每章有 `n` 个知识节点,目录前的序号是必要的,用来保持文件夹目录的顺序
        * 每个目录下有一个 `config.json`
            * 其中 `node_id` 字段是生成的,请勿编辑
            * 其中 `keywords` 可配置关键字字段
            * 其中 `children` 可配置该`知识节点`下的子树结构信息,参考后面描述
            * 其中 `export` 可配置该`知识节点`下的导出习题信息,参考后面描述


## `知识节点` 子树信息结构

M
Mars Liu 已提交
41
例如 `data/1.OceanBase初阶/7.查询数据/config.json` 里配置对该知识节点子树信息结构:
M
Mars Liu 已提交
42 43 44 45 46 47 48 49 50 51 52 53 54
```json
    // ...

    "children": [
        // TODO ...
    ],
}
```



## `知识节点` 的导出习题编辑

M
Mars Liu 已提交
55
例如 `data/1.OceanBase初阶/7.查询数据/config.json` 里配置对该知识节点导出的习题
M
Mars Liu 已提交
56 57 58 59 60

```json
{
    // ...
    "export": [
M
Mars Liu 已提交
61
        "hello.json"
M
Mars Liu 已提交
62 63 64 65
    ]
}
```

M
Mars Liu 已提交
66
每个文件名,指向对应的习题定义 json 。
M
Mars Liu 已提交
67 68 69

## `知识节点` 的导出习题选项配置编辑

M
Mars Liu 已提交
70
首先,我们添加前文中 export 指定的习题配置,例如在 `data/1.OceanBase初阶/7.查询数据` 下增加一个`hello.json`代码:
M
Mars Liu 已提交
71

M
Mars Liu 已提交
72 73 74 75
```json
{
    "type": "code_options",
    "author": "刘鑫",
M
Mars Liu 已提交
76
    "source": "hello.md",
M
Mars Liu 已提交
77 78 79 80 81 82 83 84 85 86
    "exercise_id":"1190bb7834904da0b1f20915960714d5",
    "notebook_enable": true
}
```
其中 type 字段目前都固定是 `code_options`。exercise_id 可以不写,处理程序会自动填补这个数据。根据具体情况写好其它字段,注意这里 source 的文件名,我们指定了一个 markdwon 文件。现在我们新建一个 HelloWorld.md 并编辑为:

````markdown
# Hello World


M
Mars Liu 已提交
87
以下 `Hello World` 程序中,能够正确输出`hello`的是:
M
Mars Liu 已提交
88 89 90

## 答案

M
Mars Liu 已提交
91
```sql
M
Mars Liu 已提交
92

M
Mars Liu 已提交
93
select 'hello';
M
Mars Liu 已提交
94 95 96 97 98 99
```

## 选项

### A

M
Mars Liu 已提交
100 101
```sql
print 'hello';
M
Mars Liu 已提交
102 103 104 105
```

### B

M
Mars Liu 已提交
106 107
```sql
echo 'hello';
M
Mars Liu 已提交
108 109 110 111
```

### C

M
Mars Liu 已提交
112 113
```sql
log 'hello';
M
Mars Liu 已提交
114 115 116 117
```

````

M
Mars Liu 已提交
118
这是一个最基本的习题结构,它包含标题、答案、选项,注意这几个一级和二级标题必须填写正确,解释器会读取这几个标题。而选项的标题会被直接忽略掉,在最终生成的习题中不包含选项的三级标题,所以这个标题可以用来标注一些编辑信息,例如“此选项没有关闭文件连接”,“类型错误”等等。
M
Mars Liu 已提交
119 120 121 122 123 124 125


## 技能树合成

`src`目录下执行 `python main.py -a tree` 会合成技能树文件,合成的技能树文件: `data/tree.json`
* 合成过程中,会自动检查每个目录下 `config.json` 里的 `node_id` 是否存在,不存在则生成
* 合成过程中,会自动检查每个知识点目录下 `config.json` 里的 `export` 里导出的习题配置,检查是否存在`exercise_id` 字段,如果不存在则生成