【升级】一个中国历史可视化站:皇帝时间线梳理、古代思想流派、诗词鉴赏 (2)

在线体验(纯静态,打开即用): zinging.github.io/chinese-his...

源码(MIT):github.com/zinging/chi...

如果它对你有用,欢迎点个 Star支持我继续推进,也欢迎一起补充或修正内容。

一、它由三个并排的模块组成

学历史最容易出的问题是:年代表背了又忘,皇帝、思想家、诗人各记各的,脑子里全是散点。 所以这个站没有按"人物百科"来组织,而是拉了三条并行的线,让你看到同一个时代的三个侧面。

1. 帝王谱系 ------ 7 朝 77 位皇帝

隋、唐、五代、宋、元、明、清,一条横向卡片流贯穿。点开任意皇帝,是生平时间线、人物关系图、 冷知识和争议话题;地图上叠着各朝疆域轮廓、古地名点,以及靖难南下、郑和下西洋、清军入关这类 行军/航海路线的分段动画。悬案疑案按"名称由来 → 背景 → 人物 → 经过 → 结果 → 影响 → 开放讨论 → 史料出处"八段拆开,给的是推理链,不是"某某年发生某事"一句话。

2. 思想源流 ------ 儒、道、佛、诸子、理学、心学,27 部经典

儒(孔孟)、道(老庄)、佛(禅宗)、诸子(兵法 / 法家 / 墨家)、程朱理学、阳明心学。 这里刻意不做"金句摘抄",而是把经典放回作者当时的处境里读,再配辩证选择题。

3. 诗词鉴赏 ------ 22 位文人,按朝代编排

不做机械背诵。先看诗人一生的行迹地图,再读一首诗背后的处境。比如李白在江陵写 "轻舟已过万重山",是因为他刚接到大赦令------劫后余生,船才显得那么快。诗路舆图会标出 他们去过哪、在哪写下名句(还在开发中)。

二、总体架构:三个入口,一份数据层

三个模块对应三个 HTML 入口,但共用同一套约定和同一个 data/ 目录:

bash 复制代码
chinese-history-atlas/
├── data/                    # 知识层,全部是可读可改的 JSON
│   ├── sui/ tang/ wudai/ song/ yuan/ qing/
│   │   ├── emperors/        # 皇帝卡片:生平、时间线、人物、冷知识、争议
│   │   ├── cases/           # 悬案疑案
│   │   ├── places/ routes/  # 古地名(含今址、经纬度)、行军航海路线
│   │   └── quiz.json        # 该朝选择题
│   ├── quiz/quiz.json       # 明朝题库(其余朝代在各自目录)
│   ├── rujia/ daojia/ foxue/ zhuzi/ lixue/
│   │   └── index.json       # 儒/道/佛/诸子/理学心学,每个一个 index.json
│   ├── shiwen/index.json    # 诗词:22 位文人 + 13 个公案
│   ├── boundaries/          # 各朝疆域 GeoJSON
│   └── portraits/           # 工笔风头像
├── web/
│   ├── index.html           # 帝王谱系
│   ├── guoxue/index.html    # 思想源流
│   ├── guoxue/shici.html    # 诗词鉴赏
│   ├── app.js               # 帝王谱系主逻辑(约 2900 行原生 JS)
│   ├── search-core.js       # 跨页搜索
│   ├── vendor/leaflet.*     # Leaflet 1.9.4 本地化,不走 CDN
│   └── serve.mjs            # 200 多行的本地静态服务器(兼 LLM 代理)
└── web/tools/               # 题库生成 / 校验脚本

核心思路:代码只负责渲染,所有"知识"都在 JSON 里。

加一个皇帝、补一道题、改一处史料出处,都不用碰 JS,改数据文件即可;同一份数据还能被 校验脚本和 smoke 测试直接读。视图和知识彻底分开之后,内容的迭代速度比我预想的快得多。

三、设计思路

数据规模:

模块 内容
帝王谱系 7 朝 77 帝 · 381 道辩证题 · 545 条时间线
思想源流 6 大流派 · 27 部经典
诗词鉴赏 22 位文人 · 13 个诗词公案 · 行迹地图

381 道题是七个朝代题库加总的实数(隋 18 / 唐 71 / 五代 30 / 宋 91 / 元 33 / 明 78 / 清 60)。

选择题不是是非题,而是分两种认知动作。 一种 arg(论证判断:你如何评价这项政策), 一种 chain(因果链:此事因何发生、直接原因是什么);约四分之一标了 open,是没有唯一答案的 开放题。每条都带 why 解析,正确项位置打散,避免靠位置猜:

json 复制代码
{
  "mode": "arg",
  "open": true,
  "q": "有人说胡惟庸该死,也有人说朱元璋兔死狗烹,你怎么看?",
  "options": [
    { "t": "完全同意第一种,功臣就该死" },
    { "t": "完全同意第二种,他忘恩负义" },
    { "t": "需辩证看:胡确有专横,且相权威胁皇权;但株连数万、手段极端", "ok": true },
    { "t": "两种说法都对" }
  ],
  "why": "蓝玉等确有骄横,但朱元璋以严峻刑法借机大杀功臣,株连甚广,手段极端......"
}

演义和正史分开。 时间线和侦探线索都标《旧唐书》《宋史》《明史》这类出处; 凡是《三国演义》这类小说里的说法,单独标"小说演绎,正史不载",不让人把演义当正史读。 争议人物不替读者下结论,而是把多方观点和史料摆出来------比如隋末那段,杨广被洛阳小朝廷谥为 "世祖明皇帝",唐朝却给了一个恶谥"炀";当时长安、江都、洛阳还并立着杨侑、杨浩、杨侗三个 傀儡皇帝。这些都进了争议话题和题库,因为"谁赢了谁写历史"本身就是要学的东西。

地图是真的能查,不是贴图。 Leaflet 底图 + 手绘简化疆域 GeoJSON,古地名点带经纬度和今址对照 (点"睦州"会告诉你约等于今天浙江建德一带);路线按时间分段动画播放,而不是一张静态示意图。

AI 是可选的私教,且数据不出本机。 只有开放题可以接 AI 点评,接的是你自己填的 OpenAI 兼容接口(DeepSeek / OpenAI 都行)。配置存在本机 llm-config.json(已 gitignore), 问答经过本地小服务器转发,不上传任何第三方。 后面核心方向之一就是优化和扩展AI的交互和学习场景,大家有什么好的想法也能相互交流。

四、技术架构

技术栈:

  • 原生 HTML / CSS / JavaScript(ES Module),无框架、无打包、无 node_modules
  • 地图:Leaflet 1.9.4,css/js 全部下载到 web/vendor/ 本地引用,不依赖任何 CDN,断网能开
  • 数据:纯 JSON,前端 fetch 读取
  • 本地服务:一个 200 多行的 serve.mjs,只用 Node 内置模块(node:http / node:fs / node:zlib / node:crypto),顺带做 gzip
  • 校验:smoke.mjs / smoke-dynasties.mjs / smoke-geo.mjs 等脚本,每次改完数据跑一遍, 查缺字段、查地理坐标越界、查题库结构

这个项目的交互虽然多,但本质是"选一个对象 → 把对应 JSON 渲染成卡片/地图图层", 没有复杂的跨组件状态要管理,浏览器原生 DOM + 少量事件委托完全够用。去掉框架和构建链之后, 调试就是直接看源码、改完刷新,十年后翻出来也不会因为依赖装不上而跑不起来------对一个想长期维护的 知识型项目,这点比什么都重要。

唯一需要一个"后端"的地方是 AI:浏览器直连 LLM 会有 CORS 和 Key 暴露问题。所以 serve.mjs 顺手挂了三个接口,把 Key 留在本机、由服务端代理转发,并注入历史学习专用的系统提示词:

js 复制代码
// 仅用 Node 内置模块,没有任何第三方依赖
// GET  /api/llm-config   读取本机配置(不存在返回空对象)
// POST /api/llm-config   保存配置到 web/llm-config.json
// POST /api/llm/chat     代理调用 OpenAI 兼容接口,附带历史学习系统提示词
import { createServer } from 'node:http';
import { gzip } from 'node:zlib';

注意这个代理只在本地开发/自部署时用;部署到 GitHub Pages 时 AI 功能自动降级为不可用, 其余所有功能(卡片、地图、题库、疑案)照常------静态部分和可选服务是解耦的。

题库也不是手写 JSON 硬怼,而是 web/tools/ 下一批 Node 脚本生成 + 审计:quiz-lib.mjs 定义 题目结构和校验规则,_gen-tang.mjs / _gen-song.mjs / _gen-ming.mjs 等按朝代产出, 再用 audit 脚本查重、查正确项、查解析是否齐全。381 道题靠人工逐题维护迟早会烂,脚本化是必须的。

五、为什么要学历史

做这个项目的过程里,我越来越觉得历史不是一门"背过去"的学科。

你看朱元璋废丞相,不是为了记 1380 这个年份,而是能看到一个制度选择的代价:皇权空前集中, 皇帝直接统领六部,但也让后来的内阁和司礼监一步步长成新的权力中心。你读苏轼在黄州写的东西, 看到的不是一个被贬的官员在发牢骚,而是一个人被命运按到谷底之后,怎么重新把日子过宽。 权力怎么运转、制度怎么积弊、人在绝境里怎么自处------这些事过去发生过,现在也没什么不同。

思想那条线给人的东西更安静一点。儒讲人和人怎么相处,道讲人和自己、和天地怎么相处, 佛讲怎么面对无常,理学心学讲怎么在日常里"知行合一"。它们不是博物馆里的标本, 而是中国人遇到事的时候,脑子里会自动冒出来的那些反应。把这些源流理顺,某种程度上是在弄明白: 我今天看世界的方式,是怎么一步步被塑造出来的。

所以这个站不想替谁下结论。开放题没有标准答案,争议人物只把多方观点和史料摆出来, 最后那一下判断留给你自己。工具能做的,是把散点连成线、把演义和正史分开、把原文放回处境里------ 剩下的思考,得是你自己的。

如果它对你有用,欢迎点个 Star,也欢迎一起补内容。

相关推荐
暗夜行者之光1 小时前
LangGraph + MCP 实战:构建"自然语言查数据"的 ChatBI Agent
前端·后端
一tiao咸鱼2 小时前
还在手动海投?我做了个 AI 求职助手,自动筛选 BOSS 职位再精准投递
前端·后端·面试
尤水就下2 小时前
🔥预热:在线文档的 block 架构是如何实现的(未完待续...)
前端·javascript·架构
全栈项目管理程序猿2 小时前
ArcGIS JS 基础教程(29):CSVLayer 表格点位图层
前端·javascript
骑着蜗牛撵大象3272 小时前
豆包 Seed 驱动的记账智能体:从拍票抽取到月报生成的全链路落地记录
java·前端·javascript·结构化输出·豆包seed·多模态识别·记账系统
溪语流沙3 小时前
【Web全栈进阶】前端世界观:现代工具链与框架为什么存在
前端·javascript·vue.js
kyriewen3 小时前
我逐个测了 JSON.stringify 的 7 个坑:第 1 个就在丢数据
前端·javascript·程序员
积流成海3 小时前
用代码实现哈希计算器:Web Crypto API 实战
前端·算法·哈希算法·哈希函数·盘子工具站
data analyse 4563 小时前
服务端访问日志聚合 PV 与 UV 怎么实现?日志采集与口径设计
大数据·前端·数据分析