226 lines
10 KiB
Markdown
226 lines
10 KiB
Markdown
|
|
# 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 3:REST 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 4:WebSocket 与对话功能
|
|||
|
|
|
|||
|
|
| # | 任务 | 对应 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` API(getUserMedia) | 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*
|