v75 旅程重构:列表页 + 详情整页,卡片改「图在上、信息在下」

用户 2026-10-21:
「每一个旅程里面的行程才是重头戏……点击一个旅程,应该进入到一个新的界面,
  在里面列出所有的行程,就跟网页版的一样。
  这个旅程的图片是比较重要的……图片在正上方,就是充满整个的这个列表的宽度。
  然后呢把这个标题还有其他的一些信息放在下面。如果是图片放左边,信息放右边的话,
  它总是被挤占,显示不全。……想看其他的这个旅程的话,直接往下滑就可以了。」

- 新建 `pages/trips/FbTripDetailPage.ets`(照 `trips/show.php`):题图 16:9 占满整宽、
  五项统计、行程按 计划/实际/未成行 三组(空组不显示)、页头两行动作区
  (+计划=蓝 / +实际=绿 / 编辑=黄 / 删除=红 / 设置)
- `FbTripsPage` 846→573 行:删掉就地展开全套,`tripCard` 改「题图在上、信息全在下面」
  卡尾「看行程」自己带 onClick,整卡也可点
- `Types.ets` `FbTripNode` 8→18 字段 + 四个新类型;`FbTripRepo` 新增
  `fetchTripDetail` / `fetchTripSummary` 与四个解析辅助
- 修真 bug:`parseNodes` 读 `expense_cent`,服务端写的是 `spent_cents`
  ⇒ 每段「💰 这一段花了」从来没显示过
- `Store.ets` 新增 `@Trace tripDetailId` 与 `leaveTo(parentKey)`:
  删完整趟回列表要走它(内部 `applyModule` 会 `resetScroll`),
  直接赋 `activeModule` 会让回列表后轻轻一滑就收起悬浮栏
- 接线:`Index` 分发 / `TopBar` 标题「旅程」/ `Modules.fbModuleColor` 归到 trips 色
- `FbTripNodeSheet` 新增 `@Param startStage` 预选阶段(选择器保留,点错还能改)

守卫 931/0,反向验证 164/0,编译 BUILD SUCCESSFUL,真机待设备连上后跑 _fb_v75_verify.py
This commit is contained in:
2026-10-22 00:07:16 +08:00
parent 6e7cdaf5fc
commit 3e2904cc3d
10 changed files with 1862 additions and 462 deletions
@@ -62,6 +62,17 @@ export struct FbTripNodeSheet {
@Param tripId: number = 0;
/** 模块主题色 */
@Param accent: string = '#3F7D5A';
/**
* 打开时预选的阶段:`'plan'` / `'actual'`。
*
* 🔴 v75(用户 2026-10-21):详情页右上角是**两颗**按钮
* 「+ 计划行程(蓝)」「+ 实际行程(绿)」(这是 v41 定下的硬要求),
* 点哪颗就该落在哪个阶段 —— 原来只有一颗「加一段行程」,
* 进来后阶段恒为「计划」,用户点"实际行程"还是要手动改一次。
* ⚠️ 浮层里那个「阶段」选择器**保留**:用户点错了还能改,
* 不能因为"入口已经指定了"就把选择器藏掉(那是把选择权拿走)。
*/
@Param startStage: string = 'plan';
@Event onClose: () => void = (): void => {};
/** 加成功后父页面重新拉节点 */
@@ -84,6 +95,8 @@ export struct FbTripNodeSheet {
aboutToAppear(): void {
// 默认今天(多数场景是"记刚刚发生的"或"排今天剩下的")
this.date = fbIsoOf(new Date());
/* 入口指定的阶段(详情页两颗按钮)—— 只认这两个值,别的一律按计划 */
this.category = this.startStage === 'actual' ? 'actual' : 'plan';
}
build() {
+5
View File
@@ -294,6 +294,11 @@ export struct FbTopBar {
if (k === '__account') {
return '个人设置';
}
/* 🔴 v75:旅程详情页顶栏还写「旅程」—— 它是旅程模块的**下一层**,
不是另一个模块。写成"旅程详情"会让标题在列表↔详情之间跳变。 */
if (k === '__trip_detail') {
return '旅程';
}
const m = fbModuleOf(k);
return m !== undefined ? m.name : '家书';
}