From 02f40b6d6f5f087d95766ea9d0a96f69c05c78e5 Mon Sep 17 00:00:00 2001 From: laoyang Date: Thu, 24 Sep 2026 20:08:17 +0800 Subject: [PATCH] =?UTF-8?q?=E8=B7=AF=E7=BA=BF=E5=9C=B0=E5=9B=BE/=E8=8A=82?= =?UTF-8?q?=E7=82=B9=E5=8D=A1=E7=89=87/=E8=AF=A6=E6=83=85=E6=8C=89?= =?UTF-8?q?=E5=87=BA=E8=A1=8C=E6=96=B9=E5=BC=8F=E6=98=BE=E7=A4=BA=E4=B8=8D?= =?UTF-8?q?=E5=90=8C=E5=9B=BE=E6=A0=87=EF=BC=88=E6=89=B9=2019=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 出行方式(飞机/火车/游船/自驾/地铁…)原本在路线地图标记、节点卡片交通行、 节点详情「出行方式」行一律显示节点类型图标(赶路节点恒为 🚗),易让人误解。 - TravelModeController 新增 MODE_ICONS(mode_type → emoji 映射) - ActivityController::show() 两路查询 LEFT JOIN travel_modes 取 mode_type,注入 modeIcons - 路线地图标记 / 卡片交通行 / 详情出行方式行:优先用出行方式图标, 未选出行方式时回退节点类型图标 --- src/Controllers/ActivityController.php | 10 ++++++++-- src/Controllers/NodeController.php | 2 ++ src/Controllers/TravelModeController.php | 19 +++++++++++++++++++ templates/activities/_node_card.php | 9 ++++++++- templates/activities/show.php | 10 +++++++++- templates/nodes/show.php | 7 ++++++- 6 files changed, 52 insertions(+), 5 deletions(-) diff --git a/src/Controllers/ActivityController.php b/src/Controllers/ActivityController.php index a11efdc..1aa25d1 100644 --- a/src/Controllers/ActivityController.php +++ b/src/Controllers/ActivityController.php @@ -314,18 +314,22 @@ class ActivityController exit('活动不存在'); } - $stmt = $db->prepare('SELECT tn.*, nt.name AS node_type_name, nt.icon AS node_type_icon + $stmt = $db->prepare('SELECT tn.*, nt.name AS node_type_name, nt.icon AS node_type_icon, + tm.mode_type AS travel_mode_type FROM trip_nodes tn LEFT JOIN node_types nt ON nt.id = tn.node_type_id + LEFT JOIN travel_modes tm ON tm.id = tn.travel_mode_id WHERE tn.activity_id = ? AND tn.node_category = "plan" ORDER BY tn.start_time ASC'); $stmt->execute([$id]); $planNodes = $stmt->fetchAll(); $this->attachCounts($db, $planNodes); - $stmt = $db->prepare('SELECT tn.*, nt.name AS node_type_name, nt.icon AS node_type_icon + $stmt = $db->prepare('SELECT tn.*, nt.name AS node_type_name, nt.icon AS node_type_icon, + tm.mode_type AS travel_mode_type FROM trip_nodes tn LEFT JOIN node_types nt ON nt.id = tn.node_type_id + LEFT JOIN travel_modes tm ON tm.id = tn.travel_mode_id WHERE tn.activity_id = ? AND tn.node_category = "reality" ORDER BY tn.start_time ASC'); $stmt->execute([$id]); @@ -352,6 +356,8 @@ class ActivityController 'nodeMembers' => $nodeMembers, // 路线地图:每个执行节点第一张图片附件 id(圆形标记用),一条 GROUP BY 防止 N+1 'nodeFirstImage' => Attachments::firstImageIdsForNodes(array_column($realityNodes, 'id')), + // 批 19:路线地图标记图标按出行方式映射(回退节点类型图标) + 'modeIcons' => TravelModeController::MODE_ICONS, 'expenseSummary' => Expenses::summaryForActivity($id), 'commentTree' => Comments::tree(Comments::TARGET_ACTIVITY, $id), 'pageTitle' => $activity['title'], diff --git a/src/Controllers/NodeController.php b/src/Controllers/NodeController.php index c2704ae..ad6754c 100644 --- a/src/Controllers/NodeController.php +++ b/src/Controllers/NodeController.php @@ -316,6 +316,8 @@ class NodeController 'travel_mode_label' => $travelModeLabel, 'travel_mode_type' => $travelModeType, ]), + // 批 19:出行方式图标映射,节点详情「出行方式」行前展示 + 'modeIcons' => TravelModeController::MODE_ICONS, 'attachmentCount' => $attachmentCount, 'attachments' => $nodeAttachments, 'members' => Members::forNode($nodeId), diff --git a/src/Controllers/TravelModeController.php b/src/Controllers/TravelModeController.php index 052968f..858e835 100644 --- a/src/Controllers/TravelModeController.php +++ b/src/Controllers/TravelModeController.php @@ -22,6 +22,25 @@ class TravelModeController 'other' => '其他', ]; + /** + * 出行方式 → 地图/卡片上的图标(emoji)。 + * 自驾两类仍用 🚗(本来就是开车);其余按交通工具区分, + * 避免路线地图上「一律汽车」让人误解(批 19)。未列入的 mode_type 回退到节点类型图标。 + */ + public const MODE_ICONS = [ + 'drive_own' => '🚗', + 'drive_rental' => '🚙', + 'train' => '🚄', + 'plane' => '✈️', + 'bus' => '🚌', + 'subway' => '🚇', + 'taxi' => '🚕', + 'bike' => '🚲', + 'walk' => '🚶', + 'ship' => '🚢', + 'other' => '🔀', + ]; + public function index(): void { $this->requireLogin(); diff --git a/templates/activities/_node_card.php b/templates/activities/_node_card.php index c7b997d..8b32c29 100644 --- a/templates/activities/_node_card.php +++ b/templates/activities/_node_card.php @@ -66,8 +66,15 @@ if ($cardCategory === 'plan') { + -
🚄
+
diff --git a/templates/activities/show.php b/templates/activities/show.php index 392fb33..62982cb 100644 --- a/templates/activities/show.php +++ b/templates/activities/show.php @@ -42,6 +42,7 @@ 查不到就保持缺省,不硬造位置。AMap 2.0 已由 layout.php 全局加载。 */ $routeNodes = []; $nodeFirstImage = $nodeFirstImage ?? []; +$modeIcons = $modeIcons ?? []; // 批 19:出行方式→图标映射,由控制器注入 foreach (($realityNodes ?? []) as $rn) { $s = json_decode_field($rn['start_location'] ?? null); $e = json_decode_field($rn['end_location'] ?? null); @@ -53,10 +54,17 @@ foreach (($realityNodes ?? []) as $rn) { continue; // 坐标和地名一个都没有的节点不上地图 } $imgId = (int)($nodeFirstImage[(int)$rn['id']] ?? 0); + // 批 19:标记图标优先用「出行方式」的图标;没选出行方式时回退到节点类型图标 + //(赶路节点没选方式 → 仍是 🚗;选了飞机/火车/游船等 → 显示对应交通工具图标,不再一律汽车)。 + $rnModeType = (string)($rn['travel_mode_type'] ?? ''); + $rnIcon = ($rnModeType !== '' && isset($modeIcons[$rnModeType])) + ? $modeIcons[$rnModeType] + : (string)($rn['node_type_icon'] ?: '📍'); + $routeNodes[] = [ 'id' => (int)$rn['id'], 'title' => (string)($rn['title'] ?: '(无标题节点)'), - 'icon' => (string)($rn['node_type_icon'] ?: '📍'), + 'icon' => $rnIcon, 'img' => $imgId > 0 ? media_att($imgId) : '', 'url' => url('nodes/show', ['id' => (int)$rn['id']]), 'sname' => $sname, // 出发地名:没有坐标时交给高德地理编码兜底 diff --git a/templates/nodes/show.php b/templates/nodes/show.php index 34a5e2f..ff115d4 100644 --- a/templates/nodes/show.php +++ b/templates/nodes/show.php @@ -87,7 +87,12 @@ if (!empty($node['duration_minutes'])) {
出行方式 - + +