v0.8.3 头像显示 / 主题色标签 / 右侧贴边 / 简要卡片 / 浮层分离
用户 2026-10-18 第二批五条: ①「右上角的个人头像没显示。」 🔴 真根因:`/me` 与 `/login` 返回的 `avatar_url` 是**相对地址** (`media.php?k=avatars%2Fxxx.jpg` —— 不带域名、不带令牌), 那是给**浏览器**用的(同源 + cookie);`Image()` 要完整 URL ⇒ 加载失败。 真机日志:`GetAsset failed: media.php?k=avatars%2F20261002_...jpg` ⇒ 新增 `fbMediaUrl(raw, token)` 归一化,**三种形态都认** (绝对地址 / media.php 相对式 / 裸 key)—— 少认一种就会出现 "有的头像能显示、有的不能",那类 bug 最难查。 ⚠️ 不能复用 `fbImageSrc()`:那是"附件 key → 本地缓存"的通道, 把整条 URL 当 key 传进去会得到一个必然 404 的地址。 ②「名册、家谱这两个标签,用的不是主题色。」 🔴 两个调用点**各硬编码 `'#A84A28'`**(品牌砖红),而名册模块主题色是 `#4A7C82`(青)⇒ 与整页不在一个色系。 ⇒ `segBtn` 不再由调用方传色,内部取 `fbThemeVars(fbModuleOf('people').color).brand`; 顺手消掉"两处各写一遍字面量"这个漂移源。 ③「名册列表,左侧有空隙了……怎么右侧不是呢?右侧还是紧贴屏幕。」 🔴 实测(像素扫描):左米色 50~72px、**右米色 0px**。 根因是 `Row` 内 `layoutWeight(1)` 的子项默认 `min-width: auto` (按内容最小宽度)⇒ 长名字/多标签把**卡片布局盒撑破** ⇒ 右边越界贴屏幕 (左边先被 margin 占位、所以还留着空隙)。 ⇒ 弹性子项开 `flexShrink(1)`,姓名那行连同 `width('100%')`。 ④「点击列表,不打电话了,容易误触。而是弹出一个卡片,卡片中是头像、名称、 电话号码、邮箱等简要信息,下面三个按钮,详情、编辑和删除。…… 列表页面中,也不要详情按钮了。」 ⇒ 新建 `FbPersonQuickSheet`(@ComponentV2): 头像 / 姓名+称谓 / 电话(主号 + 其他)/ 邮箱 / 单位 / 生日 + 三个等宽按钮「详情 / 编辑 / 删除」。 ⇒ 点整行走 `openQuick()`(**不再拨号**);列表里的「详情」按钮**删除**。 ⇒ 删除走 `AlertDialog` **二次确认**(服务端物理删除、无回收站 ⇒ 误触不可逆), 文案带姓名("确定把「老杨」…")—— 误触时最需要"是不是点错了人"这个信息。 ⚠️ 两级浮层分开两个状态(`quickPerson` / `detailPerson`);详情关掉**回到简要卡**, 而不是一路退回列表。 ⑤「这个卡片,弹出来之后,是白色的,和下面的列表中的白色,都融合在一起, 根本看不出是弹框。」 🔴 原来只靠 `#00000066` 遮罩区分 —— 而本应用**列表本身就是大面积白底**, 白卡压在"被压暗的白"上边界仍发飘。 ⇒ **三层分离**:① 遮罩(宿主)② 卡片**阴影**(抬起来)③ 极浅**描边** (同色背景上仍有一条可见界线;只靠阴影在浅底上不够稳)。 ⚠️ 三个浮层(简要卡 / 详情 / 编辑)**同手段** —— 否则从简要卡切到编辑会突然"变平"。 验证:hvigor BUILD SUCCESSFUL;_fb_arkts_guard.js 377/0(新增 28 条, 另修 3 条旧判据);_fb_v59c_falsify.py 16 项注入 ⇒ 16/0。 ⚠️ 本轮反向验证又抓出 2 条假绿 + 1 条"没真注入",已逐条收紧(记入 pitfalls): · `flexShrink(1)` 在本页有**两处**(姓名 Text / 整个 Column)⇒ "出现过"型判据 删掉关键那处仍绿;改成锚"相邻关系"(`.layoutWeight(1)` 之后 220 字符内); · `showAlertDialog` 被 `if (false)` 包起来(确认框永不弹)⇒ 字符串还在、判据仍绿; 改成查因果(窗口内有 `value: '删除'` + `this.doDelete(who)`); · 有一条注入只改了注释、没删那行代码 ⇒ 报 [MISS],那是"注入没打到点上"。
This commit is contained in:
@@ -26,6 +26,7 @@ import { FbPersonSheet } from './FbPersonSheet';
|
||||
// `FB_TOKEN_STORE` 在 **FbTokenStore.ets** 里(不是在 FbDeviceStore)。
|
||||
import { FbPersonRepo, FbRosterPerson } from '../data/FbPersonRepo';
|
||||
import { FB_TOKEN_STORE } from '../data/FbTokenStore';
|
||||
import { fbMediaUrl } from '../data/FbHttp';
|
||||
import { syncAll } from '../data/FbSyncAll';
|
||||
import { BusinessError } from '@kit.BasicServicesKit';
|
||||
import { hilog } from '@kit.PerformanceAnalysisKit';
|
||||
@@ -221,9 +222,21 @@ export struct FbTopBar {
|
||||
color: this.app.session.me.avatarColor,
|
||||
dia: 32,
|
||||
fontSizeVp: 14,
|
||||
imageUrl: this.app.session.me.avatarUrl !== undefined
|
||||
? this.app.session.me.avatarUrl
|
||||
: ''
|
||||
/* 🔴🔴 v59c(用户 2026-10-18):「右上角的个人头像没显示。」
|
||||
*
|
||||
* 真根因:`/me` 与 `/login` 返回的 `avatar_url` 是
|
||||
* **相对地址**(`media.php?k=avatars%2Fxxx.jpg` —— 不带域名)——
|
||||
* 那是给浏览器用的(同源 + cookie),而 `Image()` 要完整 URL
|
||||
* ⇒ 直接加载失败。真机日志:`GetAsset failed: media.php?k=...`
|
||||
*
|
||||
* ⇒ 用 `fbMediaUrl()` 归一化成本机可访问的完整地址
|
||||
* (它同时认"绝对地址 / media.php 相对式 / 裸 key"三种形态)。
|
||||
*
|
||||
* ⚠️ 不要用 `fbImageSrc()`(那是给**附件 key** 用的,走本地缓存):
|
||||
* 这里拿到的是 URL,不是 key —— 传进去会把整条 URL 当 key 编码,
|
||||
* 变成必然 404 的地址。
|
||||
*/
|
||||
imageUrl: fbMediaUrl(this.myAvatarRaw(), FB_TOKEN_STORE.get())
|
||||
})
|
||||
}
|
||||
.width(40)
|
||||
@@ -307,6 +320,19 @@ export struct FbTopBar {
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* 我的原始头像地址(服务端给的那个,可能是相对式)。
|
||||
*
|
||||
* ⚠️ 单独抽成方法而不是在组件参数里写三目:`@Builder`/组件参数的括号里
|
||||
* 塞多行表达式会让 ArkTS 编译器解析错乱(本项目踩过,报的却是无关的
|
||||
* `comma operator` / `standalone this`)。
|
||||
*/
|
||||
private myAvatarRaw(): string {
|
||||
return this.app.session.me.avatarUrl !== undefined
|
||||
? this.app.session.me.avatarUrl
|
||||
: '';
|
||||
}
|
||||
|
||||
/**
|
||||
* 打开「我」的详情浮层(点右上角头像触发)。
|
||||
*
|
||||
|
||||
Reference in New Issue
Block a user