feat: 新增软考高项时间轴数据骨架

This commit is contained in:
ittoview
2026-03-22 14:14:47 +00:00
parent 9b02e707fb
commit acaffa75e9
4 changed files with 961 additions and 0 deletions

View File

@@ -0,0 +1,879 @@
# 软考高项时间轴功能 - 需求与初设文档
## 文档信息
- **创建日期**: 2026-03-22
- **模块名称**: 软考高项时间轴 (Timeline)
- **当前阶段**: 第一阶段 - 数据 JSON 设计与整理
- **适用范围**: 软考高项教材中的时间类知识点整理、结构化存储与后续时间轴展示
---
## 1. 背景与目标
### 1.1 背景
当前项目已经形成较成熟的静态数据驱动模式,主要特征包括:
- 使用 `src/data/*.json` 维护结构化知识数据
- 使用 `src/types/*.ts``src/types/itto.ts` 维护类型定义
- 使用 `src/data/index.ts` 统一导出数据与查询能力
- 页面展示层基于结构化数据进行可视化学习与交互
在此基础上,计划增加一个新的学习功能:
> 将软考高项中的关键时间类知识点整理为统一 JSON 数据,并在后续以时间轴形式进行展示。
该能力本质上不是普通的“历史事件时间线”,而是:
> **按教材主题归类、按显式时间排序、保留原文可追溯性的知识点时间轴。**
---
### 1.2 第一阶段目标
第一阶段不以页面开发为重点,而是优先夯实数据基础,主要完成:
1. 明确时间轴节点的数据结构
2. 明确字段命名与语义边界
3. 明确时间标准化规则
4. 明确原文抽取规则
5. 形成首批可落库的 JSON 数据样例
第一阶段的核心交付物包括:
- 时间轴数据结构 V1
- 抽取规则 V1
- `timeline-items.json` 初始样例数据
- 供后续前端展示使用的数据基础
---
## 2. 设计原则
### 2.1 显式时间优先
时间轴的核心是“时间可排序”,因此每个节点必须存在明确的显式时间。
显式时间可以是:
- 年:如 `2035年`
- 年月:如 `2021年3月`
- 年月日:如 `2021年3月15日`
时间排序只能依赖显式时间,不依赖会议名称、政策名称或组织名称。
---
### 2.2 原文可追溯
每个节点必须保留教材原文摘录,用于:
- 回看原始语境
- 避免二次摘要失真
- 支持后续搜索与核对
- 提高复习时的可信度与可解释性
原文摘录必须尽量保真,不以转述替代原文。
---
### 2.3 主题稳定可归类
时间轴中的每个节点都必须归属于某个明确主题,用于:
- 按章节筛选
- 按知识域复习
- 后续主题聚合展示
主题应优先使用教材章节名、小节名或知识点标题,避免同类主题命名不一致。
---
### 2.4 来源与时间解耦
原先讨论中的“隐式时间”命名不够准确,因为这类信息不一定是时间,也可能是:
- 会议
- 文件
- 组织
- 人物
- 报告
- 规划
因此V1 中统一将该字段定义为:
> **来源锚点sourceAnchor**
它的作用是说明该节点“由谁提出、在哪里提出、依附于什么来源语境”,而不是承担排序功能。
---
## 3. 需求范围
### 3.1 纳入范围
第一阶段纳入时间轴整理范围的内容包括:
1. 教材中带有明确年份的战略目标、规划节点、发展目标
2. 教材中带有明确年月的政策、制度、会议、文件、重要部署
3. 教材中带有明确年月日的重要事件、发布动作、政策出台节点
4. 与明确显式时间强相关,且适合纳入时间轴展示的知识点原文
---
### 3.2 暂不纳入范围
以下内容第一阶段不进入主时间轴 JSON
1. 没有显式时间的纯概念性描述
2. 只有意义、路径、措施,但缺少明确时间锚点的句子
3. 只有会议/文件/组织来源,但原文中没有显式时间且暂不准备人工补全的内容
4. 需要复杂推理或联网核验后才能确认时间的内容
这类内容可在后续进入:
- 候选池
- 待补录列表
- 二阶段人工校验列表
---
## 4. 核心需求定义
### 4.1 节点必备字段
每条时间轴节点至少应包含以下 5 个要素:
#### 1显式时间
必须存在。
作用:
- 时间轴展示
- 统一排序
- 构建标准化排序键
---
#### 2时间精度
必须存在。
用于区分当前节点时间粒度:
- `year`
- `month`
- `day`
这样可以解决不同时间粒度混排的问题。
---
#### 3主题
必须存在。
用于说明该时间点归属的教材章节或知识主题。
例如:
- `农业现代化与乡村振兴战略`
- `科技创新`
- `数字中国`
- `新型基础设施`
---
#### 4原文摘录
必须存在,且必须是原文。
要求:
- 保留原教材表述
- 尽量保留最小完整语义片段
- 不以摘要替代原文
---
#### 5来源锚点
建议存在,可为空。
用于说明该内容的提出来源、语境来源或依附来源。
例如:
- `党的十九届五中全会`
- `国务院`
- `“十四五”规划`
- `某重要讲话`
该字段不参与排序,只承担来源说明作用。
---
### 4.2 排序需求
排序规则必须满足以下约束:
1. 仅基于显式时间排序
2. 支持年、年月、年月日混排
3. 不依赖来源锚点排序
4. 没有显式时间的记录不能进入主时间轴
---
### 4.3 检索需求
虽然第一阶段重点是数据整理,但字段设计需提前支持后续使用场景:
1. 按时间顺序浏览
2. 按主题筛选
3. 按来源锚点筛选
4. 按原文关键词搜索
5. 查看原文与教材定位信息
---
## 5. 术语定义
### 5.1 显式时间Explicit Time
指原文中明确写出的、可直接抽取的时间表达。
示例:
- `2035年`
- `2021年3月`
- `2021年3月15日`
显式时间是主时间轴排序的唯一依据。
---
### 5.2 来源锚点Source Anchor
指原文中说明该知识点“由谁提出、在哪提出、基于什么会议/文件/组织/人物”的来源信息。
示例:
- `党的十九届五中全会`
- `国务院`
- `“十四五”规划`
- `政府工作报告`
说明:
- 该字段不是时间字段
- 该字段不参与排序
- 该字段主要用于补充上下文和来源语境
---
### 5.3 主题Theme
指该节点归属的教材章节、小节或知识点主题,用于分类和筛选。
---
### 5.4 原文摘录Excerpt
指直接来自教材或整理材料中的原文片段,用于支撑该时间点。
---
## 6. 数据结构设计 V1
### 6.1 TypeScript 类型定义建议
建议新增时间轴类型定义,推荐单独创建文件:
- `src/types/timeline.ts`
类型建议如下:
```ts
export type TimelineTimePrecision = 'year' | 'month' | 'day';
export type SourceAnchorType =
| 'meeting'
| 'document'
| 'organization'
| 'person'
| 'policy'
| 'report'
| 'other';
export interface TimelineItem {
id: string;
// 显式时间原文,用于展示
timeText: string;
// 排序键,用于统一排序
sortKey: string;
// 时间精度:年 / 月 / 日
timePrecision: TimelineTimePrecision;
// 主题,通常对应章节或知识点
theme: string;
// 原文摘录,必须保留原文
excerpt: string;
// 来源锚点,可为空
sourceAnchor?: string;
// 来源锚点类型,可为空
sourceAnchorType?: SourceAnchorType;
// 可选:原文在教材中的定位信息
sourcePosition?: string;
}
```
---
### 6.2 字段说明
| 字段名 | 必填 | 说明 |
|---|---|---|
| `id` | 是 | 唯一标识,建议使用稳定编号 |
| `timeText` | 是 | 原文中的显式时间表达 |
| `sortKey` | 是 | 用于排序的标准化值 |
| `timePrecision` | 是 | 时间粒度:年 / 月 / 日 |
| `theme` | 是 | 所属主题或章节 |
| `excerpt` | 是 | 原文摘录 |
| `sourceAnchor` | 否 | 来源锚点 |
| `sourceAnchorType` | 否 | 来源锚点类型 |
| `sourcePosition` | 否 | 教材定位,如章节、页码、小节 |
---
### 6.3 命名设计说明
#### 为什么不用 `implicitTime`
因为这个字段并不稳定指向“时间”,它更多时候表示的是:
- 提出来源
- 会议名称
- 文件名称
- 组织主体
- 人物主体
如果继续命名为 `implicitTime`,会误导后续开发和数据维护。
---
#### 为什么推荐 `sourceAnchor`
因为它更准确表达了这个字段的职责:
- 是一个“来源锚点”
- 是知识点的出处说明
- 是原文上下文的承载信息
- 不参与时间排序
---
## 7. JSON 文件组织方案
### 7.1 第一阶段文件建议
结合当前项目结构,建议新增:
```bash
src/data/timeline-items.json
```
采用与现有数据一致的静态 JSON 管理方式。
---
### 7.2 JSON 结构建议
建议采用统一外层包装结构:
```json
{
"timelineItems": [
{
"id": "TL001",
"timeText": "2035年",
"sortKey": "20350000",
"timePrecision": "year",
"theme": "农业现代化与乡村振兴战略",
"excerpt": "党的十九届五中全会着眼2035年基本实现社会主义现代化提出“关键核心技术实现重大突破进入创新型国家前列”的远景目标。",
"sourceAnchor": "党的十九届五中全会",
"sourceAnchorType": "meeting",
"sourcePosition": "第X章 第X节"
}
]
}
```
说明:
- `timelineItems` 命名与当前项目数据文件组织方式保持一致
- 后续若数据规模扩大,可再考虑按主题拆分多个 JSON 文件
---
## 8. 时间标准化规则
为了实现稳定排序,需要将时间文本转为标准化排序键 `sortKey`
### 8.1 标准化规则
#### 年
- 原文:`2035年`
- `timePrecision`: `year`
- `sortKey`: `20350000`
#### 年月
- 原文:`2021年3月`
- `timePrecision`: `month`
- `sortKey`: `20210300`
#### 年月日
- 原文:`2021年3月15日`
- `timePrecision`: `day`
- `sortKey`: `20210315`
---
### 8.2 字段设计建议
- `sortKey` 建议统一保存为字符串
- 长度固定为 8 位
- 年月不足位使用 `00` 补齐
这样可以减少:
- 数字前导零问题
- 字符串排序与数值排序不一致问题
- 前端处理时的格式分支
---
### 8.3 时间合法性要求
正式数据应满足以下约束:
1. 年份必须为四位数
2. 月份必须在 `01-12`
3. 日期必须在 `01-31`
4. 非法时间不得进入正式时间轴 JSON
---
### 8.4 标题锚点与目标锚点的区分说明
在时间标准化前,应先判断当前原文中的时间究竟属于哪一类:
#### 1提出时间锚点
用于表示某项政策、规划、文件、会议“在何时提出”。
例如:
- `《中华人民共和国国民经济和社会发展第十四个五年规划和2035年远景目标纲要》明确提出了推进产业数字化转型……`
这类句子的时间轴挂载时间,应优先取:
- 该纲要所属年份 `2021年`
- 或进一步精确到 `2021年3月`
#### 2目标实现锚点
用于表示某项目标“到何时实现”。
例如:
- `到2035年基本实现社会主义现代化`
这类句子的时间轴挂载时间,才应直接取:
- `2035年`
因此,时间抽取不能只看句子里出现了哪个年份,还要判断该年份在语义上属于:
- **提出时间**
- 还是 **目标时间**
---
## 9. 数据抽取规则 V1
### 9.1 总体规则
#### 规则 1没有显式时间不入主时间轴
主时间轴只接收可明确排序的节点。
若仅有来源锚点而没有显式时间,则先不纳入主时间轴数据。
---
#### 规则 2一段原文出现多个显式时间应拆为多个节点
例如同一段中出现:
- `2020年`
- `2035年`
- `本世纪中叶`
若均可确定为可排序时间点,则应拆分成多条时间轴记录。
---
#### 规则 3多个节点可共用同一段原文摘录
拆分后的多条节点可以共用:
- `theme`
- `excerpt`
- `sourceAnchor`
- `sourcePosition`
但必须拥有独立的:
- `timeText`
- `sortKey`
- `timePrecision`
- `id`
---
#### 规则 4来源锚点不参与排序
来源锚点的职责是提供语义补充,不承担排序责任。
---
#### 规则 5原文摘录必须尽量保真
要求:
- 不得用改写内容替代原文
- 允许适度截取,但应保留完整语义
- 以“能支撑该时间点成立的最小完整片段”为宜
#### 规则 5.1:若原始素材来自 OCR必须先校对再入库
这里需要明确区分:
- **教材标准原文**
- **OCR 识别结果**
时间轴中的 `excerpt` 字段应保存:
- **校对后的规范原文**
而不是未经处理的 OCR 脏文本。
处理原则如下:
1. 对于明显 OCR 错字,应直接人工校正后再入库,例如:
- `深人``深入`
- `进人``进入`
2. 对于不确定是否识别错误的字句,不应主观猜测,应回到教材、原始资料或权威来源核对后再录入
3. 若当前只能拿到 OCR 文本而无法完成核对,则该条数据应暂缓正式入库,避免错误内容污染主数据集
这样做的目的是:
- 保证 `excerpt` 可作为后续检索与复习依据
- 避免把 OCR 噪声误当作教材原文长期沉淀
- 提高数据质量,减少后续返工成本
#### 规则 5.2`excerpt` 字段的入库边界
`excerpt` 字段的处理必须遵循以下边界:
1. **保留原文句式**
2. **只修明显 OCR 错字**
3. **不擅自改写、不总结、不替换原句**
4. **如果怀疑句子不通顺,但又不能确定是 OCR 错误,必须先询问或标记,不得直接改写后入库**
也就是说,`excerpt` 的职责是:
- 保留知识点在原始材料中的表达方式
- 为后续查找、比对、复习提供可信原句
而不是:
- 由系统进行润色
- 改写成更通顺的表述
- 用摘要句替代原文
该规则用于确保时间轴数据既可追溯,又不会因为主观改写而偏离原始材料。
#### 规则 6文件名或规划名中同时出现规划期远景目标年优先取提出时间
这是时间轴抽取中的高频易错点。
例如:
- `《中华人民共和国国民经济和社会发展第十四个五年规划和2035年远景目标纲要》`
该类名称中可能同时包含:
- 规划期信息,如“第十四个五年规划”
- 远景目标信息如“2035年远景目标”
若原文语义是:
- `某规划明确提出……`
- `某纲要提出……`
- `某文件要求……`
那么时间轴节点应优先挂载为:
- **该规划/文件的提出时间、发布年份或所属规划起始年份**
而不应直接挂载到远景目标年份。
也就是说,需要区分:
1. **提出时间**:指该政策、规划、文件、纲要被提出、发布或实施启动的时间
2. **目标时间**:指原文明确表达“到某年实现某目标”的目标年份
只有当原文语义明确指向“到2035年实现……”时才应将 `2035年` 作为该节点的显式时间。
若原文只是说:
- `《……2035年远景目标纲要》明确提出……`
则更适合将该节点时间挂到:
- `2021年`(按该纲要所属年份归类)
- 或在资料足够精确时挂到 `2021年3月`(按正式通过/发布节点归类)
此规则的核心目的是:
- 避免将文件标题中的“远景目标年份”误当作当前知识点的发生时间
- 保证时间轴表达的是“提出/发布时间”与“目标实现时间”的真实差异
---
### 9.2 主题提取规则
主题提取建议遵循以下优先级:
1. 当前教材章节标题
2. 当前小节标题
3. 当前知识点标题
4. 无法直接归类时人工指定统一主题名
注意:
- 同类主题应统一命名
- 不应同一主题出现多个近义版本
例如不建议同时出现:
- `农业现代化`
- `农业现代化与乡村振兴`
- `乡村振兴战略`
若其本质上属于同一章节主题,应统一。
---
### 9.3 来源锚点提取规则
来源锚点优先抽取原文中最直接、最核心的来源表达。
优先级建议如下:
1. 会议名称
2. 文件/规划名称
3. 组织名称
4. 人物名称
5. 其他来源描述
若原文中存在多个来源锚点V1 可先只保留一个最核心锚点。
---
## 10. 样例数据
以下为基于当前讨论生成的样例节点:
```json
{
"id": "TL001",
"timeText": "2035年",
"sortKey": "20350000",
"timePrecision": "year",
"theme": "农业现代化与乡村振兴战略",
"excerpt": "党的十九届五中全会着眼2035年基本实现社会主义现代化提出“关键核心技术实现重大突破进入创新型国家前列”的远景目标。",
"sourceAnchor": "党的十九届五中全会",
"sourceAnchorType": "meeting"
}
```
---
## 11. 与现有项目架构的对齐方案
### 11.1 数据层
新增时间轴 JSON 文件:
```bash
src/data/timeline-items.json
```
与当前项目的数据组织方式保持一致。
---
### 11.2 类型层
建议新增文件:
```bash
src/types/timeline.ts
```
原因:
- 避免 `src/types/itto.ts` 职责继续膨胀
- 便于后续扩展时间轴相关类型
- 降低不同业务域之间的耦合
如果项目当前更偏向集中维护类型,也可以先临时放在 `src/types/itto.ts`,但从中长期维护上看,独立文件更合理。
---
### 11.3 数据统一导出
后续建议在 `src/data/index.ts` 中增加:
```ts
import timelineItemsData from './timeline-items.json';
import type { TimelineItem } from '../types/timeline';
export const timelineItems: TimelineItem[] =
timelineItemsData.timelineItems as TimelineItem[];
```
后续如有需要,可继续扩展:
- 按主题分组索引
- 按来源锚点分组索引
- 时间排序工具函数
- 时间区间筛选工具函数
---
## 12. 第一阶段实施边界
### 12.1 本阶段要完成
1. 明确字段定义
2. 明确抽取规则
3. 建立时间标准化规范
4. 建立首批时间轴 JSON 数据
5. 准备后续页面开发所需的数据基础
---
### 12.2 本阶段暂不处理
1. 自动 NLP 抽取
2. 自动时间纠错
3. 复杂时间表达解析
4. 时间轴页面 UI
5. 多条件高级检索面板
6. 时间轴与其他知识图谱的联动展示
---
## 13. 风险与注意事项
### 13.1 时间与来源混淆风险
这是当前模块最容易出错的点。
必须明确:
- 显式时间负责排序
- 来源锚点负责说明出处
- 两者不能混用
---
### 13.2 主题命名不统一风险
若主题命名粒度不统一,后续筛选与聚合会出现严重碎片化。
建议尽早制定主题命名规范,并优先以教材目录层级为准。
---
### 13.3 原文过长风险
原文摘录必须保留,但如果过长,会影响后续展示体验。
建议数据层保留完整有效片段,展示层再决定是否截断。
---
### 13.4 JSON 维护成本风险
第一阶段采用人工整理 JSON 的方式,优点是可控、准确;缺点是维护成本较高。
因此应尽早明确:
- 字段规范
- 抽取规则
- 主题命名规范
- 时间标准化规则
这样才能降低后续补录和返工成本。
---
## 14. 后续演进建议
在第一阶段数据稳定后,后续可逐步演进:
1. 时间轴浏览页面
2. 按主题筛选
3. 按来源锚点筛选
4. 原文搜索
5. 节点详情弹层
6. 同主题聚合展示
7. 与章节知识点页面联动
8. 导出 JSON / CSV
---
## 15. 当前推荐结论
第一阶段推荐采用如下最小可行数据结构:
```ts
export interface TimelineItem {
id: string;
timeText: string;
sortKey: string;
timePrecision: 'year' | 'month' | 'day';
theme: string;
excerpt: string;
sourceAnchor?: string;
sourceAnchorType?: 'meeting' | 'document' | 'organization' | 'person' | 'policy' | 'report' | 'other';
sourcePosition?: string;
}
```
该结构已经足以支撑:
- 时间排序
- 主题归类
- 原文追溯
- 来源说明
同时也为第二阶段页面开发预留了足够扩展空间。

View File

@@ -9,6 +9,7 @@ import processesData from './processes.json';
import artifactsData from './artifacts.json'; import artifactsData from './artifacts.json';
import toolsData from './tools.json'; import toolsData from './tools.json';
import changelogData from './changelog.json'; import changelogData from './changelog.json';
import timelineItemsData from './timeline-items.json';
import type { import type {
KnowledgeArea, KnowledgeArea,
@@ -21,6 +22,7 @@ import type {
ProcessRef, ProcessRef,
ProcessEntityUse, ProcessEntityUse,
} from '../types/itto'; } from '../types/itto';
import type { TimelineItem } from '../types/timeline';
// 导出原始数据 // 导出原始数据
export const knowledgeAreas: KnowledgeArea[] = knowledgeAreasData.knowledgeAreas as KnowledgeArea[]; export const knowledgeAreas: KnowledgeArea[] = knowledgeAreasData.knowledgeAreas as KnowledgeArea[];
@@ -32,6 +34,10 @@ export const changelogEntries: ChangelogEntry[] = [
...(changelogData.changelogEntries as ChangelogEntry[]), ...(changelogData.changelogEntries as ChangelogEntry[]),
].sort((a, b) => b.date.localeCompare(a.date)); ].sort((a, b) => b.date.localeCompare(a.date));
export const timelineItems: TimelineItem[] = [
...(timelineItemsData.timelineItems as TimelineItem[]),
].sort((a, b) => a.sortKey.localeCompare(b.sortKey));
// 创建查找映射表 // 创建查找映射表
export const knowledgeAreaMap = new Map<string, KnowledgeArea>( export const knowledgeAreaMap = new Map<string, KnowledgeArea>(
knowledgeAreas.map(ka => [ka.id, ka]) knowledgeAreas.map(ka => [ka.id, ka])
@@ -53,6 +59,18 @@ export const toolMap = new Map<string, ToolTechnique>(
tools.map(t => [t.id, t]) tools.map(t => [t.id, t])
); );
export const timelineItemMap = new Map<string, TimelineItem>(
timelineItems.map(item => [item.id, item])
);
export const timelineItemsByTheme = new Map<string, TimelineItem[]>();
[...new Set(timelineItems.map(item => item.theme))].forEach(theme => {
timelineItemsByTheme.set(
theme,
timelineItems.filter(item => item.theme === theme)
);
});
// 按知识领域分组的过程 // 按知识领域分组的过程
export const processesByKnowledgeArea = new Map<string, Process[]>(); export const processesByKnowledgeArea = new Map<string, Process[]>();
knowledgeAreas.forEach(ka => { knowledgeAreas.forEach(ka => {

View File

@@ -0,0 +1,34 @@
{
"timelineItems": [
{
"id": "TL001",
"timeText": "2020年",
"sortKey": "20200000",
"timePrecision": "year",
"theme": "农业现代化与乡村振兴战略",
"excerpt": "党的十九届五中全会着眼2035年基本实现社会主义现代化提出“关键核心技术实现重大突破进入创新型国家前列”的远景目标。",
"sourceAnchor": "党的十九届五中全会",
"sourceAnchorType": "meeting"
},
{
"id": "TL002",
"timeText": "2021年",
"sortKey": "20210000",
"timePrecision": "year",
"theme": "产业数字化转型",
"excerpt": "《中华人民共和国国民经济和社会发展第十四个五年规划和2035年远景目标纲要》明确提出了推进产业数字化转型实施“上云用数赋智”行动推动数据赋能全产业链协同转型。",
"sourceAnchor": "《中华人民共和国国民经济和社会发展第十四个五年规划和2035年远景目标纲要》",
"sourceAnchorType": "document"
},
{
"id": "TL003",
"timeText": "2021年12月",
"sortKey": "20211200",
"timePrecision": "month",
"theme": "数字政府",
"excerpt": "《“十四五”国家信息化规划》中提出打造协同高效的数字政府服务体系,深入坚持整体集约建设数字政府。",
"sourceAnchor": "《“十四五”国家信息化规划》",
"sourceAnchorType": "document"
}
]
}

30
src/types/timeline.ts Normal file
View File

@@ -0,0 +1,30 @@
/**
* 时间轴数据类型定义
* 用于软考高项时间类知识点的结构化存储与展示
*/
// 时间精度
export type TimelineTimePrecision = 'year' | 'month' | 'day';
// 来源锚点类型
export type SourceAnchorType =
| 'meeting' // 会议
| 'document' // 文件
| 'organization' // 组织
| 'person' // 人物
| 'policy' // 政策
| 'report' // 报告
| 'other'; // 其他
// 时间轴节点
export interface TimelineItem {
id: string; // 唯一标识,如 TL001
timeText: string; // 原文中的显式时间如“2035年”
sortKey: string; // 排序键如“20350000”
timePrecision: TimelineTimePrecision; // 时间精度:年/月/日
theme: string; // 所属主题/章节
excerpt: string; // 原文摘录
sourceAnchor?: string; // 来源锚点,如“党的十九届五中全会”
sourceAnchorType?: SourceAnchorType; // 来源锚点类型
sourcePosition?: string; // 教材定位信息如“第3章 第2节”
}