372 lines
11 KiB
Markdown
372 lines
11 KiB
Markdown
# 原 Vue Host Center 逻辑清单
|
||
|
||
来源:
|
||
- `chatapp-h5/h5/js/index-CN7d9oZS-1776148658686.js`
|
||
- `chatapp-h5/h5/js/pageConfig-BUpLPO7w-1776148658686.js`
|
||
- `chatapp-h5/h5/js/teamBill-BWXvrc1S-1776148658686.js`
|
||
- `chatapp-h5/h5/js/index-CIAVq8iD-1776148658686.js`
|
||
- 后端参数定义参考 `chatapp3-java/rc-service`
|
||
|
||
## 页面初始化
|
||
|
||
- 初始化 i18n:读取当前 locale,并调用语言切换逻辑。
|
||
- 初始化路由对象。
|
||
- 初始化 identity store,并设置身份为 `HOST`。
|
||
- 清空 payee store。
|
||
- 使用 `usePageConfig("HOST_CENTER", { needsTeamInfo: true, forceRefresh: true, onDataLoaded })`。
|
||
- 页面 mounted 后并发或顺序触发:
|
||
- 设置身份:`identity = "HOST"`
|
||
- 获取我的代理资料
|
||
- 清空收款人缓存
|
||
- 获取银行卡列表
|
||
- 获取提现/KYC 信息
|
||
- 获取主播工资提现是否可用
|
||
|
||
## 用户信息获取
|
||
|
||
- `usePageConfig` 内部优先读取缓存用户信息。
|
||
- 非强制刷新时读取本地缓存用户资料。
|
||
- 强制刷新时请求 `/team/member/profile`。
|
||
- 页面展示用字段:
|
||
- `id`
|
||
- `account`
|
||
- `userNickname`
|
||
- `name`
|
||
- `userAvatar`
|
||
- `ownSpecialId.account`
|
||
- Host Center 当前代理/团长资料来自 `/team/team-own/profile`。
|
||
- 展示名称:`userNickname || name`
|
||
- 展示 ID:`ownSpecialId.account || account`
|
||
- 头像加载失败时走 `imageHandler` fallback。
|
||
|
||
## App 连接与请求头
|
||
|
||
- 判断是否在 App/WebView 环境。
|
||
- 若已连接且缓存有效,复用缓存请求头。
|
||
- 若未连接,调用 App bridge 获取 access origin 参数。
|
||
- 解析 App 返回参数后设置 HTTP 请求头。
|
||
- 关键请求头来源:
|
||
- `Authorization`
|
||
- `Req-Lang`
|
||
- `Req-App-Intel`
|
||
- `Req-Imei`
|
||
- `Req-Sys-Origin`
|
||
- 连接失败时可能跳转 `/not_app`。
|
||
|
||
## 路由与身份守卫
|
||
|
||
- 请求 `/app/h5/identity` 获取身份。
|
||
- 根据身份字段计算 roles:
|
||
- `freightAgent`
|
||
- `agent`
|
||
- `bdLeader`
|
||
- `bd`
|
||
- `anchor`
|
||
- `admin`
|
||
- 主角色权重:
|
||
- `guest`
|
||
- `anchor`
|
||
- `agent`
|
||
- `bd`
|
||
- `bdLeader`
|
||
- `freightAgent`
|
||
- `admin`
|
||
- 默认跳转页:
|
||
- `admin` -> `/admin-center`
|
||
- `freightAgent` -> `/coin-seller`
|
||
- `agent` -> `/agency-center`
|
||
- `bdLeader` -> `/bd-leader-center`
|
||
- `bd` -> `/bd-center`
|
||
- `anchor` -> `/host-center`
|
||
- `guest` -> `/apply`
|
||
- 当前用户没有 anchor 身份时跳到对应默认页。
|
||
|
||
## 收入/工资逻辑
|
||
|
||
- 可用工资来自 `usePageConfig` 的 `salaryInfo.currentSalary`。
|
||
- `usePageConfig` 会请求 `/wallet/bank/balance`。
|
||
- 响应 body 是 number 时展示 `body.toFixed(2)`。
|
||
- 请求失败时 `currentSalary = 0` 并 toast:`Failed to load balance. Please try again.`
|
||
- 原 Host Center 还请求 `/team/member-work`,用于获取历史工资和目标数据。
|
||
- `/team/member-work` 返回后:
|
||
- `historySalary` 写入本地变量
|
||
- 读取 `targets[0]`
|
||
- 当前 `hyapp/host-center` 的 Work Time 使用 `targets[0].target.onlineTime` 作为总工作时长
|
||
- 当前 `hyapp/host-center` 的 Target 显示 `targets[0].target.acceptGiftValue` 当前礼物积分
|
||
- Target 点击明细使用 `targets[0].target.dailyTargets[]`,展示每日 `dateNumber`、`acceptGiftValue`、`onlineTime`
|
||
- 结算状态映射:
|
||
- `SETTLED` -> `Completed`
|
||
- `UNPAID` -> `In Progress`
|
||
- `HANG_UP` -> `Out of account`
|
||
- `PAY_OUT` -> `Completed`
|
||
- 目标等级取 `target.settlementResult.level || target.level || "-"`
|
||
|
||
## 今日任务/直播数据逻辑
|
||
|
||
- 原 Vue `usePageConfig` 会请求 `/team/member/work/statistics-now`。
|
||
- 请求参数:
|
||
- `dataType=DAILY`
|
||
- `memberId=<当前用户 id/account>`
|
||
- 原 Vue 今日任务展示逻辑:
|
||
- `anchorType = "Chat"`
|
||
- `minutesProgress = min(ownTime + otherTime, minutesTotal)`
|
||
- `minutesTotal = 120`
|
||
- `giftTask = acceptGiftValue || 0`
|
||
- 当前 `hyapp/host-center` 的 Work Time 不再用该接口,也不再限制 120;改用 `/team/member-work?userId=<当前用户 id>` 返回的 `targets[0].target.onlineTime` 总时长。
|
||
|
||
## 银行卡与提现信息逻辑
|
||
|
||
- 请求 `/wallet/bank-card/list` 获取银行卡列表。
|
||
- 取 `body.find(item => item.use)` 作为当前使用银行卡。
|
||
- 请求 `/wallet/withdraw-info/list` 获取提现/KYC 信息。
|
||
- 若 `body.length > 0`:
|
||
- 取第一条
|
||
- `passportFrontUrl` 按 JSON 字符串解析成 `previewUrls`
|
||
- 合并到提现信息对象
|
||
- 请求 `/wallet/bank/host-salary/withdraw/enabled`。
|
||
- `body` 转 Boolean 后控制是否展示 `Cash withdraw` 入口。
|
||
- 点击提现:
|
||
- 如果没有提现信息或没有当前使用银行卡,打开 `infoMissing` 弹窗。
|
||
- 否则跳转 `/cash-withdraw`。
|
||
|
||
## 弹窗逻辑
|
||
|
||
- 弹窗状态:
|
||
- `infoMissing`
|
||
- `leave`
|
||
- `maskLayerShow = infoMissing || leave`
|
||
- 打开弹窗前先关闭其它弹窗。
|
||
- 点击遮罩关闭弹窗。
|
||
- `infoMissing` 弹窗:
|
||
- 标题:`prompt`
|
||
- 文案:`fill_info_tips`
|
||
- 辅助文案:`card_issue_tips`
|
||
- 按钮跳转 `/host-setting`
|
||
- `leave` 弹窗:
|
||
- 标题:`tips`
|
||
- 文案:`leave_agent_tips`
|
||
- 取消关闭弹窗
|
||
- 确认执行退出团队申请
|
||
|
||
## 退出团队逻辑
|
||
|
||
- 请求 `/team/user/apply`
|
||
- 方法:`POST`
|
||
- Body:
|
||
- `reason: "QUIT"`
|
||
- `teamId: <当前团队 id>`
|
||
- `teamId` 来源:
|
||
- 原 Vue 使用 `pe()` 读取当前团队 id
|
||
- 静态实现里曾兼容读取 `teamInfo.id || agency.teamId || agency.id`
|
||
- 失败时 toast `errorMsg`。
|
||
|
||
## 点击跳转
|
||
|
||
- 工资详情:`/history-salary`
|
||
- 平台政策:`/platform-policy?from=hostcenter`
|
||
- 主播设置/银行卡:`/host-setting`
|
||
- 兑换金币:`/exchange-gold-coins`
|
||
- 转账:`/transfer`
|
||
- 提现:`/cash-withdraw`
|
||
- 语言切换:`/language`
|
||
- 返回:
|
||
- App bridge `closePage`
|
||
- Flutter bridge `close_page`
|
||
- 浏览器 `history.back()`
|
||
|
||
## 原接口与可传参数
|
||
|
||
### GET `/team/member/profile`
|
||
|
||
- 用途:获取当前用户信息。
|
||
- 显式查询参数:无。
|
||
- 隐式参数:App 请求头中用户、语言、来源等上下文。
|
||
|
||
### GET `/team/team-own/profile`
|
||
|
||
- 用途:获取我的团长/代理资料。
|
||
- 显式查询参数:无。
|
||
- 隐式参数:App 请求头中的当前用户上下文。
|
||
|
||
### GET `/team/entry`
|
||
|
||
- 用途:获取当前用户团队入口信息。
|
||
- 显式查询参数:无。
|
||
- 返回中使用 `body.teamProfile || body` 作为团队信息。
|
||
|
||
### GET `/team/release/policy`
|
||
|
||
- 用途:获取团队政策。
|
||
- 查询参数:
|
||
- `id`: 团队 ID,必传。线上 Java 接口传 `teamId` 会返回 `REQUEST_PARAMETER_ERROR: id required.`
|
||
- 团队 ID 来源:
|
||
- 优先使用 `/team/entry` 返回的 `body.teamProfile.id`
|
||
- `/team/team-own/profile` 返回的 `body.id` 是团长/用户资料 ID,不是团队政策接口需要的团队 ID;直接传给 `/team/release/policy?id=...` 会返回 `TEAM_NOT_FOUND`
|
||
- 页面 URL 可以继续带 `teamId` 作为本地跳转参数,但真正请求 Java 接口时必须映射为 `id=<teamProfile.id>`。
|
||
- 返回使用:
|
||
- `body.policy[]`
|
||
- `policy[].level`
|
||
- `policy[].onlineTime`
|
||
- `policy[].target`
|
||
- `policy[].memberSalary`
|
||
- `policy[].ownSalary`
|
||
- `policy[].totalSalary`
|
||
|
||
### GET `/team/search-account`
|
||
|
||
- 用途:加入代理页搜索代理账号。
|
||
- 查询参数:
|
||
- `account`: 用户输入的代理 ID/账号,必传
|
||
- 原 Vue `ApplyView` 使用:
|
||
- 请求后判断 `body.teamProfile`
|
||
- `body.teamProfile.id` 作为加入申请的 `teamId`
|
||
|
||
### GET `/team/wait-apply/profile`
|
||
|
||
- 用途:获取当前用户待处理的加入代理申请。
|
||
- 显式查询参数:无。
|
||
- 原 Vue `ApplyView` 使用:
|
||
- 有返回 `body` 时显示一条 pending 申请记录
|
||
- 展示 `body.ownUserProfile.userAvatar`
|
||
- 展示 `body.ownUserProfile.userNickname`
|
||
- 展示 `body.ownUserProfile.ownSpecialId.account || body.ownUserProfile.account`
|
||
|
||
### GET `/wallet/bank/balance`
|
||
|
||
- 用途:获取工资/银行卡余额。
|
||
- 显式查询参数:无。
|
||
- 返回可为数字,也可能为对象。
|
||
|
||
### GET `/team/member/work/statistics-now`
|
||
|
||
- 用途:原 Vue 获取成员当天目标/工作统计;当前 `hyapp/host-center` 不再用它展示 Work Time。
|
||
- 查询参数:
|
||
- `dataType`: `DAILY | MONTH`
|
||
- `memberId`: 成员 ID,必传
|
||
- `size`: 数量,可选
|
||
- Host Center 使用:
|
||
- `dataType=DAILY`
|
||
- `memberId=<当前用户 id/account>`
|
||
|
||
### GET `/team/member-work`
|
||
|
||
- 用途:成员工资情况。
|
||
- 查询参数:
|
||
- `userId`: 用户 ID,必传
|
||
- 返回使用:
|
||
- `historySalary`
|
||
- `targets`
|
||
- `targets[0].target.onlineTime`,当前 `hyapp/host-center` 用作 Work Time 总时长
|
||
- `targets[0].target.acceptGiftValue`,当前 `hyapp/host-center` 用作 Target 当前礼物积分
|
||
- `targets[0].target.dailyTargets[]`,当前 `hyapp/host-center` 用作每日明细
|
||
- `targets[].status`
|
||
- `targets[].target.settlementResult.level`
|
||
- `targets[].target.level`
|
||
|
||
### GET `/wallet/bank-card/list`
|
||
|
||
- 用途:银行卡列表。
|
||
- 显式查询参数:无。
|
||
- 返回使用:
|
||
- `body[]`
|
||
- `item.use`
|
||
- `item.cardType`
|
||
- `item.cardNo`
|
||
- `item.payee`
|
||
|
||
### POST `/wallet/bank-card/add`
|
||
|
||
- 用途:新增收款方式。
|
||
- Body:
|
||
- `userId`: 当前用户 ID
|
||
- `cardType`: `USDT | BANK`
|
||
- `cardName`: 收款方式名称;USDT 时原 Vue 固定为 `USDT`
|
||
- `cardNo`: 卡号或 USDT 地址
|
||
- `payee`: 收款人
|
||
|
||
### POST `/wallet/bank-card/use`
|
||
|
||
- 用途:设置当前使用的收款方式。
|
||
- Body:
|
||
- `id`: 收款方式 ID
|
||
|
||
### GET `/wallet/withdraw-info/list`
|
||
|
||
- 用途:提现/KYC 信息列表。
|
||
- 显式查询参数:无。
|
||
- 返回使用:
|
||
- `body[0]`
|
||
- `body[0].passportFrontUrl`
|
||
|
||
### GET `/wallet/bank/host-salary/withdraw/enabled`
|
||
|
||
- 用途:主播工资是否允许提现。
|
||
- 显式查询参数:无。
|
||
- 返回使用:
|
||
- `body` boolean
|
||
|
||
### GET `/wallet/bank/check/exchange-gold`
|
||
|
||
- 用途:检查当前用户是否允许兑换金币。
|
||
- 显式查询参数:无。
|
||
- 原 Vue `ExchangeGoldCoins` 用它做兑换入口权限检查。
|
||
|
||
### POST `/wallet/bank/exchange/gold`
|
||
|
||
- 用途:把当前可用余额兑换金币。
|
||
- Body(原 Vue 主播兑换页):
|
||
- `coinId`: 金币档位 ID
|
||
- `amount`: 美元金额
|
||
- `price`: 美元金额
|
||
- Body(原静态逻辑页):
|
||
- `amount`: 美元金额
|
||
- 兑换比例未发现后端接口返回;原 Vue 金币档位是前端常量。
|
||
|
||
### GET `/wallet/bank/search/user-profile`
|
||
|
||
- 用途:转账前搜索收款用户。
|
||
- 查询参数:
|
||
- `account`: 用户输入的账号/ID
|
||
- `type`: 原 Vue 传 `AGENT`
|
||
- `searchType`: 转账场景传 `TRANSFER`
|
||
|
||
### POST `/wallet/bank/transferGold`
|
||
|
||
- 用途:把当前可用余额转给其它用户。
|
||
- Body:
|
||
- `amount`: 美元金额
|
||
- `acceptUserId`: 收款用户 ID
|
||
- `acceptMethod`: 原 Vue 主播转账传 `BANK_TRANSFER`
|
||
|
||
### GET `/app/h5/identity`
|
||
|
||
- 用途:获取当前 H5 身份。
|
||
- 显式查询参数:无。
|
||
- 返回使用字段:
|
||
- `freightAgent`
|
||
- `agent`
|
||
- `bdLeader`
|
||
- `bd`
|
||
- `anchor`
|
||
- `admin`
|
||
|
||
### POST `/team/user/apply`
|
||
|
||
- 用途:用户申请加入或退出团队。
|
||
- Body:
|
||
- `reason`: `JOIN | QUIT`
|
||
- `teamId`: 团队 ID,必传
|
||
- `url`: 跳转 URL,可选
|
||
- Host Center 退出团队使用:
|
||
- `reason: "QUIT"`
|
||
- `teamId: <当前团队 id>`
|
||
- ApplyView 加入代理使用:
|
||
- `reason: "JOIN"`
|
||
- `teamId: <GET /team/search-account 返回的 body.teamProfile.id>`
|
||
|
||
### POST `/team/user/join-apply-cancel`
|
||
|
||
- 用途:撤销待处理的加入代理申请。
|
||
- Body:
|
||
- `id`: 申请记录 `messageId`,必传
|