## 问题与目标
- 现状：仅示例用户 `user` 绑定了一个学生，其余学生未与用户账户关联，导致学生端接口需要 fallback，功能割裂。
- 目标：建立稳定的“用户↔学生”绑定关系与接口，使学生端数据根据登录用户精确返回；同时保证班主任、中层、校级端不受影响。

## 数据库与索引
1. `students` 集合新增索引：
- `user_id` 唯一（稀疏），确保一个用户仅绑定一个学生；便于按用户查学生
- 维持现有：`student_id` 唯一、`class_id` 索引

2. 可选（若需要反查更快）：
- `users` 集合新增字段：`student_id`（非必需）；无需索引，主要用于展示与快捷反查

## 服务与接口
1. 新增服务 `app/services/student_binding.py`：
- `bind_user_to_student(user_id, student_id)`：校验重复绑定，写入 `students.user_id`，可同步回写 `users.student_id`
- `unbind_user_from_student(student_id)`：移除绑定；可同步清理 `users.student_id`
- `get_student_by_user(user_id)`：按 `students.user_id` 查询返回学生

2. 新增路由 `app/api/v1/students.py`：
- `POST /students/{student_id}/bind`（管理员或班主任，≥2级）：请求体携带 `user_id`
- `DELETE /students/{student_id}/bind`（管理员或班主任，≥2级）
- `GET /students/me`（学生本人，≥1级）：返回当前登录用户绑定的学生信息
- 路由统一挂载 `Depends(require_edition_for_mode())`，角色控制用 `require_role(min_level)`

## 学生端接口对齐
- 更新 `app/services/dashboard.py`：
  - 去掉“未绑定时随机学生”的 fallback，若当前用户未绑定学生则返回 404（或明确错误）
  - 查询逻辑改为严格基于 `students.user_id` 取 `student_id/class_id`，再取当天课表/出勤/操行

## 初始化数据与迁移
- 在 `init_db.py` 中：
  - 保留已绑定示例 `user ↔ SW22-1-001`
  - 新增批量绑定工具函数（可选）：用于演示环境将若干学生与新创建的用户批量绑定（仅本地开发）
- 正式环境：由管理员通过新接口进行绑定

## 验证
- 使用 MCP：
  - 检查 `students` 索引与绑定结果（`count`、`query`）
  - 按用户查询学生 `get_student_by_user` 的返回
- 通过接口：
  - 学生登录访问 `/dashboard/student/today` 能准确返回本人数据；未绑定返回明确错误
  - 班主任、中层、校级端接口不受影响

## 变更范围
- 新增文件：`app/services/student_binding.py`、`app/api/v1/students.py`
- 修改文件：`app/services/dashboard.py`（去除 fallback）、`app/api/v1/router.py`（注册 students 路由）、`init_db.py`（索引与演示绑定可选）

## 回滚与安全
- 仅在 `students.user_id` 写入引用，不影响学生主键；解绑接口可恢复
- 索引为稀疏唯一，避免未绑定数据被约束；写入时做并发校验，防止竞态

请确认以上方案，我将按此落地实现并完成 MCP 与接口验证。