# 教师端 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*