# 清道夫 App 自定义 tabBar 开发文档

## 目标

实现按角色动态显示的底部 tabBar：
- **销售端 / 施工端**：3 个 tab（首页、任务、我的）
- **调度端**：4 个 tab（首页、排班、任务、我的）

## 技术方案

uni-app 微信小程序支持自定义 tabBar，通过 `custom-tab-bar` 组件实现。

### 1. 启用自定义 tabBar

在 `src/pages.json` 中：
- 设置 `tabBar.custom = true`
- 保留 `tabBar.list` 作为基础配置（微信小程序要求），但删除 `iconPath` / `selectedIconPath`，仅保留 `pagePath` 和 `text`

### 2. 新建自定义 tabBar 组件

文件：`src/custom-tab-bar/index.vue`

组件逻辑：
- 读取 `authStore.userRole`
- 根据角色返回不同的 tab 列表
- 使用 `uni.switchTab` 切换页面
- 高亮当前选中的 tab

### 3. tab 配置

| 角色 | tab 列表 |
|------|---------|
| sales | 首页 (`/pages/home/home`)、任务 (`/pages/task/task`)、我的 (`/pages/my/my`) |
| construction | 首页 (`/pages/home/home`)、任务 (`/pages/task/task`)、我的 (`/pages/my/my`) |
| dispatch | 首页 (`/pages/home/home`)、排班 (`/subPackages/pages-dispatch/schedule`)、任务 (`/pages/task/task`)、我的 (`/pages/my/my`) |

### 4. 关键约束

- 自定义 tabBar 中的页面必须是 `pages.json` 中 `tabBar.list` 已注册的页面
- 但 `subPackages/pages-dispatch/schedule` 是分包页面，**不能**直接放进 `tabBar.list`
- 解决方案：在 `pages` 主包中建一个轻量壳页 `pages/schedule/schedule.vue`，内容直接渲染调度端排班组件；调度端原 `subPackages/pages-dispatch/schedule.vue` 保留或重定向

### 5. 需要修改/新建的文件

| 文件 | 操作 | 说明 |
|------|------|------|
| `src/pages.json` | 修改 | `tabBar.custom = true`，调整 `tabBar.list` |
| `src/custom-tab-bar/index.vue` | 新建 | 自定义 tabBar 组件 |
| `src/custom-tab-bar/index.json` | 新建 | 组件配置（component: true） |
| `src/pages/schedule/schedule.vue` | 新建 | 排班 tabBar 壳页（主包） |
| `src/components/dispatch/ScheduleView.vue` | 新建 | 排班实际内容组件 |
| `src/subPackages/pages-dispatch/schedule.vue` | 修改 | 复用 `ScheduleView` 组件 |
| `src/pages/home/home.vue` | 无需修改 | 已按角色渲染 |
| `src/pages/task/task.vue` | 无需修改 | 已按角色渲染 |
| `src/pages/my/my.vue` | 无需修改 | 已按角色渲染 |

### 6. 开发步骤

1. 新建 `src/components/dispatch/ScheduleView.vue`，将 `subPackages/pages-dispatch/schedule.vue` 的内容抽成组件
2. 新建 `src/pages/schedule/schedule.vue`，引入 `ScheduleView`
3. 修改 `subPackages/pages-dispatch/schedule.vue`，改为引入 `ScheduleView`
4. 新建 `src/custom-tab-bar/index.vue` 和 `index.json`
5. 修改 `src/pages.json`：
   - `tabBar.custom = true`
   - `tabBar.list` 注册 4 个页面：home、schedule、task、my
6. 验证构建和类型检查
7. 在微信开发者工具中测试三个角色 tabBar 显示是否正确

### 7. 风险点

- 自定义 tabBar 首次加载可能略有延迟
- 分包页面不能直接作为 tabBar 页，必须通过主包壳页中转
- 需要确保 `authStore.userRole` 在 tabBar 渲染时已经可用

### 8. 验证方式

- `npm run type-check`
- `npm run build:mp-weixin`
- 微信开发者工具：分别用 sales/dispatch/construction 角色登录，检查底部 tabBar 数量和跳转

---

文档生成时间：2026-06-24
