Files
NextEdu/bugs/teacher_web_test_post_audit.md
SpecialX e4254f0f8e docs: update architecture map and add lesson-preparation usage fixes design
- Update architecture impact map (004) and data (005) with new modules

- Add lesson-preparation usage fixes design spec

- Add teacher web test post-audit report
2026-06-24 12:01:35 +08:00

1673 lines
104 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 教师端 Web 功能测试报告 (Post-Audit)
> 测试日期: 2026-06-23 18:27:12
> 测试范围: 所有教师端页面功能 (审计修复后)
> 测试工具: Playwright + Chromium (Python)
> 测试账号: t_chinese_1@xiaoxue.edu.cn
---
## 一、测试概览
| 指标 | 数值 |
|------|------|
| 总测试页面数 | 39 |
| PASS | 38 |
| FAIL | 1 |
| WARN | 0 |
| 通过率 | 97.4% |
---
## 二、页面测试详情
### Dashboard
| 页面 | HTTP状态 | 结果 | 备注 |
|------|----------|------|------|
| PASS `/teacher/dashboard` | 200 | passed | 错误: 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:
- A server/client branch `if (typeof window !== 'undefined')`.
- Variable input such as `Date.now()` or `Math.random()` which changes each time it's called.
- Date formatting in a user's locale which doesn't match the server.
- External changing data without sending a snapshot of it along with the HTML.
- Invalid HTML tag nesting.
It can also happen if the client has a browser extension installed which messes with the HTML before React loaded.
%s%s https://react.dev/link/hydration-mismatch
...
<SidebarProvider sidebar={<AppSidebar>}>
<div className="flex h-scr...">
<aside>
<div className="flex-1 fle...">
<a>
...
<div className="flex items...">
<GlobalSearch>
...
<MenuAnchor asChild={true} __scopeMenu={{Menu:[...], ...}}>
<PopperAnchor __scopePopper={{Menu:[...], ...}} asChild={true} ref={null}>
<Primitive.div asChild={true} ref={function}>
<Primitive.div.Slot ref={function}>
<Primitive.div.SlotClone ref={function}>
<Primitive.button type="button" id="radix-_R_1..." aria-haspopup="menu" aria-expanded={false} ...>
<Primitive.button.Slot type="button" id="radix-_R_1..." aria-haspopup="menu" ...>
<Primitive.button.SlotClone type="button" id="radix-_R_1..." aria-haspopup="menu" ...>
<Button variant="ghost" size="icon" className="relative t..." aria-label="通知" ...>
<button
data-slot="dropdown-menu-trigger"
className={"inline-flex items-center justify-center gap-2 whitespace-nowrap round..."}
aria-label="通知"
type="button"
+ id="radix-_R_19ebn6lb_"
- id="radix-_R_55qbn6lb_"
aria-haspopup="menu"
aria-expanded={false}
aria-controls={undefined}
data-state="closed"
data-disabled={undefined}
disabled={false}
onPointerDown={function handleEvent}
onKeyDown={function handleEvent}
ref={function}
>
...
<MenuAnchor asChild={true} __scopeMenu={{Menu:[...], ...}}>
<PopperAnchor __scopePopper={{Menu:[...], ...}} asChild={true} ref={null}>
<Primitive.div asChild={true} ref={function}>
<Primitive.div.Slot ref={function}>
<Primitive.div.SlotClone ref={function}>
<Primitive.button type="button" id="radix-_R_1..." aria-haspopup="menu" aria-expanded={false} ...>
<Primitive.button.Slot type="button" id="radix-_R_1..." aria-haspopup="menu" ...>
<Primitive.button.SlotClone type="button" id="radix-_R_1..." aria-haspopup="menu" ...>
<Button variant="ghost" className="relative s..." type="button" id="radix-_R_1..." ...>
<button
data-slot="dropdown-menu-trigger"
className={"inline-flex items-center justify-center gap-2 whitespace-nowrap text-..."}
type="button"
+ id="radix-_R_1pebn6lb_"
- id="radix-_R_75qbn6lb_"
aria-haspopup="menu"
aria-expanded={false}
aria-controls={undefined}
data-state="closed"
data-disabled={undefined}
disabled={false}
onPointerDown={function handleEvent}
onKeyDown={function handleEvent}
ref={function}
>
<main>
<AiAssistantWidget>
<Sheet open={false} onOpenChange={function bound dispatchSetState}>
<Dialog data-slot="sheet" open={false} onOpenChange={function bound dispatchSetState}>
<DialogProvider scope={undefined} triggerRef={{current:null}} contentRef={{current:null}} ...>
<SheetTrigger asChild={true}>
<DialogTrigger data-slot="sheet-trigger" asChild={true}>
<Primitive.button type="button" aria-haspopup="dialog" aria-expanded={false} ...>
<Primitive.button.Slot type="button" aria-haspopup="dialog" aria-expanded={false} ...>
<Primitive.button.SlotClone type="button" aria-haspopup="dialog" aria-expanded={false} ...>
<Button type="button" size="icon" className="fixed bott..." aria-label="打开 AI 助手" ...>
<button
data-slot="sheet-trigger"
className={"inline-flex items-center justify-center gap-2 whitespace-nowrap text-sm f..."}
type="button"
aria-label="打开 AI 助手"
aria-haspopup="dialog"
aria-expanded={false}
+ aria-controls="radix-_R_2ebn6lb_"
- aria-controls="radix-_R_9qbn6lb_"
data-state="closed"
onClick={function handleEvent}
ref={function}
>
...
|
### Textbooks
| 页面 | HTTP状态 | 结果 | 备注 |
|------|----------|------|------|
| PASS `/teacher/textbooks` | 200 | passed | 错误: 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:
- A server/client branch `if (typeof window !== 'undefined')`.
- Variable input such as `Date.now()` or `Math.random()` which changes each time it's called.
- Date formatting in a user's locale which doesn't match the server.
- External changing data without sending a snapshot of it along with the HTML.
- Invalid HTML tag nesting.
It can also happen if the client has a browser extension installed which messes with the HTML before React loaded.
%s%s https://react.dev/link/hydration-mismatch
...
<SidebarProvider sidebar={<AppSidebar>}>
<div className="flex h-scr...">
<aside>
<div className="flex-1 fle...">
<a>
...
<div className="flex items...">
<GlobalSearch>
...
<MenuAnchor asChild={true} __scopeMenu={{Menu:[...], ...}}>
<PopperAnchor __scopePopper={{Menu:[...], ...}} asChild={true} ref={null}>
<Primitive.div asChild={true} ref={function}>
<Primitive.div.Slot ref={function}>
<Primitive.div.SlotClone ref={function}>
<Primitive.button type="button" id="radix-_R_1..." aria-haspopup="menu" aria-expanded={false} ...>
<Primitive.button.Slot type="button" id="radix-_R_1..." aria-haspopup="menu" ...>
<Primitive.button.SlotClone type="button" id="radix-_R_1..." aria-haspopup="menu" ...>
<Button variant="ghost" size="icon" className="relative t..." aria-label="通知" ...>
<button
data-slot="dropdown-menu-trigger"
className={"inline-flex items-center justify-center gap-2 whitespace-nowrap round..."}
aria-label="通知"
type="button"
+ id="radix-_R_19ebn6lb_"
- id="radix-_R_55qbn6lb_"
aria-haspopup="menu"
aria-expanded={false}
aria-controls={undefined}
data-state="closed"
data-disabled={undefined}
disabled={false}
onPointerDown={function handleEvent}
onKeyDown={function handleEvent}
ref={function}
>
...
<MenuAnchor asChild={true} __scopeMenu={{Menu:[...], ...}}>
<PopperAnchor __scopePopper={{Menu:[...], ...}} asChild={true} ref={null}>
<Primitive.div asChild={true} ref={function}>
<Primitive.div.Slot ref={function}>
<Primitive.div.SlotClone ref={function}>
<Primitive.button type="button" id="radix-_R_1..." aria-haspopup="menu" aria-expanded={false} ...>
<Primitive.button.Slot type="button" id="radix-_R_1..." aria-haspopup="menu" ...>
<Primitive.button.SlotClone type="button" id="radix-_R_1..." aria-haspopup="menu" ...>
<Button variant="ghost" className="relative s..." type="button" id="radix-_R_1..." ...>
<button
data-slot="dropdown-menu-trigger"
className={"inline-flex items-center justify-center gap-2 whitespace-nowrap text-..."}
type="button"
+ id="radix-_R_1pebn6lb_"
- id="radix-_R_75qbn6lb_"
aria-haspopup="menu"
aria-expanded={false}
aria-controls={undefined}
data-state="closed"
data-disabled={undefined}
disabled={false}
onPointerDown={function handleEvent}
onKeyDown={function handleEvent}
ref={function}
>
<main>
<AiAssistantWidget>
<Sheet open={false} onOpenChange={function bound dispatchSetState}>
<Dialog data-slot="sheet" open={false} onOpenChange={function bound dispatchSetState}>
<DialogProvider scope={undefined} triggerRef={{current:null}} contentRef={{current:null}} ...>
<SheetTrigger asChild={true}>
<DialogTrigger data-slot="sheet-trigger" asChild={true}>
<Primitive.button type="button" aria-haspopup="dialog" aria-expanded={false} ...>
<Primitive.button.Slot type="button" aria-haspopup="dialog" aria-expanded={false} ...>
<Primitive.button.SlotClone type="button" aria-haspopup="dialog" aria-expanded={false} ...>
<Button type="button" size="icon" className="fixed bott..." aria-label="打开 AI 助手" ...>
<button
data-slot="sheet-trigger"
className={"inline-flex items-center justify-center gap-2 whitespace-nowrap text-sm f..."}
type="button"
aria-label="打开 AI 助手"
aria-haspopup="dialog"
aria-expanded={false}
+ aria-controls="radix-_R_2ebn6lb_"
- aria-controls="radix-_R_9qbn6lb_"
data-state="closed"
onClick={function handleEvent}
ref={function}
>
...
; 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:
- A server/client branch `if (typeof window !== 'undefined')`.
- Variable input such as `Date.now()` or `Math.random()` which changes each time it's called.
- Date formatting in a user's locale which doesn't match the server.
- External changing data without sending a snapshot of it along with the HTML.
- Invalid HTML tag nesting.
It can also happen if the client has a browser extension installed which messes with the HTML before React loaded.
%s%s https://react.dev/link/hydration-mismatch
...
<InnerLayoutRouter url="/teacher/t..." tree={[...]} params={{}} cacheNode={{lazyData:null, ...}} segmentPath={[...]} ...>
<SegmentViewNode type="page" pagePath="(dashboard...">
<SegmentTrieNode>
<TextbooksPage>
<div className="space-y-6 p-8">
<div className="flex flex-...">
<div>
<TextbookFormDialog>
<Dialog open={false} onOpenChange={function bound dispatchSetState}>
<DialogProvider scope={undefined} triggerRef={{current:null}} contentRef={{current:null}} ...>
<DialogTrigger asChild={true}>
<Primitive.button type="button" aria-haspopup="dialog" aria-expanded={false} ...>
<Primitive.button.Slot type="button" aria-haspopup="dialog" aria-expanded={false} ...>
<Primitive.button.SlotClone type="button" aria-haspopup="dialog" aria-expanded={false} ...>
<Button type="button" aria-haspopup="dialog" aria-expanded={false} ...>
<button
data-slot="button"
className={"inline-flex items-center justify-center gap-2 whitespace-nowrap rounded-m..."}
type="button"
aria-haspopup="dialog"
aria-expanded={false}
+ aria-controls="radix-_R_16atpesndubn6lb_"
- aria-controls="radix-_R_4pbn5ritnqbn6lb_"
data-state="closed"
onClick={function handleEvent}
ref={function}
>
...
...
...
|
### Questions
| 页面 | HTTP状态 | 结果 | 备注 |
|------|----------|------|------|
| PASS `/teacher/questions` | 200 | passed | - |
### Exams
| 页面 | HTTP状态 | 结果 | 备注 |
|------|----------|------|------|
| PASS `/teacher/exams` | 200 | passed | 重定向: http://localhost:3000/teacher/exams/all<br>错误: IntlError: INVALID_MESSAGE: MALFORMED_ARGUMENT (难度等级 {{level}}{{label}})
at getFallbackFromErrorAndNotify (http://localhost:3000/_next/static/chunks/node_modules_51f95abb._.js:3651:23)
at translateBaseFn (http://localhost:3000/_next/static/chunks/node_modules_51f95abb._.js:3705:20)
at translateFn (http://localhost:3000/_next/static/chunks/node_modules_51f95abb._.js:3709:24)
at ExamDataTable.useMemo[columns] (http://localhost:3000/_next/static/chunks/src_72b8a5e4._.js:2144:66)
at cell (http://localhost:3000/_next/static/chunks/src_72b8a5e4._.js:2003:43)
at Object.react_stack_bottom_frame (http://localhost:3000/_next/static/chunks/node_modules_next_dist_compiled_react-dom_1e674e59._.js:14816:24)
at renderWithHooks (http://localhost:3000/_next/static/chunks/node_modules_next_dist_compiled_react-dom_1e674e59._.js:4645:24)
at updateFunctionComponent (http://localhost:3000/_next/static/chunks/node_modules_next_dist_compiled_react-dom_1e674e59._.js:6106:21)
at beginWork (http://localhost:3000/_next/static/chunks/node_modules_next_dist_compiled_react-dom_1e674e59._.js:6702:24)
at runWithFiberInDEV (http://localhost:3000/_next/static/chunks/node_modules_next_dist_compiled_react-dom_1e674e59._.js:959:74)
at performUnitOfWork (http://localhost:3000/_next/static/chunks/node_modules_next_dist_compiled_react-dom_1e674e59._.js:9556:97)
at workLoopConcurrentByScheduler (http://localhost:3000/_next/static/chunks/node_modules_next_dist_compiled_react-dom_1e674e59._.js:9552:58)
at renderRootConcurrent (http://localhost:3000/_next/static/chunks/node_modules_next_dist_compiled_react-dom_1e674e59._.js:9535:71)
at performWorkOnRoot (http://localhost:3000/_next/static/chunks/node_modules_next_dist_compiled_react-dom_1e674e59._.js:9062:150)
at performWorkOnRootViaSchedulerTask (http://localhost:3000/_next/static/chunks/node_modules_next_dist_compiled_react-dom_1e674e59._.js:10224:9)
at MessagePort.performWorkUntilDeadline (http://localhost:3000/_next/static/chunks/node_modules_next_dist_compiled_a0e4c7b4._.js:2647:64); IntlError: INVALID_MESSAGE: MALFORMED_ARGUMENT (难度等级 {{level}}{{label}})
at getFallbackFromErrorAndNotify (http://localhost:3000/_next/static/chunks/node_modules_51f95abb._.js:3651:23)
at translateBaseFn (http://localhost:3000/_next/static/chunks/node_modules_51f95abb._.js:3705:20)
at translateFn (http://localhost:3000/_next/static/chunks/node_modules_51f95abb._.js:3709:24)
at ExamDataTable.useMemo[columns] (http://localhost:3000/_next/static/chunks/src_72b8a5e4._.js:2144:66)
at cell (http://localhost:3000/_next/static/chunks/src_72b8a5e4._.js:2003:43)
at Object.react_stack_bottom_frame (http://localhost:3000/_next/static/chunks/node_modules_next_dist_compiled_react-dom_1e674e59._.js:14816:24)
at renderWithHooksAgain (http://localhost:3000/_next/static/chunks/node_modules_next_dist_compiled_react-dom_1e674e59._.js:4700:24)
at renderWithHooks (http://localhost:3000/_next/static/chunks/node_modules_next_dist_compiled_react-dom_1e674e59._.js:4651:28)
at updateFunctionComponent (http://localhost:3000/_next/static/chunks/node_modules_next_dist_compiled_react-dom_1e674e59._.js:6106:21)
at beginWork (http://localhost:3000/_next/static/chunks/node_modules_next_dist_compiled_react-dom_1e674e59._.js:6702:24)
at runWithFiberInDEV (http://localhost:3000/_next/static/chunks/node_modules_next_dist_compiled_react-dom_1e674e59._.js:959:74)
at performUnitOfWork (http://localhost:3000/_next/static/chunks/node_modules_next_dist_compiled_react-dom_1e674e59._.js:9556:97)
at workLoopConcurrentByScheduler (http://localhost:3000/_next/static/chunks/node_modules_next_dist_compiled_react-dom_1e674e59._.js:9552:58)
at renderRootConcurrent (http://localhost:3000/_next/static/chunks/node_modules_next_dist_compiled_react-dom_1e674e59._.js:9535:71)
at performWorkOnRoot (http://localhost:3000/_next/static/chunks/node_modules_next_dist_compiled_react-dom_1e674e59._.js:9062:150)
at performWorkOnRootViaSchedulerTask (http://localhost:3000/_next/static/chunks/node_modules_next_dist_compiled_react-dom_1e674e59._.js:10224:9)
at MessagePort.performWorkUntilDeadline (http://localhost:3000/_next/static/chunks/node_modules_next_dist_compiled_a0e4c7b4._.js:2647:64) |
| PASS `/teacher/exams/all` | 200 | passed | 错误: 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:
- A server/client branch `if (typeof window !== 'undefined')`.
- Variable input such as `Date.now()` or `Math.random()` which changes each time it's called.
- Date formatting in a user's locale which doesn't match the server.
- External changing data without sending a snapshot of it along with the HTML.
- Invalid HTML tag nesting.
It can also happen if the client has a browser extension installed which messes with the HTML before React loaded.
%s%s https://react.dev/link/hydration-mismatch
...
<SidebarProvider sidebar={<AppSidebar>}>
<div className="flex h-scr...">
<aside>
<div className="flex-1 fle...">
<a>
...
<div className="flex items...">
<GlobalSearch>
...
<MenuAnchor asChild={true} __scopeMenu={{Menu:[...], ...}}>
<PopperAnchor __scopePopper={{Menu:[...], ...}} asChild={true} ref={null}>
<Primitive.div asChild={true} ref={function}>
<Primitive.div.Slot ref={function}>
<Primitive.div.SlotClone ref={function}>
<Primitive.button type="button" id="radix-_R_1..." aria-haspopup="menu" aria-expanded={false} ...>
<Primitive.button.Slot type="button" id="radix-_R_1..." aria-haspopup="menu" ...>
<Primitive.button.SlotClone type="button" id="radix-_R_1..." aria-haspopup="menu" ...>
<Button variant="ghost" size="icon" className="relative t..." aria-label="通知" ...>
<button
data-slot="dropdown-menu-trigger"
className={"inline-flex items-center justify-center gap-2 whitespace-nowrap round..."}
aria-label="通知"
type="button"
+ id="radix-_R_19ebn6lb_"
- id="radix-_R_55qbn6lb_"
aria-haspopup="menu"
aria-expanded={false}
aria-controls={undefined}
data-state="closed"
data-disabled={undefined}
disabled={false}
onPointerDown={function handleEvent}
onKeyDown={function handleEvent}
ref={function}
>
...
<MenuAnchor asChild={true} __scopeMenu={{Menu:[...], ...}}>
<PopperAnchor __scopePopper={{Menu:[...], ...}} asChild={true} ref={null}>
<Primitive.div asChild={true} ref={function}>
<Primitive.div.Slot ref={function}>
<Primitive.div.SlotClone ref={function}>
<Primitive.button type="button" id="radix-_R_1..." aria-haspopup="menu" aria-expanded={false} ...>
<Primitive.button.Slot type="button" id="radix-_R_1..." aria-haspopup="menu" ...>
<Primitive.button.SlotClone type="button" id="radix-_R_1..." aria-haspopup="menu" ...>
<Button variant="ghost" className="relative s..." type="button" id="radix-_R_1..." ...>
<button
data-slot="dropdown-menu-trigger"
className={"inline-flex items-center justify-center gap-2 whitespace-nowrap text-..."}
type="button"
+ id="radix-_R_1pebn6lb_"
- id="radix-_R_75qbn6lb_"
aria-haspopup="menu"
aria-expanded={false}
aria-controls={undefined}
data-state="closed"
data-disabled={undefined}
disabled={false}
onPointerDown={function handleEvent}
onKeyDown={function handleEvent}
ref={function}
>
<main>
<AiAssistantWidget>
<Sheet open={false} onOpenChange={function bound dispatchSetState}>
<Dialog data-slot="sheet" open={false} onOpenChange={function bound dispatchSetState}>
<DialogProvider scope={undefined} triggerRef={{current:null}} contentRef={{current:null}} ...>
<SheetTrigger asChild={true}>
<DialogTrigger data-slot="sheet-trigger" asChild={true}>
<Primitive.button type="button" aria-haspopup="dialog" aria-expanded={false} ...>
<Primitive.button.Slot type="button" aria-haspopup="dialog" aria-expanded={false} ...>
<Primitive.button.SlotClone type="button" aria-haspopup="dialog" aria-expanded={false} ...>
<Button type="button" size="icon" className="fixed bott..." aria-label="打开 AI 助手" ...>
<button
data-slot="sheet-trigger"
className={"inline-flex items-center justify-center gap-2 whitespace-nowrap text-sm f..."}
type="button"
aria-label="打开 AI 助手"
aria-haspopup="dialog"
aria-expanded={false}
+ aria-controls="radix-_R_2ebn6lb_"
- aria-controls="radix-_R_9qbn6lb_"
data-state="closed"
onClick={function handleEvent}
ref={function}
>
...
; IntlError: INVALID_MESSAGE: MALFORMED_ARGUMENT (难度等级 {{level}}{{label}})
at getFallbackFromErrorAndNotify (http://localhost:3000/_next/static/chunks/node_modules_51f95abb._.js:3651:23)
at translateBaseFn (http://localhost:3000/_next/static/chunks/node_modules_51f95abb._.js:3705:20)
at translateFn (http://localhost:3000/_next/static/chunks/node_modules_51f95abb._.js:3709:24)
at ExamDataTable.useMemo[columns] (http://localhost:3000/_next/static/chunks/src_72b8a5e4._.js:2144:66)
at cell (http://localhost:3000/_next/static/chunks/src_72b8a5e4._.js:2003:43)
at Object.react_stack_bottom_frame (http://localhost:3000/_next/static/chunks/node_modules_next_dist_compiled_react-dom_1e674e59._.js:14816:24)
at renderWithHooks (http://localhost:3000/_next/static/chunks/node_modules_next_dist_compiled_react-dom_1e674e59._.js:4645:24)
at updateFunctionComponent (http://localhost:3000/_next/static/chunks/node_modules_next_dist_compiled_react-dom_1e674e59._.js:6106:21)
at beginWork (http://localhost:3000/_next/static/chunks/node_modules_next_dist_compiled_react-dom_1e674e59._.js:6702:24)
at runWithFiberInDEV (http://localhost:3000/_next/static/chunks/node_modules_next_dist_compiled_react-dom_1e674e59._.js:959:74)
at performUnitOfWork (http://localhost:3000/_next/static/chunks/node_modules_next_dist_compiled_react-dom_1e674e59._.js:9556:97)
at workLoopConcurrentByScheduler (http://localhost:3000/_next/static/chunks/node_modules_next_dist_compiled_react-dom_1e674e59._.js:9552:58)
at renderRootConcurrent (http://localhost:3000/_next/static/chunks/node_modules_next_dist_compiled_react-dom_1e674e59._.js:9535:71)
at performWorkOnRoot (http://localhost:3000/_next/static/chunks/node_modules_next_dist_compiled_react-dom_1e674e59._.js:9062:150)
at performWorkOnRootViaSchedulerTask (http://localhost:3000/_next/static/chunks/node_modules_next_dist_compiled_react-dom_1e674e59._.js:10224:9)
at MessagePort.performWorkUntilDeadline (http://localhost:3000/_next/static/chunks/node_modules_next_dist_compiled_a0e4c7b4._.js:2647:64) |
| PASS `/teacher/exams/create` | 200 | passed | - |
### Homework
| 页面 | HTTP状态 | 结果 | 备注 |
|------|----------|------|------|
| PASS `/teacher/homework` | 200 | passed | 重定向: http://localhost:3000/teacher/homework/assignments<br>错误: 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:
- A server/client branch `if (typeof window !== 'undefined')`.
- Variable input such as `Date.now()` or `Math.random()` which changes each time it's called.
- Date formatting in a user's locale which doesn't match the server.
- External changing data without sending a snapshot of it along with the HTML.
- Invalid HTML tag nesting.
It can also happen if the client has a browser extension installed which messes with the HTML before React loaded.
%s%s https://react.dev/link/hydration-mismatch
...
<SidebarProvider sidebar={<AppSidebar>}>
<div className="flex h-scr...">
<aside>
<div className="flex-1 fle...">
<a>
...
<div className="flex items...">
<GlobalSearch>
...
<MenuAnchor asChild={true} __scopeMenu={{Menu:[...], ...}}>
<PopperAnchor __scopePopper={{Menu:[...], ...}} asChild={true} ref={null}>
<Primitive.div asChild={true} ref={function}>
<Primitive.div.Slot ref={function}>
<Primitive.div.SlotClone ref={function}>
<Primitive.button type="button" id="radix-_R_1..." aria-haspopup="menu" aria-expanded={false} ...>
<Primitive.button.Slot type="button" id="radix-_R_1..." aria-haspopup="menu" ...>
<Primitive.button.SlotClone type="button" id="radix-_R_1..." aria-haspopup="menu" ...>
<Button variant="ghost" size="icon" className="relative t..." aria-label="通知" ...>
<button
data-slot="dropdown-menu-trigger"
className={"inline-flex items-center justify-center gap-2 whitespace-nowrap round..."}
aria-label="通知"
type="button"
+ id="radix-_R_19ebn6lb_"
- id="radix-_R_55qbn6lb_"
aria-haspopup="menu"
aria-expanded={false}
aria-controls={undefined}
data-state="closed"
data-disabled={undefined}
disabled={false}
onPointerDown={function handleEvent}
onKeyDown={function handleEvent}
ref={function}
>
...
<MenuAnchor asChild={true} __scopeMenu={{Menu:[...], ...}}>
<PopperAnchor __scopePopper={{Menu:[...], ...}} asChild={true} ref={null}>
<Primitive.div asChild={true} ref={function}>
<Primitive.div.Slot ref={function}>
<Primitive.div.SlotClone ref={function}>
<Primitive.button type="button" id="radix-_R_1..." aria-haspopup="menu" aria-expanded={false} ...>
<Primitive.button.Slot type="button" id="radix-_R_1..." aria-haspopup="menu" ...>
<Primitive.button.SlotClone type="button" id="radix-_R_1..." aria-haspopup="menu" ...>
<Button variant="ghost" className="relative s..." type="button" id="radix-_R_1..." ...>
<button
data-slot="dropdown-menu-trigger"
className={"inline-flex items-center justify-center gap-2 whitespace-nowrap text-..."}
type="button"
+ id="radix-_R_1pebn6lb_"
- id="radix-_R_75qbn6lb_"
aria-haspopup="menu"
aria-expanded={false}
aria-controls={undefined}
data-state="closed"
data-disabled={undefined}
disabled={false}
onPointerDown={function handleEvent}
onKeyDown={function handleEvent}
ref={function}
>
<main>
<AiAssistantWidget>
<Sheet open={false} onOpenChange={function bound dispatchSetState}>
<Dialog data-slot="sheet" open={false} onOpenChange={function bound dispatchSetState}>
<DialogProvider scope={undefined} triggerRef={{current:null}} contentRef={{current:null}} ...>
<SheetTrigger asChild={true}>
<DialogTrigger data-slot="sheet-trigger" asChild={true}>
<Primitive.button type="button" aria-haspopup="dialog" aria-expanded={false} ...>
<Primitive.button.Slot type="button" aria-haspopup="dialog" aria-expanded={false} ...>
<Primitive.button.SlotClone type="button" aria-haspopup="dialog" aria-expanded={false} ...>
<Button type="button" size="icon" className="fixed bott..." aria-label="打开 AI 助手" ...>
<button
data-slot="sheet-trigger"
className={"inline-flex items-center justify-center gap-2 whitespace-nowrap text-sm f..."}
type="button"
aria-label="打开 AI 助手"
aria-haspopup="dialog"
aria-expanded={false}
+ aria-controls="radix-_R_2ebn6lb_"
- aria-controls="radix-_R_9qbn6lb_"
data-state="closed"
onClick={function handleEvent}
ref={function}
>
...
|
| PASS `/teacher/homework/assignments` | 200 | passed | - |
| PASS `/teacher/homework/assignments/create` | 200 | passed | - |
| PASS `/teacher/homework/submissions` | 200 | passed | - |
### Grades
| 页面 | HTTP状态 | 结果 | 备注 |
|------|----------|------|------|
| PASS `/teacher/grades` | 200 | passed | - |
| PASS `/teacher/grades/entry` | 200 | passed | - |
| PASS `/teacher/grades/stats` | 200 | passed | 错误: %c%s%c background: #e6e6e6;background: light-dark(rgba(0,0,0,0.1), rgba(255,255,255,0.25));color: #000000;color: light-dark(#000000, #ffffff);border-radius: 2px Server Error: MISSING_MESSAGE: Could not resolve `grades.classReport.caption` in messages for locale `zh-CN`.
at ClassGradeReport (about://React/Server/E:%5CDesktop%5CCICD%5C.next%5Cdev%5Cserver%5Cchunks%5Cssr%5C%5Broot-of-the-server%5D__d43d5e3d._.js?102:604:51)
at resolveErrorDev (http://localhost:3000/_next/static/chunks/node_modules_next_dist_compiled_react-server-dom-turbopack_9212ccad._.js:1882:106)
at getOutlinedModel (http://localhost:3000/_next/static/chunks/node_modules_next_dist_compiled_react-server-dom-turbopack_9212ccad._.js:1434:28)
at parseModelString (http://localhost:3000/_next/static/chunks/node_modules_next_dist_compiled_react-server-dom-turbopack_9212ccad._.js:1548:50)
at Object.<anonymous> (http://localhost:3000/_next/static/chunks/node_modules_next_dist_compiled_react-server-dom-turbopack_9212ccad._.js:2475:51)
at JSON.parse (<anonymous>)
at initializeModelChunk (http://localhost:3000/_next/static/chunks/node_modules_next_dist_compiled_react-server-dom-turbopack_9212ccad._.js:1053:30)
at getOutlinedModel (http://localhost:3000/_next/static/chunks/node_modules_next_dist_compiled_react-server-dom-turbopack_9212ccad._.js:1372:17)
at parseModelString (http://localhost:3000/_next/static/chunks/node_modules_next_dist_compiled_react-server-dom-turbopack_9212ccad._.js:1602:50)
at Array.<anonymous> (http://localhost:3000/_next/static/chunks/node_modules_next_dist_compiled_react-server-dom-turbopack_9212ccad._.js:2475:51)
at JSON.parse (<anonymous>)
at initializeModelChunk (http://localhost:3000/_next/static/chunks/node_modules_next_dist_compiled_react-server-dom-turbopack_9212ccad._.js:1053:30)
at resolveConsoleEntry (http://localhost:3000/_next/static/chunks/node_modules_next_dist_compiled_react-server-dom-turbopack_9212ccad._.js:2008:96)
at processFullStringRow (http://localhost:3000/_next/static/chunks/node_modules_next_dist_compiled_react-server-dom-turbopack_9212ccad._.js:2409:17)
at processFullBinaryRow (http://localhost:3000/_next/static/chunks/node_modules_next_dist_compiled_react-server-dom-turbopack_9212ccad._.js:2349:9)
at processBinaryChunk (http://localhost:3000/_next/static/chunks/node_modules_next_dist_compiled_react-server-dom-turbopack_9212ccad._.js:2459:98)
at progress (http://localhost:3000/_next/static/chunks/node_modules_next_dist_compiled_react-server-dom-turbopack_9212ccad._.js:2628:13); %c%s%c E:\Desktop\CICD\.next\dev\server\chunks\ssr\node_modules_d30fabce._.js: Invalid source map. Only conformant source maps can be used to find the original code. Cause: Error: sourceMapURL could not be parsed background: #e6e6e6;background: light-dark(rgba(0,0,0,0.1), rgba(255,255,255,0.25));color: #000000;color: light-dark(#000000, #ffffff);border-radius: 2px Server |
| PASS `/teacher/grades/analytics` | 200 | passed | - |
### Classes
| 页面 | HTTP状态 | 结果 | 备注 |
|------|----------|------|------|
| PASS `/teacher/classes` | 200 | passed | 重定向: http://localhost:3000/teacher/classes/my |
| PASS `/teacher/classes/my` | 200 | passed | - |
| PASS `/teacher/classes/students` | 200 | passed | 警告: Error text: 20; Error text: 42 |
| PASS `/teacher/classes/schedule` | 200 | passed | - |
### Course Plans
| 页面 | HTTP状态 | 结果 | 备注 |
|------|----------|------|------|
| PASS `/teacher/course-plans` | 200 | passed | - |
### Lesson Plans
| 页面 | HTTP状态 | 结果 | 备注 |
|------|----------|------|------|
| PASS `/teacher/lesson-plans` | 200 | passed | 错误: 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:
- A server/client branch `if (typeof window !== 'undefined')`.
- Variable input such as `Date.now()` or `Math.random()` which changes each time it's called.
- Date formatting in a user's locale which doesn't match the server.
- External changing data without sending a snapshot of it along with the HTML.
- Invalid HTML tag nesting.
It can also happen if the client has a browser extension installed which messes with the HTML before React loaded.
%s%s https://react.dev/link/hydration-mismatch
...
<SidebarProvider sidebar={<AppSidebar>}>
<div className="flex h-scr...">
<aside>
<div className="flex-1 fle...">
<a>
...
<div className="flex items...">
<GlobalSearch>
...
<MenuAnchor asChild={true} __scopeMenu={{Menu:[...], ...}}>
<PopperAnchor __scopePopper={{Menu:[...], ...}} asChild={true} ref={null}>
<Primitive.div asChild={true} ref={function}>
<Primitive.div.Slot ref={function}>
<Primitive.div.SlotClone ref={function}>
<Primitive.button type="button" id="radix-_R_1..." aria-haspopup="menu" aria-expanded={false} ...>
<Primitive.button.Slot type="button" id="radix-_R_1..." aria-haspopup="menu" ...>
<Primitive.button.SlotClone type="button" id="radix-_R_1..." aria-haspopup="menu" ...>
<Button variant="ghost" size="icon" className="relative t..." aria-label="通知" ...>
<button
data-slot="dropdown-menu-trigger"
className={"inline-flex items-center justify-center gap-2 whitespace-nowrap round..."}
aria-label="通知"
type="button"
+ id="radix-_R_19ebn6lb_"
- id="radix-_R_55qbn6lb_"
aria-haspopup="menu"
aria-expanded={false}
aria-controls={undefined}
data-state="closed"
data-disabled={undefined}
disabled={false}
onPointerDown={function handleEvent}
onKeyDown={function handleEvent}
ref={function}
>
...
<MenuAnchor asChild={true} __scopeMenu={{Menu:[...], ...}}>
<PopperAnchor __scopePopper={{Menu:[...], ...}} asChild={true} ref={null}>
<Primitive.div asChild={true} ref={function}>
<Primitive.div.Slot ref={function}>
<Primitive.div.SlotClone ref={function}>
<Primitive.button type="button" id="radix-_R_1..." aria-haspopup="menu" aria-expanded={false} ...>
<Primitive.button.Slot type="button" id="radix-_R_1..." aria-haspopup="menu" ...>
<Primitive.button.SlotClone type="button" id="radix-_R_1..." aria-haspopup="menu" ...>
<Button variant="ghost" className="relative s..." type="button" id="radix-_R_1..." ...>
<button
data-slot="dropdown-menu-trigger"
className={"inline-flex items-center justify-center gap-2 whitespace-nowrap text-..."}
type="button"
+ id="radix-_R_1pebn6lb_"
- id="radix-_R_75qbn6lb_"
aria-haspopup="menu"
aria-expanded={false}
aria-controls={undefined}
data-state="closed"
data-disabled={undefined}
disabled={false}
onPointerDown={function handleEvent}
onKeyDown={function handleEvent}
ref={function}
>
<main>
<AiAssistantWidget>
<Sheet open={false} onOpenChange={function bound dispatchSetState}>
<Dialog data-slot="sheet" open={false} onOpenChange={function bound dispatchSetState}>
<DialogProvider scope={undefined} triggerRef={{current:null}} contentRef={{current:null}} ...>
<SheetTrigger asChild={true}>
<DialogTrigger data-slot="sheet-trigger" asChild={true}>
<Primitive.button type="button" aria-haspopup="dialog" aria-expanded={false} ...>
<Primitive.button.Slot type="button" aria-haspopup="dialog" aria-expanded={false} ...>
<Primitive.button.SlotClone type="button" aria-haspopup="dialog" aria-expanded={false} ...>
<Button type="button" size="icon" className="fixed bott..." aria-label="打开 AI 助手" ...>
<button
data-slot="sheet-trigger"
className={"inline-flex items-center justify-center gap-2 whitespace-nowrap text-sm f..."}
type="button"
aria-label="打开 AI 助手"
aria-haspopup="dialog"
aria-expanded={false}
+ aria-controls="radix-_R_2ebn6lb_"
- aria-controls="radix-_R_9qbn6lb_"
data-state="closed"
onClick={function handleEvent}
ref={function}
>
...
; 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:
- A server/client branch `if (typeof window !== 'undefined')`.
- Variable input such as `Date.now()` or `Math.random()` which changes each time it's called.
- Date formatting in a user's locale which doesn't match the server.
- External changing data without sending a snapshot of it along with the HTML.
- Invalid HTML tag nesting.
It can also happen if the client has a browser extension installed which messes with the HTML before React loaded.
%s%s https://react.dev/link/hydration-mismatch
...
<div className="space-y-4">
<LessonPlanFilters>
<div className="grid grid-...">
<LessonPlanCard plan={{id:"o20j6e...", ...}} viewMode="teacher">
<div className="border bor...">
<LinkComponent>
<div>
<div>
<div>
<div className="flex gap-2...">
<Button>
<AlertDialog>
<Dialog __scopeDialog={{Dialog:[...]}} modal={true}>
<DialogProvider scope={{Dialog:[...]}} triggerRef={{current:null}} contentRef={{current:null}} ...>
<AlertDialogTrigger asChild={true}>
<DialogTrigger __scopeDialog={{Dialog:[...]}} asChild={true} ref={null}>
<Primitive.button type="button" aria-haspopup="dialog" aria-expanded={false} ...>
<Primitive.button.Slot type="button" aria-haspopup="dialog" aria-expanded={false} ...>
<Primitive.button.SlotClone type="button" aria-haspopup="dialog" aria-expanded={false} ...>
<Button variant="outline" size="sm" type="button" aria-haspopup="dialog" ...>
<button
data-slot="button"
className={"inline-flex items-center justify-center gap-2 whitespace-nowrap text-sm..."}
type="button"
aria-haspopup="dialog"
aria-expanded={false}
+ aria-controls="radix-_R_1a3qatpesndubn6lb_"
- aria-controls="radix-_R_58f9bn5ritnqbn6lb_"
data-state="closed"
onClick={function handleEvent}
ref={function}
>
+ 归档
...
<LessonPlanCard plan={{id:"p54vt8...", ...}} viewMode="teacher">
<div className="border bor...">
<LinkComponent>
<div>
<div>
<div>
<div className="flex gap-2...">
<Button>
<AlertDialog>
<Dialog __scopeDialog={{Dialog:[...]}} modal={true}>
<DialogProvider scope={{Dialog:[...]}} triggerRef={{current:null}} contentRef={{current:null}} ...>
<AlertDialogTrigger asChild={true}>
<DialogTrigger __scopeDialog={{Dialog:[...]}} asChild={true} ref={null}>
<Primitive.button type="button" aria-haspopup="dialog" aria-expanded={false} ...>
<Primitive.button.Slot type="button" aria-haspopup="dialog" aria-expanded={false} ...>
<Primitive.button.SlotClone type="button" aria-haspopup="dialog" aria-expanded={false} ...>
<Button variant="outline" size="sm" type="button" aria-haspopup="dialog" ...>
<button
data-slot="button"
className={"inline-flex items-center justify-center gap-2 whitespace-nowrap text-sm..."}
type="button"
aria-haspopup="dialog"
aria-expanded={false}
+ aria-controls="radix-_R_1a5qatpesndubn6lb_"
- aria-controls="radix-_R_58n9bn5ritnqbn6lb_"
data-state="closed"
onClick={function handleEvent}
ref={function}
>
+ 归档
...
<LessonPlanCard plan={{id:"ps8rrh...", ...}} viewMode="teacher">
<div className="border bor...">
<LinkComponent>
<div>
<div>
<div>
<div className="flex gap-2...">
<Button>
<AlertDialog>
<Dialog __scopeDialog={{Dialog:[...]}} modal={true}>
<DialogProvider scope={{Dialog:[...]}} triggerRef={{current:null}} contentRef={{current:null}} ...>
<AlertDialogTrigger asChild={true}>
<DialogTrigger __scopeDialog={{Dialog:[...]}} asChild={true} ref={null}>
<Primitive.button type="button" aria-haspopup="dialog" aria-expanded={false} ...>
<Primitive.button.Slot type="button" aria-haspopup="dialog" aria-expanded={false} ...>
<Primitive.button.SlotClone type="button" aria-haspopup="dialog" aria-expanded={false} ...>
<Button variant="outline" size="sm" type="button" aria-haspopup="dialog" ...>
<button
data-slot="button"
className={"inline-flex items-center justify-center gap-2 whitespace-nowrap text-sm..."}
type="button"
aria-haspopup="dialog"
aria-expanded={false}
+ aria-controls="radix-_R_1a7qatpesndubn6lb_"
- aria-controls="radix-_R_58v9bn5ritnqbn6lb_"
data-state="closed"
onClick={function handleEvent}
ref={function}
>
+ 归档
...
<LessonPlanCard plan={{id:"zpeysv...", ...}} viewMode="teacher">
<div className="border bor...">
<LinkComponent>
<div>
<div>
<div>
<div className="flex gap-2...">
<Button>
<AlertDialog>
<Dialog __scopeDialog={{Dialog:[...]}} modal={true}>
<DialogProvider scope={{Dialog:[...]}} triggerRef={{current:null}} contentRef={{current:null}} ...>
<AlertDialogTrigger asChild={true}>
<DialogTrigger __scopeDialog={{Dialog:[...]}} asChild={true} ref={null}>
<Primitive.button type="button" aria-haspopup="dialog" aria-expanded={false} ...>
<Primitive.button.Slot type="button" aria-haspopup="dialog" aria-expanded={false} ...>
<Primitive.button.SlotClone type="button" aria-haspopup="dialog" aria-expanded={false} ...>
<Button variant="outline" size="sm" type="button" aria-haspopup="dialog" ...>
<button
data-slot="button"
className={"inline-flex items-center justify-center gap-2 whitespace-nowrap text-sm..."}
type="button"
aria-haspopup="dialog"
aria-expanded={false}
+ aria-controls="radix-_R_1a9qatpesndubn6lb_"
- aria-controls="radix-_R_5979bn5ritnqbn6lb_"
data-state="closed"
onClick={function handleEvent}
ref={function}
>
+ 归档
...
<LessonPlanCard plan={{id:"gpqmy3...", ...}} viewMode="teacher">
<div className="border bor...">
<LinkComponent>
<div>
<div>
<div>
<div className="flex gap-2...">
<Button>
<AlertDialog>
<Dialog __scopeDialog={{Dialog:[...]}} modal={true}>
<DialogProvider scope={{Dialog:[...]}} triggerRef={{current:null}} contentRef={{current:null}} ...>
<AlertDialogTrigger asChild={true}>
<DialogTrigger __scopeDialog={{Dialog:[...]}} asChild={true} ref={null}>
<Primitive.button type="button" aria-haspopup="dialog" aria-expanded={false} ...>
<Primitive.button.Slot type="button" aria-haspopup="dialog" aria-expanded={false} ...>
<Primitive.button.SlotClone type="button" aria-haspopup="dialog" aria-expanded={false} ...>
<Button variant="outline" size="sm" type="button" aria-haspopup="dialog" ...>
<button
data-slot="button"
className={"inline-flex items-center justify-center gap-2 whitespace-nowrap text-sm..."}
type="button"
aria-haspopup="dialog"
aria-expanded={false}
+ aria-controls="radix-_R_1abqatpesndubn6lb_"
- aria-controls="radix-_R_59f9bn5ritnqbn6lb_"
data-state="closed"
onClick={function handleEvent}
ref={function}
>
+ 归档
...
<LessonPlanCard plan={{id:"b89r2i...", ...}} viewMode="teacher">
<div className="border bor...">
<LinkComponent>
<div>
<div>
<div>
<div className="flex gap-2...">
<Button>
<AlertDialog>
<Dialog __scopeDialog={{Dialog:[...]}} modal={true}>
<DialogProvider scope={{Dialog:[...]}} triggerRef={{current:null}} contentRef={{current:null}} ...>
<AlertDialogTrigger asChild={true}>
<DialogTrigger __scopeDialog={{Dialog:[...]}} asChild={true} ref={null}>
<Primitive.button type="button" aria-haspopup="dialog" aria-expanded={false} ...>
<Primitive.button.Slot type="button" aria-haspopup="dialog" aria-expanded={false} ...>
<Primitive.button.SlotClone type="button" aria-haspopup="dialog" aria-expanded={false} ...>
<Button variant="outline" size="sm" type="button" aria-haspopup="dialog" ...>
<button
data-slot="button"
className={"inline-flex items-center justify-center gap-2 whitespace-nowrap text-sm..."}
type="button"
aria-haspopup="dialog"
aria-expanded={false}
+ aria-controls="radix-_R_1adqatpesndubn6lb_"
- aria-controls="radix-_R_59n9bn5ritnqbn6lb_"
data-state="closed"
onClick={function handleEvent}
ref={function}
>
+ 归档
...
<LessonPlanCard plan={{id:"rp33u1...", ...}} viewMode="teacher">
<div className="border bor...">
<LinkComponent>
<div>
<div>
<div>
<div className="flex gap-2...">
<Button>
<AlertDialog>
<Dialog __scopeDialog={{Dialog:[...]}} modal={true}>
<DialogProvider scope={{Dialog:[...]}} triggerRef={{current:null}} contentRef={{current:null}} ...>
<AlertDialogTrigger asChild={true}>
<DialogTrigger __scopeDialog={{Dialog:[...]}} asChild={true} ref={null}>
<Primitive.button type="button" aria-haspopup="dialog" aria-expanded={false} ...>
<Primitive.button.Slot type="button" aria-haspopup="dialog" aria-expanded={false} ...>
<Primitive.button.SlotClone type="button" aria-haspopup="dialog" aria-expanded={false} ...>
<Button variant="outline" size="sm" type="button" aria-haspopup="dialog" ...>
<button
data-slot="button"
className={"inline-flex items-center justify-center gap-2 whitespace-nowrap text-sm..."}
type="button"
aria-haspopup="dialog"
aria-expanded={false}
+ aria-controls="radix-_R_1afqatpesndubn6lb_"
- aria-controls="radix-_R_59v9bn5ritnqbn6lb_"
data-state="closed"
onClick={function handleEvent}
ref={function}
>
+ 归档
...
<LessonPlanCard plan={{id:"w4a90p...", ...}} viewMode="teacher">
<div className="border bor...">
<LinkComponent>
<div>
<div>
<div>
<div className="flex gap-2...">
<Button>
<AlertDialog>
<Dialog __scopeDialog={{Dialog:[...]}} modal={true}>
<DialogProvider scope={{Dialog:[...]}} triggerRef={{current:null}} contentRef={{current:null}} ...>
<AlertDialogTrigger asChild={true}>
<DialogTrigger __scopeDialog={{Dialog:[...]}} asChild={true} ref={null}>
<Primitive.button type="button" aria-haspopup="dialog" aria-expanded={false} ...>
<Primitive.button.Slot type="button" aria-haspopup="dialog" aria-expanded={false} ...>
<Primitive.button.SlotClone type="button" aria-haspopup="dialog" aria-expanded={false} ...>
<Button variant="outline" size="sm" type="button" aria-haspopup="dialog" ...>
<button
data-slot="button"
className={"inline-flex items-center justify-center gap-2 whitespace-nowrap text-sm..."}
type="button"
aria-haspopup="dialog"
aria-expanded={false}
+ aria-controls="radix-_R_1ahqatpesndubn6lb_"
- aria-controls="radix-_R_5a79bn5ritnqbn6lb_"
data-state="closed"
onClick={function handleEvent}
ref={function}
>
+ 归档
...
<LessonPlanCard plan={{id:"dt0qjt...", ...}} viewMode="teacher">
<div className="border bor...">
<LinkComponent>
<div>
<div>
<div>
<div className="flex gap-2...">
<Button>
<AlertDialog>
<Dialog __scopeDialog={{Dialog:[...]}} modal={true}>
<DialogProvider scope={{Dialog:[...]}} triggerRef={{current:null}} contentRef={{current:null}} ...>
<AlertDialogTrigger asChild={true}>
<DialogTrigger __scopeDialog={{Dialog:[...]}} asChild={true} ref={null}>
<Primitive.button type="button" aria-haspopup="dialog" aria-expanded={false} ...>
<Primitive.button.Slot type="button" aria-haspopup="dialog" aria-expanded={false} ...>
<Primitive.button.SlotClone type="button" aria-haspopup="dialog" aria-expanded={false} ...>
<Button variant="outline" size="sm" type="button" aria-haspopup="dialog" ...>
<button
data-slot="button"
className={"inline-flex items-center justify-center gap-2 whitespace-nowrap text-sm..."}
type="button"
aria-haspopup="dialog"
aria-expanded={false}
+ aria-controls="radix-_R_1ajqatpesndubn6lb_"
- aria-controls="radix-_R_5af9bn5ritnqbn6lb_"
data-state="closed"
onClick={function handleEvent}
ref={function}
>
+ 归档
...
<LessonPlanCard plan={{id:"wkama4...", ...}} viewMode="teacher">
<div className="border bor...">
<LinkComponent>
<div>
<div>
<div>
<div className="flex gap-2...">
<Button>
<AlertDialog>
<Dialog __scopeDialog={{Dialog:[...]}} modal={true}>
<DialogProvider scope={{Dialog:[...]}} triggerRef={{current:null}} contentRef={{current:null}} ...>
<AlertDialogTrigger asChild={true}>
<DialogTrigger __scopeDialog={{Dialog:[...]}} asChild={true} ref={null}>
<Primitive.button type="button" aria-haspopup="dialog" aria-expanded={false} ...>
<Primitive.button.Slot type="button" aria-haspopup="dialog" aria-expanded={false} ...>
<Primitive.button.SlotClone type="button" aria-haspopup="dialog" aria-expanded={false} ...>
<Button variant="outline" size="sm" type="button" aria-haspopup="dialog" ...>
<button
data-slot="button"
className={"inline-flex items-center justify-center gap-2 whitespace-nowrap text-sm..."}
type="button"
aria-haspopup="dialog"
aria-expanded={false}
+ aria-controls="radix-_R_1alqatpesndubn6lb_"
- aria-controls="radix-_R_5an9bn5ritnqbn6lb_"
data-state="closed"
onClick={function handleEvent}
ref={function}
>
+ 归档
...
<LessonPlanCard plan={{id:"hnkmjz...", ...}} viewMode="teacher">
<div className="border bor...">
<LinkComponent>
<div>
<div>
<div>
<div className="flex gap-2...">
<Button>
<AlertDialog>
<Dialog __scopeDialog={{Dialog:[...]}} modal={true}>
<DialogProvider scope={{Dialog:[...]}} triggerRef={{current:null}} contentRef={{current:null}} ...>
<AlertDialogTrigger asChild={true}>
<DialogTrigger __scopeDialog={{Dialog:[...]}} asChild={true} ref={null}>
<Primitive.button type="button" aria-haspopup="dialog" aria-expanded={false} ...>
<Primitive.button.Slot type="button" aria-haspopup="dialog" aria-expanded={false} ...>
<Primitive.button.SlotClone type="button" aria-haspopup="dialog" aria-expanded={false} ...>
<Button variant="outline" size="sm" type="button" aria-haspopup="dialog" ...>
<button
data-slot="button"
className={"inline-flex items-center justify-center gap-2 whitespace-nowrap text-sm..."}
type="button"
aria-haspopup="dialog"
aria-expanded={false}
+ aria-controls="radix-_R_1anqatpesndubn6lb_"
- aria-controls="radix-_R_5av9bn5ritnqbn6lb_"
data-state="closed"
onClick={function handleEvent}
ref={function}
>
+ 归档
...
<LessonPlanCard plan={{id:"k43bo4...", ...}} viewMode="teacher">
<div className="border bor...">
<LinkComponent>
<div>
<div>
<div>
<div className="flex gap-2...">
<Button>
<AlertDialog>
<Dialog __scopeDialog={{Dialog:[...]}} modal={true}>
<DialogProvider scope={{Dialog:[...]}} triggerRef={{current:null}} contentRef={{current:null}} ...>
<AlertDialogTrigger asChild={true}>
<DialogTrigger __scopeDialog={{Dialog:[...]}} asChild={true} ref={null}>
<Primitive.button type="button" aria-haspopup="dialog" aria-expanded={false} ...>
<Primitive.button.Slot type="button" aria-haspopup="dialog" aria-expanded={false} ...>
<Primitive.button.SlotClone type="button" aria-haspopup="dialog" aria-expanded={false} ...>
<Button variant="outline" size="sm" type="button" aria-haspopup="dialog" ...>
<button
data-slot="button"
className={"inline-flex items-center justify-center gap-2 whitespace-nowrap text-sm..."}
type="button"
aria-haspopup="dialog"
aria-expanded={false}
+ aria-controls="radix-_R_1apqatpesndubn6lb_"
- aria-controls="radix-_R_5b79bn5ritnqbn6lb_"
data-state="closed"
onClick={function handleEvent}
ref={function}
>
+ 归档
...
<LessonPlanCard plan={{id:"kiret3...", ...}} viewMode="teacher">
<div className="border bor...">
<LinkComponent>
<div>
<div>
<div>
<div className="flex gap-2...">
<Button>
<AlertDialog>
<Dialog __scopeDialog={{Dialog:[...]}} modal={true}>
<DialogProvider scope={{Dialog:[...]}} triggerRef={{current:null}} contentRef={{current:null}} ...>
<AlertDialogTrigger asChild={true}>
<DialogTrigger __scopeDialog={{Dialog:[...]}} asChild={true} ref={null}>
<Primitive.button type="button" aria-haspopup="dialog" aria-expanded={false} ...>
<Primitive.button.Slot type="button" aria-haspopup="dialog" aria-expanded={false} ...>
<Primitive.button.SlotClone type="button" aria-haspopup="dialog" aria-expanded={false} ...>
<Button variant="outline" size="sm" type="button" aria-haspopup="dialog" ...>
<button
data-slot="button"
className={"inline-flex items-center justify-center gap-2 whitespace-nowrap text-sm..."}
type="button"
aria-haspopup="dialog"
aria-expanded={false}
+ aria-controls="radix-_R_1arqatpesndubn6lb_"
- aria-controls="radix-_R_5bf9bn5ritnqbn6lb_"
data-state="closed"
onClick={function handleEvent}
ref={function}
>
+ 归档
...
<LessonPlanCard plan={{id:"q8bl25...", ...}} viewMode="teacher">
<div className="border bor...">
<LinkComponent>
<div>
<div>
<div>
<div className="flex gap-2...">
<Button>
<AlertDialog>
<Dialog __scopeDialog={{Dialog:[...]}} modal={true}>
<DialogProvider scope={{Dialog:[...]}} triggerRef={{current:null}} contentRef={{current:null}} ...>
<AlertDialogTrigger asChild={true}>
<DialogTrigger __scopeDialog={{Dialog:[...]}} asChild={true} ref={null}>
<Primitive.button type="button" aria-haspopup="dialog" aria-expanded={false} ...>
<Primitive.button.Slot type="button" aria-haspopup="dialog" aria-expanded={false} ...>
<Primitive.button.SlotClone type="button" aria-haspopup="dialog" aria-expanded={false} ...>
<Button variant="outline" size="sm" type="button" aria-haspopup="dialog" ...>
<button
data-slot="button"
className={"inline-flex items-center justify-center gap-2 whitespace-nowrap text-sm..."}
type="button"
aria-haspopup="dialog"
aria-expanded={false}
+ aria-controls="radix-_R_1atqatpesndubn6lb_"
- aria-controls="radix-_R_5bn9bn5ritnqbn6lb_"
data-state="closed"
onClick={function handleEvent}
ref={function}
>
+ 归档
...
<LessonPlanCard plan={{id:"jn8to5...", ...}} viewMode="teacher">
<div className="border bor...">
<LinkComponent>
<div>
<div>
<div>
<div className="flex gap-2...">
<Button>
<AlertDialog>
<Dialog __scopeDialog={{Dialog:[...]}} modal={true}>
<DialogProvider scope={{Dialog:[...]}} triggerRef={{current:null}} contentRef={{current:null}} ...>
<AlertDialogTrigger asChild={true}>
<DialogTrigger __scopeDialog={{Dialog:[...]}} asChild={true} ref={null}>
<Primitive.button type="button" aria-haspopup="dialog" aria-expanded={false} ...>
<Primitive.button.Slot type="button" aria-haspopup="dialog" aria-expanded={false} ...>
<Primitive.button.SlotClone type="button" aria-haspopup="dialog" aria-expanded={false} ...>
<Button variant="outline" size="sm" type="button" aria-haspopup="dialog" ...>
<button
data-slot="button"
className={"inline-flex items-center justify-center gap-2 whitespace-nowrap text-sm..."}
type="button"
aria-haspopup="dialog"
aria-expanded={false}
+ aria-controls="radix-_R_1avqatpesndubn6lb_"
- aria-controls="radix-_R_5bv9bn5ritnqbn6lb_"
data-state="closed"
onClick={function handleEvent}
ref={function}
>
+ 归档
...
<LessonPlanCard plan={{id:"wdqlzc...", ...}} viewMode="teacher">
<div className="border bor...">
<LinkComponent>
<div>
<div>
<div>
<div className="flex gap-2...">
<Button>
<AlertDialog>
<Dialog __scopeDialog={{Dialog:[...]}} modal={true}>
<DialogProvider scope={{Dialog:[...]}} triggerRef={{current:null}} contentRef={{current:null}} ...>
<AlertDialogTrigger asChild={true}>
<DialogTrigger __scopeDialog={{Dialog:[...]}} asChild={true} ref={null}>
<Primitive.button type="button" aria-haspopup="dialog" aria-expanded={false} ...>
<Primitive.button.Slot type="button" aria-haspopup="dialog" aria-expanded={false} ...>
<Primitive.button.SlotClone type="button" aria-haspopup="dialog" aria-expanded={false} ...>
<Button variant="outline" size="sm" type="button" aria-haspopup="dialog" ...>
<button
data-slot="button"
className={"inline-flex items-center justify-center gap-2 whitespace-nowrap text-sm..."}
type="button"
aria-haspopup="dialog"
aria-expanded={false}
+ aria-controls="radix-_R_1b1qatpesndubn6lb_"
- aria-controls="radix-_R_5c79bn5ritnqbn6lb_"
data-state="closed"
onClick={function handleEvent}
ref={function}
>
+ 归档
...
|
| PASS `/teacher/lesson-plans/new` | 200 | passed | - |
### Attendance
| 页面 | HTTP状态 | 结果 | 备注 |
|------|----------|------|------|
| PASS `/teacher/attendance` | 200 | passed | - |
| PASS `/teacher/attendance/sheet` | 200 | passed | - |
| PASS `/teacher/attendance/stats` | 200 | passed | - |
### Schedule Changes
| 页面 | HTTP状态 | 结果 | 备注 |
|------|----------|------|------|
| FAIL `/teacher/schedule-changes` | 500 | failed | 错误: HTTP 500 error; Failed to load resource: the server responded with a status of 500 (Internal Server Error) |
### Diagnostic
| 页面 | HTTP状态 | 结果 | 备注 |
|------|----------|------|------|
| PASS `/teacher/diagnostic` | 200 | passed | 错误: %o
%s Error: Failed query: select `id`, `student_id`, `generated_by`, `class_id`, `report_type`, `period`, `summary`, `strengths`, `weaknesses`, `recommendations`, `overall_score`, `report_status`, `created_at`, `updated_at` from `learning_diagnostic_reports` order by `learning_diagnostic_reports`.`created_at` desc limit ?
params: 100
at <anonymous> (about://React/Server/E:%5CDesktop%5CCICD%5C.next%5Cdev%5Cserver%5Cchunks%5Cssr%5C%5Broot-of-the-server%5D__520e8e85._.js?69:11677:31)
at TeacherDiagnosticPage (about://React/Server/E:%5CDesktop%5CCICD%5C.next%5Cdev%5Cserver%5Cchunks%5Cssr%5C%5Broot-of-the-server%5D__c5e083b6._.js?70:138:21)
at resolveErrorDev (http://localhost:3000/_next/static/chunks/node_modules_next_dist_compiled_react-server-dom-turbopack_9212ccad._.js:1882:148)
at processFullStringRow (http://localhost:3000/_next/static/chunks/node_modules_next_dist_compiled_react-server-dom-turbopack_9212ccad._.js:2390:29)
at processFullBinaryRow (http://localhost:3000/_next/static/chunks/node_modules_next_dist_compiled_react-server-dom-turbopack_9212ccad._.js:2349:9)
at processBinaryChunk (http://localhost:3000/_next/static/chunks/node_modules_next_dist_compiled_react-server-dom-turbopack_9212ccad._.js:2459:98)
at progress (http://localhost:3000/_next/static/chunks/node_modules_next_dist_compiled_react-server-dom-turbopack_9212ccad._.js:2628:13) The above error occurred in the <TeacherDiagnosticPage> component. It was handled by the <ErrorBoundaryHandler> error boundary. |
### Elective
| 页面 | HTTP状态 | 结果 | 备注 |
|------|----------|------|------|
| PASS `/teacher/elective` | 200 | passed | - |
### Error Book
| 页面 | HTTP状态 | 结果 | 备注 |
|------|----------|------|------|
| PASS `/teacher/error-book` | 200 | passed | 错误: %o
%s Error: Failed query: select `id`, `error_status`, `knowledge_point_ids` from `error_book_items` where `error_book_items`.`student_id` in (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
params: user_s_g1c1_1,user_s_g1c1_2,user_s_g1c1_3,user_s_g1c1_4,user_s_g1c1_5,user_s_g1c1_6,user_s_g1c2_1,user_s_g1c2_2,user_s_g1c2_3,user_s_g1c2_4,user_s_g1c2_5,user_s_g1c2_6
at getKnowledgePointWeakness (about://React/Server/E:%5CDesktop%5CCICD%5C.next%5Cdev%5Cserver%5Cchunks%5Cssr%5C%5Broot-of-the-server%5D__ff9d8e4f._.js?65:696:18)
at TeacherErrorBookPage (about://React/Server/E:%5CDesktop%5CCICD%5C.next%5Cdev%5Cserver%5Cchunks%5Cssr%5C%5Broot-of-the-server%5D__ff9d8e4f._.js?66:1992:75)
at resolveErrorDev (http://localhost:3000/_next/static/chunks/node_modules_next_dist_compiled_react-server-dom-turbopack_9212ccad._.js:1882:148)
at processFullStringRow (http://localhost:3000/_next/static/chunks/node_modules_next_dist_compiled_react-server-dom-turbopack_9212ccad._.js:2390:29)
at processFullBinaryRow (http://localhost:3000/_next/static/chunks/node_modules_next_dist_compiled_react-server-dom-turbopack_9212ccad._.js:2349:9)
at processBinaryChunk (http://localhost:3000/_next/static/chunks/node_modules_next_dist_compiled_react-server-dom-turbopack_9212ccad._.js:2459:98)
at progress (http://localhost:3000/_next/static/chunks/node_modules_next_dist_compiled_react-server-dom-turbopack_9212ccad._.js:2628:13) The above error occurred in the <TeacherErrorBookPage> component. It was handled by the <ErrorBoundaryHandler> error boundary. |
### Textbooks Detail
| 页面 | HTTP状态 | 结果 | 备注 |
|------|----------|------|------|
| PASS `/teacher/textbooks/em3l39kx0inu9rsq6onnpe7r` | 200 | passed | - |
| PASS `/teacher/textbooks/loncxhs6kk4l33d826wv1m9y` | 200 | passed | - |
| PASS `/teacher/textbooks/b9kusgl3cxhtjcf1tcpvokhk` | 200 | passed | - |
### Classes Detail
| 页面 | HTTP状态 | 结果 | 备注 |
|------|----------|------|------|
| PASS `/teacher/classes/my/class_G1C1` | 200 | passed | 警告: Error text: 20; Error text: 42 |
### Course Plans Detail
| 页面 | HTTP状态 | 结果 | 备注 |
|------|----------|------|------|
| PASS `/teacher/course-plans/cp_g1c1_chinese` | 200 | passed | 错误: 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:
- A server/client branch `if (typeof window !== 'undefined')`.
- Variable input such as `Date.now()` or `Math.random()` which changes each time it's called.
- Date formatting in a user's locale which doesn't match the server.
- External changing data without sending a snapshot of it along with the HTML.
- Invalid HTML tag nesting.
It can also happen if the client has a browser extension installed which messes with the HTML before React loaded.
%s%s https://react.dev/link/hydration-mismatch
...
<SidebarProvider sidebar={<AppSidebar>}>
<div className="flex h-scr...">
<aside>
<div className="flex-1 fle...">
<a>
...
<div className="flex items...">
<GlobalSearch>
...
<MenuAnchor asChild={true} __scopeMenu={{Menu:[...], ...}}>
<PopperAnchor __scopePopper={{Menu:[...], ...}} asChild={true} ref={null}>
<Primitive.div asChild={true} ref={function}>
<Primitive.div.Slot ref={function}>
<Primitive.div.SlotClone ref={function}>
<Primitive.button type="button" id="radix-_R_1..." aria-haspopup="menu" aria-expanded={false} ...>
<Primitive.button.Slot type="button" id="radix-_R_1..." aria-haspopup="menu" ...>
<Primitive.button.SlotClone type="button" id="radix-_R_1..." aria-haspopup="menu" ...>
<Button variant="ghost" size="icon" className="relative t..." aria-label="通知" ...>
<button
data-slot="dropdown-menu-trigger"
className={"inline-flex items-center justify-center gap-2 whitespace-nowrap round..."}
aria-label="通知"
type="button"
+ id="radix-_R_19ebn6lb_"
- id="radix-_R_55qbn6lb_"
aria-haspopup="menu"
aria-expanded={false}
aria-controls={undefined}
data-state="closed"
data-disabled={undefined}
disabled={false}
onPointerDown={function handleEvent}
onKeyDown={function handleEvent}
ref={function}
>
...
<MenuAnchor asChild={true} __scopeMenu={{Menu:[...], ...}}>
<PopperAnchor __scopePopper={{Menu:[...], ...}} asChild={true} ref={null}>
<Primitive.div asChild={true} ref={function}>
<Primitive.div.Slot ref={function}>
<Primitive.div.SlotClone ref={function}>
<Primitive.button type="button" id="radix-_R_1..." aria-haspopup="menu" aria-expanded={false} ...>
<Primitive.button.Slot type="button" id="radix-_R_1..." aria-haspopup="menu" ...>
<Primitive.button.SlotClone type="button" id="radix-_R_1..." aria-haspopup="menu" ...>
<Button variant="ghost" className="relative s..." type="button" id="radix-_R_1..." ...>
<button
data-slot="dropdown-menu-trigger"
className={"inline-flex items-center justify-center gap-2 whitespace-nowrap text-..."}
type="button"
+ id="radix-_R_1pebn6lb_"
- id="radix-_R_75qbn6lb_"
aria-haspopup="menu"
aria-expanded={false}
aria-controls={undefined}
data-state="closed"
data-disabled={undefined}
disabled={false}
onPointerDown={function handleEvent}
onKeyDown={function handleEvent}
ref={function}
>
<main>
<AiAssistantWidget>
<Sheet open={false} onOpenChange={function bound dispatchSetState}>
<Dialog data-slot="sheet" open={false} onOpenChange={function bound dispatchSetState}>
<DialogProvider scope={undefined} triggerRef={{current:null}} contentRef={{current:null}} ...>
<SheetTrigger asChild={true}>
<DialogTrigger data-slot="sheet-trigger" asChild={true}>
<Primitive.button type="button" aria-haspopup="dialog" aria-expanded={false} ...>
<Primitive.button.Slot type="button" aria-haspopup="dialog" aria-expanded={false} ...>
<Primitive.button.SlotClone type="button" aria-haspopup="dialog" aria-expanded={false} ...>
<Button type="button" size="icon" className="fixed bott..." aria-label="打开 AI 助手" ...>
<button
data-slot="sheet-trigger"
className={"inline-flex items-center justify-center gap-2 whitespace-nowrap text-sm f..."}
type="button"
aria-label="打开 AI 助手"
aria-haspopup="dialog"
aria-expanded={false}
+ aria-controls="radix-_R_2ebn6lb_"
- aria-controls="radix-_R_9qbn6lb_"
data-state="closed"
onClick={function handleEvent}
ref={function}
>
...
|
### Lesson Plans Detail
| 页面 | HTTP状态 | 结果 | 备注 |
|------|----------|------|------|
| PASS `/teacher/lesson-plans/new` | 200 | passed | - |
| PASS `/teacher/lesson-plans/o20j6es4xbrc1qtbsi33l8wc/edit` | 200 | passed | 错误: 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:
- A server/client branch `if (typeof window !== 'undefined')`.
- Variable input such as `Date.now()` or `Math.random()` which changes each time it's called.
- Date formatting in a user's locale which doesn't match the server.
- External changing data without sending a snapshot of it along with the HTML.
- Invalid HTML tag nesting.
It can also happen if the client has a browser extension installed which messes with the HTML before React loaded.
%s%s https://react.dev/link/hydration-mismatch
...
<SidebarProvider sidebar={<AppSidebar>}>
<div className="flex h-scr...">
<aside>
<div className="flex-1 fle...">
<a>
...
<div className="flex items...">
<GlobalSearch>
...
<MenuAnchor asChild={true} __scopeMenu={{Menu:[...], ...}}>
<PopperAnchor __scopePopper={{Menu:[...], ...}} asChild={true} ref={null}>
<Primitive.div asChild={true} ref={function}>
<Primitive.div.Slot ref={function}>
<Primitive.div.SlotClone ref={function}>
<Primitive.button type="button" id="radix-_R_1..." aria-haspopup="menu" aria-expanded={false} ...>
<Primitive.button.Slot type="button" id="radix-_R_1..." aria-haspopup="menu" ...>
<Primitive.button.SlotClone type="button" id="radix-_R_1..." aria-haspopup="menu" ...>
<Button variant="ghost" size="icon" className="relative t..." aria-label="通知" ...>
<button
data-slot="dropdown-menu-trigger"
className={"inline-flex items-center justify-center gap-2 whitespace-nowrap round..."}
aria-label="通知"
type="button"
+ id="radix-_R_19ebn6lb_"
- id="radix-_R_55qbn6lb_"
aria-haspopup="menu"
aria-expanded={false}
aria-controls={undefined}
data-state="closed"
data-disabled={undefined}
disabled={false}
onPointerDown={function handleEvent}
onKeyDown={function handleEvent}
ref={function}
>
...
<MenuAnchor asChild={true} __scopeMenu={{Menu:[...], ...}}>
<PopperAnchor __scopePopper={{Menu:[...], ...}} asChild={true} ref={null}>
<Primitive.div asChild={true} ref={function}>
<Primitive.div.Slot ref={function}>
<Primitive.div.SlotClone ref={function}>
<Primitive.button type="button" id="radix-_R_1..." aria-haspopup="menu" aria-expanded={false} ...>
<Primitive.button.Slot type="button" id="radix-_R_1..." aria-haspopup="menu" ...>
<Primitive.button.SlotClone type="button" id="radix-_R_1..." aria-haspopup="menu" ...>
<Button variant="ghost" className="relative s..." type="button" id="radix-_R_1..." ...>
<button
data-slot="dropdown-menu-trigger"
className={"inline-flex items-center justify-center gap-2 whitespace-nowrap text-..."}
type="button"
+ id="radix-_R_1pebn6lb_"
- id="radix-_R_75qbn6lb_"
aria-haspopup="menu"
aria-expanded={false}
aria-controls={undefined}
data-state="closed"
data-disabled={undefined}
disabled={false}
onPointerDown={function handleEvent}
onKeyDown={function handleEvent}
ref={function}
>
<main>
<AiAssistantWidget>
<Sheet open={false} onOpenChange={function bound dispatchSetState}>
<Dialog data-slot="sheet" open={false} onOpenChange={function bound dispatchSetState}>
<DialogProvider scope={undefined} triggerRef={{current:null}} contentRef={{current:null}} ...>
<SheetTrigger asChild={true}>
<DialogTrigger data-slot="sheet-trigger" asChild={true}>
<Primitive.button type="button" aria-haspopup="dialog" aria-expanded={false} ...>
<Primitive.button.Slot type="button" aria-haspopup="dialog" aria-expanded={false} ...>
<Primitive.button.SlotClone type="button" aria-haspopup="dialog" aria-expanded={false} ...>
<Button type="button" size="icon" className="fixed bott..." aria-label="打开 AI 助手" ...>
<button
data-slot="sheet-trigger"
className={"inline-flex items-center justify-center gap-2 whitespace-nowrap text-sm f..."}
type="button"
aria-label="打开 AI 助手"
aria-haspopup="dialog"
aria-expanded={false}
+ aria-controls="radix-_R_2ebn6lb_"
- aria-controls="radix-_R_9qbn6lb_"
data-state="closed"
onClick={function handleEvent}
ref={function}
>
...
; 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:
- A server/client branch `if (typeof window !== 'undefined')`.
- Variable input such as `Date.now()` or `Math.random()` which changes each time it's called.
- Date formatting in a user's locale which doesn't match the server.
- External changing data without sending a snapshot of it along with the HTML.
- Invalid HTML tag nesting.
It can also happen if the client has a browser extension installed which messes with the HTML before React loaded.
%s%s https://react.dev/link/hydration-mismatch
...
<Suspense fallback={<div>}>
<LessonPlanEditor planId="o20j6es4xb..." initialTitle="第一课 秋天" initialDoc={{edges:[...], ...}} ...>
<div className="flex flex-...">
<div className="flex items...">
<input>
<div>
<span>
<Button>
<Button>
<AlertDialog>
<Dialog __scopeDialog={{Dialog:[...]}} modal={true}>
<DialogProvider scope={{Dialog:[...]}} triggerRef={{current:null}} contentRef={{current:null}} ...>
<AlertDialogTrigger asChild={true}>
<DialogTrigger __scopeDialog={{Dialog:[...]}} asChild={true} ref={null}>
<Primitive.button type="button" aria-haspopup="dialog" aria-expanded={false} ...>
<Primitive.button.Slot type="button" aria-haspopup="dialog" aria-expanded={false} ...>
<Primitive.button.SlotClone type="button" aria-haspopup="dialog" aria-expanded={false} ...>
<Button size="sm" disabled={false} type="button" aria-haspopup="dialog" aria-expanded={false} ...>
<button
data-slot="button"
className={"inline-flex items-center justify-center gap-2 whitespace-nowrap text-sm f..."}
disabled={false}
type="button"
aria-haspopup="dialog"
aria-expanded={false}
+ aria-controls="radix-_R_cpbn5ritpesndubn6lb_"
- aria-controls="radix-_R_1j5esnebn5ritnqbn6lb_"
data-state="closed"
onClick={function handleEvent}
ref={function}
>
...
...
|
| PASS `/teacher/lesson-plans/p54vt85kt9hk1h6yz64s27cf/edit` | 200 | passed | 错误: PageError: Switched to client rendering because the server rendering errored:
Failed to call `useTranslations` because the context from `NextIntlClientProvider` was not found.
This can happen because:
1) You i |
### Homework Detail
| 页面 | HTTP状态 | 结果 | 备注 |
|------|----------|------|------|
| PASS `/teacher/homework/assignments/create` | 200 | passed | - |
| PASS `/teacher/homework/assignments/hw_chinese_g1` | 200 | passed | 错误: 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:
- A server/client branch `if (typeof window !== 'undefined')`.
- Variable input such as `Date.now()` or `Math.random()` which changes each time it's called.
- Date formatting in a user's locale which doesn't match the server.
- External changing data without sending a snapshot of it along with the HTML.
- Invalid HTML tag nesting.
It can also happen if the client has a browser extension installed which messes with the HTML before React loaded.
%s%s https://react.dev/link/hydration-mismatch
...
<SidebarProvider sidebar={<AppSidebar>}>
<div className="flex h-scr...">
<aside>
<div className="flex-1 fle...">
<a>
...
<div className="flex items...">
<GlobalSearch>
...
<MenuAnchor asChild={true} __scopeMenu={{Menu:[...], ...}}>
<PopperAnchor __scopePopper={{Menu:[...], ...}} asChild={true} ref={null}>
<Primitive.div asChild={true} ref={function}>
<Primitive.div.Slot ref={function}>
<Primitive.div.SlotClone ref={function}>
<Primitive.button type="button" id="radix-_R_1..." aria-haspopup="menu" aria-expanded={false} ...>
<Primitive.button.Slot type="button" id="radix-_R_1..." aria-haspopup="menu" ...>
<Primitive.button.SlotClone type="button" id="radix-_R_1..." aria-haspopup="menu" ...>
<Button variant="ghost" size="icon" className="relative t..." aria-label="通知" ...>
<button
data-slot="dropdown-menu-trigger"
className={"inline-flex items-center justify-center gap-2 whitespace-nowrap round..."}
aria-label="通知"
type="button"
+ id="radix-_R_19ebn6lb_"
- id="radix-_R_55qbn6lb_"
aria-haspopup="menu"
aria-expanded={false}
aria-controls={undefined}
data-state="closed"
data-disabled={undefined}
disabled={false}
onPointerDown={function handleEvent}
onKeyDown={function handleEvent}
ref={function}
>
...
<MenuAnchor asChild={true} __scopeMenu={{Menu:[...], ...}}>
<PopperAnchor __scopePopper={{Menu:[...], ...}} asChild={true} ref={null}>
<Primitive.div asChild={true} ref={function}>
<Primitive.div.Slot ref={function}>
<Primitive.div.SlotClone ref={function}>
<Primitive.button type="button" id="radix-_R_1..." aria-haspopup="menu" aria-expanded={false} ...>
<Primitive.button.Slot type="button" id="radix-_R_1..." aria-haspopup="menu" ...>
<Primitive.button.SlotClone type="button" id="radix-_R_1..." aria-haspopup="menu" ...>
<Button variant="ghost" className="relative s..." type="button" id="radix-_R_1..." ...>
<button
data-slot="dropdown-menu-trigger"
className={"inline-flex items-center justify-center gap-2 whitespace-nowrap text-..."}
type="button"
+ id="radix-_R_1pebn6lb_"
- id="radix-_R_75qbn6lb_"
aria-haspopup="menu"
aria-expanded={false}
aria-controls={undefined}
data-state="closed"
data-disabled={undefined}
disabled={false}
onPointerDown={function handleEvent}
onKeyDown={function handleEvent}
ref={function}
>
<main>
<AiAssistantWidget>
<Sheet open={false} onOpenChange={function bound dispatchSetState}>
<Dialog data-slot="sheet" open={false} onOpenChange={function bound dispatchSetState}>
<DialogProvider scope={undefined} triggerRef={{current:null}} contentRef={{current:null}} ...>
<SheetTrigger asChild={true}>
<DialogTrigger data-slot="sheet-trigger" asChild={true}>
<Primitive.button type="button" aria-haspopup="dialog" aria-expanded={false} ...>
<Primitive.button.Slot type="button" aria-haspopup="dialog" aria-expanded={false} ...>
<Primitive.button.SlotClone type="button" aria-haspopup="dialog" aria-expanded={false} ...>
<Button type="button" size="icon" className="fixed bott..." aria-label="打开 AI 助手" ...>
<button
data-slot="sheet-trigger"
className={"inline-flex items-center justify-center gap-2 whitespace-nowrap text-sm f..."}
type="button"
aria-label="打开 AI 助手"
aria-haspopup="dialog"
aria-expanded={false}
+ aria-controls="radix-_R_2ebn6lb_"
- aria-controls="radix-_R_9qbn6lb_"
data-state="closed"
onClick={function handleEvent}
ref={function}
>
...
<br>警告: Error text: 0 / 3 |
### Exams Detail
| 页面 | HTTP状态 | 结果 | 备注 |
|------|----------|------|------|
| PASS `/teacher/exams/create` | 200 | passed | - |
---
## 三、失败页面详情
### FAIL `/teacher/schedule-changes`
- **分类**: Schedule Changes
- **HTTP状态**: 500
- **重定向**: http://localhost:3000/teacher/schedule-changes
- **错误信息**:
- HTTP 500 error
- Failed to load resource: the server responded with a status of 500 (Internal Server Error)
- %o
%s PermissionDeniedError: 权限不足:需要 schedule:adjust 权限。请联系管理员授权或切换账号后重试。
at requirePermission (about://React/Server/E:%5CDesktop%5CCICD%5C.next%5Cdev%5Cserver%5Cchunks%5Cssr%5C%5Broot-of-the-server%5D__20b59666._.js?49:3692:15)
at TeacherScheduleChangesPage (about://React/Server/E:%5CDesktop%5CCICD%5C.next%5Cdev%5Cserver%5Cchunks%5Cssr%5C%5Broot-of-the-server%5D__dd4f396b._.js?50:127:17)
at resolveErrorDev (http://localhost:3000/_next/static/chunks/node_modules_next_dist_compiled_react-server-dom-turbopack_9212ccad._.js:1882:148)
at processFullStringRow (http://localhost:3000/_next/static/chunks/node_modules_next_dist_compiled_react-server-dom-turbopack_9212ccad._.js:2390:29)
at processFullBinaryRow (http://localhost:3000/_next/static/chunks/node_modules_next_dist_compiled_react-server-dom-turbopack_9212ccad._.js:2349:9)
at processBinaryChunk (http://localhost:3000/_next/static/chunks/node_modules_next_dist_compiled_react-server-dom-turbopack_9212ccad._.js:2459:98)
at progress (http://localhost:3000/_next/static/chunks/node_modules_next_dist_compiled_react-server-dom-turbopack_9212ccad._.js:2628:13) The above error occurred in the <TeacherScheduleChangesPage> component. It was handled by the <ErrorBoundaryHandler> error boundary.
- **截图**: E:\Desktop\CICD\scripts\..\bugs\screenshots\teacher_schedule-changes.png
---
*报告自动生成于 2026-06-23 18:27:12*