diff --git a/docs/软考高项时间轴-需求与初设.md b/docs/软考高项时间轴-需求与初设.md new file mode 100644 index 0000000..710a056 --- /dev/null +++ b/docs/软考高项时间轴-需求与初设.md @@ -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; +} +``` + +该结构已经足以支撑: + +- 时间排序 +- 主题归类 +- 原文追溯 +- 来源说明 + +同时也为第二阶段页面开发预留了足够扩展空间。 diff --git a/src/data/index.ts b/src/data/index.ts index 77a2c17..9a92a1a 100644 --- a/src/data/index.ts +++ b/src/data/index.ts @@ -9,6 +9,7 @@ import processesData from './processes.json'; import artifactsData from './artifacts.json'; import toolsData from './tools.json'; import changelogData from './changelog.json'; +import timelineItemsData from './timeline-items.json'; import type { KnowledgeArea, @@ -21,6 +22,7 @@ import type { ProcessRef, ProcessEntityUse, } from '../types/itto'; +import type { TimelineItem } from '../types/timeline'; // 导出原始数据 export const knowledgeAreas: KnowledgeArea[] = knowledgeAreasData.knowledgeAreas as KnowledgeArea[]; @@ -32,6 +34,10 @@ export const changelogEntries: ChangelogEntry[] = [ ...(changelogData.changelogEntries as ChangelogEntry[]), ].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( knowledgeAreas.map(ka => [ka.id, ka]) @@ -53,6 +59,18 @@ export const toolMap = new Map( tools.map(t => [t.id, t]) ); +export const timelineItemMap = new Map( + timelineItems.map(item => [item.id, item]) +); + +export const timelineItemsByTheme = new Map(); +[...new Set(timelineItems.map(item => item.theme))].forEach(theme => { + timelineItemsByTheme.set( + theme, + timelineItems.filter(item => item.theme === theme) + ); +}); + // 按知识领域分组的过程 export const processesByKnowledgeArea = new Map(); knowledgeAreas.forEach(ka => { diff --git a/src/data/timeline-items.json b/src/data/timeline-items.json new file mode 100644 index 0000000..ec7df2e --- /dev/null +++ b/src/data/timeline-items.json @@ -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" + } + ] +} diff --git a/src/types/timeline.ts b/src/types/timeline.ts new file mode 100644 index 0000000..3fed3f2 --- /dev/null +++ b/src/types/timeline.ts @@ -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节” +}