节点表单:参与人直接勾选 + 起点终点记录详细地址(批 13)

参与人(用户反馈:不想等全部填完、保存之后才回详情页加人):
- 节点表单里新增「参与人(直接勾选)」区块:家庭成员按胶囊复选框列出,
  保存即生效;编辑时预勾选已有人。
- Members::syncForNode() 只做增删,**不动留下来的那些人的情绪 / 签到 /
  角色标签**(重新勾一遍不该把之前记的心情清掉)。
- 安全性:新增走 Members::save(),逐条校验「用户属于该活动所在家庭」,
  夹带别家 user_id 进不来;只有请求带 members_present=1(表单确实渲染了
  参与人区块)才同步 —— 否则没这个字段的请求会把已有成员清空。

起点/终点记录详细地址(用户反馈:高德联想只返回简化地名):
- 联想项选中后不再是「青岛北站」就完事:
  ① 有坐标 → 逆地理编码(AMap.Geocoder.getAddress)取该点的
     formattedAddress;
  ② 没坐标 → 按「区县 + 名称」正查,顺带把坐标补回来。
- 详细地址写进 start/end_location 的 address 字段,输入框下方实时显示
  「详细地址:…」,节点详情页本来就展示这一项。
- 路线地图补点(只有地名没坐标时)改为**优先用详细地址**查询,
  比简化地名定位准。

已验证:本地全链 12 步全绿(渲染检查 350 项、真 AMap 浏览器验证 11 项、
表单交互 75 项);远端 e2e 350 项 0 失败(新增 10 项:勾选落库 / 跨家庭
拒绝 / 取消勾选移出 / 情绪不被清 / 无标记不动参与人);部署静态断言、
双 PHP 渲染、内容断言全过后提交。
This commit is contained in:
2026-09-24 12:36:01 +08:00
parent c4c3b17cf7
commit 142b187911
5 changed files with 254 additions and 4 deletions
+11 -2
View File
@@ -61,6 +61,8 @@ foreach (($realityNodes ?? []) as $rn) {
'url' => url('nodes/show', ['id' => (int)$rn['id']]),
'sname' => $sname, // 出发地名:没有坐标时交给高德地理编码兜底
'ename' => $ename, // 到达地名:同上
'saddr' => trim((string)($s['address'] ?? '')), // 详细地址:地理编码优先用它
'eaddr' => trim((string)($e['address'] ?? '')),
'start' => $hasS ? ['lng' => (float)$s['lng'], 'lat' => (float)$s['lat']] : null,
'end' => $hasE ? ['lng' => (float)$e['lng'], 'lat' => (float)$e['lat']] : null,
];
@@ -253,9 +255,16 @@ require dirname(__DIR__) . '/comments/_block.php';
} catch (e) { /* 地理编码服务不可用时保持原状 */ }
});
}
/* 没有坐标的点:优先拿**详细地址**去查(比简化地名准得多),没记地址才用地名 */
route.forEach(function (n) {
if (!n.start && n.sname) geocode(n.sname, function (p) { n.start = p; drawRoute(); });
if (!n.end && n.ename) geocode(n.ename, function (p) { n.end = p; drawRoute(); });
if (!n.start) {
var qs = n.saddr || n.sname;
if (qs) geocode(qs, function (p) { n.start = p; drawRoute(); });
}
if (!n.end) {
var qe = n.eaddr || n.ename;
if (qe) geocode(qe, function (p) { n.end = p; drawRoute(); });
}
});
})();
</script>