Files
NextEdu/docs/feature/f_bk.md
SpecialX 978d9a8309
Some checks failed
Security / deep-security-scan (push) Failing after 20m5s
DR Drill / dr-drill (push) Failing after 1m31s
CI / scheduled-backup (push) Failing after 1m31s
CI / backup-verify (push) Has been skipped
CI / weekly-dr-drill (push) Failing after 0s
CI / build-deploy (push) Has been cancelled
CI / security-scan (push) Has been cancelled
feat: 新增备课模块并修复全模块 P0/P1/P2 缺陷
主要变更:

- 新增 lesson-preparation 模块: 备课编辑器、节点编辑、AI 建议、知识点选择、版本历史、作业发布

- 新增 shared 通用组件: charts/question-bank-filters/schedule-list/ui (chip-nav/filter-bar/page-header/stat-card/stat-item)

- 新增 student/admin 端 loading.tsx 与 error.tsx, 优化加载与错误态体验

- 新增 teacher/lesson-plans 页面 (列表/新建/编辑)

- 新增 drizzle 迁移 0002_tiny_lionheart 及 snapshot

- 新增 textbooks/schema.ts 与 exams/utils/normalize-structure.ts

- 修复 Tiptap v3 SSR hydration 崩溃 (rich-text-block immediatelyRender: false)

- 重构多模块 data-access/actions/组件, 修复权限校验与类型规范

- 同步架构文档 004/005 反映新增模块、导出、依赖关系

- 归档 bugs/* 测试报告与 e2e 测试脚本 (admin/parent/student/teacher web_test)
2026-06-22 01:06:16 +08:00

24 KiB

<html class="light" lang="en"><head> <script src="https://cdn.tailwindcss.com?plugins=forms,container-queries"></script> <script id="tailwind-config"> tailwind.config = { darkMode: "class", theme: { extend: { "colors": { "surface-container-highest": "#e4e2e2", "error-container": "#ffdad6", "primary-fixed": "#d4e3ff", "primary": "#005dac", "secondary-fixed-dim": "#ffb786", "primary-fixed-dim": "#a5c8ff", "secondary": "#964900", "primary-container": "#1976d2", "surface-container-low": "#f5f3f3", "on-tertiary-fixed": "#002204", "on-surface-variant": "#414752", "on-surface": "#1b1c1c", "tertiary": "#0d6c1e", "on-primary-fixed-variant": "#004786", "inverse-surface": "#303031", "secondary-container": "#fc820c", "on-secondary-fixed-variant": "#723600", "surface": "#fbf9f8", "error": "#ba1a1a", "background": "#fbf9f8", "on-primary-fixed": "#001c3a", "on-secondary-fixed": "#311300", "on-primary-container": "#fffdff", "outline-variant": "#c1c6d4", "on-tertiary": "#ffffff", "tertiary-fixed": "#9df898", "on-error-container": "#93000a", "surface-variant": "#e4e2e2", "tertiary-container": "#2f8635", "surface-container-lowest": "#ffffff", "on-tertiary-fixed-variant": "#005312", "surface-tint": "#005faf", "on-background": "#1b1c1c", "surface-bright": "#fbf9f8", "outline": "#717783", "on-tertiary-container": "#fdfff7", "inverse-primary": "#a5c8ff", "on-secondary-container": "#5e2c00", "on-secondary": "#ffffff", "surface-dim": "#dbdad9", "surface-container": "#efeded", "secondary-fixed": "#ffdcc6", "on-primary": "#ffffff", "on-error": "#ffffff", "tertiary-fixed-dim": "#82db7e", "surface-container-high": "#e9e8e7", "inverse-on-surface": "#f2f0f0" }, "borderRadius": { "DEFAULT": "0.125rem", "lg": "0.25rem", "xl": "0.5rem", "full": "0.75rem" }, "spacing": { "xl": "32px", "sidebar_width": "80px", "sidebar_width_hover": "280px", "grid_columns": "12", "gutter": "24px", "2xl": "48px", "xs": "8px", "md": "16px", "lg": "24px", "sm": "12px", "base": "4px" }, "fontFamily": { "title-lg": ["Inter"], "display-lg": ["Inter"], "code-md": ["JetBrains Mono"], "body-lg": ["Inter"], "headline-lg-mobile": ["Inter"], "headline-md": ["Inter"], "label-md": ["Inter"], "headline-lg": ["Inter"], "title-md": ["Inter"], "body-md": ["Inter"] }, "fontSize": { "title-lg": ["20px", { "lineHeight": "28px", "fontWeight": "600" }], "display-lg": ["48px", { "lineHeight": "56px", "letterSpacing": "-0.02em", "fontWeight": "700" }], "code-md": ["14px", { "lineHeight": "20px", "fontWeight": "400" }], "body-lg": ["16px", { "lineHeight": "26px", "fontWeight": "400" }], "headline-lg-mobile": ["24px", { "lineHeight": "32px", "fontWeight": "600" }], "headline-md": ["24px", { "lineHeight": "32px", "fontWeight": "600" }], "label-md": ["12px", { "lineHeight": "16px", "letterSpacing": "0.05em", "fontWeight": "500" }], "headline-lg": ["32px", { "lineHeight": "40px", "letterSpacing": "-0.01em", "fontWeight": "600" }], "title-md": ["16px", { "lineHeight": "24px", "fontWeight": "600" }], "body-md": ["14px", { "lineHeight": "22px", "fontWeight": "400" }] } } } } </script> <style> .text-reading-chinese { font-family: "KaiTi", "STKaiti", serif; line-height: 2.2; letter-spacing: 0.05em; } .annotation-highlight-yellow { background-color: rgba(252, 130, 12, 0.2); border-bottom: 2px dashed #fc820c; transition: all 0.2s ease; } .annotation-highlight-yellow.active { background-color: rgba(252, 130, 12, 0.4); box-shadow: 0 0 0 2px rgba(252, 130, 12, 0.5); } .annotation-highlight-green { background-color: rgba(47, 134, 53, 0.15); border-bottom: 2px dashed #2f8635; transition: all 0.2s ease; } .annotation-highlight-green.active { background-color: rgba(47, 134, 53, 0.3); box-shadow: 0 0 0 2px rgba(47, 134, 53, 0.5); } .floating-toolbar { box-shadow: 0px 4px 12px rgba(0,0,0,0.08); backdrop-filter: blur(8px); } .node-canvas-bg { background-image: radial-gradient(var(--tw-colors-outline-variant) 1px, transparent 1px); background-size: 24px 24px; background-position: -12px -12px; }
    .sidebar-collapsed {
        width: 80px;
        transition: width 0.3s cubic-bezier(0.4, 0, 0.2, 1);
    }
    .sidebar-collapsed:hover {
        width: 280px;
    }
    .sidebar-collapsed .sidebar-text {
        opacity: 0;
        transform: translateX(-10px);
        transition: opacity 0.2s ease, transform 0.2s ease;
        white-space: nowrap;
    }
    .sidebar-collapsed:hover .sidebar-text {
        opacity: 1;
        transform: translateX(0);
        transition-delay: 0.1s;
    }
    .sidebar-collapsed .sidebar-header-compact {
        display: flex;
        transition: opacity 0.2s ease;
    }
    .sidebar-collapsed:hover .sidebar-header-compact {
        display: none;
        opacity: 0;
    }
    .sidebar-collapsed .sidebar-header-full {
        display: none;
        opacity: 0;
        transition: opacity 0.2s ease;
    }
    .sidebar-collapsed:hover .sidebar-header-full {
        display: flex;
        opacity: 1;
        transition-delay: 0.1s;
    }

    .connection-line {
        stroke-dasharray: 6 6;
        animation: dash 20s linear infinite;
    }
    @keyframes dash {
        to {
            stroke-dashoffset: -100;
        }
    }
</style>
</head>

Lesson Planner

Primary Chinese

add New Lesson Plan

Chinese Education Suite

《秋天》 (Autumn) Grade 1
Curriculum Standards Analytics
search
smart_toy AI Assistant Export Plan
notifications settings
format_ink_highlighter format_underlined add_comment

《秋天》

天气凉了,树叶黄了,一片片叶子从树上落下来。 天空那么蓝,那么高。

一群大雁往南飞,一会儿排成个“人”字,一会儿排成个“一”字。 啊!秋天来了!

lightbulb Select text and hold Shift to create a new node
Language Feature more_horiz

"天空那么蓝,那么高。"

Note: Focus on repetition of "那么".
Action Suggestion more_horiz

"啊!秋天来了!"

Language Feature close

"天空那么蓝,那么高。"

Instructional Notes

Focus on the repetition of "那么" (so) to emphasize the vastness of the autumn sky. Guide students to read with a prolonged, airy tone.

Tags
朗读指导 add Add Tag
</html>