v0.8.2 头像点进我的详情 / 未读数接真实数据 / 名册圆角卡(容器要换成页面底色)
用户 2026-10-18 夜三条: ①「右上角,显示的应该是登录者的头像,点击头像进入我的详情页面。」 头像**本来就是登录者本人的**(v59 已接 session.me.avatarUrl); 真正缺的是**点击** —— TopBar 里那个 FbAvatar **根本没有 onClick**, 只有一句写着"点开账号菜单"的注释,而"账号菜单"这个东西在代码里并不存在。 ⇒ 接 openMyDetail() → bindSheet 弹 FbPersonSheet(复用名册那个人详情组件)。 🔴 数据必须走 repo.byId(meId)(本次为它新增 byId),不能从名册列表那批里找: **"我"常常不在自己的名册里**(名册是"我挑出来的那一小撮"), 从列表里查会**静默落空**、点了没反应 —— 最难查的那种失败。 ⚠️ 三种状态都说清楚:加载中 / 拿到了 / 拿不到,绝不留空白浮层。 ②「提醒按钮,明明没提醒,怎么还显示个 2?」 🔴 真根因:`@Trace unread: number = 2;` 是**写死的占位初值**, 而全工程只有一处给它赋值(通知页「全部已读」清 0)。 没进过通知页的人**永远看到 2**;进了通知页又"永远 0"(把真实未读也盖掉) —— 两个方向都错。 ⇒ ① 初值改 0(拿到真值前必须是"没有未读",不能凭空多出 2); ② 首页把 /home 的真实 unread 写进全局状态。 (服务端 Notification::unreadCount,与通知页同源;/home 本来就返回它、 FbParse 也早就解析了 —— 只是**没人往全局状态里写**。) ③「名册页面,不好看,太丑了,应该是每个人都是圆角矩形,往中间收一点, 距离左右都有点距离,每个人中间都有一点空隙。」 🔴🔴 真凶**不是卡片形状**(v51 就做了 borderRadius + margin)—— 而是**列表容器也是纯白** ⇒ 白卡压白底 ⇒ 圆角与左右收边**全看不见**, 看上去就是一整块通栏白。这解释了"改过一轮还是丑":上次改的是卡片, 问题在"背景没有对比"。 ⇒ 容器 + 外层兜底改 FbColors.paper(页面底色),卡片保持白; 圆角 radiusS(10) → 新增 radiusCard(14)(列表项专用档:16 显胖、10 显方); 左右各 pagePad(16)、卡间 10(原 8 偏挤)、行内边距 11→12。 验证:hvigor BUILD SUCCESSFUL;_fb_arkts_guard.js 347/0(本批新增 18 条, 另**收紧 2 条**旧判据 —— M 组"圆角卡"那条原来锚"逐字相邻两行"、且**测错了对象**: 没查容器背景,所以对"白卡压白底"这个真实缺陷毫无把关能力); _fb_v59b_falsify.py 8 项注入 ⇒ 8/0。 ⚠️ 本轮反向验证头一轮漏了 3 条(都是"判据太宽"),已逐条收紧并记入 pitfalls: · 删掉头像 onClick 后仍绿 —— openMyDetail 这个标识符在**方法定义**里也出现; · 容器改回白底后仍绿 —— 本页有**两处** FbColors.paper(容器 / 兜底); · /home unread 改成写死 2 后仍绿 —— Notification::unreadCount 在 PHP 里也有两处。
This commit is contained in:
@@ -509,6 +509,37 @@ export class FbPersonRepo {
|
||||
return out;
|
||||
}
|
||||
|
||||
/**
|
||||
* 按 id 取**一个人**(名册里那份,非详情接口)。
|
||||
*
|
||||
* 🔴 v59(用户 2026-10-18):「点击头像进入我的详情页面。」
|
||||
* 头像点开的是**当前登录者自己**的详情,而"我"**不一定在自己的名册里** ——
|
||||
* 名册筛的是"我挑出来的那一小撮",本人常常不在其中。
|
||||
* 不加这个查询,"点头像 → 详情"就会**静默没有任何反应**(`rawById` 里查不到)。
|
||||
*
|
||||
* ⚠️ 与 `list()` 的差别只有两点:不 JOIN `person_roster`(不要求"在我名册里"),
|
||||
* 以及带 `kind='member'`(排除观影那边可能写进来的非成员行)。
|
||||
* 字段清单必须与 `list()` **完全一致**,否则 `rowToPerson` 会读出 undefined
|
||||
* (它按列名取值)⇒ 到头来没人看得懂为什么"详情里少了几行"。
|
||||
*/
|
||||
async byId(id: number): Promise<FbRosterPerson | null> {
|
||||
if (id <= 0) {
|
||||
return null;
|
||||
}
|
||||
const sql: string =
|
||||
'SELECT p.id, p.name, p.nickname, p.gender, p.birthday, p.avatar, p.avatar_color,' +
|
||||
' p.note, p.email, p.org, p.title, p.slogan, p.addr_city,' +
|
||||
' 0 AS sort_order, NULL AS phones,' +
|
||||
' (SELECT GROUP_CONCAT(t.tag, "\\u0001") FROM person_tags t' +
|
||||
' WHERE t.person_id = p.id) AS tags' +
|
||||
' FROM persons p WHERE p.id = ? LIMIT 1';
|
||||
const rows: FbRow[] = await this.db.queryRows(sql, [id]);
|
||||
if (rows.length === 0) {
|
||||
return null;
|
||||
}
|
||||
return this.rowToPerson(rows[0]);
|
||||
}
|
||||
|
||||
/**
|
||||
* 读名册的元信息(人 + 标签云 + 我的 id)。
|
||||
*
|
||||
|
||||
Reference in New Issue
Block a user