Files
life-echo/docs/react-web-migration.md
2026-02-21 09:37:40 +01:00

226 lines
10 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.
# app-android 迁移至 React Web 应用计划
> **目标**:将现有 Kotlin + Jetpack Compose 原生 Android 应用迁移为**纯 React Web 应用**,不再依赖任何原生 iOS/Android 代码,统一为浏览器端运行。
---
## 1. app-android 现状摘要
### 1.1 技术栈
| 层级 | 技术 | 说明 |
|------|------|------|
| 语言 | Kotlin 1.9+ | 主语言 |
| UI | Jetpack Compose | 声明式 UI |
| 架构 | MVVM | ViewModel + Compose |
| 网络 | Ktor | HTTP + WebSocket |
| 本地存储 | Room + DataStore | SQLite 数据库 + 键值存储 |
| 导航 | Navigation Compose | 声明式导航 |
| 图片 | Coil | 图片加载 |
| 主题 | Material 3 | 深色/浅色主题 |
| 支付 | 微信支付 / 支付宝 | 原生 SDK 集成 |
### 1.2 项目结构
```
app-android/
├── config/ # AppConfig (API 地址、BuildConfig)
├── data/ # 数据层
│ ├── auth/ # TokenManager (DataStore)
│ ├── database/ # Room (AppDatabase, Entity, DAO)
│ ├── preferences/ # TokenPreferences
│ └── repository/ # Conversation/Chapter/Message/Payment/Profile Repository
├── network/ # 网络层
│ ├── ApiService # REST API (Ktor + Bearer Auth)
│ ├── AuthService # 登录/注册/刷新 Token
│ ├── WebSocketClient
│ └── models/ # 请求/响应 DTO
├── ui/
│ ├── screens/ # 20+ 屏幕
│ ├── components/ # 可复用组件
│ ├── theme/ # Color, Theme, Type
│ ├── viewmodel/ # 7 个 ViewModel
│ └── settings/ # AppSettings (深色模式等)
├── navigation/ # Screen 路由 + AppNavigation
├── feature/ # VoiceRecorder 等
└── utils/ # 工具类
```
### 1.3 功能模块清单
| 模块 | screens / 组件 | ViewModel |
|------|-----------------|-----------|
| 认证 | Login, Register, NicknameSetup, ResetPassword, AccountManagement | AuthViewModel |
| 对话 | ConversationList, CreateMemory | ConversationListViewModel, CreateMemoryViewModel |
| 回忆录 | MyMemoir, ChapterReading, FullTextReading | MyMemoirViewModel |
| 个人中心 | Profile, PersonalInfo | ProfileViewModel |
| 套餐/支付 | UpgradePlan, PlanDetails, PlanBalance, MyOrders | PaymentViewModel |
| 设置/帮助 | FAQ, Feedback, About, ExportData, LegalDocument | - |
### 1.4 核心能力
- **认证**手机号注册、登录、JWT Token 管理、刷新 Token、DataStore 持久化
- **对话**WebSocket 实时语音对话、消息收发、TTS 播放
- **回忆录**章节列表、阅读、全文、PDF 导出、对话整理为章节
- **支付**:微信支付、支付宝、套餐、订单、余额
- **本地数据**Room 存储 Conversation/Chapter/Message离线同步
- **主题**深色模式、Material 3
---
## 2. 迁移策略
- 新建 **React Web 项目**Vite + React 或 Create React App不复用 app-ios
-**模块/功能** 逐步迁移,优先核心流程(登录 → 对话 → 回忆录)
- 保留 API 契约不变,仅替换客户端实现
- **零原生代码**:纯 Web 技术栈,部署为静态站点或 SPA
---
## 3. 迁移步骤 TODO
### Phase 0环境与基建前置
| # | 任务 | 说明 | 优先级 |
|---|------|------|--------|
| 0.1 | 初始化 React Web 项目 | `npm create vite@latest app-web -- --template react-ts` 或 CRA | P0 |
| 0.2 | 配置 API 环境 | 将 AppConfig.kt 中 BASE_URL / WS_BASE_URL 迁移为 env (VITE_*) | P0 |
| 0.3 | 搭建项目目录结构 | src/screens, components, services, store, hooks, themes | P1 |
| 0.4 | 配置路由 | React Router v6 | P0 |
### Phase 1认证与 Token 管理
| # | 任务 | 对应 Android 实现 | 说明 | 优先级 |
|---|------|-------------------|------|--------|
| 1.1 | Auth API 封装 | AuthService.kt | 注册、登录、刷新 Token | P0 |
| 1.2 | Token 持久化 | TokenManager + DataStore | localStorage 或 sessionStorage | P0 |
| 1.3 | 401 自动刷新 + 登出 | ApiService Auth plugin | axios 拦截器实现 Bearer + 刷新 | P0 |
| 1.4 | LoginScreen | LoginScreen.kt | 手机号 + 密码登录 | P0 |
| 1.5 | RegisterScreen | RegisterScreen.kt | 手机号注册 | P0 |
| 1.6 | NicknameSetupScreen | NicknameSetupScreen.kt | 首次登录昵称设置 | P1 |
| 1.7 | ResetPasswordScreen | ResetPasswordScreen.kt | 重置密码 | P1 |
| 1.8 | AccountManagementScreen | AccountManagementScreen.kt | 账号管理、登出 | P1 |
### Phase 2导航与主框架
| # | 任务 | 对应 Android 实现 | 说明 | 优先级 |
|---|------|-------------------|------|--------|
| 2.1 | 路由定义 | Screen sealed class | 定义所有 route 常量 / 路径 | P0 |
| 2.2 | 底部 Tab 导航 | MainActivity BottomNav | 聊天 / 回忆录 / 我的 三个 Tab | P0 |
| 2.3 | 栈式页面导航 | AppNavigation.kt | React Router `<Outlet>` / 嵌套路由 | P0 |
| 2.4 | 登录态路由守卫 | ProtectedRoute 组件 | 未登录 → 重定向 Login | P0 |
| 2.5 | 过渡动画 | NavigationTransitions | 视需求用 CSS transition 或 Framer Motion | P2 |
### Phase 3REST API 与数据层
| # | 任务 | 对应 Android 实现 | 说明 | 优先级 |
|---|------|-------------------|------|--------|
| 3.1 | API Client 封装 | ApiService.kt | axios 实例、baseURL、timeout | P0 |
| 3.2 | 对话相关 API | ApiService 对话接口 | create/list/get conversation | P0 |
| 3.3 | 回忆录/章节 API | ApiService 章节/书籍接口 | books, chapters, PDF 等 | P0 |
| 3.4 | 支付/套餐 API | ApiService 支付接口 | plans, orders, balance | P1 |
| 3.5 | 用户/配置 API | ApiService Profile | 用户信息、FAQ、反馈 | P1 |
| 3.6 | 数据模型 (TypeScript) | network/models/*.kt | 定义请求/响应类型 | P0 |
### Phase 4WebSocket 与对话功能
| # | 任务 | 对应 Android 实现 | 说明 | 优先级 |
|---|------|-------------------|------|--------|
| 4.1 | WebSocket Client | WebSocketClient.kt | 原生 `WebSocket` API心跳、重连 | P0 |
| 4.2 | WebSocket 消息协议 | WebSocketMessage.kt | type / payload 解析 | P0 |
| 4.3 | 消息收发逻辑 | CreateMemoryViewModel | sendAudio/sendText、接收 TTS/文本 | P0 |
| 4.4 | 浏览器录音 | VoiceRecorder.kt | `MediaRecorder` APIgetUserMedia | P0 |
| 4.5 | ConversationListScreen | ConversationListScreen.kt | 对话列表 | P0 |
| 4.6 | CreateMemoryScreen | CreateMemoryScreen.kt | 聊天详情、语音输入 | P0 |
| 4.7 | MessageBubble / ChatInputField | 对应 Compose 组件 | 消息气泡、输入框 | P0 |
| 4.8 | 音频播放 (TTS) | CreateMemoryViewModel 中 TTS | `HTMLAudioElement` / `new Audio()` | P0 |
### Phase 5回忆录模块
| # | 任务 | 对应 Android 实现 | 说明 | 优先级 |
|---|------|-------------------|------|--------|
| 5.1 | MyMemoirScreen | MyMemoirScreen.kt | 回忆录 Tab 主页 | P0 |
| 5.2 | 章节列表 | ChapterCard, BookInfoCard | 书籍/章节列表展示 | P0 |
| 5.3 | ChapterReadingView | 章节阅读 | 单章阅读 | P0 |
| 5.4 | FullTextReadingView | 全文阅读 | 完整回忆录阅读 | P1 |
| 5.5 | PDF 导出 | MyMemoirViewModel 导出逻辑 | 调用 API 获取 PDF`blob` 下载或新窗口打开 | P1 |
| 5.6 | OrganizeConversationDialog | 对话整理为章节 | 弹窗 + API 调用 | P1 |
### Phase 6个人中心与支付
| # | 任务 | 对应 Android 实现 | 说明 | 优先级 |
|---|------|-------------------|------|--------|
| 6.1 | ProfileScreen | ProfileScreen.kt | 我的 Tab、未登录/已登录 UI | P0 |
| 6.2 | PersonalInfoScreen | PersonalInfoScreen.kt | 个人信息、头像上传 | P1 |
| 6.3 | UpgradePlanScreen | UpgradePlanScreen.kt | 套餐选择 | P1 |
| 6.4 | PlanDetailsScreen / PlanBalanceScreen | 套餐详情、余额 | P1 |
| 6.5 | MyOrdersScreen | 订单列表 | P1 |
| 6.6 | 微信/支付宝支付 | PaymentUtils | 使用 H5 支付:微信 JSAPI / 支付宝网页支付 | P2 |
| 6.7 | FAQScreen / FeedbackScreen | 常见问题、反馈 | P1 |
| 6.8 | AboutScreen / LegalDocumentScreen | 关于、条款、隐私 | P1 |
| 6.9 | ExportDataScreen | 数据导出 | P2 |
### Phase 7本地存储可选
| # | 任务 | 对应 Android 实现 | 说明 | 优先级 |
|---|------|-------------------|------|--------|
| 7.1 | 本地缓存 | Room + Repository | localStorage / IndexedDB如 dexie.js| P2 |
| 7.2 | 离线同步逻辑 | Repository 同步 | 视产品需求决定是否保留 | P2 |
### Phase 8主题、设置与收尾
| # | 任务 | 对应 Android 实现 | 说明 | 优先级 |
|---|------|-------------------|------|--------|
| 8.1 | 主题系统 | LifeechoTheme, Color.kt | CSS 变量 + 深色/浅色 media/切换 | P1 |
| 8.2 | 主题持久化 | AppSettings.kt | localStorage 保存用户偏好 | P1 |
| 8.3 | 国际化 (i18n) | strings.xml | react-i18next 或类似 | P2 |
| 8.4 | 麦克风权限 | RECORD_AUDIO | 浏览器 `navigator.mediaDevices.getUserMedia` 需 HTTPS | P0 |
### Phase 9构建与发布
| # | 任务 | 说明 | 优先级 |
|---|------|------|--------|
| 9.1 | 生产构建 | `npm run build`Vite 输出 dist/| P0 |
| 9.2 | 静态托管部署 | 部署至 Vercel / Netlify / Nginx 等 | P0 |
| 9.3 | 版本号与 CI | 对齐现有 GitHub Actions若有| P1 |
---
## 4. 技术映射速查
| Android (Kotlin) | React Web 对应 |
|------------------|-----------------|
| Jetpack Compose | React 组件 + CSS / Tailwind / styled-components |
| ViewModel + StateFlow | useState / useReducer / Zustand / React Query |
| Navigation Compose | React Router v6 |
| Ktor HttpClient | axios / fetch |
| Ktor WebSocket | 原生 `WebSocket` |
| Room | localStorage / IndexedDB或仅网络|
| DataStore | localStorage / sessionStorage |
| Coil | `<img>` / 原生加载 |
| Material 3 | 自定义主题 / MUI / shadcn/ui |
---
## 5. 风险与注意事项
1. **WebSocket + 语音**:浏览器端 WebSocket 稳定,录音需 `getUserMedia`HTTPS 环境下可用。
2. **支付**Web 端使用微信 H5 支付、支付宝网页支付,无需原生 SDK。
3. **本地数据**Web 无 SQLite可用 localStorage 简单缓存或 IndexedDB 做离线。
4. **性能**长列表用虚拟滚动react-window / react-virtuoso
5. **PWA**:可选做成 PWA支持离线与「添加到主屏幕」。
---
## 6. 建议执行顺序
1. **Phase 0 + 1 + 2**:基建 + 认证 + 导航,打通「登录 → 主框架」。
2. **Phase 3 + 4**API + WebSocket + 对话,实现核心对话流程。
3. **Phase 5**:回忆录浏览与阅读。
4. **Phase 6**:个人中心与基础套餐展示(支付可延后)。
5. **Phase 7 / 8 / 9**:按需推进本地存储、主题、构建发布。
---
*文档版本1.0 | 更新日期2025-02-15*