refactor: 个人自用,移除登录与云同步全链路

站点只给本人用,云乐坊 SSO 授权、收藏/历史云同步、获客归因和账号切换记账都没有收益,却被登录状态检查和同步失败提示持续打扰。

- 删除 useYunlefunAuth / yunlefunAuth / yunlefunSsoConfig / yunlefunAuth 适配器、useUserDataSync / userDataSync / userData 适配器、三个 client 插件与 /auth/callback 回调页
- 抽出 adapters/cloudbase.ts,让「反馈一下」和匿名筛选信号不再依赖登录态;cook-feedback 云函数保留
- 删除 cook-user-data 云函数与 cook_user_data 权限规则,移除 @yunlefun/sso 依赖
- 「我的」页删掉登录按钮、账号卡、四个统计格和退出登录;「关于」页删掉项目作者、致谢名单和上游宣传链接
- 本地收藏/历史与导出导入保留,删除同步专用的 lastUid 记账

取舍见 docs/decisions/0005-drop-login-and-sync.md
This commit is contained in:
toor
2026-10-22 15:52:54 +08:00
committed by trae-solo-agent
parent 7408591fac
commit 8ff7b879b9
54 changed files with 214 additions and 3049 deletions
+2 -2
View File
@@ -1,8 +1,8 @@
# 0004 只保留 Web,移除 Capacitor 原生壳
- 状态:已采纳
- 状态:部分被 0005 取代
- 日期:2026-10-21
- 关联:取代 [0003 原生 iOS App 与 monorepo 结构](./0003-native-ios-monorepo)
- 关联:取代 [0003 原生 iOS App 与 monorepo 结构](./0003-native-ios-monorepo);云乐坊 SSO 部分被 [0005 个人自用,去掉登录与云同步](./0005-drop-login-and-sync) 取代
## 背景
@@ -0,0 +1,70 @@
# 0005 个人自用,去掉登录与云同步
- 状态:已采纳
- 日期:2026-10-22
- 关联:[0002 反馈与固定 id](./0002-feedback-and-ids)(保留反馈链路)、[0004 只保留 Web](./0004-web-only)
## 背景
- 这份部署只给本人用,没有第二个用户,也不需要在多台设备之间来回。
- 但登录链路一直没有停用:云乐坊 SSO 授权(`@yunlefun/sso` 0.7.0)、PKCE 顶层重定向回
`/auth/callback`、CloudBase 会话持久化、收藏与浏览历史的云端双向同步、获客归因埋点,
以及为支持多账号切换而写的 `lastUid` 记账。
- 这套东西的成本不只是代码量:
- 每次登录状态检查失败都会在「我的」页显示错误提示,而它对个人自用毫无意义;
- 云同步失败时用户看到的是「云端同步失败,点击重试」,同样无法被单个人解决;
- `mergeUserData` 的账号切换分支、`UserDataSyncScheduler` 的退避重试、
`normalizeUserData` 对云端文档的信任边界,全部只为「多设备 + 多账号」存在。
- 界面上它也占了位置:「我的」页首屏是登录按钮、账号卡和四个统计格,其中「上次同步」
永远是空的或看不懂;「关于」页大半篇幅是项目作者、致谢名单和上游宣传链接。
## 方案对比
| 问题 | 方案 | 取舍 |
| ------------ | ----------------------------------- | -------------------------------------------------------- |
| 登录功能去留 | 保留登录,仅隐藏界面入口 | 入口消失,但 6 个云函数依赖、回调页和死代码仍在,误导性维护成本最高 |
| | 保留登录 + 保留云同步 | 对单用户没有任何收益;同步失败路径无法自愈 |
| | **完全移除登录与云同步** | 收藏/历史跨设备要手动导出导入;换来链路消失、界面清爽、无失败态 |
## 决定
### 删除
- 登录链路:`composables/useYunlefunAuth.ts`、`utils/yunlefunAuth.ts`、`utils/yunlefunSsoConfig.ts`、
`adapters/yunlefunAuth.ts`、`plugins/yunlefun-auth.client.ts`、`pages/auth/callback.vue`、
`public/.well-known/apple-app-site-association`(唯一 path 就是回调页)。
- 云同步链路:`composables/useUserDataSync.ts`、`utils/userDataSync.ts`、`adapters/userData.ts`、
`plugins/user-data-sync.client.ts`、`cloudfunctions/cook-user-data/`、
`scripts/cloudbase-rules/cook_user_data.json`、`cloudbaserc.json` 里对应的函数条目。
- 获客归因:`utils/acquisition.ts`、`plugins/acquisition.client.ts`。它只在 SSO 重定向上报,
登录没有了就没有消费者。
- 依赖:根与 `apps/web` 的 `@yunlefun/sso`,以及 `pnpm-workspace.yaml` 里为它开的
`minimumReleaseAgeExclude` 例外。`@cloudbase/js-sdk` 保留(反馈仍需要)。
- 界面:「我的」页的登录按钮、账号卡、四个统计格、退出登录;「关于」页的项目作者、致谢名单、
网页版本、旅程的起点、前世今生。随之孤立的 `pages/about/me.vue`、
`pages/about/acknowledgements.vue`、`components/TheAboutList.vue`、
`constants/acknowledgements.ts` 一并删除。
- 文案:设置页和帮助页里「登录后会自动同步」的说明改为「换设备可导出再导入」。
### 保留
- **反馈链路**:`cook-feedback` 云函数与「反馈一下」、匿名筛选信号。它本来就不强制登录,
未登录时用随机 device id 去重限流。`callCloudbaseFunction` 从 `adapters/yunlefunAuth.ts`
抽到新的 `adapters/cloudbase.ts`,`useRecipeFeedback` 直接调用,CloudBase 环境变量
`yunlefunCloudbaseEnv` 保留。
- **本地数据**:收藏、历史、自己记的菜谱照旧存在浏览器 localStorage。设置页的导出/导入
(`exportLocalUserData` / `importLocalUserData`)是现在唯一的跨设备手段,删除墓碑
(`favoriteRemovals` / `historyRemovals` / `historyClearedAt`)继续生效,避免导入时复活已删除的记录。
- `utils/analytics.ts` 的 `isPrivateAnalyticsUrl`:它遮蔽 `/auth` 路径和
`ticket` / `code` / `access_token` 等凭证参数,是通用的隐私防护,不随登录下线而删除。
- `utils/yunleHost.ts` 与云乐坊容器(`window.ylf`)集成:这是 Web 被嵌入第三方 App 的适配层,
与登录无关。
## 影响
- 收藏和历史不会自动跨设备。换设备或清浏览器数据前,需要在设置页导出 JSON 再导入。
- 「我的」页不再有账号卡和同步状态,因此没有「未登录」「同步失败」这类对个人无意义的提示。
- 云端不再有 `cook_user_data` 集合和它的读写流量。已部署的旧函数和集合需要手动在 CloudBase
控制台删除,代码里不再维护。
- 想要回来时:恢复 `@yunlefun/sso` 依赖和 `/auth/callback` 页面,把 `syncUserData` 与
`UserDataLocal` 的 `readLastUid` / `writeLastUid` 接回 `store/userData.ts` 即可。
+2 -1
View File
@@ -15,4 +15,5 @@
| [0001](./0001-recipe-data) | 菜谱数据的来源、质量与反馈闭环 | 提议中 |
| [0002](./0002-feedback-and-ids) | 菜谱固定 id、应用内反馈与筛选信号 | 已采纳 |
| [0003](./0003-native-ios-monorepo) | 原生 iOS App 与 monorepo 结构 | 被 0004 取代 |
| [0004](./0004-web-only) | 只保留 Web,移除 Capacitor 原生壳 | 已采纳 |
| [0004](./0004-web-only) | 只保留 Web,移除 Capacitor 原生壳 | 部分被 0005 取代 |
| [0005](./0005-drop-login-and-sync) | 个人自用,去掉登录与云同步 | 已采纳 |