用户 2026-11-06 反馈(原话):
联系方式,这一句话去掉吧。网址这个地方应该跟邮箱一样,是有一个标签的。 如果现在没有,也跟邮箱一样,得有一个空的输入框。地址的格式应该跟上面的 邮箱、手机号保持一致。国家、省市、区县、详细地址这些东西,就放在那个 输入框里作为 prehold 就可以了。工作这个也去掉,直接写单位和职务; 其他也去掉,直接写座右铭就可以了。不需要分多级,就是一层。
拆成 4 条独立可验收的点:
entry/src/main/ets/components/FbPersonEditSheet.ets
this.section(...)
section()
urlField()
person_contacts
kind='url'
urlsOut()
addressField()
address
从名册列表点「编辑」时,传进来的是本地列表行 (FbPersonRepo.rowToPerson() 里 addrProvince/addrCountry/addrDistrict 写死成空、address 只等于 addr_city,contacts/jobs 是空数组)。 而服务端 Person::replaceContacts() / PersonJob::replace() 是整组替换 且无条件调用 ⇒ 用户随手改个姓名点保存,就会把这个人的 补充电话 / 补充邮箱 / 补充地址 / 网址 / 工作经历 / 生日附件 全部清空。
FbPersonRepo.rowToPerson()
addrProvince/addrCountry/addrDistrict
addr_city
contacts
jobs
Person::replaceContacts()
PersonJob::replace()
真机复现(person id=11 杨培振):
birth_rank
null
修复:
GET /people/<id>
applyDetail()
save()
await
hvigorw assembleHap
https://example.com/probe
kind=url, value=https://example.com/probe
is_placeholder
FbRosterPerson
7d7973a
#92
两码事:#1/#3 是服务卡片布局与观影卡片格数,本单是名册人员编辑表单的字段层级与数据写坏问题,文件、验收方式都不同
用户提的 4 条
顺带修的数据损坏(本轮验证时真机复现) 从名册列表点编辑 → 传进来的是本地列表行,缺 birth_rank / 完整地址 / contacts / jobs,而服务端 replaceContacts / PersonJob::replace 是整组替换 ⇒ 随手保存一次就清空。修法:编辑模式无条件补拉详情, 逐字段逐组只覆盖"用户没动过"的部分;save() 先 await 补拉任务; 未拿到权威值且没动过 ⇒ 不提交该字段。
replaceContacts
PersonJob::replace
编译:hvigorw assembleHap → BUILD SUCCESSFUL(8s)
BUILD SUCCESSFUL
真机(5NC0225B27004718)安装后走:名册 → 爸爸 → 详情 → 编辑
uitest dumpLayout
山东省 菏泽市 东明县 工业路与曙光路交叉口北200米信和家园2号楼3单元05005
url | "" | https://example.com/probe | 100
addr_province/city/district
commit:7d7973a(改动)+ cca83a8(补正确单号,前者的 #92 是笔误)
cca83a8
VARCHAR(200)
No dependencies set.
The note is not visible to the blocked user.
背景
用户 2026-11-06 反馈(原话):
拆成 4 条独立可验收的点:
改动
entry/src/main/ets/components/FbPersonEditSheet.etsthis.section(...)调用与section()构建器urlField():常驻「网址」标签 + 空输入框。服务端没有「主网址」列,取
person_contacts里kind='url'的第一条当主,提交时由urlsOut()拼回组首,数据形状不变、无需迁移
addressField(),placeholder = 「国家 省 市 区县 详细地址」address列 + 旧五级(保网页端住址下拉)address、五级清空(否则详情页会叠两遍)验证时抓到的数据损坏(一并修复)
从名册列表点「编辑」时,传进来的是本地列表行
(
FbPersonRepo.rowToPerson()里addrProvince/addrCountry/addrDistrict写死成空、
address只等于addr_city,contacts/jobs是空数组)。而服务端
Person::replaceContacts()/PersonJob::replace()是整组替换且无条件调用 ⇒ 用户随手改个姓名点保存,就会把这个人的
补充电话 / 补充邮箱 / 补充地址 / 网址 / 工作经历 / 生日附件 全部清空。
真机复现(person id=11 杨培振):
变成「菏泽市」
birth_rank从 2 变成null修复:
GET /people/<id>,几十毫秒)applyDetail()逐字段 / 逐组只覆盖「用户没动过」的部分(拿快照比对)save()先await补拉任务;未拿到权威值且用户没动过 ⇒ 该字段不提交(服务端"没传就沿用旧值")
contacts补两个提交条件:「原本有条目、现在删空」和「动过任意一组」,否则删掉仅有的那条网址永远删不掉
验证方式
hvigorw assembleHap通过https://example.com/probe→ 保存 →查库
person_contacts得kind=url, value=https://example.com/probe(1 条)山东省/菏泽市/东明县、
birth_rank仍是 2person_contacts该人 url 行数回到 0);birth_rank已复位遗留
is_placeholder(虚拟人物标记)不在端上FbRosterPerson里,编辑界面看不出谁是虚拟人物 —— 既有缺陷,未在本单处理
7d7973a的 message 里写的#92是笔误,实际对应本单为什么单独建单
两码事:#1/#3 是服务卡片布局与观影卡片格数,本单是名册人员编辑表单的字段层级与数据写坏问题,文件、验收方式都不同
已改
entry/src/main/ets/components/FbPersonEditSheet.ets用户提的 4 条
取
person_contacts中kind='url'第一条当主,提交时urlsOut()拼回组首addressField(),placeholder = 「国家 省 市 区县 详细地址」section()构建器一并删除)顺带修的数据损坏(本轮验证时真机复现)
从名册列表点编辑 → 传进来的是本地列表行,缺
birth_rank/ 完整地址 /contacts/jobs,而服务端replaceContacts/PersonJob::replace是整组替换 ⇒ 随手保存一次就清空。修法:编辑模式无条件补拉详情,
逐字段逐组只覆盖"用户没动过"的部分;
save()先 await 补拉任务;未拿到权威值且没动过 ⇒ 不提交该字段。
怎么验的
编译:
hvigorw assembleHap→BUILD SUCCESSFUL(8s)真机(5NC0225B27004718)安装后走:名册 → 爸爸 → 详情 → 编辑
uitest dumpLayout全表扫描:无「联系方式 / 地址 / 工作 / 其它」任一分组标题;「网址」有标签 + 空输入框;「地址」单框且回填的是
山东省 菏泽市 东明县 工业路与曙光路交叉口北200米信和家园2号楼3单元05005(不是残行「菏泽市」)
https://example.com/probe→ 保存 → 直查生产库person_contacts:url | "" | https://example.com/probe | 100,共 1 条address仍是完整住址、addr_province/city/district仍是山东省/菏泽市/东明县、
birth_rank仍是 2(无损)birth_rank(2 → null)已复位为 2commit:
7d7973a(改动)+cca83a8(补正确单号,前者的 #92 是笔误)遗留
is_placeholder(虚拟人物标记)不在端上FbRosterPerson里,编辑界面看不出谁是虚拟人物 —— 既有缺陷,未在本单处理
VARCHAR(200),超长会被服务端截断(未改表结构)