# Analytics RPC 函数部署指南
## 概述
为 Analytics 页面创建了4个主要的 RPC 函数,提供教师数据分析功能。
## 创建的 RPC 函数
### 1. `get_teacher_analytics` - 教师统计数据
**功能**: 获取教师的核心统计指标
**参数**:
- `p_teacher_id` (uuid, 可选) - 教师ID,默认当前用户
- `p_start_date` (date, 可选) - 开始日期,默认30天前
- `p_end_date` (date, 可选) - 结束日期,默认今天
**返回字段**:
- `total_students` - 学生总数
- `total_assignments` - 作业总数
- `completion_rate` - 完成率(%)
- `average_score` - 平均分
- `active_classes` - 活跃班级数
- `total_submissions` - 总提交数
- `pending_reviews` - 待评分数
- `graded_submissions` - 已评分数
### 2. `get_top_performers` - 优秀学员排行
**功能**: 获取表现优秀的学员排行榜
**参数**:
- `p_teacher_id` (uuid, 可选) - 教师ID
- `p_start_date` (date, 可选) - 开始日期
- `p_end_date` (date, 可选) - 结束日期
- `p_limit` (integer, 可选) - 返回数量,默认10
**返回字段**:
- `student_id` - 学生ID
- `name` - 学生姓名
- `username` - 用户名
- `avatar_url` - 头像地址
- `score` - 平均分
- `submission_count` - 提交数量
- `completion_rate` - 完成率
- `class_name` - 班级名称
- `rank_position` - 排名位置
### 3. `get_chart_data` - 图表数据
**功能**: 获取各种图表数据
**参数**:
- `p_teacher_id` (uuid, 可选) - 教师ID
- `p_start_date` (date, 可选) - 开始日期
- `p_end_date` (date, 可选) - 结束日期
- `p_type` (text, 可选) - 图表类型,默认'completion_rate'
**支持的图表类型**:
- `completion_rate` - 完成率趋势
- `score_distribution` - 成绩分布
- `submission_trend` - 提交趋势
**返回字段**:
- `date_key` - 日期键
- `value` - 数值
- `label` - 标签
- `count` - 计数
### 4. `get_recent_activities` - 近期活动
**功能**: 获取近期活动记录
**参数**:
- `p_teacher_id` (uuid, 可选) - 教师ID
- `p_limit` (integer, 可选) - 返回数量,默认20
**返回字段**:
- `activity_id` - 活动ID
- `activity_type` - 活动类型
- `title` - 标题
- `description` - 描述
- `student_name` - 学生姓名
- `assignment_title` - 作业标题
- `activity_time` - 活动时间
- `time_ago` - 相对时间
## 部署步骤
### 1. 执行 SQL 文件
```bash
# 在 Supabase SQL Editor 中执行
# 或通过 psql 命令行执行
psql -h [your-host] -U [your-user] -d [your-database] -f analytics_rpc_functions.sql
```
### 2. 验证函数创建
```sql
-- 检查函数是否创建成功
SELECT routine_name, routine_type
FROM information_schema.routines
WHERE routine_schema = 'public'
AND routine_name LIKE 'get_%analytics%'
OR routine_name LIKE 'get_top_performers'
OR routine_name LIKE 'get_chart_data'
OR routine_name LIKE 'get_recent_activities';
```
### 3. 测试函数调用
```sql
-- 测试教师统计数据
SELECT * FROM public.get_teacher_analytics();
-- 测试优秀学员排行
SELECT * FROM public.get_top_performers(limit => 5);
-- 测试图表数据
SELECT * FROM public.get_chart_data(p_type => 'completion_rate');
-- 测试近期活动
SELECT * FROM public.get_recent_activities(p_limit => 10);
```
## 前端使用示例
### Analytics 页面调用
```vue
```
### 参数示例
```typescript
// Analytics 参数
const analyticsParams = ref({
teacher_id: 'current_teacher_id', // 可选,默认当前用户
start_date: '2024-01-01',
end_date: '2024-12-31'
})
// 优秀学员参数
const performersParams = ref({
teacher_id: 'current_teacher_id',
limit: 10,
start_date: '2024-01-01',
end_date: '2024-12-31'
})
// 图表数据参数
const chartParams = ref({
teacher_id: 'current_teacher_id',
type: 'completion_rate', // 或 'score_distribution', 'submission_trend'
start_date: '2024-01-01',
end_date: '2024-12-31'
})
```
## 性能优化
### 创建的索引
- `idx_assignments_teacher_date` - 优化按教师和日期查询
- `idx_assignments_class_due` - 优化按班级和截止日期查询
- `idx_submissions_assignment_date` - 优化按作业和提交时间查询
- `idx_submissions_student_score` - 优化按学生和分数查询
- `idx_user_classes_role` - 优化用户班级角色查询
## 安全特性
### 权限控制
- 所有函数都验证调用者是否为教师
- 只能查看自己教授班级的数据
- 使用 `SECURITY DEFINER` 确保权限一致性
### RLS 策略
- 为作业表添加了行级安全策略
- 确保教师只能访问自己的数据
## 注意事项
1. **数据完整性**: 确保 `ak_user_classes` 表正确维护了师生关系
2. **时区处理**: 函数使用 `TIMESTAMP WITH TIME ZONE` 处理时间
3. **空值处理**: 所有计算都考虑了空值情况
4. **性能监控**: 建议监控函数执行时间,必要时进一步优化
## 故障排除
### 常见错误
1. **"用户不是教师或不存在"** - 检查用户角色和ID
2. **数据为空** - 检查师生关系配置和时间范围
3. **权限错误** - 确保函数权限正确授予
### 调试技巧
```sql
-- 检查用户角色
SELECT id, username, role FROM public.ak_users WHERE id = auth.uid();
-- 检查师生关系
SELECT * FROM public.ak_user_classes WHERE user_id = auth.uid();
-- 检查作业数据
SELECT COUNT(*) FROM public.ak_assignments WHERE teacher_id = auth.uid();
```
部署完成后,Analytics 页面应该能够正常加载和显示数据分析功能。