# BMTR 资产接入实现文档

## 一、需求概述

在首页「我的资产」区域新增 **BMTR** 卡片，展示当前登录用户的 BMTR 数量。

数据来源：

```
GET /api/mxj/api/get_user
```

返回示例：

```json
{
  "status": 200,
  "msg": "success",
  "data": {
    "uid": 94227,
    "nickname": "siediyer",
    "avatar": "https://thirdwx.qlogo.cn/...",
    "mxj_points": "99999.00",
    "bmtr": "11.0000",
    "is_check": 1,
    "is_idcard": 1,
    "is_sign": 1,
    "sign_time": 1781172245,
    "status": 1
  }
}
```

---

## 二、API 请求运行方式

项目中的网络请求采用三层结构：

```
页面 (pages/index/index.vue)
  ↓ 调用
api/assets.js 中的业务方法
  ↓ 调用
utils/request.js 中的通用 request 方法
  ↓ 调用
uni.request 发送 HTTP 请求
```

### 2.1 配置层：`config/service.js`

定义了接口基础地址和 endpoint 映射表。

### 2.2 通用请求层：`utils/request.js`

- 自动拼接 `BASE_URL` 和 `url`
- 统一注入 `Authori-zation` / `Authorization` Token
- 统一处理 `showLoading` / `hideLoading`
- 对响应进行 `statusCode` 校验，返回 `response.data`

### 2.3 业务 API 层：`api/assets.js`

- 封装 `fetchPayload` 统一处理 `{ status: 200, data: {...} }` 结构
- 提供 `createRequestOptions` 合并请求参数
- 提供 `buildHomeOverview` 将原始接口数据转换为页面渲染数据

---

## 三、本次改动文件

| 文件                    | 改动内容                                                           |
| ----------------------- | ------------------------------------------------------------------ |
| `config/service.js`     | 新增 `getUser` endpoint                                            |
| `api/assets.js`         | 新增 `fetchUserData`，修改 `buildHomeOverview` 和 `fetchAssetHome` |
| `pages/index/index.vue` | 新增 BMTR 图标、背景、点击跳转                                     |
| `BMTR.MD`               | 本文档                                                             |

---

## 四、具体改动

### 4.1 `config/service.js`

在 `ENDPOINTS` 中新增：

```javascript
getUser: "/api/mxj/api/get_user",
```

### 4.2 `api/assets.js`

#### 4.2.1 新增获取用户数据的函数

```javascript
async function fetchUserData(requestOptions) {
  return fetchPayload(
    createRequestOptions(
      {
        url: serviceConfig.ENDPOINTS.getUser,
      },
      requestOptions,
    ),
    "用户信息加载失败",
  );
}
```

#### 4.2.2 修改 `buildHomeOverview`

函数签名从：

```javascript
function buildHomeOverview(balanceData, tickerData) {
```

改为：

```javascript
function buildHomeOverview(balanceData, tickerData, userData) {
```

在 `rawQuickAssets` 中新增 `bmtr`：

```javascript
const rawQuickAssets = {
  balance: toRawDisplayValue(balanceData && balanceData.brokerage_price),
  points: toRawDisplayValue(balanceData && balanceData.point),
  voucher: toRawDisplayValue(balanceData && balanceData.coin),
  coupon: toRawDisplayValue(balanceData && balanceData.diamond_balance),
  power: toRawDisplayValue(balanceData && balanceData.c_power),
  bmtr: toRawDisplayValue(userData && userData.bmtr),
};
```

在 `quickAssets` 数组中新增 BMTR 项：

```javascript
{
  key: "bmtr",
  title: "BMTR",
  value: rawQuickAssets.bmtr,
  accent: "orange",
},
```

> `value` 直接使用接口返回的 `bmtr` 字符串。
> `accent` 设为 `orange`，与页面已有的 `.asset-mini-card--orange` 样式类对应。

#### 4.2.3 修改 `fetchAssetHome`

原来是同时请求价格 + 余额，现在增加用户信息请求：

```javascript
export async function fetchAssetHome(requestOptions) {
  const result = await Promise.all([
    fetchPriceData(requestOptions),
    fetchHomeBalanceData(requestOptions),
    fetchUserData(requestOptions),
  ]);
  const overview = buildHomeOverview(result[1], result[0], result[2]);
  setHomeTickerCache(overview.ticker);
  return overview;
}
```

三个请求并行执行，BMTR 接口失败不会阻塞其他两个请求（但会进入 `Promise.all` 的 catch 逻辑，页面会显示错误提示）。

### 4.3 `pages/index/index.vue`

#### 4.3.1 新增图标

在 `quickAssetIcon` 的 `iconMap` 中新增：

```javascript
bmtr: "https://imgs.agrimedia.cn/bm-bmt/qianbao.png",
```

> 当前复用已有的钱包图标，后续可替换为 BMTR 专属图标。

#### 4.3.2 新增背景

在 `quickAssetBg` 的 `bgMap` 中新增：

```javascript
bmtr: "https://imgs.agrimedia.cn/bm-bmt/suanli-bg.png",
```

> 当前复用算力卡片背景，后续可替换为 BMTR 专属背景。

#### 4.3.3 新增点击跳转

在 `openQuickAsset` 的 `urlMap` 中新增：

```javascript
bmtr: "/pages/assets/bmtr",
```

用户点击 BMTR 卡片后，会跳转到 `pages/assets/bmtr.vue` 页面。

---

## 五、首页资产卡片渲染顺序

修改后，首页「我的资产」区域共 6 个卡片，顺序如下：

1. 可用积分
2. 算力
3. 消费券
4. 抵用券
5. **BMTR（新增）**
6. 余额

> 由于 `balance` 卡片设置了 `grid-column: 1 / -1`，会单独占一行，所以实际布局为：
>
> - 第一行：可用积分、算力
> - 第二行：消费券、抵用券
> - 第三行：BMTR
> - 第四行：余额（整行）

如果希望调整 BMTR 的位置，修改 `api/assets.js` 中 `quickAssets` 数组的顺序即可。

---

## 六、待替换项

| 项目      | 当前值                                                       | 说明                    |
| --------- | ------------------------------------------------------------ | ----------------------- |
| BMTR 图标 | `https://imgs.agrimedia.cn/webimg/202607171808386371853.svg` | BMTR 专属图标（已替换） |
| BMTR 背景 | `https://imgs.agrimedia.cn/webimg/202607201122331061368.svg` | BMTR 专属背景（已替换） |

---

## 七、接口字段说明

| 字段         | 类型   | 用途                        |
| ------------ | ------ | --------------------------- |
| `uid`        | number | 用户ID                      |
| `nickname`   | string | 用户昵称                    |
| `avatar`     | string | 头像URL                     |
| `mxj_points` | string | MXJ积分                     |
| `bmtr`       | string | **BMTR 余额，本次使用字段** |
| `is_check`   | number | 是否通过某种校验            |
| `is_idcard`  | number | 是否实名认证                |
| `is_sign`    | number | 是否签到                    |
| `sign_time`  | number | 签到时间戳                  |
| `status`     | number | 用户状态                    |

---

## 八、验证建议

1. 进入首页，确认「我的资产」区域出现 BMTR 卡片
2. 确认 BMTR 显示的数值与 `/api/mxj/api/get_user` 返回的 `data.bmtr` 一致
3. 点击 BMTR 卡片，确认能跳转到 `pages/assets/bmtr`
4. 检查网络面板，确认三个请求并行发送：
   - `/api/hn/getPrice`
   - `/api/hn/getAllBalance`
   - `/api/mxj/api/get_user`
5. 如果 BMTR 接口失败，首页应显示错误提示，不影响其他资产卡片的数据逻辑（但 Promise.all 会统一报错，如需降级处理可改为单独 catch）

---

## 九、可能的后续优化

1. **接口降级**：如果 `/api/mxj/api/get_user` 不稳定，可将 `fetchUserData` 从 `Promise.all` 中拆出，单独 catch 并给 BMTR 一个默认值 `0`。
2. **数值格式化**：当前 `bmtr` 直接显示为字符串，如需统一显示为 `11.00` 或 `11.0000`，可在 `buildHomeOverview` 中使用 `toFixedNumber` 处理。
3. **图标替换**：拿到 BMTR 专属图标和背景后，更新 `pages/index/index.vue` 中的 `iconMap` 和 `bgMap`。
