v24 第 17 批:城市聚合 / 高德地址 / 表单精简(用户 10 条)
用户 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 与源库对齐。
This commit is contained in:
+35
-16
@@ -75,7 +75,10 @@ $groupMeta = [
|
||||
⚠️ 第 1 条:「题图应该按照 16:9 显示,因为添加的时候,是按照这个比例裁剪的,
|
||||
现在的显示比例不对」—— 之前 CSS 写的是 4:3,把 16:9 的图裁掉两边。
|
||||
16:9 这个数字与 ImageSlot 里 cover 槽位的比例**必须一致**,
|
||||
部署断言里有一条专门比对它。 */ ?>
|
||||
部署断言里有一条专门比对它。
|
||||
⚠️ 第 17 批 第 4 条:「旅程详情页面,图片右侧显示的是**聚合的城市**,
|
||||
而不是终点地址。」—— 城市来自 `Trip::cities()`(出发地 ∪ 到达地,去重),
|
||||
见 summary() → cities()。 */ ?>
|
||||
<div class="card card-pad trip-hero">
|
||||
<div class="trip-hero-cover">
|
||||
<?php if (!empty($t['cover_key'])): ?>
|
||||
@@ -178,7 +181,10 @@ foreach ($bysStage as $lst) { $shown += count($lst); }
|
||||
<?php foreach ($list as $n): ?>
|
||||
<?php
|
||||
$nid = (int)$n['id'];
|
||||
$span = \App\Trip::formatSpan($n['starts_at'] ?? null, $n['ends_at'] ?? null);
|
||||
// ⚠️ 第 17 批 第 4 条末:「行程中,时间明明具体到了时分秒,怎么不显示?」
|
||||
// → 行程行改用 nodeSpan()(精确到时分),**不再**用只到日期的 formatSpan()。
|
||||
// formatSpan 那个精度是给"旅程"(容器)用的。
|
||||
$span = \App\Trip::nodeSpan($n['starts_at'] ?? null, $n['ends_at'] ?? null);
|
||||
$mode = (string)($n['travel_mode'] ?? '');
|
||||
$spent = (int)($n['spent_cents'] ?? 0);
|
||||
?>
|
||||
@@ -194,9 +200,6 @@ foreach ($bysStage as $lst) { $shown += count($lst); }
|
||||
<?php if ((int)($n['revision_n'] ?? 0) > 0): ?>
|
||||
<span class="rev-badge" title="已修正过多次">已修正 <?= (int)$n['revision_n'] ?> 次</span>
|
||||
<?php endif; ?>
|
||||
<?php if (!empty($n['place'])): ?>
|
||||
<span class="node-place">📍 <?= e((string)$n['place']) ?></span>
|
||||
<?php endif; ?>
|
||||
<?php if ($mode !== ''): ?>
|
||||
<span class="node-mode"><?= e(\App\Trip::modeIcon($mode)) ?> <?= e(\App\Trip::modeWord($mode)) ?></span>
|
||||
<?php endif; ?>
|
||||
@@ -209,14 +212,15 @@ foreach ($bysStage as $lst) { $shown += count($lst); }
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
|
||||
<?php /* 交通细节(TripLog 同款):只显示**填过的**那几个,没填就不占地方 */ ?>
|
||||
<?php /* 交通细节:**只保留**「线路名 / 车次航班号 / 承运方」。
|
||||
⚠️ 第 17 批 第 3 条明确「座位什么的不记录了」→
|
||||
座位 / 车厢、登机口 / 站台**不再出现在这里**
|
||||
(数据库那两列还留着老数据,只是不再展示)。 */ ?>
|
||||
<?php
|
||||
$traffic = [];
|
||||
if (!empty($n['line_name'])) { $traffic[] = (string)$n['line_name']; }
|
||||
if (!empty($n['trip_no'])) { $traffic[] = (string)$n['trip_no']; }
|
||||
if (!empty($n['carrier'])) { $traffic[] = (string)$n['carrier']; }
|
||||
if (!empty($n['seat_info'])) { $traffic[] = '座位 ' . (string)$n['seat_info']; }
|
||||
if (!empty($n['gate'])) { $traffic[] = '登机口/站台 ' . (string)$n['gate']; }
|
||||
?>
|
||||
<?php if ($traffic): ?>
|
||||
<div class="node-traffic">
|
||||
@@ -224,9 +228,27 @@ foreach ($bysStage as $lst) { $shown += count($lst); }
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
|
||||
<?php /* 出发地 → 到达地(第 17 批 第 3 条要记详细地址;
|
||||
这里显示地点名,详细地址放 title 里悬停可见 + 带导航链接)。 */ ?>
|
||||
<?php if (!empty($n['from_place']) || !empty($n['to_place'])): ?>
|
||||
<div class="node-route-line">
|
||||
<?= e((string)($n['from_place'] ?? '—')) ?> <span class="arrow">→</span> <?= e((string)($n['to_place'] ?? '—')) ?>
|
||||
<?php
|
||||
$navFrom = \App\Geo::navUrl($n['from_lng'] ?? null, $n['from_lat'] ?? null, (string)($n['from_place'] ?? ''));
|
||||
$navTo = \App\Geo::navUrl($n['to_lng'] ?? null, $n['to_lat'] ?? null, (string)($n['to_place'] ?? ''));
|
||||
?>
|
||||
<?php if ($navFrom !== ''): ?>
|
||||
<a href="<?= e($navFrom) ?>" target="_blank" rel="noopener"
|
||||
title="<?= e((string)($n['from_addr'] ?? '')) ?>"><?= e((string)$n['from_place']) ?></a>
|
||||
<?php else: ?>
|
||||
<?= e((string)($n['from_place'] ?? '—')) ?>
|
||||
<?php endif; ?>
|
||||
<span class="arrow">→</span>
|
||||
<?php if ($navTo !== ''): ?>
|
||||
<a href="<?= e($navTo) ?>" target="_blank" rel="noopener"
|
||||
title="<?= e((string)($n['to_addr'] ?? '')) ?>"><?= e((string)$n['to_place']) ?></a>
|
||||
<?php else: ?>
|
||||
<?= e((string)($n['to_place'] ?? '—')) ?>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
|
||||
@@ -238,15 +260,12 @@ foreach ($bysStage as $lst) { $shown += count($lst); }
|
||||
<div class="node-spent">💰 这一段花了 <?= e(\App\Expense::money($spent)) ?></div>
|
||||
<?php endif; ?>
|
||||
|
||||
<?php /* ⚠️ 第 17 批 第 3 条:「给参与人标注角色这个功能去掉,不要了。」
|
||||
所以这里**不再渲染** role_tag(数据库里老数据的角色还在,只是不显示)。 */ ?>
|
||||
<?php if (!empty($n['members'])): ?>
|
||||
<div class="trip-people">
|
||||
<?php foreach ($n['members'] as $mm): ?>
|
||||
<span class="node-member">
|
||||
<?= person_chip($mm) ?>
|
||||
<?php if (!empty($mm['role_tag'])): ?>
|
||||
<span class="node-role"><?= e((string)$mm['role_tag']) ?></span>
|
||||
<?php endif; ?>
|
||||
</span>
|
||||
<?= person_chip($mm) ?>
|
||||
<?php endforeach; ?>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
@@ -272,7 +291,7 @@ foreach ($bysStage as $lst) { $shown += count($lst); }
|
||||
<?php foreach ($n['revisions'] as $rv): ?>
|
||||
<tr>
|
||||
<td><?= (int)$rv['seq'] === 1 ? '原计划' : '第 ' . ((int)$rv['seq'] - 1) . ' 次修正' ?></td>
|
||||
<td class="small"><?= e(\App\Trip::formatSpan($rv['starts_at'] ?? null, $rv['ends_at'] ?? null)) ?></td>
|
||||
<td class="small"><?= e(\App\Trip::nodeSpan($rv['starts_at'] ?? null, $rv['ends_at'] ?? null)) ?></td>
|
||||
<td><?= e((string)($rv['place'] ?? '')) ?></td>
|
||||
<td class="small"><?= e((string)($rv['detail'] ?? '')) ?></td>
|
||||
</tr>
|
||||
|
||||
Reference in New Issue
Block a user