laoyang
|
1a67247407
|
v60b:所有弹框统一主题色描边环 + 编辑改居中弹框 + 修名册下拉回弹吃掉悬浮栏
1)9 个浮层统一描边环(抽组件,不复制 8 遍)
新增 components/FbSheetRing.ets:环宽 FB_RING_W=2 全工程唯一一处;
实现是"外层 Column 铺色 + padding",不是 border(border 画在盒子内侧);
外圆角 = 内圆角 + 环宽。简要卡/详情/编辑/日程详情/日程编辑/观影详情/影院/
日程设置/模块设置全部改用;各浮层的环色 = 所属模块的主题色。
2)编辑从"贴底满宽 + 只有上圆角"改成居中弹框
人员编辑与日程编辑:Stack 对齐改 Center,卡片 92% 宽 + 四角圆 + 环;
constraintSize 留在卡片自己身上(挪到外层会让内层 Scroll().layoutWeight
拿到 0 高度,资料区塌成一条线)。日程的日期时间选择弹层、两个删除确认框
一并套环,避免同一次交互里出现两种形态。
3)修名册下拉到头回弹后悬浮按钮消失
EdgeEffect.Spring 在越界松手后把内容弹回,每帧 offset>0 被当成"用户在往上滑"
⇒ 收起悬浮栏。判据 = 手指已抬起 + 最后一次方向是下滑 + 抬手不到 500ms;
拦截必须排在 offset >= HIDE_AT 快路径之前(回弹第一帧位移常 >= 12vp)。
4)真机截图暴露的两个观感问题(静态检查全绿也照错)
- Scroll().layoutWeight(1) 让短内容也撑满 maxHeight ⇒ 卡片空半屏
(日程详情/模块设置),改为 flexShrink(1);内容本来就长的浮层不动。
- 人员编辑"虚拟人物(还没弄清真实身份)"被卡片裁掉半句:两个小开关从
并排 Row 改为 Flex(wrap) 换行,间距改走 margin。
验证:ArkTS 守卫 444/0;反向验证 17/17;真机 _fb_v60b_verify.py 11/0,
且关掉回弹拦截重编重装后该用例确实变红(证明测试不是假绿);
9 个浮层逐个真机截图确认。
|
2026-10-19 08:29:44 +08:00 |
|
laoyang
|
7858de27e3
|
v0.8.4 简要卡观感 / 分享 / 名册搜索 / 全局返回手势(v59e)
八条需求的落地与真因:
1. 浮层与白底"糊在一起"、看不清 —— 根因不是配色,是**遮罩从来没画出来过**:
ArkUI 的八位色值是 #AARRGGBB(alpha 在前),而全应用写的是 '#00000066'
(本意"黑 40%")⇒ alpha = 0x00 ⇒ 全透明。同型还有 brand + '1A'(拼到了蓝通道)
与 shadow('#00000033')。⇒ 17 个文件统一改走 fbAlpha() / FB_MASK / FB_SHADOW /
FB_HAIRLINE;真机像素采样复验:遮罩 (148,146,140)、卡片白、浅底 (237,242,243)。
2. 简要卡外圈加**主题色描边环**(外层铺色 + padding,不是 border —— border 会被
内层圆角切出白缝)。
3. 简要卡**去掉删除按钮**,删除挪到完整详情卡最下面(Divider + 红字块)。
顺手修一处静默失败:confirmDelete() 原来只取 quickSource(),
从家谱直接开详情时 quickPerson 为 null ⇒ 点删除毫无反应。
4. 信息行间距 10 → 16(每行再各加 3vp 上下内边距,实测行距 134/118px)。
5. 主电话整行可点**直接拨号**(call.makeCall,落到系统拨号盘)。
6. 按钮改为 详情 / 编辑 / 分享 / 关闭;分享走系统分享面板,
内容为纯文本「姓名 / 电话 / 邮箱」三项(用户点名的就是这三项,
不多带单位),面板拉不起来时兜底复制到剪贴板并提示。
7. 名册搜索"完全不能用"有两个独立真因:
① 搜索框是 List 的第一个 item,无结果时整个 List 被空态替换 ⇒ 输入框被卸载、
焦点丢失 ⇒ 输不进第二个字。改:List 无条件渲染,空态自身做成 ListItem。
② rowToPerson 把 initials 写死成空串,服务端下发的拼音首字母从未落库 ⇒
拼音搜索恒 0 结果。改:FB_DB_VERSION 6→7 + PRAGMA 探测补列 + 同步时落库;
匹配同时遍历全部电话(原来只比主号)。
另加搜索框「清空」(24×24 命中区)。
8. 全局返回手势:应用是单页 + 模块分发、没有路由栈 ⇒ 自建 FB_BACK 登记表
(倒序询问)+ moduleHistory + applyModule()(不记历史,否则 A/B 两页来回弹)。
9 个页面登记/注销;Index.onBackPress 先关浮层 → 回上一模块 → 才 return false
交给系统退桌面(onBackPress 必须声明 boolean,返回 void 会被当成没接管)。
验证:
- 静态守卫 417 / 0(新增 ⑤阴影·描边·色环 ⑥透明度色 ⑦返回手势 ⑧搜索 ⑨分享)
- 反向验证 10 / 0(9 条注入全部能让守卫变红;其中"遮罩换纯黑"那条暴露了
一条存在型假绿,已改成数个数 + 禁止 Color.Black)
- 建表/迁移列一致性守卫 12 / 0
- 真机全模块遍历 14 / 14;真机逐项复核 12 / 0 与 7 / 0
工具侧顺带修好两个过期的探针:
- 遍历探针仍用"应用内横滑"打开抽屉,而该手势早已按用户要求去掉、入口改为顶栏图标
⇒ 一次全量遍历里 12 个模块全报"抽屉里没找到"(像应用坏了,其实是探针过期)。
- 资源/笔记两页写死了早已不存在的条目(户口本/房产证/阳台改造清单)⇒ 改成
结构性文案(副标题 + 常驻筛选胶囊),不随用户数据变化而恒红。
|
2026-10-18 23:12:57 +08:00 |
|
laoyang
|
412d2ae2f7
|
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],那是"注入没打到点上"。
|
2026-10-18 21:47:18 +08:00 |
|
laoyang
|
2132ee42d2
|
v0.8.0 本地加密 / 被踢清数据 / 增量同步 / 附件队列 / 顶栏同步进度
用户 2026-10-18 两条:
「直接做 L3 锁界面 + 本地加密(HUKS,踢设备即吊销密钥):数据在但读不出,
重登后恢复密钥即可用。」
「右上角头像和提醒前面加同步进度…首次全量、之后增量;进来先展示本地数据,
一边同步一边更新;附件后台队列同步(名册头像 / 电影海报 / 观影照片 / 资源附件)。」
① 整库加密(FbSchema v4→v5,新增 module_sync / attach_cache 两张表)
RDB encrypt=true。加密属性一经创建不可修改 ⇒ openWithEncryption 三段式:
直接开 → 失败删库重建 → 再失败降级明文(degraded 字段,设置页如实显示,
不静默降级)。
② 两层密钥(FbKeyStore)
HUKS 里 KEK(fb_kek_v1,不可导出)包裹 32 字节 DEK;revoke() 删 KEK
⇒ 已落盘附件密文在数学上解不开,这就是"踢设备即吊销密钥"。
重新登录重新生成 DEK 并重下附件(不做服务端托管,为了省一次重下
把能解你本地数据的密钥放到服务端不值)。
会话属性里 PURPOSE 只出现一次:原来把含 ENCRYPT|DECRYPT 的生成属性直接
拿去开会话再 push 一个 PURPOSE,同一 tag 出现两次在 HUKS 里行为未定义
⇒ 拆成 kekBaseProps / kekGenProps / kekSessionProps。
③ AES-256-GCM(FbCrypto)
落盘 iv(12)|ct|tag(16);变换串必须带 padding 段(AES256|GCM|PKCS7,
缺了抛 801);解密从尾部切 tag。
④ 附件后台队列(FbAttachQueue)
attach_cache 台账(pending/done/fail,MAX_TRIES=3);密文放 filesDir、
明文临时放 cacheDir;扩展名白名单筛 key。
图片地址收成统一入口 fbImageSrc(key,token):本地有就用 file://,
没有才回网络 —— 收成一个函数才漏不掉(5 个页面全部改过来)。
⑤ 被踢 / 退出清数据
lockOut → 清令牌 → FB_ATTACH.wipe(第一步就是吊销 KEK)→ FbDb.wipe
(先关句柄再 deleteRdbStore,并发去重,open 会等它)→ 同步状态复位。
重新登录后重建密钥 + 库 + 附件索引,否则之后只读网络不写缓存且不报错。
⑥ 增量同步(FbSyncAll 重写)
先问 /api/v1/changes;指纹相同就跳过。本地没水位必须拉(否则老用户升级后
一个模块都不同步);24h 陈旧上限兜"改无 updated_at 表的已有行";
/changes 拿不到时判 ping status>0 —— 断网直接收工,不退回全量
(否则 12 个模块各等 15 秒)。
家谱也进了预同步列表(原来只在打开时拉,离线是一片空白);
总步数由 CACHE_MODULES.length 算出,不写死。
⑦ 删除传播
服务端是物理删除、没有墓碑 ⇒ 观影同步改成"先清后插"
(persons 跨模块共用,不清)。
⑧ 顶栏同步进度
头像与铃铛之间加三态按钮(转圈 / 红感叹号 / 灰对勾)+ bindSheet 面板:
进度条、「N 个模块没有变化」、附件行、失败清单、立即同步(防连点)。
状态中心 FbSyncState(@ObservedV2 + @Trace,AppStorageV2 单例);
界面直接读 @Trace 字段,不提供派生 getter。
验证:hvigor BUILD SUCCESSFUL;_fb_arkts_guard.js 290/0(本批新增 59 条);
_fb_v58_falsify.py 31 项注入 38/0;b57 反向验证 12/0(锚点跟上本批 logout 改动);
本地 e2e 1519/0;全量流水线 PUSH_RC=0。
|
2026-10-18 16:01:41 +08:00 |
|
laoyang
|
776c95ba0b
|
v0.7.0 接上真实服务器:登录 / 设备会话 / 全量同步与各模块真实数据
从「演示数据壳子」走到「真的能连家里的服务器用」。
登录(用户 2026-10-17「完整的登录功能」)
· 首次启动先填服务器地址 → /api/v1/ping 自报门户(认得出"这地址上真是家书")
· 手机号或用户名 + 密码 → 拿令牌;失败提示统一,不泄露账号是否存在
· FbDeviceStore:首次启动生成并持久化设备 UUID(三方应用拿不到 UDID),
设备名取机型(marketName),并上报 platform / app_version
设备会话(v57,用户 2026-10-17)
· 一把令牌 = 一台设备的一条会话;每次启动打一次 /me(有网就验)
· 两种锁分开:need_login(401/被踢 → 清令牌)与 offline_expired
(离线超 24h → 只锁界面、不清数据、联网自动恢复)——
混成一种就会违背用户要的"一直联网就不用每天输密码"
· 运行期任何请求 401 → 网络层全局回调立刻锁定跳登录页(FbHttp 的 authProbe
让登录/校验类请求跳过,避免"两个地方同时跳登录页")
· 退出登录:先清本地令牌(主防线),再尽力通知服务端
· 设置页显示版本号与「这台设备」
数据层
· FbDb / FbSchema / FbParse / 各 Repo(日程 / 名册 / 观影 / 模块)+ FbSyncAll
· 首页改为服务端 /home(农历/节气/纪念日/生日/天气/统计/往年的今天)
· 日程页用 FbDayEventPanel,与网页端显示方式/红线/并排三处一致
验证:ArkTS 静态守卫 231/0;hvigor 编译 BUILD SUCCESSFUL(entry-default-signed.hap)。
|
2026-10-18 03:36:04 +08:00 |
|