地点输入:补地址联想,下拉带详细地址好区分同名地点 laoyang/FamilyBook#36

用户 2026-10-30:「在所有调用高德显示详细地址的地方…不能只把地点告诉我,
一定要把详细地址也放在后面。因为同一个地址可能有好几个,
我根本不知道应该选哪一个。」

网页端(addr_suggest.js)已经是这个行为,端上原本**连联想都没有**(纯文本框)。
本次把能力补到端上:

- 新增 FbGeoRepo.ets:调服务端 /api/v1/geo/tips,最少 2 字才查
- 新增 FbAddrInput.ets:候选每行两行字(地名 14px 深色 + 详细地址 12px 灰),
  同名地点靠第二行区分;防抖 260ms(与网页端同节奏);用 seq 丢弃过期响应
- 日程编辑、行程节点两处地点接入

🔴 走服务端代理而不是端上直连高德:高德 Web 服务 key 是服务端密钥,
打进安装包等于公开(反编译/抓包即得,配额会被跑光、key 可能被封)。
网页端用的 JS API key + 安全密钥是域名白名单那套,原生端没有等价机制。

⚠️ 必须是 @ComponentV2 组件而不是 @Builder:@Builder 的值类型参数
不参与状态观察(SDK r/quick-rules/05-state.md),候选列表/展开态写在
@Builder 里会数据变了界面不重建。本项目在 FbEventChip/FbTagChip/
FbCalOptionRow 上各踩过一次。

⚠️ 联想失败一律返回空候选 ⇒ 退化成普通文本框,手敲照常保存
(接口挂/没网/没配 key 都不能拖垮主流程)。

编译通过(33 tasks,17 executed)。
This commit is contained in:
2026-10-30 08:03:13 +08:00
parent f90cae0dcc
commit f4f27cea55
5 changed files with 343 additions and 5 deletions
+31
View File
@@ -690,6 +690,37 @@ export interface FbCalBook {
// 任务(tasks)
// ============================================================
/* ═══════════════════════════════════════════════════════════════
地址联想(高德输入提示,走服务端代理)
═══════════════════════════════════════════════════════════════ */
/**
* 一条地址联想候选(`GET /api/v1/geo/tips`)。
*
* 🔴 2026-10-30(工单 #36)用户原话:
* 「在所有调用高德显示详细地址的地方…不能只把地点告诉我,
* 一定要把详细地址也放在后面。因为同一个地址可能有好几个,
* 我根本不知道应该选哪一个。」
* ⇒ `detail` 就是那个"作为参考"的详细地址,**必须画在名字下面**。
*/
export interface FbGeoTip {
/** 地点名(如「星巴克(万象城店)」)—— 用户认的是这个名字 */
name: string;
/**
* 详细地址(省市区 + 门牌),**用来区分同名地点**。
* ⚠️ 纯行政区划条目高德不给 address,这时它就是省市区本身。
*/
detail: string;
/** 省市区 */
district: string;
/** 门牌 */
address: string;
/** 经度(字符串;没有时为空串) */
lng: string;
/** 纬度 */
lat: string;
}
/** 任务卡片(tasks/index.php 看板) */
export interface FbTaskItem {
id: number;