名册编辑表单:取消分组层级、网址补常驻输入框、地址合并为一个输入框 #4

Closed
opened 2026-11-06 04:41:11 +00:00 by laoyang · 1 comment
Owner

背景

用户 2026-11-06 反馈(原话):

联系方式,这一句话去掉吧。网址这个地方应该跟邮箱一样,是有一个标签的。
如果现在没有,也跟邮箱一样,得有一个空的输入框。地址的格式应该跟上面的
邮箱、手机号保持一致。国家、省市、区县、详细地址这些东西,就放在那个
输入框里作为 prehold 就可以了。工作这个也去掉,直接写单位和职务;
其他也去掉,直接写座右铭就可以了。不需要分多级,就是一层。

拆成 4 条独立可验收的点:

  1. 删掉「联系方式」分组标题
  2. 网址要有标签 + 常驻空输入框(与邮箱同版式)
  3. 地址五级(国家/省/市/区县/详细)合成一个输入框,层级写进 placeholder
  4. 删掉「工作」「其它」分组标题,字段平铺一层

改动

entry/src/main/ets/components/FbPersonEditSheet.ets

  • 删掉 4 处 this.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 杨培振):

  • 地址从「工业路与曙光路交叉口北200米信和家园2号楼3单元05005」
    变成「菏泽市」
  • 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 仍是 2
  • 测试网址已清理(person_contacts 该人 url 行数回到 0);birth_rank 已复位

遗留

  • is_placeholder(虚拟人物标记)不在端上 FbRosterPerson 里,
    编辑界面看不出谁是虚拟人物 —— 既有缺陷,未在本单处理
  • commit 7d7973a 的 message 里写的 #92 是笔误,实际对应本单

为什么单独建单

两码事:#1/#3 是服务卡片布局与观影卡片格数,本单是名册人员编辑表单的字段层级与数据写坏问题,文件、验收方式都不同

## 背景 用户 2026-11-06 反馈(原话): > 联系方式,这一句话去掉吧。网址这个地方应该跟邮箱一样,是有一个标签的。 > 如果现在没有,也跟邮箱一样,得有一个空的输入框。地址的格式应该跟上面的 > 邮箱、手机号保持一致。国家、省市、区县、详细地址这些东西,就放在那个 > 输入框里作为 prehold 就可以了。工作这个也去掉,直接写单位和职务; > 其他也去掉,直接写座右铭就可以了。不需要分多级,就是一层。 拆成 4 条独立可验收的点: 1. 删掉「联系方式」分组标题 2. 网址要有标签 + 常驻空输入框(与邮箱同版式) 3. 地址五级(国家/省/市/区县/详细)合成一个输入框,层级写进 placeholder 4. 删掉「工作」「其它」分组标题,字段平铺一层 ## 改动 `entry/src/main/ets/components/FbPersonEditSheet.ets` - 删掉 4 处 `this.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 杨培振): - 地址从「工业路与曙光路交叉口北200米信和家园2号楼3单元05005」 变成「菏泽市」 - `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` 仍是 2 - 测试网址已清理(`person_contacts` 该人 url 行数回到 0);`birth_rank` 已复位 ## 遗留 - `is_placeholder`(虚拟人物标记)不在端上 `FbRosterPerson` 里, 编辑界面看不出谁是虚拟人物 —— 既有缺陷,未在本单处理 - commit `7d7973a` 的 message 里写的 `#92` 是笔误,实际对应本单 --- ### 为什么单独建单 两码事:#1/#3 是服务卡片布局与观影卡片格数,本单是名册人员编辑表单的字段层级与数据写坏问题,文件、验收方式都不同
Author
Owner

已改

entry/src/main/ets/components/FbPersonEditSheet.ets

用户提的 4 条

  1. 删掉「联系方式」分组标题
  2. 网址加常驻「网址」标签 + 空输入框(与邮箱同版式);服务端无「主网址」列,
    取 person_contacts 中 kind='url' 第一条当主,提交时 urlsOut() 拼回组首
  3. 地址五级合成一个 addressField(),placeholder = 「国家 省 市 区县 详细地址」
  4. 删掉「工作」「其它」两个分组标题,字段全平铺(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(无损)
  • 清理:测试网址已 DELETE,该人 url 行数回到 0
  • 修复过程中被写坏的 birth_rank(2 → null)已复位为 2

commit:7d7973a(改动)+ cca83a8(补正确单号,前者的 #92 是笔误)

遗留

  • is_placeholder(虚拟人物标记)不在端上 FbRosterPerson 里,
    编辑界面看不出谁是虚拟人物 —— 既有缺陷,未在本单处理
  • 地址列是 VARCHAR(200),超长会被服务端截断(未改表结构)
## 已改 `entry/src/main/ets/components/FbPersonEditSheet.ets` **用户提的 4 条** 1. 删掉「联系方式」分组标题 2. 网址加常驻「网址」标签 + 空输入框(与邮箱同版式);服务端无「主网址」列, 取 `person_contacts` 中 `kind='url'` 第一条当主,提交时 `urlsOut()` 拼回组首 3. 地址五级合成一个 `addressField()`,placeholder = 「国家 省 市 区县 详细地址」 4. 删掉「工作」「其它」两个分组标题,字段全平铺(`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(无损) - 清理:测试网址已 DELETE,该人 url 行数回到 0 - 修复过程中被写坏的 `birth_rank`(2 → null)已复位为 2 commit:`7d7973a`(改动)+ `cca83a8`(补正确单号,前者的 #92 是笔误) ## 遗留 - `is_placeholder`(虚拟人物标记)不在端上 `FbRosterPerson` 里, 编辑界面看不出谁是虚拟人物 —— 既有缺陷,未在本单处理 - 地址列是 `VARCHAR(200)`,超长会被服务端截断(未改表结构)
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: laoyang/FamilyBook_harmonyos#4