aslan-h5/docs/项目详情.md

755 lines
20 KiB
Markdown
Raw Permalink 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.

# Likei H5 项目详情
最后扫描时间2026-06-09
## 1. 项目定位
`likei-h5` 是一个运行在宿主 App WebView 内的多业务移动端 H5 项目,核心技术栈为 `Vue 3 + Vite 7 + Pinia 3 + Vue Router 4 + Vue I18n 11 + Vant 4`
项目不是单一落地页,而是按业务域拆分的前端集合,覆盖:
- 角色中心管理员、代理、BD、BD Leader、主播、金币代理。
- 钱包与资金流提现、转账、兑换、薪资、KYC、银行卡。
- 充值与邀请:充值链路、支付方式、邀请不同角色或新用户。
- 排行榜与活动页:固定榜单、限时活动、游戏活动、世界杯专题。
默认运行模型优先适配 App 宿主环境,浏览器环境主要用于本地开发和调试。
## 2. 快速启动
### 2.1 环境要求
- Node`^20.19.0 || >=22.12.0`
- 包管理器:当前仓库没有锁文件,默认按 `npm` 使用。
- 开发服务Vite默认端口 `5173``strictPort: true`
### 2.2 常用命令
```bash
npm install
npm run dev
npm run dev:test
npm run dev:prod
npm run build
npm run build:dev
npm run build:test
npm run build:prod
npm run build:atu-prod
npm run build:azizi-prod
npm run preview
npm run lint
npm run docs:sync:security
```
说明:
- `npm run lint` 执行的是 `eslint . --fix`,会直接修改文件。
- 当前没有 `test` 脚本,构建是主要健康检查方式。
- 构建后会执行 `scripts/generate-version.js`,生成 `dist/version.json`
### 2.3 环境文件
根目录当前存在:
- `.env`
- `.env.development`
- `.env.production`
- `.env.production-atu`
- `.env.production-azizi`
- `.env.test`
环境读取集中在 `src/utils/env.js`,常用变量包括:
- `VITE_USER_AUTH`
- `VITE_NODE_ENV`
- `VITE_API_BASE_URL`
- `VITE_APP_TITLE`
- `VITE_APP_VERSION`
- `VITE_ENABLE_VERSION_CHECK`
协作注意:环境文件可能有本地改动,不要默认重置。
## 3. 启动与运行链路
### 3.1 主入口
入口文件:`src/main.js`
启动顺序:
1. 引入全局样式:`src/assets/main.css``src/styles/fonts.css``src/styles/global.css`
2. 打印环境信息。
3. 安装运行时安全能力:`installRuntimeSecurity()`
4. 安装受保护资源运行时:`installProtectedAssetRuntime()`
5. 应用性能模式 class`applyPerformanceModeClass()`
6. 创建 Pinia并启用 `pinia-plugin-persistedstate`
7. 注册全局指令 `v-smart-img`
8. 注册全局组件 `LoadingContent`
9. 注册 router、pinia、i18n。
10. 按 URL `lang` 参数和页面规则初始化语言。
11. 挂载到 `#app`
12. 空闲时检查版本,开启后每 5 分钟轮询版本。
### 3.2 路由
路由文件:`src/router/index.js`
特点:
- 使用 `createWebHashHistory`,适合 App WebView 和无需服务端 history rewrite 的 H5。
- 页面均为动态 import。
- 统一安装 `installRouteGuard(router)`
- 未匹配路由重定向到 `/apply`
当前主要路由域:
- 公共入口:`/``/loading``/apply``/not_app`
- 角色中心:`/admin-center``/agency-center``/bd-center``/bd-leader-center``/host-center``/coin-seller`
- 钱包资金:`/available-income``/transfer``/exchange-gold-coins``/cash-withdraw``/cash-out``/KYC``/bank-card`
- 充值:`/recharge``/recharge-pay-way``/map``/recharge-guide`
- 邀请:`/invitation/invite-new-user``/invite-bd``/invite-bd-leader``/invite-agency``/invite-recharge-agency`
- 排行榜:`/couple``/top-list``/weekly-star``/ranking``/games-king`
- 活动页:`/recharge-reward``/login-reward``/daily-recharge``/activities/*`
### 3.3 App 桥接与请求头
宿主适配相关文件:
- `src/utils/appBridge.js`
- `src/utils/appConnectionManager.js`
- `src/utils/appConnector.js`
- `src/utils/routeGuard.js`
宿主注入兼容:
- `window.app`
- `window.webkit`
- `window.FlutterPageControl`
推荐用法:
- 路由守卫使用 `routeGuard` 保证受保护页面在 App 内建立连接。
- 页面如果自己直接使用接口,必须先通过 `connectToApp` 设置请求头。
- 活动页当前规则是图片预加载和接口初始化分离loading 只等待图片,业务接口在 `connectToApp(() => { loadInitialPageData() })` 成功后独立请求。
## 4. 构建与 Vite 配置
配置文件:`vite.config.js`
关键点:
- Vue 插件:`@vitejs/plugin-vue`
- 自动按需组件:`unplugin-vue-components` + `VantResolver`
- 路径别名:`@ -> src`
- 开发服务:
- host: `0.0.0.0`
- port: `5173`
- strictPort: `true`
- `/oss` 代理到 `https://asset.global-interaction.com`
- 预览服务:
- host: `0.0.0.0`
- port: `4173`
- strictPort: `true`
- 本地开发额外提供 `/oss` 本地静态资源中间件,优先读取 `public/oss`
- 生产类模式会去掉部分日志:
- `production`
- `production-atu`
- 默认移除 `console.log``console.debug``console.info``debugger`
- 可通过 `LIKEI_KEEP_BUILD_LOGS=true` 保留构建日志。
构建产物命名:
- JS`js/[hash].js`
- CSS`css/[hash].[ext]`
- 其他资源:`assets/[hash].[ext]`
## 5. 目录结构
```text
.
├─ docs/ 项目文档、活动页建页规则、安全文档
├─ nginx/ 部署相关配置
├─ public/ 公共静态资源,本地 OSS 镜像目录在 public/oss
├─ scripts/ 构建后版本生成、安全文档同步等脚本
├─ src/
│ ├─ api/ 按业务域拆分的接口层
│ ├─ assets/ 本地图片、图标、字体、基础样式
│ ├─ components/ 公共组件
│ ├─ config/ 图片路径、安全白名单等配置
│ ├─ directives/ 自定义指令
│ ├─ locales/ 多语言资源与 i18n 初始化
│ ├─ router/ 路由定义
│ ├─ stores/ Pinia store
│ ├─ styles/ 全局样式和字体
│ ├─ utils/ 桥接、HTTP、权限、缓存、图片、支付等基础设施
│ └─ views/ 页面级业务模块
├─ vite.config.js
└─ package.json
```
## 6. 页面与业务地图
### 6.1 `src/views`
当前一级页面目录:
- `Activities`
- `AdminCenter`
- `AgencyCenter`
- `ApplyHost`
- `BDCenter`
- `BDLeaderCenter`
- `CPReward`
- `GoodID`
- `HostCenter`
- `Invitation`
- `LandingPage`
- `PlatformPolicy`
- `Ranking`
- `Recharge`
- `RechargeAgency`
- `Wallet`
### 6.2 角色中心
- `AdminCenter`:管理员中心、团队管理、商品赠送、管理员政策。
- `AgencyCenter`:代理中心、消息、设置、团队账单、团队成员、邀请成员。
- `BDCenter`BD 中心、收益详情、政策、商品赠送。
- `BDLeaderCenter`BD Leader 中心。
- `HostCenter`:主播中心与主播设置。
- `RechargeAgency`:金币代理首页、搜索用户、卖家记录、招募说明。
### 6.3 钱包与资金
目录:`src/views/Wallet`
包含:
- 可用收益
- 转账与收款人搜索
- 金币兑换
- 资金详情
- 历史薪资
- 支付结果
- 提现、提现详情、KYC、银行卡
### 6.4 充值与邀请
- `src/views/Recharge`:充值主页、支付方式、地图、充值引导。
- `src/views/Invitation`邀请新用户、BD、BD Leader、代理、金币代理。
### 6.5 排行榜
目录:`src/views/Ranking`
当前包含:
- `Couple`
- `GamesKing`
- `KingAndQueen`
- `Overall`
- `WeeklyStar`
### 6.6 活动页
目录:`src/views/Activities`
当前包含:
- `DailyRecharge`
- `Games`
- `GulbenFestival`
- `LesserBairam`
- `LoginReward`
- `LuckyDollars`
- `Reward`
- `SpringFestival`
- `WorldCup`
活动页特点:
- 独立性高,常有专属 `page.config.js``页面创建信息.md`
- 常见模块包括背景、排行榜、奖励弹窗、规则弹窗、任务、倒计时、赛事列表等。
- 当前活动页建页规则集中维护在 `docs/活动页/建页/`
### 6.7 WorldCup 当前状态
世界杯专题目录:`src/views/Activities/WorldCup`
当前包括:
- 首页:`index.vue`
- 详情页:`EventDetail/index.vue`
- 专用接口:`src/api/worldCup.js`
- 页面信息:`页面创建信息.md`
- 接口说明:`世界杯接口说明.md`
已接入能力:
- 排行榜与我的排名。
- Predict Now / Ended 赛事列表。
- 赛事详情。
- 押注模块。
- 押注记录。
- 奖励弹窗与规则弹窗。
- `connectToApp` 请求头初始化。
- loading 只等待阻塞图片,接口独立初始化。
- 大整数 `matchId` 按字符串处理,避免 JS 精度丢失。
## 7. 权限与安全
### 7.1 公共路径
公共路径白名单在:
- `src/config/security.js`
- `src/utils/permissionManager.js`
`security.js` 中的 `PUBLIC_PATHS` 用于 HTTP 和路由安全判断;`permissionManager.js` 中的 `ROLE_PERMISSIONS.PUBLIC_PAGES` 用于权限矩阵。
新增公共页时,两处都要检查是否需要同步。
### 7.2 角色模型
角色定义在 `src/utils/permissionManager.js`
- `admin`
- `freightAgent`
- `bdLeader`
- `bd`
- `agent`
- `anchor`
- `guest`
默认首页:
- `admin` -> `/admin-center`
- `freightAgent` -> `/coin-seller`
- `agent` -> `/agency-center`
- `bdLeader` -> `/bd-leader-center`
- `bd` -> `/bd-center`
- `anchor` -> `/host-center`
- `guest` -> `/apply`
角色优先级:
`admin > freightAgent > bdLeader > bd > agent > anchor > guest`
### 7.3 路由守卫
文件:`src/utils/routeGuard.js`
流程:
1. 公共页直接放行。
2. 非公共页检查 App 连接。
3. Debug 环境允许浏览器模式调试,非 Debug 环境受保护页面必须在官方 App 内。
4. 拉取用户资料和身份。
5.`permissionManager` 判断页面权限。
6. 无权限时跳转到该用户默认首页。
### 7.4 运行时安全
入口安装:
- `installRuntimeSecurity()`
- `installProtectedAssetRuntime()`
相关文件:
- `src/utils/runtimeSecurity.js`
- `src/utils/protectedAssets.js`
- `src/utils/protectedAssetRuntime.js`
受保护资源策略:
- 生产类模式下,`Activities/``Ranking/` 的 OSS 资源 URL 会被包装为 `likei-protected:<base64>`
- 运行时再解析为真实 URL。
- `development``test` 模式不启用资源保护。
## 8. API 与网络层
### 8.1 接口目录
接口目录:`src/api`
当前模块:
- `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`
- `worldCup.js`
接口按业务域拆分。新增业务如果明显独立,可以新增 API 文件;已有业务的小扩展优先复用现有文件。
### 8.2 HTTP 封装
文件:`src/utils/http.js`
导出:
- `request`
- `get`
- `post`
- `put`
- `del`
- `COMMON_HEADERS`
- `ApiError`
职责:
- 拼接 `VITE_API_BASE_URL`
- 合并公共请求头和页面传入请求头。
- 支持 JSON 与 FormData。
- 统一包装 HTTP 错误、业务错误和网络错误。
- 非 Debug 环境中,非公共页接口必须在官方 App 连接后才允许请求。
当前注意点:
- `post(url, data)` 如果 `data` 是空对象 `{}` 会正常发送 body。
- 如果 `data``null/undefined`,当前 HTTP 封装不会写 body。
- 活动页规则要求POST 接口无业务参数时也传 `{}`
### 8.3 请求头来源
默认头在 `http.js` 中声明App 连接成功后通过:
- `setHeadersFromApp`
- `updateCommonHeaders`
- `connectToApp`
- `setHttpHeaders`
更新到公共请求头。
页面直接请求接口前,需要确认是否已完成 `connectToApp`
## 9. 状态管理
### 9.1 Pinia
当前 store
- `country`
- `couple`
- `gamesKing`
- `identity`
- `lang`
- `lastImg`
- `rechargeTarget`
- `springFestival`
Pinia 启用了 persisted state。
### 9.2 utils 单例缓存
项目同时使用一些 utils 单例缓存:
- `src/utils/userStore.js`
- `src/utils/appConnectionManager.js`
- `src/utils/applyStore.js`
- `src/utils/coinSellerStore.js`
- `src/utils/payeeStore.js`
这些不是普通纯函数,承担跨页面状态缓存职责。新增跨页状态前要先检查是否已有对应 store 或 utils。
### 9.3 页面初始化抽象
相关文件:
- `src/utils/usePageInitialization.js`
- `src/utils/pageConfig.js`
适合用于角色中心类页面,统一处理:
- App 连接。
- 用户信息。
- 团队信息。
- 余额。
- 工作统计。
- 初始化完成回调。
活动页或轻页面通常不强制使用这套抽象。
## 10. 国际化与方向
入口:`src/locales/i18n.js`
语言资源:
- `zh`
- `en`
- `ar`
- `tr`
- `bn`
特点:
- `src/main.js` 会读取 URL hash query 中的 `lang` 参数。
- 阿语会设置 `dir=rtl`
- 页面可根据语言或页面名单强制默认语言。
新增页面时:
- 可复用现有 key 时优先复用。
- 新增多语言文案要同步所有目标语言文件。
- 活动页如果暂时使用英文固定文案,要在页面信息 md 中记录。
## 11. 图片、资源与预加载
### 11.1 本地与线上 OSS
图片路径配置:`src/config/imagePaths.js`
规则:
- 开发环境:`/oss/h5/Azizi/`
- 非开发环境:`https://asset.global-interaction.com/h5/Azizi/`
常用方法:
- `getPngUrl(imagePath, filename)`
- `getWebpUrl(imagePath, filename)`
- `getMp4Url(imagePath, filename)`
本地 OSS 镜像目录:
- `public/oss/h5/Azizi`
当前本地主要包含:
- `Activities`
### 11.2 智能图片
全局指令:
- `v-smart-img`
相关文件:
- `src/directives/smartImage.js`
- `src/utils/image/imageCacheManager.js`
- `src/utils/image/imageHandler.js`
- `src/utils/image/imagePreloader.js`
- `src/config/imageCacheVersion.js`
活动页约定:
- 项目自身静态图、OSS 活动图可用 `v-smart-img`
- 接口返回的远程图片链接不要使用 `v-smart-img`,直接使用原生 `<img :src="接口字段">`
### 11.3 预加载
预加载工具:
- `preloadImages`
- `preloadImagesIdle`
当前活动页建页规则:
- 新建 `index.vue` 必须有统一 loading。
- `completePreloading()` 只负责阻塞图片预加载。
- loading 不等待业务接口。
- 业务接口提取到 `loadInitialPageData()` 或同名页面初始化方法。
- 接口初始化在 `connectToApp` 成功后执行。
## 12. 公共组件
常用公共组件:
- `BackgroundLayer.vue`
- `GeneralHeader.vue`
- `itemCenter.vue`
- `LoadingContent.vue`
- `MaskLayer.vue`
- `PageContainer.vue`
- `PermissionGuard.vue`
- `Toast.vue`
- `VapMp4Player.vue`
活动页常用:
- `itemCenter`:背景图 + 绝对定位内容层。
- `LoadingContent`:统一加载动画。
- `MaskLayer`:规则、奖励、历史、结果等弹窗遮罩。
- `GeneralHeader`:带标题与返回按钮的通用头部。
`itemCenter` 注意:
- 页面初建阶段不预设 `min-height`
- 页面开发完成后,如需稳定图片容器高度,再按图片比例补。
-`min-height` 时同步补接近的 `max-height`,默认可用 `max-height = min-height + 1vw`
## 13. 活动页建页规则索引
活动页文档目录:
- `docs/活动页/README.md`
- `docs/活动页/建页/快速建立活动页方案.md`
- `docs/活动页/建页/建页执行流程.md`
- `docs/活动页/建页/建页操作模板.md`
- `docs/活动页/建页/建页资料库.md`
- `docs/活动页/创建记录/`
- `docs/活动页/分析/`
当前核心规则:
- 页面改动、模块补充、接口对接、样式同步和文档同步,都要联系建页规则执行。
- 新建或更新活动页时页面模块、div 结构、方法、接口处理都要补中文注释。
- 能使用内联样式表达的固定布局、尺寸、间距、定位,优先使用内联样式。
- 页面根容器使用 `height: 100vh`,内部主内容滚动并隐藏滚动条。
- 页面任何模块都不展示可见滚动条。
- 弹窗统一使用 `MaskLayer`
- 使用接口前必须先 `connectToApp`
- loading 只等阻塞图片预加载,接口初始化独立。
- 多 tab 数据要使用独立数组和独立 request token。
- 多 tab 内容如果固定图片多,优先用 `v-show` 保留 DOM避免图片反复加载。
- POST 接口无业务参数时也要传 `{}`
- 大整数 ID如 WorldCup `matchId`,按字符串传参,禁止 `Number(id)`
## 14. 开发接入流程
新增页面建议顺序:
1. 判断业务域,选择合适的 `src/views/<domain>` 目录。
2. 注册路由,明确 `path``name``component``meta`
3. 判断是否公共页;如是公共页,同步检查 `security.js``permissionManager.js`
4. 判断是否需要角色权限;如需要,补对应角色权限列表。
5. 判断是否使用 `usePageInitialization`
6. 判断是否新增或复用 `src/api/*`
7. 接入 `connectToApp`,确保接口请求头。
8. 接入 i18n、公共组件、Toast、MaskLayer 等现有能力。
9. 如果是活动页,同步 `页面创建信息.md` 或接口说明 md。
10. 跑构建验证。
新增 API 建议:
- 明显新业务域:新增 `src/api/<domain>.js`
- 现有业务小扩展:复用已有 API 文件。
- POST 无参数:传 `{}`
- 大整数 ID保持字符串。
新增活动页建议:
- 先建页面信息 md。
- 再建 `page.config.js`
- 扫描本地 OSS 图片清单。
- 生成基础 loading、背景、模块容器。
- 逐个模块迭代,不一次性生成所有业务。
## 15. 脚本与版本
脚本目录:`scripts`
当前脚本:
- `generate-version.js`:构建后生成版本文件。
- `build-with-version.js`:带版本日志控制的构建脚本。
- `sync-security-docs.js`:同步安全文档。
版本检查:
- 文件:`src/utils/versionChecker.js`
- 构建后版本信息写入 `dist/version.json`
- 运行时可通过 `VITE_ENABLE_VERSION_CHECK` 开启版本检查。
- 默认每 5 分钟轮询一次。
- `major` 更新会清理更完整缓存。
- `minor/patch` 会检查图片缓存版本并清理 session 数据。
## 16. 已知现状与风险
### 16.1 README 路径
当前 `README.md``START.md` 仍指向 `docs/project-details.md`,但当前主维护文档是:
- `docs/项目详情.md`
后续可以按需要同步根目录入口文档。
### 16.2 无测试脚本
当前没有 `test` 脚本。验证主要依赖:
- `npm run build`
- 必要时手动打开本地页面检查。
### 16.3 无锁文件
当前未见包管理锁文件,不同环境重新安装可能产生依赖解析差异。
### 16.4 HTTP 错误解析
`src/utils/http.js` 在非 2xx 响应时直接 `await response.json()`,如果服务端返回非 JSON可能额外抛解析错误。后续可优化为先 try JSON失败再 fallback text。
### 16.5 文档与页面演进快
活动页需求迭代频繁,建议每次页面改动后同步:
- 页面自身 `页面创建信息.md`
- 接口说明 md
- 必要时同步 `docs/活动页/建页/`
## 17. 常用文件索引
项目入口:
- `src/main.js`
- `src/App.vue`
- `src/router/index.js`
基础设施:
- `src/utils/http.js`
- `src/utils/env.js`
- `src/utils/routeGuard.js`
- `src/utils/permissionManager.js`
- `src/utils/appBridge.js`
- `src/utils/appConnector.js`
- `src/utils/appConnectionManager.js`
- `src/utils/versionChecker.js`
资源:
- `src/config/imagePaths.js`
- `src/directives/smartImage.js`
- `src/utils/image/imagePreloader.js`
- `src/utils/image/imageCacheManager.js`
活动页:
- `docs/活动页/建页/建页执行流程.md`
- `docs/活动页/建页/建页操作模板.md`
- `docs/活动页/建页/建页资料库.md`
- `src/views/Activities/WorldCup/页面创建信息.md`
- `src/views/Activities/WorldCup/世界杯接口说明.md`
权限与安全:
- `src/config/security.js`
- `src/utils/runtimeSecurity.js`
- `src/utils/protectedAssets.js`
- `docs/安全/前端加固-中文.md`
构建:
- `vite.config.js`
- `scripts/generate-version.js`
- `scripts/build-with-version.js`