Initial commit of akmon project
This commit is contained in:
220
doc_zhipao/ANALYTICS_TROUBLESHOOTING.md
Normal file
220
doc_zhipao/ANALYTICS_TROUBLESHOOTING.md
Normal file
@@ -0,0 +1,220 @@
|
||||
# Analytics RPC 函数部署脚本
|
||||
|
||||
## 问题诊断
|
||||
错误信息 "Searched for the function public.get_teacher_analytics ... but no matches were found in the schema cache" 表明:
|
||||
|
||||
1. RPC 函数尚未在 Supabase 数据库中创建
|
||||
2. 或函数签名与调用方式不匹配
|
||||
3. 或函数权限未正确设置
|
||||
|
||||
## 解决方案
|
||||
|
||||
### 步骤 1: 确认数据库连接
|
||||
首先确保你能够连接到 Supabase 数据库:
|
||||
|
||||
```sql
|
||||
-- 在 Supabase SQL Editor 中运行,检查连接
|
||||
SELECT current_user, current_database(), now();
|
||||
```
|
||||
|
||||
### 步骤 2: 检查现有函数
|
||||
```sql
|
||||
-- 检查是否已存在相关函数
|
||||
SELECT
|
||||
routine_name,
|
||||
routine_type,
|
||||
routine_definition
|
||||
FROM information_schema.routines
|
||||
WHERE routine_schema = 'public'
|
||||
AND (
|
||||
routine_name LIKE '%teacher_analytics%' OR
|
||||
routine_name LIKE '%top_performers%' OR
|
||||
routine_name LIKE '%chart_data%'
|
||||
)
|
||||
ORDER BY routine_name;
|
||||
```
|
||||
|
||||
### 步骤 3: 创建简化版本的函数(用于测试)
|
||||
如果完整的函数创建有问题,先创建一个简化版本:
|
||||
|
||||
```sql
|
||||
-- 简化版 get_teacher_analytics 函数
|
||||
CREATE OR REPLACE FUNCTION public.get_teacher_analytics(
|
||||
teacher_id uuid DEFAULT NULL,
|
||||
start_date text DEFAULT NULL,
|
||||
end_date text DEFAULT NULL
|
||||
)
|
||||
RETURNS jsonb
|
||||
LANGUAGE plpgsql
|
||||
SECURITY DEFINER
|
||||
AS $$
|
||||
BEGIN
|
||||
-- 返回简单的测试数据
|
||||
RETURN jsonb_build_object(
|
||||
'total_students', 25,
|
||||
'total_assignments', 8,
|
||||
'completion_rate', 85.5,
|
||||
'average_score', 78.2,
|
||||
'active_classes', 3,
|
||||
'total_submissions', 180,
|
||||
'pending_reviews', 12,
|
||||
'graded_submissions', 168
|
||||
);
|
||||
END;
|
||||
$$;
|
||||
|
||||
-- 简化版 get_top_performers 函数
|
||||
CREATE OR REPLACE FUNCTION public.get_top_performers(
|
||||
teacher_id uuid DEFAULT NULL,
|
||||
start_date text DEFAULT NULL,
|
||||
end_date text DEFAULT NULL,
|
||||
"limit" integer DEFAULT 10
|
||||
)
|
||||
RETURNS jsonb
|
||||
LANGUAGE plpgsql
|
||||
SECURITY DEFINER
|
||||
AS $$
|
||||
BEGIN
|
||||
-- 返回简单的测试数据
|
||||
RETURN jsonb_build_array(
|
||||
jsonb_build_object(
|
||||
'student_id', gen_random_uuid(),
|
||||
'name', '张三',
|
||||
'username', 'zhangsan',
|
||||
'avatar_url', null,
|
||||
'score', 95.5,
|
||||
'submission_count', 8,
|
||||
'completion_rate', 100,
|
||||
'class_name', '三年级一班',
|
||||
'rank_position', 1
|
||||
),
|
||||
jsonb_build_object(
|
||||
'student_id', gen_random_uuid(),
|
||||
'name', '李四',
|
||||
'username', 'lisi',
|
||||
'avatar_url', null,
|
||||
'score', 92.3,
|
||||
'submission_count', 7,
|
||||
'completion_rate', 87.5,
|
||||
'class_name', '三年级一班',
|
||||
'rank_position', 2
|
||||
)
|
||||
);
|
||||
END;
|
||||
$$;
|
||||
|
||||
-- 简化版 get_chart_data 函数
|
||||
CREATE OR REPLACE FUNCTION public.get_chart_data(
|
||||
teacher_id uuid DEFAULT NULL,
|
||||
start_date text DEFAULT NULL,
|
||||
end_date text DEFAULT NULL,
|
||||
"type" text DEFAULT 'completion_rate'
|
||||
)
|
||||
RETURNS jsonb
|
||||
LANGUAGE plpgsql
|
||||
SECURITY DEFINER
|
||||
AS $$
|
||||
BEGIN
|
||||
-- 返回简单的测试数据
|
||||
RETURN jsonb_build_array(
|
||||
jsonb_build_object(
|
||||
'date_key', '2024-06-01',
|
||||
'value', 75.5,
|
||||
'label', '完成率',
|
||||
'count', 15
|
||||
),
|
||||
jsonb_build_object(
|
||||
'date_key', '2024-06-02',
|
||||
'value', 82.3,
|
||||
'label', '完成率',
|
||||
'count', 18
|
||||
),
|
||||
jsonb_build_object(
|
||||
'date_key', '2024-06-03',
|
||||
'value', 90.1,
|
||||
'label', '完成率',
|
||||
'count', 22
|
||||
)
|
||||
);
|
||||
END;
|
||||
$$;
|
||||
|
||||
-- 授权函数
|
||||
GRANT EXECUTE ON FUNCTION public.get_teacher_analytics TO authenticated;
|
||||
GRANT EXECUTE ON FUNCTION public.get_top_performers TO authenticated;
|
||||
GRANT EXECUTE ON FUNCTION public.get_chart_data TO authenticated;
|
||||
```
|
||||
|
||||
### 步骤 4: 测试函数调用
|
||||
```sql
|
||||
-- 测试函数调用
|
||||
SELECT public.get_teacher_analytics();
|
||||
SELECT public.get_top_performers();
|
||||
SELECT public.get_chart_data();
|
||||
```
|
||||
|
||||
### 步骤 5: 验证 Supabase RPC 调用
|
||||
在 Supabase 中测试 RPC 调用:
|
||||
|
||||
```javascript
|
||||
// 在 Supabase 控制台的 API 文档中测试
|
||||
const { data, error } = await supabase
|
||||
.rpc('get_teacher_analytics', {
|
||||
teacher_id: null,
|
||||
start_date: '2024-06-01',
|
||||
end_date: '2024-06-12'
|
||||
});
|
||||
```
|
||||
|
||||
## 常见问题解决
|
||||
|
||||
### 问题 1: 函数参数类型不匹配
|
||||
如果遇到参数类型问题,确保:
|
||||
- 日期参数使用 `text` 类型而不是 `date`
|
||||
- `limit` 参数加引号 `"limit"`(因为是 PostgreSQL 保留字)
|
||||
- UUID 参数允许 NULL 值
|
||||
|
||||
### 问题 2: 权限问题
|
||||
```sql
|
||||
-- 检查函数权限
|
||||
SELECT
|
||||
routine_name,
|
||||
routine_schema,
|
||||
security_type
|
||||
FROM information_schema.routines
|
||||
WHERE routine_name LIKE '%teacher_analytics%';
|
||||
|
||||
-- 重新授权
|
||||
GRANT EXECUTE ON ALL FUNCTIONS IN SCHEMA public TO authenticated;
|
||||
```
|
||||
|
||||
### 问题 3: RLS 策略冲突
|
||||
```sql
|
||||
-- 临时禁用 RLS(仅用于调试)
|
||||
ALTER TABLE public.ak_users DISABLE ROW LEVEL SECURITY;
|
||||
-- 记住调试完成后重新启用
|
||||
-- ALTER TABLE public.ak_users ENABLE ROW LEVEL SECURITY;
|
||||
```
|
||||
|
||||
## 部署步骤(按顺序执行)
|
||||
|
||||
1. **创建简化函数**:在 Supabase SQL Editor 中执行上面的简化版函数
|
||||
2. **测试调用**:确认 RPC 调用能够工作
|
||||
3. **逐步升级**:如果简化版本工作正常,再部署完整版本
|
||||
4. **验证数据**:确保返回的数据结构符合前端期望
|
||||
|
||||
## 前端调试技巧
|
||||
|
||||
在 analytics.uvue 中添加调试信息:
|
||||
|
||||
```javascript
|
||||
const handleError = (errorData: any) => {
|
||||
console.error('Analytics error详细信息:', errorData)
|
||||
console.error('错误类型:', typeof errorData)
|
||||
console.error('错误内容:', JSON.stringify(errorData, null, 2))
|
||||
error.value = '数据加载失败:' + (errorData.message || '未知错误')
|
||||
loading.value = false
|
||||
}
|
||||
```
|
||||
|
||||
执行这些步骤后,Analytics 页面应该能够正常加载数据。
|
||||
Reference in New Issue
Block a user