
学生入学评估整合性格测评、入学资料、附件分析和智能体评估结论,是新生画像建立的关键模块。
本文基于 StudentAdmissionAssessment、评估抽屉和腾讯 SSE 调用源码,把问卷、文件、Prompt 和结果回填转换为 Codex 代码生成任务。
文章目录
设计与需求
学生入学评估不能只按普通 CRUD 理解。它连接学生、教师、班级、考试或画像数据,页面操作会影响后续教学管理、班级治理和数据分析。Codex 接收这类任务时,需要拿到真实源码路径、字段约束、接口规则和验收边界,才能生成可落地的项目代码。
#mermaid-svg-MfNfqdCZASjF9VEj{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-MfNfqdCZASjF9VEj .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-MfNfqdCZASjF9VEj .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-MfNfqdCZASjF9VEj .error-icon{fill:#552222;}#mermaid-svg-MfNfqdCZASjF9VEj .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-MfNfqdCZASjF9VEj .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-MfNfqdCZASjF9VEj .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-MfNfqdCZASjF9VEj .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-MfNfqdCZASjF9VEj .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-MfNfqdCZASjF9VEj .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-MfNfqdCZASjF9VEj .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-MfNfqdCZASjF9VEj .marker{fill:#333333;stroke:#333333;}#mermaid-svg-MfNfqdCZASjF9VEj .marker.cross{stroke:#333333;}#mermaid-svg-MfNfqdCZASjF9VEj svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-MfNfqdCZASjF9VEj p{margin:0;}#mermaid-svg-MfNfqdCZASjF9VEj .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-MfNfqdCZASjF9VEj .cluster-label text{fill:#333;}#mermaid-svg-MfNfqdCZASjF9VEj .cluster-label span{color:#333;}#mermaid-svg-MfNfqdCZASjF9VEj .cluster-label span p{background-color:transparent;}#mermaid-svg-MfNfqdCZASjF9VEj .label text,#mermaid-svg-MfNfqdCZASjF9VEj span{fill:#333;color:#333;}#mermaid-svg-MfNfqdCZASjF9VEj .node rect,#mermaid-svg-MfNfqdCZASjF9VEj .node circle,#mermaid-svg-MfNfqdCZASjF9VEj .node ellipse,#mermaid-svg-MfNfqdCZASjF9VEj .node polygon,#mermaid-svg-MfNfqdCZASjF9VEj .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-MfNfqdCZASjF9VEj .rough-node .label text,#mermaid-svg-MfNfqdCZASjF9VEj .node .label text,#mermaid-svg-MfNfqdCZASjF9VEj .image-shape .label,#mermaid-svg-MfNfqdCZASjF9VEj .icon-shape .label{text-anchor:middle;}#mermaid-svg-MfNfqdCZASjF9VEj .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-MfNfqdCZASjF9VEj .rough-node .label,#mermaid-svg-MfNfqdCZASjF9VEj .node .label,#mermaid-svg-MfNfqdCZASjF9VEj .image-shape .label,#mermaid-svg-MfNfqdCZASjF9VEj .icon-shape .label{text-align:center;}#mermaid-svg-MfNfqdCZASjF9VEj .node.clickable{cursor:pointer;}#mermaid-svg-MfNfqdCZASjF9VEj .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-MfNfqdCZASjF9VEj .arrowheadPath{fill:#333333;}#mermaid-svg-MfNfqdCZASjF9VEj .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-MfNfqdCZASjF9VEj .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-MfNfqdCZASjF9VEj .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-MfNfqdCZASjF9VEj .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-MfNfqdCZASjF9VEj .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-MfNfqdCZASjF9VEj .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-MfNfqdCZASjF9VEj .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-MfNfqdCZASjF9VEj .cluster text{fill:#333;}#mermaid-svg-MfNfqdCZASjF9VEj .cluster span{color:#333;}#mermaid-svg-MfNfqdCZASjF9VEj 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-MfNfqdCZASjF9VEj .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-MfNfqdCZASjF9VEj rect.text{fill:none;stroke-width:0;}#mermaid-svg-MfNfqdCZASjF9VEj .icon-shape,#mermaid-svg-MfNfqdCZASjF9VEj .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-MfNfqdCZASjF9VEj .icon-shape p,#mermaid-svg-MfNfqdCZASjF9VEj .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-MfNfqdCZASjF9VEj .icon-shape .label rect,#mermaid-svg-MfNfqdCZASjF9VEj .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-MfNfqdCZASjF9VEj .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-MfNfqdCZASjF9VEj .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-MfNfqdCZASjF9VEj :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}#mermaid-svg-MfNfqdCZASjF9VEj .input>*{fill:#EEF4FF!important;stroke:#5B8FF9!important;color:#1D39C4!important;stroke-width:1.2px!important;}#mermaid-svg-MfNfqdCZASjF9VEj .input span{fill:#EEF4FF!important;stroke:#5B8FF9!important;color:#1D39C4!important;stroke-width:1.2px!important;}#mermaid-svg-MfNfqdCZASjF9VEj .input tspan{fill:#1D39C4!important;}#mermaid-svg-MfNfqdCZASjF9VEj .design>*{fill:#F6FFED!important;stroke:#52C41A!important;color:#237804!important;stroke-width:1.2px!important;}#mermaid-svg-MfNfqdCZASjF9VEj .design span{fill:#F6FFED!important;stroke:#52C41A!important;color:#237804!important;stroke-width:1.2px!important;}#mermaid-svg-MfNfqdCZASjF9VEj .design tspan{fill:#237804!important;}#mermaid-svg-MfNfqdCZASjF9VEj .process>*{fill:#FFF7E6!important;stroke:#FA8C16!important;color:#AD4E00!important;stroke-width:1.2px!important;}#mermaid-svg-MfNfqdCZASjF9VEj .process span{fill:#FFF7E6!important;stroke:#FA8C16!important;color:#AD4E00!important;stroke-width:1.2px!important;}#mermaid-svg-MfNfqdCZASjF9VEj .process tspan{fill:#AD4E00!important;}#mermaid-svg-MfNfqdCZASjF9VEj .check>*{fill:#F9F0FF!important;stroke:#722ED1!important;color:#531DAB!important;stroke-width:1.2px!important;}#mermaid-svg-MfNfqdCZASjF9VEj .check span{fill:#F9F0FF!important;stroke:#722ED1!important;color:#531DAB!important;stroke-width:1.2px!important;}#mermaid-svg-MfNfqdCZASjF9VEj .check tspan{fill:#531DAB!important;}#mermaid-svg-MfNfqdCZASjF9VEj .output>*{fill:#E6FFFB!important;stroke:#13C2C2!important;color:#006D75!important;stroke-width:1.2px!important;}#mermaid-svg-MfNfqdCZASjF9VEj .output span{fill:#E6FFFB!important;stroke:#13C2C2!important;color:#006D75!important;stroke-width:1.2px!important;}#mermaid-svg-MfNfqdCZASjF9VEj .output tspan{fill:#006D75!important;} 教育管理需求
学生入学评估设计
页面结构
数据模型
接口规则
权限验收
Codex生成代码
| 需求层描述 | 设计层转换 | Codex 代码生成方向 |
|---|---|---|
| 性格测评 | 问卷答案生成 MBTI 维度结果 | 生成问卷面板、结果计算和 upsert 接口 |
| 入学资料 | 多条附件记录保存类型、文件和备注 | 生成上传、分页编辑和载荷构造 |
| 智能评估 | PromptBuilder 组合学生资料并调用腾讯 SSE | 生成 Prompt、SSE 调用、结果解析和状态回填 |
| 人工确认 | 模型结果进入表单和记录,不绕过确认 | 生成状态、错误、原文和响应载荷追踪 |
可以直接使用下面的Prompt进行模块功能的设计
text
请基于教育管理系统源码设计 学生入学评估 模块,不要编造代码中不存在的能力。
业务范围:维护学生性格测评结果、入学试卷图片、附件记录、评估请求载荷、模型响应、科目评分、总分、评估结论、状态和错误信息。
后端路径:server_backend/modules/User/views_app/StudentAdmissionAssessment.py、server_backend/modules/User/utils.py
前端路径:server_vue3/src/views/modules/User/StudentAdmissionAssessment/index.vue、crud.tsx、StudentManage/Drawers/StudentEntranceAssessmentDrawer/index.vue、StudentPersonalityQuestionnaireDrawer/index.vue
接口入口:/api/User/StudentAdmissionAssessment/、upsert_personality_assessment/、run_entrance_assessment/
核心字段:personality_answers、personality_dimension_scores、personality_type、personality_summary、entrance_exam_image_urls、entrance_attachment_records、entrance_attachment_analysis_items、entrance_exam_request_payload、entrance_exam_response_payload、entrance_assessment_prompt_text、entrance_assessment_model_raw_text、entrance_subject_scores、entrance_total_score、entrance_assessment_text、entrance_assessment_status、entrance_assessment_error、entrance_assessed_at
扩展能力:数据联动、LLM 内容生成、文件管理
请输出模块设计方案,包含页面结构、数据模型、接口规则、权限验收、异常边界和 Codex 分阶段生成项目代码的任务拆分。扩展能力只允许使用源码中已经存在的能力。
后端设计
后端设计重点不是堆接口,而是把学生入学评估沉淀成可复用的数据底座。当前模块基于 CustomModelViewSet、CustomModelRefSerializer、CustomModelInFilter 和 DefaultRouter 注册接口,结合模型字段、只读字段、范围筛选和动作接口形成稳定契约。
| 后端设计项 | 设计重点 | Codex 生成方向 |
|---|---|---|
| 性格接口 | upsert_personality_assessment 保存问卷与维度分 |
调用 build_personality_result 和摘要生成 |
| 入学评估 | run_entrance_assessment 构建请求载荷 |
支持自定义 api_url 或默认腾讯 SSE |
| Prompt 构建 | StudentEntranceAssessmentPromptBuilder 组织附件上下文 |
输出可解析 JSON 要求和额外说明 |
| 结果落库 | apply_entrance_result_payload 保存状态、分数、结论和原始文本 |
保留错误、模型原文和响应载荷便于复核 |
可以直接使用下面的Prompt进行后端代码的设计
text
请按 学生入学评估 的真实业务补齐或重构后端代码。
需要读取并遵守:
- server_backend/modules/User/views_app/StudentAdmissionAssessment.py、server_backend/modules/User/utils.py
- server_backend/modules/User/models.py
- server_backend/modules/User/urls.py
生成要求:
- 按 StudentAdmissionAssessment 模型字段设计序列化规则,不要新增无来源字段。
- 使用 CustomModelViewSet、CustomModelRefSerializer 和 CustomModelInFilter 保持项目风格。
- 补齐列表查询、详情、新增、编辑、删除或只读接口边界。
- 保留 read_only_fields、search_fields、range_fields 和权限校验逻辑。
- 扩展能力只实现:数据联动、LLM 内容生成、文件管理。
- 输出需要包含模型字段说明、接口清单、路由注册、筛选规则、权限规则和异常处理。
前端设计
前端设计重点不是把字段堆到页面上,而是让管理人员能高效完成学生入学评估的业务操作。当前模块使用 fs-page、fs-crud、createCrudOptions、接口封装和 Element Plus 组件组织列表、搜索、表单、抽屉或业务操作。
| 前端设计项 | 设计重点 | Codex 生成方向 |
|---|---|---|
| 测评问卷 | PersonalityQuestionnairePanel 分页单选题 |
生成答案映射、完成度和保存动作 |
| 入学资料 | StudentEntranceAssessmentDrawer 用 el-upload 上传附件 |
生成附件类型、文件列表、备注和分页编辑 |
| 评估调用 | RunEntranceAssessment 调用后端动作接口 |
生成 loading、成功、失败、状态回显 |
| 列表维护 | StudentAdmissionAssessment/crud.tsx 展示状态、类型、总分 |
生成筛选、编辑和结果字段展示 |
可以直接使用下面的Prompt进行前端代码的设计
text
请按 学生入学评估 的真实业务生成或补齐前端代码。
需要读取并遵守:
- server_vue3/src/views/modules/User/StudentAdmissionAssessment/index.vue、crud.tsx、StudentManage/Drawers/StudentEntranceAssessmentDrawer/index.vue、StudentPersonalityQuestionnaireDrawer/index.vue
- server_vue3/src/views/modules/User/StudentAdmissionAssessment/api.ts
生成要求:
- 使用项目现有 fs-crud、Element Plus、request 封装和 api.ts 风格。
- 生成列表查询、筛选区域、新增编辑表单、详情或抽屉交互、权限按钮和保存回显。
- 处理字段转换:问卷答案转 personality_answers,附件记录转 attachment_records/image_urls,模型返回回填状态、总分、科目分、结论和错误信息
- 扩展交互只实现:数据联动、LLM 内容生成、文件管理。
- 不要添加源码中未实现的扩展入口。
扩展功能
学生入学评估的扩展能力同时覆盖数据联动、LLM 内容生成和文件管理。问卷、附件、Prompt、模型响应与人工确认共同构成评估闭环。
| 扩展功能 | 主要用途 | 落地重点 |
|---|---|---|
| 数据联动 | 学生选择、问卷结果、附件记录和评估状态联动 | 以 id_student 作为评估记录主线 |
| LLM 内容生成 | 使用 PromptBuilder 和腾讯 SSE 生成入学评估结论 | 结果回填后人工确认并保留原始文本 |
| 文件管理 | 上传试卷、评语等入学资料并形成结构化记录 | 保存附件类型、URL、备注和解析项 |
数据联动
学生入学评估的数据联动体现在 id_student、personality_type、entrance_attachment_records、entrance_assessment_status、entrance_subject_scores、entrance_total_score。前端选择、搜索或抽屉打开后,会生成接口参数 id_student、personality_answers、attachment_records、image_urls、extra_prompt、api_url,后端按学生、班级、日期或类型筛选,再把结果回填到列表、表单或业务面板中。
#mermaid-svg-luZQfQBGlJErLz2t{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-luZQfQBGlJErLz2t .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-luZQfQBGlJErLz2t .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-luZQfQBGlJErLz2t .error-icon{fill:#552222;}#mermaid-svg-luZQfQBGlJErLz2t .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-luZQfQBGlJErLz2t .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-luZQfQBGlJErLz2t .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-luZQfQBGlJErLz2t .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-luZQfQBGlJErLz2t .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-luZQfQBGlJErLz2t .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-luZQfQBGlJErLz2t .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-luZQfQBGlJErLz2t .marker{fill:#333333;stroke:#333333;}#mermaid-svg-luZQfQBGlJErLz2t .marker.cross{stroke:#333333;}#mermaid-svg-luZQfQBGlJErLz2t svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-luZQfQBGlJErLz2t p{margin:0;}#mermaid-svg-luZQfQBGlJErLz2t .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-luZQfQBGlJErLz2t .cluster-label text{fill:#333;}#mermaid-svg-luZQfQBGlJErLz2t .cluster-label span{color:#333;}#mermaid-svg-luZQfQBGlJErLz2t .cluster-label span p{background-color:transparent;}#mermaid-svg-luZQfQBGlJErLz2t .label text,#mermaid-svg-luZQfQBGlJErLz2t span{fill:#333;color:#333;}#mermaid-svg-luZQfQBGlJErLz2t .node rect,#mermaid-svg-luZQfQBGlJErLz2t .node circle,#mermaid-svg-luZQfQBGlJErLz2t .node ellipse,#mermaid-svg-luZQfQBGlJErLz2t .node polygon,#mermaid-svg-luZQfQBGlJErLz2t .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-luZQfQBGlJErLz2t .rough-node .label text,#mermaid-svg-luZQfQBGlJErLz2t .node .label text,#mermaid-svg-luZQfQBGlJErLz2t .image-shape .label,#mermaid-svg-luZQfQBGlJErLz2t .icon-shape .label{text-anchor:middle;}#mermaid-svg-luZQfQBGlJErLz2t .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-luZQfQBGlJErLz2t .rough-node .label,#mermaid-svg-luZQfQBGlJErLz2t .node .label,#mermaid-svg-luZQfQBGlJErLz2t .image-shape .label,#mermaid-svg-luZQfQBGlJErLz2t .icon-shape .label{text-align:center;}#mermaid-svg-luZQfQBGlJErLz2t .node.clickable{cursor:pointer;}#mermaid-svg-luZQfQBGlJErLz2t .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-luZQfQBGlJErLz2t .arrowheadPath{fill:#333333;}#mermaid-svg-luZQfQBGlJErLz2t .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-luZQfQBGlJErLz2t .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-luZQfQBGlJErLz2t .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-luZQfQBGlJErLz2t .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-luZQfQBGlJErLz2t .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-luZQfQBGlJErLz2t .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-luZQfQBGlJErLz2t .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-luZQfQBGlJErLz2t .cluster text{fill:#333;}#mermaid-svg-luZQfQBGlJErLz2t .cluster span{color:#333;}#mermaid-svg-luZQfQBGlJErLz2t 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-luZQfQBGlJErLz2t .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-luZQfQBGlJErLz2t rect.text{fill:none;stroke-width:0;}#mermaid-svg-luZQfQBGlJErLz2t .icon-shape,#mermaid-svg-luZQfQBGlJErLz2t .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-luZQfQBGlJErLz2t .icon-shape p,#mermaid-svg-luZQfQBGlJErLz2t .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-luZQfQBGlJErLz2t .icon-shape .label rect,#mermaid-svg-luZQfQBGlJErLz2t .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-luZQfQBGlJErLz2t .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-luZQfQBGlJErLz2t .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-luZQfQBGlJErLz2t :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}#mermaid-svg-luZQfQBGlJErLz2t .input>*{fill:#EEF4FF!important;stroke:#5B8FF9!important;color:#1D39C4!important;stroke-width:1.2px!important;}#mermaid-svg-luZQfQBGlJErLz2t .input span{fill:#EEF4FF!important;stroke:#5B8FF9!important;color:#1D39C4!important;stroke-width:1.2px!important;}#mermaid-svg-luZQfQBGlJErLz2t .input tspan{fill:#1D39C4!important;}#mermaid-svg-luZQfQBGlJErLz2t .process>*{fill:#FFF7E6!important;stroke:#FA8C16!important;color:#AD4E00!important;stroke-width:1.2px!important;}#mermaid-svg-luZQfQBGlJErLz2t .process span{fill:#FFF7E6!important;stroke:#FA8C16!important;color:#AD4E00!important;stroke-width:1.2px!important;}#mermaid-svg-luZQfQBGlJErLz2t .process tspan{fill:#AD4E00!important;}#mermaid-svg-luZQfQBGlJErLz2t .output>*{fill:#E6FFFB!important;stroke:#13C2C2!important;color:#006D75!important;stroke-width:1.2px!important;}#mermaid-svg-luZQfQBGlJErLz2t .output span{fill:#E6FFFB!important;stroke:#13C2C2!important;color:#006D75!important;stroke-width:1.2px!important;}#mermaid-svg-luZQfQBGlJErLz2t .output tspan{fill:#006D75!important;} 结果阶段
处理阶段
输入阶段
筛选条件
表单选择
抽屉打开
生成参数
请求接口
字段转换
刷新列表
表单回显
状态更新
交给 Codex 生成时,要明确联动边界:只处理源码中存在的字段和接口,不把其他学生画像、考试分析或 AI 评估能力塞进本模块。保存动作必须保证 问卷与附件结果回填同一学生评估记录,模型输出保留可追踪状态。
可以直接使用下面的Prompt进行数据联动设计
text
请为 学生入学评估 设计数据联动实现。
联动字段:id_student、personality_type、entrance_attachment_records、entrance_assessment_status、entrance_subject_scores、entrance_total_score
接口参数:id_student、personality_answers、attachment_records、image_urls、extra_prompt、api_url
结果回填:问卷与附件结果回填同一学生评估记录,模型输出保留可追踪状态
源码边界:只使用当前模块已经存在的模型字段、api.ts 请求和页面组件,不新增未实现的业务能力。
请输出联动流程、字段映射表、异常处理、保存回显规则和需要修改的文件路径。
LLM 内容生成
学生入学评估的 LLM 能力服务于入学评估结论生成。后端 StudentEntranceAssessmentPromptBuilder 把学生基础信息、性格结果、附件记录和额外要求组合成 Prompt,再通过腾讯 SSE 智能体返回结构化评估结果。生成内容不能直接绕过人工确认成为正式业务数据,页面需要展示状态、分数、结论和错误信息。
#mermaid-svg-Sw6RzWMFv8F6lYGC{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-Sw6RzWMFv8F6lYGC .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-Sw6RzWMFv8F6lYGC .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-Sw6RzWMFv8F6lYGC .error-icon{fill:#552222;}#mermaid-svg-Sw6RzWMFv8F6lYGC .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-Sw6RzWMFv8F6lYGC .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-Sw6RzWMFv8F6lYGC .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-Sw6RzWMFv8F6lYGC .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-Sw6RzWMFv8F6lYGC .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-Sw6RzWMFv8F6lYGC .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-Sw6RzWMFv8F6lYGC .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-Sw6RzWMFv8F6lYGC .marker{fill:#333333;stroke:#333333;}#mermaid-svg-Sw6RzWMFv8F6lYGC .marker.cross{stroke:#333333;}#mermaid-svg-Sw6RzWMFv8F6lYGC svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-Sw6RzWMFv8F6lYGC p{margin:0;}#mermaid-svg-Sw6RzWMFv8F6lYGC .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-Sw6RzWMFv8F6lYGC .cluster-label text{fill:#333;}#mermaid-svg-Sw6RzWMFv8F6lYGC .cluster-label span{color:#333;}#mermaid-svg-Sw6RzWMFv8F6lYGC .cluster-label span p{background-color:transparent;}#mermaid-svg-Sw6RzWMFv8F6lYGC .label text,#mermaid-svg-Sw6RzWMFv8F6lYGC span{fill:#333;color:#333;}#mermaid-svg-Sw6RzWMFv8F6lYGC .node rect,#mermaid-svg-Sw6RzWMFv8F6lYGC .node circle,#mermaid-svg-Sw6RzWMFv8F6lYGC .node ellipse,#mermaid-svg-Sw6RzWMFv8F6lYGC .node polygon,#mermaid-svg-Sw6RzWMFv8F6lYGC .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-Sw6RzWMFv8F6lYGC .rough-node .label text,#mermaid-svg-Sw6RzWMFv8F6lYGC .node .label text,#mermaid-svg-Sw6RzWMFv8F6lYGC .image-shape .label,#mermaid-svg-Sw6RzWMFv8F6lYGC .icon-shape .label{text-anchor:middle;}#mermaid-svg-Sw6RzWMFv8F6lYGC .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-Sw6RzWMFv8F6lYGC .rough-node .label,#mermaid-svg-Sw6RzWMFv8F6lYGC .node .label,#mermaid-svg-Sw6RzWMFv8F6lYGC .image-shape .label,#mermaid-svg-Sw6RzWMFv8F6lYGC .icon-shape .label{text-align:center;}#mermaid-svg-Sw6RzWMFv8F6lYGC .node.clickable{cursor:pointer;}#mermaid-svg-Sw6RzWMFv8F6lYGC .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-Sw6RzWMFv8F6lYGC .arrowheadPath{fill:#333333;}#mermaid-svg-Sw6RzWMFv8F6lYGC .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-Sw6RzWMFv8F6lYGC .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-Sw6RzWMFv8F6lYGC .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-Sw6RzWMFv8F6lYGC .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-Sw6RzWMFv8F6lYGC .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-Sw6RzWMFv8F6lYGC .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-Sw6RzWMFv8F6lYGC .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-Sw6RzWMFv8F6lYGC .cluster text{fill:#333;}#mermaid-svg-Sw6RzWMFv8F6lYGC .cluster span{color:#333;}#mermaid-svg-Sw6RzWMFv8F6lYGC 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-Sw6RzWMFv8F6lYGC .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-Sw6RzWMFv8F6lYGC rect.text{fill:none;stroke-width:0;}#mermaid-svg-Sw6RzWMFv8F6lYGC .icon-shape,#mermaid-svg-Sw6RzWMFv8F6lYGC .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-Sw6RzWMFv8F6lYGC .icon-shape p,#mermaid-svg-Sw6RzWMFv8F6lYGC .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-Sw6RzWMFv8F6lYGC .icon-shape .label rect,#mermaid-svg-Sw6RzWMFv8F6lYGC .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-Sw6RzWMFv8F6lYGC .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-Sw6RzWMFv8F6lYGC .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-Sw6RzWMFv8F6lYGC :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}#mermaid-svg-Sw6RzWMFv8F6lYGC .input>*{fill:#EEF4FF!important;stroke:#5B8FF9!important;color:#1D39C4!important;stroke-width:1.2px!important;}#mermaid-svg-Sw6RzWMFv8F6lYGC .input span{fill:#EEF4FF!important;stroke:#5B8FF9!important;color:#1D39C4!important;stroke-width:1.2px!important;}#mermaid-svg-Sw6RzWMFv8F6lYGC .input tspan{fill:#1D39C4!important;}#mermaid-svg-Sw6RzWMFv8F6lYGC .process>*{fill:#FFF7E6!important;stroke:#FA8C16!important;color:#AD4E00!important;stroke-width:1.2px!important;}#mermaid-svg-Sw6RzWMFv8F6lYGC .process span{fill:#FFF7E6!important;stroke:#FA8C16!important;color:#AD4E00!important;stroke-width:1.2px!important;}#mermaid-svg-Sw6RzWMFv8F6lYGC .process tspan{fill:#AD4E00!important;}#mermaid-svg-Sw6RzWMFv8F6lYGC .output>*{fill:#E6FFFB!important;stroke:#13C2C2!important;color:#006D75!important;stroke-width:1.2px!important;}#mermaid-svg-Sw6RzWMFv8F6lYGC .output span{fill:#E6FFFB!important;stroke:#13C2C2!important;color:#006D75!important;stroke-width:1.2px!important;}#mermaid-svg-Sw6RzWMFv8F6lYGC .output tspan{fill:#006D75!important;} 结果阶段
处理阶段
输入阶段
学生信息
附件记录
额外要求
构建Prompt
SSE调用
解析结果
回填表单
人工确认
保存记录
交给 Codex 生成时,要强调模型返回的不确定性。entrance_assessment_status、entrance_assessment_error、entrance_assessment_model_raw_text 和 entrance_exam_response_payload 必须保留,便于追踪失败原因和人工复核。
可以直接使用下面的Prompt进行LLM功能设计
text
请为 学生入学评估 设计 LLM 入学评估能力。
真实代码依据:StudentEntranceAssessmentPromptBuilder、run_entrance_assessment_by_tencent、call_tencent_subject_help_sse、parse_entrance_assessment_ai_text。
要求:生成 Prompt、调用腾讯 SSE、解析 subject_scores、total_score、assessment_text、attachment_analysis_items,并把结果回填表单供人工确认。
不要让模型结果绕过页面确认直接成为不可追踪的正式数据。
文件管理
学生入学评估的文件管理体现在入学资料上传与结构化记录。前端通过 el-upload 调用 /api/system/file/,按 attachment_type、files、remark 组织资料;后端归一化 entrance_attachment_records、entrance_exam_image_urls 和 entrance_attachment_analysis_items。
#mermaid-svg-wJFFBSnu61uR2sCx{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-wJFFBSnu61uR2sCx .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-wJFFBSnu61uR2sCx .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-wJFFBSnu61uR2sCx .error-icon{fill:#552222;}#mermaid-svg-wJFFBSnu61uR2sCx .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-wJFFBSnu61uR2sCx .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-wJFFBSnu61uR2sCx .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-wJFFBSnu61uR2sCx .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-wJFFBSnu61uR2sCx .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-wJFFBSnu61uR2sCx .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-wJFFBSnu61uR2sCx .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-wJFFBSnu61uR2sCx .marker{fill:#333333;stroke:#333333;}#mermaid-svg-wJFFBSnu61uR2sCx .marker.cross{stroke:#333333;}#mermaid-svg-wJFFBSnu61uR2sCx svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-wJFFBSnu61uR2sCx p{margin:0;}#mermaid-svg-wJFFBSnu61uR2sCx .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-wJFFBSnu61uR2sCx .cluster-label text{fill:#333;}#mermaid-svg-wJFFBSnu61uR2sCx .cluster-label span{color:#333;}#mermaid-svg-wJFFBSnu61uR2sCx .cluster-label span p{background-color:transparent;}#mermaid-svg-wJFFBSnu61uR2sCx .label text,#mermaid-svg-wJFFBSnu61uR2sCx span{fill:#333;color:#333;}#mermaid-svg-wJFFBSnu61uR2sCx .node rect,#mermaid-svg-wJFFBSnu61uR2sCx .node circle,#mermaid-svg-wJFFBSnu61uR2sCx .node ellipse,#mermaid-svg-wJFFBSnu61uR2sCx .node polygon,#mermaid-svg-wJFFBSnu61uR2sCx .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-wJFFBSnu61uR2sCx .rough-node .label text,#mermaid-svg-wJFFBSnu61uR2sCx .node .label text,#mermaid-svg-wJFFBSnu61uR2sCx .image-shape .label,#mermaid-svg-wJFFBSnu61uR2sCx .icon-shape .label{text-anchor:middle;}#mermaid-svg-wJFFBSnu61uR2sCx .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-wJFFBSnu61uR2sCx .rough-node .label,#mermaid-svg-wJFFBSnu61uR2sCx .node .label,#mermaid-svg-wJFFBSnu61uR2sCx .image-shape .label,#mermaid-svg-wJFFBSnu61uR2sCx .icon-shape .label{text-align:center;}#mermaid-svg-wJFFBSnu61uR2sCx .node.clickable{cursor:pointer;}#mermaid-svg-wJFFBSnu61uR2sCx .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-wJFFBSnu61uR2sCx .arrowheadPath{fill:#333333;}#mermaid-svg-wJFFBSnu61uR2sCx .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-wJFFBSnu61uR2sCx .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-wJFFBSnu61uR2sCx .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-wJFFBSnu61uR2sCx .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-wJFFBSnu61uR2sCx .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-wJFFBSnu61uR2sCx .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-wJFFBSnu61uR2sCx .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-wJFFBSnu61uR2sCx .cluster text{fill:#333;}#mermaid-svg-wJFFBSnu61uR2sCx .cluster span{color:#333;}#mermaid-svg-wJFFBSnu61uR2sCx 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-wJFFBSnu61uR2sCx .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-wJFFBSnu61uR2sCx rect.text{fill:none;stroke-width:0;}#mermaid-svg-wJFFBSnu61uR2sCx .icon-shape,#mermaid-svg-wJFFBSnu61uR2sCx .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-wJFFBSnu61uR2sCx .icon-shape p,#mermaid-svg-wJFFBSnu61uR2sCx .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-wJFFBSnu61uR2sCx .icon-shape .label rect,#mermaid-svg-wJFFBSnu61uR2sCx .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-wJFFBSnu61uR2sCx .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-wJFFBSnu61uR2sCx .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-wJFFBSnu61uR2sCx :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}#mermaid-svg-wJFFBSnu61uR2sCx .input>*{fill:#EEF4FF!important;stroke:#5B8FF9!important;color:#1D39C4!important;stroke-width:1.2px!important;}#mermaid-svg-wJFFBSnu61uR2sCx .input span{fill:#EEF4FF!important;stroke:#5B8FF9!important;color:#1D39C4!important;stroke-width:1.2px!important;}#mermaid-svg-wJFFBSnu61uR2sCx .input tspan{fill:#1D39C4!important;}#mermaid-svg-wJFFBSnu61uR2sCx .process>*{fill:#FFF7E6!important;stroke:#FA8C16!important;color:#AD4E00!important;stroke-width:1.2px!important;}#mermaid-svg-wJFFBSnu61uR2sCx .process span{fill:#FFF7E6!important;stroke:#FA8C16!important;color:#AD4E00!important;stroke-width:1.2px!important;}#mermaid-svg-wJFFBSnu61uR2sCx .process tspan{fill:#AD4E00!important;}#mermaid-svg-wJFFBSnu61uR2sCx .output>*{fill:#E6FFFB!important;stroke:#13C2C2!important;color:#006D75!important;stroke-width:1.2px!important;}#mermaid-svg-wJFFBSnu61uR2sCx .output span{fill:#E6FFFB!important;stroke:#13C2C2!important;color:#006D75!important;stroke-width:1.2px!important;}#mermaid-svg-wJFFBSnu61uR2sCx .output tspan{fill:#006D75!important;} 上传资料
分类记录
生成载荷
评估回填
Codex 生成时要保留附件类型校验和分页编辑体验。识别或分析结果不能直接入库为正式结论,需要先进入可编辑结构,由管理人员核对后保存。
可以直接使用下面的Prompt进行文件管理功能设计
text
请为 学生入学评估 设计文件管理能力。
真实交互:el-upload 上传入学资料,附件字段包含 attachment_type、files、remark,后端保存 entrance_attachment_records、entrance_exam_image_urls、entrance_attachment_analysis_items。
要求:支持多条资料记录、每条记录多文件、附件类型校验、失败提示、评估结果回显和人工确认。
不要添加源码中未实现的文件归档能力。
Codex开发标准
使用 Codex 开发学生入学评估时,不能直接让模型自由写代码。PDD 定义业务边界和验收口径,SOP 约束目录、文件职责和开发顺序,接口权限规则保证生成代码能进入现有系统。
#mermaid-svg-ftUpgqLK2ohxmSxe{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-ftUpgqLK2ohxmSxe .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-ftUpgqLK2ohxmSxe .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-ftUpgqLK2ohxmSxe .error-icon{fill:#552222;}#mermaid-svg-ftUpgqLK2ohxmSxe .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-ftUpgqLK2ohxmSxe .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-ftUpgqLK2ohxmSxe .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-ftUpgqLK2ohxmSxe .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-ftUpgqLK2ohxmSxe .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-ftUpgqLK2ohxmSxe .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-ftUpgqLK2ohxmSxe .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-ftUpgqLK2ohxmSxe .marker{fill:#333333;stroke:#333333;}#mermaid-svg-ftUpgqLK2ohxmSxe .marker.cross{stroke:#333333;}#mermaid-svg-ftUpgqLK2ohxmSxe svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-ftUpgqLK2ohxmSxe p{margin:0;}#mermaid-svg-ftUpgqLK2ohxmSxe .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-ftUpgqLK2ohxmSxe .cluster-label text{fill:#333;}#mermaid-svg-ftUpgqLK2ohxmSxe .cluster-label span{color:#333;}#mermaid-svg-ftUpgqLK2ohxmSxe .cluster-label span p{background-color:transparent;}#mermaid-svg-ftUpgqLK2ohxmSxe .label text,#mermaid-svg-ftUpgqLK2ohxmSxe span{fill:#333;color:#333;}#mermaid-svg-ftUpgqLK2ohxmSxe .node rect,#mermaid-svg-ftUpgqLK2ohxmSxe .node circle,#mermaid-svg-ftUpgqLK2ohxmSxe .node ellipse,#mermaid-svg-ftUpgqLK2ohxmSxe .node polygon,#mermaid-svg-ftUpgqLK2ohxmSxe .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-ftUpgqLK2ohxmSxe .rough-node .label text,#mermaid-svg-ftUpgqLK2ohxmSxe .node .label text,#mermaid-svg-ftUpgqLK2ohxmSxe .image-shape .label,#mermaid-svg-ftUpgqLK2ohxmSxe .icon-shape .label{text-anchor:middle;}#mermaid-svg-ftUpgqLK2ohxmSxe .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-ftUpgqLK2ohxmSxe .rough-node .label,#mermaid-svg-ftUpgqLK2ohxmSxe .node .label,#mermaid-svg-ftUpgqLK2ohxmSxe .image-shape .label,#mermaid-svg-ftUpgqLK2ohxmSxe .icon-shape .label{text-align:center;}#mermaid-svg-ftUpgqLK2ohxmSxe .node.clickable{cursor:pointer;}#mermaid-svg-ftUpgqLK2ohxmSxe .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-ftUpgqLK2ohxmSxe .arrowheadPath{fill:#333333;}#mermaid-svg-ftUpgqLK2ohxmSxe .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-ftUpgqLK2ohxmSxe .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-ftUpgqLK2ohxmSxe .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-ftUpgqLK2ohxmSxe .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-ftUpgqLK2ohxmSxe .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-ftUpgqLK2ohxmSxe .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-ftUpgqLK2ohxmSxe .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-ftUpgqLK2ohxmSxe .cluster text{fill:#333;}#mermaid-svg-ftUpgqLK2ohxmSxe .cluster span{color:#333;}#mermaid-svg-ftUpgqLK2ohxmSxe 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-ftUpgqLK2ohxmSxe .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-ftUpgqLK2ohxmSxe rect.text{fill:none;stroke-width:0;}#mermaid-svg-ftUpgqLK2ohxmSxe .icon-shape,#mermaid-svg-ftUpgqLK2ohxmSxe .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-ftUpgqLK2ohxmSxe .icon-shape p,#mermaid-svg-ftUpgqLK2ohxmSxe .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-ftUpgqLK2ohxmSxe .icon-shape .label rect,#mermaid-svg-ftUpgqLK2ohxmSxe .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-ftUpgqLK2ohxmSxe .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-ftUpgqLK2ohxmSxe .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-ftUpgqLK2ohxmSxe :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}#mermaid-svg-ftUpgqLK2ohxmSxe .input>*{fill:#EEF4FF!important;stroke:#5B8FF9!important;color:#1D39C4!important;stroke-width:1.2px!important;}#mermaid-svg-ftUpgqLK2ohxmSxe .input span{fill:#EEF4FF!important;stroke:#5B8FF9!important;color:#1D39C4!important;stroke-width:1.2px!important;}#mermaid-svg-ftUpgqLK2ohxmSxe .input tspan{fill:#1D39C4!important;}#mermaid-svg-ftUpgqLK2ohxmSxe .design>*{fill:#F6FFED!important;stroke:#52C41A!important;color:#237804!important;stroke-width:1.2px!important;}#mermaid-svg-ftUpgqLK2ohxmSxe .design span{fill:#F6FFED!important;stroke:#52C41A!important;color:#237804!important;stroke-width:1.2px!important;}#mermaid-svg-ftUpgqLK2ohxmSxe .design tspan{fill:#237804!important;}#mermaid-svg-ftUpgqLK2ohxmSxe .dev>*{fill:#FFF7E6!important;stroke:#FA8C16!important;color:#AD4E00!important;stroke-width:1.2px!important;}#mermaid-svg-ftUpgqLK2ohxmSxe .dev span{fill:#FFF7E6!important;stroke:#FA8C16!important;color:#AD4E00!important;stroke-width:1.2px!important;}#mermaid-svg-ftUpgqLK2ohxmSxe .dev tspan{fill:#AD4E00!important;}#mermaid-svg-ftUpgqLK2ohxmSxe .check>*{fill:#F9F0FF!important;stroke:#722ED1!important;color:#531DAB!important;stroke-width:1.2px!important;}#mermaid-svg-ftUpgqLK2ohxmSxe .check span{fill:#F9F0FF!important;stroke:#722ED1!important;color:#531DAB!important;stroke-width:1.2px!important;}#mermaid-svg-ftUpgqLK2ohxmSxe .check tspan{fill:#531DAB!important;} 验收交付
Codex开发
模块设计
输入约束
需求边界
PDD设计
SOP目录
接口权限
后端设计
前端设计
扩展功能
读取上下文
生成后端
生成前端
补齐扩展
功能自检
PDD验收
问题修复
模块交付
SOP 标准
SOP 用来约束代码目录、文件职责和开发顺序。学生入学评估的目录结构需要贴合现有 User 模块,不应为单篇文章另起一套风格。
text
server_backend/modules/User/
models.py
views_app/StudentAdmissionAssessment.py
utils.py
urls.py
server_vue3/src/views/modules/User/StudentAdmissionAssessment/
index.vue
crud.tsx
api.ts
server_vue3/src/views/modules/User/StudentManage/Drawers/
StudentPersonalityQuestionnaireDrawer/index.vue
StudentEntranceAssessmentDrawer/index.vue
server_vue3/src/views/modules/User/StudentManage/components/PersonalityQuestionnairePanel/
index.vue
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/StudentAdmissionAssessment.py、server_backend/modules/User/utils.py、server_vue3/src/views/modules/User/StudentAdmissionAssessment/index.vue、crud.tsx、StudentManage/Drawers/StudentEntranceAssessmentDrawer/index.vue、StudentPersonalityQuestionnaireDrawer/index.vue。
- SOP 需要约束模型字段、接口视图、路由注册、前端 crud 配置、接口封装、权限按钮、保存回显和扩展能力。
- 扩展能力只包含:数据联动、LLM 内容生成、文件管理。
- 文档完成后,再按 SOP 分阶段生成项目代码。
PDD 标准
PDD 是学生入学评估的设计与验收文档,用于判断 Codex 输出是否符合真实业务。验收不能只看页面能否打开,还要检查字段、接口、权限、筛选、联动和扩展能力是否匹配源码。
| 验收维度 | 验收重点 | 通过标准 |
|---|---|---|
| 业务目标 | 维护学生性格测评结果、入学试卷图片、附件记录、评估请求载荷、模型响应、科目评分、总分、评估结论、状态和错误信息。 | 页面和接口能支撑模块业务闭环 |
| 页面结构 | server_vue3/src/views/modules/User/StudentAdmissionAssessment/index.vue、crud.tsx、StudentManage/Drawers/StudentEntranceAssessmentDrawer/index.vue、StudentPersonalityQuestionnaireDrawer/index.vue | 列表、表单、抽屉或操作按钮与源码一致 |
| 数据模型 | personality_answers、personality_dimension_scores、personality_type、personality_summary、entrance_exam_image_urls、entrance_attachment_records、entrance_attachment_analysis_items、entrance_exam_request_payload、entrance_exam_response_payload、entrance_assessment_prompt_text、entrance_assessment_model_raw_text、entrance_subject_scores、entrance_total_score、entrance_assessment_text、entrance_assessment_status、entrance_assessment_error、entrance_assessed_at | 字段类型、只读字段、唯一约束不偏离模型 |
| 接口规则 | /api/User/StudentAdmissionAssessment/、upsert_personality_assessment/、run_entrance_assessment/ | 列表、保存、删除、动作接口请求参数正确 |
| 权限控制 | 登录用户、班级范围或系统权限 | 非授权数据不可越权访问 |
| 测试用例 | 正常、异常、空数据、回显和删除 | test-cases.md 覆盖主要路径 |
| 数据联动 | 学生、问卷、附件、评估状态联动 | 评估记录按 id_student 唯一回显 |
| LLM 生成 | Prompt、SSE、解析、回填 | 结果有状态、有原文、有错误追踪 |
| 文件管理 | 附件上传、分类、载荷构造 | 文件 URL 和附件记录保存正确 |
可以直接使用下面的Prompt进行PDD 验收
text
请根据 docs/modules/学生入学评估/pdd.md 对 学生入学评估 进行验收。
验收范围:业务目标、页面结构、数据模型、接口规则、权限控制、测试用例、数据联动、LLM 内容生成、文件管理。
请输出验收结果表,字段包含:验收项、通过状态、发现问题、涉及文件、修复建议。不要只给结论;必须指出未通过项的具体文件位置和建议改法。
总结
学生入学评估把新生基础信息、性格测评、入学资料和智能体评估组织成可复核记录,是新生画像和后续教学支持的入口模块。
Codex 生成该模块时,应由 PDD 约束问卷、附件、Prompt 和回填字段,由 SOP 约束后端动作接口与前端抽屉流程,再用 Prompt 分阶段实现 LLM 与文件管理。