lsc 4 months ago
parent
commit
7325329284

BIN
src/assets/icon/ppt/model1-1.png


BIN
src/assets/icon/ppt/model1-2.png


BIN
src/assets/icon/ppt/model2-1.png


BIN
src/assets/icon/ppt/model2-2.png


BIN
src/assets/icon/ppt/model3-1.png


BIN
src/assets/icon/ppt/model3-2.png


BIN
src/assets/icon/ppt/model4-1.png


BIN
src/assets/icon/ppt/model4-2.png


+ 119 - 38
src/components/pages/aiAddCourse/aiCreateDialog.vue

@@ -1,7 +1,7 @@
 <template>
     <el-dialog title="AI生成PPT" :visible.sync="dialogVisibleAiCreate" :append-to-body="true" width="700px"
         :before-close="handleClose" class="dialog_diy">
-        <div style="height: 500px; padding: 15px" v-loading="loading">
+        <div style="height: 500px; padding: 15px" v-loading="loading" element-loading-text="小可正在努力生成中,请稍等...">
             <!-- <div class="t_box">
                 <span>选择:</span>
                 <el-radio-group v-model="radio" @change="changeRadio">
@@ -11,8 +11,17 @@
                 </el-radio-group>
             </div> -->
             <div class="t_box" v-if="steps == 1" style="height: 100%">
-                <textarea style="height: 100%" rows="10" class="binfo_input binfo_textarea" cols placeholder="请生成大纲"
-                    v-model="outline"></textarea>
+                <textarea style="height: 100%;width:calc(100% - 260px)" rows="10" class="binfo_input binfo_textarea" cols
+                    placeholder="请生成大纲" v-model="outline"></textarea>
+                <div class="template_box">
+                    <span class="title">选择模板</span>
+                    <div class="template_list">
+                        <div class="template_item" :class="{ active: index == templateIndex }"
+                            v-for="(item, index) in templateList" :key="index" @click="changeTemplate(index)">
+                            <img :src="item.img" alt="" />
+                        </div>
+                    </div>
+                </div>
             </div>
             <div style="height: 100%" v-else>
                 <wOffice v-if="url" :url="url"></wOffice>
@@ -22,7 +31,7 @@
             <el-button @click="aiGet(2)" type="primary" :disabled="loading">重新生成大纲</el-button>
             <el-button @click="aiGet(1)" type="primary" :disabled="loading">{{
                 url ? "重新生成PPT" : "生成PPT"
-                }}</el-button>
+            }}</el-button>
             <el-button @click="steps = 1" type="primary" v-if="steps == 2">上一步</el-button>
             <el-button @click="steps = 2" type="primary" v-else-if="steps == 1 && url">下一步</el-button>
             <el-button @click="confirm" type="primary">确 定</el-button>
@@ -35,6 +44,7 @@
 import Pptxgen from "pptxgenjs";
 import wOffice from "../components/wOffice.vue";
 import { v4 as uuidv4 } from "uuid";
+import { color } from "highcharts";
 
 export default {
     components: {
@@ -59,7 +69,7 @@ export default {
         },
         CourseTypeJson: {
             type: Object,
-            default: ()=>({}),
+            default: () => ({}),
         }
     },
     // 根据用户给你的参考资料
@@ -93,6 +103,19 @@ export default {
             uJson: {},
             outline: "",
             steps: 1,
+            templateList: [
+                // { img: 'https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/model1-11719468995661.png', img2: 'https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/model1-21719469026755.png',color:'17094F' },
+                // { img: 'https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/model2-11719469051869.png', img2: 'https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/model2-21719469040181.png',color:'052B37' },
+                // { img: 'https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/model3-11719469071576.png', img2: 'https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/model3-21719469092087.png',color:'1D5869' },
+                // { img: 'https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/model4-11719469106190.png', img2: 'https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/model-4-21719469125318.png',color:'372213' },
+                // { img: 'https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/model5-11719295908696.png', img2: 'https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/model5-21719295930345.png',color:'674D40' },
+                { img: require('../../../assets/icon/ppt/model1-1.png'), img2: require('../../../assets/icon/ppt/model1-2.png'),color:'17094F' },
+                { img: require('../../../assets/icon/ppt/model2-1.png'), img2: require('../../../assets/icon/ppt/model2-2.png'),color:'052B37' },
+                { img: require('../../../assets/icon/ppt/model3-1.png'), img2: require('../../../assets/icon/ppt/model3-2.png'),color:'1D5869' },
+                { img: require('../../../assets/icon/ppt/model4-1.png'), img2: require('../../../assets/icon/ppt/model4-2.png'),color:'372213' },
+                { img: require('../../../assets/icon/ppt/model5-1.png'), img2: require('../../../assets/icon/ppt/model5-2.png'),color:'674D40' },
+            ],
+            templateIndex: 0,
         };
     },
     watch: {
@@ -209,13 +232,9 @@ Instruction: Based on the context, follow "Format example", write content.
 
 # Context 
 ## 任务
-将参考#参考资料,为教师生成这节课的教学ppt。PPT的内容主要是讲解该课程中所有可能涉及到的知识点,根据大纲内容生成ppt内容。
+将参考#大纲内容,为教师生成这节课的教学ppt。PPT的内容主要是讲解该课程中所有可能涉及到的知识点,根据大纲内容生成ppt内容。
 
-## 工作流
-1. 针对大纲中的每个知识点,生成200字左右的详细讲解。你的语气应该让小学或初中的学生清晰易懂的讲解。请尽可能的详细,这对我很重要。
-2. 针对大纲中的每个测试,详细设计不同测试题目,例如单选,多选,对错题等。
-
-# 每一页输出格式
+## 每一页输出格式
 - 页数:序列数字
 - 标题:学科概念(请从给你的大纲中摘取)
 - 子标题:知识点(请从给你的大纲中摘取)
@@ -226,12 +245,15 @@ Instruction: Based on the context, follow "Format example", write content.
 - 你不能输出违反伦理的内容
 
 ## 工作流
-1. 从用户提供的参考资料中提取5个最重要的学科概念,并输出。
-2. 分解每个学科概念为几个子知识点
-3. 简要描述每个知识点
-4.生成5个测试题以考察学生的掌握情况
+1. 针对大纲中的每个知识点,生成200字左右的详细讲解。你的语气应该让小学或初中的学生清晰易懂的讲解。请尽可能的详细,这对我很重要。
+2. 针对大纲中的每个测试,详细设计不同测试题目,例如单选,多选,对错题等。
+3.从用户提供的参考资料中提取5个最重要的学科概念,并输出。
+4.分解每个学科概念为几个子知识点
+5.简要描述每个知识点
+6.生成5个测试题以考察学生的掌握情况
+7.一个知识点一页,一个测试题一页
 
-## 参考资料
+## 大纲内容
 ${_this.outline}
 
 # Format example
@@ -241,9 +263,9 @@ ${_this.outline}
 请根据参考资料,生成关于${this.courseName},为教师生成这节课的教学ppt的大纲,大纲的主要内容课程知识点的讲解与相关练习和测试。你的输出应该符合#输出格式
 
 # 工作流
-1. 从用户提供的参考资料中提取5个最重要的学科概念${mclass.length ? "(水平限制在{面向年级}中)" : ""},并输出。
-2. 分解每个学科概念为几个子知识点
-3. 简要描述每个知识点
+1.从用户提供的参考资料中提取5个最重要的学科概念${mclass.length ? "(水平限制在{面向年级}中)" : ""},并输出。
+2.分解每个学科概念为几个子知识点
+3.简要描述每个知识点
 4.生成5个测试题以考察学生的掌握情况
 
 ${mclass.length ? "#参考资料\n面向年级:" + mclass.join(",") : ""}
@@ -257,9 +279,9 @@ ${mclass.length ? "#参考资料\n面向年级:" + mclass.join(",") : ""}
   5.知识点:知识点5
 
 # 限制
-- 如果有参考资料请根据参考资料,如果没有无需根据参考资料进行。
-- 你不能输出错误的知识,如果你实在不清楚,输出“对不起,我不确定”
-- 你不能输出违反伦理的内容
+1.如果有参考资料请根据参考资料,如果没有无需根据参考资料进行,随意发挥
+2.你不能输出错误的知识。
+3.你不能输出违反伦理的内容。
 `;
             }
 
@@ -367,12 +389,12 @@ ${mclass.length ? "#参考资料\n面向年级:" + mclass.join(",") : ""}
             // 1. 创建PPT
             const pres = new Pptxgen();
             const _slideTou = pres.addSlide();
-            _slideTou.background = { path: "https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/model5-11719295908696.png" }
+            _slideTou.background = { path: this.templateList[this.templateIndex].img }
             _slideTou.addText(this.courseName, {
                 x: "10%", // 横坐标
                 y: 3,
                 width: "90%",
-                color: "363636",
+                color: this.templateList[this.templateIndex].color,
                 fontSize: 38, // 字号
                 align: "center",
             });
@@ -380,18 +402,18 @@ ${mclass.length ? "#参考资料\n面向年级:" + mclass.join(",") : ""}
                 // 2. 创建一个PPT页面,每调用一次 pres.addSlide() 都可以生成一张新的页面
                 // 建议把每个页面的构造抽成一个个函数,然后通过函数调用生成新页面,代码不会很乱
                 const _slide = pres.addSlide();
-                _slide.background = { path: "https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/model5-21719295930345.png" }
-            
+                _slide.background = { path: this.templateList[this.templateIndex].img2 }
+
                 // 3. 调用addTetx(),在PPT页面中插入文字“Hello World from PptxGenJS...”
                 // 括号里面是对文字的配置,文字横坐标x为1.5,纵坐标y为1.5,字体颜色 363636……
                 // 关于坐标长度与px的转换 x 1 = 127~128px 左右
-                const page = i+1 > 10 ? i+1 : "0"+(i+1);
+                const page = i + 1 > 10 ? i + 1 : "0" + (i + 1);
                 const tempResult1 = page + " " + array[i].title;
                 _slide.addText(tempResult1, {
                     x: "10%", // 横坐标
                     y: 1.1,
                     width: "90%",
-                    color: "363636",
+                    color: this.templateList[this.templateIndex].color,
                     fontSize: 28, // 字号
                     align: "center",
                 });
@@ -400,43 +422,43 @@ ${mclass.length ? "#参考资料\n面向年级:" + mclass.join(",") : ""}
                     x: "10%", // 横坐标
                     y: 1.8,
                     width: "90%",
-                    color: "363636",
+                    color: "222222",
                     fontSize: 20, // 字号
                     align: "center",
                 });
                 let tempResult3 = '';
-                if(typeof array[i].points == 'object'){
+                if (typeof array[i].points == 'object') {
                     tempResult3 = array[i].points.join('\n')
-                }else {
+                } else {
                     tempResult3 = array[i].points
                 }
                 _slide.addText(tempResult3, {
                     x: "20%", // 横坐标
                     y: 3.2,
                     w: "60%",
-                    color: "363636",
+                    color: "444444",
                     fontSize: 18, // 字号
                     align: "center",
                 });
             }
             const _slideWei = pres.addSlide();
-            _slideWei.background = { path: "https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/model5-11719295908696.png" }
+            _slideWei.background = { path: this.templateList[this.templateIndex].img }
             _slideWei.addText("谢谢观看,下课!", {
                 x: "10%", // 横坐标
                 y: 3,
                 width: "90%",
-                color: "363636",
+                color: this.templateList[this.templateIndex].color,
                 fontSize: 38, // 字号
                 align: "center",
             });
             // 获取PPTX文件的ArrayBuffer
-            
+
             // 保存为 Blob 并处理
             pres.write("blob").then((blob) => {
                 // 现在你有了一个 Blob 对象
                 console.log(blob);
 
-                const file = new File([blob], this.courseName+".pptx", {
+                const file = new File([blob], this.courseName + ".pptx", {
                     type: "application/vnd.openxmlformats-officedocument.presentationml.presentation",
                 });
                 console.log(pres);
@@ -494,6 +516,9 @@ ${mclass.length ? "#参考资料\n面向年级:" + mclass.join(",") : ""}
                     });
             }
         },
+        changeTemplate(index) {
+            this.templateIndex = index;
+        }
     },
 };
 </script>
@@ -564,13 +589,35 @@ ${mclass.length ? "#参考资料\n面向年级:" + mclass.join(",") : ""}
     font-family: "Microsoft YaHei";
 }
 
-.binfo_input:focus-visible {
-    border: 1.5px solid #3681fc !important;
+.binfo_textarea:focus-visible {
+  border: 1.5px solid #3681fc !important;
+}
+
+.binfo_textarea::-webkit-scrollbar {
+  /*滚动条整体样式*/
+  width: 6px;
+  /*高宽分别对应横竖滚动条的尺寸*/
+  height: 6px;
+}
+
+/*定义滚动条轨道 内阴影+圆角*/
+.binfo_textarea::-webkit-scrollbar {
+  border-radius: 10px;
+  background-color: #eee;
+}
+
+/*定义滑块 内阴影+圆角*/
+.binfo_textarea::-webkit-scrollbar-thumb {
+  border-radius: 10px;
+  -webkit-box-shadow: inset 0 0 6px rgba(0, 0, 0, 0.3);
+  background-color: rgba(0, 0, 0, 0.1);
 }
 
 .t_box {
     display: flex;
     margin-bottom: 15px;
+    display: flex;
+    justify-content: space-between;
 }
 
 .t_box>span:nth-child(1) {
@@ -578,4 +625,38 @@ ${mclass.length ? "#参考资料\n面向年级:" + mclass.join(",") : ""}
     font-size: 16px;
     color: #000;
 }
+
+.template_box{
+    width: 250px;
+}
+.template_box > .title{
+    font-size: 18px;
+    margin-bottom: 10px;
+    display: block;
+}
+.template_list{
+    overflow: auto;
+    width: 100%;
+    height: calc(100% - 31px);
+}
+.template_item{
+    cursor: pointer;
+    width: 100%;
+    height: 165px;
+    overflow: hidden;
+    border-radius: 5px;
+    box-sizing: border-box;
+    border: 5px solid #e5e5e5ee;
+}
+.template_item + .template_item{
+    margin-top: 10px;
+}
+.template_item.active{
+    border: 5px solid #0061ff;
+}
+.template_item > img{
+    width: 100%;
+    height: 100%;
+    object-fit: cover;
+}
 </style>

+ 1 - 1
src/components/pages/aiAddCourse/aiCreateVideoDialog.vue

@@ -1,7 +1,7 @@
 <template>
     <el-dialog title="AI生成视频" :visible.sync="dialogVisibleAiCreateVideo" :append-to-body="true" width="700px"
         :before-close="handleClose" class="dialog_diy">
-        <div style="height: 500px;padding:15px" v-loading="loading">
+        <div style="height: 500px;padding:15px" v-loading="loading" element-loading-text="小可正在努力生成中,请稍等...">
             <div style="position: relative; width: 100%;height: 40px;margin-bottom: 10px;">
                 <el-input class="inputC" style="height: 100%;" placeholder="搜索视频关键字" v-model="detail"
                 @keyup.enter.native="aiGet()"></el-input>