人类历史是一部宏大而复杂的叙事,但传统的学习方式往往是线性的、单一的、被动的。我们阅读教科书上的文字,记住年代和人名,却很难真正理解事件之间的关联、不同文明在同一时期的对比、以及地理空间对历史进程的深远影响。
更根本的问题是:历史往往由胜利者书写。官方正史不可避免地带有特定的视角和立场,许多边缘群体的故事、被忽视的事件、以及多元的解读视角都被淹没在时间长河中。我们希望借助开放协作的力量,让历史不再只有一种声音。
TimeMap 的使命是:将抽象的历史转化为可视化的、可交互的、多维度关联的知识网络,让学习者和研究者能够以全新的方式探索和理解人类文明的演进。
传统历史学习是"一条线"——按时间顺序阅读。但真实历史是"一张网"——同一时刻,罗马帝国在扩张,汉朝在开辟丝绸之路,玛雅文明在建造金字塔。这些并行发生的文明进程之间有着深刻的联系和令人惊讶的对比。
TimeMap 提供了时间、空间、事件、人物、话题五个维度的交叉探索:
- 时间维度:在交互式时间轴上滑动,看到同时期世界各地的历史进程
- 空间维度:在地图上定位历史事件,理解地理如何塑造文明的兴衰
- 关系维度:通过知识图谱发现人物、事件、地点之间的深层关联
- 叙事维度:遵循故事线穿越相互关联的历史事件,获得沉浸式体验
- 对比维度:将不同文明的同期事件并排对比,发现模式和差异
历史不应当只有一种叙事。TimeMap 的核心机制是社区驱动的内容共建:
- 任何注册用户都可以提交内容变更请求(Change Request),包括新增人物、事件、地点、话题,或修正现有内容
- 观点评论权限开放给所有用户,允许多元视角的讨论和碰撞
- 所有变更经过社区审核流程(开放 → 审查 → 合并),确保质量的同时保持开放性
- 弥补正史的局限:被官方叙事忽略的边缘群体故事、民间记忆、口述历史都可以被纳入知识图谱,让历史更加完整、多元
历史不只是年代和事件名称的堆砌。每一个历史事件背后都是活生生的人,每一个地名都承载着文明变迁的记忆。
TimeMap 将抽象的历史转化为:
- 可视化的地图:在真实的地理空间中查看历史事件的发生位置,理解地缘政治格局
- 交互式知识图谱:点击一个人物,看到他的所有关系——师从谁、影响了谁、参与了哪些事件
- AI 驱动的叙事:DeepSeek AI 自动生成故事化的历史叙述,将枯燥的事实变成生动的故事
- 人物图谱:每个历史人物不再是孤立的名字,而是关系网络中的一个节点,有师承、有交往、有传承
TimeMap 不仅是一个内容平台,也是一个全栈工程实践项目,展示了现代 Web 开发的最佳实践:
- Monorepo 架构:pnpm workspace + Turborepo 管理多包项目,清晰的模块边界
- SSR 安全:Next.js 16 App Router 下正确处理服务端渲染与浏览器 API 的边界
- 批量查询优化:N+1 查询问题通过
inArray批量查询 + Map 索引优化为 O(1) 查找 - 混合搜索:Meilisearch 全文搜索 + PostgreSQL ILIKE 降级,确保搜索服务高可用
- TypeScript 全量覆盖:零类型错误,严格模式下的类型安全实践
- 国际化:next-intl 实现中英文双语支持,
[locale]动态路由 - 开源规范:完善的 Issue 模板、PR 模板、行为准则、安全策略
- 交互式时间轴 — 在时间维度上探索历史事件的演进
- 地理空间地图 — 基于 MapLibre GL 的历史事件可视化
- 知识图谱 — 基于 Cytoscape 的人物、事件、地点关系网络
- 叙事路径 — 故事驱动的历史旅程,AI 自动生成叙述
- 全文搜索 — Meilisearch 驱动的跨实体快速检索(带 DB 降级)
- AI 内容生成 — DeepSeek AI 辅助内容创作、叙事和推荐
- 国际化 — 内置中文(zh)和英文(en)支持
- 社区共建 — 开放的内容变更请求(CR)工作流,支持多元视角
┌─────────────────────────────────────────┐
│ apps/web │
│ Next.js 16 • React 19 • Tailwind CSS │
│ ┌──────────┐ ┌────────┐ ┌───────────┐ │
│ │ Timeline │ │ Map │ │ Graph │ │
│ │ (D3) │ │(MapLibre)│ │(Cytoscape)│ │
│ └──────────┘ └────────┘ └───────────┘ │
│ │ Search API │ │
│ │ (Meilisearch) │
└──────────────┼──────────────────────────┘
│
┌──────────┼──────────┐
│ │ │
┌───▼───┐ ┌───▼───┐ ┌───▼────┐
│PostgreSQL│ │Meili- │ │ NextAuth│
│(PostGIS) │ │search │ │(GitHub) │
└─────────┘ └───────┘ └────────┘
| 层级 | 技术 |
|---|---|
| 前端 | Next.js 16 (App Router), React 19, Tailwind CSS v4 |
| 数据库 | PostgreSQL + PostGIS, Drizzle ORM |
| 搜索 | Meilisearch v1.7 |
| 认证 | NextAuth v5 (GitHub OAuth) |
| 国际化 | next-intl |
| Monorepo | Turborepo, pnpm workspaces |
| 部署 | Railway / Docker |
git clone git@github.com:WindRiders/TimeMap.git
cd timemap
cp .env.example .env.localdocker-compose up -d启动 PostgreSQL(含 PostGIS)和 Meilisearch。
pnpm install
pnpm run db:migrate # 执行数据库迁移
pnpm run db:seed # 导入示例数据
pnpm run search:index # 构建 Meilisearch 索引pnpm run dev打开 http://localhost:3478 开始探索。
pnpm run lint # ESLint
pnpm run check-types # TypeScript 类型检查
pnpm run search:index # 重建 Meilisearch 索引
pnpm run test # Vitest 测试套件详见 CONTRIBUTING.md。
MIT — 详见 LICENSE