为什么做这个
走过的路大多散在相册、聊天记录和记忆里。想找一个“那年去过的那家店”, 往往只剩下模糊的印象。市面上的地图打卡要么把数据锁在平台账号里, 要么只能生成一张发完就忘的图片 —— 都不太像自己的东西。
于是干脆自己做一张。数据是自己的一个 JSON 文件,页面是一个静态站点, 想加就加,想改就改,服务器上不存任何东西。
做成了什么
- 公共点位 236 个 —— 按兴趣分成景点、好玩、吃的三类,点开有简介和位置。
- 个人点位 26 个 —— 自己的记录,默认私密,只有输入口令才解得开。
- 时间跨度 2000 年到 2026 年 —— 从最早的移动轨迹到最近一次出门,都按时间线排着。
- 一处地图,两层视图 —— 打开是公开地图,解锁后才看得到自己的部分。
技术上做的几个取舍
- 完全静态 —— 没有后端、没有数据库。整站就是 HTML + CSS + JS 加一份 JSON, 扔在任何静态托管上都能跑,也就不存在“服务停了数据就没了”。
- 私密点单独加密 —— 个人点位在写入前就用 AES-256-GCM 加密, 密钥由口令经 PBKDF2-SHA256 迭代 60 万次派生。解密只发生在浏览器里, 服务端拿到的始终是一段密文。
- 默认私密 —— 新增点位时
isPrivate默认就是true。 忘了改也不会把不该公开的东西漏出去,这个默认值比任何提示都管用。 - 本地优先加载 —— 优先读 localStorage 里的缓存,再异步拉最新数据。 网络慢的时候页面也不会空着。
产出与获取
目前作为博客的一个子页面在线运行,随手可以打开。 加密方案仍在继续迭代 —— 静态站点的“密码保护”本质上是一道门槛而不是保险箱, 这一点我从一开始就很清楚,也会在后续版本里做得更稳。
还没做完的
- 加密强度与密钥派生参数还要继续调,要能扛住离线暴力尝试。
- 点位编辑目前靠手改 JSON,想补一个可视化录入界面。
- 想加一条“按年份回放”的动线,把时间维度真正用起来。