aslan-h5/docs/project-details.md
2026-04-17 18:10:25 +08:00

715 lines
19 KiB
Markdown
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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.

# 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.0package.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=rtllocales/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 严格规则与构建产物体积对比。