用户 10 条原话要点与落地:
- ①「统计出来的不是目的地,也不是车站,而是城市…城市要聚合,有多段行程,
都有青岛作为出发地或者目的地,那么就只记一次」
→ trip_nodes 补 from_city/to_city(Schema v22),Trip::cities() 改成
「出发地 ∪ 到达地」去重、按最早时间 + 出发地优先排。
详情页信息区显示的就是这个聚合结果(第 4 条:「图片右侧显示的是聚合的城市,
而不是终点地址」)。
- ②「类型不够丰富,你看看 triplog 里面都有哪些,都拿过来」
→ NodeType::TRIPLOG_TYPES(休息/突发/购物/拜访亲友),在 all() 里读时自愈补齐。
- ③「出行方式,只有选择自驾,才让选车辆;车辆下拉框不需要出现什么财务里登记的车,
只把车辆列出来就行了」→ DRIVE_MODES 收窄成 ['drive'];
Vehicle::pickable() 只回车辆库;车辆页删掉「财务里已登记的车」那块。
- ③「飞机、铁路,只记录车次、航班号就可以…座位什么的不记录了」
→ seat_info / gate 从表单与列表**彻底移除**(列保留,老数据不丢;
saveNode 的 UPDATE 也不再写这两列,否则会抹掉迁来的数据)。
- ③「出发地和到达地,都用高德地图的接口,记录详细地址」+「参与人弹框选择」
+「给参与人标注角色这个功能去掉」
→ 新增 templates/trips/_loc_field.php(高德联想 + 详细地址 + 坐标 + 城市 +
导航链接,没配 key 也能手输);参与人改用全局弹框选人组件;
角色输入框删除,saveNodeMembers 改成差集增删(否则老 role_tag 被静默抹掉)。
- ④「triplog 中的行程花销数据,没有同步过来,需要迁移过来」
→ 新增 _tooling/_fb_b17_backfill.php:迁地址(20 条)、花销(4 笔 ¥8584)、
车辆(3 台)。线上已执行并核对(笔数与金额一分不差)。
- ④「行程中,时间明明具体到了时分秒,怎么不显示?」
→ Trip::nodeSpan():行程时间精确到时分(同一天只写一次日期、跨天写月日、
两头都没时分就不写 00:00)。
其他:
- App\Geo 扩展 cityFromPoint / cityFromText / navUrl / jsConfig。
中文地址提城市修掉四种错法(白名单→黑名单、取最后→取第一个、直辖市最先认、
离线表只能兜底),并加了「五大连池 ≠ 大连」的位置守卫。
- config.example.php 加 amap 段(key / security_js / nav_src)。
验证:
- e2e 920/0(+29 条本批断言)· 升级 149/0(+15 条 v22 断言)·
城市解析 32/32(新套件,样例全是 TripLog 线上真实地址)·
桌面几何 428/0 · 移动端 688/0 · 交互 92/0 · 窄屏溢出 24/0。
- 反向验证 5/5:城市退回读 place / 只算到达地 / 时间退回只到日期 /
打车也要车 / 类型不补 —— 五种坏法全部被断言抓住。
- 部署:服务器自检 19/19;线上 schema v22;补迁后花销 4 笔 ¥8584 与源库对齐。
79 lines
4.0 KiB
PHP
79 lines
4.0 KiB
PHP
<?php
|
||
/**
|
||
* 地址输入(高德联想 + 详细地址 + 坐标),v24 第 17 批 用户第 3 条。
|
||
*
|
||
* 用户原话:「出发地和到达地,都用**高德地图的接口**,记录详细地址,
|
||
* 这个功能,triplog 也有,如果之前有数据,里面记录了行程的详细地址,
|
||
* 也都把数据迁移过来。」
|
||
*
|
||
* 界面照 TripLog 的 nodes/form.php:
|
||
* 一个可见的文本框(人能看到、能改、能自己敲)+ 四个隐藏字段
|
||
* (name / address / lng / lat —— 选中联想项后由 JS 填上)。
|
||
* **有坐标时**旁边出一个「🧭 导航到这里」链接(高德 URI API)。
|
||
*
|
||
* ⚠️ 三个必须做对的细节:
|
||
* ① **没配 key 也要能用**:SDK 不加载时文本框就是普通输入框,
|
||
* 用户手敲地名照样能存(只是没有详细地址与坐标)。
|
||
* 降级路径不能是"功能消失",只能是"辅助变少"。
|
||
* ② **assoc 用 map 而不是 select**:TripLog 用 AMap.AutoComplete 直接挂到 input 上,
|
||
* 能边打边出候选,比"点一下弹搜索框"顺手得多。
|
||
* ③ **不要 `<label for>`**:这个片段在一个页面里会出现两次(出发地/到达地),
|
||
* for/id 对不上就会互相抢焦点。用包裹式 label。
|
||
*
|
||
* 用法(require 前设好):
|
||
* $locPrefix 前缀('from' | 'to'),决定所有 id 与字段名
|
||
* $locLabel 标签文字(「出发地」「到达地」)
|
||
* $locIcon 标签前的小图标(可选)
|
||
* $locPlaceholder 占位提示
|
||
* $locRow 行数据(可选;编辑时回填):name/address/lng/lat 四个键
|
||
*/
|
||
|
||
declare(strict_types=1);
|
||
|
||
$locPrefix = (string)($locPrefix ?? 'from');
|
||
$locLabel = (string)($locLabel ?? '地点');
|
||
$locIcon = (string)($locIcon ?? '');
|
||
$locPlaceholder = (string)($locPlaceholder ?? '输入地址,如「青岛北站」');
|
||
$locRow = is_array($locRow ?? null) ? $locRow : [];
|
||
|
||
$locName = (string)($locRow['name'] ?? '');
|
||
$locAddr = (string)($locRow['address'] ?? '');
|
||
$locLng = (string)($locRow['lng'] ?? '');
|
||
$locLat = (string)($locRow['lat'] ?? '');
|
||
|
||
// 导航链接:有坐标走 navigation,没坐标退化成"按名字搜"
|
||
$locNav = \App\Geo::navUrl($locLng, $locLat, $locName);
|
||
$locId = 'loc-' . $locPrefix;
|
||
?>
|
||
<div class="loc-field" data-loc="<?= e($locPrefix) ?>">
|
||
<label class="loc-label" for="<?= e($locId) ?>-input">
|
||
<?php if ($locIcon !== ''): ?><span class="loc-ico"><?= e($locIcon) ?></span><?php endif; ?>
|
||
<?= e($locLabel) ?>
|
||
</label>
|
||
<input class="input loc-input" type="text"
|
||
id="<?= e($locId) ?>-input"
|
||
name="<?= e($locPrefix) ?>_place"
|
||
value="<?= e($locName) ?>"
|
||
placeholder="<?= e($locPlaceholder) ?>"
|
||
autocomplete="off"
|
||
data-loc-input>
|
||
<?php /* 高德没加载 / 用户自己敲的地名:这四个字段就是兜底存放处 */ ?>
|
||
<input type="hidden" name="<?= e($locPrefix) ?>_addr" value="<?= e($locAddr) ?>">
|
||
<input type="hidden" name="<?= e($locPrefix) ?>_lng" value="<?= e($locLng) ?>">
|
||
<input type="hidden" name="<?= e($locPrefix) ?>_lat" value="<?= e($locLat) ?>">
|
||
<?php /* 城市由前端选中时带回(高德 addressComponent 直接给城市名),
|
||
带不回就由服务端 App\Geo 解析 —— 两条路都通 */ ?>
|
||
<input type="hidden" name="<?= e($locPrefix) ?>_city" value="<?= e((string)($locRow['city'] ?? '')) ?>">
|
||
|
||
<div class="loc-extra">
|
||
<span class="loc-detail" data-loc-detail><?= e($locAddr !== '' && $locAddr !== $locName ? $locAddr : '') ?></span>
|
||
<a class="loc-nav" data-loc-nav
|
||
href="<?= e($locNav !== '' ? $locNav : '#') ?>"
|
||
target="_blank" rel="noopener"
|
||
<?= $locNav === '' ? 'hidden' : '' ?>>🧭 导航到这里</a>
|
||
</div>
|
||
</div>
|
||
<?php
|
||
// 只 unset 本片段自己的变量,宿主模板一个都不碰(与 _datetime.php 同一约定)
|
||
unset($locPrefix, $locLabel, $locIcon, $locPlaceholder, $locRow,
|
||
$locName, $locAddr, $locLng, $locLat, $locNav, $locId);
|