yonge hai 4 semanas
pai
achega
898d8862be

+ 1 - 1
dist/assets/index-DJr8z2rx.js → dist/assets/index-BdVynuBN.js

@@ -1,4 +1,4 @@
-import{cH as pw,cI as gw,aG as mw,cJ as yw,cK as Sw,cL as bw,cM as xw,ah as Wt,cN as Cw,cO as ww,cP as Tw,cQ as Iw,aM as _w,aF as Aw,cR as Ew,aB as d1,bg as Pw,cS as Mw,cT as Rw,cU as Dw,cV as Lw,cW as kw,cX as Ow,cY as Bw,aE as Nw,cZ as Fw,s as Te,bl as $w,al as je,ag as Fe,af as he,ak as Z,c_ as zw,c$ as Uw,d0 as Hw,d1 as Vw,bk as Gw,cy as cl,aS as wv,aq as Ye,d2 as Ww,d3 as jw,a5 as ze,d4 as Kw,d5 as Xw,d6 as Yw,d7 as Zw,d8 as Qw,d9 as Jw,da as qw,db as eT,dc as tT,dd as rT,de as nT,v as iT,df as aT,dg as oT,dh as sT,aW as lT,di as uT,dj as cT,dk as fT,dl as dT,dm as hT,ay as ur,dn as vT,dp as pT,dq as gT,dr as mT,A as yT,ds as ST,dt as bT,bq as xT,du as CT,dv as wT,dw as TT,ap as IT,ac as Tv,ai as ct,dx as _T,au as xe,dy as AT,X as h1,y as ET,dz as PT,aP as MT,dA as RT,w as Er,dB as DT,dC as LT,H as kT,dD as OT,bA as hn,aD as BT,ae as ne,bQ as ea,$ as Tc,dE as NT,bP as ta,dF as FT,aC as $T,aO as zT,R as fe,dG as UT,br as ih,b3 as _r,aj as Hs,b1 as lt,b2 as Ua,an as Iv,dH as HT,dI as VT,dJ as GT,dK as WT,dL as jT,dM as KT,dN as XT,Q as YT,dO as ZT,dP as QT,dQ as JT,at as Mt,dR as qT,aR as eI,aY as tI,ad as fl,aZ as rI,dS as nI,dT as iI,dU as aI,P as le,a6 as oI,dV as sI,dW as lI,dX as uI,dY as cI,a7 as fI,dZ as dI,bN as hI,d_ as vI,d$ as pI,bM as gI,b4 as v1,aA as _v,e0 as mI,e1 as yI,E as Jt,x as SI,e2 as bI,e3 as xI,e4 as CI,am as _n,e5 as wI,az as sr,aU as Vs,e6 as TI,as as pr,e7 as II,e8 as Av,cG as yr,by as ah,bI as oh,bJ as _I,bH as Ve,bu as sh,bv as Ev,bx as jt,bB as Ic,bR as di,e9 as Tu,bE as hi,ea as AI,bK as ra,bC as EI,bw as Lt,eb as PI,ec as ui,bO as MI,ed as RI,ee as DI,ef as LI,eg as kI,eh as Jp,ei as OI,bF as qp,cD as _c,cC as BI,ej as Vu,ek as _l}from"./index-BwKz9wtC.js";/**
+import{cH as pw,cI as gw,aG as mw,cJ as yw,cK as Sw,cL as bw,cM as xw,ah as Wt,cN as Cw,cO as ww,cP as Tw,cQ as Iw,aM as _w,aF as Aw,cR as Ew,aB as d1,bg as Pw,cS as Mw,cT as Rw,cU as Dw,cV as Lw,cW as kw,cX as Ow,cY as Bw,aE as Nw,cZ as Fw,s as Te,bl as $w,al as je,ag as Fe,af as he,ak as Z,c_ as zw,c$ as Uw,d0 as Hw,d1 as Vw,bk as Gw,cy as cl,aS as wv,aq as Ye,d2 as Ww,d3 as jw,a5 as ze,d4 as Kw,d5 as Xw,d6 as Yw,d7 as Zw,d8 as Qw,d9 as Jw,da as qw,db as eT,dc as tT,dd as rT,de as nT,v as iT,df as aT,dg as oT,dh as sT,aW as lT,di as uT,dj as cT,dk as fT,dl as dT,dm as hT,ay as ur,dn as vT,dp as pT,dq as gT,dr as mT,A as yT,ds as ST,dt as bT,bq as xT,du as CT,dv as wT,dw as TT,ap as IT,ac as Tv,ai as ct,dx as _T,au as xe,dy as AT,X as h1,y as ET,dz as PT,aP as MT,dA as RT,w as Er,dB as DT,dC as LT,H as kT,dD as OT,bA as hn,aD as BT,ae as ne,bQ as ea,$ as Tc,dE as NT,bP as ta,dF as FT,aC as $T,aO as zT,R as fe,dG as UT,br as ih,b3 as _r,aj as Hs,b1 as lt,b2 as Ua,an as Iv,dH as HT,dI as VT,dJ as GT,dK as WT,dL as jT,dM as KT,dN as XT,Q as YT,dO as ZT,dP as QT,dQ as JT,at as Mt,dR as qT,aR as eI,aY as tI,ad as fl,aZ as rI,dS as nI,dT as iI,dU as aI,P as le,a6 as oI,dV as sI,dW as lI,dX as uI,dY as cI,a7 as fI,dZ as dI,bN as hI,d_ as vI,d$ as pI,bM as gI,b4 as v1,aA as _v,e0 as mI,e1 as yI,E as Jt,x as SI,e2 as bI,e3 as xI,e4 as CI,am as _n,e5 as wI,az as sr,aU as Vs,e6 as TI,as as pr,e7 as II,e8 as Av,cG as yr,by as ah,bI as oh,bJ as _I,bH as Ve,bu as sh,bv as Ev,bx as jt,bB as Ic,bR as di,e9 as Tu,bE as hi,ea as AI,bK as ra,bC as EI,bw as Lt,eb as PI,ec as ui,bO as MI,ed as RI,ee as DI,ef as LI,eg as kI,eh as Jp,ei as OI,bF as qp,cD as _c,cC as BI,ej as Vu,ek as _l}from"./index-DH7_VOUf.js";/**
 * vue v3.4.34
 * (c) 2018-present Yuxi (Evan) You and Vue contributors
 * @license MIT

+ 1 - 1
dist/assets/index-DYPecWb2.js → dist/assets/index-C-_4lZVz.js

@@ -1 +1 @@
-import{_ as t}from"./404-R0y5dkvZ.js";import{E as c}from"./index-B6IOms75.js";import{a5 as n,ae as i,af as r,ak as o,aq as _,am as d,P as l,aS as p,bP as m,bQ as f,bH as u}from"./index-BwKz9wtC.js";const s=a=>(m("data-v-340bbdaa"),a=a(),f(),a),h={class:"login"},b={class:"error"},g=s(()=>o("img",{src:t,class:"img",alt:""},null,-1)),k=s(()=>o("div",{class:"tit"},"登录已过期或服务器错误!",-1)),v=n({__name:"login",setup(a){function e(){window.close()}return(x,B)=>(i(),r("div",h,[o("div",b,[g,k,_(l(c),{class:"backBtn",type:"primary",plain:"",onClick:e},{default:d(()=>[p("关闭页面")]),_:1})])]))}}),C=u(v,[["__scopeId","data-v-340bbdaa"]]);export{C as default};
+import{_ as t}from"./404-R0y5dkvZ.js";import{E as c}from"./index-CfXkJUZO.js";import{a5 as n,ae as i,af as r,ak as o,aq as _,am as d,P as l,aS as p,bP as m,bQ as f,bH as u}from"./index-DH7_VOUf.js";const s=a=>(m("data-v-340bbdaa"),a=a(),f(),a),h={class:"login"},b={class:"error"},g=s(()=>o("img",{src:t,class:"img",alt:""},null,-1)),k=s(()=>o("div",{class:"tit"},"登录已过期或服务器错误!",-1)),v=n({__name:"login",setup(a){function e(){window.close()}return(x,B)=>(i(),r("div",h,[o("div",b,[g,k,_(l(c),{class:"backBtn",type:"primary",plain:"",onClick:e},{default:d(()=>[p("关闭页面")]),_:1})])]))}}),C=u(v,[["__scopeId","data-v-340bbdaa"]]);export{C as default};

+ 1 - 1
dist/assets/index-B1e9HvGm.js → dist/assets/index-CRZ2xJMi.js

@@ -1 +1 @@
-import{_ as a}from"./404-R0y5dkvZ.js";import{a5 as o,eo as t,ae as r,af as c,bP as _,bQ as d,ak as s,bH as p}from"./index-BwKz9wtC.js";const i=e=>(_("data-v-dda25179"),e=e(),d(),e),n={class:"errorPage"},m=i(()=>s("div",{class:"error"},[s("img",{src:a,class:"img",alt:""}),s("div",{class:"tit"},"页面找不到了~")],-1)),l=[m],f=o({__name:"errorPage",setup(e){return t(),(u,h)=>(r(),c("div",n,l))}}),I=p(f,[["__scopeId","data-v-dda25179"]]);export{I as default};
+import{_ as a}from"./404-R0y5dkvZ.js";import{a5 as o,eo as t,ae as r,af as c,bP as _,bQ as d,ak as s,bH as p}from"./index-DH7_VOUf.js";const i=e=>(_("data-v-dda25179"),e=e(),d(),e),n={class:"errorPage"},m=i(()=>s("div",{class:"error"},[s("img",{src:a,class:"img",alt:""}),s("div",{class:"tit"},"页面找不到了~")],-1)),l=[m],f=o({__name:"errorPage",setup(e){return t(),(u,h)=>(r(),c("div",n,l))}}),I=p(f,[["__scopeId","data-v-dda25179"]]);export{I as default};

A diferenza do arquivo foi suprimida porque é demasiado grande
+ 0 - 0
dist/assets/index-CaPk8vFJ.js


A diferenza do arquivo foi suprimida porque é demasiado grande
+ 0 - 0
dist/assets/index-CfXkJUZO.js


A diferenza do arquivo foi suprimida porque é demasiado grande
+ 1 - 1
dist/assets/index-DH7_VOUf.js


+ 1 - 1
dist/assets/index-DW8ZTFID.js → dist/assets/index-DhfYccPL.js

@@ -1 +1 @@
-import{u as s,ag as r}from"./index-DJr8z2rx.js";import{a5 as c,cD as n,R as p,ae as t,af as _,al as u,ag as i,bH as l}from"./index-BwKz9wtC.js";const m={class:"pptScreen"},d=c({__name:"pptScreen",setup(f){const a=n(),e=p(!0),o=s();return a.setScreenMode("pptScreen"),o.initPPTData().then(()=>{e.value=!1}),(S,k)=>(t(),_("div",m,[e.value?i("",!0):(t(),u(r,{key:0}))]))}}),g=l(d,[["__scopeId","data-v-678905e9"]]);export{g as default};
+import{u as s,ag as r}from"./index-BdVynuBN.js";import{a5 as c,cD as n,R as p,ae as t,af as _,al as u,ag as i,bH as l}from"./index-DH7_VOUf.js";const m={class:"pptScreen"},d=c({__name:"pptScreen",setup(f){const a=n(),e=p(!0),o=s();return a.setScreenMode("pptScreen"),o.initPPTData().then(()=>{e.value=!1}),(S,k)=>(t(),_("div",m,[e.value?i("",!0):(t(),u(r,{key:0}))]))}}),g=l(d,[["__scopeId","data-v-678905e9"]]);export{g as default};

+ 1 - 1
dist/assets/index-YIl3r7-1.js → dist/assets/index-XP6acjPQ.js

@@ -1 +1 @@
-import{u as c,ag as l}from"./index-DJr8z2rx.js";import{w as p,bA as d,a5 as g,cD as m,R as t,ae as r,af as u,al as f,ag as w,bH as k}from"./index-BwKz9wtC.js";import"./shapes-hf4ERphj.js";const S=()=>{function o(a){if(window.parent===window)return;const{api:e,playState:n}=a.data||{};e==="headerTogge"?window.parent.postMessage({api:"headerTogge",playState:n},"*"):e==="changeTogge"?window.parent.postMessage({api:"changeTogge"},"*"):["clickTempo","clickViewFigner"].includes(e)&&window.parent.postMessage({api:e},"*")}p(()=>{window.addEventListener("message",o)}),d(()=>{window.removeEventListener("message",o)})},_=g({__name:"mobileScreen",setup(o){S();const a=m(),e=t(!0),n=t(!1),i=c();return a.setScreenMode("mobileScreen"),i.initPPTData().then(()=>{e.value=!1}),(v,s)=>(r(),u("div",{class:"mobileScreen",onClick:s[0]||(s[0]=b=>n.value=!1)},[e.value?w("",!0):(r(),f(l,{key:0}))]))}}),P=k(_,[["__scopeId","data-v-90b2692a"]]);export{P as default};
+import{u as c,ag as l}from"./index-BdVynuBN.js";import{w as p,bA as d,a5 as g,cD as m,R as t,ae as r,af as u,al as f,ag as w,bH as k}from"./index-DH7_VOUf.js";import"./shapes-DOZLoOQa.js";const S=()=>{function o(a){if(window.parent===window)return;const{api:e,playState:n}=a.data||{};e==="headerTogge"?window.parent.postMessage({api:"headerTogge",playState:n},"*"):e==="changeTogge"?window.parent.postMessage({api:"changeTogge"},"*"):["clickTempo","clickViewFigner"].includes(e)&&window.parent.postMessage({api:e},"*")}p(()=>{window.addEventListener("message",o)}),d(()=>{window.removeEventListener("message",o)})},_=g({__name:"mobileScreen",setup(o){S();const a=m(),e=t(!0),n=t(!1),i=c();return a.setScreenMode("mobileScreen"),i.initPPTData().then(()=>{e.value=!1}),(v,s)=>(r(),u("div",{class:"mobileScreen",onClick:s[0]||(s[0]=b=>n.value=!1)},[e.value?w("",!0):(r(),f(l,{key:0}))]))}}),P=k(_,[["__scopeId","data-v-90b2692a"]]);export{P as default};

+ 1 - 1
dist/assets/shapes-hf4ERphj.js → dist/assets/shapes-DOZLoOQa.js

@@ -1,4 +1,4 @@
-import{cG as k,bB as $1}from"./index-BwKz9wtC.js";import{ah as Z,ai as H1,aj as U,ak as n0,al as c0,am as i0,an as j1,ao as K1,ap as Y1,aq as R}from"./index-DJr8z2rx.js";var z1={exports:{}};/*!
+import{cG as k,bB as $1}from"./index-DH7_VOUf.js";import{ah as Z,ai as H1,aj as U,ak as n0,al as c0,am as i0,an as j1,ao as K1,ap as Y1,aq as R}from"./index-BdVynuBN.js";var z1={exports:{}};/*!
  * clipboard.js v2.0.11
  * https://clipboardjs.com/
  *

+ 1 - 1
dist/index.html

@@ -10,7 +10,7 @@
     <meta name="description" content="ppt编辑器" />
     <meta name="keywords" content="ppt,powerpoint,office powerpoint,在线ppt,幻灯片,演示文稿,ppt在线制作,Vue3,TypeScript" />
     <title>PPT</title>
-    <script type="module" crossorigin src="./assets/index-BwKz9wtC.js"></script>
+    <script type="module" crossorigin src="./assets/index-DH7_VOUf.js"></script>
     <link rel="stylesheet" crossorigin href="./assets/index-AavUEaYy.css">
   </head>
   <body>

+ 10 - 0
scripts/aiPptSelfTest.mjs

@@ -367,6 +367,16 @@ try {
     classroomAction:{ ...culturePage.classroomAction, studentTask:'听到哪种声音,就伸出几个手指?' } }
   assert.equal(responsePageContent(sameInstruction).task, '', '相同引导语与任务在学生画面只显示一次')
   assert.equal(responsePageContent(sameInstruction).heading, sameInstruction.studentContent.headline)
+  const repairedInstruction = structuredClone(sameInstruction)
+  const completeStep = '跟随指挥,各组依次加入表演,再交换乐器'
+  repairedInstruction.studentContent = { headline: completeStep, points: [], steps: [completeStep, '听到结束信号后停下'] }
+  repairedInstruction.classroomAction.studentTask = completeStep
+  repairedInstruction.interaction = undefined
+  assert.deepEqual(responsePageContent(repairedInstruction).steps, [completeStep, '听到结束信号后停下'], '续作修复后保留完整步骤和顺序')
+  assert.equal(responsePageContent(repairedInstruction).task, '', '同一句任务不在步骤上方重复绘制')
+  assert.equal(responsePageContent(repairedInstruction).heading, '', '步骤不能被移到标题区')
+  const { coursewareCompletionMessage: completionMessage } = await vite.ssrLoadModule('/src/utils/aiPptFeedback.ts')
+  assert(completionMessage({ blockingMessage: '第1页配图尚未完成(图片生成配置不完整)' }).includes('请管理员恢复配图服务'), '配置错误必须解释为何重试无效')
   const withVideo = structuredClone(valid)
   withVideo.pages[7].resourceBindings = [{resourceType:"VIDEO",resourceId:"test-video",contentUrl:"https://example.com/test.mp4",verified:true}]
   assert(render(withVideo)[7].elements.some(element => element.subtype === "elf-video"))

+ 7 - 4
src/utils/aiPptContent.ts

@@ -52,11 +52,14 @@ const bodyPoints = (page: AiCoursewarePage) => [
 /** 引导语、课堂任务和正文保持各自语义,不把标题追加为步骤或对比项。 */
 export function modelPageContent(page: AiCoursewarePage) {
   const clean = (text?: string) => !isTeacherFacingText(text) && textKey(visible(text)) !== textKey(page.title) ? visible(text) : ''
-  const heading = clean(page.interaction?.question) || clean(page.studentContent?.headline || page.subtitle) || clean(page.classroomAction?.studentTask)
-  const task = clean(page.classroomAction?.studentTask)
-  const headers = [page.title, heading, task, clean(page.studentContent?.headline || page.subtitle)].map(textKey)
+  const studentSteps = distinct((page.studentContent?.steps || []).map(visible))
+  // 修复后的语义任务可能与某一步相同,按步骤展示一次,不能把步骤吸收到标题后丢掉编号。
+  const guide = (text?: string) => studentSteps.some(step => textKey(step) === textKey(clean(text))) ? '' : clean(text)
+  const heading = clean(page.interaction?.question) || guide(page.studentContent?.headline || page.subtitle) || guide(page.classroomAction?.studentTask)
+  const task = guide(page.classroomAction?.studentTask)
+  const headers = [page.title, heading, task, guide(page.studentContent?.headline || page.subtitle)].map(textKey)
   const body = distinct(bodyPoints(page).map(visible)).filter(text => !headers.includes(textKey(text)))
-  const steps = distinct((page.studentContent?.steps || []).map(visible)).filter(text => !headers.includes(textKey(text)))
+  const steps = studentSteps.filter(text => !headers.includes(textKey(text)))
   let groups = (page.studentContent?.comparisonGroups || [])
     .map(group => ({ label: clean(group.label), points: distinct((group.points || []).map(visible)) }))
   if (!groups.length && page.visualPlan?.composition === 'comparison') {

+ 4 - 0
src/utils/aiPptFeedback.ts

@@ -3,6 +3,8 @@ import type { AiPptQualityIssue } from '@/utils/aiPptQuality'
 
 /** 教师只需知道待补内容和处理方法,审核原文保留在生成结果中供开发诊断。 */
 export function imagePreparationMessage(page: AiCoursewarePage) {
+  if (page.imageReview && /配置不完整|配置关闭|配置不受支持/.test(page.imageReview))
+    return '配图服务尚未就绪,请管理员检查图片服务配置。已保留课件内容,配置恢复后可继续完成。'
   const messages: Record<string, string> = {
     budget_exhausted: '本页配图尚未完成,继续完成课件时将补齐。',
     review_rejected: '本页配图审核未通过,系统需重新生成符合教学要求的图片。',
@@ -42,6 +44,8 @@ export function teachingReviewIssues(message?: string, blockingMessage?: string)
 export function coursewareCompletionMessage(result: Pick<AiCoursewareGenerateResult, 'blockingMessage' | 'reviewMessage'>, taskMessage?: string) {
   const detail = result.blockingMessage?.trim()
     || (taskMessage?.includes('配图') ? taskMessage.split(';')[0] : result.reviewMessage?.trim())
+  if (detail && /配置不完整|配置关闭|配置不受支持/.test(detail))
+    return teacherReviewMessage(`${detail};已保留课件内容,请管理员恢复配图服务后再继续完成,重复点击不会修复配置。`)
   return teacherReviewMessage(detail
     ? `${detail};已保留生成内容和成功配图,可继续完成课件。`
     : taskMessage || '课件尚未全部完成,可接着完成。')

Algúns arquivos non se mostraron porque demasiados arquivos cambiaron neste cambio