
学生支持周报记录学生每周获得的家庭、学校、教师和同伴支持情况,是班主任判断学生外部支持系统是否稳定的重要依据。它关注周度变化,不是日常生活表的简单字段子集。
本文基于 StudentSupportWeekly 的模型、视图和 fast-crud 页面,把学生选择、日期筛选、抽屉回显和数据维护转换为 Codex 可执行任务。
文章目录
设计与需求
学生支持周报不能只按普通 CRUD 理解。StudentSupportWeekly 模型以 id_student + week_start 作为唯一约束,保存学生某一周的支持快照。字段覆盖 week_start、week_end、parent_support_score、homework_supervision_freq、family_study_support_level、school_connectedness_score、teacher_relation_score、peer_relation_score、bullying_flag、support_note,这些字段会被学生画像抽屉用于支持系统分和综合画像分。
Codex 生成代码时要把周起止日期、支持分值和学生上下文放在同一条业务链路中。week_start 是范围筛选字段,也是唯一约束的一部分;week_end 是展示和业务解释字段;bullying_flag 会影响画像抽屉支持维度计算,不能被当成普通备注。
#mermaid-svg-h4dfjJJFyPoLAfTz{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-h4dfjJJFyPoLAfTz .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-h4dfjJJFyPoLAfTz .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-h4dfjJJFyPoLAfTz .error-icon{fill:#552222;}#mermaid-svg-h4dfjJJFyPoLAfTz .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-h4dfjJJFyPoLAfTz .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-h4dfjJJFyPoLAfTz .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-h4dfjJJFyPoLAfTz .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-h4dfjJJFyPoLAfTz .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-h4dfjJJFyPoLAfTz .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-h4dfjJJFyPoLAfTz .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-h4dfjJJFyPoLAfTz .marker{fill:#333333;stroke:#333333;}#mermaid-svg-h4dfjJJFyPoLAfTz .marker.cross{stroke:#333333;}#mermaid-svg-h4dfjJJFyPoLAfTz svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-h4dfjJJFyPoLAfTz p{margin:0;}#mermaid-svg-h4dfjJJFyPoLAfTz .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-h4dfjJJFyPoLAfTz .cluster-label text{fill:#333;}#mermaid-svg-h4dfjJJFyPoLAfTz .cluster-label span{color:#333;}#mermaid-svg-h4dfjJJFyPoLAfTz .cluster-label span p{background-color:transparent;}#mermaid-svg-h4dfjJJFyPoLAfTz .label text,#mermaid-svg-h4dfjJJFyPoLAfTz span{fill:#333;color:#333;}#mermaid-svg-h4dfjJJFyPoLAfTz .node rect,#mermaid-svg-h4dfjJJFyPoLAfTz .node circle,#mermaid-svg-h4dfjJJFyPoLAfTz .node ellipse,#mermaid-svg-h4dfjJJFyPoLAfTz .node polygon,#mermaid-svg-h4dfjJJFyPoLAfTz .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-h4dfjJJFyPoLAfTz .rough-node .label text,#mermaid-svg-h4dfjJJFyPoLAfTz .node .label text,#mermaid-svg-h4dfjJJFyPoLAfTz .image-shape .label,#mermaid-svg-h4dfjJJFyPoLAfTz .icon-shape .label{text-anchor:middle;}#mermaid-svg-h4dfjJJFyPoLAfTz .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-h4dfjJJFyPoLAfTz .rough-node .label,#mermaid-svg-h4dfjJJFyPoLAfTz .node .label,#mermaid-svg-h4dfjJJFyPoLAfTz .image-shape .label,#mermaid-svg-h4dfjJJFyPoLAfTz .icon-shape .label{text-align:center;}#mermaid-svg-h4dfjJJFyPoLAfTz .node.clickable{cursor:pointer;}#mermaid-svg-h4dfjJJFyPoLAfTz .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-h4dfjJJFyPoLAfTz .arrowheadPath{fill:#333333;}#mermaid-svg-h4dfjJJFyPoLAfTz .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-h4dfjJJFyPoLAfTz .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-h4dfjJJFyPoLAfTz .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-h4dfjJJFyPoLAfTz .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-h4dfjJJFyPoLAfTz .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-h4dfjJJFyPoLAfTz .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-h4dfjJJFyPoLAfTz .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-h4dfjJJFyPoLAfTz .cluster text{fill:#333;}#mermaid-svg-h4dfjJJFyPoLAfTz .cluster span{color:#333;}#mermaid-svg-h4dfjJJFyPoLAfTz div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-h4dfjJJFyPoLAfTz .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-h4dfjJJFyPoLAfTz rect.text{fill:none;stroke-width:0;}#mermaid-svg-h4dfjJJFyPoLAfTz .icon-shape,#mermaid-svg-h4dfjJJFyPoLAfTz .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-h4dfjJJFyPoLAfTz .icon-shape p,#mermaid-svg-h4dfjJJFyPoLAfTz .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-h4dfjJJFyPoLAfTz .icon-shape .label rect,#mermaid-svg-h4dfjJJFyPoLAfTz .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-h4dfjJJFyPoLAfTz .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-h4dfjJJFyPoLAfTz .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-h4dfjJJFyPoLAfTz :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}#mermaid-svg-h4dfjJJFyPoLAfTz .input>*{fill:#EEF4FF!important;stroke:#5B8FF9!important;color:#1D39C4!important;stroke-width:1.2px!important;}#mermaid-svg-h4dfjJJFyPoLAfTz .input span{fill:#EEF4FF!important;stroke:#5B8FF9!important;color:#1D39C4!important;stroke-width:1.2px!important;}#mermaid-svg-h4dfjJJFyPoLAfTz .input tspan{fill:#1D39C4!important;}#mermaid-svg-h4dfjJJFyPoLAfTz .design>*{fill:#F6FFED!important;stroke:#52C41A!important;color:#237804!important;stroke-width:1.2px!important;}#mermaid-svg-h4dfjJJFyPoLAfTz .design span{fill:#F6FFED!important;stroke:#52C41A!important;color:#237804!important;stroke-width:1.2px!important;}#mermaid-svg-h4dfjJJFyPoLAfTz .design tspan{fill:#237804!important;}#mermaid-svg-h4dfjJJFyPoLAfTz .process>*{fill:#FFF7E6!important;stroke:#FA8C16!important;color:#AD4E00!important;stroke-width:1.2px!important;}#mermaid-svg-h4dfjJJFyPoLAfTz .process span{fill:#FFF7E6!important;stroke:#FA8C16!important;color:#AD4E00!important;stroke-width:1.2px!important;}#mermaid-svg-h4dfjJJFyPoLAfTz .process tspan{fill:#AD4E00!important;}#mermaid-svg-h4dfjJJFyPoLAfTz .check>*{fill:#F9F0FF!important;stroke:#722ED1!important;color:#531DAB!important;stroke-width:1.2px!important;}#mermaid-svg-h4dfjJJFyPoLAfTz .check span{fill:#F9F0FF!important;stroke:#722ED1!important;color:#531DAB!important;stroke-width:1.2px!important;}#mermaid-svg-h4dfjJJFyPoLAfTz .check tspan{fill:#531DAB!important;}#mermaid-svg-h4dfjJJFyPoLAfTz .output>*{fill:#E6FFFB!important;stroke:#13C2C2!important;color:#006D75!important;stroke-width:1.2px!important;}#mermaid-svg-h4dfjJJFyPoLAfTz .output span{fill:#E6FFFB!important;stroke:#13C2C2!important;color:#006D75!important;stroke-width:1.2px!important;}#mermaid-svg-h4dfjJJFyPoLAfTz .output tspan{fill:#006D75!important;} 教育管理需求
学生支持周报设计
页面结构
数据模型
接口规则
权限验收
Codex生成代码
| 需求层描述 | 设计层转换 | Codex 代码生成方向 |
|---|---|---|
| 学生身份 | 通过 id_student、name_student、username_student 关联学生 | 生成学生远程搜索和只读回显 |
| 业务记录 | week_start、week_end、parent_support_score、homework_supervision_freq、family_study_support_level、school_connectedness_score、teacher_relation_score、peer_relation_score、bullying_flag、support_note | 生成对应字段表单、列表列和基础校验 |
| 日期筛选 | week_start 支持范围查询 | 生成 range_fields 与前端查询参数 |
| 学生抽屉 | 学生管理页打开子模块时带入当前学生 | 生成 inStudentDrawer、studentRef 和自动刷新 |
| 周度唯一 | id_student + week_start 唯一 |
生成重复周报校验和编辑回显 |
| 支持评分 | 周报数据参与画像抽屉支持系统计算 | 生成可追溯的支持分输入 |
可以直接使用下面的Prompt进行模块功能的设计
text
请基于教育管理系统源码设计 学生支持周报 模块,不要编造代码中不存在的能力。
业务范围:记录学生每周家庭支持、作业监督、学校归属感、师生关系、同伴关系、欺凌标记和支持备注。
后端路径:server_backend/modules/User/views_app/StudentSupportWeekly.py
前端路径:server_vue3/src/views/modules/User/StudentSupportWeekly/index.vue、crud.tsx
接口入口:/api/User/StudentSupportWeekly/
核心字段:week_start、week_end、parent_support_score、homework_supervision_freq、family_study_support_level、school_connectedness_score、teacher_relation_score、peer_relation_score、bullying_flag、support_note
扩展能力:数据联动
请输出模块设计方案,包含页面结构、数据模型、接口规则、权限验收、异常边界和 Codex 分阶段生成项目代码的任务拆分。扩展能力只允许使用源码中已经存在的能力。
后端设计
后端设计重点不是堆接口,而是把学生支持周报沉淀成可复用的数据底座。StudentSupportWeeklyViewSet 位于 server_backend/modules/User/views_app/StudentSupportWeekly.py,开放 get/post/put/delete,使用 CustomModelRefSerializer,并把 id_student、name_student、username_student 设置为只读字段。模型层的唯一约束防止同一学生同一周出现多份互相冲突的支持周报。
筛选层使用 CustomModelInFilter.create_for_model,支持 id_student、name_student、username_student、class_administrative、support_note 模糊查询,并通过 range_fields=['week_start'] 支持周起始日期范围查询。后端不需要新增统计接口,画像抽屉会按 id_student 拉取周报列表后在前端计算支持分。
| 后端设计项 | 设计重点 | Codex 生成方向 |
|---|---|---|
| 模型字段 | 使用 CustomModelRefSerializer 按模型生成序列化规则 |
保留只读学生身份字段和业务字段类型 |
| 查询筛选 | 使用 SearchFilter 与 CustomModelInFilter |
支持姓名、学号、班级和日期范围查询 |
| 路由注册 | 在 modules/User/urls.py 通过 DefaultRouter 注册 |
保持 /api/User/模块名/ 接口风格 |
| 权限边界 | 依赖系统登录态和管理范围 | 避免跨学生、跨班级访问敏感数据 |
| 唯一约束 | id_student + week_start 限制每周一条 |
生成重复数据错误处理 |
| 日期范围 | range_fields=['week_start'] |
生成周起始日期区间查询 |
可以直接使用下面的Prompt进行后端代码的设计
text
请按 学生支持周报 的真实业务补齐或重构后端代码。
需要读取并遵守:
- server_backend/modules/User/views_app/StudentSupportWeekly.py
- server_backend/modules/User/models.py
- server_backend/modules/User/urls.py
生成要求:
- 按 StudentSupportWeekly 模型字段设计序列化规则,不要新增无来源字段。
- 使用 CustomModelViewSet、CustomModelRefSerializer 和 CustomModelInFilter 保持项目风格。
- 补齐列表查询、详情、新增、编辑、删除或只读接口边界。
- 保留 read_only_fields、search_fields、range_fields 和权限校验逻辑。
- 扩展能力只实现:数据联动。
- 输出需要包含模型字段说明、接口清单、路由注册、筛选规则、权限规则和异常处理。
前端设计
前端设计重点不是把字段堆到页面上,而是让管理人员能按周维护学生支持系统。StudentSupportWeekly/crud.tsx 将 week_start、week_end、家庭支持、作业监督、家庭学习支持、学校归属感、师生关系、同伴关系、欺凌标记和备注配置成列表与表单字段;api.ts 使用 /api/User/StudentSupportWeekly/ 封装标准请求。
学生管理中的 StudentSupportWeeklyDrawer 复用基础 crud 配置,通过 studentRef 带入当前学生。打开某个学生的支持周报时,列表必须只显示该学生的数据,新增时必须自动填充学号、姓名、用户名和行政班。
| 前端设计项 | 设计重点 | Codex 生成方向 |
|---|---|---|
| 列表配置 | 使用 fs-crud 组织分页、搜索和列展示 |
生成 crud.tsx 的 columns、request、rowHandle |
| 表单结构 | 学生身份字段只读,业务字段按类型输入 | 生成新增、编辑、回显和校验规则 |
| 接口封装 | api.ts 统一封装 GetList/AddObj/UpdateObj/DelObj |
保持项目 request 调用规范 |
| 抽屉场景 | 学生详情页打开子模块时自动带入学生信息 | 支持 inStudentDrawer、studentRef 和列表刷新 |
| 周报表单 | 周起止日期与支持指标一起维护 | 生成日期控件、数值输入和布尔标记 |
| 画像输入 | 周报列表进入画像抽屉支持分计算 | 保持字段含义和分值范围 |
周报字段的输入范围需要在 Codex 任务里写清楚。parent_support_score 是 0 到 100 的家庭支持分;homework_supervision_freq 是一周内作业监督频率;family_study_support_level 是 1 到 5 的家庭学习支持等级;school_connectedness_score、teacher_relation_score、peer_relation_score 是 1 到 10 的学校归属、师生关系和同伴关系分值。bullying_flag 是布尔风险标记,不能被设计成自由文本。
学生画像抽屉会把周报数据纳入支持系统分计算。前端计算中,家庭支持、作业监督、家庭学习支持、学校归属、师生关系和同伴关系共同组成支持维度,bullying_flag 会形成扣分。Codex 生成页面时要保留这些字段的数值含义,避免把它们全部做成普通输入框而失去统计价值。
可以直接使用下面的Prompt进行前端代码的设计
text
请按 学生支持周报 的真实业务生成或补齐前端代码。
需要读取并遵守:
- server_vue3/src/views/modules/User/StudentSupportWeekly/index.vue、crud.tsx
- server_vue3/src/views/modules/User/StudentSupportWeekly/api.ts
生成要求:
- 使用项目现有 fs-crud、Element Plus、request 封装和 api.ts 风格。
- 生成列表查询、筛选区域、新增编辑表单、详情或抽屉交互、权限按钮和保存回显。
- 处理字段转换:学生远程搜索回填 id_student/name_student/username_student,抽屉模式自动注入当前学生,日期字段按 range_fields 支持范围查询
- 扩展交互只实现:数据联动。
- 不要添加源码中未实现的扩展入口。
扩展功能
学生支持周报的扩展能力是学生上下文联动。它既能作为独立列表维护,也能在学生管理抽屉中按当前学生过滤和回显。
| 扩展功能 | 主要用途 | 落地重点 |
|---|---|---|
| 数据联动 | 独立列表与学生抽屉共用同一套接口 | 按 id_student 自动筛选并补齐学生身份字段 |
数据联动
学生支持周报的数据联动体现在 id_student、name_student、username_student、class_administrative、week_start。前端选择、搜索或抽屉打开后,会生成接口参数 id_student、week_start 范围、学生搜索关键词,后端按学生、班级、日期或类型筛选,再把结果回填到列表、表单或业务面板中。
联动实现还要处理周区间逻辑。week_start 是后端范围查询字段,也是唯一约束字段;week_end 用于展示周报覆盖周期。新增时如果只选择周起始日期,前端可以按业务规则补齐周结束日期;编辑时不能因为重新选择学生而丢失已有周报指标。
验收时还要检查抽屉复用。学生管理页打开支持周报抽屉后,标题会包含当前学生姓名和学号,crud 配置通过 context: { studentRef } 复用基础页面配置。Codex 生成或修改时必须保留这个上下文入口,否则独立页面虽然可用,学生详情里的周报维护会失效。
#mermaid-svg-Mj10GALLzAZFbZUQ{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-Mj10GALLzAZFbZUQ .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-Mj10GALLzAZFbZUQ .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-Mj10GALLzAZFbZUQ .error-icon{fill:#552222;}#mermaid-svg-Mj10GALLzAZFbZUQ .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-Mj10GALLzAZFbZUQ .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-Mj10GALLzAZFbZUQ .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-Mj10GALLzAZFbZUQ .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-Mj10GALLzAZFbZUQ .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-Mj10GALLzAZFbZUQ .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-Mj10GALLzAZFbZUQ .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-Mj10GALLzAZFbZUQ .marker{fill:#333333;stroke:#333333;}#mermaid-svg-Mj10GALLzAZFbZUQ .marker.cross{stroke:#333333;}#mermaid-svg-Mj10GALLzAZFbZUQ svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-Mj10GALLzAZFbZUQ p{margin:0;}#mermaid-svg-Mj10GALLzAZFbZUQ .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-Mj10GALLzAZFbZUQ .cluster-label text{fill:#333;}#mermaid-svg-Mj10GALLzAZFbZUQ .cluster-label span{color:#333;}#mermaid-svg-Mj10GALLzAZFbZUQ .cluster-label span p{background-color:transparent;}#mermaid-svg-Mj10GALLzAZFbZUQ .label text,#mermaid-svg-Mj10GALLzAZFbZUQ span{fill:#333;color:#333;}#mermaid-svg-Mj10GALLzAZFbZUQ .node rect,#mermaid-svg-Mj10GALLzAZFbZUQ .node circle,#mermaid-svg-Mj10GALLzAZFbZUQ .node ellipse,#mermaid-svg-Mj10GALLzAZFbZUQ .node polygon,#mermaid-svg-Mj10GALLzAZFbZUQ .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-Mj10GALLzAZFbZUQ .rough-node .label text,#mermaid-svg-Mj10GALLzAZFbZUQ .node .label text,#mermaid-svg-Mj10GALLzAZFbZUQ .image-shape .label,#mermaid-svg-Mj10GALLzAZFbZUQ .icon-shape .label{text-anchor:middle;}#mermaid-svg-Mj10GALLzAZFbZUQ .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-Mj10GALLzAZFbZUQ .rough-node .label,#mermaid-svg-Mj10GALLzAZFbZUQ .node .label,#mermaid-svg-Mj10GALLzAZFbZUQ .image-shape .label,#mermaid-svg-Mj10GALLzAZFbZUQ .icon-shape .label{text-align:center;}#mermaid-svg-Mj10GALLzAZFbZUQ .node.clickable{cursor:pointer;}#mermaid-svg-Mj10GALLzAZFbZUQ .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-Mj10GALLzAZFbZUQ .arrowheadPath{fill:#333333;}#mermaid-svg-Mj10GALLzAZFbZUQ .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-Mj10GALLzAZFbZUQ .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-Mj10GALLzAZFbZUQ .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-Mj10GALLzAZFbZUQ .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-Mj10GALLzAZFbZUQ .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-Mj10GALLzAZFbZUQ .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-Mj10GALLzAZFbZUQ .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-Mj10GALLzAZFbZUQ .cluster text{fill:#333;}#mermaid-svg-Mj10GALLzAZFbZUQ .cluster span{color:#333;}#mermaid-svg-Mj10GALLzAZFbZUQ div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-Mj10GALLzAZFbZUQ .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-Mj10GALLzAZFbZUQ rect.text{fill:none;stroke-width:0;}#mermaid-svg-Mj10GALLzAZFbZUQ .icon-shape,#mermaid-svg-Mj10GALLzAZFbZUQ .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-Mj10GALLzAZFbZUQ .icon-shape p,#mermaid-svg-Mj10GALLzAZFbZUQ .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-Mj10GALLzAZFbZUQ .icon-shape .label rect,#mermaid-svg-Mj10GALLzAZFbZUQ .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-Mj10GALLzAZFbZUQ .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-Mj10GALLzAZFbZUQ .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-Mj10GALLzAZFbZUQ :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}#mermaid-svg-Mj10GALLzAZFbZUQ .input>*{fill:#EEF4FF!important;stroke:#5B8FF9!important;color:#1D39C4!important;stroke-width:1.2px!important;}#mermaid-svg-Mj10GALLzAZFbZUQ .input span{fill:#EEF4FF!important;stroke:#5B8FF9!important;color:#1D39C4!important;stroke-width:1.2px!important;}#mermaid-svg-Mj10GALLzAZFbZUQ .input tspan{fill:#1D39C4!important;}#mermaid-svg-Mj10GALLzAZFbZUQ .process>*{fill:#FFF7E6!important;stroke:#FA8C16!important;color:#AD4E00!important;stroke-width:1.2px!important;}#mermaid-svg-Mj10GALLzAZFbZUQ .process span{fill:#FFF7E6!important;stroke:#FA8C16!important;color:#AD4E00!important;stroke-width:1.2px!important;}#mermaid-svg-Mj10GALLzAZFbZUQ .process tspan{fill:#AD4E00!important;}#mermaid-svg-Mj10GALLzAZFbZUQ .output>*{fill:#E6FFFB!important;stroke:#13C2C2!important;color:#006D75!important;stroke-width:1.2px!important;}#mermaid-svg-Mj10GALLzAZFbZUQ .output span{fill:#E6FFFB!important;stroke:#13C2C2!important;color:#006D75!important;stroke-width:1.2px!important;}#mermaid-svg-Mj10GALLzAZFbZUQ .output tspan{fill:#006D75!important;} 结果阶段
处理阶段
输入阶段
筛选条件
表单选择
抽屉打开
生成参数
请求接口
字段转换
刷新列表
表单回显
状态更新
交给 Codex 生成时,要明确联动边界:只处理源码中存在的字段和接口,不把其他学生画像、考试分析或 AI 评估能力塞进本模块。保存动作必须保证 抽屉内只显示当前学生记录,保存时自动补齐学生身份字段。
可以直接使用下面的Prompt进行数据联动设计
text
请为 学生支持周报 设计数据联动实现。
联动字段:id_student、name_student、username_student、class_administrative、week_start
接口参数:id_student、week_start 范围、学生搜索关键词
结果回填:抽屉内只显示当前学生记录,保存时自动补齐学生身份字段
源码边界:只使用当前模块已经存在的模型字段、api.ts 请求和页面组件,不新增未实现的业务能力。
请输出联动流程、字段映射表、异常处理、保存回显规则和需要修改的文件路径。
Codex开发标准
使用 Codex 开发学生支持周报时,不能直接让模型自由写代码。PDD 定义业务边界和验收口径,SOP 约束目录、文件职责和开发顺序,接口权限规则保证生成代码能进入现有系统。
#mermaid-svg-8MwGXHsrqwezjQfR{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-8MwGXHsrqwezjQfR .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-8MwGXHsrqwezjQfR .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-8MwGXHsrqwezjQfR .error-icon{fill:#552222;}#mermaid-svg-8MwGXHsrqwezjQfR .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-8MwGXHsrqwezjQfR .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-8MwGXHsrqwezjQfR .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-8MwGXHsrqwezjQfR .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-8MwGXHsrqwezjQfR .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-8MwGXHsrqwezjQfR .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-8MwGXHsrqwezjQfR .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-8MwGXHsrqwezjQfR .marker{fill:#333333;stroke:#333333;}#mermaid-svg-8MwGXHsrqwezjQfR .marker.cross{stroke:#333333;}#mermaid-svg-8MwGXHsrqwezjQfR svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-8MwGXHsrqwezjQfR p{margin:0;}#mermaid-svg-8MwGXHsrqwezjQfR .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-8MwGXHsrqwezjQfR .cluster-label text{fill:#333;}#mermaid-svg-8MwGXHsrqwezjQfR .cluster-label span{color:#333;}#mermaid-svg-8MwGXHsrqwezjQfR .cluster-label span p{background-color:transparent;}#mermaid-svg-8MwGXHsrqwezjQfR .label text,#mermaid-svg-8MwGXHsrqwezjQfR span{fill:#333;color:#333;}#mermaid-svg-8MwGXHsrqwezjQfR .node rect,#mermaid-svg-8MwGXHsrqwezjQfR .node circle,#mermaid-svg-8MwGXHsrqwezjQfR .node ellipse,#mermaid-svg-8MwGXHsrqwezjQfR .node polygon,#mermaid-svg-8MwGXHsrqwezjQfR .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-8MwGXHsrqwezjQfR .rough-node .label text,#mermaid-svg-8MwGXHsrqwezjQfR .node .label text,#mermaid-svg-8MwGXHsrqwezjQfR .image-shape .label,#mermaid-svg-8MwGXHsrqwezjQfR .icon-shape .label{text-anchor:middle;}#mermaid-svg-8MwGXHsrqwezjQfR .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-8MwGXHsrqwezjQfR .rough-node .label,#mermaid-svg-8MwGXHsrqwezjQfR .node .label,#mermaid-svg-8MwGXHsrqwezjQfR .image-shape .label,#mermaid-svg-8MwGXHsrqwezjQfR .icon-shape .label{text-align:center;}#mermaid-svg-8MwGXHsrqwezjQfR .node.clickable{cursor:pointer;}#mermaid-svg-8MwGXHsrqwezjQfR .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-8MwGXHsrqwezjQfR .arrowheadPath{fill:#333333;}#mermaid-svg-8MwGXHsrqwezjQfR .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-8MwGXHsrqwezjQfR .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-8MwGXHsrqwezjQfR .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-8MwGXHsrqwezjQfR .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-8MwGXHsrqwezjQfR .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-8MwGXHsrqwezjQfR .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-8MwGXHsrqwezjQfR .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-8MwGXHsrqwezjQfR .cluster text{fill:#333;}#mermaid-svg-8MwGXHsrqwezjQfR .cluster span{color:#333;}#mermaid-svg-8MwGXHsrqwezjQfR div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-8MwGXHsrqwezjQfR .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-8MwGXHsrqwezjQfR rect.text{fill:none;stroke-width:0;}#mermaid-svg-8MwGXHsrqwezjQfR .icon-shape,#mermaid-svg-8MwGXHsrqwezjQfR .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-8MwGXHsrqwezjQfR .icon-shape p,#mermaid-svg-8MwGXHsrqwezjQfR .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-8MwGXHsrqwezjQfR .icon-shape .label rect,#mermaid-svg-8MwGXHsrqwezjQfR .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-8MwGXHsrqwezjQfR .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-8MwGXHsrqwezjQfR .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-8MwGXHsrqwezjQfR :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}#mermaid-svg-8MwGXHsrqwezjQfR .input>*{fill:#EEF4FF!important;stroke:#5B8FF9!important;color:#1D39C4!important;stroke-width:1.2px!important;}#mermaid-svg-8MwGXHsrqwezjQfR .input span{fill:#EEF4FF!important;stroke:#5B8FF9!important;color:#1D39C4!important;stroke-width:1.2px!important;}#mermaid-svg-8MwGXHsrqwezjQfR .input tspan{fill:#1D39C4!important;}#mermaid-svg-8MwGXHsrqwezjQfR .design>*{fill:#F6FFED!important;stroke:#52C41A!important;color:#237804!important;stroke-width:1.2px!important;}#mermaid-svg-8MwGXHsrqwezjQfR .design span{fill:#F6FFED!important;stroke:#52C41A!important;color:#237804!important;stroke-width:1.2px!important;}#mermaid-svg-8MwGXHsrqwezjQfR .design tspan{fill:#237804!important;}#mermaid-svg-8MwGXHsrqwezjQfR .dev>*{fill:#FFF7E6!important;stroke:#FA8C16!important;color:#AD4E00!important;stroke-width:1.2px!important;}#mermaid-svg-8MwGXHsrqwezjQfR .dev span{fill:#FFF7E6!important;stroke:#FA8C16!important;color:#AD4E00!important;stroke-width:1.2px!important;}#mermaid-svg-8MwGXHsrqwezjQfR .dev tspan{fill:#AD4E00!important;}#mermaid-svg-8MwGXHsrqwezjQfR .check>*{fill:#F9F0FF!important;stroke:#722ED1!important;color:#531DAB!important;stroke-width:1.2px!important;}#mermaid-svg-8MwGXHsrqwezjQfR .check span{fill:#F9F0FF!important;stroke:#722ED1!important;color:#531DAB!important;stroke-width:1.2px!important;}#mermaid-svg-8MwGXHsrqwezjQfR .check tspan{fill:#531DAB!important;} 验收交付
Codex开发
模块设计
输入约束
需求边界
PDD设计
SOP目录
接口权限
后端设计
前端设计
扩展功能
读取上下文
生成后端
生成前端
补齐扩展
功能自检
PDD验收
问题修复
模块交付
SOP 标准
SOP 用来约束代码目录、文件职责和开发顺序。学生支持周报的目录结构需要贴合现有 User 模块,不应为单篇文章另起一套风格。
text
server_backend/modules/User/
models.py
views_app/StudentSupportWeekly.py
urls.py
server_vue3/src/views/modules/User/StudentSupportWeekly/
index.vue
crud.tsx
api.ts
server_vue3/src/views/modules/User/StudentManage/Drawers/
StudentSupportWeeklyDrawer/index.vue
StudentSupportWeeklyDrawer/crud.tsx
docs/modules/学生支持周报/
pdd.md
api.md
test-cases.md
codex-sop.md
| 开发阶段 | Codex 执行目标 | 输出结果 |
|---|---|---|
| 模块设计 | 读取模型、视图、路由和前端页面 | pdd.md 明确业务边界 |
| 目录规划 | 对齐后端 views_app、前端模块目录和接口封装 | codex-sop.md 明确文件职责 |
| 后端实现 | 生成模型序列化、视图接口、筛选和权限校验 | 后端接口可被前端稳定调用 |
| 前端实现 | 生成列表、表单、抽屉、按钮和接口调用 | 页面操作闭环可运行 |
| 功能补齐 | 按真实扩展能力补齐联动、批量、文件或生成逻辑 | 扩展能力与源码一致 |
| 验收修复 | 根据 PDD 和测试用例修复偏差 | test-cases.md 与代码一致 |
可以直接使用下面的Prompt进行SOP撰写
text
请为 学生支持周报 编写 Codex 开发 SOP。
要求:
- 先输出目录结构,不要直接写代码。
- 先生成 docs/modules/学生支持周报/pdd.md、api.md、test-cases.md 和 codex-sop.md。
- 目录必须贴合现有路径:server_backend/modules/User/views_app/StudentSupportWeekly.py、server_vue3/src/views/modules/User/StudentSupportWeekly/index.vue、crud.tsx。
- SOP 需要约束模型字段、接口视图、路由注册、前端 crud 配置、接口封装、权限按钮、保存回显和扩展能力。
- 扩展能力只包含:数据联动。
- 文档完成后,再按 SOP 分阶段生成项目代码。
PDD 标准
PDD 是学生支持周报的设计与验收文档,用于判断 Codex 输出是否符合真实业务。验收不能只看页面能否打开,还要检查字段、接口、权限、筛选、联动和扩展能力是否匹配源码。
| 验收维度 | 验收重点 | 通过标准 |
|---|---|---|
| 业务目标 | 记录学生每周家庭支持、作业监督、学校归属感、师生关系、同伴关系、欺凌标记和支持备注。 | 页面和接口能支撑模块业务闭环 |
| 页面结构 | server_vue3/src/views/modules/User/StudentSupportWeekly/index.vue、crud.tsx | 列表、表单、抽屉或操作按钮与源码一致 |
| 数据模型 | week_start、week_end、parent_support_score、homework_supervision_freq、family_study_support_level、school_connectedness_score、teacher_relation_score、peer_relation_score、bullying_flag、support_note | 字段类型、只读字段、唯一约束不偏离模型 |
| 接口规则 | /api/User/StudentSupportWeekly/ | 列表、保存、删除、动作接口请求参数正确 |
| 权限控制 | 登录用户、班级范围或系统权限 | 非授权数据不可越权访问 |
| 测试用例 | 正常、异常、空数据、回显和删除 | test-cases.md 覆盖主要路径 |
| 数据联动 | 独立列表和学生抽屉按学生身份联动 | 抽屉打开、保存、刷新均限定当前学生 |
可以直接使用下面的Prompt进行PDD 验收
text
请根据 docs/modules/学生支持周报/pdd.md 对 学生支持周报 进行验收。
验收范围:业务目标、页面结构、数据模型、接口规则、权限控制、测试用例、数据联动。
请输出验收结果表,字段包含:验收项、通过状态、发现问题、涉及文件、修复建议。不要只给结论;必须指出未通过项的具体文件位置和建议改法。
总结
学生支持周报把家庭、学校和同伴关系转化为周度数据,能帮助教育管理人员观察支持环境是否稳定。
Codex 开发这类学生子模块时,应由 PDD 明确字段、日期范围和学生身份边界,由 SOP 固定独立页面与抽屉复用方式,再用 Prompt 约束查询、回显和保存逻辑。