新增文档说明
This commit is contained in:
112
spec_kit/Splash Consent/plan.md
Normal file
112
spec_kit/Splash Consent/plan.md
Normal file
@@ -0,0 +1,112 @@
|
||||
# Splash Consent(技术计划)
|
||||
|
||||
## 1. 计划目标
|
||||
|
||||
实现客户端开屏页(Splash/Welcome)与首次协议同意逻辑:
|
||||
|
||||
- 使用 `client/assets/images/index/` 的图片作为主视觉(例如 `index_flowers.png`)
|
||||
- 底部渐变按钮颜色:`#F69F7B → #F99CC0`
|
||||
- 按钮下方提供「隐私协议」「用户使用协议」外部链接入口(先用占位链接)
|
||||
- **仅首次出现按钮**:当 `consent.accepted=true` 后不再展示同意按钮与协议入口
|
||||
- 同意后进入现有启动分发:`app/index.tsx`(继续走 Onboarding/App Shell)
|
||||
|
||||
## 2. 默认技术决策
|
||||
|
||||
- **路由**:沿用 `expo-router`
|
||||
- **持久化**:沿用 `AsyncStorage`
|
||||
- **协议打开方式**:外部链接(`expo-web-browser` 或 `Linking.openURL`)
|
||||
- **渐变实现**:使用 `expo-linear-gradient`(Expo 官方)
|
||||
|
||||
## 3. 路由与流程设计
|
||||
|
||||
### 3.1 新增路由
|
||||
|
||||
- `app/(splash)/splash.tsx`:开屏页(图片 + 首次同意按钮/协议入口)
|
||||
- `app/(splash)/_layout.tsx`:可选(一般无需 header)
|
||||
|
||||
### 3.2 启动分发逻辑(与现有流程集成)
|
||||
|
||||
当前已存在启动分发 `app/index.tsx`(根据 `onboarding.completed` 跳转)。
|
||||
|
||||
本需求将启动分发扩展为两段判断:
|
||||
|
||||
1. 若 `consent.accepted !== true`:跳转到 `/(splash)/splash`
|
||||
2. 若 `consent.accepted === true`:沿用原逻辑(进入 Onboarding 或 `/(app)/home`)
|
||||
|
||||
> 注意:你确认的是“隐藏按钮而不是隐藏页面”。因此当 `consent.accepted=true` 时,开屏页不需要停留;可直接跳过该页进入原启动分发。
|
||||
|
||||
## 4. 数据与持久化
|
||||
|
||||
### 4.1 Key
|
||||
|
||||
- `consent.accepted`: boolean
|
||||
|
||||
### 4.2 存储封装
|
||||
|
||||
在现有 `src/storage/appStorage.ts` 中补充:
|
||||
|
||||
- `getConsentAccepted(): Promise<boolean>`
|
||||
- `setConsentAccepted(accepted: boolean): Promise<void>`
|
||||
|
||||
并确保所有 UI 不直接硬编码 key。
|
||||
|
||||
## 5. UI 细节与交互
|
||||
|
||||
### 5.1 开屏布局(建议)
|
||||
|
||||
- 主视觉图片:
|
||||
- 使用 `index_flowers.png`
|
||||
- 适配:`resizeMode="contain"` 或按实际视觉调整(不裁切关键内容)
|
||||
- 底部区域(贴近安全区):
|
||||
- 渐变按钮(圆角、阴影/投影轻微)
|
||||
- 协议入口(两段文字按钮,左右排列或一行内间隔)
|
||||
|
||||
### 5.2 渐变按钮(仅首次出现)
|
||||
|
||||
- 展示条件:`consent.accepted !== true`
|
||||
- 点击行为:
|
||||
- 写入 `consent.accepted=true`
|
||||
- 跳转到 `/`(触发 `app/index.tsx` 继续分发)
|
||||
|
||||
### 5.3 协议入口(外部链接,先占位)
|
||||
|
||||
- 「隐私协议」:`https://example.com/privacy`
|
||||
- 「用户使用协议」:`https://example.com/terms`
|
||||
|
||||
打开方式:
|
||||
|
||||
- 优先:`expo-web-browser` 打开外部链接
|
||||
- 兜底:`Linking.openURL`
|
||||
|
||||
## 6. i18n 文案
|
||||
|
||||
新增 key(至少 `zh-CN/en`,其余语言可逐步补齐):
|
||||
|
||||
- `consent.title`(可选)
|
||||
- `consent.agree`(按钮文案:同意并继续)
|
||||
- `consent.privacy`(隐私协议)
|
||||
- `consent.terms`(用户使用协议)
|
||||
|
||||
## 7. 实施步骤
|
||||
|
||||
1. 新增 `consent.accepted` 的存储读写方法
|
||||
2. 新增 `/(splash)/splash` 页面(图片 + 渐变按钮 + 协议入口)
|
||||
3. 修改 `app/index.tsx`:在 onboarding 分发前插入 consent gate
|
||||
4. 接入 `expo-linear-gradient` 并完成按钮 UI
|
||||
5. 接入外部链接打开(先占位 URL)
|
||||
6. 补齐 i18n key(至少 zh-CN/en)
|
||||
7. 自测:
|
||||
- 首次启动:显示按钮与入口;同意后进入 Onboarding/App
|
||||
- 再次启动:不再出现同意按钮,直接进入后续流程
|
||||
|
||||
## 8. 验收标准
|
||||
|
||||
- 首次启动:
|
||||
- 展示开屏图片
|
||||
- 渐变按钮颜色正确(`#F69F7B → #F99CC0`)
|
||||
- 协议入口可点击并打开外部链接
|
||||
- 点击同意后进入后续流程
|
||||
- 非首次启动:
|
||||
- 不再出现同意按钮与协议入口
|
||||
- 直接进入后续流程(Onboarding/App Shell)
|
||||
|
||||
Reference in New Issue
Block a user