Jelajahi Sumber

更新更新

SanHQin 3 bulan lalu
induk
melakukan
cdf80e250c

+ 1 - 1
dist/index.html

@@ -32,7 +32,7 @@
       width: 100%;
       background: #e6eaf0;
       font-family: '黑体';
-    }</style><link href=./static/css/app.0ac8f0d4c4106045ad07474a669d7f43.css rel=stylesheet></head><body><div id=app></div><script type=text/javascript src=./static/js/manifest.3eade43afd174522bb8a.js></script><script type=text/javascript src=./static/js/vendor.6bffbf9058a42e825dbc.js></script><script type=text/javascript src=./static/js/app.5c14692bcb981e6854a3.js></script></body></html><script>function stopSafari() {
+    }</style><link href=./static/css/app.1a0ada06067cbba35d4cb4104a49b4fe.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.d0664d4468966cc43fcf.js></script></body></html><script>function stopSafari() {
     //阻止safari浏览器双击放大功能
     let lastTouchEnd = 0  //更新手指弹起的时间
     document.documentElement.addEventListener("touchstart", function (event) {

File diff ditekan karena terlalu besar
+ 0 - 0
dist/static/css/app.0ac8f0d4c4106045ad07474a669d7f43.css


File diff ditekan karena terlalu besar
+ 0 - 0
dist/static/css/app.1a0ada06067cbba35d4cb4104a49b4fe.css


File diff ditekan karena terlalu besar
+ 0 - 0
dist/static/css/app.1a0ada06067cbba35d4cb4104a49b4fe.css.map


File diff ditekan karena terlalu besar
+ 0 - 0
dist/static/js/0.4f3b05586c3acc102a54.js


File diff ditekan karena terlalu besar
+ 0 - 0
dist/static/js/0.4f3b05586c3acc102a54.js.map


File diff ditekan karena terlalu besar
+ 0 - 0
dist/static/js/0.7da288988865a9378b49.js.map


File diff ditekan karena terlalu besar
+ 0 - 0
dist/static/js/app.d0664d4468966cc43fcf.js


File diff ditekan karena terlalu besar
+ 0 - 0
dist/static/js/app.d0664d4468966cc43fcf.js.map


+ 2 - 2
dist/static/js/manifest.3eade43afd174522bb8a.js → dist/static/js/manifest.161e82026ac2ae03ab6f.js

@@ -1,2 +1,2 @@
-!function(e){var n=window.webpackJsonp;window.webpackJsonp=function(r,a,c){for(var i,u,f,s=0,l=[];s<r.length;s++)u=r[s],t[u]&&l.push(t[u][0]),t[u]=0;for(i in a)Object.prototype.hasOwnProperty.call(a,i)&&(e[i]=a[i]);for(n&&n(r,a,c);l.length;)l.shift()();if(c)for(s=0;s<c.length;s++)f=o(o.s=c[s]);return f};var r={},t={6:0};function o(n){if(r[n])return r[n].exports;var t=r[n]={i:n,l:!1,exports:{}};return e[n].call(t.exports,t,t.exports,o),t.l=!0,t.exports}o.e=function(e){var n=t[e];if(0===n)return new Promise(function(e){e()});if(n)return n[2];var r=new Promise(function(r,o){n=t[e]=[r,o]});n[2]=r;var a=document.getElementsByTagName("head")[0],c=document.createElement("script");c.type="text/javascript",c.charset="utf-8",c.async=!0,c.timeout=12e4,o.nc&&c.setAttribute("nonce",o.nc),c.src=o.p+"static/js/"+e+"."+{0:"7da288988865a9378b49",1:"14e8e8c7e44fc858e4a6",2:"94e1427bfc7ef0b4c685",3:"3a9f53a78da16650e6b8"}[e]+".js";var i=setTimeout(u,12e4);function u(){c.onerror=c.onload=null,clearTimeout(i);var n=t[e];0!==n&&(n&&n[1](new Error("Loading chunk "+e+" failed.")),t[e]=void 0)}return c.onerror=c.onload=u,a.appendChild(c),r},o.m=e,o.c=r,o.d=function(e,n,r){o.o(e,n)||Object.defineProperty(e,n,{configurable:!1,enumerable:!0,get:r})},o.n=function(e){var n=e&&e.__esModule?function(){return e.default}:function(){return e};return o.d(n,"a",n),n},o.o=function(e,n){return Object.prototype.hasOwnProperty.call(e,n)},o.p="./",o.oe=function(e){throw console.error(e),e}}([]);
-//# sourceMappingURL=manifest.3eade43afd174522bb8a.js.map
+!function(e){var n=window.webpackJsonp;window.webpackJsonp=function(r,c,a){for(var i,u,f,s=0,l=[];s<r.length;s++)u=r[s],t[u]&&l.push(t[u][0]),t[u]=0;for(i in c)Object.prototype.hasOwnProperty.call(c,i)&&(e[i]=c[i]);for(n&&n(r,c,a);l.length;)l.shift()();if(a)for(s=0;s<a.length;s++)f=o(o.s=a[s]);return f};var r={},t={6:0};function o(n){if(r[n])return r[n].exports;var t=r[n]={i:n,l:!1,exports:{}};return e[n].call(t.exports,t,t.exports,o),t.l=!0,t.exports}o.e=function(e){var n=t[e];if(0===n)return new Promise(function(e){e()});if(n)return n[2];var r=new Promise(function(r,o){n=t[e]=[r,o]});n[2]=r;var c=document.getElementsByTagName("head")[0],a=document.createElement("script");a.type="text/javascript",a.charset="utf-8",a.async=!0,a.timeout=12e4,o.nc&&a.setAttribute("nonce",o.nc),a.src=o.p+"static/js/"+e+"."+{0:"4f3b05586c3acc102a54",1:"14e8e8c7e44fc858e4a6",2:"94e1427bfc7ef0b4c685",3:"3a9f53a78da16650e6b8"}[e]+".js";var i=setTimeout(u,12e4);function u(){a.onerror=a.onload=null,clearTimeout(i);var n=t[e];0!==n&&(n&&n[1](new Error("Loading chunk "+e+" failed.")),t[e]=void 0)}return a.onerror=a.onload=u,c.appendChild(a),r},o.m=e,o.c=r,o.d=function(e,n,r){o.o(e,n)||Object.defineProperty(e,n,{configurable:!1,enumerable:!0,get:r})},o.n=function(e){var n=e&&e.__esModule?function(){return e.default}:function(){return e};return o.d(n,"a",n),n},o.o=function(e,n){return Object.prototype.hasOwnProperty.call(e,n)},o.p="./",o.oe=function(e){throw console.error(e),e}}([]);
+//# sourceMappingURL=manifest.161e82026ac2ae03ab6f.js.map

File diff ditekan karena terlalu besar
+ 0 - 0
dist/static/js/manifest.161e82026ac2ae03ab6f.js.map


File diff ditekan karena terlalu besar
+ 0 - 0
dist/static/js/vendor.de15001ce66f032e9274.js


File diff ditekan karena terlalu besar
+ 0 - 0
dist/static/js/vendor.de15001ce66f032e9274.js.map


+ 273 - 57
src/components/pages/appStore/dialog/addAppDialog.vue

@@ -18,25 +18,78 @@
       </div>
       <div class="bfd_box" v-loading="loading" label-position="top">
         <el-form :model="form" :rules="rules" ref="ruleForm">
-          <el-form-item label="应用名称" prop="nname">
+          <div
+            style="display: flex;width: 100%;justify-content: space-between;align-items: center;"
+          >
+            <el-form-item label="应用图标" prop="icon">
+              <el-input
+                v-model="form.json.icon"
+                placeholder="请输入应用图标(可直接粘贴svg或者点击右侧图标上传图片)"
+                style="width: 500px;"
+              ></el-input>
+            </el-form-item>
+
+            <div
+              class="bfd_icon"
+              v-loading="uploadIconLoading"
+              @click="uploadIcon()"
+            >
+              <!-- svg -->
+              <span
+                v-html="form.json.icon"
+                v-if="isImageOrSvg(form.json.icon) === 1"
+              ></span>
+              <!-- 默认图标 -->
+              <svg
+                v-if="isImageOrSvg(form.json.icon) === 0"
+                t="1732605901531"
+                class="icon"
+                viewBox="0 0 1024 1024"
+                version="1.1"
+                xmlns="http://www.w3.org/2000/svg"
+                p-id="4275"
+                width="200"
+                height="200"
+              >
+                <path
+                  d="M179.2 153.6a51.2 51.2 0 0 0-51.2 51.2v128a51.2 51.2 0 0 0 51.2 51.2h128a51.2 51.2 0 0 0 51.2-51.2V204.8a51.2 51.2 0 0 0-51.2-51.2H179.2z m0-102.4h128a153.6 153.6 0 0 1 153.6 153.6v128a153.6 153.6 0 0 1-153.6 153.6H179.2a153.6 153.6 0 0 1-153.6-153.6V204.8a153.6 153.6 0 0 1 153.6-153.6z m0 614.4a51.2 51.2 0 0 0-51.2 51.2v128a51.2 51.2 0 0 0 51.2 51.2h128a51.2 51.2 0 0 0 51.2-51.2V716.8a51.2 51.2 0 0 0-51.2-51.2H179.2z m0-102.4h128a153.6 153.6 0 0 1 153.6 153.6v128a153.6 153.6 0 0 1-153.6 153.6H179.2a153.6 153.6 0 0 1-153.6-153.6V716.8a153.6 153.6 0 0 1 153.6-153.6z m611.84-403.4048a51.2 51.2 0 0 0-72.3968 0L646.144 232.2432a51.2 51.2 0 0 0 0 72.3968l72.448 72.3968a51.2 51.2 0 0 0 72.3968 0l72.3968-72.3968a51.2 51.2 0 0 0 0-72.3968L791.04 159.744z m72.3968-72.3968l72.3968 72.3968a153.6 153.6 0 0 1 0 217.2416l-72.3968 72.3968a153.6 153.6 0 0 1-217.2416 0l-72.3968-72.3968a153.6 153.6 0 0 1 0-217.2416l72.3968-72.3968a153.6 153.6 0 0 1 217.2416 0zM699.7504 896a51.2 51.2 0 0 1 0 102.4A162.1504 162.1504 0 0 1 537.6 836.2496v-110.8992A162.1504 162.1504 0 0 1 699.7504 563.2h110.8992a162.1504 162.1504 0 0 1 162.1504 162.1504v8.448a51.2 51.2 0 0 1-102.4 0v-8.448c0-33.024-26.7264-59.7504-59.7504-59.7504h-110.8992c-33.024 0-59.7504 26.7264-59.7504 59.7504v110.8992c0 33.024 26.7264 59.7504 59.7504 59.7504z"
+                  fill="#2C6DD2"
+                  p-id="4276"
+                ></path>
+                <path
+                  d="M791.4496 160a51.2 51.2 0 0 0-72.3968 0l-72.448 72.3968a51.2 51.2 0 0 0 0 72.3968l72.448 72.3968a51.2 51.2 0 0 0 72.3968 0l72.3968-72.3968a51.2 51.2 0 0 0 0-72.3968l-72.3968-72.3968z"
+                  fill="#20C997"
+                  p-id="4277"
+                ></path>
+              </svg>
+              <!-- 网络图片 -->
+              <el-image
+                v-if="isImageOrSvg(form.json.icon) === 2"
+                style="width: 100%; height: 100%"
+                :src="form.json.icon"
+                fit="cover"
+              ></el-image>
+            </div>
+          </div>
+          <el-form-item label="应用名称" prop="name">
             <el-input
-              v-model="form.nname"
+              v-model="form.name"
               placeholder="请输入应用名称"
             ></el-input>
           </el-form-item>
           <div
             style="display: flex;width: 100%;justify-content: space-between;"
           >
-            <el-form-item label="应用标签" prop="nlabel">
+            <el-form-item label="应用标签" prop="label">
               <el-input
-                v-model="form.nlabel"
+                v-model="form.label"
                 placeholder="请输入应用标签"
                 style="width: 300px;"
               ></el-input>
             </el-form-item>
-            <el-form-item label="应用类型" prop="ntype">
+            <el-form-item label="应用类型" prop="type">
               <el-select
-                v-model="form.ntype"
+                v-model="form.type"
                 placeholder="请选择应用类型"
                 style="width: 300px;"
               >
@@ -50,16 +103,16 @@
               </el-select>
             </el-form-item>
           </div>
-          <el-form-item label="应用链接" prop="nurl">
+          <el-form-item label="应用链接" prop="url">
             <el-input
-              v-model="form.nurl"
+              v-model="form.url"
               placeholder="请输入应用链接"
             ></el-input>
           </el-form-item>
-          <el-form-item label="应用简介" prop="ndetail">
+          <el-form-item label="应用简介" prop="detail">
             <el-input
               type="textarea"
-              v-model="form.ndetail"
+              v-model="form.detail"
               style="width: 100%;"
               :rows="3"
               resize="none"
@@ -67,38 +120,47 @@
             ></el-input>
           </el-form-item>
           <el-form-item
-            label="权限管理"
+            label="可见范围"
             style="display: flex;flex-direction: column;align-items: flex-start;"
           >
-            <el-radio-group v-model="form.njuri">
+            <el-radio-group v-model="form.juri">
               <el-radio label="1">私有</el-radio>
               <el-radio label="2">公开组织</el-radio>
               <el-radio label="3">公开所有人</el-radio>
             </el-radio-group>
           </el-form-item>
+
+
+					<!-- <el-form-item label="权限设置"  style="display: flex;flex-direction: column;align-items: flex-start;">
+						<el-radio-group v-model="form.json.copy" style="display: flex;flex-direction: column;">
+              <el-radio label="0" class="radioItem">仅体验(用户仅能使用,不可查看设置内容)</el-radio>
+              <el-radio label="1" class="radioItem">允许其他用户复制并进行二次创作</el-radio>
+            </el-radio-group>
+          </el-form-item> -->
         </el-form>
       </div>
       <div class="bfd_bottom">
         <el-button @click="close()">取消</el-button>
-        <el-button type="primary" @click="submitBtn('ruleForm')">保存</el-button>
+        <el-button type="primary" @click="submitBtn('ruleForm')"
+          >保存</el-button
+        >
       </div>
     </el-dialog>
   </div>
 </template>
 
 <script>
-
 let validUrl = (rule, value, callback) => {
-	if (value) {
-		// 验证链接是否有效
-		try {
-			new URL(value);
-			callback();
-		} catch (error) {
-			return callback(new Error("请输入有效的链接"));
-		}
-	}
-}
+  if (value) {
+    // 验证链接是否有效
+    try {
+      new URL(value);
+      callback();
+    } catch (error) {
+      return callback(new Error("请输入有效的链接"));
+    }
+  }
+};
 export default {
   props: {
     typeList: {
@@ -112,50 +174,113 @@ export default {
     return {
       loading: false,
       show: false,
+      uploadIconLoading: false,
       type: 1, //1添加,2编辑
       form: {
-        nname: "",
-        nlabel: "",
-        ndetail: "",
-        nurl: "",
-        ntype: "",
-        njuri: "1",
-        nstand: "cn",
-        njson: ""
+        name: "",
+        label: "",
+        detail: "",
+        url: "",
+        type: "",
+        juri: "1",
+        stand: "cn",
+        json: {
+          icon: "",
+          copy: "0"
+        }
       },
       rules: {
-        nname: [{ required: true, message: "请输入应用名称", trigger: "blur" }],
-        nurl: [{ required: true, message: "请输入应用链接", trigger: "blur" }],
-        nlabel: [
-          { required: true, message: "请输入应用标签", trigger: "blur" }
-        ],
-        ntype: [{ required: true, message: "请选择应用类型", trigger: "blur" }],
+        name: [{ required: true, message: "请输入应用名称", trigger: "blur" }],
+        url: [{ required: true, message: "请输入应用链接", trigger: "blur" }],
+        // nlabel: [
+        //   { required: true, message: "请输入应用标签", trigger: "blur" }
+        // ],
+        // ntype: [{ required: true, message: "请选择应用类型", trigger: "blur" }],
         // ndetail:[{required:true,message:"请输入应用简介",trigger:"blur"}],
-        njuri: [{ required: true, message: "请选择权限管理", trigger: "blur" }],
-				nurl: [{ required: true, message: "请输入应用链接", trigger: "blur" },{ validator: validUrl, trigger: "blur" }]
+        juri: [{ required: true, message: "请选择权限管理", trigger: "blur" }],
+        url: [
+          { required: true, message: "请输入应用链接", trigger: "blur" },
+          { validator: validUrl, trigger: "blur" }
+        ]
       }
     };
   },
+  computed: {
+    isImageOrSvg() {
+      return value => {
+        let _result = 0; //啥也不是
+        if (value) {
+          const svgPattern = /<svg.*<\/svg>/;
+          const imagePattern = /\.(jpeg|jpg|gif|png|svg|bmp|webp)$/i; // 图片链接的正则表达式
+          const urlPattern = /^(http|https):\/\/[^ "]+$/; // 网络地址的正则表达式
+
+          if (svgPattern.test(value)) {
+            _result = 1;
+          } else if (urlPattern.test(value) && imagePattern.test(value)) {
+            _result = 2;
+          }
+        }
+        return _result;
+      };
+    }
+  },
   methods: {
     open(data) {
       if (data && data.type === 2) {
+        if (!data.form.json) {
+          data.form.json = { icon: "", copy: "0" };
+        }
+				if(!data.form.json.icon){
+					data.form.json.icon = ""
+				}
+				if(!data.form.json.copy){
+					data.form.json.copy = "0"
+				}
+
         this.form = data.form;
         this.type = data.type;
       } else {
         this.form = {
-          nname: "",
-          nlabel: "",
-          ndetail: "",
-          nurl: "",
-          ntype: "",
-          njuri: "1",
-          nstand: "cn",
-          njson: ""
+          name: "",
+          label: "",
+          detail: "",
+          url: "",
+          type: "",
+          juri: "1",
+          stand: "cn",
+          json: {
+            icon: "",
+            copy: "0"
+          }
         };
       }
       this.loading = false;
+      this.uploadIconLoading = false;
       this.show = true;
     },
+    uploadIcon() {
+      if (this.uploadIconLoading) return this.$message.info("请稍等...");
+      const input = document.createElement("input");
+      input.type = "file";
+      input.accept =
+        "image/jpeg, image/jpg, image/gif, image/png, image/svg+xml";
+      input.onchange = async event => {
+        const file = event.target.files[0];
+        this.uploadIconLoading = true;
+        const validImageTypes = /\.(jpeg|jpg|gif|png|svg)$/i; // 定义有效的图片类型正则表达式
+
+        if (validImageTypes.test(file.name)) {
+          let url = await this.uploadFile(file);
+          if (url) {
+            this.form.json.icon = url;
+          }
+          this.uploadIconLoading = false;
+        } else {
+          this.$message.error("请上传有效的图片文件!(jpeg|jpg|gif|png|svg)"); // 提示用户上传有效的图片
+        }
+      };
+      input.click();
+    },
     close(flag = false) {
       if (this.loading && !flag) return this.$message.info("请稍等...");
       this.show = false;
@@ -163,14 +288,17 @@ export default {
     },
     init() {
       this.form = {
-        nname: "",
-        nlabel: "",
-        ndetail: "",
-        nurl: "",
-        ntype: "",
-        njuri: "1",
-        nstand: "cn",
-        njson: ""
+        name: "",
+        label: "",
+        detail: "",
+        url: "",
+        type: "",
+        juri: "1",
+        stand: "cn",
+        json: {
+          icon: "",
+          copy: "0"
+        }
       };
       this.loading = false;
     },
@@ -182,6 +310,54 @@ export default {
           this.$emit("success", this.form, this.type);
         }
       });
+    },
+    uploadFile(file) {
+      return new Promise(resolve => {
+        var credentials = {
+          accessKeyId: "AKIATLPEDU37QV5CHLMH",
+          secretAccessKey: "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"
+        }; //秘钥形式的登录上传
+        window.AWS.config.update(credentials);
+        window.AWS.config.region = "cn-northwest-1"; //设置区域
+
+        var bucket = new window.AWS.S3({ params: { Bucket: "ccrb" } }); //选择桶
+        var _this = this;
+
+        if (file) {
+          // this.loading = true;
+          var params = {
+            Key:
+              file.name.split(".")[0] +
+              new Date().getTime() +
+              "." +
+              file.name.split(".")[file.name.split(".").length - 1],
+            ContentType: file.type,
+            Body: file,
+            "Access-Control-Allow-Credentials": "*",
+            ACL: "public-read"
+          }; //key可以设置为桶的相抵路径,Body为文件, ACL最好要设置
+          var options = {
+            partSize: 2048 * 1024 * 1024,
+            queueSize: 2,
+            leavePartsOnError: true
+          };
+          bucket
+            .upload(params, options)
+            .on("httpUploadProgress", function(evt) {
+              //这里可以写进度条
+              // _this.progressData.value = parseInt((evt.loaded * 100) / evt.total);
+              // console.log("Uploaded : " + parseInt((evt.loaded * 80) / evt.total) + '%');
+            })
+            .send(function(err, data) {
+              if (err) {
+                _this.$message.error("上传失败");
+                resolve(0);
+              } else {
+                resolve(data.Location);
+              }
+            });
+        }
+      });
     }
   }
 };
@@ -191,7 +367,8 @@ export default {
 .addNewAppDialog >>> .el-dialog {
   min-width: 700px;
 
-  height: 680px;
+  /* height: 900px; */
+	height: 780px;
   box-shadow: 0px 0 8px 0px #555555;
   border-radius: 8px;
   background-color: #fff;
@@ -257,4 +434,43 @@ export default {
   display: flex;
   justify-content: flex-end;
 }
+
+.bfd_icon {
+  width: 70px;
+  height: 70px;
+  box-sizing: border-box;
+  padding: 5px;
+  margin-right: 40px;
+  cursor: pointer;
+}
+
+.bfd_icon > svg {
+  width: 100%;
+  height: 100%;
+}
+
+.bfd_icon > span {
+  width: 100%;
+  height: 100%;
+
+  display: block;
+}
+
+.bfd_icon > span >>> svg {
+  width: 100%;
+  height: 100%;
+}
+
+.switchForm{
+	display: flex;
+	align-items: center;
+}
+
+.switchForm>span{
+	margin-left: 10px;
+}
+
+.radioItem{
+	margin-bottom: 10px;
+}
 </style>

+ 146 - 0
src/components/pages/appStore/dialog/saveCard.vue

@@ -0,0 +1,146 @@
+<template>
+  <div class="saveCard">
+    <span>{{ title }}</span>
+    <div class="s_box">
+      <div v-for="(item,index) in data" :key="item.sid" @click="openAppUrl(item)" v-if="data.length>0 && item.id">
+        <div>
+          <svg
+            v-if="isImageOrSvg(typeof item.json =='object'?item.json.icon:'') === 0"
+            t="1732605901531"
+            class="icon"
+            viewBox="0 0 1024 1024"
+            version="1.1"
+            xmlns="http://www.w3.org/2000/svg"
+            p-id="4275"
+            width="200"
+            height="200"
+          >
+            <path
+              d="M179.2 153.6a51.2 51.2 0 0 0-51.2 51.2v128a51.2 51.2 0 0 0 51.2 51.2h128a51.2 51.2 0 0 0 51.2-51.2V204.8a51.2 51.2 0 0 0-51.2-51.2H179.2z m0-102.4h128a153.6 153.6 0 0 1 153.6 153.6v128a153.6 153.6 0 0 1-153.6 153.6H179.2a153.6 153.6 0 0 1-153.6-153.6V204.8a153.6 153.6 0 0 1 153.6-153.6z m0 614.4a51.2 51.2 0 0 0-51.2 51.2v128a51.2 51.2 0 0 0 51.2 51.2h128a51.2 51.2 0 0 0 51.2-51.2V716.8a51.2 51.2 0 0 0-51.2-51.2H179.2z m0-102.4h128a153.6 153.6 0 0 1 153.6 153.6v128a153.6 153.6 0 0 1-153.6 153.6H179.2a153.6 153.6 0 0 1-153.6-153.6V716.8a153.6 153.6 0 0 1 153.6-153.6z m611.84-403.4048a51.2 51.2 0 0 0-72.3968 0L646.144 232.2432a51.2 51.2 0 0 0 0 72.3968l72.448 72.3968a51.2 51.2 0 0 0 72.3968 0l72.3968-72.3968a51.2 51.2 0 0 0 0-72.3968L791.04 159.744z m72.3968-72.3968l72.3968 72.3968a153.6 153.6 0 0 1 0 217.2416l-72.3968 72.3968a153.6 153.6 0 0 1-217.2416 0l-72.3968-72.3968a153.6 153.6 0 0 1 0-217.2416l72.3968-72.3968a153.6 153.6 0 0 1 217.2416 0zM699.7504 896a51.2 51.2 0 0 1 0 102.4A162.1504 162.1504 0 0 1 537.6 836.2496v-110.8992A162.1504 162.1504 0 0 1 699.7504 563.2h110.8992a162.1504 162.1504 0 0 1 162.1504 162.1504v8.448a51.2 51.2 0 0 1-102.4 0v-8.448c0-33.024-26.7264-59.7504-59.7504-59.7504h-110.8992c-33.024 0-59.7504 26.7264-59.7504 59.7504v110.8992c0 33.024 26.7264 59.7504 59.7504 59.7504z"
+              fill="#2C6DD2"
+              p-id="4276"
+            ></path>
+            <path
+              d="M791.4496 160a51.2 51.2 0 0 0-72.3968 0l-72.448 72.3968a51.2 51.2 0 0 0 0 72.3968l72.448 72.3968a51.2 51.2 0 0 0 72.3968 0l72.3968-72.3968a51.2 51.2 0 0 0 0-72.3968l-72.3968-72.3968z"
+              fill="#20C997"
+              p-id="4277"
+            ></path>
+          </svg>
+          <span
+            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"
+            style="width: 100%; height: 100%"
+            :src="item.json.icon"
+            fit="cover"
+          ></el-image>
+        </div>
+        <span>{{item.name}}</span>
+      </div>
+			<span v-if="data.length==0">暂无数据...</span>
+    </div>
+  </div>
+</template>
+
+<script>
+export default {
+  props: {
+    title: {
+      type: String,
+      default: "标题"
+    },
+    data: {
+      type: Array,
+      default: () => []
+    }
+  },
+  data() {
+    return {};
+  },
+  computed: {
+    isImageOrSvg() {
+      return value => {
+        let _result = 0; //啥也不是
+        if (value) {
+          const svgPattern = /<svg.*<\/svg>/;
+          const imagePattern = /\.(jpeg|jpg|gif|png|svg|bmp|webp)$/i; // 图片链接的正则表达式
+          const urlPattern = /^(http|https):\/\/[^ "]+$/; // 网络地址的正则表达式
+
+          if (svgPattern.test(value)) {
+            _result = 1;
+          } else if (urlPattern.test(value) && imagePattern.test(value)) {
+            _result = 2;
+          }
+        }
+        return _result;
+      };
+    }
+  },
+	methods: {
+		openAppUrl(item){
+			window.open(item.url, "_blank");
+		}
+	},
+};
+</script>
+
+<style scoped>
+.saveCard {
+  width: 100%;
+  height: auto;
+  margin-bottom: 20px;
+  box-sizing: border-box;
+  padding: 10px;
+}
+
+.saveCard > span {
+  font-size: 1.1em;
+  font-weight: bold;
+}
+
+.s_box {
+  width: 100%;
+  height: auto;
+	padding-top: 15px;
+}
+
+.s_box>div{
+	width: 100%;
+	height: 30px;
+	margin-bottom: 15px;
+	display: flex;
+	align-items: center;
+	border-radius: 5px;
+	cursor: pointer;
+	transition: .1s;
+}
+
+.s_box>div:hover{
+	background-color: aliceblue;
+}
+
+.s_box>div>div{
+	width: 30px;
+	height: 30px;
+	box-sizing: border-box;
+	padding: 5px;
+}
+
+.s_box>div>div>svg{
+	width: 100%;
+	height: 100%;
+}
+
+.s_box>div>span{
+	max-width: calc(100% - 30px);
+	overflow: hidden;
+	text-overflow: ellipsis;
+	white-space: nowrap;
+}
+
+.s_box>span{
+	font-size: .8em;
+}
+</style>

+ 15 - 580
src/components/pages/appStore/index.vue

@@ -1,331 +1,29 @@
 <template>
   <div class="appCenter">
-    <div class="ac_header">
-      <div class="ac_h_top">
-        <span>应用管理</span>
-
-        <el-button
-          type="primary"
-          size="small"
-          icon="el-icon-plus"
-          style="position: absolute;right: 15px;"
-          @click="addApp"
-          >添加应用</el-button
-        >
-      </div>
-      <div class="ac_h_bottom">
-        <div class="ac_h_b_selectList">
-          <el-input
-            v-model="searchText"
-            style="width: 200px;"
-            placeholder="请输入应用名称"
-            @keyup.enter.native="getData"
-          />
-          <el-select
-            v-model="selectJuri"
-            placeholder="请选择"
-            @change="changeSelectType"
-          >
-            <el-option
-              v-for="item in selectList"
-              :key="item.index"
-              :label="item.label"
-              :value="item.index"
-            ></el-option>
-          </el-select>
-          <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 class="ac_h_b_typeList">
-          <span
-            :class="{ ac_h_b_typeList_active: showType === '' }"
-            @click="changeType('')"
-            >全部</span
-          >
-          <span
-            v-for="item in typeList"
-            :key="item.id"
-            :class="{ ac_h_b_typeList_active: showType === item.id }"
-            @click="changeType(item.id)"
-            >{{ item.name }}</span
-          >
-        </div>
-      </div>
-    </div>
-
-    <div class="ac_content">
-      <div class="ac_c_item" v-for="(item, index) in dataList" :key="item.id" @click="openApp(item.url)">
-        <div class="ac_c_i_top">
-          <div class="ac_c_i_t_left">
-            <svg
-              t="1732605901531"
-              class="icon"
-              viewBox="0 0 1024 1024"
-              version="1.1"
-              xmlns="http://www.w3.org/2000/svg"
-              p-id="4275"
-              width="200"
-              height="200"
-            >
-              <path
-                d="M179.2 153.6a51.2 51.2 0 0 0-51.2 51.2v128a51.2 51.2 0 0 0 51.2 51.2h128a51.2 51.2 0 0 0 51.2-51.2V204.8a51.2 51.2 0 0 0-51.2-51.2H179.2z m0-102.4h128a153.6 153.6 0 0 1 153.6 153.6v128a153.6 153.6 0 0 1-153.6 153.6H179.2a153.6 153.6 0 0 1-153.6-153.6V204.8a153.6 153.6 0 0 1 153.6-153.6z m0 614.4a51.2 51.2 0 0 0-51.2 51.2v128a51.2 51.2 0 0 0 51.2 51.2h128a51.2 51.2 0 0 0 51.2-51.2V716.8a51.2 51.2 0 0 0-51.2-51.2H179.2z m0-102.4h128a153.6 153.6 0 0 1 153.6 153.6v128a153.6 153.6 0 0 1-153.6 153.6H179.2a153.6 153.6 0 0 1-153.6-153.6V716.8a153.6 153.6 0 0 1 153.6-153.6z m611.84-403.4048a51.2 51.2 0 0 0-72.3968 0L646.144 232.2432a51.2 51.2 0 0 0 0 72.3968l72.448 72.3968a51.2 51.2 0 0 0 72.3968 0l72.3968-72.3968a51.2 51.2 0 0 0 0-72.3968L791.04 159.744z m72.3968-72.3968l72.3968 72.3968a153.6 153.6 0 0 1 0 217.2416l-72.3968 72.3968a153.6 153.6 0 0 1-217.2416 0l-72.3968-72.3968a153.6 153.6 0 0 1 0-217.2416l72.3968-72.3968a153.6 153.6 0 0 1 217.2416 0zM699.7504 896a51.2 51.2 0 0 1 0 102.4A162.1504 162.1504 0 0 1 537.6 836.2496v-110.8992A162.1504 162.1504 0 0 1 699.7504 563.2h110.8992a162.1504 162.1504 0 0 1 162.1504 162.1504v8.448a51.2 51.2 0 0 1-102.4 0v-8.448c0-33.024-26.7264-59.7504-59.7504-59.7504h-110.8992c-33.024 0-59.7504 26.7264-59.7504 59.7504v110.8992c0 33.024 26.7264 59.7504 59.7504 59.7504z"
-                fill="#2C6DD2"
-                p-id="4276"
-              ></path>
-              <path
-                d="M791.4496 160a51.2 51.2 0 0 0-72.3968 0l-72.448 72.3968a51.2 51.2 0 0 0 0 72.3968l72.448 72.3968a51.2 51.2 0 0 0 72.3968 0l72.3968-72.3968a51.2 51.2 0 0 0 0-72.3968l-72.3968-72.3968z"
-                fill="#20C997"
-                p-id="4277"
-              ></path>
-            </svg>
-          </div>
-          <div class="ac_c_i_t_right">
-            <div>{{ item.name }}</div>
-            <span>{{ item.label }}</span>
-          </div>
-					<div class="ac_c_i_t_popover" v-if="item.userid == userId">
-						<div class="ac_c_i_t_p_box" v-if="editAppCard === item.id" v-click-outside="handleBlur">
-							<div @click.stop="updateApp(item)">修改</div>
-						</div>
-						<svg t="1732786015570" @click.stop="updateCard(item.id)" 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>
-        <div class="ac_c_i_bottom">
-          <div>{{ item.detail }}</div>
-          <!-- <span @click="openApp(item.url)">{{ item.url }}</span> -->
-        </div>
-      </div>
-      <div class="ac_c_empty" v-if="dataList.length === 0">
-        <span>暂无数据...</span>
-      </div>
-    </div>
-    <addAppDialog
-      ref="addAppDialogRef"
-      :typeList="typeList"
-      @success="addAppSuccess"
-    />
+    <appManagement v-if="showCard === 0" ref="appManagementRef" @changeShowCard="changeShowCard"/>
+		<workSpace v-if="showCard === 1" ref="workSpaceRef" @changeShowCard="changeShowCard"/>
   </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 addAppDialog from "./dialog/addAppDialog.vue";
+import appManagement from './views/appManagement.vue';
+import workSpace from './views/workSpace.vue';
 export default {
   components: {
-    addAppDialog
-  },
-	directives: {
-    "click-outside": clickOutside // 注册自定义指令
+		appManagement,
+		workSpace
   },
-  data() {
-    return {
-      showType: "",
-      searchText: "",
-      selectJuri: 3,
-      typeList: [],
-      selectList: [
-        { index: 1, label: "我的" },
-        { index: 2, label: "组织" },
-        { index: 3, label: "所有人" }
-      ],
-      userId: this.$route.query["userid"],
-      org: this.$route.query["org"],
-      oid: this.$route.query["oid"],
-      getDataLoading: false,
-      dataList: [],
-			editAppCard:null
-    };
-  },
-  methods: {
-    changeType(newIndex) {
-      let flag = this.showType === newIndex;
-      this.showType = newIndex;
-      if (!flag) {
-        this.getData();
-      }
-    },
-    changeSelectType() {
-      this.getData();
-    },
-    getData() {
-      this.getDataLoading = true;
-      let params = {
-        uid: this.userId,//用户ID
-        name: this.searchText,//应用名称搜索
-        label: "",//应用的标签搜索
-        type: this.showType,//应用的类型
-        juri: this.selectJuri,//应用权限 1:我的  2:组织内  3:所有人
-        stand: "cn"//cn站还是hk站
-      };
-
-      this.ajax
-        .get(this.$store.state.api + "select_appStore", params)
-        .then(res => {
-          this.getDataLoading = false;
-          let _data = res.data[0];
-          if (_data.length > 0) {
-            this.dataList = _data;
-          } else {
-            this.dataList = [];
-          }
-        })
-        .catch(err => {
-          this.getDataLoading = false;
-          console.log(err);
-          this.$message.error("获取应用失败");
-        });
-    },
-    addApp() {
-      this.$refs.addAppDialogRef.open({ type: 1 });
-    },
-    updateApp(data) {
-      this.$refs.addAppDialogRef.open({
-        type: 2,
-        form: {
-          id: data.id,
-          nname: data.name,
-          nlabel: data.label,
-          ndetail: data.detail,
-          nurl: data.url,
-          ntype: data.type,
-          njuri: data.juri,
-          nstand: data.stand,
-          njson: data.json
-        }
-      });
-    },
-		updateCard(id){
-			if(this.editAppCard === id)return this.editAppCard = null;
-			this.editAppCard = id;
-		},
-		handleBlur(){
-			this.updateCard(null);
-		},
-    addAppSuccess(data, type) {
-      if (type === 1) {
-        //添加
-        let params = [
-          {
-            nname: data.nname, //app名称
-            nuserid: this.userId, //创建的用户ID
-            nlabel: data.nlabel, //app标签
-            ndetail: data.ndetail, //app简介
-            nurl: data.nurl, //app链接
-            ntype: data.ntype, //app类型
-            njuri: data.njuri, //app权限 1:我的 2:组织 3:所有人
-            nstand: "cn", //语言
-            njson: "" //其他信息
-          }
-        ];
-        this.ajax
-          .post(this.$store.state.api + "insert_appStore", params)
-          .then(res => {
-            if (res.data == 1) {
-              this.$message.success("添加成功");
-              this.$refs.addAppDialogRef.close(true);
-              this.getData();
-            } else {
-              this.$message.error("添加失败");
-              this.$refs.addAppDialogRef.loading = false;
-            }
-          })
-          .catch(err => {
-            console.log(err);
-            this.$message.error("添加失败");
-          });
-      } else if (type === 2) {
-				let params = [
-					{
-						aid: data.id,
-						nname: data.nname, //app名称
-            nuserid: this.userId, //创建的用户ID
-            nlabel: data.nlabel, //app标签
-            ndetail: data.ndetail, //app简介
-            nurl: data.nurl, //app链接
-            ntype: data.ntype, //app类型
-            njuri: data.njuri, //app权限 1:我的 2:组织 3:所有人
-            nstand: "cn", //语言
-            njson: data.njson //其他信息
-					}
-				]
-				this.ajax
-          .post(this.$store.state.api + "update_appStore", params)
-          .then(res => {
-            if (res.data == 1) {
-              this.$message.success("修改成功");
-              this.$refs.addAppDialogRef.close(true);
-              this.getData();
-            } else {
-              this.$message.error("修改失败");
-              this.$refs.addAppDialogRef.loading = false;
-            }
-          })
-          .catch(err => {
-            console.log(err);
-            this.$message.error("修改失败");
-          });
-      }
-    },
-    getTypeList() {
-      let params = {
-        suserid: this.userId,//用户ID
-        sorg: this.org,
-        soid: this.oid,
-        sstand: "cn"
-      };
 
-      this.ajax
-        .get(this.$store.state.api + "select_appStoreType", params)
-        .then(res => {
-          let data = res.data[0];
-          if (data.length > 0) {
-            this.typeList = data;
-          }
-        })
-        .catch(err => {
-          console.log(err);
-          this.$message.error("获取应用类型失败");
-        });
-    },
-    openApp(url) {
-      window.open(url, "_blank");
-    },
-    resetData() {
-      this.searchText = "";
-      this.selectJuri = 1;
-      this.showType = "";
-      this.getData();
-    }
+  data() {
+		return{
+			showCard:0,//0 应用中心  1:工作空间
+		}
   },
-  mounted() {
-    this.getTypeList();
-    this.getData();
-  }
+	methods: {
+		changeShowCard(newValue){
+			this.showCard = newValue;
+		}
+	},
 };
 </script>
 
@@ -334,269 +32,6 @@ export default {
   width: 100vw;
   height: 100vh;
   background-color: #f2f4f7;
-  margin: 0;
-  overflow: auto;
-  box-sizing: border-box;
-  padding: 20px;
-  display: flex;
-  flex-direction: column;
-}
-
-.ac_header {
-  width: 100%;
-  height: auto;
-  border-radius: 5px;
-  background-color: #fff;
-}
-
-.ac_h_top {
-  width: 100%;
-  height: 50px;
-  display: flex;
-  align-items: center;
-  box-sizing: border-box;
-  padding: 0 15px;
-  border-bottom: 1px solid #eeeeee;
-  position: relative;
-}
-
-.ac_h_top > span {
-  font-size: 26px;
-}
-
-.ac_h_bottom {
-  width: 100%;
-  height: auto;
-  padding: 10px 0 20px 0;
-}
-
-.ac_h_b_typeList {
-  width: 100%;
-  height: auto;
-  display: flex;
-  flex-wrap: wrap;
-  box-sizing: border-box;
-  padding: 0 15px;
-}
-
-.ac_h_b_typeList > span {
-  font-size: 18px;
-  margin-right: 20px;
-  margin-top: 10px;
-  margin-bottom: 5px;
-  cursor: pointer;
-}
-
-.ac_h_b_typeList_active {
-  color: #007aff;
-}
-
-.ac_h_b_selectList {
-  margin-left: 15px;
-  margin-bottom: 10px;
-}
-
-.ac_content {
-  width: 100%;
-  flex: 1;
-  height: auto;
-  margin-top: 20px;
   overflow: auto;
 }
-
-.ac_c_item {
-  width: calc(100% / 5 - (15px * 4) / 5);
-  height: 250px;
-  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;
-	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_empty {
-  width: 100%;
-  height: 40%;
-  display: flex;
-  box-sizing: border-box;
-  padding-top: 2%;
-  justify-content: center;
-  /* align-items: center; */
-}
-
-.ac_c_i_top {
-  width: 100%;
-  height: 50px;
-  display: flex;
-	position: relative;
-  /* flex-direction: column; */
-  /* justify-content: space-evenly; */
-  /* background-color: red */
-}
-
-.ac_c_i_t_popover{
-	width: 30px;
-	height: 30px;
-	position: absolute;
-	right: 0;
-	top: 0;
-}
-
-.ac_c_i_t_popover svg{
-	width: 25px;
-	height: 25px;
-	cursor: pointer;
-}
-
-.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: .3s;
-	font-weight: bold;
-	font-size: 14px;
-	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;
-}
-
-.ac_c_i_t_left {
-  width: 50px;
-  height: 50px;
-  border-radius: 8px;
-  margin-right: 10px;
-  box-sizing: border-box;
-  padding: 5px;
-}
-
-.ac_c_i_t_left > svg {
-  width: 100%;
-  height: 100%;
-}
-
-.ac_c_i_t_right {
-  width: calc(100% - 60px);
-  height: 100%;
-  display: flex;
-  flex-direction: column;
-  justify-content: space-evenly;
-}
-
-.ac_c_i_t_right > div {
-  font-size: 22px;
-  font-weight: bold;
-  max-width: 100%;
-  overflow: hidden;
-  text-overflow: ellipsis;
-  white-space: nowrap;
-}
-
-.ac_c_i_t_right > span {
-  font-size: 16px;
-  font-weight: bold;
-  color: #8991a1;
-  display: block;
-  max-width: 100%;
-  overflow: hidden;
-  text-overflow: ellipsis;
-  white-space: nowrap;
-}
-
-.ac_c_i_bottom {
-  width: 100%;
-  height: calc(100% - 60px);
-  margin-top: 15px;
-}
-
-.ac_c_i_bottom > div {
-  font-size: 20px;
-  color: #8991a1;
-  width: 100%;
-  height: calc(100% - 30px);
-  /* 第四行溢出显示... */
-  display: -webkit-box;
-  display: block;
-  overflow: hidden;
-  text-overflow: ellipsis;
-  -webkit-line-clamp: 4;
-  -webkit-box-orient: vertical;
-}
-
-.ac_c_i_bottom > span {
-  margin-top: 5px;
-  font-size: 16px;
-  color: #409eff;
-  overflow: hidden;
-  display: block;
-  text-overflow: ellipsis;
-  white-space: nowrap;
-  cursor: pointer;
-}
-
-
 </style>

+ 818 - 0
src/components/pages/appStore/views/appManagement.vue

@@ -0,0 +1,818 @@
+<template>
+  <div class="appManagement">
+    <div class="ac_left">
+			<!-- <recentUseCard/>
+			<collectCard/> -->
+			<saveCard title="最近使用" :data="recentUse"/>
+			<saveCard title="收藏" :data="collect"/>
+		</div>
+    <div class="ac_right">
+      <div class="ac_header">
+        <div class="ac_h_top">
+          <span>应用管理</span>
+          <!-- <span>知识库</span> -->
+          <el-button
+            type="primary"
+            size="small"
+            icon="el-icon-plus"
+            style="position: absolute;right: 15px;"
+            @click="addApp"
+            >添加应用</el-button
+          >
+        </div>
+        <div class="ac_h_bottom">
+          <div class="ac_h_b_selectList">
+            <el-input
+              v-model="searchText"
+              style="width: 200px;"
+              placeholder="请输入应用名称"
+              @keyup.enter.native="getData"
+            />
+            <el-select
+              v-model="selectJuri"
+              placeholder="请选择"
+              @change="changeSelectType"
+            >
+              <el-option
+                v-for="item in selectList"
+                :key="item.index"
+                :label="item.label"
+                :value="item.index"
+              ></el-option>
+            </el-select>
+            <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 class="ac_h_b_typeList">
+            <span
+              :class="{ ac_h_b_typeList_active: showType === '' }"
+              @click="changeType('')"
+              >全部</span
+            >
+            <span
+              v-for="item in typeList"
+              :key="item.id"
+              :class="{ ac_h_b_typeList_active: showType === item.id }"
+              @click="changeType(item.id)"
+              >{{ item.name }}</span
+            >
+          </div>
+        </div>
+      </div>
+
+      <div class="ac_content">
+        <div
+          class="ac_c_item"
+          v-for="(item, index) in dataList"
+          :key="item.id"
+          @click="openApp(item)"
+        >
+          <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"
+                t="1732605901531"
+                class="icon"
+                viewBox="0 0 1024 1024"
+                version="1.1"
+                xmlns="http://www.w3.org/2000/svg"
+                p-id="4275"
+                width="200"
+                height="200"
+              >
+                <path
+                  d="M179.2 153.6a51.2 51.2 0 0 0-51.2 51.2v128a51.2 51.2 0 0 0 51.2 51.2h128a51.2 51.2 0 0 0 51.2-51.2V204.8a51.2 51.2 0 0 0-51.2-51.2H179.2z m0-102.4h128a153.6 153.6 0 0 1 153.6 153.6v128a153.6 153.6 0 0 1-153.6 153.6H179.2a153.6 153.6 0 0 1-153.6-153.6V204.8a153.6 153.6 0 0 1 153.6-153.6z m0 614.4a51.2 51.2 0 0 0-51.2 51.2v128a51.2 51.2 0 0 0 51.2 51.2h128a51.2 51.2 0 0 0 51.2-51.2V716.8a51.2 51.2 0 0 0-51.2-51.2H179.2z m0-102.4h128a153.6 153.6 0 0 1 153.6 153.6v128a153.6 153.6 0 0 1-153.6 153.6H179.2a153.6 153.6 0 0 1-153.6-153.6V716.8a153.6 153.6 0 0 1 153.6-153.6z m611.84-403.4048a51.2 51.2 0 0 0-72.3968 0L646.144 232.2432a51.2 51.2 0 0 0 0 72.3968l72.448 72.3968a51.2 51.2 0 0 0 72.3968 0l72.3968-72.3968a51.2 51.2 0 0 0 0-72.3968L791.04 159.744z m72.3968-72.3968l72.3968 72.3968a153.6 153.6 0 0 1 0 217.2416l-72.3968 72.3968a153.6 153.6 0 0 1-217.2416 0l-72.3968-72.3968a153.6 153.6 0 0 1 0-217.2416l72.3968-72.3968a153.6 153.6 0 0 1 217.2416 0zM699.7504 896a51.2 51.2 0 0 1 0 102.4A162.1504 162.1504 0 0 1 537.6 836.2496v-110.8992A162.1504 162.1504 0 0 1 699.7504 563.2h110.8992a162.1504 162.1504 0 0 1 162.1504 162.1504v8.448a51.2 51.2 0 0 1-102.4 0v-8.448c0-33.024-26.7264-59.7504-59.7504-59.7504h-110.8992c-33.024 0-59.7504 26.7264-59.7504 59.7504v110.8992c0 33.024 26.7264 59.7504 59.7504 59.7504z"
+                  fill="#2C6DD2"
+                  p-id="4276"
+                ></path>
+                <path
+                  d="M791.4496 160a51.2 51.2 0 0 0-72.3968 0l-72.448 72.3968a51.2 51.2 0 0 0 0 72.3968l72.448 72.3968a51.2 51.2 0 0 0 72.3968 0l72.3968-72.3968a51.2 51.2 0 0 0 0-72.3968l-72.3968-72.3968z"
+                  fill="#20C997"
+                  p-id="4277"
+                ></path>
+              </svg>
+              <span
+                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"
+                style="width: 100%; height: 100%"
+                :src="item.json.icon"
+                fit="cover"
+              ></el-image>
+            </div>
+            <div class="ac_c_i_t_right">
+              <div>{{ item.name }}</div>
+              <span>{{ item.label }}</span>
+            </div>
+            <div class="ac_c_i_t_popover">
+              <div
+                class="ac_c_i_t_p_box"
+                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="collectApp(item)" v-else>收藏</div>
+								<div @click.stop="updateApp(item)" v-if="item.userid == userId">修改</div>
+              </div>
+              <svg
+                t="1732786015570"
+                @click.stop="updateCard(item.id)"
+                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>
+          <div class="ac_c_i_bottom">
+            <div>{{ item.detail }}</div>
+            <!-- <span @click="openApp(item.url)">{{ item.url }}</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 addAppDialog from "../dialog/addAppDialog.vue";
+import saveCard from "../dialog/saveCard.vue";
+// import collectCard from "./dialog/collectCard.vue";
+// import recentUseCard from "./dialog/recentUseCard.vue";
+export default {
+  components: {
+    addAppDialog,
+		saveCard
+		// collectCard,
+		// recentUseCard
+  },
+  directives: {
+    "click-outside": clickOutside // 注册自定义指令
+  },
+  data() {
+    return {
+      showType: "",
+      searchText: "",
+      selectJuri: 3,
+      typeList: [],
+      selectList: [
+        { index: 1, label: "我的" },
+        { index: 2, label: "组织" },
+        { index: 3, label: "所有人" }
+      ],
+      userId: this.$route.query["userid"],
+      org: this.$route.query["org"],
+      oid: this.$route.query["oid"],
+      getDataLoading: false,
+      dataList: [],
+      recentUse: [],
+      collect: [],
+      editAppCard: null
+    };
+  },
+  computed: {
+    isImageOrSvg() {
+      return value => {
+        let _result = 0; //啥也不是
+        if (value) {
+          const svgPattern = /<svg.*<\/svg>/;
+          const imagePattern = /\.(jpeg|jpg|gif|png|svg|bmp|webp)$/i; // 图片链接的正则表达式
+          const urlPattern = /^(http|https):\/\/[^ "]+$/; // 网络地址的正则表达式
+
+          if (svgPattern.test(value)) {
+            _result = 1;
+          } else if (urlPattern.test(value) && imagePattern.test(value)) {
+            _result = 2;
+          }
+        }
+        return _result;
+      };
+    }
+  },
+  methods: {
+    changeType(newIndex) {
+      let flag = this.showType === newIndex;
+      this.showType = newIndex;
+      if (!flag) {
+        this.getData();
+      }
+    },
+    changeSelectType() {
+      this.getData();
+    },
+    getData() {
+      this.getDataLoading = true;
+      let params = {
+        uid: this.userId, //用户ID
+        name: this.searchText, //应用名称搜索
+        label: "", //应用的标签搜索
+        type: this.showType, //应用的类型
+        juri: this.selectJuri, //应用权限 1:我的  2:组织内  3:所有人
+        stand: "cn" //cn站还是hk站
+      };
+
+      this.ajax
+        .get(this.$store.state.api + "select_appStore", params)
+        .then(res => {
+          this.getDataLoading = false;
+          let _data = res.data[0];
+          if (_data.length > 0) {
+            _data.forEach(i => {
+              if (i.json) {
+                i.json = JSON.parse(i.json);
+              }
+            });
+            this.dataList = _data;
+          } else {
+            this.dataList = [];
+          }
+        })
+        .catch(err => {
+          this.getDataLoading = false;
+          console.log(err);
+          this.$message.error("获取应用失败");
+        });
+    },
+    addApp() {
+      this.$refs.addAppDialogRef.open({ type: 1 });
+    },
+    updateApp(data) {
+      this.$refs.addAppDialogRef.open({
+        type: 2,
+        form: {
+          id: data.id,
+          name: data.name,
+          label: data.label,
+          detail: data.detail,
+          url: data.url,
+          type: data.type,
+          juri: data.juri,
+          stand: data.stand,
+          json: data.json
+        }
+      });
+    },
+    // 收藏APP
+    collectApp(item) {
+			this.editAppCard = null;
+			this.insertSave(item,0)
+		},
+		// 取消收藏
+		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();
+			}
+			
+		},
+    updateCard(id) {
+      if (this.editAppCard === id) return (this.editAppCard = null);
+      this.editAppCard = id;
+    },
+    handleBlur() {
+      this.updateCard(null);
+    },
+    addAppSuccess(data, type) {
+      if (type === 1) {
+        //添加
+        let params = [
+          {
+            name: data.name, //app名称
+            userid: this.userId, //创建的用户ID
+            label: data.label, //app标签
+            detail: data.detail, //app简介
+            url: data.url, //app链接
+            type: data.type, //app类型
+            juri: data.juri, //app权限 1:我的 2:组织 3:所有人
+            stand: "cn", //语言
+            json: JSON.stringify(data.json) //其他信息
+          }
+        ];
+        this.ajax
+          .post(this.$store.state.api + "insert_appStore", params)
+          .then(res => {
+            if (res.data == 1) {
+              this.$message.success("添加成功");
+              this.$refs.addAppDialogRef.close(true);
+              this.getData();
+            } else {
+              this.$message.error("添加失败");
+              this.$refs.addAppDialogRef.loading = false;
+            }
+          })
+          .catch(err => {
+            console.log(err);
+            this.$message.error("添加失败");
+          });
+      } else if (type === 2) {
+        let params = [
+          {
+            aid: data.id,
+            name: data.name, //app名称
+            userid: this.userId, //创建的用户ID
+            label: data.label, //app标签
+            detail: data.detail, //app简介
+            url: data.url, //app链接
+            type: data.type, //app类型
+            juri: data.juri, //app权限 1:我的 2:组织 3:所有人
+            stand: "cn", //语言
+            json: JSON.stringify(data.json) //其他信息
+          }
+        ];
+        this.ajax
+          .post(this.$store.state.api + "update_appStore", params)
+          .then(res => {
+            if (res.data == 1) {
+              this.$message.success("修改成功");
+              this.$refs.addAppDialogRef.close(true);
+              this.getData();
+            } else {
+              this.$message.error("修改失败");
+              this.$refs.addAppDialogRef.loading = false;
+            }
+          })
+          .catch(err => {
+            console.log(err);
+            this.$message.error("修改失败");
+          });
+      }
+    },
+    getTypeList() {
+      let params = {
+        suserid: this.userId, //用户ID
+        sorg: this.org,
+        soid: this.oid,
+        sstand: "cn"
+      };
+
+      this.ajax
+        .get(this.$store.state.api + "select_appStoreType", params)
+        .then(res => {
+          let data = res.data[0];
+          if (data.length > 0) {
+            this.typeList = data;
+          }
+        })
+        .catch(err => {
+          console.log(err);
+          this.$message.error("获取应用类型失败");
+        });
+    },
+    openApp(item) {
+      window.open(item.url, "_blank");
+			if (!(this.recentUse.length > 0 && item.id === this.recentUse[0].id)) {
+				this.insertSave(item,1);
+			}
+			
+    },
+    resetData() {
+      this.searchText = "";
+      this.selectJuri = 3;
+      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);
+            }
+          });
+					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();
+					}
+				}
+			}).catch(err=>{
+				console.log(err)
+				if(type===0)this.$message.error("收藏失败")
+			})
+
+		}
+  },
+  mounted() {
+    this.getTypeList();
+    this.getData();
+		this.getCollect();
+		this.getRecentUse();
+  }
+};
+</script>
+
+<style scoped>
+.appManagement {
+  width: 100vw;
+  height: 100vh;
+  background-color: #f2f4f7;
+  margin: 0;
+  overflow: auto;
+  box-sizing: border-box;
+  padding: 20px;
+  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);
+}
+
+.ac_h_top {
+  width: 100%;
+  height: 50px;
+  display: flex;
+  align-items: center;
+  box-sizing: border-box;
+  padding: 0 15px;
+  border-bottom: 1px solid #eeeeee;
+  position: relative;
+}
+
+.ac_h_top > span {
+  font-size: 26px;
+}
+
+.ac_h_bottom {
+  width: 100%;
+  height: auto;
+  padding: 10px 0 20px 0;
+}
+
+.ac_h_b_typeList {
+  width: 100%;
+  height: auto;
+  display: flex;
+  flex-wrap: wrap;
+  box-sizing: border-box;
+  padding: 0 15px;
+}
+
+.ac_h_b_typeList > span {
+  font-size: 18px;
+  margin-right: 20px;
+  margin-top: 10px;
+  margin-bottom: 5px;
+  cursor: pointer;
+}
+
+.ac_h_b_typeList_active {
+  color: #007aff;
+}
+
+.ac_h_b_selectList {
+  margin-left: 15px;
+  margin-bottom: 10px;
+}
+
+.ac_content {
+  width: 100%;
+  flex: 1;
+  height: auto;
+  margin-top: 20px;
+  overflow: auto;
+}
+
+.ac_c_item {
+  width: calc(100% / 5 - (15px * 4) / 5);
+  height: 250px;
+  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;
+  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_empty {
+  width: 100%;
+  height: 40%;
+  display: flex;
+  box-sizing: border-box;
+  padding-top: 2%;
+  justify-content: center;
+  /* align-items: center; */
+}
+
+.ac_c_i_top {
+  width: 100%;
+  height: 50px;
+  display: flex;
+  position: relative;
+  /* flex-direction: column; */
+  /* justify-content: space-evenly; */
+  /* background-color: red */
+}
+
+.ac_c_i_t_popover {
+  width: 30px;
+  height: 30px;
+  position: absolute;
+  right: 0;
+  top: 0;
+}
+
+.ac_c_i_t_popover svg {
+  width: 25px;
+  height: 25px;
+  cursor: pointer;
+}
+
+.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: .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;
+}
+
+.ac_c_i_t_left {
+  width: 50px;
+  height: 50px;
+  border-radius: 8px;
+  margin-right: 10px;
+  box-sizing: border-box;
+  padding: 5px;
+}
+
+.ac_c_i_t_left > svg {
+  width: 100%;
+  height: 100%;
+}
+
+.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_right {
+  width: calc(100% - 60px);
+  height: 100%;
+  display: flex;
+  flex-direction: column;
+  justify-content: space-evenly;
+}
+
+.ac_c_i_t_right > div {
+  font-size: 22px;
+  font-weight: bold;
+  max-width: 100%;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+}
+
+.ac_c_i_t_right > span {
+  font-size: 1.1em;
+  font-weight: bold;
+  color: #8991a1;
+  display: block;
+  max-width: 100%;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+}
+
+.ac_c_i_bottom {
+  width: 100%;
+  height: calc(100% - 60px);
+  margin-top: 15px;
+}
+
+.ac_c_i_bottom > div {
+  font-size: 1em;
+  color: #8991a1;
+  width: 100%;
+  height: calc(100%);
+  /* 第四行溢出显示... */
+  display: -webkit-box;
+  display: block;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  -webkit-line-clamp: 8;
+  -webkit-box-orient: vertical;
+}
+
+.ac_c_i_bottom > span {
+  margin-top: 5px;
+  font-size: 1em;
+  color: #409eff;
+  overflow: hidden;
+  display: block;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+  cursor: pointer;
+}
+</style>

+ 145 - 0
src/components/pages/appStore/views/workSpace.vue

@@ -0,0 +1,145 @@
+<template>
+  <div class="workSpace">
+    <div class="ac_header">
+      <div class="ac_h_top">
+        <span>应用管理</span>
+        <!-- <span>知识库</span> -->
+        <!-- <el-button
+          type="primary"
+          size="small"
+          icon="el-icon-plus"
+          style="position: absolute;right: 15px;"
+          @click="addApp"
+          >添加应用</el-button
+        > -->
+      </div>
+      <!-- <div class="ac_h_bottom">
+        <div class="ac_h_b_selectList">
+          <el-input
+            v-model="searchText"
+            style="width: 200px;"
+            placeholder="请输入应用名称"
+            @keyup.enter.native="getData"
+          />
+          <el-select
+            v-model="selectJuri"
+            placeholder="请选择"
+            @change="changeSelectType"
+          >
+            <el-option
+              v-for="item in selectList"
+              :key="item.index"
+              :label="item.label"
+              :value="item.index"
+            ></el-option>
+          </el-select>
+          <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 class="ac_h_b_typeList">
+          <span
+            :class="{ ac_h_b_typeList_active: showType === '' }"
+            @click="changeType('')"
+            >全部</span
+          >
+          <span
+            v-for="item in typeList"
+            :key="item.id"
+            :class="{ ac_h_b_typeList_active: showType === item.id }"
+            @click="changeType(item.id)"
+            >{{ item.name }}</span
+          >
+        </div>
+      </div> -->
+    </div>
+		<div class="ac_content">
+
+		</div>
+  </div>
+</template>
+
+<script>
+export default {};
+</script>
+
+<style scoped>
+.workSpace {
+  width: 100vw;
+  height: 100vh;
+  background-color: #f2f4f7;
+  margin: 0;
+  overflow: auto;
+  box-sizing: border-box;
+  padding: 20px;
+  display: flex;
+  justify-content: space-between;
+}
+.ac_header {
+  width: 100%;
+  height: auto;
+  border-radius: 5px;
+  background-color: #fff;
+  box-shadow: 0 0 10px 0 rgba(0, 0, 0, 0.1);
+}
+
+.ac_h_top {
+  width: 100%;
+  height: 50px;
+  display: flex;
+  align-items: center;
+  box-sizing: border-box;
+  padding: 0 15px;
+  border-bottom: 1px solid #eeeeee;
+  position: relative;
+}
+
+.ac_h_top > span {
+  font-size: 26px;
+}
+
+.ac_h_bottom {
+  width: 100%;
+  height: auto;
+  padding: 10px 0 20px 0;
+}
+
+.ac_h_b_typeList {
+  width: 100%;
+  height: auto;
+  display: flex;
+  flex-wrap: wrap;
+  box-sizing: border-box;
+  padding: 0 15px;
+}
+
+.ac_h_b_typeList > span {
+  font-size: 18px;
+  margin-right: 20px;
+  margin-top: 10px;
+  margin-bottom: 5px;
+  cursor: pointer;
+}
+
+.ac_h_b_typeList_active {
+  color: #007aff;
+}
+
+.ac_h_b_selectList {
+  margin-left: 15px;
+  margin-bottom: 10px;
+}
+
+.ac_content{
+	width: 100%;
+  flex: 1;
+  height: auto;
+  margin-top: 20px;
+  overflow: auto;
+}
+</style>

Beberapa file tidak ditampilkan karena terlalu banyak file yang berubah dalam diff ini