# apply 页面数据来源排查

> 排查日期：2026-03-18
> 页面路径：pages/apply/apply

## 概览

| 分类 | 数量 | 说明 |
|------|------|------|
| A. Mock 数据 | 0 | 无 mock 数据 |
| B. 硬编码数据 | 5 | 表单校验规则、延时跳转、错误提示文案 |
| C. 已对接 API | 2 | `/api/xcx/me`（GET）、`/api/xcx/apply`（POST） |
| D. 前端计算/派生数据 | 2 | statusBarHeight、submitting 状态 |
| E. 路由参数 | 0 | 无路由参数 |
| F. WXML 硬编码文案 | 16 | 标题、欢迎语、步骤条、表单标签、placeholder、提示语 |

---

## 一、Mock 数据

无。页面未使用任何 mock 数据或本地假数据。

---

## 二、硬编码数据

| # | 位置（apply.ts 行号） | 内容 | 风险等级 | 说明 |
|---|----------------------|------|----------|------|
| B1 | L89 `!/^\d{11}$/.test(phone)` | 手机号正则：固定 11 位纯数字 | 🟡 低 | 仅适用于中国大陆手机号，若未来支持港澳台/海外号码需调整 |
| B2 | L85 `maxlength="5"`（WXML） | 球房ID最大长度 5 | 🟡 低 | 与后端 site_code 长度约束需保持一致 |
| B3 | L113 `setTimeout(() => {...}, 800)` | 提交成功后 800ms 延时跳转 | 🟢 无风险 | 纯 UX 延时，不影响业务逻辑 |
| B4 | L117-123 错误码映射 | `409 → "您已有待审核的申请"`、`422 → "表单信息有误，请检查"` | 🟡 低 | 错误文案硬编码在前端，后端 detail 字段优先使用 |
| B5 | L82-96 表单校验逻辑 | 4 条必填校验 + 手机号格式校验 | 🟢 无风险 | 标准前端校验，后端有独立校验 |

---

## 三、已对接 API

### API-1：获取当前用户状态

| 项目 | 值 |
|------|-----|
| 端点 | `GET /api/xcx/me` |
| 调用位置 | `apply.ts` → `_checkAccess()` (L30) |
| 调用时机 | `onShow` 生命周期 |
| 请求参数 | 无（仅 Authorization header） |
| 认证 | `needAuth: true`（自动附加 Bearer token） |
| 响应字段 | `user_id`、`status`（new/pending/approved/rejected/disabled）、`nickname` |
| 响应处理 | 写入 `app.globalData.authUser` + `wx.setStorageSync("userId"/"userStatus")`；根据 status 路由分发 |
| 错误处理 | catch 静默忽略（允许用户继续填表） |

**路由分发逻辑：**

| status | 行为 |
|--------|------|
| `new` | 留在当前页（允许填写申请表） |
| `rejected` | `reLaunch → /pages/no-permission/no-permission` |
| `approved` | `reLaunch → /pages/mvp/mvp` |
| `pending` | `reLaunch → /pages/reviewing/reviewing` |
| `disabled` | `reLaunch → /pages/no-permission/no-permission` |

### API-2：提交入驻申请

| 项目 | 值 |
|------|-----|
| 端点 | `POST /api/xcx/apply` |
| 调用位置 | `apply.ts` → `onSubmit()` (L99) |
| 调用时机 | 用户点击"提交申请"按钮 |
| 认证 | `needAuth: true` |
| 请求参数 | 见下表 |
| 成功处理 | Toast "申请已提交" → 800ms 后 `reLaunch → /pages/reviewing/reviewing` |
| 错误处理 | 优先取 `err.data.detail`；409 → "您已有待审核的申请"；422 → "表单信息有误"；其他 → "提交失败，请稍后重试" |

**请求参数：**

| 字段 | 来源 | 类型 | 必填 | 说明 |
|------|------|------|------|------|
| `site_code` | 表单输入 `siteCode`（trim） | string | ✅ | 球房ID |
| `applied_role_text` | 表单输入 `role`（trim） | string | ✅ | 申请身份（自由文本） |
| `phone` | 表单输入 `phone` | string | ✅ | 11 位手机号 |
| `employee_number` | 表单输入 `employeeNumber`（trim，空则 undefined） | string? | ❌ | 编号（选填） |
| `nickname` | 表单输入 `nickname`（trim） | string | ✅ | 昵称 |

---

## 四、前端计算/派生数据

| # | 数据 | 来源 | 位置 |
|---|------|------|------|
| D1 | `statusBarHeight` | `wx.getWindowInfo().statusBarHeight` | `onLoad()` L14 |
| D2 | `submitting` | 布尔状态锁，`onSubmit` 开始时设 true，finally 设 false | `onSubmit()` L98/L126 |

---

## 五、路由参数

无。`onLoad()` 未读取 `options` 参数。

---

## 六、WXML 硬编码文案

| # | 元素 | 文案内容 | 建议 |
|---|------|----------|------|
| F1 | navbar-title | `申请访问权限` | 可保留 |
| F2 | welcome-title | `欢迎加入球房运营助手` | 可保留 |
| F3 | welcome-desc | `请填写申请信息，等待管理员审核` | 可保留 |
| F4 | step-label 1 | `提交申请` | 可保留 |
| F5 | step-label 2 | `等待审核` | 可保留 |
| F6 | step-label 3 | `审核通过` | 可保留 |
| F7 | step-label 4 | `开始使用` | 可保留 |
| F8 | form-label | `球房ID` | 可保留 |
| F9 | form-label | `申请身份` | 可保留 |
| F10 | form-label | `手机号` | 可保留 |
| F11 | form-label | `编号` + `选填` | 可保留 |
| F12 | form-label | `昵称` | 可保留 |
| F13 | placeholder | `请输入球房ID` / `请输入申请身份（如：助教、店长等）` / `请输入手机号` / `请输入编号` / `请输入昵称` | 可保留 |
| F14 | form-tip | `请认真填写，信息不完整可能导致审核不通过` | 可保留 |
| F15 | submit-btn-text | `提交申请` | 可保留 |
| F16 | bottom-tip | `审核通常需要 1-3 个工作日` | 🟡 若审核时效变化需同步更新 |

---

## 七、联调 TODO

| # | 类型 | 描述 | 优先级 |
|---|------|------|--------|
| T1 | 验证 | 确认 `GET /api/xcx/me` 返回字段与前端解构一致（`user_id`、`status`、`nickname`） | P0 |
| T2 | 验证 | 确认 `POST /api/xcx/apply` 请求体字段名与后端 schema 一致（`site_code`、`applied_role_text`、`phone`、`employee_number`、`nickname`） | P0 |
| T3 | 验证 | 确认后端 409 响应场景（重复申请）和 422 响应场景（参数校验失败）的 `detail` 字段格式 | P1 |
| T4 | 验证 | 确认 `site_code` 最大长度（前端 maxlength=5）与后端约束一致 | P1 |
| T5 | 优化 | `_checkAccess` 的 catch 静默忽略网络错误——考虑是否需要给用户提示网络异常 | P2 |
| T6 | 优化 | `employee_number` 空值传 `undefined`（JSON 序列化时会被忽略）——确认后端是否接受缺省该字段 | P1 |
| T7 | 确认 | `status` 枚举值完整性——前端处理了 `new/rejected/approved/pending/disabled`，确认后端不会返回其他值 | P1 |
