{ "test_date": "2026-06-22 19:57:34", "module": "备课 (lesson-preparation)", "version": "v1", "base_url": "http://localhost:3000", "summary": { "total": 4, "passed": 2, "failed": 0, "warnings": 2 }, "roles": { "admin": { "role": "admin", "login_success": true, "list_page": { "status": "passed", "http_status": 200, "final_url": "http://localhost:3000/teacher/lesson-plans", "errors": [], "warnings": [] }, "new_page": { "status": "passed", "http_status": 200, "final_url": "http://localhost:3000/teacher/lesson-plans/new", "errors": [], "warnings": [] }, "checks": [ { "name": "有权访问备课列表页", "passed": true, "detail": "HTTP 200" } ], "screenshots": [ "access_admin_list.png", "access_admin_new.png" ] }, "teacher": { "role": "teacher", "login_success": true, "list_page": { "status": "warning", "http_status": 200, "final_url": "http://localhost:3000/teacher/lesson-plans", "errors": [], "warnings": [ "控制台错误 1 条" ] }, "new_page": { "status": "passed", "http_status": 200, "final_url": "http://localhost:3000/teacher/lesson-plans/new", "errors": [], "warnings": [] }, "checks": [ { "name": "有权访问备课列表页", "passed": true, "detail": "HTTP 200" } ], "screenshots": [ "access_teacher_list.png", "access_teacher_new.png" ] }, "student": { "role": "student", "login_success": true, "list_page": { "status": "passed", "http_status": 200, "final_url": "http://localhost:3000/student/dashboard?from=%2Fteacher%2Flesson-plans&reason=forbidden", "errors": [], "warnings": [] }, "new_page": { "status": "unknown", "http_status": null, "final_url": null, "errors": [], "warnings": [] }, "checks": [ { "name": "无权限访问被正确拦截", "passed": true, "detail": "重定向到 http://localhost:3000/student/dashboard?from=%2Fteacher%2Flesson-plans&reason=forbidden" } ], "screenshots": [ "access_student_list.png" ] }, "parent": { "role": "parent", "login_success": true, "list_page": { "status": "warning", "http_status": 200, "final_url": "http://localhost:3000/parent/dashboard?from=%2Fteacher%2Flesson-plans&reason=forbidden", "errors": [], "warnings": [ "控制台错误 1 条" ] }, "new_page": { "status": "unknown", "http_status": null, "final_url": null, "errors": [], "warnings": [] }, "checks": [ { "name": "无权限访问被正确拦截", "passed": true, "detail": "重定向到 http://localhost:3000/parent/dashboard?from=%2Fteacher%2Flesson-plans&reason=forbidden" } ], "screenshots": [ "access_parent_list.png" ] } }, "console_errors_global": [ { "role": "current", "error": "A tree hydrated but some attributes of the server rendered HTML didn't match the client properties. This won't be patched up. This can happen if a SSR-ed Client Component used:\n\n- A server/client branch `if (typeof window !== 'undefined')`.\n- Variable input such as `Date.now()` or `Math.random()` which changes each time it's called.\n- Date formatting in a user's locale which doesn't match the server.\n- External changing data without sending a snapshot of it along with the HTML.\n- Invalid HTML tag nesting.\n\nIt can also happen if the client has a browser extension installed which messes with the HTML before React loaded.\n\n%s%s https://react.dev/link/hydration-mismatch \n\n ...\n