# Uniapp Agent — Sport Era 手机端

uni-app 跨端移动应用。**消费 `server/app/api/controller/` 的接口。**
可编译为 H5 / App / 小程序端。

## 技术栈

-   **uni-app** + **Vue** 3
-   **Vite**
-   **Pinia** 状态管理
-   **TypeScript**
-   **z-paging** 分页组件
-   **uniapp-router-next** 路由管理

## 项目结构

```text
src/
├── main.ts                # 应用入口
├── App.vue                # 根组件
├── pages.json             # uni-app 页面路由 / tabBar
├── manifest.json          # 应用配置
├── api/                   # 接口请求模块（→ 后端 /api/*）
├── pages/                 # 页面组件（主包）
├── components/            # 公共组件
├── stores/                # Pinia Store
├── hooks/                 # 组合式函数
├── router/                # 路由中间件
├── utils/                 # 工具函数与请求拦截
├── enums/                 # 枚举常量
├── config/                # 应用配置
├── styles/                # 全局样式
├── static/                # 静态资源
└── uni_modules/           # uni-app 插件
```

## 运行命令

```bash
npm install
npm run dev:h5
npm run build:h5
```

---

## 并行协作协议

### 新功能开发时

#### Step 1: 等待或查阅后端 API 契约

查看 `server/app/api/controller/` 下对应 controller，并结合 validate、logic、model 获取：

-   接口路径和方法
-   请求参数类型
-   响应数据结构
-   登录态与权限要求

#### Step 2: 并行实现

```text
1. src/api/ 下新增或复用接口请求模块
2. src/pages/ 或分包目录下新增页面目录和页面文件
3. src/pages.json 添加页面路由和必要的 tabBar 配置
4. 页面样式复用全局样式和现有组件
```

#### Step 3: 构建联调

```bash
npm run build:h5
```

## 从后端 Agent 获取信息的方式

| 需要了解           | 查看位置                                             |
| ------------------ | ---------------------------------------------------- |
| 接口路径/参数/响应 | `server/app/api/controller/` 对应 controller         |
| 参数校验           | `server/app/api/validate/` 对应 validate             |
| 数据表字段         | `server/app/common/model/` 对应 model                |
| 枚举/常量          | `server/app/common/enum/` + `src/enums/` + 字典/配置 |
| Token 机制         | `server/app/common/cache/UserTokenCache.php`         |

## 设计稿对照

设计稿与本项目页面/组件的映射关系集中维护于 [`docs/设计稿映射.md`](../docs/设计稿映射.md)。接到新需求或还原设计稿前先查该文档，确认：

-   设计稿名称 ↔ uniapp 页面路径
-   当前实现状态（已完成 / 待开发 / 部分完成）
-   备注中的交互、资源或接口说明

新增或调整页面后需同步更新该文档的状态字段。

## 代码约定

-   API 请求通过 `src/api/` 模块，沿用 `src/utils/request` 相关封装。
-   分页列表优先使用 z-paging 组件。
-   页面路由必须在 `pages.json` 中注册。
-   跨端兼容用条件编译 `#ifdef H5`、`#ifdef MP-WEIXIN` 等。
-   状态管理用 Pinia，Store 放在 `src/stores/`。
-   图片资源放在 `src/static/`。
-   H5 富文本可用 `v-html`，非 H5 端按 uni-app 能力使用 `rich-text` 等方案。
-   外链图片如遇防盗链，优先通过渲染属性处理引用策略，不擅自清洗原始 URL。

## 近期踩坑

- 比赛详情页的直播入口只在 `match.live_url` 有值时展示，不要兜底拼默认第三方地址。
- 世界杯专题页的赛程卡和对阵图卡都要统一跳转到比赛详情页，避免只补一处入口导致列表仍然点不进去。
