# QMox dev 现状 H5 · 源码对照表

基准：本地 `dev` / `f079dcc951be0d098a27aae4239096468107e4f3`；应用版本 `1.2.0+47`；生成日 2026-10-23。

旧 H5 只用于理解原型的呈现方式。页面、路由和行为以本地代码为依据。本轮不包含新增业务功能。

范围：**66 个 Dart 页面/容器文件、65 条 GoRoute 声明、207 组交互覆盖项**。容器、未接入组件和重复命名组件也单列；这些数字不是 66 个正式产品入口，也不是逻辑分支覆盖率。

交付是独立、可修改的客户端交互基线。真实 API、支付、扫码、系统权限、音频、分享和外部协议由可辨认的模拟或占位承担；不能据此证明原生 App、后端或硬件工作正常。样例图片、身份、金额、统计和日期不作为产品事实。

## 页面映射

| 模块 / 页面 | Flutter 源文件 | 路由 / 接入方式 | H5 实现与入口 | 覆盖项组数 |
| --- | --- | --- | --- | --- |
| 认证 / 检查邮箱 | `lib/pages/auth/check_email_page.dart` | /check-email | `pages.js:35` / `#/check-email` | 2 |
| 认证 / 重置密码 | `lib/pages/auth/forgot_password_page.dart` | /forgot-password | `pages.js:34` / `#/forgot-password` | 3 |
| 认证 / 登录 | `lib/pages/auth/login_page.dart` | 组件直接构造/导航容器 | `pages.js:32` / `#/login` | 5 |
| 认证 / 欢迎首页 | `lib/pages/auth/onboarding_page.dart` | 组件直接构造/导航容器 | `pages.js:31` / `#/onboarding` | 2 |
| 认证 / 注册 | `lib/pages/auth/register_page.dart` | 组件直接构造/导航容器 | `pages.js:33` / `#/register` | 4 |
| 认证 / 第三方登录绑定手机 | `lib/pages/auth/social_bind_phone_page.dart` | /social-bind-phone | `pages.js:36` / `#/social-bind-phone` | 3 |
| 认证 / 启动页 | `lib/pages/auth/splash_page.dart` | /splash | `pages.js:30` / `#/splash` | 3 |
| 认证 / 注册成功选择 | `lib/pages/auth/welcome_page.dart` | /welcome | `pages.js:37` / `#/welcome` | 2 |
| 引导 / 初始化失败 | `lib/pages/common/init_error_page.dart` | /init-error | `pages.js:38` / `#/init-error` | 2 |
| 引导 / 设置恢复 | `lib/pages/common/setup_recovery_page.dart` | /setup-recovery | `pages.js:39` / `#/setup-recovery` | 4 |
| 支持 / 内嵌网页 | `lib/pages/common/web_view_page.dart` | 组件直接构造/导航容器 | `pages.js:85` / `#/web-view` | 3 |
| 引导 / 引导添加孩子 | `lib/pages/guide/child_add_page.dart` | 组件直接构造/导航容器 | `pages.js:42` / `#/child-info` | 3 |
| 引导 / 引导连接设备 | `lib/pages/guide/device_connect_page.dart` | /main/add-guide | `pages.js:40` / `#/add-guide` | 3 |
| 引导 / 连接帮助 | `lib/pages/guide/help_connect_page.dart` | /help-connect | `pages.js:41` / `#/help-connect` | 3 |
| 引导 / 设置完成 | `lib/pages/guide/setup_complete_page.dart` | /setup-complete | `pages.js:45` / `#/setup-complete` | 2 |
| 成长 / 奖章 | `lib/pages/main/activity/badges_page.dart` | /main/badges | `pages.js:60` / `#/badges` | 2 |
| 源码附录 / 旧物种详情（未接入） | `lib/pages/main/activity/discovery_detail_page.dart` | 无调用证据；仅源码附录，不接入正式流程 | `pages.js:56` / `#/legacy-discovery` | 2 |
| 成长 / 探索时间线 | `lib/pages/main/activity/explore_page.dart` | /main/explore | `pages.js:54` / `#/explore` | 3 |
| 成长 / 探索者等级 | `lib/pages/main/activity/explorer_level_page.dart` | /main/explorer-level | `pages.js:61` / `#/explorer-level` | 3 |
| 成长 / 最近活动 | `lib/pages/main/activity/recent_activities_page.dart` | /main/recent-activities | `pages.js:55` / `#/recent-activities` | 2 |
| 主页面 / 活动 | `lib/pages/main/activity/today_page.dart` | 组件直接构造/导航容器 | `pages.js:49` / `#/today` | 5 |
| 内容 / 对话详情 | `lib/pages/main/chat/chat_detail_page.dart` | /main/chat-detail | `pages.js:52` / `#/chat-detail` | 3 |
| 主页面 / 聊天历史 | `lib/pages/main/chat/chat_history_page.dart` | 组件直接构造/导航容器 | `pages.js:51` / `#/chat-history` | 3 |
| 支持 / 在线客服 | `lib/pages/main/chat/live_chat_page.dart` | /main/live-chat | `pages.js:81` / `#/live-chat` | 3 |
| 源码附录 / 探索页导航容器 | `lib/pages/main/main_layout.dart` | 组件直接构造/导航容器 | `pages.js:94` / `#/main-layout` | 2 |
| 源码附录 / 主导航容器 | `lib/pages/main/main_tab_page.dart` | /main | `pages.js:95` / `#/main-tabs` | 3 |
| 设置 / 关于我们 | `lib/pages/main/me/about_page.dart` | /main/about | `pages.js:82` / `#/about` | 3 |
| 家庭与设备 / 添加孩子 | `lib/pages/main/me/add_child_page.dart` | 组件直接构造/导航容器 | `pages.js:42` / `#/add-child` | 4 |
| 家庭与设备 / 添加设备 | `lib/pages/main/me/add_device_page.dart` | /main/add-device | `pages.js:40` / `#/add-device` | 3 |
| 设置 / 修改密码 | `lib/pages/main/me/change_password_page.dart` | /main/change-password | `pages.js:72` / `#/change-password` | 3 |
| 家庭与设备 / 孩子详情 | `lib/pages/main/me/child_detail_page.dart` | /main/child-detail | `pages.js:62` / `#/child-detail` | 3 |
| 家庭与设备 / 设备设置 | `lib/pages/main/me/device_settings_page.dart` | /main/guide-settings | `pages.js:70` / `#/guide-settings` | 5 |
| 成长 / 物种详情 | `lib/pages/main/me/discovery_detail_page.dart` | /main/discovery-detail | `pages.js:56` / `#/discovery-detail` | 3 |
| 家庭与设备 / 编辑孩子资料 | `lib/pages/main/me/edit_child_profile_page.dart` | /main/edit-child-profile | `pages.js:42` / `#/edit-child-profile` | 4 |
| 设置 / 编辑个人资料 | `lib/pages/main/me/edit_profile_page.dart` | /main/edit-profile | `pages.js:64` / `#/edit-profile` | 3 |
| 设置 / 验证邮箱 | `lib/pages/main/me/email_verification_page.dart` | 组件直接构造/导航容器 | `pages.js:65` / `#/email-verification` | 2 |
| 设置 / 数据报告预览 | `lib/pages/main/me/export_preview_page.dart` | 组件直接构造/导航容器 | `pages.js:76` / `#/export-preview` | 4 |
| 家庭与设备 / 家庭成员 | `lib/pages/main/me/family_members_page.dart` | /main/family-members | `pages.js:66` / `#/family-members` | 4 |
| 成长 / 图鉴 | `lib/pages/main/me/field_guide_page.dart` | /main/field-guide | `pages.js:57` / `#/field-guide` | 2 |
| 支持 / 帮助文章 | `lib/pages/main/me/help_article_page.dart` | /main/help-article | `pages.js:80` / `#/help-article` | 3 |
| 支持 / 帮助与支持 | `lib/pages/main/me/help_support_page.dart` | /main/help-support | `pages.js:79` / `#/help-support` | 4 |
| 家庭与设备 / 邀请成员 | `lib/pages/main/me/invite_member_page.dart` | /main/invite-member | `pages.js:67` / `#/invite-member` | 4 |
| 家庭与设备 / 加入家庭 | `lib/pages/main/me/join_family_page.dart` | /main/join-family | `pages.js:68` / `#/join-family` | 5 |
| 设置 / 语言 | `lib/pages/main/me/language_settings_page.dart` | /main/language-settings | `pages.js:77` / `#/language-settings` | 2 |
| 家庭与设备 / 关联孩子 | `lib/pages/main/me/link_to_child_page.dart` | /main/link-to-child、/main/add-child | `pages.js:43` / `#/link-to-child` | 3 |
| 家庭与设备 / 关联设备 | `lib/pages/main/me/link_to_device_page.dart` | /main/link-to-device | `pages.js:44` / `#/link-to-device` | 3 |
| 主页面 / 我的 | `lib/pages/main/me/me_page.dart` | 组件直接构造/导航容器 | `pages.js:63` / `#/me` | 4 |
| 内容 / 消息中心 | `lib/pages/main/me/notifications_center_page.dart` | /main/notifications-center | `pages.js:74` / `#/notifications-center` | 4 |
| 设置 / 通知设置 | `lib/pages/main/me/notifications_page.dart` | /main/notifications | `pages.js:73` / `#/notifications` | 3 |
| 设置 / 隐私与数据 | `lib/pages/main/me/privacy_data_page.dart` | /main/privacy-data | `pages.js:75` / `#/privacy-data` | 3 |
| 设置 / 安全 | `lib/pages/main/me/security_page.dart` | /main/security | `pages.js:71` / `#/security` | 4 |
| 成长 / 物种分类 | `lib/pages/main/me/species_category_page.dart` | /main/species-category | `pages.js:58` / `#/species-category` | 2 |
| 订阅 / 订阅结算 | `lib/pages/main/me/subscription_checkout_page.dart` | /main/subscription/checkout | `pages.js:88` / `#/subscription-checkout` | 6 |
| 订阅 / 设备订阅详情 | `lib/pages/main/me/subscription_device_detail_page.dart` | /main/subscription/device | `pages.js:89` / `#/subscription-device` | 3 |
| 订阅 / 订阅历史 | `lib/pages/main/me/subscription_history_page.dart` | /main/subscription/history | `pages.js:90` / `#/subscription-history` | 3 |
| 订阅 / 订单详情 | `lib/pages/main/me/subscription_order_detail_page.dart` | /main/subscription/order/:orderNo | `pages.js:91` / `#/subscription-order-detail` | 3 |
| 订阅 / 订阅管理 | `lib/pages/main/me/subscription_page.dart` | /main/subscription | `pages.js:87` / `#/subscription` | 4 |
| 订阅 / 自动续费管理 | `lib/pages/main/me/subscription_renewal_management_page.dart` | /main/subscription/renewal | `pages.js:92` / `#/subscription-renewal` | 4 |
| 订阅 / 订阅成功 | `lib/pages/main/me/subscription_success_page.dart` | /main/subscription/success | `pages.js:93` / `#/subscription-success` | 3 |
| 家庭与设备 / 切换家庭 | `lib/pages/main/me/switch_family_page.dart` | /main/switch-family | `pages.js:69` / `#/switch-family` | 3 |
| 支持 / 版本详情 | `lib/pages/main/me/version_detail_page.dart` | /main/version-detail/:id | `pages.js:84` / `#/version-detail` | 2 |
| 支持 / 版本历史 | `lib/pages/main/me/version_history_page.dart` | /main/version-history | `pages.js:83` / `#/version-history` | 2 |
| 内容 / 作品详情 | `lib/pages/main/photos/artwork_detail_page.dart` | /main/artwork-detail | `pages.js:53` / `#/artwork-detail` | 3 |
| 成长 / 相册物种分类 | `lib/pages/main/photos/category_species_page.dart` | /main/category-species | `pages.js:59` / `#/category-species` | 2 |
| 内容 / 照片详情 | `lib/pages/main/photos/photo_detail_page.dart` | /main/photo-detail | `pages.js:53` / `#/photo-detail` | 4 |
| 主页面 / 相册 | `lib/pages/main/photos/photos_page.dart` | 组件直接构造/导航容器 | `pages.js:50` / `#/photos` | 3 |

## 路由声明索引

来源：`app_router.dart`。此表为声明级提取；重定向守卫见原文件和模型说明。

| 路径 | 构造类 | 重定向 |
| --- | --- | --- |
| `/splash` | SplashPage | 构造页面 / 详见路由源码 |
| `/` | OnboardingPage | 构造页面 / 详见路由源码 |
| `/login` | LoginPage | 构造页面 / 详见路由源码 |
| `/register` | RegisterPage | 构造页面 / 详见路由源码 |
| `/social-bind-phone` | SocialBindPhonePage | 构造页面 / 详见路由源码 |
| `/forgot-password` | ForgotPasswordPage | 构造页面 / 详见路由源码 |
| `/check-email` | CheckEmailPage | 构造页面 / 详见路由源码 |
| `/welcome` | WelcomePage | 构造页面 / 详见路由源码 |
| `/setup-recovery` | SetupRecoveryPage | 构造页面 / 详见路由源码 |
| `/init-error` | InitErrorPage | 构造页面 / 详见路由源码 |
| `/child-info` | ChildAddPage | 构造页面 / 详见路由源码 |
| `/guide-pair-scan` | — | → `/main/add-guide` |
| `/link-to-child` | — | → `/main/add-child` |
| `/main/link-to-child` | LinkToChildPage | 构造页面 / 详见路由源码 |
| `/main/link-to-device` | LinkToDevicePage | 构造页面 / 详见路由源码 |
| `/main/about` | AboutPage | 构造页面 / 详见路由源码 |
| `/main/version-history` | VersionHistoryPage | 构造页面 / 详见路由源码 |
| `/main/version-detail/:id` | VersionDetailPage | 构造页面 / 详见路由源码 |
| `/setup-complete` | SetupCompletePage | 构造页面 / 详见路由源码 |
| `/help-connect` | HelpConnectPage | 构造页面 / 详见路由源码 |
| `/subscribe` | — | 构造页面 / 详见路由源码 |
| `/main` | NoTransitionPage, MainTabPage | 构造页面 / 详见路由源码 |
| `/main/today` | — | → `/main` |
| `/main/chat-history` | — | → `/main` |
| `/main/photos` | — | → `/main` |
| `/main/me` | — | → `/main` |
| `/main/explore` | NoTransitionPage, ExplorePage | 构造页面 / 详见路由源码 |
| `/main/photo-detail` | NoTransitionPage, NoTransitionPage, PhotoDetailPage | 构造页面 / 详见路由源码 |
| `/main/artwork-detail` | NoTransitionPage, NoTransitionPage, ArtworkDetailPage | 构造页面 / 详见路由源码 |
| `/main/discovery-detail` | NoTransitionPage, NoTransitionPage, DiscoveryDetailPage | 构造页面 / 详见路由源码 |
| `/main/recent-activities` | NoTransitionPage, RecentActivitiesPage | 构造页面 / 详见路由源码 |
| `/main/chat-detail` | NoTransitionPage, NoTransitionPage, ChatDetailPage | 构造页面 / 详见路由源码 |
| `/main/edit-profile` | EditProfilePage | 构造页面 / 详见路由源码 |
| `/main/explorer-level` | ExplorerLevelPage | 构造页面 / 详见路由源码 |
| `/main/field-guide` | FieldGuidePage | 构造页面 / 详见路由源码 |
| `/main/species-category` | SpeciesCategoryPage | 构造页面 / 详见路由源码 |
| `/main/category-species` | CategorySpeciesPage | 构造页面 / 详见路由源码 |
| `/main/badges` | BadgesPage | 构造页面 / 详见路由源码 |
| `/main/child-detail` | ChildDetailPage | 构造页面 / 详见路由源码 |
| `/main/edit-child-profile` | EditChildProfilePage | 构造页面 / 详见路由源码 |
| `/main/guide-settings` | DeviceSettingsPage | 构造页面 / 详见路由源码 |
| `/main/notifications` | NotificationsPage | 构造页面 / 详见路由源码 |
| `/main/notifications-center` | NotificationsCenterPage | 构造页面 / 详见路由源码 |
| `/main/privacy-data` | PrivacyDataPage | 构造页面 / 详见路由源码 |
| `/main/security` | SecurityPage | 构造页面 / 详见路由源码 |
| `/main/subscription` | SubscriptionPage | 构造页面 / 详见路由源码 |
| `/main/subscription/checkout` | SubscriptionCheckoutPage | 构造页面 / 详见路由源码 |
| `/main/subscription/success` | SubscriptionSuccessPage | 构造页面 / 详见路由源码 |
| `/main/subscription/history` | SubscriptionHistoryPage | 构造页面 / 详见路由源码 |
| `/main/subscription/order/:orderNo` | SubscriptionOrderDetailPage | 构造页面 / 详见路由源码 |
| `/main/subscription/renewal` | SubscriptionRenewalManagementPage | 构造页面 / 详见路由源码 |
| `/main/subscription/device` | SubscriptionDeviceDetailPage | 构造页面 / 详见路由源码 |
| `/main/change-password` | ChangePasswordPage | 构造页面 / 详见路由源码 |
| `/main/help-support` | HelpSupportPage | 构造页面 / 详见路由源码 |
| `/main/live-chat` | LiveChatPage | 构造页面 / 详见路由源码 |
| `/main/help-article` | HelpArticlePage | 构造页面 / 详见路由源码 |
| `/main/add-child` | LinkToChildPage | 构造页面 / 详见路由源码 |
| `/main/add-guide` | DeviceConnectPage | 构造页面 / 详见路由源码 |
| `/main/add-device` | AddDevicePage | 构造页面 / 详见路由源码 |
| `/main/me/add-child` | AddChildPage | 构造页面 / 详见路由源码 |
| `/main/family-members` | FamilyMembersPage | 构造页面 / 详见路由源码 |
| `/main/switch-family` | SwitchFamilyPage | 构造页面 / 详见路由源码 |
| `/main/invite-member` | InviteMemberPage | 构造页面 / 详见路由源码 |
| `/main/join-family` | JoinFamilyPage | 构造页面 / 详见路由源码 |
| `/main/language-settings` | LanguageSettingsPage | 构造页面 / 详见路由源码 |

## 现状保留与还原边界

- **旧物种详情（未接入）**：旧同名组件未找到调用证据，只保留目录预览。正式物种详情使用 main/me/discovery_detail_page.dart。
- **相册物种分类**：源码 _loadData 只置空列表。保留空态，不能用另一物种分类页的有效列表替代。
- **最近活动**：源码 _loadActivities 只置空列表；筛选器可操作，结果仍为空。
- **帮助文章**：页面存在，但帮助中心当前不跳入此页；Chat with us 和相关文章为 TODO 空回调。目录展示示例文章参数。
- **帮助与支持**：分类和“查看全部文章”实际跳在线客服。邮件按钮仅显示邮箱，不发送邮件。
- **在线客服**：源码仅操作本地消息列表。输入后不新增自动回复或模拟客服会话。
- **家庭成员**：待处理邀请在当前页面加载逻辑中固定为空；重发为 TODO。生成演示邀请不改变这一展示。
- **邀请成员**：role 0/1 可邀请，role 2 被阻止。默认首个孩子和首台设备；设备步骤显示所有设备，未额外按孩子过滤。
- **加入家庭**：“手动输入代码 →”标题是空回调；下方输入框和加入按钮有效。二维码是不可扫码的占位。
- **设备设置**：AI 对话、创意工坊、地图任务开关在源码中被注释，H5 不显示。硬件信息和保存响应是示例。
- **安全**：活跃会话区域的方法未被 build 调用，H5 不显示。第三方绑定面板使用模拟返回。
- **通知设置**：系统拒绝通知授权时会关闭七类通知开关；隐私备份开关不受此规则影响。系统设置界面不在 H5 中复制。
- **订阅管理**：套餐、价格、权益数据来自接口，H5 值仅供演示。国内入口受开关控制；平台恢复购买仅模拟。
- **订阅结算**：支付 SDK 和后端激活状态分别模拟；只有确认生效才开放权益。不是可付款页面。
- **自动续费管理**：只列 autoRenewEnabled 设备；国内与查看者不显示平台管理入口。平台取消不会立即终止已付周期。
- **设置恢复**：是否进主页面以所有家庭是否存在孩子判断，不要求已绑设备；同时保留当前家庭的五种恢复状态。
- **主导航容器**：/main/today、/main/chat-history、/main/photos、/main/me 均重定向 /main。未传 initialIndex 时为活动页；实际 Tab 操作使用索引切换。
- **内嵌网页**：协议正文属于外部服务，未复制旧版协议或生成伪正文；仅还原容器、标题、返回和失败反馈。
- **语言**：七份语言表取自源码；H5 按匹配的静态文案翻译。组合文案、演示内容和跨平台布局仍需逐语言验收。
- **奖章**：源码按已获得和未解锁两组展示；卡片没有点击回调。
- **探索者等级**：三个指南为页内展开收起，非弹窗。
- **设备订阅详情**：已声明路由，未找到业务页内部跳入入口；保留目录预览。
- **数据报告预览**：原生图片导出和分享用模拟窗口表示；H5 可下载示例 SVG 统计摘要。该 SVG 不是 App 实际导出格式。
- **编辑个人资料**：手机号和邮箱均不可编辑；有手机号仅显示电话，否则显示邮箱及验证状态。仅昵称/头像可改，有修改才允许保存。
- **欢迎首页**：内部环境切换为源码已有隐藏入口，在原型中以说明代替。不复制服务配置或内部口令。
- **启动页**：真实启动动画和时序用“进入”控制演示；初始化、登录和家庭分流仍可走流程。

## 追溯数据

- `evidence/source-index.json`：页面 SHA-256、行数、方法行号、跳转/回调行号、调用方、导入和路由。
- `evidence/source-fingerprint.json`：本次源码与资源指纹；运行 `python3 scripts/check_source.py` 检查后续源码漂移。
- `scripts/coverage_spec.json`：逐页人工整理的交互清单。源码扫描不能自动推导完整行为。
- `model.js`：家庭、角色、校验、订单和场景状态；`app.js`：表单、导航、弹窗、模拟原生返回。
