Browse Source

feat: 新增工具类型85的H5页面支持

在多个组件中添加工具类型85对应ssH5Page的配置,新增对应iframe渲染逻辑,同时调整AI创建课程入口为禁用状态并添加即将上线提示
lsc 4 hours ago
parent
commit
52a0f5dda8

+ 2 - 0
scripts/test-article-reading-routing.mjs

@@ -56,6 +56,8 @@ for (const [name, source] of Object.entries(codeFiles)) {
 // 话题讨论与句子跟读的既有编号不得被改写
 assert.match(frameBase, /77: 'ssEnglishSpeakingTool'/)
 assert.match(frameBase, /81: 'ssH5Page'/)
+assert.match(frameBase, /85: 'ssH5Page'/)
+
 
 // 文章分支不得回落到话题讨论组件
 const articleBranch = frameEditor.slice(frameEditor.indexOf('ArticleReadingPreview'))

+ 1 - 0
src/components/CollapsibleToolbar/componets/aiChat.vue

@@ -591,6 +591,7 @@ const sendAction = async (action: string) => {
       72: lang.ssAiApp,
       73: lang.ssHPage,
       81: lang.ssHPage,
+      85: lang.ssHPage,
       74: lang.ssVideo,
       75: lang.lang == 'cn' ? lang.ssBiliVideo : lang.ssYouTube,
       76: lang.ssCreative,

+ 1 - 0
src/components/CollapsibleToolbar/index.vue

@@ -285,6 +285,7 @@ const getTypeLabel = (type?: number) => {
     72: lang.ssAiApp,
     73: lang.ssHPage,
     81: lang.ssHPage,
+    85: lang.ssHPage,
     74: lang.ssVideo,
     75: lang.lang == 'cn' ? lang.ssBiliVideo : lang.ssYouTube,
     76: lang.ssCreative,

+ 1 - 0
src/components/CollapsibleToolbar/index2.vue

@@ -1311,6 +1311,7 @@ const getTypeLabel = (type?: number) => {
     72: lang.ssAiApp,
     73: lang.ssHPage,
     81: lang.ssHPage,
+    85: lang.ssHPage,
     74: lang.ssVideo,
     75: lang.lang == 'cn' ? lang.ssBiliVideo : lang.ssYouTube,
     76: lang.ssCreative,

+ 1 - 0
src/components/CollapsibleToolbar/index22.vue

@@ -977,6 +977,7 @@ const getTypeLabel = (type?: number) => {
     72: lang.ssAiApp,
     73: lang.ssHPage,
     81: lang.ssHPage,
+    85: lang.ssHPage,
     74: lang.ssVideo,
     75: lang.lang == 'cn' ? lang.ssBiliVideo : lang.ssYouTube,
     76: lang.ssCreative,

+ 4 - 19
src/components/CreateCourseDialog.vue

@@ -40,7 +40,8 @@
           <h3>{{ lang.ssCreateBlank }}</h3>
           <p>{{ lang.ssStartFromScratch }}</p>
         </div>
-        <div class="option-card" @click="openAICreate">
+         <!-- @click="openAICreate" -->
+        <div class="option-card disabled">
           <div class="option-icon">
             <svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
               <path d="M12 2L2 7l10 5 10-5-10-5z" />
@@ -50,6 +51,7 @@
           </div>
           <h3>{{ lang.ssCreateFromAI }}</h3>
           <p>{{ lang.ssAIGenerateContent }}</p>
+          <div class="coming-soon">{{ lang.ssComingSoon }}</div>
         </div>
         <div class="option-card disabled">
           <div class="option-icon">
@@ -304,27 +306,10 @@ const generateAICourse = () => {
 // 暴露给 iframe 调用的全局函数(iframe 主动调用时用)
 Object.assign(window, {
   generateAICourse,
-  // iframe 完成后主动调 parent.cocoStudioExport(payload) 回传
-  cocoStudioExport: (data: CocostudioExportPayload) => {
-    if (data && Array.isArray(data.pages) && data.pages.length > 0) {
-      generateAICourse(data)
-    }
-    else {
-      console.warn('[CreateCourseDialog] cocoStudioExport 收到无效数据', data)
-    }
-  },
   // iframe 主动关闭
-  closeCocoStudioFrame: () => closeAIIFrame(),
+  closeAIIFrame
 })
 
-// 组件卸载时清理全局函数(避免残留)
-onBeforeUnmount(() => {
-  const w = window as any
-  delete w.generateAICourse
-  delete w.__COCOSTUDIO_EXPORT__
-  delete w.cocoStudioExport
-  delete w.closeCocoStudioFrame
-})
 </script>
 
 <style lang="scss" scoped>

+ 1 - 0
src/views/Editor/CanvasTool/WebpageInput.vue

@@ -104,6 +104,7 @@ const getTypeLabel = (type: number) => {
     72: lang.ssAiApp,
     73: lang.ssHPage,
     81: lang.ssHPage,
+    85: lang.ssHPage,
     74: lang.ssVideo,
     75: lang.lang == 'cn' ? lang.ssBiliVideo : lang.ssYouTube,
     76: lang.ssCreative,

+ 1 - 0
src/views/Editor/CanvasTool/index2.vue

@@ -417,6 +417,7 @@ const getTypeLabel = (type: number) => {
     72: lang.ssAiApp,
     73: lang.ssHPage,
     81: lang.ssHPage,
+    85: lang.ssHPage,
     74: lang.ssVideo,
     75: lang.lang == 'cn' ? lang.ssBiliVideo : lang.ssYouTube,
     76: lang.ssCreative,

+ 1 - 0
src/views/Student/index.vue

@@ -2132,6 +2132,7 @@ const handleHomeworkSubmit = async () => {
     72: lang.ssAiApp,
     73: lang.ssHPage,
     81: lang.ssHPage,
+    85: lang.ssHPage,
     74: lang.ssVideo,
     75: lang.lang == 'cn' ? lang.ssBiliVideo : lang.ssYouTube,
     76: lang.ssCreative,

+ 13 - 0
src/views/components/element/FrameElement/BaseFrameElement.vue

@@ -59,6 +59,18 @@
           @load="handleIframeLoad"
         ></iframe>
         <!-- 延迟加载iframe:只有在可见且不是缩略图时才加载 -->
+        <iframe
+          :key="`html2-${iframeKey}`"
+          :srcdoc="elementInfo.url"
+          v-else-if="elementInfo.toolType === 85 && !isThumbnail && isVisible"
+          :width="width"
+          :height="height"
+          :frameborder="0" 
+          :allowfullscreen="true"
+          allow="camera *; microphone *; display-capture; midi; encrypted-media; fullscreen; geolocation; clipboard-read; clipboard-write; accelerometer; autoplay; gyroscope; payment; picture-in-picture; usb; xr-spatial-tracking;"
+          @load="handleIframeLoad"
+        ></iframe>
+        <!-- 延迟加载iframe:只有在可见且不是缩略图时才加载 -->
         <iframe
           :key="`html-${iframeKey}`"
           :srcdoc="processedSrcDoc"
@@ -285,6 +297,7 @@ const getTypeLabel = (type: number): string => {
     72: 'ssAIApp',
     73: 'ssH5Page',
     81: 'ssH5Page',
+    85: 'ssH5Page',
     74: 'ssVideo',
     75: lang.lang == 'cn' ? 'ssBiliVideo' : 'ssYouTube',
     76: 'ssCreateSpace',

+ 10 - 0
src/views/components/element/FrameElement/index.vue

@@ -51,6 +51,16 @@
           :frameborder="0" 
           :allowfullscreen="true"
           allow="camera *; microphone *; display-capture; midi; encrypted-media; fullscreen; geolocation; clipboard-read; clipboard-write; accelerometer; autoplay; gyroscope; payment; picture-in-picture; usb; xr-spatial-tracking;"
+        ></iframe>
+          <iframe 
+          v-else-if="elementInfo.toolType === 85"
+          :key="'html2-' + iframeKey"
+          :srcdoc="elementInfo.url"
+          :width="elementInfo.width"
+          :height="elementInfo.height"
+          :frameborder="0" 
+          :allowfullscreen="true"
+          allow="camera *; microphone *; display-capture; midi; encrypted-media; fullscreen; geolocation; clipboard-read; clipboard-write; accelerometer; autoplay; gyroscope; payment; picture-in-picture; usb; xr-spatial-tracking;"
         ></iframe>
         <!-- 其他类型:保持原有逻辑 -->
         <iframe 

+ 1 - 0
src/views/components/element/VideoElement/VideoPlayer/index.vue

@@ -161,6 +161,7 @@ const props = withDefaults(defineProps<{
 const VIDEO_POSTER_MAP: Record<string, string> = {
   '10月18日_1080p1792724012018.mp4': 'https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/Snipaste_2026-10-31_12-55-061793422736232.png',
   'video_1793446649315_1793446649372.mp4': 'https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/Snipaste_2026-11-02_09-47-081793584064497.png',
+  'video_1793446649315_1793446649372_web1793632566311.mp4': 'https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/Snipaste_2026-11-02_09-47-081793584064497.png',
   'video_1791624823715_1791624823748_web4801792658106941.mp4': 'https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/Snipaste_2026-10-31_12-56-011793422736221.png',
   'video_1791624823715_1791624823764_web4801792658106945.mp4': 'https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/Snipaste_2026-10-31_12-56-201793422736191.png',
 }