laoyang
|
f1f279f973
|
电影影评+评论:详情浮层接「评价与评论」真功能 laoyang/FamilyBook#27
用户原话(2026-10-28):「鸿蒙端对齐网页端」。观影详情原来只能看平均分。
现在:
1) FbMovieRepo 加影评/评论类型 + reviews/saveReview/deleteReview/
addReviewComment/deleteReviewComment 五个 API + 解析(含感受目录、评论树、mine 判断)
2) 新组件 FbMovieReviewSheet:我的影评(打分 1-10 星 + 观后感受多选 + 正文 +
改/删)、全部影评列表(含评论树、回复、逐条删除)
3) FbMovieDetailSheet 加「评价与评论」入口 + 内嵌影评浮层
⚠️ 影评数/均分仍以列表项为准(详情接口不返回,与既有注释一致)。
编译 BUILD SUCCESSFUL;服务端冒烟 _i27_movie_review_api.py 22/0 + 反证命中。
|
2026-10-28 22:30:09 +08:00 |
|
laoyang
|
c7bd26dd1b
|
v77 旅程:列表只留整卡入口 + 动作区改成 2×2 + 地址不截断 + 题图
用户 2026-10-22 的五条:
① 列表卡去掉「看行程」「编辑」——「点进去之后会有编辑,直接点进去
看行程就可以」。卡尾整行删除,整卡可点变唯一入口(标题行尾留一个 ›
作提示);openEdit() 一并删掉,不留死代码。
② 详情页动作区重排——「排列得不好看,乱七八糟的」。旧版是四颗彩色实心
胶囊分两行、右端对不齐。现在 ☰ 挪到标题行右侧,四颗动作做成 2×2
等宽(layoutWeight(1));主操作保持实心,编辑/删除改浅底同色字。
配色与顺序仍是 v41 硬要求,一个 hex 都没改。
③ 出行方式:十种方式**不能增删**(网页版也只是只读 + "常用信息",
而端上加行程表单里根本没有车次/车牌,那条备忘在端上无从使用)
⇒ 方向反过来,给加行程表单补上「车次/航班号」(火车/飞机/轮船/
公交/地铁)和「车牌」(自驾,从车辆库选一台,服务端按 vehicle_id
join 出车牌)。没有这两项,"出行方式"在端上就只剩一个图标。
④ 行程详情里的地址显示不全——「从哪到哪,如果地址特别长就显示不全」。
原来出发地与到达地挤在一条 Row 里各 maxLines(1) + 省略号;
改成「从」「到」上下两行、整段铺开不截断。
⑤ 旅程题图:端上原来根本没有上传链路(服务端只有观影的 poster 槽位)。
服务端已加 POST /trips/<id>/cover;端上新建/编辑浮层加 16:9 题图选区,
流程「先建 → 拿 id → 再传图」,传图失败记 id 再点只补传(不会建出
两趟一样的旅程)。详情页空题图那块也能直接点开去加。
顺带把 multipart 上传收敛成一份(data/FbUpload.ets):原来头像 / 海报 /
观影照片各抄了一遍,旅程题图会是第四份。
|
2026-10-22 10:15:03 +08:00 |
|
laoyang
|
8146aab1a7
|
v63+v64:影院管理补齐(v63)与观影「记一场」豆瓣/弹框选择(v64)
⚠️ 本提交含**两批**改动(同一批文件里交织,无法按文件拆开):
· v63(影院管理与搜索/统计/年报拆成平级入口)—— 本会话之外的工作,
随本轮一并提交以免工作区长期留半成品;
· v64(本会话,用户 2026-10-19 六条)。
v64 六条:
① 片名可经豆瓣自动获取简介与海报(与网页端同一份服务端输出:
summary 全文 + 已落盘的 poster_key);简介**只填空白的**,不覆盖用户写过的。
联想 320ms 防抖(与网页端同值)。
② 开始/结束改成**与日程同一个**日期时间选择控件 —— 新抽 components/FbDateTimeField.ets
(行 + 弹层 + 一组换算函数),日程那边旧的自绘实现整段删掉改用它
(用户要的就是"两处一样")。
③ 影院、同看人改成**弹框选择**:
· FbCinemaPickSheet:顶部搜索框,匹配「地方 + 名称」,「不记录影院」恒在列表;
· FbPersonPickSheet:顶部搜索框,拼音首字母**子序列**匹配(yyq 打成 yq 也能搜到),
多选走"暂存 + 确定"两段式(点一个不关窗)。
两排横向胶囊/头像全删(用户:"这种方式太难找了")。
④ 允许上传**多张**图片:海报 1 张 + 观影照片可一次选 9 张、可多次追加、可逐张删。
⚠️ 顺序是**先建记录再传图**(建记录失败就不会留孤儿图);图失败**不挡记录**。
⑤ 删掉「地点」输入口(location 字段仍发,网页端与历史数据不受影响)。
⑥ 观影页搜索框改明显:白底 + 实色描边 + 图标放大到 18 并染主题色 +
占位文字提到 muted/fontBody + 右侧「筛选 ›」暗示(用户:"根本看不清")。
FbMovieRepo 新增 doubanSuggest / doubanFetch / uploadPoster / uploadPhoto
(multipart 手写,与头像上传同一形态,抽成共用的 uploadOne)。
验证:静态守卫 636/0 · 端上反向验证 87/0 · 接口 e2e 57/0 · 服务端反向验证 18/0 ·
本地全量 e2e 1521/0 · hvigor 编译成功并已装机。
⚠️ 真机验证脚本 _fb_v64_verify.py 已写好(六条全覆盖),因设备锁屏未能执行。
|
2026-10-20 07:35:37 +08:00 |
|
laoyang
|
4a063114c5
|
v62:修 P0 登录被踢 / 关闭按钮统一右上角 / 观影三处 / 影院管理补齐 / 名册三处
用户 2026-10-19 第二批八条(原话逐条对应):
═══ ⑨ P0:「现在还是不稳定,会退出,提示:这台设备已经被退出登录,请重新登录。」
真因**是我 v61 自己埋的**:「个人设置」页(`FbAccountPage`)里两处 `fbApi`
调用**取了 `token` 变量却没传进请求选项** ⇒ 没有 Authorization 头 ⇒ 服务端 401
⇒ `FbHttp` 的全局回调 `unauthorizedCb` **清掉本地令牌 + 踢回登录页**。
而本页在 `aboutToAppear` 里就调它 ⇒ **点一下右上角头像,App 就退出登录**。
⚠️ 我上一轮把同一现象归因成"残留旧令牌 / 设备会话被顶掉"(还去线上查了
`api_tokens` 表,一切正常)—— **那个结论是错的**,等于把 bug 归给了环境。
修法(两处调用 + **两道架构防线**,缺一不可):
① 修两处调用,把 token 传进去;
② `fbApi` 内部:**本地有令牌、调用方又没传时自动补上**
(大部分接口本来就要鉴权,补上是"纠正";`/login`、`/ping` 带了也无害);
③ **401 只在"确实带了令牌"时才算被踢** —— 否则"没带令牌"也会触发全局清令牌,
那正是这次事故的机制。
═══ ④「你这个按钮到底是在弹框的右上角关闭,还是在下面关闭……全放在右上角。」
选**右上角 ✕**(底部已被 编辑/保存/删除 占满,再塞关闭会堆三四个按钮,分不清主操作)。
新增 `components/FbSheetClose.ets`:
· `FbSheetClose` —— 32vp 圆形 ✕(热区 40+,小图标在手机上点不中);
· `FbSheetTitleBar` —— 左标题 + 右收尾(设置类给 `confirmText` 显示「完成」)。
9 个浮层全接;名册详情 / 日程详情 / 简要卡**底部不再有「关闭」**。
⚠️ 浅色底走 `fbAlpha`,**不能拼 `+ '14'`** —— ArkUI 八位色是 `#AARRGGBB`
(本项目曾因写 `#00000066` 导致遮罩**从来没显示过**)。
═══ ①「观影……弹出的框左上角有一条灰色的线,不知道是什么。」
那是浮层顶部的**抽屉把手**(36×4 的 `line2` 浅灰短线)。本意是"可下拉关掉"的提示,
但 ① 它落在左上角、旁边没有文字;② 这个浮层的关闭本来就不靠下拉。
⇒ 用户认不出它 = 它没起作用,**删掉**(不改成居中 —— 那只是把灰线挪个位置)。
═══ ②「然后这个观影人的头像并没有带进来。」
同看人的 `FbAvatar` **漏传 `imageUrl`** —— 服务端 `Movie::attendees()` 本来就
`SELECT p.avatar`、端上 `parseAttendees` 也解析进了 `a.avatar`,
纯粹是**渲染时忘了用它** ⇒ 有头像的人也退化成色块。
⚠️ 与名册详情 2026-10-15 那个是同一个 bug(当时是 `FbPersonSheet` 漏传)。
═══ ③「点击这个图片呢,不能左右滑动看所有的这个图片。」
全屏查看器原来**只有底部「上一张/下一张」文字按钮**。现在整张大图左右滑翻页。
⚠️ 用 `.gesture(PanGesture(Horizontal))` 而不是 `SwipeGesture`:
`SwipeGesture` 要"快速划动"才识别,在有滚动容器的页面容易被先吃掉
(日程页实测:`gesture`/`priorityGesture` 都不触发)。`PanGesture` 看**累计位移**。
⚠️ 判定要求 `|dx| >= 40 && |dx| > |dy|`,否则竖划会被误判成翻页。
═══ ⑤「影院管理……增加影院呢、修改影院呢、高级搜索、统计、年度报告,这些全部都应该补充进去。」
端上原来**只有一个只读列表**(连"新增"都没有)。补成四个页签:
· **影院**:新增 / 修改 / 删除(服务端 CRUD 早就有,端上一直没接)+ 删除二次确认;
· **统计**:总览(看过/影院/人数/人次)+ 按影院/按年/按月的条形图;
· **搜索**:片名 / 影院 / 起止日期(条件全空时不查,与网页 `hasCond` 同行为);
· **年报**:按年切换(第一场/最后一场、最常去的影院、一起看最多的人、每月分布)。
⚠️ **统计/年报必须联网**(`/movies/stats|report`):口径要与网页**完全一致**
(同一份 `MovieStats`)。本地库算出来的是"已同步的那部分",
少同步一次就少一部 ⇒ 用户会发现"网页 124 部、App 121 部"。
⇒ 断网时明说"需要联网",而不是给一个偏低的数字。
⚠️ 影院写操作后**立刻回写本地库**(`refreshCinemas`),否则刚建的那家要等下次同步
才出现,看着像失败;并用 `INSERT OR REPLACE` 而非"清空再插"
(中途失败会留下一个空表 = 用户的影院列表整个消失)。
═══ ⑥「名册搜索,搜索后,下面有一个白色的框,什么内容都没有,删除。」
那是列表**末尾给悬浮栏留高度的占位块**(`height(FB_DOCK_RESERVE)`),
底色是 `FbColors.surface`(**白**)而列表容器是 `paper`(**米**)——
列表内容一短(搜索只剩一两条)它就露出来,看着像"什么都没有的白框"。
⇒ 改底色与列表同色。**不能删**:删了最后一张卡片会被悬浮栏压住。
═══ ⑦「如果一个人没头像,在列表是有一个文字的头像的,那么点击后弹框,也应该有。」
`FbAvatar` 原来是 `if/else`:有 `imageUrl` 就**只画 Image**,
而图片**加载失败时 `Image` 什么都不显示**(只露出纯色底)⇒ 看着是个光板。
(`alt()` 只在**加载中**起作用,失败后是空白。)
⇒ 改成**叠加**:底色 + 文字头像**常驻**,图片有就叠在上面
(加载成功即盖住文字,失败则自动露出文字头像)。
⚠️ 之前注释说"图层叠会错位"——那是因为当时想靠 Image 的 intrinsic size 撑尺寸;
现在两层都显式给 `dia`,尺寸来源唯一,不存在错位。
═══ ⑧「现在名册的列表太空了,应该显示更多内容,例如工作单位、职务。」
列表卡片加一行「单位|职务」(独立成行,避免与标签/生日挤)。
⚠️ 用 `persons.org` / `persons.title` 而**不是** `person_jobs`:
列表读的是**本地库**,而本地库只存 `persons` 那一行
(`person_jobs` 是一对多,端上没同步那张表)⇒ 服务端加了字段也到不了列表。
线上实测 801 人里 192 人有单位、48 人有职务,列表立刻有内容。
验证:
· 编译 BUILD SUCCESSFUL
· ArkTS 守卫 536/0(新增整组 groupV62,含 P0 两道防线)
· 反向验证 51/0(新增 13 条注入,逐条确认能变红)
· Schema 列守卫 12/0
· **真机 22/0**(6 组,含照片横滑 `1/5 → 2/5`、四个页签、点头像不被踢)
|
2026-10-19 15:27:31 +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 |
|