浏览代码

Merge branch 'beta' of https://git.cocorobo.cn/CocoRoboLabs/pbl-teacher-table into beta

lsc 5 月之前
父节点
当前提交
3485a3cdfe

+ 1 - 1
dist/index.html

@@ -32,7 +32,7 @@
       width: 100%;
       background: #e6eaf0;
       font-family: '黑体';
-    }</style><link href=./static/css/app.fdbe584f895b003f39cda92f5a5e6c20.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.de15001ce66f032e9274.js></script><script type=text/javascript src=./static/js/app.5ee375743bf565dfb7ba.js></script></body></html><script>function stopSafari() {
+    }</style><link href=./static/css/app.3604a2aab1d8248ff465916f97b9b177.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.de15001ce66f032e9274.js></script><script type=text/javascript src=./static/js/app.5a0b10304d0f426a4815.js></script></body></html><script>function stopSafari() {
     //阻止safari浏览器双击放大功能
     let lastTouchEnd = 0  //更新手指弹起的时间
     document.documentElement.addEventListener("touchstart", function (event) {

文件差异内容过多而无法显示
+ 0 - 0
dist/static/css/app.3604a2aab1d8248ff465916f97b9b177.css


文件差异内容过多而无法显示
+ 0 - 0
dist/static/css/app.3604a2aab1d8248ff465916f97b9b177.css.map


文件差异内容过多而无法显示
+ 0 - 0
dist/static/js/app.5a0b10304d0f426a4815.js


文件差异内容过多而无法显示
+ 0 - 0
dist/static/js/app.5a0b10304d0f426a4815.js.map


文件差异内容过多而无法显示
+ 0 - 0
dist/static/js/manifest.161e82026ac2ae03ab6f.js.map


+ 7 - 2
src/components/pages/appStore/dialog/saveCard.vue

@@ -54,7 +54,11 @@ export default {
     data: {
       type: Array,
       default: () => []
-    }
+    },
+		type:{
+			type:Number,
+			default:0
+		},
   },
   data() {
     return {};
@@ -80,7 +84,8 @@ export default {
   },
 	methods: {
 		openAppUrl(item){
-			window.open(item.url, "_blank");
+			this.$emit("saveClick",item,this.type)
+			// window.open(item.url, "_blank");
 		}
 	},
 };

+ 372 - 238
src/components/pages/appStore/views/appManagement.vue

@@ -1,17 +1,50 @@
 <template>
   <div class="appManagement">
     <div class="ac_left">
-			<!-- <recentUseCard/>
-			<collectCard/> -->
-			<saveCard title="最近使用" :data="recentUse"/>
-			<saveCard title="收藏" :data="collect"/>
-		</div>
+      <saveCard title="最近使用" :data="recentUse" :type="1" @saveClick="openApp"/>
+      <saveCard title="收藏" :data="collect" :type="0" @saveClick="openApp"/>
+    </div>
     <div class="ac_right">
       <div class="ac_header">
         <div class="ac_h_top">
-					<span>应用管理</span>
-          <!-- <span class="ac_h_t_active">应用管理</span>
-          <span @click="changeShowPage(1)">工作空间</span> -->
+          <span class="ac_h_t_active"> <!-- class="ac_h_t_active"-->
+            <svg
+              width="20"
+              height="20"
+              viewBox="0 0 20 20"
+              xmlns="http://www.w3.org/2000/svg"
+            >
+              <path
+                d="M14.0625 2.1875C11.9914 2.1875 10.3125 3.86643 10.3125 5.9375C10.3125 8.00857 11.9914 9.6875 14.0625 9.6875C16.1336 9.6875 17.8125 8.00857 17.8125 5.9375C17.8125 3.86643 16.1336 2.1875 14.0625 2.1875ZM11.5625 5.9375C11.5625 4.55679 12.6818 3.4375 14.0625 3.4375C15.4432 3.4375 16.5625 4.55679 16.5625 5.9375C16.5625 7.31821 15.4432 8.4375 14.0625 8.4375C12.6818 8.4375 11.5625 7.31821 11.5625 5.9375Z"
+              />
+              <path
+                d="M2.5 3.75C2.5 3.05964 3.05964 2.5 3.75 2.5H8.125C8.81536 2.5 9.375 3.05964 9.375 3.75V8.125C9.375 8.81536 8.81536 9.375 8.125 9.375H3.75C3.05964 9.375 2.5 8.81536 2.5 8.125V3.75ZM3.75 3.75V8.125H8.125V3.75H3.75Z"
+              />
+              <path
+                d="M2.5 11.875C2.5 11.1846 3.05964 10.625 3.75 10.625H8.125C8.81536 10.625 9.375 11.1846 9.375 11.875V16.25C9.375 16.9404 8.81536 17.5 8.125 17.5H3.75C3.05964 17.5 2.5 16.9404 2.5 16.25V11.875ZM3.75 11.875V16.25H8.125V11.875H3.75Z"
+              />
+              <path
+                d="M10.625 11.875C10.625 11.1846 11.1846 10.625 11.875 10.625H16.25C16.9404 10.625 17.5 11.1846 17.5 11.875V16.25C17.5 16.9404 16.9404 17.5 16.25 17.5H11.875C11.1846 17.5 10.625 16.9404 10.625 16.25V11.875ZM11.875 16.25H16.25V11.875H11.875V16.25Z"
+              />
+            </svg>
+            应用管理</span
+          >
+          <span @click="changeShowPage(1)">
+            <svg
+              width="20"
+              height="20"
+              viewBox="0 0 20 20"
+              xmlns="http://www.w3.org/2000/svg"
+            >
+              <rect width="20" height="20" fill="white" />
+              <path
+                fill-rule="evenodd"
+                clip-rule="evenodd"
+                d="M9.70072 1.32632C9.88727 1.22456 10.1127 1.22456 10.2993 1.32632L17.1743 5.07632C17.3751 5.18584 17.5 5.39628 17.5 5.625V14.375C17.5 14.6037 17.3751 14.8142 17.1743 14.9237L10.2993 18.6737C10.1127 18.7754 9.88727 18.7754 9.70072 18.6737L2.82572 14.9237C2.62493 14.8142 2.5 14.6037 2.5 14.375V5.625C2.5 5.39628 2.62493 5.18584 2.82572 5.07632L9.70072 1.32632ZM3.75 6.79282V14.004L9.375 17.0722V14.1039L6.55344 12.4109C6.36519 12.298 6.25 12.0945 6.25 11.875V8.45949L3.75 6.79282ZM7.5 8.47887V10.7711L9.375 9.64613V7.35387L7.5 8.47887ZM10.625 7.35387V9.64613L12.5 10.7711V8.47887L10.625 7.35387ZM13.75 8.45949V11.875C13.75 12.0945 13.6348 12.298 13.4466 12.4109L10.625 14.1039V17.0722L16.25 14.004V6.79282L13.75 8.45949ZM15.668 5.67854L10 2.58693L4.33205 5.67854L6.8926 7.38557L9.67844 5.71407C9.87637 5.59531 10.1236 5.59531 10.3216 5.71407L13.1074 7.38557L15.668 5.67854ZM10 13.0211L11.9102 11.875L10 10.7289L8.08978 11.875L10 13.0211Z"
+              />
+            </svg>
+            工作空间</span
+          >
           <el-button
             type="primary"
             size="small"
@@ -21,9 +54,12 @@
             >添加应用</el-button
           >
         </div>
-				<!-- <div class="ac_h_banner">
-					<img src="https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/default%2Fae42534d-ee90-4bb1-8ef9-d344ee27b8241733733277828.jpg" alt="banner图">
-				</div> -->
+        <div class="ac_h_banner" v-if="bannerObj">
+          <img
+            :src="bannerObj.poster"
+            alt="banner图"
+          />
+        </div>
         <div class="ac_h_bottom">
           <div class="ac_h_b_typeList">
             <span
@@ -39,17 +75,13 @@
               >{{ item.name }}</span
             >
           </div>
-					<div class="ac_h_b_selectList">
-            <el-input
-              v-model="searchText"
-              style="width: 200px;margin-right: 10px;"
-              placeholder="请输入应用名称"
-              @keyup.enter.native="getData"
-            />
+          <div class="ac_h_b_selectList">
+
             <el-select
               v-model="selectJuri"
               placeholder="请选择"
               @change="changeSelectType"
+							style="width: 150px;margin-right: 10px;"
             >
               <el-option
                 v-for="item in selectList"
@@ -58,6 +90,13 @@
                 :value="item.index"
               ></el-option>
             </el-select>
+						<el-input
+              v-model="searchText"
+              style="width: 200px;"
+              placeholder="请输入应用名称"
+              @keyup.enter.native="getData"
+							clearable
+            />
             <el-button
               type="primary"
               style="margin-left: 10px;"
@@ -79,7 +118,11 @@
           <div class="ac_c_i_top">
             <div class="ac_c_i_t_left">
               <svg
-                v-if="isImageOrSvg(typeof item.json =='object'?item.json.icon:'') === 0"
+                v-if="
+                  isImageOrSvg(
+                    typeof item.json == 'object' ? item.json.icon : ''
+                  ) === 0
+                "
                 t="1732605901531"
                 class="icon"
                 viewBox="0 0 1024 1024"
@@ -101,11 +144,19 @@
                 ></path>
               </svg>
               <span
-                v-if="isImageOrSvg(typeof item.json =='object'?item.json.icon:'') === 1"
+                v-if="
+                  isImageOrSvg(
+                    typeof item.json == 'object' ? item.json.icon : ''
+                  ) === 1
+                "
                 v-html="item.json.icon"
               ></span>
               <el-image
-                v-if="isImageOrSvg(typeof item.json =='object'?item.json.icon:'') === 2"
+                v-if="
+                  isImageOrSvg(
+                    typeof item.json == 'object' ? item.json.icon : ''
+                  ) === 2
+                "
                 style="width: 100%; height: 100%"
                 :src="item.json.icon"
                 fit="cover"
@@ -121,12 +172,28 @@
                 v-if="editAppCard === item.id"
                 v-click-outside="handleBlur"
               >
-                
-								<div @click.stop="cancelCollectApp(item)"  v-if="collect.map(i=>i.id).includes(item.id)">取消收藏</div>
+                <div
+                  @click.stop="cancelCollectApp(item)"
+                  v-if="collect.map(i => i.id).includes(item.id)"
+                >
+                  取消收藏
+                </div>
                 <div @click.stop="collectApp(item)" v-else>收藏</div>
-								<div @click.stop="copyApp(item)" v-if="item.json && item.json.copy==='1'">复制</div>
-								<div @click.stop="updateApp(item)" v-if="item.userid === userId">修改</div>
-								<div @click.stop="delApp(item)" v-if="item.userid === userId">删除</div>
+                <div
+                  @click.stop="copyApp(item)"
+                  v-if="item.json && item.json.copy === '1'"
+                >
+                  复制
+                </div>
+                <div
+                  @click.stop="updateApp(item)"
+                  v-if="item.userid === userId"
+                >
+                  修改
+                </div>
+                <div @click.stop="delApp(item)" v-if="item.userid === userId">
+                  删除
+                </div>
               </div>
               <svg
                 t="1732786015570"
@@ -191,9 +258,9 @@ import saveCard from "../dialog/saveCard.vue";
 export default {
   components: {
     addAppDialog,
-		saveCard
-		// collectCard,
-		// recentUseCard
+    saveCard
+    // collectCard,
+    // recentUseCard
   },
   directives: {
     "click-outside": clickOutside // 注册自定义指令
@@ -216,7 +283,8 @@ export default {
       dataList: [],
       recentUse: [],
       collect: [],
-      editAppCard: null
+      editAppCard: null,
+      bannerObj:null
     };
   },
   computed: {
@@ -303,71 +371,77 @@ export default {
     },
     // 收藏APP
     collectApp(item) {
-			this.editAppCard = null;
-			this.insertSave(item,0)
-		},
-		//复制app
-		copyApp(item){
-			this.$confirm(`确定复制《${item.name}》这个应用吗?`,"复制",{
-				confirmButtonText:"确定",
-				cancelButtonText:"取消",
-				type:"warning"
-			}).then(()=>{
-				let params = [
+      this.editAppCard = null;
+      this.insertSave(item, 0);
+    },
+    //复制app
+    copyApp(item) {
+      this.$confirm(`确定复制《${item.name}》这个应用吗?`, "复制", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning"
+      })
+        .then(() => {
+          let params = [
+            {
+              name: `${item.name}_copy`, //app名称
+              userid: this.userId, //创建的用户ID
+              label: item.label, //app标签
+              detail: item.detail, //app简介
+              url: item.url, //app链接
+              type: item.type, //app类型
+              juri: "1", //app权限 1:我的 2:组织 3:所有人
+              stand: "cn", //语言
+              json: JSON.stringify(item.json) //其他信息
+            }
+          ];
+          this.ajax
+            .post(this.$store.state.api + "insert_appStore", params)
+            .then(res => {
+              if (res.data == 1) {
+                this.$message.success("复制成功");
+                this.getData();
+              } else {
+                this.$message.error("复制失败");
+              }
+            })
+            .catch(err => {
+              console.log(err);
+              this.$message.error("复制失败");
+            });
+        })
+        .catch(_ => {
+          console.log("取消复制");
+        });
+    },
+    // 取消收藏
+    cancelCollectApp(item) {
+      this.editAppCard = null;
+      let _data = this.collect.find(i => i.id === item.id);
+      if (_data) {
+        let params = [
           {
-            name: `${item.name}_copy`, //app名称
-            userid: this.userId, //创建的用户ID
-            label: item.label, //app标签
-            detail: item.detail, //app简介
-            url: item.url, //app链接
-            type: item.type, //app类型
-            juri: "1", //app权限 1:我的 2:组织 3:所有人
-            stand: "cn", //语言
-            json: JSON.stringify(item.json) //其他信息
+            sid: _data.sid
           }
         ];
-				this.ajax
-          .post(this.$store.state.api + "insert_appStore", params)
+        this.ajax
+          .post(this.$store.state.api + "delete_appStoreSave", params)
           .then(res => {
-            if (res.data == 1) {
-              this.$message.success("复制成功");
-              this.getData();
-            } else {
-              this.$message.error("复制失败");
+            if (res.data) {
+              this.$message.success("取消收藏成功");
             }
+            this.getCollect();
           })
-          .catch(err => {
-            console.log(err);
-            this.$message.error("复制失败");
+          .catch(e => {
+            console.log(e);
+            this.$message.error("取消收藏失败");
+            this.getCollect();
           });
-			}).catch(_=>{
-				console.log("取消复制")
-			})
-		},
-		// 取消收藏
-		cancelCollectApp(item){
-			this.editAppCard = null;
-			let _data = this.collect.find(i=>i.id===item.id);
-			if(_data){
-				let params = [{
-					sid:_data.sid
-				}]
-				this.ajax.post(this.$store.state.api+"delete_appStoreSave",params).then(res=>{
-					if(res.data){
-						this.$message.success("取消收藏成功")
-					}
-					this.getCollect();
-				}).catch(e=>{
-					console.log(e)
-					this.$message.error("取消收藏失败")
-					this.getCollect();
-				})
-			}else{
-				this.$message.error("取消收藏失败");
-				this.getCollect();
-			}
-			
-		},
+      } else {
+        this.$message.error("取消收藏失败");
+        this.getCollect();
+      }
+    },
     updateCard(id) {
       if (this.editAppCard === id) return (this.editAppCard = null);
       this.editAppCard = id;
@@ -461,12 +535,11 @@ export default {
           this.$message.error("获取应用类型失败");
         });
     },
-    openApp(item) {
+    openApp(item,type=0) {
       window.open(item.url, "_blank");
-			if (!(this.recentUse.length > 0 && item.id === this.recentUse[0].id)) {
-				this.insertSave(item,1);
-			}
-			
+      if (!(this.recentUse.length > 0 && item.id === this.recentUse[0].id) && type===0) {
+        this.insertSave(item, 1);
+      }
     },
     resetData() {
       this.searchText = "";
@@ -474,112 +547,153 @@ export default {
       this.showType = "";
       this.getData();
     },
-		getRecentUse(){
-			let params = {
-				uid:this.userId,
-				type:1,
-				limit:10,
-			}
-
-			this.ajax.get(this.$store.state.api+"select_appStoreSave",params).then(res=>{
-				let data = res.data[0];
-				if(data.length>0){
-					data.forEach(i => {
-            if (i.json) {
-              i.json = JSON.parse(i.json);
+    getRecentUse() {
+      let params = {
+        uid: this.userId,
+        type: 1,
+        limit: 10
+      };
+
+      this.ajax
+        .get(this.$store.state.api + "select_appStoreSave", params)
+        .then(res => {
+          let data = res.data[0];
+          if (data.length > 0) {
+            data.forEach(i => {
+              if (i.json) {
+                i.json = JSON.parse(i.json);
+              }
+            });
+            this.recentUse = data;
+          } else {
+            this.recentUse = [];
+          }
+        })
+        .catch(err => {
+          console.log(err);
+          console.log("获取最近使用失败");
+          // this.$message.error("获取收藏应用失败")
+        });
+    },
+    getCollect() {
+      let params = {
+        uid: this.userId,
+        type: 0,
+        limit: 0
+      };
+      this.ajax
+        .get(this.$store.state.api + "select_appStoreSave", params)
+        .then(res => {
+          let data = res.data[0];
+          if (data.length > 0) {
+            data.forEach(i => {
+              if (i.json) {
+                i.json = JSON.parse(i.json);
+              }
+            });
+            this.collect = data;
+          } else {
+            this.collect = [];
+          }
+        })
+        .catch(err => {
+          console.log(err);
+          this.$message.error("获取收藏应用失败");
+        });
+    },
+    insertSave(item, type) {
+      let params = [
+        {
+          uid: this.userId,
+          type: type,
+          aid: item.id,
+          json: ""
+        }
+      ];
+
+      this.ajax
+        .post(this.$store.state.api + "insert_appStoreSave", params)
+        .then(res => {
+          if (res.data) {
+            if (type === 0) {
+              this.$message.success("收藏成功");
+              this.getCollect();
+            } else if (type === 1) {
+              this.getRecentUse();
             }
-          });
-					this.recentUse = data;
-				}else{
-					this.recentUse = [];
-				}
-			}).catch(err=>{
-				console.log(err)
-				console.log("获取最近使用失败")
-				// this.$message.error("获取收藏应用失败")
-			})
-
-		},
-		getCollect(){
-			let params = {
-				uid:this.userId,
-				type:0,
-				limit:0,
-			}
-			this.ajax.get(this.$store.state.api+"select_appStoreSave",params).then(res=>{
-				let data = res.data[0];
-				if(data.length>0){
-					data.forEach(i => {
-            if (i.json) {
-              i.json = JSON.parse(i.json);
+          }
+        })
+        .catch(err => {
+          console.log(err);
+          if (type === 0) this.$message.error("收藏失败");
+        });
+    },
+    delApp(item) {
+      this.$confirm(
+        `确定要删除《${item.name}》这个应用吗,删除后无法找回!`,
+        `确定删除应用`,
+        {
+          confirmButtonText: "确定",
+          cancelButtonText: "取消",
+          type: "warning"
+        }
+      )
+        .then(() => {
+          let params = [
+            {
+              uid: this.userId,
+              aid: item.id
             }
-          });
-					this.collect = data;
-				}else{
-					this.collect = [];
-				}
-			}).catch(err=>{
-				console.log(err)
-				this.$message.error("获取收藏应用失败")
-			})
-		},
-		insertSave(item,type){
-			let params = [{
-				uid:this.userId,
-				type:type,
-				aid:item.id,
-				json:"",
-			}]
-
-			this.ajax.post(this.$store.state.api+"insert_appStoreSave",params).then(res=>{
-				if(res.data){
-					if(type===0){
-						this.$message.success("收藏成功")
-						this.getCollect();
-					}else if(type===1){
-						this.getRecentUse();
-					}
-				}
-			}).catch(err=>{
-				console.log(err)
-				if(type===0)this.$message.error("收藏失败")
-			})
-
-		},
-		delApp(item){
-			this.$confirm(`确定要删除《${item.name}》这个应用吗,删除后无法找回!`, `确定删除应用`, {
-				confirmButtonText: '确定',
-				cancelButtonText: '取消',
-				type: 'warning'
-			}).then(() => {
-				let params = [{
-					uid: this.userId,
-					aid: item.id
-				}];
-				this.ajax.post(this.$store.state.api + "delete_appStore", params).then(res => {
-					if (res.data) {
-						this.$message.success("删除成功");
-						this.getData();
-					} else {
-						this.$message.error("删除失败");
-					}
-				}).catch(err => {
-					console.log(err);
-					this.$message.error("删除失败");
-				});
-			}).catch(() => {
-				console.log("取消删除");
-			});
-		},
-		changeShowPage(newPage){
-			this.$emit("changeShowCard",newPage)
-		}
+          ];
+          this.ajax
+            .post(this.$store.state.api + "delete_appStore", params)
+            .then(res => {
+              if (res.data) {
+                this.$message.success("删除成功");
+                this.getData();
+              } else {
+                this.$message.error("删除失败");
+              }
+            })
+            .catch(err => {
+              console.log(err);
+              this.$message.error("删除失败");
+            });
+        })
+        .catch(() => {
+          console.log("取消删除");
+        });
+    },
+    changeShowPage(newPage) {
+      this.$emit("changeShowCard", newPage);
+    },
+    getBanner(){
+      let params = {
+        uid:this.userId,
+        oid:this.oid,
+        org:this.org,
+        type:4
+      }
+
+      this.ajax.get(this.$store.state.api+"select_bannerByoidORorg",params).then(res=>{
+        let _data = res.data[0];
+        if(_data[0]){
+          this.bannerObj = _data[0];
+        }else{
+          this.bannerObj = null
+        }
+      }).catch(e=>{
+        console.log("获取banner图失败")
+        console.log(e)
+      })
+    }
   },
   mounted() {
     this.getTypeList();
     this.getData();
-		this.getCollect();
-		this.getRecentUse();
+    this.getCollect();
+    this.getRecentUse();
+    this.getBanner()
   }
 };
 </script>
@@ -598,16 +712,16 @@ export default {
 }
 
 .ac_left {
-	width: 280px;
+  width: 280px;
   min-width: 280px;
   margin-right: 20px;
   height: 100%;
   border-radius: 5px;
   background-color: #fff;
   box-shadow: 0 0 10px 0 rgba(0, 0, 0, 0.1);
-	box-sizing: border-box;
-	padding: 10px;
-	overflow: auto;
+  box-sizing: border-box;
+  padding: 10px;
+  overflow: auto;
 }
 
 .ac_right {
@@ -623,8 +737,8 @@ export default {
   width: 100%;
   height: auto;
   border-radius: 5px;
-  background-color: #fff;
   box-shadow: 0 0 10px 0 rgba(0, 0, 0, 0.1);
+	background-color: #fff;
 }
 
 .ac_h_top {
@@ -635,51 +749,70 @@ export default {
   box-sizing: border-box;
   padding: 0 15px;
   border-bottom: 1px solid #eeeeee;
+
   position: relative;
+  justify-content: center;
 }
 
 .ac_h_top > span {
-  font-size: 26px;
-	position: relative;
-	margin-right: 25px;
-	cursor: pointer;
+  font-size: 22px;
+  position: relative;
+  margin-right: 25px;
+  cursor: pointer;
+	display: flex;
+	align-items: center;
 }
 
-.ac_h_t_active::after{
-	content: "";
-	position: absolute;
-	width: 100%;
-	height: 3px;
-	border-radius: 4px;
-	background-color: #409EFF;
-	left: 0;
-	bottom: -5px;
+.ac_h_top > span>svg{
+	width: 22px;
+	height: 22px;
+	fill: #1A1A1A;
+	margin-right: 10px;
 }
 
-.ac_h_banner{
-	width: 100%;
-	height: 200px;
-	border-radius: 5px;
-	overflow: hidden;
-	box-sizing: border-box;
-	padding: 10px;
+.ac_h_t_active{
+	color: #0354D7;
 }
 
-.ac_h_banner>img{
-	width: 100%;
-	height: 100%;
-	object-fit:cover;
-	border-radius: 5px;
+.ac_h_t_active>svg{
+	fill: #0354D7 !important;
+}
+
+/* .ac_h_t_active::after {
+  content: "";
+  position: absolute;
+  width: 100%;
+  height: 3px;
+  border-radius: 4px;
+  background-color: #409eff;
+  left: 0;
+  bottom: -5px;
+} */
+
+.ac_h_banner {
+  width: 100%;
+  height: 300px;
+  border-radius: 5px;
+  overflow: hidden;
+  box-sizing: border-box;
+  padding: 10px;
+}
+
+.ac_h_banner > img {
+  width: 100%;
+  height: 100%;
+  object-fit: cover;
+  border-radius: 5px;
 }
 
 .ac_h_bottom {
   width: 100%;
   height: auto;
   padding: 10px 15px 10px 15px;
-	box-sizing: border-box;
-	display: flex;
-	justify-content: space-between;
-	align-items: center;
+  box-sizing: border-box;
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
 }
 
 .ac_h_b_typeList {
@@ -705,16 +838,17 @@ export default {
 .ac_h_b_selectList {
   margin-left: 15px;
   margin-bottom: 10px;
-	display: flex;
-	align-items: center;
+  display: flex;
+  align-items: center;
 }
 
 .ac_content {
   width: 100%;
   flex: 1;
   height: auto;
-  margin-top: 20px;
+  margin-top:10px;
   overflow: auto;
+	min-height: 200px;
 }
 
 .ac_c_item {
@@ -825,7 +959,7 @@ export default {
   cursor: pointer;
   transition: 0.3s;
   font-weight: bold;
-  font-size: .9em;
+  font-size: 0.9em;
   border-radius: 5px;
   display: flex;
   justify-content: center;
@@ -852,15 +986,15 @@ export default {
   height: 100%;
 }
 
-.ac_c_i_t_left >span{
-	width: 100%;
-	height: 100%;
-	display: block;
+.ac_c_i_t_left > span {
+  width: 100%;
+  height: 100%;
+  display: block;
 }
 
-.ac_c_i_t_left >span>>>svg{
-	width: 100%;
-	height: 100%;
+.ac_c_i_t_left > span >>> svg {
+  width: 100%;
+  height: 100%;
 }
 
 .ac_c_i_t_right {

+ 555 - 38
src/components/pages/appStore/views/workSpace.vue

@@ -1,29 +1,312 @@
 <template>
   <div class="workSpace">
-    <div class="ac_header">
-      <div class="ac_h_top">
-        <span @click="changeShowPage(0)">应用管理</span>
-				<span class="ac_h_t_active">工作空间</span>
-      </div>
+    <div class="ac_left">
+      <saveCard
+        title="最近使用"
+        :data="recentUse"
+        :type="0"
+        @saveClick="openApp"
+      />
+      <saveCard title="收藏" :data="collect" :type="1" @saveClick="openApp" />
     </div>
-		<div class="ac_content">
+    <div class="ac_right">
+      <div class="ac_header">
+        <div class="ac_h_top">
+          <span @click="changeShowPage(0)">
+            <svg
+              width="20"
+              height="20"
+              viewBox="0 0 20 20"
+              xmlns="http://www.w3.org/2000/svg"
+            >
+              <path
+                d="M14.0625 2.1875C11.9914 2.1875 10.3125 3.86643 10.3125 5.9375C10.3125 8.00857 11.9914 9.6875 14.0625 9.6875C16.1336 9.6875 17.8125 8.00857 17.8125 5.9375C17.8125 3.86643 16.1336 2.1875 14.0625 2.1875ZM11.5625 5.9375C11.5625 4.55679 12.6818 3.4375 14.0625 3.4375C15.4432 3.4375 16.5625 4.55679 16.5625 5.9375C16.5625 7.31821 15.4432 8.4375 14.0625 8.4375C12.6818 8.4375 11.5625 7.31821 11.5625 5.9375Z"
+              />
+              <path
+                d="M2.5 3.75C2.5 3.05964 3.05964 2.5 3.75 2.5H8.125C8.81536 2.5 9.375 3.05964 9.375 3.75V8.125C9.375 8.81536 8.81536 9.375 8.125 9.375H3.75C3.05964 9.375 2.5 8.81536 2.5 8.125V3.75ZM3.75 3.75V8.125H8.125V3.75H3.75Z"
+              />
+              <path
+                d="M2.5 11.875C2.5 11.1846 3.05964 10.625 3.75 10.625H8.125C8.81536 10.625 9.375 11.1846 9.375 11.875V16.25C9.375 16.9404 8.81536 17.5 8.125 17.5H3.75C3.05964 17.5 2.5 16.9404 2.5 16.25V11.875ZM3.75 11.875V16.25H8.125V11.875H3.75Z"
+              />
+              <path
+                d="M10.625 11.875C10.625 11.1846 11.1846 10.625 11.875 10.625H16.25C16.9404 10.625 17.5 11.1846 17.5 11.875V16.25C17.5 16.9404 16.9404 17.5 16.25 17.5H11.875C11.1846 17.5 10.625 16.9404 10.625 16.25V11.875ZM11.875 16.25H16.25V11.875H11.875V16.25Z"
+              />
+            </svg>
+            应用管理</span
+          >
+          <span class="ac_h_t_active">
+            <svg
+              width="20"
+              height="20"
+              viewBox="0 0 20 20"
+              xmlns="http://www.w3.org/2000/svg"
+            >
+              <rect width="20" height="20" fill="white" />
+              <path
+                fill-rule="evenodd"
+                clip-rule="evenodd"
+                d="M9.70072 1.32632C9.88727 1.22456 10.1127 1.22456 10.2993 1.32632L17.1743 5.07632C17.3751 5.18584 17.5 5.39628 17.5 5.625V14.375C17.5 14.6037 17.3751 14.8142 17.1743 14.9237L10.2993 18.6737C10.1127 18.7754 9.88727 18.7754 9.70072 18.6737L2.82572 14.9237C2.62493 14.8142 2.5 14.6037 2.5 14.375V5.625C2.5 5.39628 2.62493 5.18584 2.82572 5.07632L9.70072 1.32632ZM3.75 6.79282V14.004L9.375 17.0722V14.1039L6.55344 12.4109C6.36519 12.298 6.25 12.0945 6.25 11.875V8.45949L3.75 6.79282ZM7.5 8.47887V10.7711L9.375 9.64613V7.35387L7.5 8.47887ZM10.625 7.35387V9.64613L12.5 10.7711V8.47887L10.625 7.35387ZM13.75 8.45949V11.875C13.75 12.0945 13.6348 12.298 13.4466 12.4109L10.625 14.1039V17.0722L16.25 14.004V6.79282L13.75 8.45949ZM15.668 5.67854L10 2.58693L4.33205 5.67854L6.8926 7.38557L9.67844 5.71407C9.87637 5.59531 10.1236 5.59531 10.3216 5.71407L13.1074 7.38557L15.668 5.67854ZM10 13.0211L11.9102 11.875L10 10.7289L8.08978 11.875L10 13.0211Z"
+              />
+            </svg>
+            工作空间</span
+          >
+        </div>
+				<div class="ac_h_banner" v-if="bannerObj">
+          <img
+            :src="bannerObj.poster"
+            alt="banner图"
+          />
+        </div>
+        <div class="ac_h_bottom">
+          <div class="ac_h_b_typeList">
+            <span
+              :class="{ ac_h_b_typeList_active: showType === '' }"
+              @click="changeShowType('')"
+            >
+              全部
+            </span>
+            <span
+              :class="{ ac_h_b_typeList_active: showType === '1' }"
+              @click="changeShowType('1')"
+            >
+              智能体
+            </span>
+            <span
+              :class="{ ac_h_b_typeList_active: showType === '2' }"
+              @click="changeShowType('2')"
+            >
+              工作流
+            </span>
+          </div>
+          <div class="ac_h_b_selectList">
+            <el-select
+              v-model="statusSelect"
+              placeholder="请选择"
+              @change="changeSelectType"
+              style="width: 150px;margin-right: 10px;"
+            >
+              <el-option
+                v-for="item in statusSelectList"
+                :key="item.index"
+                :label="item.label"
+                :value="item.index"
+              ></el-option>
+            </el-select>
+
+            <el-select
+              v-model="tagSelect"
+              placeholder="请选择"
+              @change="changeSelectType"
+              style="width: 150px;margin-right: 10px;"
+            >
+              <el-option
+                v-for="item in tagSelectList"
+                :key="item.index"
+                :label="item.label"
+                :value="item.index"
+              ></el-option>
+            </el-select>
+
+            <el-input
+              v-model="searchText"
+              style="width: 200px;"
+              placeholder="请输入名称"
+              @keyup.enter.native="getData"
+              clearable
+            />
+            <el-button
+              type="primary"
+              style="margin-left: 10px;"
+              icon="el-icon-search"
+              @click="getData"
+            ></el-button>
+            <el-button type="primary" @click="resetData">重置</el-button>
+          </div>
+        </div>
+      </div>
 
-		</div>
+      <div class="ac_content">
+        <div class="ac_c_item" v-for="item in 10">
+          <div class="ac_c_i_top">
+            <img
+              src="https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/default%2F%E6%B5%8B%E8%AF%951733981587859.jpg"
+              alt="封面"
+            />
+            <div>
+              <div>名称名称名称名称名称名称名称名称</div>
+              <span class="ac_c_i_t_brief">简介简介简介简介简介</span>
+              <span class="ac_c_i_t_time">2024-12-12 10:22:04 编辑</span>
+            </div>
+          </div>
+          <div class="ac_c_i_t_popover">
+            <div
+              class="ac_c_i_t_p_box"
+              v-if="editAppCard"
+              v-click-outside="handleBlur"
+            >
+              <div>编辑</div>
+              <div>收藏</div>
+              <div>复制</div>
+              <div>删除</div>
+            </div>
+
+            <svg
+              t="1732786015570"
+              @click.stop="updateCard(!editAppCard)"
+              class="icon"
+              viewBox="0 0 1024 1024"
+              version="1.1"
+              xmlns="http://www.w3.org/2000/svg"
+              p-id="9199"
+              width="200"
+              height="200"
+            >
+              <path
+                d="M192 443.733333c-38.4 0-68.266667 29.866667-68.266667 68.266667 0 38.4 29.866667 68.266667 68.266667 68.266667s68.266667-29.866667 68.266667-68.266667c0-38.4-29.866667-68.266667-68.266667-68.266667zM512 443.733333c-38.4 0-68.266667 29.866667-68.266667 68.266667 0 38.4 29.866667 68.266667 68.266667 68.266667s68.266667-29.866667 68.266667-68.266667c0-38.4-29.866667-68.266667-68.266667-68.266667zM832 443.733333c-38.4 0-68.266667 29.866667-68.266667 68.266667 0 38.4 29.866667 68.266667 68.266667 68.266667s68.266667-29.866667 68.266667-68.266667c0-38.4-34.133333-68.266667-68.266667-68.266667z"
+                fill="#111111"
+                p-id="9200"
+              ></path>
+            </svg>
+          </div>
+          <div class="ac_c_i_bottom">
+            <div>标签</div>
+            <span>工作流</span>
+          </div>
+        </div>
+        <div class="ac_c_empty" v-if="dataList.length === 0">
+          <span>暂无数据...</span>
+        </div>
+      </div>
+    </div>
+    <!-- <addAppDialog
+      ref="addAppDialogRef"
+      :typeList="typeList"
+      @success="addAppSuccess"
+    />-->
   </div>
 </template>
 
 <script>
+const clickOutside = {
+  bind(el, binding) {
+    // 在元素上绑定一个点击事件监听器
+    el.clickOutsideEvent = function(event) {
+      // 检查点击事件是否发生在元素的内部
+      if (!(el === event.target || el.contains(event.target))) {
+        // 如果点击事件发生在元素的外部,则触发指令绑定的方法,将点击的event数据传过去
+        binding.value(event);
+      }
+    };
+    // 在文档上添加点击事件监听器
+    document.addEventListener("click", el.clickOutsideEvent);
+  },
+  unbind(el) {
+    // 在元素上解除点击事件监听器
+    document.removeEventListener("click", el.clickOutsideEvent);
+  }
+};
+import saveCard from "../dialog/saveCard.vue";
 export default {
-	data(){
-		return{
-
-		}
-	},
-	methods:{
-		changeShowPage(newPage){
-			this.$emit("changeShowCard",newPage)
-		}
-	}
+  components: {
+    saveCard
+  },
+  directives: {
+    "click-outside": clickOutside // 注册自定义指令
+  },
+  data() {
+    return {
+      showType: "",
+      searchText: "",
+      statusSelect: "",
+      statusSelectList: [
+        { index: "", label: "全部状态" },
+        { index: 1, label: "未发布" },
+        { index: 2, label: "已发布" }
+      ],
+      tagSelect: "",
+      tagSelectList: [
+        { index: "", label: "全部标签" },
+        { index: 1, label: "标签1" },
+        { index: 2, label: "标签2" },
+        { index: 3, label: "标签3" },
+        { index: 4, label: "标签4" },
+        { index: 5, label: "标签5" }
+      ],
+      userId: this.$route.query["userid"],
+      org: this.$route.query["org"],
+      oid: this.$route.query["oid"],
+      getDataLoading: false,
+      dataList: [1],
+      recentUse: [],
+      collect: [],
+      editAppCard: null,
+      bannerObj:null
+    };
+  },
+  computed: {},
+  methods: {
+    changeType(newIndex) {
+      let flag = this.showType === newIndex;
+      this.showType = newIndex;
+      if (!flag) {
+        this.getData();
+      }
+    },
+    changeShowType(newType) {
+      if (this.showType === newType) return;
+      this.showType = newType;
+      this.getData();
+    },
+    changeSelectType() {
+      this.getData();
+    },
+    getData() {
+      this.$message.info("获取数据暂未开发...");
+    },
+    updateCard(newValue) {
+      // if (this.editAppCard === id) return (this.editAppCard = null);
+      this.editAppCard = newValue;
+    },
+    handleBlur() {
+      this.updateCard(null);
+    },
+    openApp(item, type = 0) {
+      console.log("👉", item);
+    },
+    resetData() {
+      this.searchText = "";
+      this.statusSelect = "";
+      this.tagSelectList = "";
+      this.showType = "";
+      this.getData();
+    },
+    changeShowPage(newPage) {
+      this.$emit("changeShowCard", newPage);
+    },
+    getBanner(){
+      let params = {
+        uid:this.userId,
+        oid:this.oid,
+        org:this.org,
+        type:4
+      }
+
+      this.ajax.get(this.$store.state.api+"select_bannerByoidORorg",params).then(res=>{
+        let _data = res.data[0];
+        if(_data[0]){
+          this.bannerObj = _data[0];
+        }else{
+          this.bannerObj = null
+        }
+      }).catch(e=>{
+        console.log("获取banner图失败")
+        console.log(e)
+      })
+    }
+  },
+  mounted() {
+    this.getBanner()
+  }
 };
 </script>
 
@@ -39,12 +322,35 @@ export default {
   display: flex;
   justify-content: space-between;
 }
+
+.ac_left {
+  width: 280px;
+  min-width: 280px;
+  margin-right: 20px;
+  height: 100%;
+  border-radius: 5px;
+  background-color: #fff;
+  box-shadow: 0 0 10px 0 rgba(0, 0, 0, 0.1);
+  box-sizing: border-box;
+  padding: 10px;
+  overflow: auto;
+}
+
+.ac_right {
+  width: calc(100% - 280px);
+  min-width: 800px;
+  height: 100%;
+  overflow-y: hidden;
+  display: flex;
+  flex-direction: column;
+}
+
 .ac_header {
   width: 100%;
   height: auto;
   border-radius: 5px;
-  background-color: #fff;
   box-shadow: 0 0 10px 0 rgba(0, 0, 0, 0.1);
+  background-color: #fff;
 }
 
 .ac_h_top {
@@ -55,41 +361,68 @@ export default {
   box-sizing: border-box;
   padding: 0 15px;
   border-bottom: 1px solid #eeeeee;
+
   position: relative;
-	padding-left: 315px;
+  justify-content: center;
 }
 
 .ac_h_top > span {
-  font-size: 26px;
-	position: relative;
-	margin-right: 25px;
-	cursor: pointer;
+  font-size: 22px;
+  position: relative;
+  margin-right: 25px;
+  cursor: pointer;
+  display: flex;
+  align-items: center;
+}
+
+.ac_h_top > span > svg {
+  width: 22px;
+  height: 22px;
+  fill: #1a1a1a;
+  margin-right: 10px;
+}
+
+.ac_h_t_active {
+  color: #0354d7;
+}
+
+.ac_h_t_active > svg {
+  fill: #0354d7 !important;
+}
+
+.ac_h_banner {
+  width: 100%;
+  height: 300px;
+  border-radius: 5px;
+  overflow: hidden;
+  box-sizing: border-box;
+  padding: 10px;
 }
 
-.ac_h_t_active::after{
-	content: "";
-	position: absolute;
-	width: 100%;
-	height: 3px;
-	border-radius: 4px;
-	background-color: #409EFF;
-	left: 0;
-	bottom: -5px;
+.ac_h_banner > img {
+  width: 100%;
+  height: 100%;
+  object-fit: cover;
+  border-radius: 5px;
 }
 
 .ac_h_bottom {
   width: 100%;
   height: auto;
-  padding: 10px 0 20px 0;
+  padding: 10px 15px 10px 15px;
+  box-sizing: border-box;
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
 }
 
 .ac_h_b_typeList {
-  width: 100%;
+  width: calc(100% - 666px);
   height: auto;
   display: flex;
   flex-wrap: wrap;
   box-sizing: border-box;
-  padding: 0 15px;
+  align-items: center;
 }
 
 .ac_h_b_typeList > span {
@@ -107,13 +440,197 @@ export default {
 .ac_h_b_selectList {
   margin-left: 15px;
   margin-bottom: 10px;
+  display: flex;
+  align-items: center;
 }
 
-.ac_content{
-	width: 100%;
+.ac_content {
+  width: 100%;
   flex: 1;
   height: auto;
-  margin-top: 20px;
+  margin-top: 10px;
   overflow: auto;
+	min-height: 200px;
+}
+
+.ac_c_item {
+  width: calc(100% / 5 - (15px * 4) / 5);
+  height: auto;
+  background-color: #fff;
+  border-radius: 10px;
+  box-shadow: 0 0 10px 0 rgba(0, 0, 0, 0.1);
+  box-sizing: border-box;
+  padding: 15px;
+  margin-right: 15px;
+  margin-bottom: 15px;
+  float: left;
+  position: relative;
+  /* cursor: pointer; */
+}
+
+@media screen and (min-width: 1400px) {
+  .ac_c_item {
+    width: calc(100% / 5 - (15px * 4) / 5) !important;
+  }
+  .ac_c_item:nth-child(5n) {
+    margin-right: 0px !important;
+    /* background-color: red; */
+  }
+}
+
+@media screen and (max-width: 1380px) {
+  .ac_c_item {
+    width: calc(100% / 4 - (15px * 3) / 4) !important;
+  }
+
+  .ac_c_item:nth-child(4n) {
+    margin-right: 0px !important;
+  }
+  /* .ac_c_item:nth-child(5n) {
+    margin-right: 0 !important;
+  } */
+}
+
+@media screen and (max-width: 1080px) {
+  .ac_c_item {
+    width: calc(100% / 3 - (15px * 2) / 3) !important;
+  }
+
+  .ac_c_item:nth-child(5n) {
+    margin-right: 15px !important;
+  }
+
+  .ac_c_item:nth-of-type(4n) {
+    margin-right: 15px !important;
+  }
+
+  .ac_c_item:nth-child(3n) {
+    margin-right: 0 !important;
+  }
+}
+
+.ac_c_i_top {
+  width: 100%;
+  height: 180px;
+  display: flex;
+  justify-content: space-between;
+  position: relative;
+}
+
+.ac_c_i_top > img {
+  width: 130px;
+  height: 130px;
+  object-fit: cover;
+  border-radius: 10px;
+  margin: 10px 15px 10px 10px;
+}
+
+.ac_c_i_top > div {
+  box-sizing: border-box;
+  padding: 20px 0px 10px 0px;
+  flex: 1;
+  height: 100%;
+  width: calc(100% - 130px - 10px - 15px);
+}
+
+.ac_c_i_top > div > div {
+  font-size: 18px;
+  width: calc(100%);
+  overflow: hidden;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+}
+
+.ac_c_i_t_brief {
+  margin: 5px 0;
+  font-size: 1em;
+  color: #8991a1;
+  width: calc(100%);
+  height: 74px;
+  /* 第四行溢出显示... */
+  display: -webkit-box;
+  display: block;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  -webkit-line-clamp: 4;
+  -webkit-box-orient: vertical;
+}
+
+.ac_c_i_t_time {
+  margin: 5px 0;
+  font-size: .9em !important;
+  color: #8991a1;
+  width: 100%;
+  height: auto;
+	white-space: nowrap;
+	overflow: hidden;
+	text-overflow: ellipsis;
+}
+
+.ac_c_i_bottom {
+  width: 100%;
+  height: 30px;
+  display: flex;
+  align-items: center;
+  justify-content: space-between;
+  box-sizing: border-box;
+  padding: 0 10px;
+}
+
+.ac_c_empty {
+  width: 100%;
+  height: 40%;
+  display: flex;
+  box-sizing: border-box;
+  padding-top: 2%;
+  justify-content: center;
+  /* align-items: center; */
+}
+
+.ac_c_i_t_popover {
+  width: 30px;
+  height: 30px;
+  position: absolute;
+  right: 10px;
+  top: 10px;
+}
+
+.ac_c_i_t_popover svg {
+  width: 30px;
+  height: 25px;
+  cursor: pointer;
+  background-color: #f2f2f2;
+  border-radius: 4px;
+}
+
+.ac_c_i_t_p_box {
+  position: absolute;
+  height: auto;
+  top: 100%;
+  right: 0;
+  padding: 8px;
+  border-radius: 8px 0 8px 8px;
+  background-color: #fff;
+  box-shadow: 0 0 10px 0 rgba(0, 0, 0, 0.1);
+  width: auto;
+}
+
+.ac_c_i_t_p_box > div {
+  width: 80px;
+  height: 30px;
+  cursor: pointer;
+  transition: 0.3s;
+  font-weight: bold;
+  font-size: 0.9em;
+  border-radius: 5px;
+  display: flex;
+  justify-content: center;
+  align-items: center;
+  position: relative;
+  box-sizing: border-box;
+}
+
+.ac_c_i_t_p_box > div:hover {
+  background-color: #f2f4f7;
 }
 </style>

+ 6 - 2
src/components/pages/components/lookWork.vue

@@ -226,7 +226,7 @@
                           :playsinline="true"
                           :options="playerOptions"
                           @play="onPlayerPlay($event)"
-                          style="width: 90%; height: 500px; margin: 0 0 0 30px"
+                          style="width: 600px; height: 400px; margin: 0 0 0 30px"
                         ></video-player>
 
                         <div class="answerTxt" v-html="i"></div>
@@ -870,7 +870,7 @@ export default {
         preload: "auto", // 建议浏览器在<video>加载元素后是否应该开始下载视频数据。auto浏览器选择最佳行为,立即开始加载视频(如果浏览器支持)
         language: "zh-CN",
         aspectRatio: "16:9", // 将播放器置于流畅模式,并在计算播放器的动态大小时使用该值。值应该代表一个比例 - 用冒号分隔的两个数字(例如"16:9"或"4:3")
-        fluid: true, // 当true时,Video.js player将拥有流体大小。换句话说,它将按比例缩放以适应其容器。
+        fluid: false, // 当true时,Video.js player将拥有流体大小。换句话说,它将按比例缩放以适应其容器。
         sources: [
           {
             type: "video/mp4", //这里的种类支持很多种:基本视频格式、直播、流媒体等,具体可以参看git网址项目   || "video/ogg"|| "video/webm"
@@ -1814,4 +1814,8 @@ export default {
 .item {
   margin: 4px;
 }
+.video-player >>> .video-js {
+  height: 100%;
+  padding: 0 !important;
+}
 </style>

+ 113 - 47
src/components/pages/test/check/docxTemplateDialog.vue

@@ -306,6 +306,7 @@ export default {
       for (let i = 0; i < array.length; i++) {
         let _item = array[i];
         if (_item.type == 3) {
+          //问答题
           let _item2 = _item.json;
           _list.push({
             name: _item2.title,
@@ -315,6 +316,7 @@ export default {
           });
           _index++;
         } else if (_item.type == 1) {
+          //单选题
           let _item2 = _item.json;
           let choseTxt = ``;
           _item2.array.forEach((i, index2) => {
@@ -331,25 +333,57 @@ export default {
             value: choseTxt
           });
           _index++;
-        }else if(_item.type == 8){
-					let _item2 = _item.json;
-					_list.push({
-						name:_item2.title,
-						field:`ti_${_index}`,
-						type:"text",
-						value:_item2.answer2
-					})
-					_index++;
-				}else if(_item.type == 12){
-					let _item2 = _item.json;
-					_list.push({
-						name:_item2.title,
-						field:`ti_${_index}`,
-						type:"text",
-						value:_item2.answer2
-					})
-					_index++;
-				}
+        } else if (_item.type == 8) {
+          //日期
+          let _item2 = _item.json;
+          _list.push({
+            name: _item2.title,
+            field: `ti_${_index}`,
+            type: "text",
+            value: _item2.answer2
+          });
+          _index++;
+        } else if (_item.type == 12) {
+          //扫一扫
+          let _item2 = _item.json;
+          _list.push({
+            name: _item2.title,
+            field: `ti_${_index}`,
+            type: "text",
+            value: _item2.answer2
+          });
+          _index++;
+        } else if (_item.type == 7) {
+          //评分
+          let _item2 = _item.json;
+          _list.push({
+            name: _item2.title,
+            field: `ti_${_index}`,
+            type: "text",
+            value: _item2.answer2
+          });
+          _index++;
+        } else if (_item.type == 5) {
+          //附件
+          let _item2 = _item.json;
+          // let _value = ``;
+          // _item2.file.forEach(f => {
+          //   if (/\.(jpeg|jpg|gif|png|svg|bmp|webp)$/i.test(f.url)) {
+          //     _value += `<img src="${f.url}" alt="${f.name}" width="100" height="100"/>
+          // 		`;
+          //   } else {
+          //     _value += `<a href="${f.url}" target="_blank">${f.name}</a>
+          // 		`;
+          //   }
+          // });
+          _list.push({
+            name: _item2.title,
+            field: `ti_${_index}`,
+            type: "file",
+            value: _item2.file
+          });
+          _index++;
+        }
       }
       return _list;
     },
@@ -487,6 +521,20 @@ export default {
               `{${fieldList[i].field}}`,
               fieldList[i].value
             );
+          } else if (this.fieldList[i].type == "file") {
+            let _text = ``;
+            // this.fieldList[i].value.forEach(async f => {
+            for (let j = 0; j < this.fieldList[i].value.length; j++) {
+              let f = this.fieldList[i].value[j];
+              if (/\.(jpeg|jpg|gif|png|svg|bmp|webp)$/i.test(f.url)) {
+                // const img = await this.convertImageUrlToBase64(f.url);
+                _text += `<img src="${f.url}" width="${100}" height="${100}"/><br/>`;
+              } else {
+                _text += `<a href="${f.url}" target="_blank">${f.name}</a><br/>`;
+              }
+            }
+            _html = _html.replaceAll(`{${this.fieldList[i].field}}`, _text);
+            // });
           }
         }
 
@@ -522,8 +570,25 @@ export default {
             `{${this.fieldList[i].field}}`,
             this.fieldList[i].value
           );
+        } else if (this.fieldList[i].type == "file") {
+          let _text = ``;
+          console.log(this.fieldList[i].value);
+          // this.fieldList[i].value.forEach(async f=>{
+          // for (let j = 0; j < this.fieldList[i].value.length; j++) {
+          //   let f = this.fieldList[i].value[j];
+          // 	console.log("👉f",f)
+          //   if (/\.(jpeg|jpg|gif|png|svg|bmp|webp)$/i.test(f.url)) {
+          //     const img = await this.convertImageUrlToBase64(f.url);
+          //     _text += `<img src="${img.url}" width="${img.width}" height="${img.height}" />\n`;
+          //   } else {
+          //     _text += `<a href="${f.url}" target="_blank">${f.name}</a>\n`;
+          //   }
+          // }
+          // _html = _html.replaceAll(`{${this.fieldList[i].field}}`, _text);
+          // })
         }
       }
+      return;
       // this.fieldList.forEach(i => {
       // _html = _html.replace(`{${i.field}}`,i.value)
       // })
@@ -1215,8 +1280,8 @@ ${html}
     getTxtContent(txt) {
       this.downFileData.txt = txt;
     },
-		uploadWord(){
-			let input = document.createElement("input");
+    uploadWord() {
+      let input = document.createElement("input");
       input.type = "file";
       // input.accept = ".wav";
       // input.accept = "audio/*, .txt, .pdf, .xlsx";
@@ -1234,25 +1299,26 @@ ${html}
           this.loading = false;
           return this.$message.error("文件上传失败");
         }
-				let obj = {
-					fileName:file.name,
-					url:uploadData,
-				}
-				this.downFileData = obj;
-				this.changeDownFileData(this.downFileData);
-				this.loading = false;
-				console.log(uploadData)
-			}
-		},
-		formatTime(timeString) {
-    let [datePart, timePart] = timeString.split(' ');
-    let formattedTime = timePart.replace(/:/g, (match, offset) => {
-      if (offset === 2) return '时';
-      if (offset === 5) return '分';
-      return match;
-    }) + '秒';
-    return datePart + ' ' + formattedTime;
-  },
+        let obj = {
+          fileName: file.name,
+          url: uploadData
+        };
+        this.downFileData = obj;
+        this.changeDownFileData(this.downFileData);
+        this.loading = false;
+        console.log(uploadData);
+      };
+    },
+    formatTime(timeString) {
+      let [datePart, timePart] = timeString.split(" ");
+      let formattedTime =
+        timePart.replace(/:/g, (match, offset) => {
+          if (offset === 2) return "时";
+          if (offset === 5) return "分";
+          return match;
+        }) + "秒";
+      return datePart + " " + formattedTime;
+    }
   },
   computed: {
     dialogTitle() {
@@ -1278,8 +1344,8 @@ ${html}
 
 .dialog_diy >>> .el-dialog__header {
   padding: 15px 20px;
-	background-color: #454545 !important;
-	color: #fff !important;
+  background-color: #454545 !important;
+  color: #fff !important;
 }
 
 .dialog_diy >>> .el-dialog__body {
@@ -1315,16 +1381,16 @@ ${html}
   padding: 0 20px 15px;
   display: flex;
   box-sizing: border-box;
-	overflow: auto;
+  overflow: auto;
 }
 
 .b_left {
-	flex: 1;
-	height: 100%;
+  flex: 1;
+  height: 100%;
   border: none;
   outline: none;
-	box-sizing: border-box;
-	padding-top: 20px;
+  box-sizing: border-box;
+  padding-top: 20px;
 }
 
 .b_right {

+ 32 - 21
src/components/pages/test/check/index.vue

@@ -114,7 +114,7 @@
                   <el-input v-model="courseName" class="student_input" :disabled="!(!peopleId)" placeholder="请输入需要搜索的姓名"></el-input>
                   <span class="serach_icon" @click="searchCourse" ></span>
                 </div>
-                
+
                 <div class="btnA" v-if="stype == 1 && !pdfLoading" @click="exportPDF">导出PDF</div>
                 <div class="btnA" v-if="stype == 2" @mouseenter="btnDisplay = true" @mouseleave="btnDisplay = false">
                   导出数据
@@ -124,10 +124,10 @@
 										<div type="primary" v-if="stype == 2" @click="exportWordData">word导出</div>
                   </div>
                 </div>
-								
+
                 <div class="btnA" v-if="stype == 3" @click="exportAllWord2">导出人员数据</div>
                 <div class="btnA" @click="openChat" v-if="this.worksArray.length && !peopleId">AI分析</div><!--v-if="this.worksArray.length"-->
-								
+
               </div>
             </div>
              <!-- 手机端 查看切换 isDesktop-->
@@ -373,7 +373,7 @@
                     <div style="width: 100px;overflow: hidden;white-space: nowrap;text-overflow: ellipsis;">{{ item.title }}</div>
                   </el-tooltip>
 
-                  
+
                 </div>
                 <div style="display: flex;">
                   <!-- <div v-if="item.type==7" style="right:0;position: absolute;">平均分:{{ getAverageScore(index) }}</div> -->
@@ -578,7 +578,12 @@
           <div class="table_content" v-if="stype == 2 && isDesktop">
             <el-table class="el-table" ref="table" :data="worksArray" border :fit="true" :key="2" v-loading="isLoading"
               style="width: 100%" :header-cell-style="{ background: '#f1f1f1', fontSize: '17px' }"
-              @filter-change="handleFilterChange">
+              @filter-change="handleFilterChange"  @selection-change="handleSelectionChange">
+              <el-table-column
+              label="序号"
+                type="selection"
+                width="55">
+              </el-table-column>
               <el-table-column fixed label="序号" width="80px" align="left">
                 <template slot-scope="scope">
                   {{ scope.$index + 1 }}
@@ -592,7 +597,7 @@
 								</template>
               </el-table-column>
               <el-table-column v-for="(item, index) in chapters" :key="index" :label="item.json.title"
-                :min-width="item.type == 5 ? 200 : 150" align="left" 
+                :min-width="item.type == 5 ? 200 : 150" align="left"
 								:filters="item.type == 1 ? item.nameFilters : (item.type ==  6 || item.type ==  11)? item.nameFilters : item.type==8?getTimeFilterText(item,index):null"
                 :filter-method="item.type == 1 ? (value, row) => { return filterName(value, row, index) } : (item.type == 6 || item.type == 11)?(value, row) => { return filterCourse(value, row, index)}:item.type==8?(value,row)=>{return filterTime(value,row,index)}:null"
                 :filter-placement="item.type == 8 ||item.type == 1 || item.type ==6|| item.type ==11 ? filterPlacement : null">
@@ -677,7 +682,7 @@
                               {{ k.json.title }}
                             </div>
                           </div>
-                          <div style="color: rgba(0, 0, 0, 0.4);">[{{ selectType2(k.type,k.json.type) }}]</div>  
+                          <div style="color: rgba(0, 0, 0, 0.4);">[{{ selectType2(k.type,k.json.type) }}]</div>
                         </div>
                         <div class="IsDAnswer">
                           <div v-for="(r, index2) in i.array[kin].json.answer2"
@@ -784,7 +789,7 @@
                   </div>
 
                 </div>
-                
+
                 <div style="width: 100%;display: flex;justify-content: end;">
                   <div @click="i.cut=!i.cut" style="display: flex;flex-direction: column;align-items: center">
                     <img src="../../../../assets/icon/fileIcon/retractImg.png" alt="">
@@ -897,7 +902,7 @@
       </div>
     </div>
 
-   
+
     <share-box :testJson="testJson" :TeachingValue="TeachingValue" :TeachName="TeachNameCpt"   :dialogVisibleShare.sync="dialogVisibleShare"></share-box>
     <wpdf :dialogVisiblePdf.sync="dialogVisiblePdf" :url="wurl"></wpdf>
     <wVideo :dialogVisibleVideo.sync="dialogVisibleVideo" :url="wurl"></wVideo>
@@ -928,7 +933,7 @@ import XLSX from "xlsx-js-style";
 import aiBoxRight from './aiBoxRight.vue'
 
 // word模板
-import docxTemplateDialog from './docxTemplateDialog' 
+import docxTemplateDialog from './docxTemplateDialog'
 
 const getFile = (url) => {
     return new Promise((resolve, reject) => {
@@ -1037,6 +1042,7 @@ export default {
       btnDisplay: false,
 
       fileLoading: [],
+      selectWorkList:[]
       // fileLoadCount: [],
       // fileLoadNum: [],
       // infoprogress: [],
@@ -1481,7 +1487,7 @@ export default {
             } else if (topic.type == 11) {
               const uniqueArray = courseCount11.filter((item, index) => courseCount11.indexOf(item) === index);
               let _answer = uniqueArray
-              
+
               allCourseIds = allCourseIds.concat(_answer);
             }
             for (var j = 0; j < array.length; j++) {
@@ -1566,7 +1572,7 @@ export default {
                 result.forEach(elc=>{
                   if(this.chapters.find((f, index)=>index==i).nameFilters.find(c=>c.value==elc.title)==undefined && topic.answer2.includes(elc.courseId)){
                     this.chapters.find((c, index)=>index==i).nameFilters.push({text:elc.title,value:elc.title})
-                  }                
+                  }
                 })
               }
 
@@ -1585,7 +1591,7 @@ export default {
           this.testArray = testArray
           this.worksArray = array
           this.isLoading = false;
-          
+
         })
         .catch((err) => {
           console.error(err);
@@ -2041,7 +2047,7 @@ export default {
         } else if (item.type == 11 && item.json.answer2) {
             let _option = `<div style='margin:10px 0 0 40px;'>打分课程:${item.json.answer2}</div>`
             _test += _option
-        } 
+        }
       }
       _test += `</div>`
       let _html = _title + _content + _detail + _test;
@@ -2103,7 +2109,7 @@ export default {
             result.forEach(i=>{
               _title.push(i.title)
             })
-            
+
             let _option = `<div style='margin:10px 0 0 40px;'>打分课程:${ _title.length ? _title.join(',') : '' }</div>`
             _test += _option
         }
@@ -2143,8 +2149,9 @@ export default {
       return blob;
     },
     exportAllWord() {
+      if(this.selectWorkList.length<=0)return this.$message.info("请先选择需要导出的表单数据")
       this.pdfLoading = true;
-      const _chapInfo = this.worksArray;
+      const _chapInfo = this.selectWorkList;//this.worksArray
       let url = [];
       for (let i = 0; i < _chapInfo.length; i++) {
         url.push({
@@ -2338,10 +2345,10 @@ export default {
                   this.fileLoading[index].bool=false
                 }
         	  });
-           
+
 						promises.push(promise)
 					})
-					
+
 				}else{//只有一个文件的情况
 					promises.push(getFile(downFileArray[0].urlList[0].url).then((data) => {
 						if (data.data != 1) {
@@ -2423,8 +2430,12 @@ export default {
 			this.testJson.cover = data
 		},
 		exportWordData(){
-			this.$refs.docxTemplateDialogRef.open({fileData:this.testJson.cover?JSON.parse(this.testJson.cover):null,testJson:this.testJson,courseId:this.testJson.courseId,formData:this.worksArray})//这里可以传数据
-		}
+      if(this.selectWorkList.length<=0)return this.$message.info("请先选择需要导出的表单数据")
+			this.$refs.docxTemplateDialogRef.open({fileData:this.testJson.cover?JSON.parse(this.testJson.cover):null,testJson:this.testJson,courseId:this.testJson.courseId,formData:this.selectWorkList})//这里可以传数据this.worksArray
+		},
+    handleSelectionChange(value){
+      this.selectWorkList = value
+    }
   },
   beforeDestroy() {
     document.getElementsByTagName('html')[0].style.overflow = '';
@@ -3365,4 +3376,4 @@ export default {
   border-radius: 5px;
 	overflow: hidden;
 }
-</style>
+</style>

部分文件因为文件数量过多而无法显示