## API 文档汇总（App 用户相关）

* 登录与绑定：

  * `POST /api/app/users/weixin/login`（miniapp/src/api/apis/apiDefinitions.js:106）

    * 请求: `App_weixin_login_request`（code、invite\_code，可选）

    * 响应: `App_weixin_login_response`（token、user\_id、avatar、nickname、invite\_code）（miniapp/src/api/apis/globals.d.ts:760）

  * `POST /api/app/users/{user_id}/phone/bind`（apiDefinitions.js:123）

    * 请求: `App_bind_phone_request`（code，来源于微信手机号授权）（globals.d.ts:376）

    * 响应: 成功布尔或标准成功结构（项目统一在 `responded` 钩子返回 `response.data` 或 `response.data.data`，miniapp/src/api/apis/index.js:59）

* 用户资料与地址：

  * `PUT /api/app/users/{user_id}` 修改头像/昵称（apiDefinitions.js:107）

    * 请求: `App_modify_user_request`（avatar、nickname，可选）（globals.d.ts:363）

  * `GET /api/app/users/{user_id}/addresses` 列表（apiDefinitions.js:108）/ `POST` 新增（apiDefinitions.js:109）/ `DELETE` 删除（apiDefinitions.js:110）/ `PUT .../default` 设默认（apiDefinitions.js:114）

    * 新增请求: `App_add_address_request`（姓名、手机号、省市区、详细地址、是否默认）（globals.d.ts:367）

    * 响应: 列表返回数组，新增/删除/设默认返回标准成功结构（项目统一 `responded` 处理）

* 积分与统计：

  * `GET /api/app/users/{user_id}/points`（apiDefinitions.js:124）/ `GET .../points/balance`（apiDefinitions.js:125）

    * 响应: `App_points_balance_response`（balance）（globals.d.ts:773）

  * `GET /api/app/users/{user_id}/stats`（apiDefinitions.js:126）

    * 响应: `App_user_stats_response`（coupon\_count、item\_card\_count、points\_balance）（globals.d.ts:776）

* 订单与卡券/道具：

  * `GET /api/app/users/{user_id}/orders`（apiDefinitions.js:122）→ 订单列表（类型包含 `Model_order_items` 等）

  * `GET /api/app/users/{user_id}/coupons`（apiDefinitions.js:118）/ `GET .../invites`（apiDefinitions.js:119）

  * `GET /api/app/users/{user_id}/item_cards`（apiDefinitions.js:120）/ `GET .../item_cards/uses`（apiDefinitions.js:121）

    * 响应: `User_item_card_with_template[]`（globals.d.ts:978）

## 现有代码要点（可复用）

* API 客户端：`alova` + 生成器（miniapp/src/api/apis/index.js:35、112；miniapp/alova.config.js:6），已封装 `Authorization`、401 刷新登录（index.js:9-33）。

* 登录页（Taro版）：`miniapp/src/pages/login/index.vue`，逻辑封装在 `Apis.login.WechatAppLogin`（index.js:122-421）。

## 登录页面实现（Uni-App Vue3）

* 页面结构：Logo/说明文案、按钮`「微信登录」`与`open-type="getPhoneNumber"`的手机号授权按钮，加载与错误提示。

* 流程：

  * `uni.login({ provider: 'weixin' })` 获取 `code` → 调用 `POST /api/app/users/weixin/login` → 存储 `token`、`user_id` 到 `uni.setStorageSync`。

  * 可选：用户点击手机号授权后触发 `onGetPhoneNumber`，拿到 `code` 调用 `POST /api/app/users/{user_id}/phone/bind` 绑定手机号。

  * 登录完成后拉取 `GET /api/app/users/{user_id}/stats` 与 `.../points/balance` 更新首页状态。

* 网络层：

  * 方案A（推荐，复用现有）：在 Uni-App 中引入与复用 `alova` 生成的 `Apis`（保持统一的拦截器与基址、响应处理）。

  * 方案B（轻量）：使用 `uni.request` 封装最小调用（登录/绑定/统计），按现有 `Authorization: Bearer <token>` 规则注入。

* 配置与安全：

  * `baseURL` 指向后端地址（如 `http://127.0.0.1:9991`），并在微信小程序后台配置合法域名/证书；避免在日志中输出明文 token/手机号等敏感信息。

* 路由与状态：

  * 在 `pages.json` 新增 `pages/login/index`，登录成功后 `uni.reLaunch` 到首页；使用 `pinia` 存储 `isLogin`、`userInfo`、`points` 等（参考 miniapp/src/store/index.js）。

* 错误处理：

  * 按当前项目的分类提示（连接被拒绝、超时、域名未配置、SSL 错误、404、500、参数错误）进行用户级文案与重试入口（参考 index.js:221-253）。

## 验证与交付

* 验证：真机或开发者工具下，观察 `code` 获取、接口返回、`token/user_id` 存储与后续接口成功；埋点或日志控制台输出关键步骤。

* 交付：

  * 新增 `pages/login/index.vue`（Uni-App Vue3 Composition API 实现）。

  * 复用或新增 API 封装（A/B 二选一）。

  * 配置/路由调整与最小 `pinia` 状态接入。

## 后续执行步骤

* 接入 Swagger 源：将生成器输入指向 `http://127.0.0.1:9991/swagger/v1/swagger.json`（或项目后端的 Swagger JSON），生成/更新 `Apis` 并对齐 `baseURL`。

* 按上述方案完成页面与调用接入，并保持与现有 `alova` 响应处理一致性。

