Explorar el Código

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

lsc hace 5 meses
padre
commit
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) {

La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 0 - 0
dist/static/css/app.3604a2aab1d8248ff465916f97b9b177.css


La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 0 - 0
dist/static/css/app.3604a2aab1d8248ff465916f97b9b177.css.map


La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 0 - 0
dist/static/js/app.5a0b10304d0f426a4815.js


La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 0 - 0
dist/static/js/app.5a0b10304d0f426a4815.js.map


La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 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>

Algunos archivos no se mostraron porque demasiados archivos cambiaron en este cambio