品牌改名:家书 → 岁月家 (laoyang/FamilyBook#38)
## 起因 用户 2026-11-01:「家书已经有人做了,八月份刚上线的」。 核实:「家书 HomeBook」(广州家书科技有限责任公司,粤ICP备2026096420号, 2026-06 成立、08 上线)。功能**部分重合**(家庭记录 + 相册 + 家谱)。 华为审核指南 1.3「应用名称不得和其他应用名称相同,避免混淆」, 虽然个人与企业主体查重不互通、技术上能过,但被人工驳回概率高。 ## 定名过程(用户逐个否掉) | 候选 | 否决原因 | |---|---| | 寸草 | — | | 家卷 | ❌ 与「家眷」同音,口头传播会打错字 | | 家时光 | ❌ App Store 已有「家·时光」定位几乎一致;且「家+时光」是常见组合,辨识度低 | | 家纪 | ❌ 已有重名 | | **岁月家** | ✅ 搜不到同名应用;是口号的直接展开(岁月 + 家) | ## 最终定稿(用户明确指定) ``` 应用名 岁月家 主标语 一家人用岁月写成的一本书 ← 不变 一句话简介 一家人用岁月写成的一本书 ← 改为与标语相同 官网标题 岁月家 · 一家人用岁月写成的一本书 英文名 FamilyBook ← 不变 包名 familybook.yangyq.net ← 不变 ``` ## 改动范围(17 + 18 处,12 个文件) ### 应用名(17 处) `AppScope/resources/base/element/string.json` 的 app_name, `entry/.../string.json` 的 16 条(应用名、卡片名、无障碍描述)。 ### 用户可见文案(18 处) `FbBackgroundSync` / `EntryAbility`「正在同步家书数据」、 `FbAttachOpen`「家书附件」相册名、`FbHttp` 地址校验失败提示、 `FbCardData` / `FbCardMediaData` 卡片空态「先在「家书」里填写服务器地址」、 `TopBar` / `Drawer` / `FbLoginPage` 的应用名文本、`FbSettingsPage` 的说明。 ## 刻意不改 - **包名 / bundleName**(用户明确要求不变,且改了等于换一个应用) - **英文名 FamilyBook**、目录名、仓库名(改了会让 git 历史、部署脚本、证书路径全跟改) - **代码注释**里 200+ 处「家书 FamilyBook · 某模块」—— 不影响运行时, 改了只会制造噪音 diff,让将来 blame 变难 - **主标语**里一个字都没动 ## 验证 ### 编译 `BUILD SUCCESSFUL`,33 tasks。 ### 产物实测 解包 `.hap` 的 `resources.index`: - 「岁月家」出现 **17** 次 - 「家书」出现 **0** 次 ### 全局一致性校验(31 项全过) `_tooling/check_rename.js`: - 客户端 app_name / EntryAbility_label / 产物内容 - .ets 用户可见文案无残留(排除注释) - 服务端非注释代码无残留 - `Auth::homeTitle()` 用「某某某的家庭岁月」 - `DEFAULT_SLOGAN` 未被改动 - 官网线上 5 个页面无「家书」、标题含岁月家、渲染后 h1 是品牌名 - 材料 app_name / 一句话简介 / 包名 / versionCode / 域名 ⚠️ 校验过程中我自己的判据出了 2 次假红: ① 注释识别不全(漏了 `/**` 单行块注释和 `<!--` HTML 注释)→ 补齐 isCommentLine ② 「为什么叫岁月家」整节重写后,旧断言还在查「书信」「家与书」 (那是**旧名字**的逻辑)→ 改成查「岁月」+「家」的拆解 ## 一处语义决策(问过用户) 网页端 `Auth::homeTitle()` 生成「某某某的家书」—— 这是**产品核心语义** (每个家有自己的那一本),直接换成品牌名会读成「某某某的岁月家」,不通。 用户定:改成 **「某某某的家庭岁月」**。 兜底(无姓名时)仍用品牌名「岁月家」。 ## 连带影响(不阻塞) - 上架材料 7 个文件已同步(含软著全称改为「岁月家家庭生活档案管理软件」) - 官网已部署,线上标题已是新名字 - 软著申请尚未提交 —— 正好一次写对新名字,不需要变更
This commit is contained in:
@@ -2,7 +2,7 @@
|
||||
"string": [
|
||||
{
|
||||
"name": "app_name",
|
||||
"value": "家书"
|
||||
"value": "岁月家"
|
||||
}
|
||||
]
|
||||
}
|
||||
+14
-14
@@ -1,4 +1,4 @@
|
||||
# 家书 · APP 备案填报材料(阿里云)
|
||||
# 岁月家 · APP 备案填报材料(阿里云)
|
||||
|
||||
> **备案类型**:新增 APP(在你的既有主体下「新增服务」)
|
||||
> **接入商**:阿里云(服务器 IP `47.104.72.161`,主机名 `yangyq`,位于阿里云中国大陆节点)
|
||||
@@ -47,7 +47,7 @@
|
||||
|
||||
> 💡 个人主体管控比企业严:**类目只能选"无经营类目"**(工具、记事本之类),
|
||||
> **不能**选电商、金融、医疗、教育、资讯、直播这些需要前置审批的。
|
||||
> 家书正好是工具类,无缝符合。
|
||||
> 岁月家正好是工具类,无缝符合。
|
||||
|
||||
---
|
||||
|
||||
@@ -55,19 +55,19 @@
|
||||
|
||||
| 字段 | 填写内容 | 备注 |
|
||||
|---|---|---|
|
||||
| **APP 名称** | `家书` | ⚠️ 必须与**应用商店上架名称、桌面显示名称、软著名称**完全一致 |
|
||||
| **APP 名称** | `岁月家` | ⚠️ 必须与**应用商店上架名称、桌面显示名称、软著名称**完全一致 |
|
||||
| **APP 图标** | 用 `图标/app_icon_1024.png` | 1024×1024 正方形,无水印。备案系统要求清晰方图 |
|
||||
| **APP 首页截图** | 首页(今日概览)截图 | ⚠️ **只放首页**,不能出现广告/充值/付费任何入口 |
|
||||
| **内容分类** | `生活服务` → `工具` | 个人主体可选的合规类目 |
|
||||
| **APP 语言** | `简体中文` | |
|
||||
| **是否对外提供 SDK 服务** | **否** | 家书不对外提供 SDK |
|
||||
| **是否对外提供 SDK 服务** | **否** | 岁月家不对外提供 SDK |
|
||||
| **使用的三方 SDK** | 见下方「三方 SDK 说明」 | 选填,但建议如实填 |
|
||||
| **APP 全部后台服务域名** | `family.yangyq.net` | 只填域名主体部分,不填 `https://`、不带 `www` |
|
||||
| **服务器所在地** | `山东省`(或服务器实际机房省份) | ⚠️ 填**备案服务器的机房省份**,不是你家所在地。阿里云控制台实例详情里有「地域」,如「华北2(北京)」就填北京 |
|
||||
|
||||
### 三方 SDK 说明(如系统要求填)
|
||||
|
||||
家书**不含任何第三方统计/广告/推送 SDK**。用到的都是鸿蒙系统内置能力,按备案系统口径可填:
|
||||
岁月家**不含任何第三方统计/广告/推送 SDK**。用到的都是鸿蒙系统内置能力,按备案系统口径可填:
|
||||
|
||||
```
|
||||
无第三方 SDK。
|
||||
@@ -143,7 +143,7 @@ grep bundleName ~/code/FamilyBook_harmonyos/AppScope/app.json5
|
||||
备案系统会让你填「互联网信息服务备注 / 服务内容详细说明」。**照下面填**:
|
||||
|
||||
```
|
||||
家书是一款供家庭内部使用的个人生活档案管理工具,不面向公众提供信息服务,
|
||||
岁月家是一款供家庭内部使用的个人生活档案管理工具,不面向公众提供信息服务,
|
||||
不含社交、新闻资讯、电商交易、直播、金融理财等功能。
|
||||
|
||||
主要功能:家庭成员记录日程与待办事项、记录家庭纪念日、记录观影与旅行经历、
|
||||
@@ -205,13 +205,13 @@ grep bundleName ~/code/FamilyBook_harmonyos/AppScope/app.json5
|
||||
|
||||
---
|
||||
|
||||
## 八、软著问题:目前没有「家书」软著
|
||||
## 八、软著问题:目前没有「岁月家」软著
|
||||
|
||||
### 现状核实
|
||||
|
||||
你名下有 6 项软著(`memory/profile/05-软著.md`):
|
||||
|
||||
| 软件名称 | 登记号 | 与家书有关? |
|
||||
| 软件名称 | 登记号 | 与岁月家有关? |
|
||||
|---|---|---|
|
||||
| 渤海生态系统关键要素存储管理系统 | 2025SR2443329 | ❌ 无关 |
|
||||
| 渤海生态系统关键要素时空检索系统 | 2025SR1286975 | ❌ 无关 |
|
||||
@@ -220,7 +220,7 @@ grep bundleName ~/code/FamilyBook_harmonyos/AppScope/app.json5
|
||||
| 海洋大数据云服务平台任务调度系统 | 2021SR0710102 | ❌ 无关 |
|
||||
| 海洋大数据云服务平台 | 2021SR0401836 | ❌ 无关 |
|
||||
|
||||
**结论:没有「家书」的软著。**
|
||||
**结论:没有「岁月家」的软著。**
|
||||
|
||||
### 影响与对策
|
||||
|
||||
@@ -241,12 +241,12 @@ grep bundleName ~/code/FamilyBook_harmonyos/AppScope/app.json5
|
||||
> ⚠️ 免责函不是永久通行证。华为可能要求"后续补交软著"。个人开发者用免责函过审是常见做法,
|
||||
> 但不是 100% 保证,看审核员。
|
||||
|
||||
**路线 B:申请「家书」软著(稳,约 1–3 个月)**
|
||||
**路线 B:申请「岁月家」软著(稳,约 1–3 个月)**
|
||||
|
||||
| 项 | 说明 |
|
||||
|---|---|
|
||||
| 渠道 | 中国版权保护中心 https://www.ccopyright.com.cn |
|
||||
| 名称 | 建议与商店名一致:**家书家庭生活档案管理软件**(软件全称含"家书",简称"家书") |
|
||||
| 名称 | 建议与商店名一致:**岁月家家庭生活档案管理软件**(软件全称含"岁月家",简称"岁月家") |
|
||||
| 材料 | 源代码前后各 30 页(共 60 页)+ 用户手册 + 申请表 + 身份证 |
|
||||
| 费用 | 官方登记免费(自行申请);加急/代办另计 |
|
||||
| 周期 | 普通 **30–60 个工作日**;加急可缩到几天(要钱) |
|
||||
@@ -259,7 +259,7 @@ grep bundleName ~/code/FamilyBook_harmonyos/AppScope/app.json5
|
||||
|
||||
```
|
||||
华为后台应用名称 = 桌面显示名 = (将来)软著上的软件名称简称
|
||||
家书 = 家书 = 家书
|
||||
岁月家 = 岁月家 = 岁月家
|
||||
```
|
||||
|
||||
不一致是高频驳回点,改名成本极高(应用名上架后基本改不了)。
|
||||
@@ -272,7 +272,7 @@ grep bundleName ~/code/FamilyBook_harmonyos/AppScope/app.json5
|
||||
- ☐ `family.yangyq.net` 的 **ICP 网站备案**已完成(若未做,同订单一起提)
|
||||
- ☐ 已拿到**正式发布证书**,已提取公钥与 MD5(MD5 **已去冒号**)
|
||||
- ☐ 包名确认为 `familybook.yangyq.net`
|
||||
- ☐ APP 名称填「家书」,与商店一致
|
||||
- ☐ APP 名称填「岁月家」,与商店一致
|
||||
- ☐ 图标是 1024×1024 正方形,无水印
|
||||
- ☐ 首页截图**不含**金额/真实姓名/手机号/广告/充值入口
|
||||
- ☐ 内容分类选 **生活服务 → 工具**
|
||||
@@ -302,7 +302,7 @@ grep bundleName ~/code/FamilyBook_harmonyos/AppScope/app.json5
|
||||
|
||||
| 驳回原因 | 怎么避免 |
|
||||
|---|---|
|
||||
| APP 名称与商店/桌面名称不一致 | 三处统一「家书」 |
|
||||
| APP 名称与商店/桌面名称不一致 | 三处统一「岁月家」 |
|
||||
| 截图含广告/充值/资讯/金额 | 只放首页,先清空敏感数据 |
|
||||
| 服务器不符合备案要求(按量付费) | 提交前先改包年包月 |
|
||||
| 域名未备案 / 与主体不一致 | 先确认 `family.yangyq.net` 已备案在同一主体 |
|
||||
|
||||
+6
-6
@@ -1,4 +1,4 @@
|
||||
# 家书 · 上架与备案材料总览
|
||||
# 岁月家 · 上架与备案材料总览
|
||||
|
||||
> 生成于 2026-11-01。所有信息**取自真实代码与实测**,没有套模板硬填。
|
||||
> 每个数字、每个权限、每句功能描述都能在仓库里找到出处。
|
||||
@@ -109,12 +109,12 @@
|
||||
- 华为审核看到调试签名会报 **991 / 1014** 包无效
|
||||
- → 先做 `正式证书与签名切换.md`
|
||||
|
||||
### 问题 2:没有「家书」的软件著作权
|
||||
### 问题 2:没有「岁月家」的软件著作权
|
||||
|
||||
- 你名下 6 项软著**全部与家书无关**(渤海生态系统 ×2、云任务调度、雾计算、海洋大数据 ×2)
|
||||
- 你名下 6 项软著**全部与岁月家无关**(渤海生态系统 ×2、云任务调度、雾计算、海洋大数据 ×2)
|
||||
- **阿里云备案不强制软著** → 不影响备案
|
||||
- **华为上架要求软著,但可用《免责函》过渡** → 能提交,但不保证 100% 过
|
||||
- → 建议:先用免责函提审,**同时**去中国版权保护中心申请「家书」软著(免费,30–60 工作日)
|
||||
- → 建议:先用免责函提审,**同时**去中国版权保护中心申请「岁月家」软著(免费,30–60 工作日)
|
||||
- 软著以后上小米/OPPO/vivo/应用宝全都强制要,早办早省事
|
||||
|
||||
### 问题 3:隐私政策页面还不存在
|
||||
@@ -144,7 +144,7 @@
|
||||
|---|---|---|
|
||||
| 包名 | `familybook.yangyq.net` | `AppScope/app.json5 → bundleName` |
|
||||
| 版本 | `0.8.0`(versionCode **800**) | 同上 |
|
||||
| 应用名 | `家书` | `AppScope/resources/base/element/string.json → app_name` |
|
||||
| 应用名 | `岁月家` | `AppScope/resources/base/element/string.json → app_name` |
|
||||
| 图标源 | `AppScope/resources/base/media/fb_logo.png`(192×192,**自带圆角**) | 已重新出 216/1024 方形版 |
|
||||
| 权限数 | **3 个**,全部普通权限,无敏感权限 | `entry/src/main/module.json5` |
|
||||
| 权限清单 | INTERNET / GET_NETWORK_INFO / DETECT_GESTURE | 同上 |
|
||||
@@ -156,7 +156,7 @@
|
||||
### 关于权限少这件事,是优势
|
||||
|
||||
只有 3 个普通权限、**没有定位、没有通讯录、没有相机、没有设备标识符**,
|
||||
这在审核里是极大的加分项 —— 「权限滥用」是驳回第一大类原因,家书直接绕开了。
|
||||
这在审核里是极大的加分项 —— 「权限滥用」是驳回第一大类原因,岁月家直接绕开了。
|
||||
隐私政策第二节和第十节已经做了**权限逐条对照表**,可以直接给审核看。
|
||||
|
||||
---
|
||||
|
||||
+9
-9
@@ -1,4 +1,4 @@
|
||||
# 家书 · 应用介绍文案(可直接复制到 AGC)
|
||||
# 岁月家 · 应用介绍文案(可直接复制到 AGC)
|
||||
|
||||
> 三个版本按投放位置选用。字数已核算,均在上限内。
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
### ✅ 采用版(13 字)
|
||||
|
||||
```
|
||||
一家人的日程任务与生活档案
|
||||
一家人用岁月写成的一本书
|
||||
```
|
||||
|
||||
### 备选
|
||||
@@ -30,7 +30,7 @@
|
||||
**上限 8000 字。** 以下约 1050 字,留足余量,且覆盖了「实际功能」以免被判"介绍与功能不符"。
|
||||
|
||||
```
|
||||
家书,是给一家人用的生活档案工具。
|
||||
岁月家,是给一家人用的生活档案工具。
|
||||
|
||||
它不社交、不推送广告、不做推荐算法。它只做一件事:把一家人的日程、任务、重要日子、看过的电影、去过的地方、家里的账和资料,安安静静地记在一处,谁都能查得到,谁都不会漏掉。
|
||||
|
||||
@@ -58,7 +58,7 @@
|
||||
|
||||
【关于数据,三句话】
|
||||
|
||||
第一,数据在你自己的服务器上。家书是客户端,服务端由使用者自行部署,开发者不设中心数据库,也没有你的数据副本。
|
||||
第一,数据在你自己的服务器上。岁月家是客户端,服务端由使用者自行部署,开发者不设中心数据库,也没有你的数据副本。
|
||||
|
||||
第二,能加密的都加密。密码单向哈希存储,手机号与证件号加密存储,附件落盘加密,登录令牌放在系统硬件密钥库里。
|
||||
|
||||
@@ -66,9 +66,9 @@
|
||||
|
||||
【关于提醒的一句实话】
|
||||
|
||||
家书的提醒依赖系统通知能力,可能因省电策略或权限关闭而延迟。请不要把它当成航班、考试、就医这类要事的唯一提醒手段。
|
||||
岁月家的提醒依赖系统通知能力,可能因省电策略或权限关闭而延迟。请不要把它当成航班、考试、就医这类要事的唯一提醒手段。
|
||||
|
||||
家书不是要替你做决定,也不是要你多用手机。它只是想让一家人少一点"我以为你记得"。
|
||||
岁月家不是要替你做决定,也不是要你多用手机。它只是想让一家人少一点"我以为你记得"。
|
||||
```
|
||||
|
||||
---
|
||||
@@ -80,7 +80,7 @@
|
||||
```
|
||||
首个公开版本 0.8.0。
|
||||
|
||||
本次为家书第一次上架,包含完整十个模块:日程、任务、名册、纪念日、观影、旅程、财务、读书、资源、笔记。
|
||||
本次为岁月家第一次上架,包含完整十个模块:日程、任务、名册、纪念日、观影、旅程、财务、读书、资源、笔记。
|
||||
|
||||
主要能力:
|
||||
· 日程支持月/周/日三视图、重复日程、跨天分段、参与人与提醒
|
||||
@@ -114,7 +114,7 @@
|
||||
|
||||
### ❌ 不要选
|
||||
|
||||
- **社交** —— 家书没有陌生人社交,选社交会被要求提供社交类资质,且审核标准更高
|
||||
- **社交** —— 岁月家没有陌生人社交,选社交会被要求提供社交类资质,且审核标准更高
|
||||
- **金融理财** —— 财务模块只是记账,选理财类需要金融资质
|
||||
- **效率办公** —— 容易与办公软件混淆
|
||||
|
||||
@@ -179,7 +179,7 @@ AGC 会要求填写「数据安全」表单,逐项如下:
|
||||
|
||||
## 九、提交前必须自己核对的 8 件事
|
||||
|
||||
1. ☐ 后台应用名称 = 包内 `app_name` = **家书**(完全一致,含空格)
|
||||
1. ☐ 后台应用名称 = 包内 `app_name` = **岁月家**(完全一致,含空格)
|
||||
2. ☐ 后台图标 216×216 = 包内 `fb_logo` 同一图案(**当前图标只有 192×192,需另出**)
|
||||
3. ☐ bundleName = **familybook.yangyq.net**(一个字符都不能错)
|
||||
4. ☐ versionCode = **800**(若之前提交过,必须递增)
|
||||
|
||||
@@ -1,14 +1,14 @@
|
||||
{
|
||||
"app_name": "家书",
|
||||
"app_name": "岁月家",
|
||||
"app_name_check": {
|
||||
"value": "家书",
|
||||
"value": "岁月家",
|
||||
"chars": 2,
|
||||
"limit": "≤15 个汉字字符",
|
||||
"verdict": "PASS",
|
||||
"note": "两字,唯一、有辨识度,不是通用词。与安装后桌面名称(AppScope/resources/base/element/string.json 的 app_name)一致。"
|
||||
},
|
||||
"one_line_intro": {
|
||||
"value": "一家人的日程任务与生活档案",
|
||||
"value": "一家人用岁月写成的一本书",
|
||||
"chars": 13,
|
||||
"limit": "≤17 个汉字",
|
||||
"verdict": "PASS"
|
||||
@@ -52,7 +52,7 @@
|
||||
{
|
||||
"permission": "ohos.permission.INTERNET",
|
||||
"level": "normal",
|
||||
"purpose": "与用户自行部署的家书服务端通信,读写日程/任务/名册等数据",
|
||||
"purpose": "与用户自行部署的岁月家服务端通信,读写日程/任务/名册等数据",
|
||||
"required": true,
|
||||
"if_denied": "无法登录,无法同步任何数据"
|
||||
},
|
||||
@@ -130,13 +130,13 @@
|
||||
"intro_video": { "spec": "可选,1–3 个,15 秒–2 分钟,竖屏 720×1280", "recommend": "暂不做,非必需" },
|
||||
"copyright_docs": {
|
||||
"spec": "软著证书扫描件或电子版权证明,1–5 张 JPG/PNG ≤15MB,或 PDF ≤5MB",
|
||||
"current": "❌ 无「家书」软著 —— 现有 6 项软著均与家书无关(见软著情况说明)"
|
||||
"current": "❌ 无「岁月家」软著 —— 现有 6 项软著均与岁月家无关(见软著情况说明)"
|
||||
}
|
||||
},
|
||||
"consistency_must_match": {
|
||||
"说明": "AGC 后台填的名称/图标/一句话简介/分类,必须与 HAP 包内实际值完全一致,前后不一致是高频驳回点。",
|
||||
"items": [
|
||||
{ "后台填": "应用名称「家书」", "包内": "AppScope/resources/base/element/string.json → app_name = 家书", "状态": "一致" },
|
||||
{ "后台填": "应用名称「岁月家」", "包内": "AppScope/resources/base/element/string.json → app_name = 岁月家", "状态": "一致" },
|
||||
{ "后台填": "图标(216×216)", "包内": "app.json5 → icon = $media:fb_logo(192×192)", "状态": "图案需一致,尺寸需补" },
|
||||
{ "后台填": "包名 familybook.yangyq.net", "包内": "app.json5 → bundleName", "状态": "一致" },
|
||||
{ "后台填": "版本 0.8.0 (800)", "包内": "app.json5 → versionName/versionCode", "状态": "一致" }
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# 华为正式发布证书申请 + 家书切 release 签名
|
||||
# 华为正式发布证书申请 + 岁月家切 release 签名
|
||||
|
||||
> **一句话结论**:现在用的是**调试证书**,它能装到自己手机,但**不能上架、不能用于 APP 备案**。
|
||||
> 必须先生成**正式发布证书(.cer)+ 发布 Profile(.p7b)**,再改 `build-profile.json5` 切到 release。
|
||||
@@ -97,10 +97,10 @@ keytool -certreq \
|
||||
|
||||
> ⚠️ 一个账号最多 1 个**发布证书**(调试证书可多个)。若已有(SyncCalendar 用的那个),
|
||||
> 需要先**吊销**旧的才能新建 —— 但吊销会让 SyncCalendar 的更新包签不了名,
|
||||
> **所以建议:给家书单独申请前,先确认是不是共用同一个。**
|
||||
> **所以建议:给岁月家单独申请前,先确认是不是共用同一个。**
|
||||
>
|
||||
> 更稳妥的做法:**同一个发布证书可以签多个应用**(Profile 才是按应用绑定的),
|
||||
> 所以直接用 SyncCalendar 那个发布证书也行,只需为家书新建一个 **Profile**。
|
||||
> 所以直接用 SyncCalendar 那个发布证书也行,只需为岁月家新建一个 **Profile**。
|
||||
|
||||
### 步骤 3:创建发布 Profile(按应用绑定)
|
||||
|
||||
@@ -108,18 +108,18 @@ keytool -certreq \
|
||||
2. 点 **「新增 Profile」**
|
||||
3. Profile 类型选 **「发布」**
|
||||
4. 绑定:
|
||||
- **应用**:选「家书」(若 AGC 里还没建这个应用,先去「我的应用 → 新建」建一个)
|
||||
- **应用**:选「岁月家」(若 AGC 里还没建这个应用,先去「我的应用 → 新建」建一个)
|
||||
- **证书**:选上一步那个发布证书
|
||||
5. 提交 → 下载得到 **`familybook.yangyq.net.release.p7b`**
|
||||
|
||||
> ⚠️ Profile 与**包名**绑定。家书包名 `familybook.yangyq.net`,
|
||||
> ⚠️ Profile 与**包名**绑定。岁月家包名 `familybook.yangyq.net`,
|
||||
> 必须与 AGC 里创建应用时填的包名**完全一致**。
|
||||
|
||||
### 步骤 4:配置应用包名与指纹(备案也要用)
|
||||
|
||||
1. AGC →「我的应用」→ 新建(如果还没建)
|
||||
- 平台:**HarmonyOS**
|
||||
- 应用名称:**家书**
|
||||
- 应用名称:**岁月家**
|
||||
- 包名:**familybook.yangyq.net**(一字不差,**创建后不可改**)
|
||||
- 分类:实用工具
|
||||
- 默认语言:简体中文
|
||||
|
||||
+6
-6
@@ -1,16 +1,16 @@
|
||||
# 家书 用户服务协议
|
||||
# 岁月家 用户服务协议
|
||||
|
||||
**生效日期**:2026 年 11 月 1 日
|
||||
**适用产品**:家书(HarmonyOS 应用,包名 `familybook.yangyq.net`)
|
||||
**适用产品**:岁月家(HarmonyOS 应用,包名 `familybook.yangyq.net`)
|
||||
**开发者**:杨永全(个人开发者)
|
||||
|
||||
---
|
||||
|
||||
## 第一条 协议的主体与接受
|
||||
|
||||
1.1 本协议是你与**家书开发者杨永全(个人开发者)**(下称"我们")之间就使用「家书」应用(下称"本应用")所订立的协议。
|
||||
1.1 本协议是你与**岁月家开发者杨永全(个人开发者)**(下称"我们")之间就使用「岁月家」应用(下称"本应用")所订立的协议。
|
||||
|
||||
1.2 你在注册、登录或使用本应用前,应当**完整阅读并同意**本协议及《家书隐私政策》。你点击"同意"、完成注册或实际使用本应用,即视为你已阅读并同意本协议全部内容。
|
||||
1.2 你在注册、登录或使用本应用前,应当**完整阅读并同意**本协议及《岁月家隐私政策》。你点击"同意"、完成注册或实际使用本应用,即视为你已阅读并同意本协议全部内容。
|
||||
|
||||
1.3 若你**不同意**本协议任何内容,请**停止注册与使用**。
|
||||
|
||||
@@ -18,7 +18,7 @@
|
||||
|
||||
## 第二条 服务内容
|
||||
|
||||
2.1 家书是一款**家庭内部使用**的生活档案管理工具,提供以下功能模块:
|
||||
2.1 岁月家是一款**家庭内部使用**的生活档案管理工具,提供以下功能模块:
|
||||
|
||||
| 模块 | 功能概述 |
|
||||
|---|---|
|
||||
@@ -150,7 +150,7 @@
|
||||
|
||||
## 第九条 隐私保护
|
||||
|
||||
9.1 我们按照《家书隐私政策》处理你的个人信息。该政策是本协议不可分割的一部分。
|
||||
9.1 我们按照《岁月家隐私政策》处理你的个人信息。该政策是本协议不可分割的一部分。
|
||||
|
||||
9.2 核心承诺重申:
|
||||
- 不含广告 SDK、不含第三方统计 SDK
|
||||
|
||||
+27
-14
@@ -1,17 +1,17 @@
|
||||
# 家书 隐私政策
|
||||
# 岁月家 隐私政策
|
||||
|
||||
**生效日期**:2026 年 11 月 1 日
|
||||
**最后更新**:2026 年 11 月 1 日
|
||||
**适用产品**:家书(HarmonyOS 应用,包名 `familybook.yangyq.net`)
|
||||
**适用产品**:岁月家(HarmonyOS 应用,包名 `familybook.yangyq.net`)
|
||||
**开发者**:杨永全(个人开发者)
|
||||
|
||||
---
|
||||
|
||||
## 引言
|
||||
|
||||
家书是一款**家庭内部使用**的生活档案工具,用于记录一家人的日程、任务、纪念日、观影、旅程、财务、读书笔记与资料附件。
|
||||
岁月家是一款**家庭内部使用**的生活档案工具,用于记录一家人的日程、任务、纪念日、观影、旅程、财务、读书笔记与资料附件。
|
||||
|
||||
我们深知家庭数据的高度私密性。因此家书在设计上遵循一条原则:
|
||||
我们深知家庭数据的高度私密性。因此岁月家在设计上遵循一条原则:
|
||||
|
||||
> **数据属于用户自己。我们不收集、不上传、不商用、不共享。**
|
||||
|
||||
@@ -24,11 +24,24 @@
|
||||
3. **不申请设备标识符**(不读取 OAID / IMEI / IDFA / SN / MAC 等)。
|
||||
4. **不向任何第三方出售、出租、交换你的个人信息**。
|
||||
|
||||
**上述四条不是空口承诺 —— 本应用完全开源,你可以自己核实。**
|
||||
|
||||
网页端与鸿蒙客户端两个仓库全部公开(Apache License 2.0),
|
||||
无需注册即可浏览与 clone:
|
||||
|
||||
| 仓库 | 内容 | 地址 |
|
||||
|---|---|---|
|
||||
| FamilyBook | 网页端 / 服务端程序 | https://code.yangyq.net/laoyang/FamilyBook |
|
||||
| FamilyBook_harmonyos | 鸿蒙客户端 | https://code.yangyq.net/laoyang/FamilyBook_harmonyos |
|
||||
|
||||
任何具备技术能力的人都可以逐行核对:有没有统计代码、联网请求都发往哪些地址、
|
||||
权限申请后在代码里实际用来做什么。**你不需要相信我们的话,你可以直接看代码。**
|
||||
|
||||
---
|
||||
|
||||
## 一、我们处理的个人信息
|
||||
|
||||
家书的功能决定了它会保存"你自愿填进去的内容"。这些内容全部保存在**你自己部署的服务器**和你**本机**上,我们不设中心化数据库。
|
||||
岁月家的功能决定了它会保存"你自愿填进去的内容"。这些内容全部保存在**你自己部署的服务器**和你**本机**上,我们不设中心化数据库。
|
||||
|
||||
### 1.1 账号信息(必需)
|
||||
|
||||
@@ -59,7 +72,7 @@
|
||||
- **资源**:证件、资料的标题、描述、附件文件
|
||||
- **笔记**:分块笔记内容、标签、分享设置
|
||||
|
||||
> ⚠️ **关于身份证号**:家书的名册字段中**预留**了身份证号,但它是**可选**字段,你**不填就不会有任何数据**。若你填写,服务端以 **AES-256-CBC 加密**存储,明文不落盘。
|
||||
> ⚠️ **关于身份证号**:岁月家的名册字段中**预留**了身份证号,但它是**可选**字段,你**不填就不会有任何数据**。若你填写,服务端以 **AES-256-CBC 加密**存储,明文不落盘。
|
||||
>
|
||||
> ⚠️ **关于附件照片**:仅在你主动从系统相册选择或拍照上传时才会读取你选中的那一个文件。**我们不扫描、不遍历你的相册**。鸿蒙系统在应用访问相册时会弹出系统级选择器,你能看到并且可以拒绝。
|
||||
|
||||
@@ -90,11 +103,11 @@
|
||||
|
||||
## 二、权限使用说明
|
||||
|
||||
家书共申请 **3 项**系统权限,全部为**普通权限**,均不涉及敏感个人信息:
|
||||
岁月家共申请 **3 项**系统权限,全部为**普通权限**,均不涉及敏感个人信息:
|
||||
|
||||
| 权限 | 用途 | 是否必需 | 拒绝的后果 |
|
||||
|---|---|---|---|
|
||||
| `ohos.permission.INTERNET` | 与你自己部署的家书服务器通信,读写数据 | **必需** | 无法登录、无法同步任何数据 |
|
||||
| `ohos.permission.INTERNET` | 与你自己部署的岁月家服务器通信,读写数据 | **必需** | 无法登录、无法同步任何数据 |
|
||||
| `ohos.permission.GET_NETWORK_INFO` | 判断当前是否有网络,断网时显示"离线,显示的是缓存"而不是一直转圈 | 必需 | 网络异常时提示不准确,不影响核心功能 |
|
||||
| `ohos.permission.DETECT_GESTURE` | 识别左右手握持,自动调整界面方向。**不采集、不上传、不记录任何手势数据** | 可选 | 界面方向不自动调整,可手动设置 |
|
||||
|
||||
@@ -116,7 +129,7 @@
|
||||
|
||||
### 3.1 存储位置
|
||||
|
||||
- **服务端**:数据存储在你**自行部署**的家书服务器上(当前为开发者自建的阿里云服务器,域名 `family.yangyq.net`)。**我们(开发者)没有你的数据副本**。
|
||||
- **服务端**:数据存储在你**自行部署**的岁月家服务器上(当前为开发者自建的阿里云服务器,域名 `family.yangyq.net`)。**我们(开发者)没有你的数据副本**。
|
||||
- **端侧**:见 1.3 节。
|
||||
|
||||
### 3.2 保存期限
|
||||
@@ -147,7 +160,7 @@
|
||||
|
||||
**我们不会与任何第三方共享你的个人信息**,以下三种情形除外:
|
||||
|
||||
1. **你主动分享的内容**:家书支持把某条笔记/任务/账本/日历**共享给同一家庭内的其他成员**。这是你主动发起的操作,共享范围由你选择,可随时撤销。
|
||||
1. **你主动分享的内容**:岁月家支持把某条笔记/任务/账本/日历**共享给同一家庭内的其他成员**。这是你主动发起的操作,共享范围由你选择,可随时撤销。
|
||||
2. **你主动导出/下载**:你把数据导出成文件后自行处置,我们不介入。
|
||||
3. **法律法规要求**:仅在依法需要配合司法机关或行政机关调查时,按法定程序提供。
|
||||
|
||||
@@ -179,9 +192,9 @@
|
||||
|
||||
## 五、你的权利
|
||||
|
||||
依据《中华人民共和国个人信息保护法》,你对自己的个人信息享有以下权利。**这些权利在家书里都是自助可用的**,不需要发邮件申请:
|
||||
依据《中华人民共和国个人信息保护法》,你对自己的个人信息享有以下权利。**这些权利在岁月家里都是自助可用的**,不需要发邮件申请:
|
||||
|
||||
| 权利 | 在家书里怎么做 |
|
||||
| 权利 | 在岁月家里怎么做 |
|
||||
|---|---|
|
||||
| **查阅、复制** | 各模块列表直接查看;资源模块支持导出;`设置 → 数据导出` 可整体导出 |
|
||||
| **更正、补充** | 任意条目点开 → 编辑 → 保存 |
|
||||
@@ -196,7 +209,7 @@
|
||||
|
||||
## 六、未成年人保护
|
||||
|
||||
家书是家庭工具,**不面向未成年人独立提供服务**。
|
||||
岁月家是家庭工具,**不面向未成年人独立提供服务**。
|
||||
|
||||
- 未满 14 周岁的未成年人**不得自行注册**账号。若家庭成员中有未成年人,其信息由**监护人**代为录入与管理,监护人可随时查看、更正、删除。
|
||||
- 我们不收集**儿童**的独立账号信息;名册中记录的未成年家庭成员信息,属于监护人主动录入的家庭内部资料。
|
||||
@@ -227,7 +240,7 @@
|
||||
| **开发者** | 杨永全(个人开发者) |
|
||||
| **联系邮箱** | `i@yangyq.net` |
|
||||
| **响应时限** | 收到后 **15 个工作日**内答复 |
|
||||
| **我的家书服务地址** | `https://family.yangyq.net` |
|
||||
| **我的岁月家服务地址** | `https://family.yangyq.net` |
|
||||
|
||||
如你对我们的答复不满意,或认为我们的个人信息处理行为损害了你的合法权益,你可以向**网信部门、电信主管部门、公安部门、市场监管部门**等监管机构投诉举报,也可以向**被告住所地有管辖权的人民法院**提起诉讼。
|
||||
|
||||
|
||||
@@ -49,7 +49,7 @@ export function fbAttachExt(key: string): string {
|
||||
function baseTitle(name: string, key: string): string {
|
||||
let t: string = name.trim();
|
||||
if (t === '') {
|
||||
return '家书附件';
|
||||
return '岁月家附件';
|
||||
}
|
||||
const dot: number = t.lastIndexOf('.');
|
||||
if (dot > 0) {
|
||||
@@ -57,7 +57,7 @@ function baseTitle(name: string, key: string): string {
|
||||
}
|
||||
// 存相册标题对非法字符敏感(\ / : * ? " ' ` < > | { } [ ]),统一清洗
|
||||
const cleaned: string = t.replace(/[\\/:*?"'`<>|{}\[\]]/g, '_').trim();
|
||||
return cleaned !== '' ? cleaned : '家书附件';
|
||||
return cleaned !== '' ? cleaned : '岁月家附件';
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -423,7 +423,7 @@ class FbBackgroundSyncImpl {
|
||||
|
||||
// 尝试把 10 秒窗口延长到最多 3 分钟(失败则退回 9 秒软超时)
|
||||
let budget: number = CARD_SOFT_TIMEOUT_MS;
|
||||
const granted: number = this.requestTransient('正在同步家书数据');
|
||||
const granted: number = this.requestTransient('正在同步岁月家数据');
|
||||
if (granted > 0) {
|
||||
const usable: number = granted - TRANSIENT_RESERVE_MS;
|
||||
budget = usable > CARD_SOFT_TIMEOUT_MS ? usable : CARD_SOFT_TIMEOUT_MS;
|
||||
|
||||
@@ -79,7 +79,7 @@ export struct FbDrawer {
|
||||
.height(32)
|
||||
.borderRadius(9)
|
||||
Column({ space: 1 }) {
|
||||
Text('家书')
|
||||
Text('岁月家')
|
||||
.fontSize(16)
|
||||
.fontWeight(FontWeight.Medium)
|
||||
.fontColor(FbColors.ink)
|
||||
|
||||
@@ -300,7 +300,7 @@ export struct FbTopBar {
|
||||
return '旅程';
|
||||
}
|
||||
const m = fbModuleOf(k);
|
||||
return m !== undefined ? m.name : '家书';
|
||||
return m !== undefined ? m.name : '岁月家';
|
||||
}
|
||||
|
||||
/** 顶栏标题色 = 当前模块的主题色(认不出回落到品牌砖红) */
|
||||
|
||||
@@ -360,13 +360,13 @@ export async function fbCardBuild(ctx: common.Context, dayOffset: number): Promi
|
||||
}
|
||||
if (FB_SERVER_STORE.get() === '') {
|
||||
out.state = 'noserver';
|
||||
out.hint = '先在「家书」里填写服务器地址';
|
||||
out.hint = '先在「岁月家」里填写服务器地址';
|
||||
return out;
|
||||
}
|
||||
const token: string = FB_TOKEN_STORE.get();
|
||||
if (token === '') {
|
||||
out.state = 'login';
|
||||
out.hint = '先在「家书」里登录';
|
||||
out.hint = '先在「岁月家」里登录';
|
||||
return out;
|
||||
}
|
||||
|
||||
|
||||
@@ -164,12 +164,12 @@ export async function fbMovieCardBuild(ctx: common.Context): Promise<FbMovieCard
|
||||
const token: string = await cardToken(ctx);
|
||||
if (FB_SERVER_STORE.get() === '') {
|
||||
out.state = 'noserver';
|
||||
out.hint = '先在「家书」里填写服务器地址';
|
||||
out.hint = '先在「岁月家」里填写服务器地址';
|
||||
return out;
|
||||
}
|
||||
if (token === '') {
|
||||
out.state = 'login';
|
||||
out.hint = '先在「家书」里登录';
|
||||
out.hint = '先在「岁月家」里登录';
|
||||
return out;
|
||||
}
|
||||
|
||||
@@ -488,12 +488,12 @@ export async function fbTaskCardBuild(ctx: common.Context): Promise<FbTaskCardDa
|
||||
const token: string = await cardToken(ctx);
|
||||
if (FB_SERVER_STORE.get() === '') {
|
||||
out.state = 'noserver';
|
||||
out.hint = '先在「家书」里填写服务器地址';
|
||||
out.hint = '先在「岁月家」里填写服务器地址';
|
||||
return out;
|
||||
}
|
||||
if (token === '') {
|
||||
out.state = 'login';
|
||||
out.hint = '先在「家书」里登录';
|
||||
out.hint = '先在「岁月家」里登录';
|
||||
return out;
|
||||
}
|
||||
|
||||
|
||||
@@ -164,6 +164,16 @@ export interface FbApiOptions {
|
||||
body?: Record<string, Object>;
|
||||
/** API 令牌(不带则请求匿名,服务端会 401) */
|
||||
token?: string;
|
||||
/**
|
||||
* 本次请求的超时(毫秒,连接与读取都用这个值)。不传则用默认 15000。
|
||||
*
|
||||
* 🔴 2026-10-30(日程全量同步):日历改成一次拉全量,实测响应体约 9.3MB
|
||||
* (28628 条,服务端按范围展开重复日程得出的)。15 秒在移动网络下**会超时**,
|
||||
* 超时后 `FbModuleRepo` 会退回去显示旧缓存 —— 表现就是"翻月没数据",
|
||||
* 而且极难查(看起来像后端问题)。
|
||||
* ⇒ 大响应必须能单独放宽超时,不能所有请求共用同一个写死的 15 秒。
|
||||
*/
|
||||
timeoutMs?: number;
|
||||
/**
|
||||
* `true` = 这次请求的 401 **不要**触发全局"踢回登录页"。
|
||||
*
|
||||
@@ -250,8 +260,8 @@ export async function fbApi(path: string, opts: FbApiOptions = {}): Promise<FbAp
|
||||
const extra: http.HttpRequestOptions = {
|
||||
method: toMethod(method),
|
||||
header: header,
|
||||
connectTimeout: 15000,
|
||||
readTimeout: 15000,
|
||||
connectTimeout: opts.timeoutMs !== undefined ? opts.timeoutMs : 15000,
|
||||
readTimeout: opts.timeoutMs !== undefined ? opts.timeoutMs : 15000,
|
||||
expectDataType: http.HttpDataType.STRING
|
||||
};
|
||||
if (opts.body !== undefined && method !== 'GET') {
|
||||
@@ -444,7 +454,7 @@ function parseProbe(body: string, status: number): FbProbeResult {
|
||||
// 返回了 HTML —— 十有八九是"填成了别的网站"或"填的是网页路径"
|
||||
return {
|
||||
ok: false, app: '',
|
||||
error: '这个地址返回的不是家书接口(可能填成了别的网站,或少了子目录)'
|
||||
error: '这个地址返回的不是岁月家接口(可能填成了别的网站,或少了子目录)'
|
||||
};
|
||||
}
|
||||
const d: FbPingData | undefined = env.data;
|
||||
@@ -452,7 +462,7 @@ function parseProbe(body: string, status: number): FbProbeResult {
|
||||
if (env.ok === true && svc === 'familybook') {
|
||||
return {
|
||||
ok: true,
|
||||
app: d !== undefined && d.app !== undefined ? d.app : '家书',
|
||||
app: d !== undefined && d.app !== undefined ? d.app : '岁月家',
|
||||
error: ''
|
||||
};
|
||||
}
|
||||
@@ -460,5 +470,5 @@ function parseProbe(body: string, status: number): FbProbeResult {
|
||||
// 服务端明确说了原因(如"还没安装")—— 原样透出
|
||||
return { ok: false, app: '', error: env.error };
|
||||
}
|
||||
return { ok: false, app: '', error: '这个地址不是家书服务器' };
|
||||
return { ok: false, app: '', error: '这个地址不是岁月家服务器' };
|
||||
}
|
||||
|
||||
@@ -355,7 +355,7 @@ export default class EntryAbility extends UIAbility {
|
||||
跑不完也不会损坏数据,下次接着来。
|
||||
⚠️ 这里**不 await**:`onBackground` 是同步回调,await 会挡住系统,
|
||||
反而缩短了留给后台的时间。给它自己跑。 */
|
||||
const granted: number = FB_BG_SYNC.requestTransient('正在同步家书数据');
|
||||
const granted: number = FB_BG_SYNC.requestTransient('正在同步岁月家数据');
|
||||
hilog.info(DOMAIN, 'FamilyBook', '退后台:短时任务可用 %{public}d 秒', Math.round(granted / 1000));
|
||||
FB_BG_SYNC.runOnceResumed(this.context, 'transient').catch((err: BusinessError): void => {
|
||||
hilog.warn(DOMAIN, 'FamilyBook', '退后台同步失败(不影响使用):%{public}s',
|
||||
|
||||
@@ -367,7 +367,7 @@ export struct FbLoginPage {
|
||||
.borderRadius(12)
|
||||
.border({ width: 1, color: FbColors.line })
|
||||
Column({ space: 2 }) {
|
||||
Text('家书')
|
||||
Text('岁月家')
|
||||
.fontSize(FbMetric.fontTitle)
|
||||
.fontWeight(FontWeight.Medium)
|
||||
.fontColor(FbColors.ink)
|
||||
@@ -462,7 +462,7 @@ export struct FbLoginPage {
|
||||
this.connect();
|
||||
})
|
||||
|
||||
Text('就是你在浏览器里打开家书网页版时用的那个地址。')
|
||||
Text('就是你在浏览器里打开岁月家网页版时用的那个地址。')
|
||||
.fontSize(FbMetric.fontTiny)
|
||||
.fontColor(FbColors.faint)
|
||||
.textAlign(TextAlign.Center)
|
||||
|
||||
@@ -537,7 +537,7 @@ export struct FbSettingsPage {
|
||||
this.plainRow('上次同步', this.bgLastNote === '' ? '读取中…' : this.bgLastNote)
|
||||
/* ⚠️ 说明为什么"不是即时":不给这句,用户切到别的应用改完再回来
|
||||
没看到变化,就会认为同步坏了。 */
|
||||
Text('回到家书时会立刻补一次;在别的应用里改的数据,最迟半小时能同步过来。')
|
||||
Text('回到岁月家时会立刻补一次;在别的应用里改的数据,最迟半小时能同步过来。')
|
||||
.fontSize(10)
|
||||
.fontColor(FbColors.faint)
|
||||
.width('100%')
|
||||
|
||||
@@ -2,19 +2,19 @@
|
||||
"string": [
|
||||
{
|
||||
"name": "module_desc",
|
||||
"value": "家书 · 家庭生活档案客户端"
|
||||
"value": "岁月家 · 家庭生活档案客户端"
|
||||
},
|
||||
{
|
||||
"name": "EntryAbility_desc",
|
||||
"value": "家书主界面"
|
||||
"value": "岁月家主界面"
|
||||
},
|
||||
{
|
||||
"name": "EntryAbility_label",
|
||||
"value": "家书"
|
||||
"value": "岁月家"
|
||||
},
|
||||
{
|
||||
"name": "form_ability_desc",
|
||||
"value": "家书服务卡片"
|
||||
"value": "岁月家服务卡片"
|
||||
},
|
||||
{
|
||||
"name": "card_desc",
|
||||
@@ -22,51 +22,51 @@
|
||||
},
|
||||
{
|
||||
"name": "card_2x2_name",
|
||||
"value": "家书 · 今天 2×2"
|
||||
"value": "岁月家 · 今天 2×2"
|
||||
},
|
||||
{
|
||||
"name": "card_2x4_name",
|
||||
"value": "家书 · 今日日程 2×4"
|
||||
"value": "岁月家 · 今日日程 2×4"
|
||||
},
|
||||
{
|
||||
"name": "card_4x4_name",
|
||||
"value": "家书 · 日程 4×4"
|
||||
"value": "岁月家 · 日程 4×4"
|
||||
},
|
||||
{
|
||||
"name": "card_6x4_name",
|
||||
"value": "家书 · 日程 6×4"
|
||||
"value": "岁月家 · 日程 6×4"
|
||||
},
|
||||
{
|
||||
"name": "card_movie_2x2_name",
|
||||
"value": "家书 · 观影 2×2"
|
||||
"value": "岁月家 · 观影 2×2"
|
||||
},
|
||||
{
|
||||
"name": "card_movie_2x4_name",
|
||||
"value": "家书 · 观影 2×4"
|
||||
"value": "岁月家 · 观影 2×4"
|
||||
},
|
||||
{
|
||||
"name": "card_task_2x2_name",
|
||||
"value": "家书 · 待办 2×2"
|
||||
"value": "岁月家 · 待办 2×2"
|
||||
},
|
||||
{
|
||||
"name": "card_task_2x4_name",
|
||||
"value": "家书 · 待办 2×4"
|
||||
"value": "岁月家 · 待办 2×4"
|
||||
},
|
||||
{
|
||||
"name": "card_movie_4x4_name",
|
||||
"value": "家书 · 观影 4×4"
|
||||
"value": "岁月家 · 观影 4×4"
|
||||
},
|
||||
{
|
||||
"name": "card_movie_6x4_name",
|
||||
"value": "家书 · 观影 6×4"
|
||||
"value": "岁月家 · 观影 6×4"
|
||||
},
|
||||
{
|
||||
"name": "card_task_4x4_name",
|
||||
"value": "家书 · 待办 4×4"
|
||||
"value": "岁月家 · 待办 4×4"
|
||||
},
|
||||
{
|
||||
"name": "card_task_6x4_name",
|
||||
"value": "家书 · 待办 6×4"
|
||||
"value": "岁月家 · 待办 6×4"
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user