Files
akmon/doc_zhipao/ANALYTICS_TROUBLESHOOTING.md
2026-01-20 08:04:15 +08:00

5.8 KiB
Raw Permalink Blame History

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 数据库:

-- 在 Supabase SQL Editor 中运行,检查连接
SELECT current_user, current_database(), now();

步骤 2: 检查现有函数

-- 检查是否已存在相关函数
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: 创建简化版本的函数(用于测试)

如果完整的函数创建有问题,先创建一个简化版本:

-- 简化版 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: 测试函数调用

-- 测试函数调用
SELECT public.get_teacher_analytics();
SELECT public.get_top_performers();
SELECT public.get_chart_data();

步骤 5: 验证 Supabase RPC 调用

在 Supabase 中测试 RPC 调用:

// 在 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: 权限问题

-- 检查函数权限
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 策略冲突

-- 临时禁用 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 中添加调试信息:

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 页面应该能够正常加载数据。