Skip to content

WindRiders/TimeMap


🗺️ TimeMap

下一代多维度历史知识引擎

让抽象的历史变得具体、人性化,让每一个人都能理解世界历史的脉络

设计目标功能特性架构快速开始贡献指南


📖 项目介绍

为什么做 TimeMap?

人类历史是一部宏大而复杂的叙事,但传统的学习方式往往是线性的、单一的、被动的。我们阅读教科书上的文字,记住年代和人名,却很难真正理解事件之间的关联、不同文明在同一时期的对比、以及地理空间对历史进程的深远影响。

更根本的问题是:历史往往由胜利者书写。官方正史不可避免地带有特定的视角和立场,许多边缘群体的故事、被忽视的事件、以及多元的解读视角都被淹没在时间长河中。我们希望借助开放协作的力量,让历史不再只有一种声音。

TimeMap 的使命是:将抽象的历史转化为可视化的、可交互的、多维度关联的知识网络,让学习者和研究者能够以全新的方式探索和理解人类文明的演进。

核心设计理念

1. 多维度对比与系统性理解

传统历史学习是"一条线"——按时间顺序阅读。但真实历史是"一张网"——同一时刻,罗马帝国在扩张,汉朝在开辟丝绸之路,玛雅文明在建造金字塔。这些并行发生的文明进程之间有着深刻的联系和令人惊讶的对比。

TimeMap 提供了时间、空间、事件、人物、话题五个维度的交叉探索:

  • 时间维度:在交互式时间轴上滑动,看到同时期世界各地的历史进程
  • 空间维度:在地图上定位历史事件,理解地理如何塑造文明的兴衰
  • 关系维度:通过知识图谱发现人物、事件、地点之间的深层关联
  • 叙事维度:遵循故事线穿越相互关联的历史事件,获得沉浸式体验
  • 对比维度:将不同文明的同期事件并排对比,发现模式和差异

2. 开放贡献,打破"胜利者书写历史"

历史不应当只有一种叙事。TimeMap 的核心机制是社区驱动的内容共建

  • 任何注册用户都可以提交内容变更请求(Change Request),包括新增人物、事件、地点、话题,或修正现有内容
  • 观点评论权限开放给所有用户,允许多元视角的讨论和碰撞
  • 所有变更经过社区审核流程(开放 → 审查 → 合并),确保质量的同时保持开放性
  • 弥补正史的局限:被官方叙事忽略的边缘群体故事、民间记忆、口述历史都可以被纳入知识图谱,让历史更加完整、多元

3. 将抽象的历史具体化、人性化

历史不只是年代和事件名称的堆砌。每一个历史事件背后都是活生生的人,每一个地名都承载着文明变迁的记忆。

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

🚀 快速开始

1. 克隆项目

git clone git@github.com:WindRiders/TimeMap.git
cd timemap
cp .env.example .env.local

2. 启动基础设施

docker-compose up -d

启动 PostgreSQL(含 PostGIS)和 Meilisearch。

3. 安装依赖 & 初始化数据

pnpm install
pnpm run db:migrate   # 执行数据库迁移
pnpm run db:seed      # 导入示例数据
pnpm run search:index # 构建 Meilisearch 索引

4. 启动开发服务器

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

About

TimeMap — 时空中的历史知识平台

Resources

License

Code of conduct

Contributing

Security policy

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors