SanHQin 9 달 전
부모
커밋
f0f05ccf88
56개의 변경된 파일753개의 추가작업 그리고 7개의 파일을 삭제
  1. 0 0
      dist/index.html
  2. 1 1
      dist/report.html
  3. 1 1
      dist/static/css/app.970aed35.css
  4. 1 1
      dist/static/css/chunk-00b34a2c.0176bc8f.css
  5. 1 1
      dist/static/css/chunk-01c5f272.f64aae55.css
  6. 0 0
      dist/static/css/chunk-2fc6aeae.48be29a0.css
  7. 1 0
      dist/static/css/chunk-346f137c.a3ff273e.css
  8. 0 0
      dist/static/css/chunk-61229b5a.c1320d08.css
  9. 0 0
      dist/static/css/chunk-69694896.3f5d2bfe.css
  10. 0 0
      dist/static/css/chunk-7caf3a38.1c20fc5b.css
  11. 0 0
      dist/static/css/chunk-a7efcac8.45aec7cd.css
  12. 0 1
      dist/static/css/chunk-c677f69c.8148ce74.css
  13. 0 0
      dist/static/img/Union.b0ea0f49.svg
  14. 0 0
      dist/static/img/delFile.ec8981b7.svg
  15. BIN
      dist/static/img/isSubmitTask.d84c3c8c.png
  16. BIN
      dist/static/img/taskSuccess.e03beb85.png
  17. 0 0
      dist/static/img/videoFile.22737868.svg
  18. 0 0
      dist/static/js/app.226479bb.js
  19. 0 0
      dist/static/js/app.987df366.js
  20. 0 0
      dist/static/js/chunk-00b34a2c.3d939fc5.js
  21. 0 0
      dist/static/js/chunk-01c5f272.9fb6dac0.js
  22. 0 0
      dist/static/js/chunk-05d4945c.5c9c8b3b.js
  23. 0 0
      dist/static/js/chunk-17e66bfc.f54469f6.js
  24. 0 0
      dist/static/js/chunk-1c2d9d84.92330897.js
  25. 0 0
      dist/static/js/chunk-236ce05a.bf30c7f3.js
  26. 0 0
      dist/static/js/chunk-242f34f9.7d85811d.js
  27. 0 0
      dist/static/js/chunk-284ddcf3.8b6ba7ad.js
  28. 0 0
      dist/static/js/chunk-2a8fbba6.4ed7fe8e.js
  29. 0 0
      dist/static/js/chunk-2ce4ba0a.bff10a02.js
  30. 0 0
      dist/static/js/chunk-2d0c7336.53a51d03.js
  31. 0 0
      dist/static/js/chunk-2fc6aeae.a4bf35da.js
  32. 0 0
      dist/static/js/chunk-30b5de98.261d6680.js
  33. 0 0
      dist/static/js/chunk-346f137c.f72a3c3b.js
  34. 0 0
      dist/static/js/chunk-5297f142.80111d24.js
  35. 0 0
      dist/static/js/chunk-5542237d.b1aed236.js
  36. 0 0
      dist/static/js/chunk-567aee9e.36786e26.js
  37. 0 0
      dist/static/js/chunk-5f369096.c8559457.js
  38. 0 0
      dist/static/js/chunk-61229b5a.3ae9b80a.js
  39. 0 0
      dist/static/js/chunk-67c4ee97.fd26aa66.js
  40. 0 0
      dist/static/js/chunk-69694896.a53bf952.js
  41. 0 0
      dist/static/js/chunk-6a21acd5.320f14c8.js
  42. 0 0
      dist/static/js/chunk-6ad98842.6a2156ed.js
  43. 0 0
      dist/static/js/chunk-6b5e1f52.79efd7b6.js
  44. 0 0
      dist/static/js/chunk-75189236.4a373bb9.js
  45. 0 0
      dist/static/js/chunk-7caf3a38.5a9e9507.js
  46. 0 0
      dist/static/js/chunk-87a128fc.96beca75.js
  47. 0 0
      dist/static/js/chunk-a7efcac8.2bc1d689.js
  48. 0 0
      dist/static/js/chunk-b265f6f8.f5f4a438.js
  49. 0 0
      dist/static/js/chunk-bc7440a4.b7f3049c.js
  50. 0 0
      dist/static/js/chunk-c3be65e4.d0bf4053.js
  51. 0 0
      dist/static/js/chunk-c677f69c.d4fa8001.js
  52. 44 0
      src/api/appStore.js
  53. 8 1
      src/router/router.config.js
  54. 179 0
      src/views/appStore/components/appStorePopup.vue
  55. 508 0
      src/views/appStore/index.vue
  56. 9 1
      src/views/layouts/index.vue

파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 0 - 0
dist/index.html


파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 1 - 1
dist/report.html


+ 1 - 1
dist/static/css/app.6354a19c.css → dist/static/css/app.970aed35.css

@@ -1,4 +1,4 @@
-.vc-tigger{position:absolute;top:0;right:0;width:.13333rem;height:.13333rem}.show{display:block!important}
+.vc-tigger{position:absolute;top:0;right:0;width:.13333rem;height:.13333rem}.show{display:block!important}.el-scrollbar .el-scrollbar__bar{opacity:1!important}
 
 /*!
  * animate.css -http://daneden.me/animate

+ 1 - 1
dist/static/css/chunk-bc7440a4.881dd956.css → dist/static/css/chunk-00b34a2c.0176bc8f.css

@@ -1 +1 @@
-.bar[data-v-b6c036fa]{width:100%;height:1.06667rem;z-index:999;font-weight:550;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;box-sizing:border-box;padding:0 .26667rem;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;position:fixed;top:0;left:0;font-size:.45333rem;color:#000!important;background-color:#fff!important}.barTitle[data-v-b6c036fa]{max-width:50vw;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.chatArea[data-v-0c5cf930]{width:100vw;height:100vh;box-sizing:border-box;padding-top:1.06667rem;overflow:hidden}.ca_iframe[data-v-0c5cf930]{width:100%;height:100%}
+.bar[data-v-b6c036fa]{width:100%;height:1.06667rem;z-index:999;font-weight:550;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;box-sizing:border-box;padding:0 .26667rem;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;position:fixed;top:0;left:0;font-size:.45333rem;color:#000!important;background-color:#fff!important}.barTitle[data-v-b6c036fa]{max-width:50vw;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.chatArea[data-v-20bb0365]{width:100vw;height:100vh;box-sizing:border-box;padding-top:1.06667rem;overflow:hidden}.ca_iframe[data-v-20bb0365]{width:100%;height:100%}

+ 1 - 1
dist/static/css/chunk-567aee9e.f19843e2.css → dist/static/css/chunk-01c5f272.f64aae55.css

@@ -1 +1 @@
-.bar[data-v-b6c036fa]{width:100%;height:1.06667rem;z-index:999;font-weight:550;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;box-sizing:border-box;padding:0 .26667rem;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;position:fixed;top:0;left:0;font-size:.45333rem;color:#000!important;background-color:#fff!important}.barTitle[data-v-b6c036fa]{max-width:50vw;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.chatArea[data-v-6a0b548b]{width:100vw;height:100vh;box-sizing:border-box;padding-top:1.06667rem;overflow:hidden}.ca_iframe[data-v-6a0b548b]{width:100%;height:100%}
+.bar[data-v-b6c036fa]{width:100%;height:1.06667rem;z-index:999;font-weight:550;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;box-sizing:border-box;padding:0 .26667rem;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;position:fixed;top:0;left:0;font-size:.45333rem;color:#000!important;background-color:#fff!important}.barTitle[data-v-b6c036fa]{max-width:50vw;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.chatArea[data-v-2ebc4311]{width:100vw;height:100vh;box-sizing:border-box;padding-top:1.06667rem;overflow:hidden}.ca_iframe[data-v-2ebc4311]{width:100%;height:100%}

파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 0 - 0
dist/static/css/chunk-2fc6aeae.48be29a0.css


+ 1 - 0
dist/static/css/chunk-346f137c.a3ff273e.css

@@ -0,0 +1 @@
+h3[data-v-543593c5]{margin:1.06667rem 0 0}ul[data-v-543593c5]{list-style-type:none;padding:0}li[data-v-543593c5]{display:inline-block;margin:0 .26667rem}a[data-v-543593c5]{color:#42b983}.app-container[data-v-779930a7]{height:100vh}.app-container .layout-content[data-v-779930a7]{height:calc(100% - 1.33333rem)}.app-container .layout-footer[data-v-779930a7]{display:block;height:1.33333rem}

파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 0 - 0
dist/static/css/chunk-61229b5a.c1320d08.css


파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 0 - 0
dist/static/css/chunk-69694896.3f5d2bfe.css


파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 0 - 0
dist/static/css/chunk-7caf3a38.1c20fc5b.css


파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 0 - 0
dist/static/css/chunk-a7efcac8.45aec7cd.css


+ 0 - 1
dist/static/css/chunk-c677f69c.8148ce74.css

@@ -1 +0,0 @@
-h3[data-v-543593c5]{margin:1.06667rem 0 0}ul[data-v-543593c5]{list-style-type:none;padding:0}li[data-v-543593c5]{display:inline-block;margin:0 .26667rem}a[data-v-543593c5]{color:#42b983}.app-container[data-v-a73dc7c4]{height:100vh}.app-container .layout-content[data-v-a73dc7c4]{height:calc(100% - 1.33333rem)}.app-container .layout-footer[data-v-a73dc7c4]{display:block;height:1.33333rem}

+ 0 - 0
dist/static/img/Union.953680c6.svg → dist/static/img/Union.b0ea0f49.svg


+ 0 - 0
dist/static/img/delFile.b454d74e.svg → dist/static/img/delFile.ec8981b7.svg


BIN
dist/static/img/isSubmitTask.d84c3c8c.png


BIN
dist/static/img/taskSuccess.e03beb85.png


+ 0 - 0
dist/static/img/videoFile.8b2406f2.svg → dist/static/img/videoFile.22737868.svg


파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 0 - 0
dist/static/js/app.226479bb.js


파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 0 - 0
dist/static/js/app.987df366.js


파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 0 - 0
dist/static/js/chunk-00b34a2c.3d939fc5.js


파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 0 - 0
dist/static/js/chunk-01c5f272.9fb6dac0.js


파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 0 - 0
dist/static/js/chunk-05d4945c.5c9c8b3b.js


+ 0 - 0
dist/static/js/chunk-17e66bfc.98439975.js → dist/static/js/chunk-17e66bfc.f54469f6.js


+ 0 - 0
dist/static/js/chunk-1c2d9d84.1cfeb8cf.js → dist/static/js/chunk-1c2d9d84.92330897.js


파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 0 - 0
dist/static/js/chunk-236ce05a.bf30c7f3.js


파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 0 - 0
dist/static/js/chunk-242f34f9.7d85811d.js


+ 0 - 0
dist/static/js/chunk-284ddcf3.cd9d81bc.js → dist/static/js/chunk-284ddcf3.8b6ba7ad.js


+ 0 - 0
dist/static/js/chunk-2a8fbba6.e85f39d5.js → dist/static/js/chunk-2a8fbba6.4ed7fe8e.js


+ 0 - 0
dist/static/js/chunk-2ce4ba0a.f07eb0fb.js → dist/static/js/chunk-2ce4ba0a.bff10a02.js


+ 0 - 0
dist/static/js/chunk-2d0c7336.5464938b.js → dist/static/js/chunk-2d0c7336.53a51d03.js


파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 0 - 0
dist/static/js/chunk-2fc6aeae.a4bf35da.js


+ 0 - 0
dist/static/js/chunk-30b5de98.addc29a7.js → dist/static/js/chunk-30b5de98.261d6680.js


파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 0 - 0
dist/static/js/chunk-346f137c.f72a3c3b.js


+ 0 - 0
dist/static/js/chunk-5297f142.a090c452.js → dist/static/js/chunk-5297f142.80111d24.js


+ 0 - 0
dist/static/js/chunk-5542237d.9bd54459.js → dist/static/js/chunk-5542237d.b1aed236.js


파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 0 - 0
dist/static/js/chunk-567aee9e.36786e26.js


+ 0 - 0
dist/static/js/chunk-5f369096.b9981115.js → dist/static/js/chunk-5f369096.c8559457.js


파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 0 - 0
dist/static/js/chunk-61229b5a.3ae9b80a.js


+ 0 - 0
dist/static/js/chunk-67c4ee97.6ad1715c.js → dist/static/js/chunk-67c4ee97.fd26aa66.js


파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 0 - 0
dist/static/js/chunk-69694896.a53bf952.js


+ 0 - 0
dist/static/js/chunk-6a21acd5.4b0c5cde.js → dist/static/js/chunk-6a21acd5.320f14c8.js


+ 0 - 0
dist/static/js/chunk-6ad98842.de1717c6.js → dist/static/js/chunk-6ad98842.6a2156ed.js


+ 0 - 0
dist/static/js/chunk-6b5e1f52.8755f221.js → dist/static/js/chunk-6b5e1f52.79efd7b6.js


+ 0 - 0
dist/static/js/chunk-75189236.547f04d5.js → dist/static/js/chunk-75189236.4a373bb9.js


파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 0 - 0
dist/static/js/chunk-7caf3a38.5a9e9507.js


+ 0 - 0
dist/static/js/chunk-87a128fc.d52eeaef.js → dist/static/js/chunk-87a128fc.96beca75.js


파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 0 - 0
dist/static/js/chunk-a7efcac8.2bc1d689.js


+ 0 - 0
dist/static/js/chunk-b265f6f8.fce9b6b4.js → dist/static/js/chunk-b265f6f8.f5f4a438.js


파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 0 - 0
dist/static/js/chunk-bc7440a4.b7f3049c.js


+ 0 - 0
dist/static/js/chunk-c3be65e4.776ca350.js → dist/static/js/chunk-c3be65e4.d0bf4053.js


파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 0 - 0
dist/static/js/chunk-c677f69c.d4fa8001.js


+ 44 - 0
src/api/appStore.js

@@ -0,0 +1,44 @@
+// axios
+import request from '@/utils/request'
+
+// 获取类型
+export function getStoreType(params) {
+  return request({
+    url: '/select_appStoreType',
+    method: 'get',
+    params,
+    hideloading: false
+  })
+}
+
+// 获取app
+export function getStore(params) {
+  return request({
+    url: '/select_appStore',
+    method: 'get',
+    params,
+    hideloading: false
+  })
+}
+
+//添加app
+
+export function addApp(params) {
+  return request({
+    url: '/insert_appStore',
+    method: 'post',
+    data: params,
+    hideloading: false
+  })
+}
+
+//修改app
+
+export function editApp(params) {
+  return request({
+    url: '/update_appStore',
+    method: 'post',
+    data: params,
+    hideloading: false
+  })
+}

+ 8 - 1
src/router/router.config.js

@@ -45,9 +45,16 @@ export const constantRouterMap = [
         name: 'eva',
         component: () => import('@/views/eva/index'),
         meta: { title: '观察记录', keepAlive: false }
-      }
+      },
+			{
+				path: 'appStore',
+				name: 'appStore',
+				component: () => import('@/views/appStore/index'),
+				meta: { title: '应用管理', keepAlive: false }
+			},
     ]
   },
+	
   {
     path: '/classObserve',
     name: 'classObserve',

+ 179 - 0
src/views/appStore/components/appStorePopup.vue

@@ -0,0 +1,179 @@
+<template>
+  <div class="popup">
+    <van-popup v-model="show" style="width: 95%;height: calc(100% - 50px);" closeable :zIndex="10">
+			<div class="popupTitle">
+				<span v-if="type==1">添加应用</span>
+				<span v-if="type==2">修改应用</span>
+			</div>
+      <div class="box" v-loading="loading">
+        <el-form :model="form" :rules="rules" ref="ruleForm">
+          <el-form-item label="应用名称" prop="nname">
+            <el-input v-model="form.nname" placeholder="请输入应用名称"></el-input>
+          </el-form-item>
+          <div style="display: flex;width: 100%;justify-content: space-between;">
+            <el-form-item label="应用标签" prop="nlabel">
+              <el-input v-model="form.nlabel" placeholder="请输入应用标签" style="width: 170px"></el-input>
+            </el-form-item>
+            <el-form-item label="应用类型" prop="ntype">
+              <el-select v-model="form.ntype" placeholder="请选择应用类型" style="width: 170px;">
+                <el-option  style="z-index: 2024;" v-for="item in typeList" :key="item.id" :label="item.name" :value="item.id"> </el-option>
+              </el-select>
+            </el-form-item>
+          </div>
+          <el-form-item label="应用链接" prop="nurl">
+            <el-input v-model="form.nurl" placeholder="请输入应用链接"></el-input>
+          </el-form-item>
+          <el-form-item label="应用简介" prop="ndetail">
+            <el-input
+              type="textarea"
+              v-model="form.ndetail"
+              style="width: 100%;"
+              :rows="3"
+              resize="none"
+              placeholder="请输入应用简介"
+            ></el-input>
+          </el-form-item>
+          <el-form-item label="权限管理" style="display: flex;flex-direction: column;align-items: flex-start;">
+            <el-radio-group v-model="form.njuri">
+              <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>
+
+				<div class="b_bottom">
+					<el-button size="mini" @click="close()">取消</el-button>
+					<el-button size="mini" type="primary" @click="submitBtn('ruleForm')">确定</el-button>
+				</div>
+      </div>
+    </van-popup>
+  </div>
+</template>
+
+<script>
+let validUrl = (rule, value, callback) => {
+  if (value) {
+    // 验证链接是否有效
+    try {
+      new URL(value)
+      callback()
+    } catch (error) {
+      return callback(new Error('请输入有效的链接'))
+    }
+  }
+}
+
+export default {
+  props: {
+    typeList: {
+      type: Array,
+      default: () => []
+    }
+  },
+  data() {
+    return {
+      show: false,
+			loading:false,
+			type:1,
+      form: {
+        nname: '',
+        nlabel: '',
+        nurl: '',
+        ntype: '',
+        njuri: '1',
+        nstand: '',
+        njson: ''
+      },
+      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' }],
+        // ndetail:[{required:true,message:"请输入应用简介",trigger:"blur"}],
+        njuri: [{ required: true, message: '请选择权限管理', trigger: 'blur' }],
+        nurl: [
+          { required: true, message: '请输入应用链接', trigger: 'blur' },
+          { validator: validUrl, trigger: 'blur' }
+        ]
+      }
+    }
+  },
+  methods: {
+    open(data) {
+      if (data && data.type === 2) {
+        this.form = data.form
+        this.type = data.type
+      } else {
+        this.form = {
+          nname: '',
+          nlabel: '',
+          ndetail: '',
+          nurl: '',
+          ntype: '',
+          njuri: '1',
+          nstand: 'cn',
+          njson: ''
+        }
+      }
+      this.loading = false
+      this.show = true
+    },
+    close(flag = false) {
+      if (this.loading && !flag) return this.$message.info('请稍等...')
+      this.show = false
+      this.init()
+    },
+    init() {
+      this.form = {
+        nname: '',
+        nlabel: '',
+        ndetail: '',
+        nurl: '',
+        ntype: '',
+        njuri: '1',
+        nstand: 'cn',
+        njson: ''
+      }
+      this.loading = false
+    },
+    submitBtn(ref) {
+      if (this.loading) return this.$message.info('请稍等...')
+      this.$refs[ref].validate(valid => {
+        if (valid) {
+          this.loading = true
+          this.$emit('success', this.form, this.type)
+        }
+      })
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.box {
+  width: 100%;
+  height: 100%;
+  padding: 40px 20px 20px 20px;
+  overflow: auto;
+	box-sizing: border-box
+}
+
+.popupTitle{
+	font-size: 18px;
+	font-weight: bold;
+	position: absolute;
+	top: 10px;
+	left:20px;
+}
+
+.b_bottom{
+	position: absolute;
+	right: 20px;
+	bottom:20px;
+}
+
+:deep(.el-select-dropdown){
+	z-index: 2003 !important;
+}
+</style>

+ 508 - 0
src/views/appStore/index.vue

@@ -0,0 +1,508 @@
+<template>
+  <div class="appStore">
+    <div class="as_header">
+      <div class="as_h_top">
+        <span>应用管理</span>
+        <el-button class="addBtn" type="primary" size="mini" @click="addAppFn">添加应用</el-button>
+      </div>
+      <div class="as_h_bottom">
+        <el-input v-model="searchText" style="width:40%" placeholder="请输入应用名称" size="mini"></el-input>
+        <el-select v-model="selectJuri" placeholder="请选择权限" size="mini" style="width:39%;margin-left:10px" @change="getData()">
+          <el-option v-for="item in selectList" :key="item.index" :label="item.label" :value="item.index"></el-option>
+        </el-select>
+        <el-button
+          type="primary"
+          size="mini"
+          @click="getData()"
+          icon="el-icon-search"
+          style="margin-left: 10px;"
+        ></el-button>
+      </div>
+      <div class="as_h_typeList">
+				<span :class="{'typeActive':showType==''}" @click="changeType('')">全部</span>
+				<span v-for="(item,index) in typeList" :key="item.id" :class="{'typeActive':item.id==showType}" @click="changeType(item.id)">{{item.name}}</span>
+
+      </div>
+    </div>
+    <div class="as_content">
+      <div class="as_c_item" v-for="(item, index) in dataList" :key="item.id" @click="closeCard()">
+        <div class="as_c_i_top">
+          <div class="as_c_i_t_icon">
+            <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="as_c_i_t_message">
+            <div>{{ item.name }}</div>
+            <span>{{ item.label }}</span>
+          </div>
+					<div class="ac_c_i_t_popover" v-if="item.userid == userinfo.userid">
+						<svg t="1732786015570" @click.stop="showCard(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 class="popoverBox" v-if="showCardId===item.id">
+							<span @click="editAppFn(item)">编辑</span>
+						</div>
+						<!-- <van-popover trigger="click" placement="bottom-end">
+							<div class="as_c_i_t_p_content">
+								<span>编辑</span>
+							</div>
+							<template #reference>
+
+							</template>
+						</van-popover> -->
+					</div>
+        </div>
+        <div class="as_c_i_bottom">
+          <div>{{ item.detail }}</div>
+          <span @click="openUrl(item.url)">{{ item.url }}</span>
+        </div>
+      </div>
+      <span class="as_c_empty" v-if="dataList.length === 0">
+        暂无应用...
+      </span>
+    </div>
+		<appStorePopup ref="appStorePopupRef" :typeList="typeList" @success="appStorePopupSuccess"/>
+  </div>
+</template>
+
+<script>
+import { mapGetters } from 'vuex'
+import { getStoreType, getStore,addApp,editApp } from '@/api/appStore';
+import appStorePopup from './components/appStorePopup.vue';
+const clickOutside = {
+  bind(el, binding) {
+    // 在元素上绑定一个点击事件监听器
+    el.clickOutsideEvent = function(event) {
+			console.log("event",event)
+			console.log("村上春树")
+
+      // 检查点击事件是否发生在元素的内部
+      if (!(el === event.target || el.contains(event.target))) {
+        // 如果点击事件发生在元素的外部,则触发指令绑定的方法,将点击的event数据传过去
+        binding.value(event);
+      }
+    };
+    // 在文档上添加点击事件监听器
+    document.addEventListener("tap", el.clickOutsideEvent);
+  },
+  unbind(el) {
+    // 在元素上解除点击事件监听器
+    document.removeEventListener("tap", el.clickOutsideEvent);
+  }
+};
+
+export default {
+  name: 'appStore',
+	components:{
+		appStorePopup
+	},
+	directives: {
+    "click-outside": clickOutside // 注册自定义指令
+  },
+  data() {
+    return {
+      dataList: [],
+      typeList: [],
+      showType: '',
+      searchText: '',
+      selectJuri: 1,
+      selectList: [
+        { index: 1, label: '我的' },
+        { index: 2, label: '组织' },
+        { index: 3, label: '所有人' }
+      ],
+      getDataLoading: false,
+			showCardId:null,
+    }
+  },
+  computed: {
+    ...mapGetters(['userinfo'])
+  },
+  methods: {
+    getData() {
+      this.getDataLoading = true
+      let params = {
+        uid: this.userinfo.userid,
+        name: this.searchText,
+        label: '',
+        type: this.showType,
+        juri: this.selectJuri,
+        stand: 'cn'
+      }
+
+      getStore(params)
+        .then(res => {
+          let _data = res[0]
+          if (_data.length > 0) {
+            this.dataList = _data
+          } else {
+            this.dataList = []
+          }
+          this.getDataLoading = false
+        })
+        .catch(err => {
+          this.getDataLoading = false
+          this.$toast.error('获取应用数据失败')
+        })
+    },
+    getAllStoreType() {
+      let params = {
+        suserid: this.userinfo.userid,
+        sorg: this.userinfo.org,
+        soid: this.userinfo.organizeid,
+        sstand: 'cn'
+      }
+
+      getStoreType(params)
+        .then(res => {
+          let _data = res[0]
+          if (_data.length > 0) {
+            this.typeList = _data
+          } else {
+            this.typeList = []
+          }
+        })
+        .catch(err => {
+          console.log(err)
+          this.$toast.error('获取应用类型失败')
+        })
+    },
+    openUrl(url) {
+      window.open(url, '_blank')
+    },
+    addAppFn() {
+      this.$refs.appStorePopupRef.open({type:1})
+    },
+		editAppFn(data){
+			this.$refs.appStorePopupRef.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
+			}})
+		},
+		appStorePopupSuccess(data,type){
+			if (type === 1) {
+        //添加
+        let params = [
+          {
+            nname: data.nname, //app名称
+            nuserid: this.userinfo.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: "" //其他信息
+          }
+        ];
+        addApp(params).then(res => {
+            if (res == 1) {
+              this.$message.success("添加成功");
+              this.$refs.appStorePopupRef.close(true);
+              this.getData();
+            } else {
+              this.$message.error("添加失败");
+              this.$refs.appStorePopupRef.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.userinfo.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 //其他信息
+					}
+				]
+				editApp(params).then(res => {
+            if (res == 1) {
+              this.$message.success("修改成功");
+              this.$refs.appStorePopupRef.close(true);
+              this.getData();
+            } else {
+              this.$message.error("修改失败");
+              this.$refs.appStorePopupRef.loading = false;
+            }
+          })
+          .catch(err => {
+            console.log(err);
+            this.$message.error("修改失败");
+          });
+      }
+		},
+		showCard(id){
+			if(this.showCardId==id)return this.showCardId = null;
+			this.showCardId = id
+		},
+		changeType(id){
+			if(this.showType !== id){
+				this.showType = id
+				this.getData()
+			}
+		},
+		closeCard(){
+			this.showCardId = null
+		}
+  },
+  mounted() {
+    this.getData()
+    this.getAllStoreType()
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.appStore {
+  width: 100%;
+  height: 100%;
+  box-sizing: border-box;
+  // padding: 5px;
+  background-color: #f2f4f7;
+  display: flex;
+  flex-direction: column;
+}
+
+.as_header {
+  width: 100%;
+  height: auto;
+  background-color: #fff;
+}
+
+.as_h_top {
+  width: 100%;
+  height: 50px;
+  display: flex;
+  align-items: center;
+  box-sizing: border-box;
+  padding: 0 10px;
+  font-size: 20px;
+  font-weight: bold;
+  border-bottom: solid 1px #eeeeee;
+  position: relative;
+}
+
+.addBtn {
+  position: absolute;
+  right: 5px;
+}
+
+.as_h_bottom {
+  width: 100%;
+  height: auto;
+  padding: 10px 10px;
+}
+
+.as_h_typeList {
+  width: calc(100% - 20px);
+  height: auto;
+	padding: 0 0px 10px 0px;
+}
+
+.as_h_typeList>span{
+	display: block;
+	float: left;
+	font-size: 14px;
+	margin-left: 10px;
+	margin-bottom: 10px;
+	white-space:nowrap;
+}
+
+.typeActive{
+	color: #409eff;
+}
+
+.as_content {
+  width: 100%;
+  height: calc(100% - 100px);
+  overflow: auto;
+  box-sizing: border-box;
+  padding: 10px 5px 20px 5px;
+  padding: 10px;
+}
+
+.as_c_empty {
+  width: 100%;
+  height: auto;
+  display: flex;
+  justify-content: center;
+  margin-top: 20px;
+}
+
+.as_c_item {
+  width: 100%;
+  height: 150px;
+  background-color: #fff;
+  float: left;
+  border-radius: 10px;
+  margin-bottom: 10px;
+  box-shadow: 0 0 10px 0 rgba(#000000, 0.1);
+}
+
+.as_c_i_top {
+  width: 100%;
+  height: 50px;
+  box-sizing: border-box;
+  padding: 10px;
+  display: flex;
+}
+
+.as_c_i_t_icon {
+  width: 30px;
+  height: 30px;
+  box-sizing: border-box;
+  display: flex;
+}
+
+.as_c_i_t_icon > svg {
+  width: 100%;
+  height: 100%;
+}
+
+.as_c_i_t_name {
+  width: calc(100% - 60px);
+  height: 50px;
+  float: right;
+  line-height: 50px;
+  font-size: 18px;
+  font-weight: bold;
+  color: #333;
+}
+
+.as_c_i_t_desc {
+  width: calc(100% - 60px);
+  height: 50px;
+  float: right;
+  line-height: 50px;
+  font-size: 14px;
+  color: #666;
+}
+
+.as_c_i_t_message {
+  width: calc(100% - 40px);
+  height: 100%;
+  margin-left: 10px;
+}
+
+.as_c_i_t_message > div {
+  width: 100%;
+  height: auto;
+  overflow: hidden;
+  white-space: nowrap;
+  text-overflow: ellipsis;
+  font-size: 14px;
+  font-weight: bold;
+}
+
+.as_c_i_t_message > span {
+  color: #8991a1;
+  display: block;
+  max-width: 100%;
+  overflow: hidden;
+  white-space: nowrap;
+  text-overflow: ellipsis;
+}
+
+.as_c_i_bottom {
+  width: 100%;
+  height: calc(100% - 50px);
+  display: flex;
+  flex-direction: column;
+  box-sizing: border-box;
+  padding: 10px;
+  justify-content: space-between;
+  // background-color: red;
+}
+
+.as_c_i_bottom > div {
+  width: 100%;
+  max-height: calc(100% - 22px);
+  color: #8991a1;
+  display: -webkit-box;
+  display: block;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  -webkit-line-clamp: 4;
+  -webkit-box-orient: vertical;
+  margin-bottom: 5px;
+}
+
+.as_c_i_bottom > span {
+  display: block;
+  max-width: 100%;
+  height: 15px;
+  color: #409eff;
+  overflow: hidden;
+  white-space: nowrap;
+  text-overflow: ellipsis;
+  font-size: 14px;
+}
+
+.ac_c_i_t_popover{
+	width: 30px;
+	height:30px;
+	position: relative;
+}
+
+.ac_c_i_t_popover svg{
+	width: 30px;
+	height: 30px;
+}
+
+.popoverBox{
+	position: absolute;
+	width: 60px;
+	height: auto;
+	padding: 5px;
+	border-radius: 8px 0 8px 8px;
+	background-color: #fff;
+	box-shadow: 0 0 10px 0 rgba(#000000, 0.1);
+	right:0;
+	top:calc(100% - 5px)
+}
+
+.popoverBox>span{
+	display: flex;
+	justify-content: center;
+	align-items: center;
+	padding:5px 10px;
+
+}
+
+.popoverBox>span:hover{
+	color: #409eff;
+}
+</style>

+ 9 - 1
src/views/layouts/index.vue

@@ -60,7 +60,15 @@ export default {
           },
           activeIcon: require('../../assets/images/course/commmt-active1.png'),
           normalIcon: require('../../assets/images/course/comment1.png')
-        }
+        },
+				{
+					title: '应用管理',
+          to: {
+            path: '/appStore'
+          },
+          activeIcon: require('../../assets/images/course/commmt-active1.png'),
+          normalIcon: require('../../assets/images/course/comment1.png')
+				}
       )
       // if(this.orgArray.includes(this.$store.state.user.userinfo.organizeid)){
       // 	this.tabbars.push(        {

이 변경점에서 너무 많은 파일들이 변경되어 몇몇 파일들은 표시되지 않았습니다.