SanHQin пре 2 месеци
родитељ
комит
3022947f65

+ 1 - 1
dist/index.html

@@ -32,7 +32,7 @@
       width: 100%;
       background: #e6eaf0;
       font-family: '黑体';
-    }</style><link href=./static/css/app.21ffe5927292b9fc84d3032709231297.css rel=stylesheet></head><body><div id=app></div><script type=text/javascript src=./static/js/manifest.161e82026ac2ae03ab6f.js></script><script type=text/javascript src=./static/js/vendor.bb486323f0fa002ba2e7.js></script><script type=text/javascript src=./static/js/app.453e56676e3ee467f534.js></script></body></html><script>function stopSafari() {
+    }</style><link href=./static/css/app.0438f2ae7ac89f32fd5bbd468135ee0d.css rel=stylesheet></head><body><div id=app></div><script type=text/javascript src=./static/js/manifest.161e82026ac2ae03ab6f.js></script><script type=text/javascript src=./static/js/vendor.bb486323f0fa002ba2e7.js></script><script type=text/javascript src=./static/js/app.f646511142d6bb5915b5.js></script></body></html><script>function stopSafari() {
     //阻止safari浏览器双击放大功能
     let lastTouchEnd = 0  //更新手指弹起的时间
     document.documentElement.addEventListener("touchstart", function (event) {

Разлика између датотеке није приказан због своје велике величине
+ 0 - 0
dist/static/css/app.0438f2ae7ac89f32fd5bbd468135ee0d.css


Разлика између датотеке није приказан због своје велике величине
+ 0 - 0
dist/static/css/app.0438f2ae7ac89f32fd5bbd468135ee0d.css.map


Разлика између датотеке није приказан због своје велике величине
+ 0 - 0
dist/static/js/app.f646511142d6bb5915b5.js


Разлика између датотеке није приказан због своје велике величине
+ 0 - 0
dist/static/js/app.f646511142d6bb5915b5.js.map


Разлика између датотеке није приказан због своје велике величине
+ 0 - 0
dist/static/js/manifest.161e82026ac2ae03ab6f.js.map


+ 1 - 0
src/assets/icon/classroomObservation/batch_icon.svg

@@ -0,0 +1 @@
+<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1747704120613" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="6001" xmlns:xlink="http://www.w3.org/1999/xlink" width="200" height="200"><path d="M296.533333 712.832a42.666667 42.666667 0 0 1 0 60.330667l-90.538666 90.538666a42.666667 42.666667 0 0 1-60.330667 0l-30.165333-30.165333a42.666667 42.666667 0 0 1 60.330666-60.373333l60.373334-60.330667a42.666667 42.666667 0 0 1 60.330666 0zM896 768a42.666667 42.666667 0 0 1 0 85.333333H426.666667a42.666667 42.666667 0 0 1 0-85.333333h469.333333zM296.533333 414.165333a42.666667 42.666667 0 0 1 0 60.330667l-90.538666 90.538667a42.666667 42.666667 0 0 1-60.330667 0l-30.165333-30.165334a42.666667 42.666667 0 0 1 60.330666-60.373333l60.373334-60.330667a42.666667 42.666667 0 0 1 60.330666 0zM896 469.333333a42.666667 42.666667 0 0 1 0 85.333334H426.666667a42.666667 42.666667 0 0 1 0-85.333334h469.333333zM296.533333 115.498667a42.666667 42.666667 0 0 1 0 60.330666L205.994667 266.368a42.666667 42.666667 0 0 1-60.330667 0l-30.165333-30.165333A42.666667 42.666667 0 0 1 175.829333 175.786667l60.373334-60.330667a42.666667 42.666667 0 0 1 60.330666 0zM896 170.666667a42.666667 42.666667 0 0 1 0 85.333333H426.666667a42.666667 42.666667 0 1 1 0-85.333333h469.333333z" fill="#ffffff" p-id="6002"></path></svg>

+ 3 - 0
src/assets/icon/classroomObservation/close.svg

@@ -0,0 +1,3 @@
+<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path fill-rule="evenodd" clip-rule="evenodd" d="M4.99147 3.81283L10.0001 8.82121L15.0088 3.81283C15.1715 3.65012 15.4354 3.65012 15.5981 3.81283L16.1873 4.40209C16.35 4.56481 16.35 4.82863 16.1873 4.99135L11.1788 9.99996L16.1873 15.0087C16.35 15.1714 16.35 15.4352 16.1873 15.5979L15.5981 16.1872C15.4354 16.3499 15.1715 16.3499 15.0088 16.1872L10.0001 11.1787L4.99147 16.1872C4.82875 16.3499 4.56493 16.3499 4.40221 16.1872L3.81296 15.5979C3.65024 15.4352 3.65024 15.1714 3.81296 15.0087L8.82133 9.99996L3.81296 4.99135C3.65024 4.82863 3.65024 4.56481 3.81296 4.40209L4.40221 3.81283C4.56493 3.65012 4.82875 3.65012 4.99147 3.81283Z" fill="black" fill-opacity="0.9"/>
+</svg>

+ 7 - 0
src/assets/icon/classroomObservation/file_icon.svg

@@ -0,0 +1,7 @@
+<svg width="36" height="36" viewBox="0 0 36 36" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M8.25 8.85C8.25 7.59 8.25 6.96 8.4945 6.4785C8.71028 6.05476 9.05476 5.71028 9.4785 5.4945C9.9585 5.25 10.5885 5.25 11.85 5.25H18.759C19.3095 5.25 19.584 5.25 19.8435 5.3115C20.0755 5.3675 20.292 5.4575 20.493 5.5815C20.721 5.721 20.9145 5.916 21.303 6.3045L26.6955 11.6955C27.0855 12.0855 27.2805 12.2805 27.4185 12.5055C27.5425 12.7095 27.6325 12.9265 27.6885 13.1565C27.75 13.416 27.75 13.6905 27.75 14.241V27.15C27.75 28.41 27.75 29.04 27.5055 29.5215C27.2897 29.9452 26.9452 30.2897 26.5215 30.5055C26.0415 30.75 25.4115 30.75 24.15 30.75H11.85C10.59 30.75 9.96 30.75 9.4785 30.5055C9.05476 30.2897 8.71028 29.9452 8.4945 29.5215C8.25 29.0415 8.25 28.4115 8.25 27.15V8.85Z" stroke="black" stroke-width="1.5"/>
+<path d="M18.75 5.25V10.65C18.75 11.91 18.75 12.54 18.996 13.0215C19.2114 13.445 19.5553 13.7895 19.9785 14.0055C20.4585 14.25 21.0885 14.25 22.35 14.25H27.75" stroke="black" stroke-width="1.5"/>
+<rect x="12" y="16.5" width="12" height="1.5" rx="0.75" fill="black"/>
+<rect x="12" y="21" width="12" height="1.5" rx="0.75" fill="black"/>
+<rect x="12" y="25.5" width="12" height="1.5" rx="0.75" fill="black"/>
+</svg>

+ 20 - 0
src/assets/icon/classroomObservation/file_processing.svg

@@ -0,0 +1,20 @@
+<svg width="142" height="142" viewBox="0 0 142 142" fill="none" xmlns="http://www.w3.org/2000/svg">
+<g clip-path="url(#clip0_2392_7047)">
+<mask id="mask0_2392_7047" style="mask-type:luminance" maskUnits="userSpaceOnUse" x="0" y="0" width="142" height="142">
+<path d="M142 0H0V142H142V0Z" fill="white"/>
+</mask>
+<g mask="url(#mask0_2392_7047)">
+<path d="M71.0002 88.4372C87.5049 88.4372 100.905 90.6133 100.905 93.2936C100.905 95.9738 87.5049 98.15 71.0002 98.15C54.4955 98.15 41.095 95.9738 41.095 93.2936C41.095 90.6133 54.4955 88.4372 71.0002 88.4372Z" fill="#BFD9FF"/>
+<path d="M46.5762 43.31H60.837L65.0768 50.836H95.1402V74.55H46.5762V43.31Z" fill="#126DFF"/>
+<path d="M89.3181 30.6104V68.9504H52.6821V30.6104H89.3181Z" fill="#87B5FF"/>
+<path d="M91.3061 44.8105V80.0265H50.6941V44.8105H91.3061Z" fill="#C2DAFF"/>
+<path d="M93.1521 55.2402V86.7642H49.1321V55.2402H93.1521Z" fill="white"/>
+<path d="M46.2034 67.5648L95.7969 67.5648L95.2821 94.4307H46.7181L46.2034 67.5648Z" fill="#5094FF"/>
+</g>
+</g>
+<defs>
+<clipPath id="clip0_2392_7047">
+<rect width="142" height="142" fill="white"/>
+</clipPath>
+</defs>
+</svg>

+ 4 - 0
src/assets/icon/classroomObservation/table_edit.svg

@@ -0,0 +1,4 @@
+<svg width="16" height="16" viewBox="0 0 16 16" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M4.66663 4.66663H3.99996C3.64634 4.66663 3.3072 4.8071 3.05715 5.05715C2.8071 5.3072 2.66663 5.64634 2.66663 5.99996V12C2.66663 12.3536 2.8071 12.6927 3.05715 12.9428C3.3072 13.1928 3.64634 13.3333 3.99996 13.3333H9.99996C10.3536 13.3333 10.6927 13.1928 10.9428 12.9428C11.1928 12.6927 11.3333 12.3536 11.3333 12V11.3333" stroke="#969BA3" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round"/>
+<path d="M10.6667 3.33328L12.6667 5.33328M13.59 4.38995C13.8526 4.12739 14.0001 3.77127 14.0001 3.39995C14.0001 3.02863 13.8526 2.67251 13.59 2.40995C13.3274 2.14738 12.9713 1.99988 12.6 1.99988C12.2287 1.99988 11.8726 2.14738 11.61 2.40995L6 7.99995V9.99995H8L13.59 4.38995Z" stroke="#969BA3" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round"/>
+</svg>

+ 1 - 1
src/common/axios.config.js

@@ -32,7 +32,7 @@ axios.interceptors.request.use((config) => {
         config.headers = {
             'Content-Type': 'application/json',
         }
-    } else if (config.url.indexOf('https://gpt4.cocorobo.cn/') != -1 || config.url.indexOf('https://claude3.cocorobo.cn/') != -1 || config.url.indexOf('llm.cocorobo.cn/') != -1 || config.url.indexOf('https://appapi.cocorobo.cn/')!=-1) {
+    } else if (config.url.indexOf('https://gpt4.cocorobo.cn/') != -1 || config.url.indexOf('https://claude3.cocorobo.cn/') != -1 || config.url.indexOf('llm.cocorobo.cn/') != -1 || config.url.indexOf('https://appapi.cocorobo.cn/')!=-1 || config.url.indexOf('https://dify.cocorobo.cn')!=-1) {
         config.headers = {
             'Content-Type': 'application/json',
         }

+ 52 - 0
src/components/pages/classroomObservation/components/chatArea.vue

@@ -1617,6 +1617,9 @@ ${JSON.stringify(_list)}
 
       let _startTime = 0;
       let _endTime = 0;
+      let _getRoleList = [];
+      let _roleList = {};
+      let _getRoleLoading = false;
       try {
         let iiframe = this.$refs["iiframe"];
         let _this = this;
@@ -1676,6 +1679,55 @@ ${JSON.stringify(_list)}
             return
           };
 
+          if(_roleList[privSpeakerId]){
+            privSpeakerId = _roleList[privSpeakerId]
+          }else{
+            _getRoleList.push({
+              index:textList.length,
+              role:privSpeakerId,
+              content:privText
+            })
+          }
+
+          if(_getRoleList.length>=5 && !_getRoleLoading){
+            let params = {
+              inputs:{
+                options:"老师,学生",
+                rows:JSON.stringify(_getRoleList.map(i=>{return {content:i.content,role:i.role}}))
+              },
+              response_mode:"blocking",
+              user:this.userId
+            }
+          }
+
+          _getRoleLoading = true;
+          this.$ajax.post("https://dify.cocorobo.cn/v1/workflows/run",params).then(res=>{
+            let _runData = res.data;
+            let _runResult = _runData.outputs.result;
+            _runResult.forEach((txt,index)=>{
+              let _oldRole = _getRoleList[index].role;
+              if(!_roleList[_oldRole]){
+                _roleList[_oldRole] = txt;
+              }
+            })
+            // 去除内容
+            _getRoleList.splice(0, _runResult.length);
+            let _indexList = [];
+            _getRoleList.forEach((i,index)=>{
+              if(_roleList[i.role]){
+                textList[i.index].role = _roleList[i.role];
+                _indexList.push(index)
+              }
+            })
+            _getRoleList = _getRoleList.filter((item, index) => !_indexList.includes(index));
+            _getRoleLoading = false;
+          }).catch(err=>{
+            console.log("获取说话人编码失败",err)
+            _getRoleLoading = false;
+          })
+
+
+
           _endTime = (privOffset + privDuration) / 10000000;
           textList.push({
             value: privText,

+ 257 - 47
src/components/pages/classroomObservation/dialog/batchCreationClassDialog.vue

@@ -5,64 +5,146 @@
       width="100%"
       height="100%"
       fullscreen
-      :modal="true"
-      :close-on-click-modal="false"
+      :modal="false"
+      :close-on-click-modal="true"
       :show-close="false"
     >
       <div class="box">
+        <div class="b_back">
+          <div class="b_b_left" @click="close()">
+            <img src="../../../../assets/icon/classroomObservation/right.svg" />
+            <span>返回</span>
+          </div>
+          <div class="b_b_right">
+            <el-button type="primary" size="small" @click="uploadFile">上传文件</el-button>
+          </div>
+        </div>
         <div class="b_head">
           <span>已上传的课堂实录</span>
         </div>
         <div class="b_nav">
           <div class="b_n_left">
-            <span v-for="item in statusList" :key="item.value">{{item.label}}</span>
+            <span
+              :class="{ b_n_l_active: selectStatus == item.value }"
+              v-for="item in statusList"
+              :key="item.value"
+              @click="changeStatus(item.value)"
+              >{{ item.label }}</span
+            >
           </div>
           <div class="b_n_right">
             <span>总计3个</span>
           </div>
         </div>
+        <div class="b_bottom">
+          <div class="b_b_operation">
+            <div class="b_b_o_left">
+              <span>当前进度 10/12</span>
+            </div>
+            <div class="b_b_o_right">
+              <div><el-checkbox v-model="selectAll">全选</el-checkbox></div>
+              <span>
+                <img
+                  src="../../../../assets/icon/classroomObservation/del2.svg"
+                />
+              </span>
+            </div>
+          </div>
+          <div class="b_b_list">
+            <batchClassCard v-for="item in 10" :key="item" />
+          </div>
+        </div>
       </div>
+      <uploadFileToCreateClassDialog ref="uploadFileToCreateClassDialogRef"/>
     </el-dialog>
   </div>
 </template>
 
 <script>
+import batchClassCard from "../newComponents/batchClassCard.vue";
+import uploadFileToCreateClassDialog from "./uploadFileToCreateClassDialog.vue";
 export default {
-  props: {
-
+  components: {
+    batchClassCard,
+    uploadFileToCreateClassDialog
   },
   data() {
     return {
-      statusList:[
-        {label:"全部",value:"0"},
-        {label:"已完成",value:"1"},
-        {label:"处理中",value:"2"},
-        {label:"等待处理",value:"3"},
+      statusList: [
+        { label: "全部", value: "0" },
+        { label: "已完成", value: "1" },
+        { label: "处理中", value: "2" },
+        { label: "等待处理", value: "3" }
       ],
-      selectStatus:"0",
+      selectStatus: "0",
       show: false,
+      selectAll: false,
+      dataList: [
+        {
+          id: "1",
+          name: "文件名称文件名称文件名称",
+          create_at: "2025-05-07 16.05.03",
+          remarks: "备注1",
+          type:"txt",
+          baseMessage:{
+            courseName: "",
+				    teacherName: "",
+            time:"",
+				    grade: "",
+				    subject: "",
+            textbook:"",
+				    studentNum: 0,
+            imageList:[],
+          },
+          stepsList: [
+            {
+              type: "uploadFile",
+              text: "上传文件",
+              status: "0",
+              progress: "0"
+            },
+            {
+              type: "transcription",
+              text: "文本转录",
+              status: "0",
+              progress: "0"
+            },
+            {
+              type: "automaticCoding",
+              text: "自动编码",
+              status: "0",
+              progress: "0"
+            },
+            {
+              type: "generateReport",
+              text: "生成报告",
+              status: "0",
+              progress: "0"
+            }
+          ]
+        },
+      ]
     };
   },
 
-  computed: {
-
-  },
+  computed: {},
   methods: {
-
-    open(){
-      this.show = false;
+    open() {
+      this.show = true;
     },
 
     close() {
       this.show = false;
     },
-    init() {
-
+    init() {},
+    changeStatus(newValue) {
+      this.selectStatus = newValue;
+    },
+    uploadFile(){
+      this.$refs.uploadFileToCreateClassDialogRef.open();
     },
   },
-  mounted(){
-    this.open()
-  },
+  mounted() {}
 };
 </script>
 
@@ -83,45 +165,173 @@ export default {
   height: 100vh;
   width: 100vw;
   overflow: auto;
-  display:flex;
-  justify-content:center;
+  display: flex;
+  justify-content: center;
+}
+
+.box {
+  width: 70%;
+  min-width: 500px;
+  height: fit-content;
+  box-sizing: border-box;
+  border-left: solid 1px #e1e1e1;
+  border-right: solid 1px #e1e1e1;
+  padding: 0 40px;
+}
+
+.b_back {
+  height: 50px;
+  width: 100%;
+  display: flex;
+  align-items: center;
+  justify-content: space-between;
+  margin-top: 20px;
+}
+
+.b_b_left {
+  display: flex;
+  align-items: center;
+  cursor: pointer;
+}
+
+.b_b_left > img {
+  width: 30px;
+  height: 30px;
+  transform: rotate(180deg);
+}
+
+.b_b_left > span {
+  font-size: 20px;
+  font-weight: bold;
+  margin-left: 5px;
+}
+
+.b_head {
+  width: 100%;
+  height: 50px;
+  margin: 20px 0 10px 0;
+  box-sizing: border-box;
+}
+
+.b_head > span {
+  font-size: 26px;
+  font-weight: bold;
+  color: #000;
+}
+
+.b_nav {
+  width: 100%;
+  height: 50px;
+  display: flex;
+  align-items: center;
+  justify-content: space-between;
+  box-sizing: border-box;
+  border-bottom: solid 1px rgba(150, 155, 163, 1);
+}
+
+.b_n_left {
+  width: calc(100% - 60px);
+  height: 100%;
+  display: flex;
+  align-items: center;
 }
 
-.box{
-  width:70%;
-  min-width:500px;
-  height:100%;
-  box-sizing:border-box;
-  border-left:solid 1px #E1E1E1;
-  border-right:solid 1px #E1E1E1;
-  padding:0 40px;
+.b_n_left > span {
+  height: 100%;
+  padding: 0 20px;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  position: relative;
+  cursor: pointer;
+  transition: 0.3s;
+  font-size: 16px;
 }
 
-.b_head{
-  width:100%;
-  height:50px;
-  margin: 20px 0;
-  box-sizing:border-box;
+.b_n_left > span:hover {
+  color: rgba(5, 96, 253, 1);
 }
 
-.b_head>span{
-  font-size:26px;
-  font-weight:bold;
-  color:#000;
+.b_n_left > .b_n_l_active {
+  color: rgba(5, 96, 253, 1);
 }
 
-.b_nav{
-  width:100%;
-  height:50px;
+.b_n_left > .b_n_l_active::after {
+  content: "";
+  position: absolute;
+  width: 70%;
+  height: 4px;
+  border-radius: 4px;
+  bottom: -1px;
+  left: 50%;
+  transform: translateX(-50%);
+  background-color: rgba(5, 96, 253, 1);
+}
+
+.b_n_right {
+  width: 60px;
+  height: 100%;
+  display: flex;
+  align-items: center;
+  justify-content: flex-end;
+  color: rgba(150, 155, 163, 1);
+  font-size: 16px;
+}
+
+.b_bottom {
+  width: 100%;
+  height: auto;
+  /* height: calc(100% - 200px); */
+}
+
+.b_b_operation {
+  width: 100%;
+  height: 40px;
   display: flex;
   align-items: center;
   justify-content: space-between;
-  background:red;
+  margin-top: 10px;
+}
+.b_b_o_left {
+  width: calc(100% - 100px);
+  height: 100%;
+  display: flex;
+  align-items: center;
+  font-size: 16px;
 }
 
-.b_n_right{
+.b_b_o_right {
   width: 100px;
   height: 100%;
-  background-color: black;
+  display: flex;
+  align-items: center;
+  justify-content: space-between;
+}
+
+.b_b_o_right > div {
+  margin-right: 10px;
+  font-size: 16px;
+}
+
+.b_b_o_right > div >>> .el-checkbox {
+  display: flex;
+  align-items: center;
+}
+
+.b_b_o_right > span {
+  width: 20px;
+  height: 20px;
+  cursor: pointer;
+}
+
+.b_b_o_right > span > img {
+  width: 100%;
+  height: 100%;
+}
+
+.b_b_list {
+  width: 100%;
+  height: auto;
+  padding-bottom: 40px;
 }
 </style>

+ 922 - 0
src/components/pages/classroomObservation/dialog/editBaseMessageDialog.vue

@@ -0,0 +1,922 @@
+<template>
+	<div>
+		<el-dialog
+			:center="true"
+			:visible.sync="show"
+			:close-on-click-modal="false"
+      :modal="false"
+			width="auto"
+			height="auto"
+			class="editBaseMessageDialog"
+		>
+    <div class="box">
+      <div class="b_head">
+        <span>编辑基本信息</span>
+        <img src="../../../../assets/icon/classroomObservation/close.svg" @click="close()">
+      </div>
+      <div class="b_main">
+        <div class="m-m-form">
+				<div class="m-m-formItem" style="width: clamp(50%, 50%, 50%)">
+					<div class="m-m-fi-label">课堂名称</div>
+					<div class="m-m-fi-input">
+						<el-input
+							v-model="data.courseName"
+							placeholder="请输入课堂名称"
+							@change="changeData()"
+						></el-input>
+					</div>
+				</div>
+
+				<div class="m-m-formItem" style="width: clamp(21%,21%,21%)">
+					<div class="m-m-fi-label">授课老师</div>
+					<div class="m-m-fi-input">
+						<el-input
+							v-model="data.teacherName"
+							placeholder="请输入授课老师"
+							@change="changeData()"
+						></el-input>
+					</div>
+				</div>
+
+				<div class="m-m-formItem" style="width: clamp(22%,22%,22%)"">
+					<div class="m-m-fi-label">授课时间</div>
+					<div class="m-m-fi-input" style="position: relative;">
+						<el-date-picker
+							v-model="data.time"
+							type="datetime"
+							format="yyyy-MM-dd HH:mm:ss"
+							value-format="yyyy-MM-dd HH:mm:ss"
+							style="width: 100%;"
+							class="m_m_fi_inputDisabledIcon"
+							prefix-icon="none"
+							@change="changeData()"
+							placeholder="请选择授课时间"
+						>
+
+						</el-date-picker>
+						<i class="el-icon-date" style="position: absolute; right: 10px; top: 50%; transform: translateY(-50%); pointer-events: none;"></i>
+					</div>
+				</div>
+
+				<div class="m-m-formItem" style="width: clamp(24%,24%,24%)"">
+					<div class="m-m-fi-label">授课年级</div>
+					<div class="m-m-fi-input">
+						<el-select
+							style="width: 100%"
+							v-model="data.grade"
+							@change="changeData()"
+							placeholder="请选择年级"
+						>
+							<el-option
+								v-for="(item, index) in gradeList"
+								:key="index"
+								:value="item.value"
+								:label="item.label"
+							></el-option>
+						</el-select>
+					</div>
+				</div>
+
+				<div class="m-m-formItem" style="width: clamp(24.5%,24.5%,24.5%)">
+					<div class="m-m-fi-label">授课科目</div>
+					<div class="m-m-fi-input">
+						<el-select
+							style="width: 100%"
+							v-model="data.subject"
+							@change="changeData()"
+							placeholder="请选择科目"
+						>
+							<el-option
+								v-for="(item, index) in subjectList"
+								:key="index"
+								:value="item.value"
+								:label="item.label"
+							></el-option>
+						</el-select>
+					</div>
+				</div>
+
+				<div class="m-m-formItem" style="width: clamp(21%,21%,21%)"">
+					<div class="m-m-fi-label">教材版本</div>
+					<div class="m-m-fi-input">
+						<el-input
+							v-model="data.textbook"
+							placeholder="请输入教材版本"
+							@change="changeData()"
+						></el-input>
+					</div>
+				</div>
+
+				<div class="m-m-formItem" style="width: clamp(22%,22%,22%)"">
+					<div class="m-m-fi-label">学生人数</div>
+					<div class="m-m-fi-input">
+						<el-input
+							v-model.number="data.studentNum"
+							placeholder="请输入学生人数"
+							@change="changeData()"
+						></el-input>
+					</div>
+				</div>
+			</div>
+			<div class="fileList">
+				<div class="fl_img">
+					<div class="imgTit">
+						<span>课堂图片</span>
+						<span>(建议图片比例16:9,最多上传3张)</span>
+					</div>
+					<div class="m-m-formImage" v-loading="uploadImageLoading">
+								<div
+									class="m-m-fi-imageItem"
+									v-for="(value, key, index) in imageList"
+									:key="index"
+									v-if="(key == 'fileList1' || key == 'fileList2' || key == 'fileList3') && value.length >0"
+									@click.stop="previewImg(value[0].url)"
+									style="max-width:32%;"
+								>
+									<el-image
+										class="itemUrl"
+										:src="value[0].url"
+										fit="cover"
+										style="width: 100%;"
+									></el-image>
+									<span @click.stop="delImage(key)"></span>
+									<!-- <img class="itemUrl" :src="value[0].url" alt="" /> -->
+								</div>
+								<!-- 图片区域 -->
+
+							<div
+								class="m-m-fi-imageItem"
+								@click.stop="addImage2()"
+								style="max-width:32%;"
+								v-if="
+									imageList.fileList1 &&
+									imageList.fileList1.length +
+										imageList.fileList2.length +
+										imageList.fileList3.length <
+										3
+								"
+							>
+								<img
+									src="../../../../assets/icon/classroomObservation/Union.svg"
+									alt=""
+								/>
+								<div
+									style="
+										font-size: 12px;
+										font-weight: 400;
+										margin-top: 5px;
+										color: rgba(0, 0, 0, 0.4);
+									"
+								>
+									点击上传图片
+								</div>
+							</div>
+							<!-- 图片区域 -->
+						<!-- <div class="m-m-fi-btn" >添加课堂图片</div> -->
+					</div>
+				</div>
+				<div class="fl_video">
+					<div class="imgTit">
+						<span>课堂视频</span>
+						<span></span>
+						<!-- <span>(建议视频比例16:9,最多上传1个)</span> -->
+					</div>
+
+					<div class="m-m-formImage" v-loading="uploadVideoLoading">
+
+								<div
+									class="m-m-fi-imageItem"
+									style="max-width:100%;"
+									v-if="!imageList.videoList.length==0"
+									v-for="(item, index) in imageList.videoList?imageList.videoList:[]"
+									:key="index"
+									@click.stop="previewVideo(item.url)"
+								>
+								<!-- <div>{{ item }}</div> -->
+									<el-image
+										class="itemUrl"
+										:src="require('../../../../assets/icon/classroomObservation/isVideo.png')"
+										fit="cover"
+									></el-image>
+									<span @click.stop="delVideo('videoList')"></span>
+								</div>
+							<!-- <el-progress v-if="progressData.uploadVideo && !imageList.videoList.length" class="m_m_fi_progress" :percentage="progressData.value"></el-progress> -->
+							<el-popover
+  					  placement="top"
+  					  width="180"
+  					  trigger="hover"
+							style="width: 140px"
+							v-if="(((imageList.videoList&&imageList.videoList.length<=0) || !imageList.videoList) && !progressData.uploadVideo)"
+  					>
+						<div class="m_m_box">
+							<el-button-group style="width: 100%;display: flex;justify-content: center;">
+							  <el-button size="small" @click="localUploadVideo()">本地上传</el-button>
+								<el-button size="small" @click="resourceUploadVideo()">资源库上传</el-button>
+							</el-button-group>
+						</div>
+							<div
+							  slot="reference"
+								class="m-m-fi-imageItem"
+								@click.stop="addVideo()"
+								style="max-width:100%;"
+								v-if="(((imageList.videoList&&imageList.videoList.length<=0) || !imageList.videoList) && !progressData.uploadVideo)"
+							>
+								<img
+									src="../../../../assets/icon/classroomObservation/Union.svg"
+									alt=""
+								/>
+								<div
+									style="
+										font-size: 12px;
+										font-weight: 400;
+										margin-top: 5px;
+										color: rgba(0, 0, 0, 0.4);
+									"
+								>
+									点击上传视频
+								</div>
+							</div>
+						</el-popover>
+
+							<div
+								class="m-m-fi-imageItem"
+								style="max-width:60%;border-radius: 8px;overflow: hidden;"
+								v-if="progressData.uploadVideo && !imageList.videoList.length""
+							>
+							<el-image
+								class="itemUrl"
+								:src="require('../../../../assets/icon/classroomObservation/videoFile.svg')"
+								fit="cover"
+							></el-image>
+							<div class="m_m_fi_videBtn">
+								<img v-if="!progressData.stop" :src="require('../../../../assets/icon/classroomObservation/stopIcon.png')" @click.stop="stopUploadVideo()">
+								<img v-if="progressData.stop" :src="require('../../../../assets/icon/classroomObservation/startIcon.png')"  @click.stop="startUploadVideo()">
+								<img :src="require('../../../../assets/icon/classroomObservation/delFile.svg')" @click.stop="delUploadVideo()">
+							</div>
+							<div class="m_m_fi_progress">
+									<div>{{ progressData.value }}%</div>
+									<span v-if="!progressData.stop">上传中...</span>
+									<span v-else>已暂停</span>
+									<div class="m_m_fi_p_bar">
+										<div :style="{width:progressData.value+'%'}"></div>
+									</div>
+							</div>
+						</div>
+						<!-- <div class="m-m-fi-btn" >添加课堂图片</div> -->
+					</div>
+				</div>
+				<!-- <div class="nephogramArea"> -->
+				<div class="fl_nephogram">
+					<div class="imgTit">
+						<span>词云图</span>
+						<span></span>
+					</div>
+					<div class="m-m-formImage">
+								<div
+									class="m-m-fi-nephogramItem"
+									style="width:100%;"
+									 v-loading="uploadNephogramLoading"
+									v-if="(imageList.NephogramList&&imageList.NephogramList.length>0)"
+								>
+									<wordcloudEChart :data="imageList.NephogramList[0]"/>
+									<span @click.stop="delNephogram('NephogramList')"></span>
+								</div>
+							<div
+								class="m-m-fi-nephogramItem"
+								 v-loading="uploadNephogramLoading"
+								@click.stop="addNephogram()"
+								style="width:60%;max-height: 100px;"
+								v-if="((imageList.NephogramList&&imageList.NephogramList.length<=0) || !imageList.NephogramList)"
+							>
+								<img
+									:src="require('../../../../assets/icon/classroomObservation/bmRefresh.png')"
+									alt=""
+									style="width:20px"
+								/>
+								<div
+									style="
+										font-size: 12px;
+										font-weight: 400;
+										margin-top: 5px;
+										color: rgba(0, 0, 0, 0.4);
+									"
+								>
+									生成词云图
+								</div>
+							</div>
+					</div>
+				<!-- </div> -->
+			</div>
+
+			</div>
+      </div>
+      <div class="b_bottom">
+        <el-button size="small" @click="close()">取消</el-button>
+        <el-button size="small" type="primary" @click="submit">确定修改</el-button>
+      </div>
+      <previewVideoDialog ref="previewVideoDialogRef" v-if="show"/>
+		<uploadFile v-if="progressData.uploadVideo && show" ref="uploadFileRef" @progressUpdate="videoProgressUpdate" @delUpload="videoDelUpload" @success="updateVideoSuccess" @startUpload="videoStartUpload"/>
+		<resourceLibraryDialog v-if="show" ref="resourceLibraryDialogRef" @addFile="resourceLibraryDialogAddFile"/>
+    </div>
+		</el-dialog>
+
+	</div>
+</template>
+
+<script>
+import previewVideoDialog from '../components/previewVideoDialog.vue';
+import wordcloudEChart from '../components/wordcloudEChart.vue'
+import uploadFile from '../components/uploadFile.vue';
+import { v4 as uuidv4 } from "uuid";
+import resourceLibraryDialog from '../components/resourceLibraryDialog.vue';
+export default {
+  components:{
+    previewVideoDialog,
+    wordcloudEChart,
+    uploadFile,
+    resourceLibraryDialog
+  },
+	data() {
+		return {
+			loading: false,
+			show: false,
+      uploadVideoLoading:false,
+      uploadImageLoading:false,
+      uploadNephogramLoading:false,
+      data: {
+				courseName: "",
+				teacherName: "",
+        time:"",
+				grade: "",
+				subject: "",
+        textbook:"",
+				studentNum: 0,
+        NephogramList:[],
+			},
+      gradeList: [
+				{ value: "小学一年级", label: "小学一年级" },
+				{ value: "小学二年级", label: "小学二年级" },
+				{ value: "小学三年级", label: "小学三年级" },
+				{ value: "小学四年级", label: "小学四年级" },
+				{ value: "小学五年级", label: "小学五年级" },
+				{ value: "小学六年级", label: "小学六年级" },
+				{ value: "初中一年级", label: "初中一年级" },
+				{ value: "初中二年级", label: "初中二年级" },
+				{ value: "初中三年级", label: "初中三年级" },
+				{ value: "高中一年级", label: "高中一年级" },
+				{ value: "高中二年级", label: "高中二年级" },
+				{ value: "高中三年级", label: "高中三年级" },
+			],
+			subjectList: [
+				{ value: "语文", label: "语文" },
+				{ value: "数学", label: "数学" },
+				{ value: "英语", label: "英语" },
+				{ value: "科学", label: "科学" },
+				{ value: "信息技术", label: "信息技术" },
+				{ value: "心理", label: "心理" },
+				{ value: "物理", label: "物理" },
+				{ value: "化学", label: "化学" },
+				{ value: "生物", label: "生物" },
+				{ value: "历史", label: "历史" },
+				{ value: "地理", label: "地理" },
+				{ value: "通用技术", label: "通用技术" },
+				{ value: "政治", label: "政治" },
+				{ value: "STEM", label: "STEM" },
+				{ value: "美术", label: "美术" },
+				{ value: "音乐", label: "音乐" },
+				{ value: "其他", label: "其他" },
+			],
+      imageList:{
+        fileList1:[],
+        fileList2:[],
+        fileList3:[],
+      },
+			progressData:{
+				stop:false,
+				uploadVideo:false,
+				value:0,
+				status:"",
+				key:"",
+				uploadid:"",
+			},
+			uploadFileObj:null,
+			loading:false,
+		};
+	},
+	computed: {},
+	methods: {
+		open(data) {
+			this.loading = false;
+			this.show = true;
+		},
+		close() {
+			this.show = false;
+			this.init();
+		},
+		init() {
+			this.loading = false;
+		},
+    submit(){
+      this.$message.info("确认修改")
+      this.close();
+    },
+    changeData(){
+      this.$message.info("更新数据")
+    },
+    //本地上传
+    localUploadVideo(){
+      this.$message.info("本地上传")
+    },
+    //资源库上传
+    resourceUploadVideo(){
+      this.$message.info("资源库上传")
+    },
+    //添加视频
+    addVideo(){
+      this.$message.info("添加视频")
+    },
+    //删除词云图
+    delNephogram(){
+      this.$message.info("删除词云图")
+    },
+    //生成词云图
+    addNephogram(){
+      this.$message.info("生成词云图")
+    },
+    //资源库添加文件
+    resourceLibraryDialogAddFile(file){
+      let _file = file[0];
+			if(!_file.file.endsWith(".mp4")){
+				this.$message.error("请选择mp4视频文件")
+				return;
+			}
+      console.log(_file)
+      this.$message.info("上传文件")
+			// this.$emit('saveVideo',{
+			// 		name: _file.name,
+			// 		status: "success",
+			// 		uid: _file.id,
+			// 		url: _file.file,
+			// })
+			// this.$message.success("上传成功")
+
+			// this.$confirm("是否提取视频音频并上传?","提示").then(()=>{
+			// 	this.getVideoVoice({url:_file.file});
+			// })
+    },
+    videoProgressUpdate(data){
+			if(data.status=="processing"){
+				this.progressData.value = data.percent;
+				this.progressData.status = data.status;
+			}else if(data.status=="fail"){
+				this.progressData.value = data.percent;
+				this.progressData.status = data.status;
+				this.$message.error('上传发生错误,请点击继续上传')
+				this.$refs.uploadFileRef.stopUpload();
+			}else if(data.status=="success"){
+				this.progressData.value = data.percent;
+				this.progressData.status = data.status;
+				this.$refs.uploadFileRef.stopUpload();
+			}else if(data.status=="error"){
+				this.progressData.stop = true;
+				this.progressData.status = data.status;
+				this.$refs.uploadFileRef.stopUpload();
+				this.$message.error('上传发生错误,请重新上传')
+			}
+			console.log(this.progressData)
+		},
+		videoDelUpload(res){
+			this.progressData.uploadVideo = false;
+			this.progressData.uploadid = "";
+			this.progressData.key = "";
+			this.progressData.status = "";
+			this.progressData.stop = false;
+			this.progressData.value = 0;
+			this.$message.success("已删除视频");
+		},
+    videoStartUpload({key,uploadid}){
+			this.progressData.uploadid = uploadid;
+			this.progressData.key = key;
+			this.progressData.status = "start"
+		},
+		updateVideoSuccess(res){
+			if(!res.data)return;
+			this.progressData.uploadVideo = false;
+			this.progressData.stop = false;
+			this.progressData.uploadid = "";
+			this.progressData.status = "";
+			this.progressData.value = 0;
+			let {data} = res;
+			this.$refs.uploadFileRef.file = null;
+      console.log(data)
+			// this.$emit('saveVideo',{
+			// 		name: data.Key,
+			// 		status: "success",
+			// 		uid: "qgt",
+			// 		url: data.Location,
+			// })
+			// this.$message.success("上传成功");
+			// // this.uploadFileObj = null;
+			// this.$confirm("是否提取视频音频并上传?","提示").then(()=>{
+			// 	this.getVideoVoice({file:this.uploadFileObj});
+			// 	this.uploadFileObj = null;
+			// }).catch(err=>{
+			// 	this.uploadFileObj = null;
+			// })
+		},
+    //上传课堂图片
+    addImage2(){
+      this.$message.info("上传课堂图片")
+			// let input = document.createElement("input");
+			// input.type = "file";
+			// input.accept = "image/*";
+			// input.multiple = true;
+			// input.click();
+
+
+			// input.onchange = () => {
+			// 	this.uploadImageLoading = true;
+      //   let promise =[];
+      //   for(let i=0;i<input.files.length;i++){
+      //     promise.push(this.uploadFile(input.files[i]));
+      //   }
+      //   Promise.all(promise).then(res=>{
+      //     this.$emit("saveImage2",res);
+      //     this.uploadImageLoading = false;
+      //   })
+			// };
+    },
+	},
+};
+</script>
+
+<style scoped>
+.editBaseMessageDialog >>> .el-dialog {
+  width: 1200px !important;
+	border-radius: 8px;
+	background-color: #fff;
+	overflow: hidden;
+}
+
+.editBaseMessageDialog >>> .el-dialog__body {
+  width: 1200px !important;
+	height: auto;
+	flex-shrink: 0;
+	box-sizing: border-box;
+	overflow: auto;
+}
+
+.editBaseMessageDialog >>> .el-dialog__header {
+	display: none !important;
+}
+
+.box{
+  width:1200px;
+  height:500px;
+  background:#FAFAFA;
+  border-radius:15px;
+  box-shadow: 0px 6px 30px 5px rgba(0, 0, 0, 0.05), 0px 16px 24px 2px rgba(0, 0, 0, 0.04), 0px 8px 10px -5px rgba(0, 0, 0, 0.08);
+}
+
+.b_head{
+  width:100%;
+  height:50px;
+  border-radius:15px 15px 0 0;
+  background:#fff;
+  display:flex;
+  align-items:center;
+  justify-content:space-between;
+  box-sizing: border-box;
+  padding: 0 20px;
+}
+
+.b_head>span{
+  font-size: 16px;
+  font-weight: bold;
+  color: #000;
+}
+
+.b_head>img{
+  width: 20px;
+  height: 20px;
+  cursor: pointer;
+}
+
+.b_main{
+  width:100%;
+  height:calc(100% - 50px - 70px);
+  background:#FAFAFA;
+	padding: 20px 20px 0 20px;
+	box-sizing: border-box;
+	display: flex;
+	flex-wrap: wrap;
+	flex-direction: column;
+}
+
+.m-m-form {
+	display: flex;
+	flex-wrap: wrap;
+	width: 100%;
+
+}
+
+.m-m-formItem {
+	width: 100%;
+	height: auto;
+	display: flex;
+	flex-direction: column;
+	align-items: left;
+	margin-top: 10px;
+	margin-right: 1.5%;
+	/* margin-bottom: 10px; */
+}
+
+.m-m-fi-input {
+	max-width: 100%;
+}
+
+.m_m_fi_inputDisabledIcon>>> .el-input__prefix{
+	display: none;
+}
+
+.m_m_fi_inputDisabledIcon>>>.el-input__inner{
+	padding-left: 15px;
+}
+
+.m-m-fi-label {
+	font-size: 16px;
+	display: flex;
+	padding-bottom: 5px;
+	/* justify-content: center; */
+	/* align-items: center; */
+	box-sizing: border-box;
+	/* padding: 0 10px; */
+	text-wrap: nowrap;
+	min-width: fit-content;
+}
+
+.m-m-formImage {
+	width: 100%;
+	height: auto;
+	margin-bottom: 20px;
+	display: flex;
+	justify-content: flex-start;
+	/* flex-wrap: wrap; */
+}
+
+.m-m-fi-imageList {
+	width: 100%;
+	height: auto;
+	display: flex;
+	flex-wrap: wrap;
+}
+
+.m-m-fi-imageItem {
+	width: auto;
+	height: auto;
+	background-color: rgba(238, 238, 238, 1);
+	width: 140px;
+	height: 100px;
+	min-width: 110px !important;
+	margin-right: 1%;
+	display: flex;
+	justify-content: center;
+	align-items: center;
+	flex-direction: column;
+	box-sizing: border-box;
+	font-size: 14px;
+	cursor: pointer;
+	position: relative;
+	margin-bottom: 10px;
+	border-radius: 4px;
+	border: dashed 1px #DCDCDC;
+	overflow: hidden;
+}
+.m-m-fi-imageItem > .itemUrl {
+	width: 100%;
+	height: 100%;
+}
+
+.m-m-fi-imageItem > span {
+	width: 20px;
+	height: 20px;
+	position: absolute;
+	right: 4px;
+	top: 4px;
+	background-image: url("../../../../assets/icon/classroomObservation/delFile.svg");
+	background-repeat: no-repeat;
+	background-size: 100% 100%;
+	display: none;
+	z-index: 9999;
+	/* display: flex;
+	justify-content: flex-end;
+	align-items: flex-start;
+	box-sizing: border-box;
+	padding: 2px 10px;
+	color: #666666;
+	font-size: 18px;
+	background-color: #FFBBBB;
+	cursor: pointer;
+	border-radius: 100%;
+	display: none; */
+}
+
+.m-m-fi-imageItem:hover > span {
+	display: flex;
+}
+
+/* .m-m-fi-i-icon {
+	width: 20px;
+	height: 20px;
+	background: url("../../../../assets/icon/classroomObservation/file.png")
+		no-repeat;
+	background-size: 100% 100%;
+	margin-right: 5px;
+} */
+
+.m-m-fi-btn {
+	width: auto;
+	height: 35px;
+	box-sizing: border-box;
+	display: flex;
+	justify-content: center;
+	align-items: center;
+	border-radius: 18px;
+	font-size: 14px;
+	border: solid 1px #c5c5c5;
+	background-color: white;
+	cursor: pointer;
+	padding: 0 10px;
+}
+
+.fileList{
+	width: 100%;
+	position: relative;
+	display: flex;
+}
+
+.fl_img{
+	width: 50%;
+	height: auto;
+}
+
+.fl_video{
+	width: 21.8%;
+	margin-left: 1.6%;
+	height: auto;
+
+}
+
+.nephogramArea{
+	width: 20%;
+	height: auto;
+}
+
+.fl_nephogram{
+	width: 20%;
+	/* margin-left: 1.5%; */
+	height: auto;
+	margin-left: 1%;
+	/* margin-top: -2%; */
+}
+
+
+.m_m_fi_progress{
+	width: 100%;
+	height: 100%;
+	position: absolute;
+	display: flex;
+	flex-direction: column;
+	justify-content: center;
+	align-items: center;
+	/* 加载 */
+	/* cursor:wait !important; */
+	background-color: #00000099;
+}
+
+.m_m_fi_progress>div:nth-child(1){
+	font-size: 20px;
+	color: white;
+}
+
+.m_m_fi_progress>span:nth-child(2){
+	font-size: 16px;
+	color: #FFFFFF8C;
+}
+
+.m_m_fi_p_bar{
+	width: 100%;
+	height: 5px;
+	position: absolute;
+	bottom: 0;
+	background-color: #D8E3F7;
+}
+
+.m_m_fi_p_bar>div{
+	background-color: #3975CE;
+	max-width: 100%;
+	height: 100%;
+}
+
+.m-m-fi-nephogramItem{
+	width: 140px;
+	height: 100px;
+	background-color: rgba(238, 238, 238, 1);
+	min-width: 140px;
+	min-height: 100px;
+	margin-right: 1%;
+	display: flex;
+	justify-content: center;
+	align-items: center;
+	flex-direction: column;
+	box-sizing: border-box;
+	font-size: 14px;
+	cursor: pointer;
+	position: relative;
+	margin-bottom: 10px;
+	border-radius: 4px;
+	border: dashed 1px #DCDCDC;
+	overflow: hidden;
+
+}
+.m-m-fi-nephogramItem> .itemUrl {
+	width: 100%;
+	height: 100%;
+}
+
+.m-m-fi-nephogramItem > span {
+	width: 20px;
+	height: 20px;
+	position: absolute;
+	right: 4px;
+	top: 4px;
+	background-image: url("../../../../assets/icon/classroomObservation/delFile.svg");
+	background-repeat: no-repeat;
+	background-size: 100% 100%;
+	display: none;
+	z-index: 99999;
+	/* display: flex;
+	justify-content: flex-end;
+	align-items: flex-start;
+	box-sizing: border-box;
+	padding: 2px 10px;
+	color: #666666;
+	font-size: 18px;
+	background-color: #FFBBBB;
+	cursor: pointer;
+	border-radius: 100%;
+	display: none; */
+}
+
+.m-m-fi-nephogramItem:hover > span {
+	display: flex;
+}
+
+.m_m_fi_videBtn{
+	position: absolute;
+	right: 4px;
+	top: 4px;
+	width:auto;
+	height: 20px;
+	background-size: 100% 100%;
+	/* display: none; */
+	z-index: 99999;
+	display: flex;
+}
+
+.m_m_fi_videBtn>img{
+	width: 20px;
+	height: 20px;
+	margin-left:10px;
+	cursor: pointer;
+}
+
+.imgTit {
+	height: 40px;
+	line-height: 40px;
+}
+.imgTit :first-child {
+	font-size: 16px;
+	font-weight: 400;
+	line-height: 22px;
+	text-align: right;
+}
+.imgTit :last-child {
+	font-family: PingFang SC;
+	font-size: 12px;
+	font-weight: 400;
+	line-height: 20px;
+	text-align: left;
+	color: rgba(0, 0, 0, 0.4);
+}
+
+.b_bottom{
+  width: 100%;
+  height: 70px;
+  display: flex;
+  align-items: center;
+  justify-content: flex-end;
+  box-sizing: border-box;
+  padding: 0 20px;
+}
+</style>

+ 477 - 0
src/components/pages/classroomObservation/dialog/uploadFileToCreateClassDialog.vue

@@ -0,0 +1,477 @@
+<template>
+  <div>
+    <el-dialog
+      :center="true"
+      :visible.sync="show"
+      :close-on-click-modal="false"
+      :modal="false"
+      width="auto"
+      height="auto"
+      class="uploadFileToCreateClassDialog"
+    >
+      <div class="box">
+        <div class="b_head">
+          <span>文件上传与配置</span>
+          <img
+            src="../../../../assets/icon/classroomObservation/close.svg"
+            @click="close()"
+          />
+        </div>
+        <div class="b_main">
+          <div class="b_m_left">
+            <img
+              src="../../../../assets/icon/classroomObservation/file_processing.svg"
+            />
+            <span>文件格式支持:mp4、wav、txt 文件</span>
+          </div>
+          <div class="b_m_right">
+            <span>配置</span>
+            <div>
+              <span>自动编码</span>
+              <el-switch
+                v-model="automaticCoding"
+                active-color="#13ce66"
+                inactive-color="#ff4949"
+              >
+              </el-switch>
+            </div>
+            <div>
+              <span>分析模板</span>
+              <el-cascader
+                size="small"
+                v-model="analysisTemplate"
+                :options="options"
+              ></el-cascader>
+            </div>
+          </div>
+        </div>
+        <div class="b_bottom">
+          <el-button size="small" @click="close()">取消</el-button>
+          <el-button size="small" type="primary" @click="submit"
+            >确定修改</el-button
+          >
+        </div>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+export default {
+  data() {
+    return {
+      loading: false,
+      show: false,
+      loading: false,
+      automaticCoding: false,
+      analysisTemplate: "",
+      options: [
+        {
+          value: "zhinan",
+          label: "指南",
+          children: [
+            {
+              value: "shejiyuanze",
+              label: "设计原则",
+              children: [
+                {
+                  value: "yizhi",
+                  label: "一致"
+                },
+                {
+                  value: "fankui",
+                  label: "反馈"
+                },
+                {
+                  value: "xiaolv",
+                  label: "效率"
+                },
+                {
+                  value: "kekong",
+                  label: "可控"
+                }
+              ]
+            },
+            {
+              value: "daohang",
+              label: "导航",
+              children: [
+                {
+                  value: "cexiangdaohang",
+                  label: "侧向导航"
+                },
+                {
+                  value: "dingbudaohang",
+                  label: "顶部导航"
+                }
+              ]
+            }
+          ]
+        },
+        {
+          value: "zujian",
+          label: "组件",
+          children: [
+            {
+              value: "basic",
+              label: "Basic",
+              children: [
+                {
+                  value: "layout",
+                  label: "Layout 布局"
+                },
+                {
+                  value: "color",
+                  label: "Color 色彩"
+                },
+                {
+                  value: "typography",
+                  label: "Typography 字体"
+                },
+                {
+                  value: "icon",
+                  label: "Icon 图标"
+                },
+                {
+                  value: "button",
+                  label: "Button 按钮"
+                }
+              ]
+            },
+            {
+              value: "form",
+              label: "Form",
+              children: [
+                {
+                  value: "radio",
+                  label: "Radio 单选框"
+                },
+                {
+                  value: "checkbox",
+                  label: "Checkbox 多选框"
+                },
+                {
+                  value: "input",
+                  label: "Input 输入框"
+                },
+                {
+                  value: "input-number",
+                  label: "InputNumber 计数器"
+                },
+                {
+                  value: "select",
+                  label: "Select 选择器"
+                },
+                {
+                  value: "cascader",
+                  label: "Cascader 级联选择器"
+                },
+                {
+                  value: "switch",
+                  label: "Switch 开关"
+                },
+                {
+                  value: "slider",
+                  label: "Slider 滑块"
+                },
+                {
+                  value: "time-picker",
+                  label: "TimePicker 时间选择器"
+                },
+                {
+                  value: "date-picker",
+                  label: "DatePicker 日期选择器"
+                },
+                {
+                  value: "datetime-picker",
+                  label: "DateTimePicker 日期时间选择器"
+                },
+                {
+                  value: "upload",
+                  label: "Upload 上传"
+                },
+                {
+                  value: "rate",
+                  label: "Rate 评分"
+                },
+                {
+                  value: "form",
+                  label: "Form 表单"
+                }
+              ]
+            },
+            {
+              value: "data",
+              label: "Data",
+              children: [
+                {
+                  value: "table",
+                  label: "Table 表格"
+                },
+                {
+                  value: "tag",
+                  label: "Tag 标签"
+                },
+                {
+                  value: "progress",
+                  label: "Progress 进度条"
+                },
+                {
+                  value: "tree",
+                  label: "Tree 树形控件"
+                },
+                {
+                  value: "pagination",
+                  label: "Pagination 分页"
+                },
+                {
+                  value: "badge",
+                  label: "Badge 标记"
+                }
+              ]
+            },
+            {
+              value: "notice",
+              label: "Notice",
+              children: [
+                {
+                  value: "alert",
+                  label: "Alert 警告"
+                },
+                {
+                  value: "loading",
+                  label: "Loading 加载"
+                },
+                {
+                  value: "message",
+                  label: "Message 消息提示"
+                },
+                {
+                  value: "message-box",
+                  label: "MessageBox 弹框"
+                },
+                {
+                  value: "notification",
+                  label: "Notification 通知"
+                }
+              ]
+            },
+            {
+              value: "navigation",
+              label: "Navigation",
+              children: [
+                {
+                  value: "menu",
+                  label: "NavMenu 导航菜单"
+                },
+                {
+                  value: "tabs",
+                  label: "Tabs 标签页"
+                },
+                {
+                  value: "breadcrumb",
+                  label: "Breadcrumb 面包屑"
+                },
+                {
+                  value: "dropdown",
+                  label: "Dropdown 下拉菜单"
+                },
+                {
+                  value: "steps",
+                  label: "Steps 步骤条"
+                }
+              ]
+            },
+            {
+              value: "others",
+              label: "Others",
+              children: [
+                {
+                  value: "dialog",
+                  label: "Dialog 对话框"
+                },
+                {
+                  value: "tooltip",
+                  label: "Tooltip 文字提示"
+                },
+                {
+                  value: "popover",
+                  label: "Popover 弹出框"
+                },
+                {
+                  value: "card",
+                  label: "Card 卡片"
+                },
+                {
+                  value: "carousel",
+                  label: "Carousel 走马灯"
+                },
+                {
+                  value: "collapse",
+                  label: "Collapse 折叠面板"
+                }
+              ]
+            }
+          ]
+        },
+        {
+          value: "ziyuan",
+          label: "资源",
+          children: [
+            {
+              value: "axure",
+              label: "Axure Components"
+            },
+            {
+              value: "sketch",
+              label: "Sketch Templates"
+            },
+            {
+              value: "jiaohu",
+              label: "组件交互文档"
+            }
+          ]
+        }
+      ]
+    };
+  },
+  computed: {},
+  methods: {
+    open(data) {
+      this.loading = false;
+      this.show = true;
+    },
+    close() {
+      this.show = false;
+      this.init();
+    },
+    init() {
+      this.loading = false;
+    },
+    submit() {
+      this.$message.info("确认上传");
+      this.close();
+    }
+  }
+};
+</script>
+
+<style scoped>
+.uploadFileToCreateClassDialog >>> .el-dialog {
+  width: 900px !important;
+  border-radius: 8px;
+  background-color: #fff;
+  overflow: hidden;
+}
+
+.uploadFileToCreateClassDialog >>> .el-dialog__body {
+  width: 900px !important;
+  height: auto;
+  flex-shrink: 0;
+  box-sizing: border-box;
+  overflow: auto;
+}
+
+.uploadFileToCreateClassDialog >>> .el-dialog__header {
+  display: none !important;
+}
+
+.box {
+  width: 900px;
+  height: 500px;
+  background: #fafafa;
+  border-radius: 15px;
+  box-shadow: 0px 6px 30px 5px rgba(0, 0, 0, 0.05),
+    0px 16px 24px 2px rgba(0, 0, 0, 0.04), 0px 8px 10px -5px rgba(0, 0, 0, 0.08);
+}
+
+.b_head {
+  width: 100%;
+  height: 50px;
+  border-radius: 15px 15px 0 0;
+  background: #fff;
+  display: flex;
+  align-items: center;
+  justify-content: space-between;
+  box-sizing: border-box;
+  padding: 0 20px;
+}
+
+.b_head > span {
+  font-size: 16px;
+  font-weight: bold;
+  color: #000;
+}
+
+.b_head > img {
+  width: 20px;
+  height: 20px;
+  cursor: pointer;
+}
+
+.b_main {
+  width: 100%;
+  height: calc(100% - 50px - 70px);
+  background: #fafafa;
+  padding: 20px 20px 0 20px;
+  box-sizing: border-box;
+  display: flex;
+  align-items: center;
+  justify-content: space-around;
+}
+
+.b_bottom {
+  width: 100%;
+  height: 70px;
+  display: flex;
+  align-items: center;
+  justify-content: flex-end;
+  box-sizing: border-box;
+  padding: 0 20px;
+}
+
+.b_main > div {
+  border-radius: 15px;
+  width: 400px;
+  height: 350px;
+  box-sizing: border-box;
+  border: rgba(150, 155, 163, 1) 1px dashed;
+}
+
+.b_m_left {
+  background-color: #fff;
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+  justify-content: center;
+}
+
+.b_m_left > img {
+  width: 140px;
+  height: 140px;
+}
+
+.b_m_left > span {
+  font-size: 16px;
+  color: #000;
+}
+
+.b_m_right {
+  box-sizing: border-box;
+  padding: 20px;
+}
+
+.b_m_right > span {
+  font-size: 16px;
+  font-weight: bold;
+  color: #000;
+}
+
+.b_m_right>div{
+  margin-top: 20px;
+  font-size: 16px;
+  color: #000;
+}
+
+
+</style>

+ 16 - 1
src/components/pages/classroomObservation/index.vue

@@ -82,6 +82,11 @@
 				</div> -->
       </div>
       <div class="co-h2-right">
+
+        <!-- <div class="co-h2-r-btn" style="background: rgba(54, 129, 252, 1)" @click.stop="batchBtn()">
+          <span class="co-h2-r-b-icon3"></span>
+          <div style="color: #fff;">批量创建</div>
+        </div> -->
         <div
           :class="['co-h2-r-btn', fileId && tid ? '' : 'ca-h2-r-noActive']"
           style="background: rgba(54, 129, 252, 1)"
@@ -1205,7 +1210,10 @@ export default {
     },
 		getVideoAudioSuccess(file){
 			this.$refs.chatAreaRef.getVideoAudioSuccess(file)
-		}
+		},
+    batchBtn(){
+      this.$refs.batchCreationClassDialogRef.open();
+    },
   },
   mounted() {
     this.getCourseList().then(_ => {
@@ -1404,6 +1412,13 @@ export default {
   background-size: 100% 100%;
 }
 
+.co-h2-r-b-icon3 {
+  background: url("../../../assets/icon/classroomObservation/batch_icon.svg") no-repeat;
+  background-size: 100% 100%;
+}
+
+
+
 /* .co-h2-r-b-icon2 {
 	background: url("../../../assets/icon/classroomObservation/daoChu.png")
 		no-repeat;

+ 259 - 0
src/components/pages/classroomObservation/newComponents/batchClassCard.vue

@@ -0,0 +1,259 @@
+<template>
+  <div class="batchClassCard">
+    <div class="bcc_left">
+      <el-checkbox v-model="checked"></el-checkbox>
+    </div>
+    <div class="bcc_right">
+      <div class="bcc_r_top">
+        <div class="bcc_r_t_left">
+          <div class="bcc_r_t_l_image">
+            <img src="../../../../assets/icon/classroomObservation/file_icon.svg">
+          </div>
+          <div class="bcc_r_t_l_message">
+            <div>
+              <span>文件名称文件名称文件名称文件名称文件名称文件名称文件名称文件名称文件名称文件名称文件名称</span>
+              <img src="../../../../assets/icon/classroomObservation/table_edit.svg" @click="editBaseMessage">
+            </div>
+            <span>2025-05-07 16.05.03</span>
+          </div>
+        </div>
+        <div class="bcc_r_t_right">
+          <span class="status_fail" v-if="data.status=='3'">失败</span>
+          <span class="status_success" v-if="data.status=='2'">已完成</span>
+          <span class="status_doing" v-if="data.status=='1'">处理中</span>
+          <span class="status_wait" v-if="data.status=='0'">等待处理</span>
+        </div>
+      </div>
+      <div class="bcc_r_bottom">
+        <div class="bcc_r_b_left">
+          <el-input placeholder="备注" v-model="data.remarks"></el-input>
+        </div>
+        <div class="bcc_r_b_right">
+          <el-button size="small" @click="goToEdit">前往编辑</el-button>
+          <el-button size="small" @click="lookReport">查看报告</el-button>
+          <el-button size="small" @click="regenerate">重新生成</el-button>
+        </div>
+      </div>
+    </div>
+    <editBaseMessageDialog ref="editBaseMessageDialogRef"/>
+  </div>
+</template>
+
+<script>
+import editBaseMessageDialog from '../dialog/editBaseMessageDialog.vue';
+export default {
+  components:{
+    editBaseMessageDialog
+  },
+  data(){
+    return{
+      checked:false,
+      data:{
+        remarks:"备注",
+        status:"0",//0 等待处理  1处理中  2已完成  3失败
+        stepsList:[
+          {type:"uploadFile",text:"上传文件",status:"0",progress:"0"},
+          {type:"transcription",text:"文本转录",status:"0",progress:"0"},
+          {type:"automaticCoding",text:"自动编码",status:"0",progress:"0"},
+          {type:"generateReport",text:"生成报告",status:"0",progress:"0"}
+        ],
+      },
+    }
+  },
+  watch:{
+    checked(newValue){
+      if(newValue){
+        this.$message.info("添加至列表")
+      }else{
+        this.$message.info("列表删除")
+      }
+    }
+  },
+  methods: {
+    editBaseMessage(){
+      this.$refs.editBaseMessageDialogRef.open();
+    },
+    //前往编辑
+    goToEdit(){
+      this.$message.info("前往编辑")
+    },
+    //查看报告
+    lookReport(){
+      this.$message.info("查看报告")
+    },
+    //重新生成
+    regenerate(){
+      this.$message.info("重新生成")
+    },
+
+  },
+};
+</script>
+
+<style scoped>
+.batchClassCard {
+  width: 100%;
+  height: 130px;
+  margin: 20px 0;
+  border-radius: 15px;
+  box-sizing: border-box;
+  border: 1px solid rgba(150, 155, 163, 0.4);
+  padding: 20px;
+  display: flex;
+  align-items: center;
+  background-color: #fff;
+}
+
+.bcc_left {
+  width: 50px;
+  height: 100%;
+  display: flex;
+  box-sizing: border-box;
+  padding-left: 10px;
+  /* justify-content: center; */
+  align-items: center;
+}
+
+.bcc_right {
+  width: calc(100% - 50px);
+  height: 100%;
+  display: flex;
+  flex-direction: column;
+}
+
+.bcc_r_top{
+  width: 100%;
+  height: 60px;
+  display: flex;
+  align-items: center;
+  justify-content: space-between;
+}
+
+.bcc_r_t_left{
+  width: calc(100% - 100px);
+  height: 100%;
+  display: flex;
+  align-items: center;
+}
+
+.bcc_r_t_l_image{
+  width: 50px;
+  height: 50px;
+}
+
+.bcc_r_t_l_image>img{
+  width: 45px;
+  height: 45px;
+  object-fit: cover;
+}
+.bcc_r_t_right{
+  width: 100px;
+  height: 100%;
+  display: flex;
+  align-items: flex-start;
+  justify-content: flex-end;
+  cursor: pointer;
+}
+
+.bcc_r_t_right>span{
+  font-size: 16px;
+}
+
+.bcc_r_t_l_message{
+  width: 100%;
+  height: 50px;
+}
+
+.bcc_r_t_l_message>div{
+  width: 100%;
+  height: auto;
+  display: flex;
+  align-items: center;
+}
+
+.bcc_r_t_l_message>div>span{
+  max-width: calc(100% - 70px);
+  text-overflow: ellipsis;
+  overflow: hidden;
+  white-space: nowrap;
+  font-size: 16px;
+  color: #000;
+}
+
+.bcc_r_t_l_message>div>img{
+  width: 18px;
+  height: 18px;
+  margin-left: 10px;
+  cursor: pointer;
+}
+
+.bcc_r_t_l_message>span{
+  margin-top: 10px;
+  font-size: 14px;
+  display: block;
+  color: rgba(150, 155, 163, 1);
+}
+
+.bcc_r_bottom{
+  width: 100%;
+  display: flex;
+  align-items: center;
+  justify-content: space-between;
+  height: calc(100% - 60px);
+}
+
+.bcc_r_b_left{
+  /* width: calc(100% - 200px); */
+  width: calc(100% - 290px);
+  height: 100%;
+  border-radius: 5px;
+  box-sizing: border-box;
+  border: dashed 1px rgba(150, 155, 163, 1);
+  display: flex;
+  align-items: center;
+}
+
+.bcc_r_b_left>span{
+  display: block;
+  width: 100%;
+  height: 100%;
+  line-height: 25px;
+}
+
+.bcc_r_b_left >>> .el-input{
+  width: 100%;
+  height: 100%;
+}
+
+.bcc_r_b_left >>> .el-input >.el-input__inner{
+  width: 100%;
+  height: 100%;
+  border: none;
+  outline: none;
+}
+
+.bcc_r_b_right{
+  width: 260px;
+  height: 100%;
+  display: flex;
+  align-items: center;
+  justify-content: flex-end;
+}
+
+.status_success{
+color: rgba(188, 230, 133, 1);
+}
+
+.status_doing{
+  color: rgba(54, 129, 252, 1);
+}
+
+.status_wait{
+  color:rgba(150, 155, 163, 1);
+}
+
+.status_fail{
+  color: rgb(185, 2, 2);
+}
+
+</style>

Неке датотеке нису приказане због велике количине промена