Files
what-to-eat/docs/decisions/0005-drop-login-and-sync.md
T
toor 8ff7b879b9 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
2026-10-22 15:52:54 +08:00

70 lines
5.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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` 即可。