旅行地图 · LifeBS 插件

一个自包含的旅行足迹地图插件:照片自动拼进国家与省份轮廓、点亮全球足迹,全程离线渲染、无需地图服务商密钥。适配 lifesystem / lifesoso / lifegame 三端,安装即用。

版本 v1.7.0 类型 功能插件 支持 lifesystem · lifesoso · lifegame 边界数据 阿里云 DataV GeoJSON(免费)

一句话结论

本插件以纯前端 Canvas 实现「上传照片 → 按国家/省份/城市轮廓拼贴」的旅行足迹玩法,并将全球 239 个国家 / 地区边界与全国 34 个省级、市级边界数据全部内置在插件包内(约 1.4MB),运行时零外部请求,站长无需申请任何地图密钥。

239
国家 / 地区边界内置
34
中国省级边界内置(含台港澳)
3
端兼容(system / soso / game)
0
地图密钥 / 外部服务依赖

核心功能

全球 + 中国双模式
一键切换「全球(239 个国家 / 地区)」与「中国(省级 / 市级双视图)」:全球视图点击国家查看当地照片,点击「中国」直接钻入中国省市视图;支持滚轮缩放与双击复位。
照片拼贴引擎
上传的旅行照片按国家 / 省份 / 城市轮廓自动裁切填充进地图,形成「照片拼图」式足迹;未去过的区域显示为灰底轮廓。
足迹管理
添加 / 编辑 / 删除足迹,支持地点、到访日期、相册、标签、星级评分、置顶固定,以及批量修改、批量固定、批量删除。
公开与分享
地图可一键公开/私有;公开后他人可通过 uid 链接、个人中心卡片与组件中心入口查看你的地图与照片墙;地图页设「🌍 查看他人足迹」入口,一键列出全站所有已公开的旅行地图,并支持昵称搜索与分页翻看,方便发现同好。
批注回看
点击任意照片进入批注模式,逐条查看/修改每条足迹的日期、地点、标签、备注,支持「自动回看」播放整段旅程。
导出分享图
将地图渲染为 PNG 分享图,可选 1080/1440/1920 宽度、墨色/旅行绿/印泥红/海蓝配色、粗细边框与字体。

免费地图方案

开发前调研了主流地图方案,结论:本插件采用阿里云 DataV GeoJSON 离线边界数据,插件使用者无需申请任何地图服务。边界文件(全球 239 个国家 / 地区 + 全国底图 + 34 个省级/市级轮廓)已随插件内置,由纯前端 Canvas 渲染。

地图方案对比
方案 是否需申请 Key 网络依赖 本插件采用
阿里云 DataV GeoJSON(内置) 否,公开数据 完全离线 ✓ 已采用
高德 JS API 是(个人开发者免费额度) 在线 —
腾讯位置服务 是(个人开发者免费额度) 在线 —
Leaflet + OpenStreetMap 否,但海外底图国内访问不稳 在线 —
需要卫星图 / 街道图底图时,可申请以下免费地图服务

旅行足迹轮廓图无需密钥;若未来需要在地图上叠加实景底图,插件使用者可自行申请开发者 Key:高德开放平台 lbs.amap.com、腾讯位置服务 lbs.qq.com、百度地图开放平台 lbsyun.baidu.com,个人认证均有免费调用额度。

数据管理与补全

后台「地图数据管理」提供一键检查 34 个省级边界与全球国家边界文件的完整性,并可从数据源在线补全缺失/损坏的文件(台湾省数据在 DataV 仅有 v2 接口,已做自动特判;全球边界内置开源 world-geo-json-zh 数据,含南海十段线)。默认数据源为 https://geo.datav.aliyun.com/areas_v3/bound/,站长可在后台修改。

安装与配置

  1. 在 LifeBS 后台「插件管理」上传 travel_map.zip(约 1.3MB,含全部边界数据),完成安装,自动创建 travel_map_records / travel_map_users 两张表。
  2. 安装后菜单栏出现「旅行地图」入口;用户可直接打开个人地图开始记录足迹。
  3. 后台「旅行地图 · 后台设置」可配置:上传方式(站内 / 网盘直传 / 仅外链)、单张大小上限(1–20MB)、照片墙每页条数、主题色、深色强调色、新用户默认公开与否、地图数据源地址。
  4. 个人中心自动出现足迹统计卡片,组件中心(lifesoso)可添加「旅行地图」小组件。
卸载提示

卸载插件会删除 travel_map_records、travel_map_users 数据表及 uploads/ 目录内的已上传照片,操作前请备份。

数据与安全

插件的写操作(上传、增删改、公开切换)全部要求登录 + CSRF 校验 + 属主校验;图片外链渲染统一走站内代理(ajax.php?action=imgproxy),既避免外链图片跨域污染 Canvas,又做了内网地址(SSRF)拦截;上传文件经 MIME 校验并重命名为随机名,路径通过 realpath 防越权。

  • 数据表均加 travel_map_ 前缀,卸载脚本负责清理。
  • 访客只能查看已公开用户的地图;私有地图的图片接口同样校验权限。
  • 外链代理限制 8MB 体积上限与 10 秒超时,禁止代理内网/本地地址。

更新日志

v1.7.0 2026-10-10 · 发现页增强
新增 调整
  • 新增:发现页「分页 + 昵称搜索」
    • 公开地图变多后,一次性全部拉取既慢也不好翻找;publiclist 接口升级为支持 page / perpage(默认 24 条 / 页)/ q(昵称模糊匹配)参数,返回 pages / total / page。
    • 发现页面板顶部新增搜索框(输入即时防抖 300ms 过滤),底部新增分页条(上一页 / 下一页 + 页码窗口 + 总数提示),点击页码或翻页即时 fetch 对应页。
    • 搜索在后端按昵称过滤,兼容任意 users 表结构(走既有 travel_map_user_name() 取昵称,mb_stripos 大小写不敏感匹配),无额外字段依赖。
  • 调整:移除地图页「🔗 复制链接」按钮
    • 经确认,该按钮并非需求本意(本意是「查看他人足迹」入口),本期予以移除,地图页头部仅保留导出 / 查看他人足迹 / 公开切换等核心按钮。
    • 若日后确实需要「一键复制我的公开链接」,可基于既有 travel_map_page_url(uid) 与 canView 鉴权低成本补回。
  • 保留:地图页「🌍 查看他人足迹」发现页
    • 地图页(含未登录落地页、无权限提示页)的「查看他人足迹」按钮继续保留:点击弹出面板,调用 ajax.php?action=publiclist 接口,分页列出所有已公开(travel_map_users.is_public=1)的旅行地图。
    • 每张卡片展示封面(自动取该用户首张照片)、昵称、国家 / 省份 / 足迹数,点击直达对方公开地图(travel_map_page_url(uid),与个人中心卡片同源)。
    • 接口免登录、仅读公开数据;卡片渲染对昵称 / URL 做了 HTML 转义,封面走既有图片代理 / 外链白名单,无新增权限面。
    • 实现改动 map.php(发现页弹窗 + 分页 / 搜索脚本 + scoped CSS)、ajax.php(publiclist 升级分页与搜索)、lib/common.php(travel_map_user_cover() 取封面辅助函数)。
v1.6.8 2026-10-01 · 关键修复
修复
  • 修复:已选择省份,保存仍提示「请选择省份」(深层根因)
    • 根因:前端读取省份控件时使用了错误的选择器——setRegionInputs() / regionFieldValue() / bindCountryChange() 三个函数按短 id nmTmProv / nmTmProvInput 查找控件,而主弹窗中控件的真实 id 是 nmTmProvince / nmTmProvinceInput(全拼)。查找结果为 null,省份值恒读为空串,提交后后端校验自然失败
    • 为何此前未发现:批注面板的控件 id 恰好是短名 nmTmAnnotProv,走同一套函数一直正常,只有主弹窗(无前缀)受影响
    • 修复:按前缀区分选择器——主弹窗(无前缀)使用 nmTmProvince 全名,批注面板(前缀 Annot)保持 nmTmAnnotProv 短名;主弹窗添加 / 编辑、批注面板、非中国国家文本输入三条链路全部验证通过
    • 顺带恢复:切换国家时省份 / 城市控件的显示隐藏与下拉重置联动(此前同样受选择器错误影响而失效)
v1.6.7 2026-10-01 · 关键修复
修复
  • 修复:选择图片后提示「上传失败」
    • 根因一:部分服务器(如宝塔默认 PHP 环境)未启用 fileinfo 扩展,后端 new finfo() 直接抛错返回 HTTP 500,前端解析不到 JSON 即报「上传失败」。现改为 fileinfo 优先、异常时自动降级 getimagesize() 校验图片有效性,两个方案都不可用时才提示「文件不是有效图片」
    • 根因二:上传目录不存在或不可写时仅静默 mkdir,失败后保存文件报笼统的「保存文件失败」。现增加目录创建结果检查,分别提示「上传目录不可写」/「保存文件失败,请检查 uploads 目录写入权限」,方便定位问题
    • 前端同步优化:上传请求失败时区分「HTTP 状态码错误」「服务器返回异常」并展示具体原因,不再一律显示笼统的「上传失败」
  • 修复:已选择省份,保存仍提示「请选择省份」
    • 根因:表单中省份下拉 select 与隐藏文本输入框 input 的 name 均为 province(城市同理),表单序列化提交时两个值同时发送,后端 $_POST['province'] 只取到最后一个(隐藏的空输入框),省份校验自然失败
    • 修复:提交前按当前生效控件重建字段——中国模式取省份 / 城市下拉值,其他国家模式取文本输入值,彻底消除同名控件互相覆盖的问题;国家、省份、城市三端模式均验证通过
v1.6.5 2026-09-28 · 关键修复
修复
  • 修复:点击「添加足迹」弹出表单后,选择国家 / 省份 / 城市时弹窗被立即关闭——遮罩层点击关闭逻辑未过滤事件来源,select 下拉的 click 冒泡到遮罩触发 closeModal();现改为仅点击遮罩空白处才关闭,表单内部操作(含下拉选择)不受影响
  • 修复:导出分享图面板遮罩同样未过滤事件来源,已同步修正,点击面板内部不再误关
  • 修复:统计条公开状态卡与顶部「公开中 · 他人可见」按钮不联动——状态卡原按「是否主人」写死显示「私有」,现按实际公开状态渲染,切换公开 / 私有后状态卡同步刷新
v1.6.3 2026-09-28 · 关键修复
修复
  • 修复:添加足迹 / 导出分享图 / 区域抽屉 / 批注面板浮层被 display:flex 覆盖 hidden,导致页面加载即显示弹窗、点击「添加足迹」无反应
  • 修复:弹窗打开逻辑引用不存在的元素 nmTmModal(实际为 nmTmForm)导致 JS 报错
v1.6.0 2026-09-28 · 大版本升级
新增 修复 里程碑
  • 里程碑:版本跳升为大版本 v1.6.0,全球地图功能正式发布
  • 新增:全球 / 中国双模式,内置 239 个国家 / 地区中文边界(world-geo-json-zh,含南海十段线)
  • 新增:足迹支持国家归属(旧数据自动视为中国),全球视图点击国家查看当地照片,点击「中国」钻入省市视图
  • 新增:国家下拉选择(中国置顶 + 中文名排序),非中国国家用自由文本填写州 / 省 / 城市
  • 新增:组件中心与个人中心卡片展示「国家 / 地区」统计
  • 增强:数据表新增 country 字段,安装升级自动补列,旧数据零迁移
  • 修复:国家中文名列表未初始化导致全球视图只显示代码;国家切换未联动省份控件
v1.0.2 2026-09-28 · 打包分发修复
修复
  • 修复:插件包改用正斜杠路径打包,解决 Windows 打包的 zip 在 Linux 服务器解压后目录结构错误(lib/common.php 等子目录文件无法加载)的问题
v1.0.1 2026-09-28 · 部署健壮性改进
修复 增强
  • 修复:插件包不完整(缺少 lib/common.php)时输出友好中文提示,替代 PHP 致命错误白屏,便于排查上传/解压遗漏
  • 增强:安装脚本增加关键文件完整性自检,缺失文件时写入错误日志
  • 增强:个人中心卡片与组件卡片在文件缺失时静默降级,不破坏宿主页面
v1.0.0 2026-09-28 · 首个正式版本
新增 修复 安全
  • 新增:照片拼贴引擎,照片按省份/城市轮廓自动裁切填充,未到访省份灰底轮廓
  • 新增:省级/市级双视图、滚轮缩放、双击复位、区域照片抽屉
  • 新增:足迹管理(地点/日期/相册/标签/星级/置顶)与批量修改、批量固定、批量删除
  • 新增:地图公开/私有切换与访客地图查看,个人中心卡片 + 组件中心入口
  • 新增:批注回看模式与「自动回看」旅程播放
  • 新增:导出 PNG 分享图(1080/1440/1920 宽度、4 套配色、字体与边框选项)
  • 新增:后台设置(上传方式、大小上限、照片墙条数、主题色、默认公开、地图数据源)
  • 新增:内置 34 个省级 + 全国 DataV GeoJSON 离线边界,运行时零外部请求
  • 修复:台湾省边界数据缺失(DataV v3 无该文件,自动改用 v2 接口并内置补全特判)
  • 安全:图片外链代理 SSRF 防护;写操作 CSRF + 属主校验;上传 MIME 校验与随机重命名