aiPptDialogTest.html 4.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. <!doctype html>
  2. <html lang="zh-CN"><head><meta charset="UTF-8"><title>AI课件流程回归</title></head><body><div id="app"></div>
  3. <script type="module">
  4. import { createApp, h, ref, nextTick } from "vue"
  5. import { createRouter, createMemoryHistory } from "vue-router"
  6. import { store, useSlidesStore } from "/src/store/index.ts"
  7. import "/src/router/index.ts"
  8. import { httpAxios } from "/src/api/ApiInstance.ts"
  9. import { setToken } from "/src/libs/auth.ts"
  10. import AiDialog from "/src/views/Editor/EditorHeader/AiCoursewareDialog.vue"
  11. import { inspectAiPptResources } from "/src/utils/aiPptResources.ts"
  12. import "/src/assets/styles/global.scss"
  13. import "/src/assets/styles/elementTheme.scss"
  14. import "/src/assets/styles/prosemirror.scss"
  15. // 所有业务接口使用本地夹具,不调用生成服务,不修改任何线上课件。
  16. setToken("local-ai-ppt-regression-only")
  17. const generated = ref(0)
  18. const resourceCheck = ref("检查中")
  19. const types = ["cover", "scene_intro", "objectives", "music_knowledge", "rhythm_practice", "performance_activity", "practice_check", "creative_activity", "summary"]
  20. const layouts = ["cover_scene", "hero_focus", "objectives", "split_content", "diagram_focus", "activity", "text_focus", "activity", "summary"]
  21. const outline = {
  22. title: "声音强弱课堂测试", gradeName: "一年级", textbookName: "本地测试教材", chapterName: "声音的强弱", courseType: "music", templateId: "ethnic-flower",
  23. textbookResearch: { exactMatch: true, confidence: "HIGH", contentSummary: "仅用于软件回归的教学夹具", teachingObjectives: ["能用声音表现强弱"], sources: [{ title: "本地测试依据(非真实教材认证)", url: "https://example.com/test-only" }] },
  24. pages: types.map((type, index) => ({ pageNo:index+1, type, title: index === 0 ? "声音强弱课堂测试" : `任务${index}:表现声音强弱`,
  25. studentContent:{ points:["用声音表现强弱变化", "说出判断的理由"] }, durationMinutes:index===0?8:4, objectiveIds:["1"],
  26. teachingPurpose:"表现声音强弱", learningEvidence:"能表现强弱并说明理由", speakerNotes:"示范后请学生练习,根据表现及时反馈。",
  27. classroomAction:{studentTask:"完成声音强弱挑战", teacherInstruction:"示范强弱对比,邀请学生练习后互评"},
  28. interaction:type==="practice_check"?{question:"哪种方式声音更轻?",options:["轻声哼唱","大声呼喊"],answer:"轻声哼唱",explanation:"根据声音强弱判断"}:undefined,
  29. visualPlan:{layout:layouts[index]}, imageKeywords:[] }))
  30. }
  31. httpAxios.axioseRquest = async config => {
  32. let data
  33. if (config.url.endsWith("/outline")) data = structuredClone(outline)
  34. else if (config.url.endsWith("/generate")) { generated.value++; data={taskId:"local-task",status:"PENDING",progress:0} }
  35. else if (config.url.endsWith("/result")) data={outline:structuredClone(outline),context:{resources:[]}}
  36. else if (config.url.includes("/task/")) data={taskId:"local-task",status:"DONE",progress:100}
  37. else throw new Error("测试禁止未声明的业务请求")
  38. return {data:{code:200,data}}
  39. }
  40. const router=createRouter({history:createMemoryHistory(),routes:[{path:"/",component:{render:()=>null}}]})
  41. await router.push("/?id=local-ai-ppt-regression")
  42. await router.isReady()
  43. const app=createApp({setup(){
  44. const visible=ref(false)
  45. nextTick(()=>{visible.value=true})
  46. return ()=>h("main",[
  47. h("p",{id:"test-status"},`生成请求次数:${generated.value};资源检查:${resourceCheck.value}`),
  48. h("button",{onClick:()=>{visible.value=true}},"打开AI课件"),
  49. h(AiDialog,{visible:visible.value,"onUpdate:visible":value=>{visible.value=value}})
  50. ])
  51. }})
  52. app.use(store).use(router).mount("#app")
  53. // 使用浏览器真实图片解码验证损坏资源阻断及谱图等比缩放。
  54. const svg='data:image/svg+xml;charset=utf-8,'+encodeURIComponent('<svg xmlns="http://www.w3.org/2000/svg" width="400" height="100"><rect width="400" height="100" fill="white"/></svg>')
  55. const score={id:"image",type:"image",src:svg,left:0,top:0,width:200,height:200}
  56. const slides=[{elements:[score,{id:"broken",type:"image",src:"data:image/png;base64,invalid",left:0,top:0,width:100,height:100}]}]
  57. const issues=await inspectAiPptResources({pages:[{resourceBindings:[{resourceType:"MUSIC",scoreImageUrl:svg}]}]},slides)
  58. resourceCheck.value=issues.length===1&&score.width===200&&score.height===50&&score.top===75?"通过(损坏图片阻断、谱图等比缩放)":"失败"
  59. </script></body></html>