# Likei H5 项目详情 ## 1. 项目定位 `likei-h5` 是一个运行在宿主 App WebView 中的多业务 H5 项目,技术栈以 `Vue 3 + Vite + Pinia + Vue Router + Vue I18n + Vant` 为主。 它不是单一落地页,而是一个按角色和业务域拆分的移动端前端集合,覆盖管理后台入口、代理中心、主播中心、钱包、充值、邀请、排行榜和活动页等场景。 当前运行模型默认优先适配 App 宿主环境,再兼容浏览器开发环境。 ## 2. 快速启动 ### 2.1 环境要求 - Node 版本: `^20.19.0 || >=22.12.0` - 包管理器: 当前仓库没有锁文件,默认按 `npm` 命令使用 ### 2.2 常用命令 ```bash npm install npm run dev npm run dev:test npm run dev:prod npm run build npm run build:test npm run build:prod npm run build:atu-prod npm run preview npm run lint ``` ### 2.3 环境文件 根目录当前可见的环境文件包括: - `.env` - `.env.development` - `.env.production` - `.env.production-atu` - `.env.test` 已确认工作区当前存在本地环境文件改动,至少 `.env.development` 不是干净状态。后续改代码时不要默认重置环境文件。 ### 2.4 构建说明 - 构建入口使用 `vite build` - 构建后会执行 `scripts/generate-version.js` - 该脚本会在 `dist/version.json` 写入版本信息 - 当前仓库没有测试脚本,`build` 更接近健康检查而不是测试替代 ## 3. 架构总览 ### 3.1 启动主链路 项目主链路从 `src/main.js` 开始: 1. 注册全局样式 2. 注册 `Pinia` 3. 注册 `Router` 4. 初始化 `i18n` 5. 执行版本检查 6. 挂载应用 核心入口文件: - `src/main.js` - `src/App.vue` - `src/router/index.js` ### 3.2 运行时核心链路 ```text main.js -> router.beforeEach -> routeGuard -> appBridge / appConnectionManager -> http headers 注入 -> 拉取用户资料 / 身份 -> permissionManager 计算角色权限 -> 放行到对应页面 -> 页面按需调用各自 API ``` ### 3.3 宿主 App 适配 宿主适配相关逻辑集中在: - `src/utils/appBridge.js` - `src/utils/appConnectionManager.js` - `src/utils/routeGuard.js` 当前桥接代码兼容以下宿主注入方式: - `window.app` - `window.webkit` - `window.FlutterPageControl` 说明: - 项目默认假设自己运行在 App 容器中 - 浏览器模式主要用于开发调试 - 宿主传入的认证和设备信息会被解析后写入公共请求头 ### 3.4 路由与权限 路由集中定义在 `src/router/index.js`,使用的是 `createWebHashHistory`。 这说明项目路由模型偏向嵌入式 H5,路径切换依赖 hash,而不是服务端 history 回退。 权限系统由以下文件共同组成: - `src/utils/routeGuard.js` - `src/utils/permissionManager.js` - `src/api/wallet.js` 中的身份接口 - `src/utils/userStore.js` 整体机制是: 1. 先判断是否为公共页 2. 非公共页先建立 App 连接 3. 再取用户资料与身份 4. 由 `permissionManager` 计算角色和可访问页面 5. 根据结果决定放行还是重定向 ### 3.5 页面初始化抽象 多个中心页复用了统一的页面初始化组合函数: - `src/utils/usePageInitialization.js` - `src/utils/pageConfig.js` 这套抽象负责统一处理: - App 连接 - 请求头注入 - 用户资料拉取 - 团队信息拉取 - 余额拉取 - 工作统计拉取 - 初始化完成后的回调 适合复用的页面类型主要是: - `HostCenter` - `AgencyCenter` - `BDCenter` - `BDLeaderCenter` - `Coin Seller` - 类似的首页/中心页 如果只是简单的活动页、排行榜页或单功能页,不一定需要接这套初始化。 ## 4. 目录结构 这里只记录高价值目录,不做全量文件罗列。 ```text . ├─ public/ 浏览器调试和静态入口文件 ├─ scripts/ 构建辅助脚本 ├─ src/ │ ├─ api/ 按业务域拆分的接口层 │ ├─ assets/ 图片、图标、字体、基础样式 │ ├─ components/ 公共组件 │ ├─ config/ 配置类文件 │ ├─ directives/ 自定义指令 │ ├─ locales/ 多语言资源和 i18n 初始化 │ ├─ router/ 路由定义 │ ├─ stores/ Pinia store │ ├─ styles/ 全局样式和字体 │ ├─ utils/ 基础设施、桥接、权限、缓存、工具函数 │ └─ views/ 页面级业务模块 ├─ .env* 多环境配置 ├─ vite.config.js Vite 配置 └─ package.json 脚本和依赖 ``` ## 5. 页面与业务模块地图 ### 5.1 Landing / 公共入口 目录: - `src/views/LandingPage` - `src/views/ApplyHost` - `src/views/PlatformPolicy` 主要职责: - 加载页 - 非 App 环境提示 - 申请加入流程 - 平台政策页 ### 5.2 角色中心 目录: - `src/views/AdminCenter` - `src/views/AgencyCenter` - `src/views/BDCenter` - `src/views/BDLeaderCenter` - `src/views/HostCenter` - `src/views/RechargeAgency` 这些目录是最核心的业务承载区,分别对应不同角色首页和管理能力。 其中: - `AdminCenter` 负责多团队管理、邀请和策略配置 - `AgencyCenter` 负责代理视角的团队、账单、消息和提现入口 - `BDCenter` / `BDLeaderCenter` 负责 BD 及其上级角色能力 - `HostCenter` 负责主播视角首页、工资、提现、设置 - `RechargeAgency` 对应 Coin Seller / Freight Agent 相关页面 ### 5.3 钱包与资金流 目录: - `src/views/Wallet` 主要包含: - 余额 - 转账 - 搜索收款人 - 金币兑换 - 历史薪资 - 资金明细 - 提现 - KYC - 银行卡 - 支付结果 这部分与角色中心页耦合较高,很多中心页会跳到这里完成具体资金操作。 ### 5.4 充值与支付 目录: - `src/views/Recharge` 主要包含: - 充值主页 - 支付方式 - 地图 - 充值引导 ### 5.5 邀请体系 目录: - `src/views/Invitation` 主要包含邀请不同角色和邀请注册相关页面。 ### 5.6 排行榜 目录: - `src/views/Ranking` 目前包含: - `Couple` - `GamesKing` - `KingAndQueen` - `Overall` - `WeeklyStar` ### 5.7 活动页 目录: - `src/views/Activities` 当前活动以专题形式存在,通常是独立业务页或赛季页,例如: - `LuckyDollars` - `SpringFestival` - `LesserBairam` - `LoginReward` - `Reward` 特点: - 页面独立性高 - 生命周期强 - 经常带倒计时、排行榜、奖励展示等逻辑 ## 6. 权限与角色模型 权限中心文件: - `src/utils/permissionManager.js` - `src/utils/routeGuard.js` ### 6.1 角色列表 当前角色常量定义为: - `admin` - `bdLeader` - `bd` - `agent` - `anchor` - `freightAgent` - `guest` ### 6.2 默认落地页 当前默认落地页映射为: - `admin` -> `/admin-center` - `freightAgent` -> `/coin-seller` - `agent` -> `/agency-center` - `bdLeader` -> `/bd-leader-center` - `bd` -> `/bd-center` - `anchor` -> `/host-center` - `guest` -> `/apply` ### 6.3 权限模型特点 - 权限是按角色和页面路径做映射,不是按按钮或接口粒度做权限 - `PUBLIC_PAGES` 中定义了公共可访问页 - 多角色用户会先算出所有角色,再根据优先级选主角色 - 页面权限判断核心方法是 `hasPagePermission` ### 6.4 什么时候需要改权限配置 如果新增页面属于以下情况之一,通常需要同步修改 `permissionManager.js`: - 新增角色专属页面 - 新增只有部分角色可访问的功能页 - 新增公共页 - 新增角色默认首页 如果只是现有角色中心下的子功能页,也建议明确补进对应角色的权限数组,避免路由守卫后续重定向异常。 ## 7. 数据与状态 这个项目不是纯 Pinia 架构,而是 `Pinia + utils 单例缓存` 的混合方式。 ### 7.1 Pinia store 当前 store 主要承担轻量或跨页状态: - `src/stores/lang.js` - `src/stores/identity.js` - `src/stores/country.js` - `src/stores/couple.js` - `src/stores/gamesKing.js` - `src/stores/rechargeTarget.js` - `src/stores/springFestival.js` - `src/stores/lastImg.js` 其中最常见的是: - `lang` 负责语言选择和持久化 - `identity` 负责页面层身份标签 ### 7.2 utils 单例缓存 下面这些文件承担了比普通工具函数更重的状态职责: - `src/utils/userStore.js` - `src/utils/appConnectionManager.js` - `src/utils/payeeStore.js` - `src/utils/applyStore.js` - `src/utils/coinSellerStore.js` 它们主要负责: - 用户资料缓存 - 团队信息缓存 - App 连接状态缓存 - 页面跨跳转时的业务状态缓存 ### 7.3 页面级状态 绝大多数页面仍然保留较多页面内 `ref/reactive` 状态,尤其是中心页和钱包页。 这意味着: - 通用能力已经抽出来一部分 - 业务细节仍然主要留在页面组件内部 后续改新页面时,优先判断状态到底属于: - 全局复用 - 多页跨跳转共享 - 单页临时状态 不要默认都进 Pinia。 ## 8. API 分层 接口层目录为 `src/api/`,按业务域拆分,而不是按 HTTP 方法拆分。 当前可见模块包括: - `activity.js` - `admin.js` - `bdCenter.js` - `bdLeaderCenter.js` - `couple.js` - `goodId.js` - `host.js` - `invitation.js` - `itemDistribution.js` - `lottery.js` - `pay.js` - `ranking.js` - `recruit.js` - `task.js` - `teamBill.js` - `topList.js` - `upload.js` - `userInfo.js` - `wallet.js` - `weeklyStar.js` ### 8.1 HTTP 基础层 请求基础能力集中在 `src/utils/http.js`: - `request` - `get` - `post` - `put` - `del` 同时负责: - 基础 API URL 拼接 - 公共请求头注入 - App 桥接后的 header 更新 - `ApiError` 包装 - HTTP 错误和业务错误归一化 ### 8.2 页面消费方式 页面通常直接从 `src/api/*` 导入接口方法使用,不会再经过 service facade。 常见模式是: 1. 页面或组合函数导入业务 API 2. 调接口后直接在页面中做字段转换 3. 再把结果写进页面状态 这意味着新增页面时,最好沿用现有风格,不要中途引入另一套完全不同的 service 架构,除非是一次明确的重构。 ### 8.3 什么时候新增 API 文件 建议在以下情况新增 `src/api/*.js`: - 新页面属于新的业务域 - 原有接口文件已经明显跨域和膨胀 - 新模块后续会持续扩展 如果只是现有钱包、邀请、活动、排行榜模块里的小功能,优先复用已有 API 文件。 ## 9. 国际化与样式 ### 9.1 国际化 国际化入口: - `src/locales/i18n.js` 当前语言资源: - `zh` - `en` - `ar` - `tr` - `bn` 特点: - 支持通过 `Pinia` 中的语言状态驱动切换 - 会根据语言设置 `document.documentElement` 的 `lang` 和 `dir` - 已显式支持 RTL,主要是阿拉伯语场景 ### 9.2 样式入口 全局样式入口: - `src/assets/main.css` - `src/styles/fonts.css` - `src/styles/global.css` 资源目录: - `src/assets/icon` - `src/assets/images` - `src/assets/fonts` 页面样式目前仍以页面内 `scoped style` 和局部内联样式为主,说明 UI 复用度还没有完全组件化。 ## 10. 开发约定 这一节是后续你我一起做新页面时最实用的部分。 ### 10.1 新页面放哪里 优先按业务域放到 `src/views/` 下已有模块目录中。 建议: - 角色首页相关功能放到对应角色目录 - 钱包相关放到 `src/views/Wallet` - 排行榜放到 `src/views/Ranking` - 活动专题放到 `src/views/Activities` 只有在确定是全新业务域时,才新开一级目录。 ### 10.2 何时复用 `usePageInitialization` 适合复用: - 角色中心首页 - 需要统一拉用户资料、团队信息、余额、工作统计的页面 - 需要在页面加载时完成 App 连接和数据初始化的页面 不一定适合复用: - 单功能表单页 - 活动专题页 - 排行榜页 - 只依赖少量接口的轻页面 ### 10.3 何时新增 `api/*` 优先复用现有 API 文件。只有在业务域明显独立时才新增新文件。 ### 10.4 何时修改权限配置 新增页面只要不是公共页,默认都要检查: - 是否需要在 `src/router/index.js` 注册 - 是否需要在 `src/utils/permissionManager.js` 增加角色访问权限 - 是否需要更新默认落地页或公共页配置 ### 10.5 何时修改用户或连接缓存 如果新页面依赖: - 用户资料 - 团队资料 - App 宿主头信息 优先复用: - `src/utils/userStore.js` - `src/utils/appConnectionManager.js` 不要在页面里再新造一份重复缓存。 ### 10.6 文档维护原则 后续新增页面、角色、模块后,优先更新这份文档,而不是新增平行说明文档。 ## 11. 新页面接入流程 后续新增一个新页面时,建议按下面顺序处理: 1. 建页面目录 在合适的 `src/views/<业务域>/` 下创建页面文件,优先沿用现有目录结构。 2. 注册路由 在 `src/router/index.js` 中新增路由,明确 `path`、`name`、`component` 和 `meta`。 3. 判断是否需要权限配置 如果不是公共页,检查 `src/utils/permissionManager.js` 是否要补角色权限。 4. 判断是否复用页面初始化 如果页面需要统一接 App、拉用户、余额、团队、统计数据,优先考虑 `usePageInitialization`。 5. 新增 API 模块或复用现有 API 先看 `src/api/` 是否已有相近业务域,再决定是否新增文件。 6. 接入 i18n 与公共组件 文案走 `src/locales/*.json`,头部、遮罩、提示等尽量复用现有组件。 补充建议: - 如果页面涉及角色首页入口,顺手检查默认跳转和返回路径 - 如果页面涉及钱包或收款人选择,优先检查现有 store / utils 是否已有跨页缓存 - 如果页面是活动专题,先判断是否需要做成独立业务目录 ## 12. 已知现状 ### 12.1 文档历史 - 仓库原有 `README.md` 和 `START.md` 已经过时 - 从现在开始,这份 `docs/project-details.md` 是主维护文档 - 根目录文档只保留跳转作用 ### 12.2 自动化保障 - 当前没有 `test` 脚本 - `lint` 使用的是 `eslint . --fix`,属于带修改的命令 - 构建健康度需要通过实际 `build` 验证 ### 12.3 依赖管理 - 当前没有锁文件 - 不同环境下安装结果可能出现细微差异 ### 12.4 工作区状态 - 当前工作区至少存在 `.env.development` 的本地改动 - 后续协作时默认不要重置用户本地环境配置 ### 12.5 架构现状判断 项目当前是: - 业务分区清晰 - 权限和宿主适配已有固定套路 - 页面初始化开始抽象 - 但页面组件仍偏厚 - `utils/` 承担了较多基础设施和状态职责 这意味着后续做新页面时,优先遵循现有模式,必要时小步抽象,不建议一边做业务一边大改整体架构。 ## 13. 关键文件索引 后续接手最常看的文件建议从这里进入: - `src/main.js` - `src/router/index.js` - `src/utils/routeGuard.js` - `src/utils/permissionManager.js` - `src/utils/usePageInitialization.js` - `src/utils/http.js` - `src/utils/appBridge.js` - `src/utils/userStore.js` - `src/locales/i18n.js` - `src/views/HostCenter/index.vue` - `src/views/AgencyCenter/index.vue` ## 14. 后续维护建议 如果以后继续让我参与这个项目,最省沟通成本的方式是: - 新需求先说明属于哪个业务域 - 标明是否为公共页或角色页 - 标明是否涉及 App 桥接、权限、钱包、邀请、排行榜、活动中的任一已有体系 这样我可以直接沿用这份文档里的路径和规则落地,不需要每次从头扫描仓库。 # 项目快速综述与建议(2026-04-16) **总体概况** - 类型:运行在原生 App WebView 内的多业务 H5 前端(管理/运营中心 + 活动/排行榜聚合)。 - 技术栈:Vue 3 + Vite 7 + Pinia 3 + Vue Router 4 + Vue I18n 11 + Vant 4。 - 路由模式:Hash(便于 App 内离线/弱网与无后端改写)。 - 目录核心:src 下业务域清晰(views/api/stores/utils/router/locales)。 **启动与构建** - Node 要求:^20.19.0 || >=22.12.0(package.json)。 - 常用脚本:dev/dev:test/dev:prod/build/build:test/build:prod/preview/lint。 - 构建后执行 scripts/generate-version.js 生成 dist/version.json 供版本更新检测使用。 **关键配置** - Vite:按需注册 Vant 组件(unplugin-vue-components + VantResolver)、@ 指向 src、产物文件名带时间戳避免缓存(vite.config.js)。 - 环境变量:.env* 多套,通过 import.meta.env 读取(utils/env.js)。 **入口与初始化链路** - src/main.js:注册样式/指令 → Pinia(含持久化)→ Router → I18n 初始化(从 store/URL 获取语言并设置 dir)→ 版本检测(周期轮询,必要时静默更新)。 - App 适配:通过 ppBridge/ppConnectionManager 兼容 window.app/window.webkit/window.FlutterPageControl,解析原生注入头信息并写入 HTTP 公共请求头。 **路由与权限** - 路由:src/router/index.js 动态按需加载,统一前置守卫 installRouteGuard。 - 权限:permissionManager 基于角色矩阵(Admin/BDLeader/BD/Agent/Anchor/FreightAgent/Guest)判定可访问页面并决定默认首页;公共页(排行榜/活动/充值相关)可直接访问。 **状态与多语言** - 状态:Pinia + 持久化(如 stores/lang 等)。 - 多语言:默认 en,支持 r/tr/bn;阿语自动设置 dir=rtl(locales/i18n.js)。 **API 与网络** - HTTP 封装:utils/http.js 基于 fetch,统一 ApiError、公共头、FormData/JSON 处理,调试模式打印环境和网关信息。 - API 模块:src/api/ 按业务拆分(钱包/排行/充值/活动/邀请等)。 **页面与业务域** - 中心类:AdminCenter/AgencyCenter/BDCenter/BDLeaderCenter/HostCenter/Coin Seller。 - 活动类:Activities/* 与固定活动入口(如 echarge-reward/login-reward)。 - 排行类:Ranking/*(Couple/GamesKing/WeeklyStar/Overall/TopList)。 - 钱包与收支: iews/Wallet/*。 **资产与性能** - 静态资源分层:icons/images/fonts;图片指令 -smart-img、预加载与缓存版本控制(utils/image/*,config/imageCacheVersion.js)。 - 产物强制避缓存:输出名带时间戳(vite.config.js)。 **本地开发与联调** - 启动: pm install && npm run dev。 - 代理:/oss 指向阿里云 OSS,并移除缓存相关响应头,避免浏览器缓存干扰(vite.config.js/server.proxy)。 - 非 App 环境:ppBridge 在开发模式注入 mock 头,便于浏览器调试。 **风险与改进建议** - 注释乱码:多处中文注释出现编码乱码,建议统一 UTF-8(无 BOM)并清理日志字符串,提升可维护性。 - 错误处理:http.js 对非 JSON 错误响应尝试 esponse.json() 可能抛错,建议先 ry json(),失败则回退 ext() 并封装。 - 类型与约束:当前为 JS 项目,建议为核心模块补充 JSDoc/严格 eslint 规则;中长期可评估迁移 TS。 - 测试缺失:缺少单测/E2E,建议为路由守卫、权限矩阵、HTTP 封装补充最小可用测试。 - I18n 完整性:建议在构建阶段引入 key 覆盖校验,运行期对缺失项告警。 **可选后续工作(如需我协助)** - 增补《联调自检页》(显示 env、headers、权限判定与路由重定向结果)。 - 输出“页面-角色访问表”与“守卫时序图”,辅助排错与验收。 - 编写小型 CI 检查:i18n key 校验、eslint 严格规则与构建产物体积对比。