2 Коміти 7762e8e279 ... 8f7037607a

Автор SHA1 Опис Дата
  lsc 8f7037607a Merge branch 'beta' of https://git.cocorobo.cn/CocoRoboLabs/pbl-teacher-table into beta 4 днів тому
  lsc cb0a07047f update 4 днів тому

BIN
src/assets/icon/firstToolList/appStore.png


+ 2 - 1
src/common/tools.js

@@ -39,5 +39,6 @@ export const tools = {
     51: { name: "资源库" },
     54: { name: "拍照" },
     71: { name: "AI智能体" },
-    56: { name: "投票" }
+    56: { name: "投票" },
+    72: { name: "应用中心" },
 };

+ 70 - 22
src/components/pages/aiAddCourse/addCourse.vue

@@ -4237,29 +4237,48 @@
                                     </div> -->
                                   </div>
                                   <!-- <div class="tool">
-                              <div class="whiteBIcon" @click="openTools(itemTaskIndex, 49, toolIndex)">
-                                <img src="../../../assets/icon/fourthToolList/group.png" alt />
-                                <div style="margin: 5px 0">学生分组</div>
-                              </div>
-                              <div class="check" @click="addTools(49, itemTaskIndex, toolIndex)">
-                                <img src="../../../assets/icon/checkNo.png" alt v-if="itemTool.tool.indexOf(49) == -1" />
-                                <div class="checkDiv" v-else>
-                                  <img src="../../../assets/icon/checkedIs.png" alt /><span>已选择</span>
-                                </div>
-                              </div>
-                            </div> -->
-                                  <!-- <div class="tool">
-                                  <div class="whiteBIcon" @click="openTools(itemTaskIndex, 62, toolIndex)">
-                                    <img src="../../../assets/icon/fourthToolList/interVideo.png" alt />
-                                    <div style="margin: 5px 0">交互视频</div>
-                                  </div>
-                                  <div class="check" @click="addTools(62, itemTaskIndex, toolIndex)">
-                                    <img src="../../../assets/icon/checkNo.png" alt v-if="itemTool.tool.indexOf(62) == -1" />
-                                    <div class="checkDiv" v-else>
-                                      <img src="../../../assets/icon/checkedIs.png" alt /><span>已选择</span>
+                                    <div class="whiteBIcon" @click="openTools(itemTaskIndex, 49, toolIndex)">
+                                      <img src="../../../assets/icon/fourthToolList/group.png" alt />
+                                      <div style="margin: 5px 0">学生分组</div>
+                                    </div>
+                                    <div class="check" @click="addTools(49, itemTaskIndex, toolIndex)">
+                                      <img src="../../../assets/icon/checkNo.png" alt v-if="itemTool.tool.indexOf(49) == -1" />
+                                      <div class="checkDiv" v-else>
+                                        <img src="../../../assets/icon/checkedIs.png" alt /><span>已选择</span>
+                                      </div>
+                                    </div>
+                                  </div> -->
+                                        <!-- <div class="tool">
+                                        <div class="whiteBIcon" @click="openTools(itemTaskIndex, 62, toolIndex)">
+                                          <img src="../../../assets/icon/fourthToolList/interVideo.png" alt />
+                                          <div style="margin: 5px 0">交互视频</div>
+                                        </div>
+                                        <div class="check" @click="addTools(62, itemTaskIndex, toolIndex)">
+                                          <img src="../../../assets/icon/checkNo.png" alt v-if="itemTool.tool.indexOf(62) == -1" />
+                                          <div class="checkDiv" v-else>
+                                            <img src="../../../assets/icon/checkedIs.png" alt /><span>已选择</span>
+                                          </div>
+                                        </div>
+                                      </div> -->
+                                  <div class="tool" :class="{
+                                    isToolChoose:
+                                      itemTool.tool.indexOf(72) != -1,
+                                  }" @click="
+                                    addTools(72, itemTaskIndex, toolIndex)
+                                    ">
+                                    <div class="whiteBIcon" @click.stop="
+                                      openTools(itemTaskIndex, 72, toolIndex)
+                                      ">
+                                      <img src="../../../assets/icon/firstToolList/appStore.png" alt />
+                                      <div style="margin: 5px 0">应用中心</div>
+                                    </div>
+                                    <div class="noCTool">
+                                      <img src="../../../assets/icon/new/isToolC.png" alt="" />
+                                    </div>
+                                    <div class="isCTool" v-if="itemTool.tool.indexOf(72) != -1">
+                                      <img src="../../../assets/icon/new/isToolC.png" alt="" />
                                     </div>
                                   </div>
-                                </div> -->
                                 </div>
                                 <div class="toolSort" v-if="itemTool.toolType == 1">
                                   <div class="tool" :class="{
@@ -7504,6 +7523,7 @@
     </aiCreateVideoDialog>
     <wpdf :dialogVisiblePdf.sync="dialogVisiblePdf" :url="wurl"></wpdf>
     <wOffice :dialogVisibleOffice.sync="dialogVisibleOffice" :url="wurl"></wOffice>
+    <appDialog ref="appDialog"></appDialog>
   </div>
 </template>
 
@@ -7544,6 +7564,7 @@ import evaList from "./evaList.vue";
 import MindTask from "./jsmind2";
 import ConvertApi from 'convertapi-js'
 let convertApi = ConvertApi.auth('secret_U1EO5rhgMCnoBnBT')
+import appDialog from '../components/appDialog.vue'
 
 var OpenCC = require("opencc-js");
 let converter = OpenCC.Converter({
@@ -7619,7 +7640,8 @@ export default {
     wOffice,
     evaList,
     MindTask,
-    recordV
+    recordV,
+    appDialog
   },
   data() {
     return {
@@ -14509,6 +14531,22 @@ ${_this.unitJson[0].chapterInfo[0].taskJson[index].taskDetail3.replaceAll('#',''
         // };
         this.$forceUpdate();
         this.EnglishVoiceDialog = true;
+      }else if(i == 72){
+        let appJson = this.unitJson[this.unitIndex].chapterInfo[0].taskJson[
+          itemTaskIndex
+        ].toolChoose[toolIndex].appJson
+          ? JSON.parse(
+            JSON.stringify(
+              this.unitJson[this.unitIndex].chapterInfo[0].taskJson[
+                itemTaskIndex
+              ].toolChoose[toolIndex].appJson
+            )
+          )
+          : { 
+            url:'',
+           };
+        this.$forceUpdate();
+        this.$refs.appDialog.openG(appJson,this.unitIndex,itemTaskIndex,toolIndex);
       }
     },
     setEnglishVoiceJson(val) {
@@ -14655,6 +14693,16 @@ ${_this.unitJson[0].chapterInfo[0].taskJson[index].taskDetail3.replaceAll('#',''
           return;
         }
       }
+      if(i == 72){
+        if (
+          !this.unitJson[this.unitIndex].chapterInfo[0].taskJson[itemTaskIndex]
+            .toolChoose[toolIndex].appJson || Object.keys(this.unitJson[this.unitIndex].chapterInfo[0].taskJson[itemTaskIndex]
+            .toolChoose[toolIndex].appJson).length == 0
+        ) {
+          this.openTools(itemTaskIndex, 72, toolIndex);
+          return;
+        }
+      }
       // if (i == 48) {
       //   if (
       //     !this.unitJson[this.unitIndex].chapterInfo[0].taskJson[itemTaskIndex]

+ 49 - 1
src/components/pages/aiEasy/addCourse.vue

@@ -3818,6 +3818,25 @@
                                     </div>
                                   </div>
                                 </div> -->
+                                <div class="tool" :class="{
+                                      isToolChoose:
+                                        itemTool.tool.indexOf(72) != -1,
+                                    }" @click="
+                                      addTools(72, itemTaskIndex, toolIndex)
+                                      ">
+                                      <div class="whiteBIcon" @click.stop="
+                                        openTools(itemTaskIndex, 72, toolIndex)
+                                        ">
+                                        <img src="../../../assets/icon/firstToolList/appStore.png" alt />
+                                        <div style="margin: 5px 0">应用中心</div>
+                                      </div>
+                                      <div class="noCTool">
+                                        <img src="../../../assets/icon/new/isToolC.png" alt="" />
+                                      </div>
+                                      <div class="isCTool" v-if="itemTool.tool.indexOf(72) != -1">
+                                        <img src="../../../assets/icon/new/isToolC.png" alt="" />
+                                      </div>
+                                  </div>
                                 </div>
                                 <div class="toolSort" v-if="itemTool.toolType == 1">
                                   <div class="tool" :class="{
@@ -6959,6 +6978,7 @@
     <aiCreateVideoDialog :dialogVisibleAiCreateVideo.sync="dialogVisibleAiCreateVideo" :courseName="courseName" @createAiVideo="createAiVideo" :courseState="courseState" :lineCount="lineCount" :unitJson="unitJson"></aiCreateVideoDialog>
     <wpdf :dialogVisiblePdf.sync="dialogVisiblePdf" :url="wurl"></wpdf>
     <wOffice :dialogVisibleOffice.sync="dialogVisibleOffice" :url="wurl" ></wOffice>
+    <appDialog ref="appDialog"></appDialog>
   </div>
 </template>
 
@@ -6999,6 +7019,7 @@ import evaList from "./evaList.vue";
 import MindTask from "./jsmind2";
 import ConvertApi from 'convertapi-js'
 let convertApi = ConvertApi.auth('secret_U1EO5rhgMCnoBnBT')
+import appDialog from '../components/appDialog.vue'
 
 var OpenCC = require("opencc-js");
 let converter = OpenCC.Converter({
@@ -7074,7 +7095,8 @@ export default {
     wOffice,
     evaList,
     MindTask,
-    recordV
+    recordV,
+    appDialog,
   },
   data() {
     return {
@@ -13716,6 +13738,22 @@ ${_this.unitJson[0].chapterInfo[0].taskJson[index].taskDetail3.replaceAll('#',''
         // };
         this.$forceUpdate();
         this.EnglishVoiceDialog = true;
+      }else if(i == 72){
+        let appJson = this.unitJson[this.unitIndex].chapterInfo[0].taskJson[
+          itemTaskIndex
+        ].toolChoose[toolIndex].appJson
+          ? JSON.parse(
+            JSON.stringify(
+              this.unitJson[this.unitIndex].chapterInfo[0].taskJson[
+                itemTaskIndex
+              ].toolChoose[toolIndex].appJson
+            )
+          )
+          : { 
+            url:'',
+           };
+        this.$forceUpdate();
+        this.$refs.appDialog.openG(appJson,this.unitIndex,itemTaskIndex,toolIndex);
       }
     },
     setEnglishVoiceJson(val) {
@@ -13862,6 +13900,16 @@ ${_this.unitJson[0].chapterInfo[0].taskJson[index].taskDetail3.replaceAll('#',''
           return;
         }
       }
+      if(i == 72){
+        if (
+          !this.unitJson[this.unitIndex].chapterInfo[0].taskJson[itemTaskIndex]
+            .toolChoose[toolIndex].appJson || Object.keys(this.unitJson[this.unitIndex].chapterInfo[0].taskJson[itemTaskIndex]
+            .toolChoose[toolIndex].appJson).length == 0
+        ) {
+          this.openTools(itemTaskIndex, 72, toolIndex);
+          return;
+        }
+      }
       // if (i == 48) {
       //   if (
       //     !this.unitJson[this.unitIndex].chapterInfo[0].taskJson[itemTaskIndex]

+ 1324 - 0
src/components/pages/components/appDialog.vue

@@ -0,0 +1,1324 @@
+<template>
+  <el-dialog
+    title="应用中心"
+    :visible.sync="dialogVisible"
+    width="calc(100% - 20px)"
+    class="el-dialogClass dialog_diy"
+    :before-close="handleClose"
+  >
+    <div class="ac_right">
+      <div class="ac_header">
+        <div class="ac_h_bottom">
+          <div class="ac_h_b_selectList">
+            <div>
+              <el-select
+                v-model="selectJuri"
+                placeholder="请选择显示范围"
+                @change="changeSelectType"
+                style="width: 120px;margin-right: 10px;"
+              >
+                <el-option
+                  v-for="item in selectList"
+                  :key="item.index"
+                  :label="item.label"
+                  :value="item.index"
+                ></el-option>
+              </el-select>
+              <el-select
+                v-model="selectLabel"
+                placeholder="请选择类型"
+                @change="changeSelectType"
+                style="width: 110px;margin-right: 10px;"
+              >
+                <el-option
+                  v-for="item in labelSelect"
+                  :key="item.value"
+                  :label="item.label"
+                  :value="item.value"
+                ></el-option>
+              </el-select>
+
+              <el-select
+                v-model="statusType"
+                placeholder="请选择状态"
+                @change="changeSelectType"
+                style="width: 110px;margin-right: 10px;"
+              >
+                <el-option
+                  v-for="item in statusList"
+                  :key="item.value"
+                  :label="item.label"
+                  :value="item.value"
+                ></el-option>
+              </el-select>
+            </div>
+
+            <div>
+              <el-input
+                v-model="searchText"
+                style="width: 250px;margin-right: 10px;"
+                placeholder="请输入应用名称"
+                @keyup.enter.native="getData"
+              >
+                <i
+                  slot="suffix"
+                  class="searchInputIcon el-icon-search"
+                  @click="getData"
+                ></i>
+              </el-input>
+            </div>
+          </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-if="showType !== '' && !getDataLoading"
+          v-for="(item, index) in dataList"
+          :key="item.id"
+          :class="{checkActive: appJson.id == item.id}"
+          @click="checkApp(item)"
+        >
+          <div class="ac_c_i_top">
+            <div class="ac_c_i_t_left">
+              <img v-if="item.json.icon" :src="item.json.icon" />
+              <svg
+                v-else
+                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 class="ac_c_i_t_r_top">
+                <el-tooltip
+                  class="item"
+                  effect="light"
+                  :content="item.name"
+                  placement="top"
+                >
+                  <span>{{ item.name }}</span>
+                </el-tooltip>
+              </div>
+              <div class="ac_c_i_t_r_center">
+                <span>@{{ item.username }}</span>
+                <div v-if="item.label === 'workflow'">
+                  <img
+                    src="../../../assets/icon/appStore/workflow.svg"
+                    alt=""
+                  />
+                  工作流
+                </div>
+                <div v-if="item.label === 'agent'">
+                  <img src="../../../assets/icon/appStore/agent.svg" alt="" />
+                  智能体
+                </div>
+              </div>
+              <div class="ac_c_i_t_r_bottom">
+                {{ item.detail }}
+              </div>
+            </div>
+          </div>
+          <div class="ac_c_i_bottom">
+            <div class="ac_c_i_b_left">
+              <el-tooltip
+                class="item"
+                effect="light"
+                content="被复制数"
+                placement="top"
+              >
+                <div>
+                  <img src="../../../assets/icon/appStore/user_copy.svg" />
+                  <span>{{ item.copyCount }}</span>
+                </div>
+              </el-tooltip>
+              <el-tooltip
+                class="item"
+                effect="light"
+                :content="item.likeId ? '取消点赞' : '点赞'"
+                placement="top"
+              >
+                <div>
+                  <img
+                    :src="
+                      require('../../../assets/icon/appStore/praise_default.svg')
+                    "
+                    v-if="!item.likeId"
+                    style="cursor: pointer;"
+                    @click.stop="praiseFn(item, 0)"
+                  />
+                  <img
+                    :src="
+                      require('../../../assets/icon/appStore/praise_active.svg')
+                    "
+                    v-else
+                    style="cursor: pointer;"
+                    @click.stop="praiseFn(item, 1)"
+                  />
+                  <span>{{ item.likeCount }}</span>
+                </div>
+              </el-tooltip>
+              <el-tooltip
+                class="item"
+                effect="light"
+                :content="item.collectId ? '取消收藏' : '收藏'"
+                placement="top"
+              >
+                <div>
+                  <img
+                    src="../../../assets/icon/appStore/collect_default.svg"
+                    v-if="!item.collectId"
+                    style="cursor: pointer;"
+                    @click.stop="collectFn(item, 0)"
+                  />
+                  <img
+                    src="../../../assets/icon/appStore/collect_active.svg"
+                    v-else
+                    style="cursor: pointer;"
+                    @click.stop="collectFn(item, 1)"
+                  />
+                  <span>{{ item.collectCount }}</span>
+                </div>
+              </el-tooltip>
+            </div>
+            <div class="ac_c_i_b_right" v-if="item.json.status">
+              <span class="ac_c_i_b_r_type2" v-if="item.json.status === '1'"
+                >测试</span
+              >
+              <span class="ac_c_i_b_r_type1" v-if="item.json.status === '2'"
+                >稳定</span
+              >
+            </div>
+            <div class="ac_c_i_b_right" style="margin-left: 10px">
+              <span class="ac_c_i_b_r_type3" @click.stop="openApp(item)">查看</span>
+            </div>
+          </div>
+        </div>
+
+        <div class="ac_c_typeCard" v-if="showType == ''">
+          <div class="ac_c_tc_item" v-for="(item2, index2) in typeList">
+            <div class="ac_c_tc_i_top">
+              <div>{{ item2.name }}</div>
+
+              <span @click="changeType(item2.id)"
+                >查看更多
+                <img src="../../../assets/icon/appStore/arrow.svg" />
+              </span>
+            </div>
+            <div class="ac_c_tc_i_bottom">
+              <div
+                class="ac_c_item"
+                v-if="index < 8"
+                v-for="(item, index) in dataList.filter(
+                  i => i.type == item2.id
+                )"
+                :key="item.id"
+                 @click="checkApp(item)" :class="{checkActive: appJson.id == item.id}"
+              >
+                <div class="ac_c_i_top">
+                  <div class="ac_c_i_t_left">
+                    <img v-if="item.json.icon" :src="item.json.icon" />
+                    <svg
+                      v-else
+                      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 class="ac_c_i_t_r_top">
+                      <el-tooltip
+                        class="item"
+                        effect="light"
+                        :content="item.name"
+                        placement="top"
+                      >
+                        <span>{{ item.name }}</span>
+                      </el-tooltip>
+                    </div>
+                    <div class="ac_c_i_t_r_center">
+                      <span>@{{ item.username }}</span>
+                      <div v-if="item.label === 'workflow'">
+                        <img
+                          src="../../../assets/icon/appStore/workflow.svg"
+                          alt=""
+                        />
+                        工作流
+                      </div>
+                      <div v-if="item.label === 'agent'">
+                        <img
+                          src="../../../assets/icon/appStore/agent.svg"
+                          alt=""
+                        />
+                        智能体
+                      </div>
+                    </div>
+                    <div class="ac_c_i_t_r_bottom">
+                      {{ item.detail }}
+                    </div>
+                  </div>
+                </div>
+                <div class="ac_c_i_bottom">
+                  <div class="ac_c_i_b_left">
+                    <el-tooltip
+                      class="item"
+                      effect="light"
+                      content="被复制数"
+                      placement="top"
+                    >
+                      <div>
+                        <img
+                          src="../../../assets/icon/appStore/user_copy.svg"
+                        />
+                        <span>{{ item.copyCount }}</span>
+                      </div>
+                    </el-tooltip>
+                    <el-tooltip
+                      class="item"
+                      effect="light"
+                      :content="item.likeId ? '取消点赞' : '点赞'"
+                      placement="top"
+                    >
+                      <div>
+                        <img
+                          :src="
+                            require('../../../assets/icon/appStore/praise_default.svg')
+                          "
+                          v-if="!item.likeId"
+                          style="cursor: pointer;"
+                          @click.stop="praiseFn(item, 0)"
+                        />
+                        <img
+                          :src="
+                            require('../../../assets/icon/appStore/praise_active.svg')
+                          "
+                          v-else
+                          style="cursor: pointer;"
+                          @click.stop="praiseFn(item, 1)"
+                        />
+                        <span>{{ item.likeCount }}</span>
+                      </div>
+                    </el-tooltip>
+                    <el-tooltip
+                      class="item"
+                      effect="light"
+                      :content="item.collectId ? '取消收藏' : '收藏'"
+                      placement="top"
+                    >
+                      <div>
+                        <img
+                          src="../../../assets/icon/appStore/collect_default.svg"
+                          v-if="!item.collectId"
+                          style="cursor: pointer;"
+                          @click="collectFn(item, 0)"
+                        />
+                        <img
+                          src="../../../assets/icon/appStore/collect_active.svg"
+                          v-else
+                          style="cursor: pointer;"
+                          @click="collectFn(item, 1)"
+                        />
+                        <span>{{ item.collectCount }}</span>
+                      </div>
+                    </el-tooltip>
+                  </div>
+                  <div class="ac_c_i_b_right" v-if="item.json.status">
+                    <span
+                      class="ac_c_i_b_r_type2"
+                      v-if="item.json.status === '1'"
+                      >测试</span
+                    >
+                    <span
+                      class="ac_c_i_b_r_type1"
+                      v-if="item.json.status === '2'"
+                      >稳定</span
+                    >
+                  </div>
+                  <div class="ac_c_i_b_right" style="margin-left: 10px">
+                    <span class="ac_c_i_b_r_type3" @click.stop="openApp(item)">查看</span>
+                  </div>
+                </div>
+              </div>
+              <div
+                class="ac_c_empty"
+                v-if="dataList.filter(i => i.type == item2.id).length === 0"
+              >
+                <span>暂无数据...</span>
+              </div>
+            </div>
+          </div>
+        </div>
+        <div class="ac_c_empty" v-if="dataList.length === 0 && showType !== ''">
+          <span>暂无数据...</span>
+        </div>
+      </div>
+    </div>
+    <span slot="footer">
+      <el-button @click="dialogVisible = false">关 闭</el-button>
+      <el-button type="primary" @click="checkAppJson">确 定</el-button>
+    </span>
+  </el-dialog>
+</template>
+
+<script>
+export default {
+  data() {
+    return {
+      dialogVisible: false,
+      appJson: {},
+      itemTaskIndex: 0,
+      toolIndex: 0,
+      unitIndex: 0,
+      showType: "",
+      searchText: "",
+      selectJuri: 3,
+      selectLabel: "",
+      typeList: [],
+      selectList: [
+        { index: 3, label: "所有组织" },
+        { index: 2, label: "组织内" },
+        { index: 1, label: "我的" }
+        // { index: 98,label:"已发布"},
+        // { index: 99,label:"未发布"},
+      ],
+      statusList: [
+        { value: "", label: "所有状态" },
+        { value: 1, label: "测试" },
+        { value: 2, label: "稳定" }
+      ],
+      statusType: "",
+      labelSelect: [
+        { value: "", label: "所有类型" },
+        { value: "agent", label: "智能体" },
+        { value: "workflow", label: "工作流" }
+      ],
+      userId: this.$route.query["userid"],
+      org: this.$route.query["org"],
+      oid: this.$route.query["oid"],
+      getDataLoading: false,
+      dataList: [],
+      recentUse: [],
+      collect: [],
+      editAppCard: null,
+      bannerObj: null,
+      userName: null,
+      controlsObj: null,
+      region: "cn"
+    };
+  },
+  watch: {
+    searchText: {
+      immediate: false,
+      handler() {
+        if (this.searchText === "") {
+          this.getData();
+        }
+      }
+    }
+  },
+  computed: {
+    showMenu() {
+      return data => {
+        let _result = false;
+        if (data && this.userId) {
+          if (
+            data.userid === this.userId ||
+            (data.json && data.json.copy === "1")
+          ) {
+            _result = true;
+          }
+        }
+        return _result;
+      };
+    }
+  },
+  methods: {
+    handleClose(done) {
+      done();
+    },
+    async openG(appJson, unitIndex, itemTaskIndex, toolIndex) {
+      this.dialogVisible = true;
+      this.appJson = appJson;
+      this.itemTaskIndex = itemTaskIndex;
+      this.toolIndex = toolIndex;
+      this.unitIndex = unitIndex;
+      const { data } = await this.ajax.get(this.$store.state.api + 'select_oidArea', { oid: this.oid });
+      this.region = data[0][0].area;
+      this.getAppStoreControl().then(_ => {
+        this.getData();
+        this.getTypeList();
+      });
+    },
+    checkAppJson(){
+      if(!Object.keys(this.appJson).length){
+        this.$message({ type: 'warning', message: '请先选择应用!' });
+        return
+      }
+      this.$parent.unitJson[this.unitIndex].chapterInfo[0].taskJson[this.itemTaskIndex].toolChoose[this.toolIndex].appJson = this.appJson
+      if (
+        this.$parent.unitJson[this.unitIndex].chapterInfo[0].taskJson[this.itemTaskIndex] .toolChoose[this.toolIndex].tool != 72
+      ) {
+        this.$parent.addTools(72, this.itemTaskIndex, this.toolIndex);
+      }
+      this.dialogVisible = false
+      this.$message.success("添加成功")
+    },
+    changeType(newIndex) {
+      let flag = this.showType === newIndex;
+      this.showType = newIndex;
+      if (!flag) {
+        this.getData();
+      }
+    },
+    changeSelectType() {
+      this.getData();
+    },
+    resetData() {
+      this.searchText = "";
+      this.selectJuri = 3;
+      this.showType = "";
+      this.getData();
+    },
+    async openApp(item) {
+      window.open(item.url, "_blank");
+    },
+    checkApp(item) {
+      if(this.appJson.id == item.id){
+        this.appJson = {}
+      }else {
+        this.appJson = item
+      }
+    },
+    getTypeList() {
+      let params = {
+        suserid: this.userId, //用户ID
+        sorg: this.org,
+        soid: this.oid,
+        sstand: this.region ? this.region : "cn",
+        exportType:
+          this.controlsObj &&
+          this.controlsObj.exportTypeList &&
+          this.controlsObj.exportTypeList.length > 0
+            ? this.controlsObj.exportTypeList.join(",")
+            : ""
+      };
+
+      this.ajax
+        .get(this.$store.state.api + "select_appStoreType_exceptType", params)
+        .then(res => {
+          let data = res.data[0];
+          if (data.length > 0) {
+            // data.forEach(i => {
+            //   if (i.open == undefined) {
+            //     i.open = true;
+            //   }
+            // });
+            this.typeList = data;
+          }
+        })
+        .catch(err => {
+          console.log(err);
+          this.$message.error("获取应用类型失败");
+        });
+    },
+    getData() {
+      this.getDataLoading = true;
+      let params = {
+        uid: this.userId, //用户ID
+        name: this.searchText, //应用名称搜索
+        label: this.selectLabel, //应用的标签搜索
+        type: this.showType, //应用的类型
+        juri: this.selectJuri, //应用权限 1:我的  2:组织内  3:所有人
+        stand: this.region ? this.region : "cn", //cn站还是hk站
+        status: this.statusType,
+        exportType:
+          this.controlsObj &&
+          this.controlsObj.exportTypeList &&
+          this.controlsObj.exportTypeList.length > 0
+            ? this.controlsObj.exportTypeList.join(",")
+            : ""
+      };
+
+      this.ajax
+        .get(this.$store.state.api + "select_appStore_exportType", 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("获取应用失败");
+        });
+    },
+    async getAppStoreControl() {
+      return new Promise(resolve => {
+        let params = {
+          uid: this.userId,
+          org: this.org,
+          oid: this.oid
+        };
+
+        let controlsObj = {
+          logoUrl: "",
+          bannerUrl:
+            "https://ccrb.s3.cn-northwest-1.amazonaws.com.cn/default%2FFrame+30141733970358224.svg",
+          exportTypeList: []
+        };
+        this.ajax
+          .get(this.$store.state.api + "select_appStore_controls", params)
+          .then(res => {
+            let _data = res.data[0];
+            if (_data[0]) {
+              console.log(_data[0]);
+              controlsObj = JSON.parse(_data[0].json);
+            }
+            this.controlsObj = controlsObj;
+            resolve();
+          })
+          .catch(err => {
+            console.log(err);
+            this.controlsObj = controlsObj;
+            resolve();
+          });
+      });
+    },
+    praiseFn(item, type = 0) {
+      //点赞
+      if (type === 0) {
+        //点赞
+        let params = [
+          {
+            uid: this.userId,
+            type: 2,
+            aid: item.id,
+            json: ""
+          }
+        ];
+        this.ajax
+          .post(this.$store.state.api + "insert_appStoreSave", params)
+          .then(res => {
+            if (res.data) {
+              let _likeId = res.data[0][0].id;
+              this.dataList.find(i => i.id === item.id).likeCount += 1;
+              this.dataList.find(i => i.id === item.id).likeId = _likeId;
+              this.$message.success("点赞成功");
+            }
+          })
+          .catch(e => {
+            this.$message.error("点赞失败");
+          });
+      } else if (type === 1) {
+        //取消点赞
+        console.log("取消点赞👉:", item);
+        let params = [
+          {
+            sid: item.likeId
+          }
+        ];
+        this.ajax
+          .post(this.$store.state.api + "delete_appStoreSave", params)
+          .then(res => {
+            if (res.data) {
+              this.dataList.find(i => i.id === item.id).likeCount -= 1;
+              this.dataList.find(i => i.id === item.id).likeId = "";
+              this.$message.success("取消点赞成功");
+            }
+          })
+          .catch(e => {
+            console.log(e);
+            this.$message.error("取消点赞失败");
+          });
+      }
+    },
+    collectFn(item, type = 0) {
+      //收藏
+      if (type === 0) {
+        //收藏
+        console.log("收藏👉:", item);
+        let params = [
+          {
+            uid: this.userId,
+            type: 0,
+            aid: item.id,
+            json: ""
+          }
+        ];
+        this.ajax
+          .post(this.$store.state.api + "insert_appStoreSave", params)
+          .then(res => {
+            if (res.data) {
+              let _colletId = res.data[0][0].id;
+              this.dataList.find(i => i.id === item.id).collectCount += 1;
+              this.dataList.find(i => i.id === item.id).collectId = _colletId;
+              this.$message.success("收藏成功");
+            }
+            this.getData();
+          })
+          .catch(e => {
+            console.log(e);
+            this.getData();
+            this.$message.error("收藏失败");
+          });
+      } else if (type === 1) {
+        //取消收藏
+        console.log("取消收藏👉:", item);
+        let params = [
+          {
+            sid: item.collectId
+          }
+        ];
+        this.ajax
+          .post(this.$store.state.api + "delete_appStoreSave", params)
+          .then(res => {
+            if (res.data) {
+              this.dataList.find(i => i.id === item.id).collectCount -= 1;
+              this.dataList.find(i => i.id === item.id).collectId = "";
+              this.$message.success("取消收藏成功");
+            }
+            this.getData();
+          })
+          .catch(e => {
+            console.log(e);
+            this.$message.error("取消收藏失败");
+            this.getData();
+          });
+      }
+    }
+  }
+};
+</script>
+
+<style scoped>
+.el-dialogClass >>> .el-dialog {
+  margin: 10px auto 0 !important;
+  height: calc(100% - 20px);
+}
+
+.el-dialogClass >>> .el-dialog__body {
+  height: calc(100% - 70px - 55px);
+  overflow-y: auto;
+  overflow-x: hidden;
+  box-sizing: border-box;
+  padding: 20px;
+}
+
+.dialog_diy >>> .el-dialog__header {
+  background: #3c3c3c !important;
+  padding: 15px 20px;
+}
+
+.dialog_diy >>> .el-dialog__title {
+  color: #fff;
+}
+
+.dialog_diy >>> .el-dialog__headerbtn {
+  top: 19px;
+}
+
+.dialog_diy >>> .el-dialog__headerbtn .el-dialog__close {
+  color: #fff;
+}
+
+.dialog_diy >>> .el-dialog__headerbtn .el-dialog__close:hover {
+  color: #fff;
+}
+
+.ac_right {
+  flex: 1;
+  min-width: 800px;
+  height: 100%;
+  overflow: auto;
+  display: flex;
+  padding-right: 10px;
+  padding-top: 10px;
+  box-sizing: border-box;
+  flex-direction: column;
+}
+
+.ac_header {
+  width: 100%;
+  height: auto;
+  border-radius: 5px;
+  /* box-shadow: 0 0 10px 0 rgba(0, 0, 0, 0.1); */
+  background-color: none;
+}
+
+.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;
+  justify-content: center;
+}
+
+.ac_h_top > span {
+  font-size: 22px;
+  position: relative;
+  margin-right: 25px;
+  cursor: pointer;
+  display: flex;
+  align-items: center;
+}
+
+.ac_h_top > span > svg {
+  width: 22px;
+  height: 22px;
+  fill: #1a1a1a;
+  margin-right: 10px;
+}
+
+.ac_h_t_active {
+  color: #0354d7;
+}
+
+.ac_h_t_active > svg {
+  fill: #0354d7 !important;
+}
+
+/* .ac_h_t_active::after {
+  content: "";
+  position: absolute;
+  width: 100%;
+  height: 3px;
+  border-radius: 4px;
+  background-color: #409eff;
+  left: 0;
+  bottom: -5px;
+} */
+
+.ac_h_banner {
+  width: 100%;
+  height: clamp(100px, 25vh, 350px);
+  /* height: 400px; */
+  border-radius: 5px;
+  overflow: hidden;
+  box-sizing: border-box;
+  padding: 10px;
+}
+
+.ac_h_banner > img {
+  width: 100%;
+  height: 100%;
+  object-fit: cover;
+  border-radius: 5px;
+}
+
+.ac_h_bottom {
+  width: 100%;
+  height: auto;
+  padding: 10px 15px 10px 15px;
+  box-sizing: border-box;
+  display: flex;
+  flex-direction: column;
+  border-bottom: solid 1px #e7e7e7;
+}
+
+.ac_h_b_typeList {
+  width: 100%;
+  height: auto;
+  display: flex;
+  flex-wrap: wrap;
+  box-sizing: border-box;
+}
+
+.ac_h_b_typeList > span {
+  font-size: 16px;
+  margin-right: 30px;
+  margin-top: 10px;
+  margin-bottom: 5px;
+  cursor: pointer;
+}
+
+.ac_h_b_typeList_active {
+  color: #007aff;
+  position: relative;
+}
+
+/*.ac_h_b_typeList_active::after {
+  content: "";
+  width: 80%;
+  height: 5px;
+  background-color: #007aff;
+  border-radius: 4px;
+  position: absolute;
+  top: 110%;·
+  left: 10%;
+}*/
+
+.ac_h_b_selectList {
+  /* margin-left: 15px; */
+  margin-bottom: 10px;
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+}
+/*
+@media screen and (max-width: 1200px) {
+  .ac_h_bottom{
+    flex-direction: column;
+  }
+
+  .ac_h_b_typeList{
+    width: 100%;
+    margin-bottom: 20px;
+  }
+
+  .ac_h_b_selectList{
+    width: 100%;
+    display: flex;
+    justify-content: flex-end;
+  }
+} */
+
+.ac_content {
+  width: 100%;
+  height: auto;
+  margin-top: 10px;
+  padding-bottom: 10px;
+}
+
+.ac_c_typeCard {
+  width: 100%;
+  height: auto;
+}
+
+.ac_c_item {
+  width: calc(100% / 4 - (15px * 4) / 4);
+  height: 260px;
+  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;
+  border: solid 1px #e7e7e7;
+  transition: 0.2s;
+
+  /* cursor: pointer; */
+}
+
+.ac_c_item:hover {
+  box-shadow: 0px 8px 10px -5px #00000014;
+
+  box-shadow: 0px 16px 24px 2px #0000000a;
+
+  box-shadow: 0px 6px 30px 5px #0000000d;
+}
+
+@media screen and (min-width: 1400px) {
+  .ac_c_item {
+    width: calc(100% / 4 - (15px * 3) / 4) !important;
+  }
+  .ac_c_item:nth-child(4n) {
+    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;
+  color: #a1a1a1;
+  /* align-items: center; */
+}
+
+.ac_c_i_top {
+  width: 100%;
+  display: flex;
+  height: calc(100% - 40px - 10px);
+  cursor: pointer;
+}
+
+.ac_c_i_t_left {
+  width: 80px;
+  min-width: 80px;
+  height: 80px;
+  box-sizing: border-box;
+  display: flex;
+  align-items: flex-start;
+  box-sizing: border-box;
+  /* padding: 10px; */
+  margin-right: 10px;
+}
+
+.ac_c_i_t_left > svg {
+  width: 100%;
+  height: 80px;
+  border: 1px solid #e7e7e7;
+  border-radius: 4px;
+  box-sizing: border-box;
+}
+
+.ac_c_i_t_left > img {
+  width: 100%;
+  object-fit: cover;
+  height: 80px;
+  border: 1px solid #e7e7e7;
+  border-radius: 4px;
+  box-sizing: border-box;
+}
+
+.ac_c_i_t_right {
+  flex: 1;
+  width: calc(100% - 100px - 10px);
+  height: 100%;
+  display: flex;
+  flex-direction: column;
+}
+
+.ac_c_i_t_right > div {
+  width: 100%;
+}
+
+.ac_c_i_t_r_top {
+  height: 40px;
+  display: flex;
+  align-items: flex-end;
+  justify-content: space-between;
+  position: relative;
+  font-weight: bold;
+  box-sizing: border-box;
+  padding-bottom: 2px;
+}
+
+.ac_c_i_t_r_top > span {
+  display: block;
+  max-width: 100%;
+  white-space: nowrap;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  font-size: 18px;
+}
+
+.ac_c_i_t_popover {
+  width: 30px;
+  height: 30px;
+  /* position: absolute; */
+  /* right: 0;
+  top: 0; */
+  z-index: 3;
+}
+
+.ac_c_i_t_popover svg {
+  width: 30px;
+  height: 30px;
+  box-sizing: border-box;
+  padding: 2.5px;
+  /* transform: rotate(90deg); */
+  cursor: pointer;
+  transition: 0.3s;
+  border-radius: 4px;
+}
+
+.ac_c_i_t_p_box {
+  position: absolute;
+  height: auto;
+  top: 100%;
+  right: 0;
+  padding: 8px;
+  border-radius: 8px 8px 8px 8px;
+  background-color: #fff;
+  /* box-shadow: 0 0 10px 0 rgba(0, 0, 0, 0.1); */
+  width: auto;
+  border: 1px solid #e7e7e7;
+}
+
+.ac_c_i_t_p_box > div {
+  width: 80px;
+  height: 30px;
+  cursor: pointer;
+  transition: 0.3s;
+  font-size: 0.7em;
+  border-radius: 5px;
+  font-weight: 100;
+  display: flex;
+  justify-content: center;
+  align-items: center;
+  position: relative;
+  box-sizing: border-box;
+}
+
+.ac_c_i_t_p_box > div > img {
+  width: 18px;
+  height: 18px;
+  margin-right: 10px;
+}
+
+.ac_c_i_t_p_box > div:hover {
+  background-color: #f2f4f7;
+}
+
+.ac_c_i_t_r_center {
+  height: 30px;
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  margin: 10px 0;
+}
+
+.ac_c_i_t_r_center > span {
+  display: block;
+  max-width: calc(100% - 80px);
+  white-space: nowrap;
+  overflow: hidden;
+  font-size: 14px;
+  color: #00000066;
+  text-overflow: ellipsis;
+}
+
+.ac_c_i_t_r_center > div {
+  width: 75px;
+  height: 85%;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  font-size: 14px;
+  background-color: #f3f3f3;
+  color: #00000066;
+  border-radius: 3px;
+}
+
+.ac_c_i_t_r_center > div > img {
+  width: 16px;
+  height: 16px;
+  margin-right: 4px;
+}
+
+.ac_c_i_t_r_bottom {
+  max-width: 100%;
+  max-height: calc(100% - 30px - 40px - 20px - 10px + 5px);
+  margin-top: 5px;
+  margin-bottom: 10px;
+  font-size: 16px;
+  color: #00000099;
+  display: -webkit-box;
+  -webkit-box-orient: vertical;
+  -webkit-line-clamp: 4;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  font-size: 14px;
+}
+
+.ac_c_i_bottom {
+  width: 100%;
+  height: 60px;
+  box-sizing: border-box;
+  border-top: solid 1px #e7e7e7;
+  display: flex;
+  align-items: center;
+  justify-content: space-between;
+  cursor: pointer;
+}
+
+.ac_c_i_b_left {
+  width: calc(100% - 60px);
+  display: flex;
+  align-items: center;
+  /* justify-content: space-between; */
+  overflow: auto;
+  height: 100%;
+}
+
+.ac_c_i_b_left > div {
+  margin-right: 20px;
+  display: flex;
+  align-items: center;
+}
+
+.ac_c_i_b_left > div > img {
+  width: 22px;
+  height: 22px;
+}
+
+.ac_c_i_b_left > div > span {
+  margin-left: 5px;
+  color: #00000099;
+  cursor: default;
+}
+
+.ac_c_i_b_right {
+  display: flex;
+  align-items: center;
+  width: 70px;
+  height: 70%;
+  justify-content: flex-end;
+}
+
+.ac_c_i_b_right > span {
+  width: 60px;
+  height: 80%;
+  border-radius: 4px;
+  display: flex;
+  justify-content: center;
+  align-items: center;
+  font-size: 14px;
+}
+
+.ac_c_i_b_r_type1 {
+  background-color: #17c469;
+  color: #fff;
+}
+
+.ac_c_i_b_r_type2 {
+  background-color: #ffcf33;
+  color: #000;
+}
+
+.ac_c_i_b_r_type3 {
+  background-color: #0061ff;
+  color: #fff;
+}
+
+.searchInputIcon {
+  width: 20px;
+  height: 20px;
+  position: relative;
+  top: 10px;
+  right: 5px;
+  font-size: 19px;
+  cursor: pointer;
+}
+
+.ac_c_tc_item {
+  width: 100%;
+  height: auto;
+}
+
+.ac_c_tc_i_top {
+  width: 100%;
+  height: 40px;
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  margin-bottom: 20px;
+  box-sizing: border-box;
+  padding: 0 20px;
+  /* background-color: red; */
+}
+
+.ac_c_tc_i_top > div {
+  font-size: 26px;
+}
+
+.ac_c_tc_i_top > span {
+  display: flex;
+  align-items: center;
+  color: #a2a2a2;
+  font-size: 16px;
+  cursor: pointer;
+}
+
+.ac_c_tc_i_top > span > img {
+  width: 18px;
+  height: 18px;
+  margin-left: 5px;
+  /*transform: rotate(90deg);*/
+  transition: 0.3s;
+}
+
+.checkActive{
+  border: 4px solid #0077ff
+}
+</style>

+ 68 - 0
src/components/pages/components/dialog.vue

@@ -0,0 +1,68 @@
+<template>
+  <el-dialog
+    title="关联文件"
+    :visible.sync="dialogVisible"
+    width="calc(100% - 20px)"
+    class="el-dialogClass dialog_diy"
+    :before-close="handleClose"
+  >
+    <span></span>
+    <span slot="footer">
+      <el-button @click="dialogVisible = false">关 闭</el-button>
+    </span>
+  </el-dialog>
+</template>
+
+<script>
+export default {
+  data() {
+    return {
+      dialogVisible: false
+    };
+  },
+  methods: {
+    handleClose(done) {
+      done();
+    },
+    openG() {
+      this.dialogVisible = true;
+    }
+  }
+};
+</script>
+
+<style scoped>
+.el-dialogClass >>> .el-dialog {
+  margin: 10px auto 0 !important;
+  height: calc(100% - 20px);
+}
+
+.el-dialogClass >>> .el-dialog__body {
+  height: calc(100% - 70px - 55px);
+  overflow-y: auto;
+  overflow-x: hidden;
+  box-sizing: border-box;
+  padding: 20px;
+}
+
+.dialog_diy >>> .el-dialog__header {
+  background: #3c3c3c !important;
+  padding: 15px 20px;
+}
+
+.dialog_diy >>> .el-dialog__title {
+  color: #fff;
+}
+
+.dialog_diy >>> .el-dialog__headerbtn {
+  top: 19px;
+}
+
+.dialog_diy >>> .el-dialog__headerbtn .el-dialog__close {
+  color: #fff;
+}
+
+.dialog_diy >>> .el-dialog__headerbtn .el-dialog__close:hover {
+  color: #fff;
+}
+</style>

+ 51 - 2
src/components/pages/easy/addCourse.vue

@@ -737,6 +737,25 @@
                                     </div>
                                   </div>
                                 </div> -->
+                                 <div class="tool" :class="{
+                                      isToolChoose:
+                                        itemTool.tool.indexOf(72) != -1,
+                                    }" @click="
+                                      addTools(72, itemTaskIndex, toolIndex)
+                                      ">
+                                      <div class="whiteBIcon" @click.stop="
+                                        openTools(itemTaskIndex, 72, toolIndex)
+                                        ">
+                                        <img src="../../../assets/icon/firstToolList/appStore.png" alt />
+                                        <div style="margin: 5px 0">应用中心</div>
+                                      </div>
+                                      <div class="noCTool">
+                                        <img src="../../../assets/icon/new/isToolC.png" alt="" />
+                                      </div>
+                                      <div class="isCTool" v-if="itemTool.tool.indexOf(72) != -1">
+                                        <img src="../../../assets/icon/new/isToolC.png" alt="" />
+                                      </div>
+                                  </div>
                               </div>
                               <div class="toolSort" v-if="itemTool.toolType == 1">
                                 <div class="tool" :class="{ isToolChoose: itemTool.tool.indexOf(7) != -1 }"
@@ -4640,6 +4659,7 @@
     </el-dialog>
     <interVideo :dialogVisibleVideo.sync="dialogVisibleVideo" :videoJson="videoJson" @add="addVideoJson"></interVideo>
     <EnglishVoice :oid='oid' :org="org" :EnglishVoiceDialog.sync="EnglishVoiceDialog" :englishVoiceJson="englishVoiceJson" @setEnglishVoiceJson="setEnglishVoiceJson"></EnglishVoice>
+    <appDialog ref="appDialog"></appDialog>
   </div>
 </template>
 
@@ -4658,6 +4678,8 @@ import sourceDialog from "../teacherSource/dialog.vue";
 import interVideo from "../interVideo/index.vue";
 import englishRight from "./commpont/englishRight.vue";
 import EnglishVoice from '../EnglishVoice/index.vue'
+import appDialog from '../components/appDialog.vue'
+
 var OpenCC = require("opencc-js");
 let converter = OpenCC.Converter({
 		from:'hk',
@@ -4675,7 +4697,8 @@ export default {
     sourceDialog,
     interVideo,
     englishRight,
-    EnglishVoice
+    EnglishVoice,
+    appDialog
   },
   data() {
     return {
@@ -4907,7 +4930,7 @@ export default {
       isdrag: '',
       EnglishVoiceDialog: false,
       englishVoiceJson:{},
-      optionTypeList:['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z']
+      optionTypeList:['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'],
     };
   },
   directives: {
@@ -7788,6 +7811,22 @@ export default {
            };
         this.$forceUpdate();
         this.EnglishVoiceDialog = true;
+      }else if(i == 72){
+        let appJson = this.unitJson[this.unitIndex].chapterInfo[0].taskJson[
+          itemTaskIndex
+        ].toolChoose[toolIndex].appJson
+          ? JSON.parse(
+            JSON.stringify(
+              this.unitJson[this.unitIndex].chapterInfo[0].taskJson[
+                itemTaskIndex
+              ].toolChoose[toolIndex].appJson
+            )
+          )
+          : { 
+            url:'',
+           };
+        this.$forceUpdate();
+        this.$refs.appDialog.openG(appJson,this.unitIndex,itemTaskIndex,toolIndex);
       }
     },
     setEnglishVoiceJson(val){
@@ -7930,6 +7969,16 @@ export default {
           return;
         }
       }
+      if(i == 72){
+        if (
+          !this.unitJson[this.unitIndex].chapterInfo[0].taskJson[itemTaskIndex]
+            .toolChoose[toolIndex].appJson || Object.keys(this.unitJson[this.unitIndex].chapterInfo[0].taskJson[itemTaskIndex]
+            .toolChoose[toolIndex].appJson).length == 0
+        ) {
+          this.openTools(itemTaskIndex, 72, toolIndex);
+          return;
+        }
+      }
       // if (i == 48) {
       //   if (
       //     !this.unitJson[this.unitIndex].chapterInfo[0].taskJson[itemTaskIndex]

+ 70 - 21
src/components/pages/newCourse/addCourse.vue

@@ -2319,29 +2319,48 @@
                                     </div> -->
                                   </div>
                                   <!-- <div class="tool">
-                              <div class="whiteBIcon" @click="openTools(itemTaskIndex, 49, toolIndex)">
-                                <img src="../../../assets/icon/fourthToolList/group.png" alt />
-                                <div style="margin: 5px 0">学生分组</div>
-                              </div>
-                              <div class="check" @click="addTools(49, itemTaskIndex, toolIndex)">
-                                <img src="../../../assets/icon/checkNo.png" alt v-if="itemTool.tool.indexOf(49) == -1" />
-                                <div class="checkDiv" v-else>
-                                  <img src="../../../assets/icon/checkedIs.png" alt /><span>已选择</span>
-                                </div>
-                              </div>
-                            </div> -->
-                                  <!-- <div class="tool">
-                                  <div class="whiteBIcon" @click="openTools(itemTaskIndex, 62, toolIndex)">
-                                    <img src="../../../assets/icon/fourthToolList/interVideo.png" alt />
-                                    <div style="margin: 5px 0">交互视频</div>
-                                  </div>
-                                  <div class="check" @click="addTools(62, itemTaskIndex, toolIndex)">
-                                    <img src="../../../assets/icon/checkNo.png" alt v-if="itemTool.tool.indexOf(62) == -1" />
-                                    <div class="checkDiv" v-else>
-                                      <img src="../../../assets/icon/checkedIs.png" alt /><span>已选择</span>
+                                    <div class="whiteBIcon" @click="openTools(itemTaskIndex, 49, toolIndex)">
+                                      <img src="../../../assets/icon/fourthToolList/group.png" alt />
+                                      <div style="margin: 5px 0">学生分组</div>
+                                    </div>
+                                    <div class="check" @click="addTools(49, itemTaskIndex, toolIndex)">
+                                      <img src="../../../assets/icon/checkNo.png" alt v-if="itemTool.tool.indexOf(49) == -1" />
+                                      <div class="checkDiv" v-else>
+                                        <img src="../../../assets/icon/checkedIs.png" alt /><span>已选择</span>
+                                      </div>
+                                    </div>
+                                  </div> -->
+                                        <!-- <div class="tool">
+                                        <div class="whiteBIcon" @click="openTools(itemTaskIndex, 62, toolIndex)">
+                                          <img src="../../../assets/icon/fourthToolList/interVideo.png" alt />
+                                          <div style="margin: 5px 0">交互视频</div>
+                                        </div>
+                                        <div class="check" @click="addTools(62, itemTaskIndex, toolIndex)">
+                                          <img src="../../../assets/icon/checkNo.png" alt v-if="itemTool.tool.indexOf(62) == -1" />
+                                          <div class="checkDiv" v-else>
+                                            <img src="../../../assets/icon/checkedIs.png" alt /><span>已选择</span>
+                                          </div>
+                                        </div>
+                                      </div> -->
+                                  <div class="tool" :class="{
+                                    isToolChoose:
+                                      itemTool.tool.indexOf(72) != -1,
+                                  }" @click="
+                                    addTools(72, itemTaskIndex, toolIndex)
+                                    ">
+                                    <div class="whiteBIcon" @click.stop="
+                                      openTools(itemTaskIndex, 72, toolIndex)
+                                      ">
+                                      <img src="../../../assets/icon/firstToolList/appStore.png" alt />
+                                      <div style="margin: 5px 0">应用中心</div>
+                                    </div>
+                                    <div class="noCTool">
+                                      <img src="../../../assets/icon/new/isToolC.png" alt="" />
+                                    </div>
+                                    <div class="isCTool" v-if="itemTool.tool.indexOf(72) != -1">
+                                      <img src="../../../assets/icon/new/isToolC.png" alt="" />
                                     </div>
                                   </div>
-                                </div> -->
                                 </div>
                                 <div
                                   class="toolSort"
@@ -7355,6 +7374,7 @@
       :englishVoiceJson="englishVoiceJson"
       @setEnglishVoiceJson="setEnglishVoiceJson"
     ></EnglishVoice>
+    <appDialog ref="appDialog"></appDialog>
   </div>
 </template>
 
@@ -7375,6 +7395,8 @@ import interVideo from "../interVideo/index.vue";
 import englishRight from "../components/englishRight.vue";
 import evaBox from "../evaBox/index.vue";
 import EnglishVoice from "../EnglishVoice/index.vue";
+import appDialog from '../components/appDialog.vue'
+
 var OpenCC = require("opencc-js");
 let converter = OpenCC.Converter({
 		from:'hk',
@@ -7394,6 +7416,7 @@ export default {
     englishRight,
     evaBox,
     EnglishVoice,
+    appDialog,
   },
   data() {
     return {
@@ -11465,6 +11488,22 @@ export default {
           //   };
         this.$forceUpdate();
         this.EnglishVoiceDialog = true;
+      }else if(i == 72){
+        let appJson = this.unitJson[this.unitIndex].chapterInfo[0].taskJson[
+          itemTaskIndex
+        ].toolChoose[toolIndex].appJson
+          ? JSON.parse(
+            JSON.stringify(
+              this.unitJson[this.unitIndex].chapterInfo[0].taskJson[
+                itemTaskIndex
+              ].toolChoose[toolIndex].appJson
+            )
+          )
+          : { 
+            url:'',
+           };
+        this.$forceUpdate();
+        this.$refs.appDialog.openG(appJson,this.unitIndex,itemTaskIndex,toolIndex);
       }
     },
     setEnglishVoiceJson(val) {
@@ -11611,6 +11650,16 @@ export default {
           return;
         }
       }
+      if(i == 72){
+        if (
+          !this.unitJson[this.unitIndex].chapterInfo[0].taskJson[itemTaskIndex]
+            .toolChoose[toolIndex].appJson || Object.keys(this.unitJson[this.unitIndex].chapterInfo[0].taskJson[itemTaskIndex]
+            .toolChoose[toolIndex].appJson).length == 0
+        ) {
+          this.openTools(itemTaskIndex, 72, toolIndex);
+          return;
+        }
+      }
       // if (i == 48) {
       //   if (
       //     !this.unitJson[this.unitIndex].chapterInfo[0].taskJson[itemTaskIndex]