旅行地图 · LifeBS 插件
一个自包含的旅行足迹地图插件:照片自动拼进国家与省份轮廓、点亮全球足迹,全程离线渲染、无需地图服务商密钥。适配 lifesystem / lifesoso / lifegame 三端,安装即用。
一句话结论
本插件以纯前端 Canvas 实现「上传照片 → 按国家/省份/城市轮廓拼贴」的旅行足迹玩法,并将全球 239 个国家 / 地区边界与全国 34 个省级、市级边界数据全部内置在插件包内(约 1.4MB),运行时零外部请求,站长无需申请任何地图密钥。
核心功能
免费地图方案
开发前调研了主流地图方案,结论:本插件采用阿里云 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/,站长可在后台修改。
安装与配置
- 在 LifeBS 后台「插件管理」上传
travel_map.zip(约 1.3MB,含全部边界数据),完成安装,自动创建travel_map_records/travel_map_users两张表。 - 安装后菜单栏出现「旅行地图」入口;用户可直接打开个人地图开始记录足迹。
- 后台「旅行地图 · 后台设置」可配置:上传方式(站内 / 网盘直传 / 仅外链)、单张大小上限(1–20MB)、照片墙每页条数、主题色、深色强调色、新用户默认公开与否、地图数据源地址。
- 个人中心自动出现足迹统计卡片,组件中心(lifesoso)可添加「旅行地图」小组件。
卸载插件会删除 travel_map_records、travel_map_users 数据表及 uploads/ 目录内的已上传照片,操作前请备份。
数据与安全
插件的写操作(上传、增删改、公开切换)全部要求登录 + CSRF 校验 + 属主校验;图片外链渲染统一走站内代理(ajax.php?action=imgproxy),既避免外链图片跨域污染 Canvas,又做了内网地址(SSRF)拦截;上传文件经 MIME 校验并重命名为随机名,路径通过 realpath 防越权。
- 数据表均加
travel_map_前缀,卸载脚本负责清理。 - 访客只能查看已公开用户的地图;私有地图的图片接口同样校验权限。
- 外链代理限制 8MB 体积上限与 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()取封面辅助函数)。
- 地图页(含未登录落地页、无权限提示页)的「查看他人足迹」按钮继续保留:点击弹出面板,调用
- 修复:已选择省份,保存仍提示「请选择省份」(深层根因)
- 根因:前端读取省份控件时使用了错误的选择器——
setRegionInputs()/regionFieldValue()/bindCountryChange()三个函数按短 idnmTmProv/nmTmProvInput查找控件,而主弹窗中控件的真实 id 是nmTmProvince/nmTmProvinceInput(全拼)。查找结果为null,省份值恒读为空串,提交后后端校验自然失败 - 为何此前未发现:批注面板的控件 id 恰好是短名
nmTmAnnotProv,走同一套函数一直正常,只有主弹窗(无前缀)受影响 - 修复:按前缀区分选择器——主弹窗(无前缀)使用
nmTmProvince全名,批注面板(前缀Annot)保持nmTmAnnotProv短名;主弹窗添加 / 编辑、批注面板、非中国国家文本输入三条链路全部验证通过 - 顺带恢复:切换国家时省份 / 城市控件的显示隐藏与下拉重置联动(此前同样受选择器错误影响而失效)
- 根因:前端读取省份控件时使用了错误的选择器——
- 修复:选择图片后提示「上传失败」
- 根因一:部分服务器(如宝塔默认 PHP 环境)未启用
fileinfo扩展,后端new finfo()直接抛错返回 HTTP 500,前端解析不到 JSON 即报「上传失败」。现改为 fileinfo 优先、异常时自动降级getimagesize()校验图片有效性,两个方案都不可用时才提示「文件不是有效图片」 - 根因二:上传目录不存在或不可写时仅静默
mkdir,失败后保存文件报笼统的「保存文件失败」。现增加目录创建结果检查,分别提示「上传目录不可写」/「保存文件失败,请检查 uploads 目录写入权限」,方便定位问题 - 前端同步优化:上传请求失败时区分「HTTP 状态码错误」「服务器返回异常」并展示具体原因,不再一律显示笼统的「上传失败」
- 根因一:部分服务器(如宝塔默认 PHP 环境)未启用
- 修复:已选择省份,保存仍提示「请选择省份」
- 根因:表单中省份下拉
select与隐藏文本输入框input的name均为province(城市同理),表单序列化提交时两个值同时发送,后端$_POST['province']只取到最后一个(隐藏的空输入框),省份校验自然失败 - 修复:提交前按当前生效控件重建字段——中国模式取省份 / 城市下拉值,其他国家模式取文本输入值,彻底消除同名控件互相覆盖的问题;国家、省份、城市三端模式均验证通过
- 根因:表单中省份下拉
- 修复:点击「添加足迹」弹出表单后,选择国家 / 省份 / 城市时弹窗被立即关闭——遮罩层点击关闭逻辑未过滤事件来源,select 下拉的 click 冒泡到遮罩触发
closeModal();现改为仅点击遮罩空白处才关闭,表单内部操作(含下拉选择)不受影响 - 修复:导出分享图面板遮罩同样未过滤事件来源,已同步修正,点击面板内部不再误关
- 修复:统计条公开状态卡与顶部「公开中 · 他人可见」按钮不联动——状态卡原按「是否主人」写死显示「私有」,现按实际公开状态渲染,切换公开 / 私有后状态卡同步刷新
- 修复:添加足迹 / 导出分享图 / 区域抽屉 / 批注面板浮层被
display:flex覆盖hidden,导致页面加载即显示弹窗、点击「添加足迹」无反应 - 修复:弹窗打开逻辑引用不存在的元素
nmTmModal(实际为nmTmForm)导致 JS 报错
- 里程碑:版本跳升为大版本 v1.6.0,全球地图功能正式发布
- 新增:全球 / 中国双模式,内置 239 个国家 / 地区中文边界(world-geo-json-zh,含南海十段线)
- 新增:足迹支持国家归属(旧数据自动视为中国),全球视图点击国家查看当地照片,点击「中国」钻入省市视图
- 新增:国家下拉选择(中国置顶 + 中文名排序),非中国国家用自由文本填写州 / 省 / 城市
- 新增:组件中心与个人中心卡片展示「国家 / 地区」统计
- 增强:数据表新增
country字段,安装升级自动补列,旧数据零迁移 - 修复:国家中文名列表未初始化导致全球视图只显示代码;国家切换未联动省份控件
- 修复:插件包改用正斜杠路径打包,解决 Windows 打包的 zip 在 Linux 服务器解压后目录结构错误(lib/common.php 等子目录文件无法加载)的问题
- 修复:插件包不完整(缺少 lib/common.php)时输出友好中文提示,替代 PHP 致命错误白屏,便于排查上传/解压遗漏
- 增强:安装脚本增加关键文件完整性自检,缺失文件时写入错误日志
- 增强:个人中心卡片与组件卡片在文件缺失时静默降级,不破坏宿主页面
- 新增:照片拼贴引擎,照片按省份/城市轮廓自动裁切填充,未到访省份灰底轮廓
- 新增:省级/市级双视图、滚轮缩放、双击复位、区域照片抽屉
- 新增:足迹管理(地点/日期/相册/标签/星级/置顶)与批量修改、批量固定、批量删除
- 新增:地图公开/私有切换与访客地图查看,个人中心卡片 + 组件中心入口
- 新增:批注回看模式与「自动回看」旅程播放
- 新增:导出 PNG 分享图(1080/1440/1920 宽度、4 套配色、字体与边框选项)
- 新增:后台设置(上传方式、大小上限、照片墙条数、主题色、默认公开、地图数据源)
- 新增:内置 34 个省级 + 全国 DataV GeoJSON 离线边界,运行时零外部请求
- 修复:台湾省边界数据缺失(DataV v3 无该文件,自动改用 v2 接口并内置补全特判)
- 安全:图片外链代理 SSRF 防护;写操作 CSRF + 属主校验;上传 MIME 校验与随机重命名