File was renamed from src/views/home.vue |
| | |
| | | <span></span> |
| | | <div class="userInfoBox"> |
| | | <div class="userName" v-if="userInfo.name">{{ userInfo.name }}</div> |
| | | <div><div class="layout hover" @click="layoutBtn">退出</div></div> |
| | | <div v-if="token"><div class="layout hover" @click="layoutBtn">退出</div></div> |
| | | <div v-else><div class="layout hover" @click="goLogin">登录</div></div> |
| | | </div> |
| | | </div> |
| | | <div class="contentBox"> |
| | | <!-- 菜单 --> |
| | | <div class="menuBox"> |
| | | <div v-for="(item, index) in menuData" :key="index" @click="menuItemClick(item.name)"> |
| | | <div :class="['menuItem', activeMenu == item.name ? 'active' : '']" v-if="item.isShow"> |
| | | <div v-for="(item, index) in menuData" :key="index"> |
| | | <div |
| | | :class="['menuItem', activeMenu == item.name ? 'active' : '']" |
| | | @click="menuItemClick(item.name)" |
| | | v-if="item.isShow" |
| | | > |
| | | <div class="menuIcon imgBox"> |
| | | <img :src="item.icon" /> |
| | | </div> |
| | |
| | | <!-- 菜单内容 --> |
| | | <div class="menuContent" v-if="menuState.open"> |
| | | <div class="searchBox"> |
| | | <div class="inputBox" v-if="activeMenu !== '资源'"> |
| | | <div class="inputBox" v-if="activeMenu !== '资源' && activeMenu !== '习题'"> |
| | | <el-input |
| | | class="custom-input" |
| | | placeholder="请输入内容" |
| | | v-model="searchText" |
| | | @keyup.enter="searchBook" |
| | | clearable |
| | | @clear="handleClear" |
| | | > |
| | | <template #prefix> |
| | | <el-icon><Search /></el-icon> |
| | | </template> |
| | | <template #suffix> |
| | | <svg |
| | | @click="searchBook" |
| | | xmlns="http://www.w3.org/2000/svg" |
| | | width="24" |
| | | height="24" |
| | | viewBox="0 0 24 24" |
| | | fill="none" |
| | | stroke="currentColor" |
| | | stroke-width="2" |
| | | stroke-linecap="round" |
| | | stroke-linejoin="round" |
| | | class="icon icon-tabler icons-tabler-outline icon-tabler-list-search hover" |
| | | > |
| | | <path stroke="none" d="M0 0h24v24H0z" fill="none" /> |
| | | <path d="M15 15m-4 0a4 4 0 1 0 8 0a4 4 0 1 0 -8 0" /> |
| | | <path d="M18.5 18.5l2.5 2.5" /> |
| | | <path d="M4 6h16" /> |
| | | <path d="M4 12h4" /> |
| | | <path d="M4 18h4" /> |
| | | </svg> |
| | | <img :src="listSearch" @click="searchBook" class="hover" /> |
| | | </template> |
| | | </el-input> |
| | | </div> |
| | | <div v-else class="resourceTab"> |
| | | <div v-if="activeMenu == '资源'" class="resourceTab"> |
| | | <div class="tabItem hover" @click="selectResourceType('default')"> |
| | | <div>默认资源</div> |
| | | <div :class="resourceType == 'default' ? 'text' : 'line'"></div> |
| | |
| | | <div :class="resourceType == 'teacher' ? 'text' : 'line'"></div> |
| | | </div> |
| | | </div> |
| | | <div v-if="activeMenu == '习题'" class="resourceTab"> |
| | | <div class="tabItem hover" @click="selectExercisesType('exercises')"> |
| | | <div>习题</div> |
| | | <div :class="exercisesType == 'exercises' ? 'text' : 'line'"></div> |
| | | </div> |
| | | <hr class="hr" /> |
| | | <div class="tabItem hover" @click="selectExercisesType('wrong')"> |
| | | <div>错题本</div> |
| | | <div :class="exercisesType == 'wrong' ? 'text' : 'line'"></div> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | <!-- 目录 --> |
| | | <div class="menuList" v-if="activeMenu == '目录'"> |
| | | <div class="menuList" v-if="activeMenu == '目录'" v-loading="listLoading"> |
| | | <el-tree |
| | | ref="catalogTree" |
| | | default-expand-all="true" |
| | | :expand-on-click-node="false" |
| | | highlight-current |
| | | node-key="start" |
| | | highlight-current |
| | | :data="catalogueData" |
| | | :props="defaultProps" |
| | | v-if="catalogueData.length > 0" |
| | |
| | | <span class="pageNum">{{ data.page }}</span> |
| | | </div> |
| | | </template> |
| | | <template #empty> |
| | | <el-empty :image-size="60" description="暂无数据" /> |
| | | </template> |
| | | </el-tree> |
| | | <div v-else> |
| | | <el-empty :image-size="60" description="暂无数据" /> |
| | | <div v-else></div> |
| | | </div> |
| | | <div class="allSearch" v-if="activeMenu == '检索'"> |
| | | <div class="list-box" v-loading="listLoading"> |
| | | <div v-if="allSearchReault.length > 0" class="allSearchList"> |
| | | <div v-for="(reault, index) in allSearchReault" :key="index"> |
| | | <div class="chapterName"> |
| | | <el-icon |
| | | @click="searchClose(index)" |
| | | v-if="searchReaultData.isShow && searchReaultData.openIndex == index" |
| | | class="hover" |
| | | ><ArrowDown |
| | | /></el-icon> |
| | | <el-icon @click="searchOpen(index)" v-else class="hover"><ArrowRight /></el-icon> |
| | | <span>{{ reault.chapterName }} ({{ reault.itemList.length }})</span> |
| | | </div> |
| | | <div |
| | | v-for="(item, index1) in reault.itemList" |
| | | :key="index1" |
| | | class="searchItem" |
| | | v-show="searchReaultData.isShow && searchReaultData.openIndex == index" |
| | | > |
| | | <div class="index">{{ index1 + 1 }}.</div> |
| | | <div |
| | | class="searchCon hover" |
| | | @click="goSearchContent(item)" |
| | | v-html="item.txt1" |
| | | :title="item.txt" |
| | | ></div> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | <div v-else> |
| | | <el-empty :image-size="60" description="暂无数据" /> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | <!-- 笔记 --> |
| | |
| | | ></div> |
| | | </div> |
| | | </div> |
| | | <div class="list-box"> |
| | | <div class="list-box" v-loading="listLoading"> |
| | | <div v-if="scribeData.noteList.length > 0"> |
| | | <div v-for="(noteItem, index) in scribeData.noteList" :key="noteItem"> |
| | | <div class="chapterName"> |
| | |
| | | </div> |
| | | </div> |
| | | <!-- 资源 --> |
| | | <div class="" v-if="activeMenu == '资源'"> |
| | | <div class="resourceBox" v-if="classifySelectList.length > 0"> |
| | | <div class="resourceBox" v-if="activeMenu == '资源'" v-loading="listLoading"> |
| | | <div class="resourceSearchBox" v-if="classifySelectList.length > 0"> |
| | | <div class="classification"> |
| | | <div |
| | | v-for="item in classifySelectList" |
| | |
| | | placeholder="请输入内容" |
| | | v-model="searchText" |
| | | @keyup.enter="searchBook" |
| | | clearable |
| | | @clear="handleClear" |
| | | > |
| | | <template #prefix> |
| | | <el-icon><Search /></el-icon> |
| | | </template> |
| | | <template #suffix> |
| | | <svg |
| | | @click="searchBook" |
| | | xmlns="http://www.w3.org/2000/svg" |
| | | width="20" |
| | | height="20" |
| | | viewBox="0 0 20 20" |
| | | fill="none" |
| | | stroke="currentColor" |
| | | stroke-width="2" |
| | | stroke-linecap="round" |
| | | stroke-linejoin="round" |
| | | class="icon icon-tabler icons-tabler-outline icon-tabler-list-search hover" |
| | | > |
| | | <path stroke="none" d="M0 0h24v24H0z" fill="none" /> |
| | | <path d="M15 15m-4 0a4 4 0 1 0 8 0a4 4 0 1 0 -8 0" /> |
| | | <path d="M18.5 18.5l2.5 2.5" /> |
| | | <path d="M4 6h16" /> |
| | | <path d="M4 12h4" /> |
| | | <path d="M4 18h4" /> |
| | | </svg> |
| | | <img :src="listSearch" @click="searchBook" class="hover" /> |
| | | </template> |
| | | </el-input> |
| | | </div> |
| | |
| | | @mouseover="showHandle = index" |
| | | @mouseleave="showHandle = null" |
| | | > |
| | | <img :src="item.icon" mode="" v-if="item.icon" /> |
| | | <el-icon v-else-if="activeClassify == 'image'" size="30"><Picture /></el-icon> |
| | | <img :src="item.resourcePath" mode="" v-if="activeClassify == 'image'" /> |
| | | <img |
| | | :src="item.icon" |
| | | mode="" |
| | | v-else-if="item.icon && activeClassify != 'image'" |
| | | /> |
| | | <!-- <el-icon v-else-if="activeClassify == 'image'" size="30"></el-icon> --> |
| | | <el-icon v-else-if="activeClassify == 'audio'" size="30"><Headset /></el-icon> |
| | | <el-icon v-else-if="activeClassify == 'video'" size="30" |
| | | ><VideoCamera |
| | |
| | | ><VideoPlay |
| | | /></el-icon> |
| | | <el-icon |
| | | @click="goPlay(item)" |
| | | @click="goPlay(item, index)" |
| | | size="20" |
| | | class="icon hover" |
| | | v-if="item.resourceType == '音频'" |
| | | ><Headset |
| | | v-if="item.resourceType == '音频' && playIndex != index" |
| | | ><VideoPlay |
| | | /></el-icon> |
| | | <el-icon |
| | | @click="goPause()" |
| | | size="20" |
| | | class="icon hover" |
| | | v-if="item.resourceType == '音频' && playIndex == index" |
| | | ><VideoPause |
| | | /></el-icon> |
| | | <el-icon |
| | | @click="getCapture(item, index)" |
| | |
| | | item.resourceType == '音频' || |
| | | item.resourceType == '习题' || |
| | | item.resourceType == '图片' |
| | | ) |
| | | ) && item.isDownload == '是' |
| | | " |
| | | ><Download |
| | | /></el-icon> |
| | |
| | | </div> |
| | | </div> |
| | | <!-- 截图 --> |
| | | <div class="" v-if="activeMenu == '截图'"> |
| | | <div class="list-box"> |
| | | <div class="screenshotList" v-if="activeMenu == '截图'"> |
| | | <div class="list-box" v-loading="listLoading"> |
| | | <div class="screenshot" v-if="screenshotList.length > 0"> |
| | | <div v-for="(item, index) in screenshotList" :key="item" class="captureItem"> |
| | | <div class="imgBox" @mouseover="showDelete = index" @mouseleave="showDelete = null"> |
| | |
| | | </div> |
| | | </div> |
| | | </div> |
| | | <!-- 标签 --> |
| | | <div class="" v-if="activeMenu == '书签'"> |
| | | <div class="list-box"> |
| | | <!-- 书签 --> |
| | | <div class="reMarkList" v-if="activeMenu == '书签'"> |
| | | <div class="list-box" v-loading="listLoading"> |
| | | <div v-if="reMarkList.length > 0"> |
| | | <div v-for="(item, index) in reMarkList" :key="index" class="reMarkItem"> |
| | | <div class="reMarkCon">{{ item.chapterName }} P{{ item.page }}</div> |
| | | <div class="reMarkCon hover" @click="goReMark(item)"> |
| | | <span class="con">{{ item.content }}</span> <span>P{{ item.page }}</span> |
| | | </div> |
| | | <div class="deleteReMarkImg"> |
| | | <img :src="shanchu" class="icon hover" @click="deleteReMark(item)" /> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | <div v-else> |
| | | <el-empty :image-size="60" description="暂无数据" /> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | <div class="questionList" v-if="activeMenu == '习题'"> |
| | | <div class="resourceSearchBox"> |
| | | <div class="inputBox"> |
| | | <el-input |
| | | class="custom-input" |
| | | placeholder="请输入内容" |
| | | v-model="searchText" |
| | | @keyup.enter="searchBook" |
| | | clearable |
| | | @clear="handleClear" |
| | | > |
| | | <template #prefix> |
| | | <img :src="listSearch" @click="searchBook" class="hover" /> |
| | | </template> |
| | | </el-input> |
| | | </div> |
| | | </div> |
| | | <div class="list-box" v-loading="listLoading"> |
| | | <div v-if="questionList.length > 0"> |
| | | <div v-for="(item, index) in questionList" :key="index" class="reMarkItem"> |
| | | <div |
| | | class="questionCon hover" |
| | | @click="JumpPosition(item)" |
| | | :title="item.resourceName" |
| | | > |
| | | {{ item.resourceName }} |
| | | </div> |
| | | </div> |
| | | </div> |
| | |
| | | </div> |
| | | <div class="rightBox"> |
| | | <div class="pageSizeBox"> |
| | | <div><img :src="zoomOut" @click="changePageSize('reduce')" /></div> |
| | | <div class="hover"><img :src="zoomOut" @click="changePageSize('reduce')" /></div> |
| | | <div>{{ headerData.pageSize }}%</div> |
| | | <div><img :src="zoomIn" @click="changePageSize('add')" /></div> |
| | | <div class="hover"><img :src="zoomIn" @click="changePageSize('add')" /></div> |
| | | </div> |
| | | <!-- <div class="brushImgBox"> |
| | | <div @click="jumpContent('note' + index)"> |
| | |
| | | </div> |
| | | <div class="menuList"> |
| | | <ul class="menu" v-if="teachToolsMenuData.length > 0"> |
| | | <li v-for="item in teachToolsMenuData" :key="item.key"> |
| | | <li v-for="item in teachToolsMenuData" :key="item.key" class="hover"> |
| | | <div |
| | | :class="item.name === activeTool ? 'activeItem hover' : 'menuItem hover'" |
| | | :style="!toolState.open ? 'padding:10px 15px' : ''" |
| | | v-if="item.isShow" |
| | | @click="selectTeachTools(item)" |
| | |
| | | </li> |
| | | </ul> |
| | | </div> |
| | | <div :class="['openBox', toolState.open ? 'right' : '']"> |
| | | <div |
| | | :class="['openBox', toolState.open ? 'right' : '']" |
| | | v-if="teachToolsMenuData.length > 0" |
| | | > |
| | | <!-- <img :src="shouqiR" v-if="toolState.open" @click="toolState.open = false" /> --> |
| | | <!-- <img :src="shouqiL" v-if="!toolState.open" @click="toolState.open = true" /> --> |
| | | <svg |
| | |
| | | :style="`left:${floatingToolData.elLeft}px`" |
| | | v-if="floatingToolBox.length > 0" |
| | | > |
| | | <div |
| | | class="hover" |
| | | v-for="item in floatingToolBox" |
| | | :key="item.name" |
| | | @click="floatItemHandle(item)" |
| | | > |
| | | <div v-for="item in floatingToolBox" :key="item.name" @click="floatItemHandle(item)"> |
| | | <div v-if="item.isShow"> |
| | | <el-popover |
| | | placement="right" |
| | |
| | | </div> |
| | | </template> |
| | | </el-popover> |
| | | <div class="floatToolItem mark" v-if="floatingToolData.activeBookmark == '书签'"> |
| | | <el-tooltip class="box-item" effect="dark" :content="item.name" placement="right"> |
| | | <div class="imgBox"> |
| | | <img :src="tagW" alt="" v-if="floatingToolData.activeBookmark == item.name" /> |
| | | <img :src="item.icon" alt="" v-else /> |
| | | </div> |
| | | </el-tooltip> |
| | | </div> |
| | | <div |
| | | :class=" |
| | | floatingToolData.activeToolData == item.name |
| | | ? 'floatToolActive floatToolItem' |
| | | : 'floatToolItem' |
| | | " |
| | | v-else |
| | | v-else-if=" |
| | | floatingToolData.activeToolData != '书签' && |
| | | floatingToolData.activeToolData != '标记' |
| | | " |
| | | > |
| | | <el-tooltip class="box-item" effect="dark" :content="item.name" placement="right"> |
| | | <div class="imgBox"> |
| | |
| | | </div> |
| | | </div> |
| | | </div> |
| | | <div class="toolSelectBox" v-show="!(toolActive == '高亮' || toolActive == '划线')"> |
| | | <div class="toolSelectBox" v-show="toolActive != '高亮' && toolActive != '划线'"> |
| | | <div v-for="item in dialogToolList" :key="item.icon" @click="dialogToolHandle(item)"> |
| | | <div |
| | | :class="item.name == toolActive ? 'dialogToolItem active' : 'dialogToolItem'" |
| | |
| | | <!-- <el-button @click="delUserKey">删除</el-button> --> |
| | | <div class="dialogToolItem"> |
| | | <el-tooltip class="box-item" effect="dark" content="删除" placement="bottom"> |
| | | <img :src="trash" @click="delUserKey" /> |
| | | <img :src="deleteIcon" @click="delUserKey" /> |
| | | </el-tooltip> |
| | | </div> |
| | | <div class="dialogToolItem"> |
| | | <el-tooltip class="box-item" effect="dark" content="笔记" placement="bottom" v-if="isUpdate"> |
| | | <img :src="noteUpdate" @click="updateNote" /> |
| | | <div class="dialogToolItem" v-if="isUpdate"> |
| | | <el-tooltip class="box-item" effect="dark" content="笔记" placement="bottom"> |
| | | <img :src="biji2" @click="updateNote" /> |
| | | </el-tooltip> |
| | | </div> |
| | | </div> |
| | |
| | | :style="{ top: `${dialogToolData.top}px`, left: `${dialogToolData.left}px` }" |
| | | > |
| | | <div class="content"> |
| | | <div class="word">{{ dictionaryData.data.word }}</div> |
| | | <div class="phone_con"> |
| | | <div class="per-phone"> |
| | | 英 /<span>{{ dictionaryData.data.ukPhone }}</span |
| | | >/ |
| | | 英 <span>/{{ dictionaryData.data.ukPhone }}/</span |
| | | ><img |
| | | :src="sound" |
| | | class="soundBtn hover" |
| | | @click="soundWord(dictionaryData.data.word, 'en-UK')" |
| | | /> |
| | | </div> |
| | | <div class="per-phone"> |
| | | 美 /<span>{{ dictionaryData.data.usPhone }}</span |
| | | >/ |
| | | 美 <span>/{{ dictionaryData.data.usPhone }}/</span |
| | | ><img |
| | | :src="sound" |
| | | class="soundBtn hover" |
| | | @click="soundWord(dictionaryData.data.word, 'en-US')" |
| | | /> |
| | | </div> |
| | | </div> |
| | | <div class="trans"> |
| | |
| | | </div> |
| | | </div> |
| | | |
| | | <el-dialog title="资源" align-center v-model="resourVisble" width="845" class="resourDialog"> |
| | | <el-dialog |
| | | title="资源" |
| | | align-center |
| | | v-model="resourVisble" |
| | | width="845" |
| | | class="resourDialog" |
| | | :before-close="resourVisbleClose" |
| | | > |
| | | <div class="videoBox" v-if="resourType == '视频'"> |
| | | <video controls controlslist="nodownload" :src="testVideo"></video> |
| | | </div> |
| | | <div class="videoBox" v-if="resourType == '音频'"> |
| | | <!-- <video controls controlslist="nodownload" :src="testVideo"></video> --> |
| | | <audio ref="audioPlayer" :src="testVideo" controls></audio> |
| | | </div> |
| | | |
| | | <!-- <div class="wordBox" v-if="resourType == 'word'"> |
| | | <vue-office-docx :src="testWord" /> |
| | | </div> --> |
| | | </el-dialog> |
| | | <div class="audioBox" v-show="false"> |
| | | <!-- <video controls controlslist="nodownload" :src="testVideo"></video> --> |
| | | <audio ref="audioPlayer" :src="testAudio" controls @loadedmetadata="autoPlay"></audio> |
| | | </div> |
| | | <!-- 图片 --> |
| | | <el-image-viewer |
| | | v-if="confirmDialog" |
| | |
| | | <iframe src="https://adjam93.github.io/threejs-model-viewer/#" frameborder="0"></iframe> |
| | | </div> |
| | | </el-dialog> |
| | | <el-dialog title="生词卡片" align-center v-model="shengciVisble" width="800" class="myDialogs"> |
| | | <div class="wendabox"> |
| | | <newWord :resourceUrl="resourceUrl" /> |
| | | </div> |
| | | </el-dialog> |
| | | </template> |
| | | |
| | | <script setup lang="ts"> |
| | | import { ref, reactive, watch, onMounted, onBeforeMount, inject } from 'vue' |
| | | import { ctxUrl } from '@/assets/js/config' |
| | | import { ref, reactive, watch, onMounted, onBeforeMount, onBeforeUnmount, inject } from 'vue' |
| | | import { useRouter, useRoute } from 'vue-router' |
| | | import useClipboard from 'vue-clipboard3' |
| | | const { toClipboard } = useClipboard() |
| | |
| | | let route = useRoute() |
| | | import moment from 'moment' |
| | | import dictionary from '@/views/components/dictionary.vue' |
| | | import newWord from '@/views/components/newWord.vue' |
| | | import { ElMessage, ElMessageBox, valueEquals } from 'element-plus' |
| | | import logo from '@/assets/images/header/logo.png' |
| | | import mulu from '@/assets/images/menu/mulu.png' |
| | |
| | | import zhishitupu from '@/assets/images/menu/zhishitupu.png' |
| | | import jietu from '@/assets/images/menu/jietu.png' |
| | | import biaoqian from '@/assets/images/menu/biaoqian.png' |
| | | import allSearch from '@/assets/images/menu/allSearch.svg' |
| | | import topbg from '@/assets/images/header/top-bg.png' |
| | | import setting from '@/assets/images/operation/setting.png' |
| | | import search from '@/assets/images/operation/search.png' |
| | | import search1 from '@/assets/images/operation/search1.png' |
| | | import sound from '@/assets/images/operation/sound.png' |
| | | import listSearch from '@/assets/images/operation/list-search.svg' |
| | | |
| | | import aIzhinengwenda from '@/assets/images/menu/AIzhinengwenda.png' |
| | | import aIyuyinyuedu from '@/assets/images/menu/AIyuyinyuedu.png' |
| | |
| | | import daiban from '@/assets/images/menu/daiban.png' |
| | | import shouqiR from '@/assets/images/menu/shouqi-R.png' |
| | | import shouqiL from '@/assets/images/menu/shouqi-L.png' |
| | | import charuziyuan from '../assets/images/operation/charuziyuan.png' |
| | | import charuziyuan_blue from '../assets/images/operation/charuziyuan_blue.png' |
| | | import dati_charu from '../assets/images/operation/dati_charu.png' |
| | | import dati_charu_blue from '../assets/images/operation/dati_charu_blue.png' |
| | | import xiake from '../assets/images/operation/xiake.png' |
| | | import charuziyuan from '@/assets/images/operation/charuziyuan.png' |
| | | import charuziyuan_blue from '@/assets/images/operation/charuziyuan_blue.png' |
| | | import dati_charu from '@/assets/images/operation/dati_charu.png' |
| | | import dati_charu_blue from '@/assets/images/operation/dati_charu_blue.png' |
| | | import xiake from '@/assets/images/operation/xiake.png' |
| | | |
| | | import huabi from '../assets/images/operation/huabi-w.png' |
| | | import wenzi2 from '../assets/images/operation/wenzi.png' |
| | | import biaoqianw from '../assets/images/operation/biaoqian-w.png' |
| | | import baiban from '../assets/images/operation/baiban-w.png' |
| | | import biaozhu from '../assets/images/operation/pencil-minus.svg' |
| | | import jieping from '../assets/images/operation/screenshot-w.png' |
| | | import clearPrevious from '../assets/images/operation/clearPrevious.png' |
| | | import hide from '../assets/images/operation/hide.png' |
| | | import show from '../assets/images/operation/show.png' |
| | | import tuichu from '../assets/images/operation/tuichu.png' |
| | | import tuxing from '../assets/images/operation/tuxing.png' |
| | | import chongzuo from '../assets/images/operation/chongzuo.png' |
| | | import qingchu2 from '../assets/images/operation/qingchu.png' |
| | | import huabi from '@/assets/images/operation/huabi-w.png' |
| | | import wenzi2 from '@/assets/images/operation/wenzi.png' |
| | | import biaoqianw from '@/assets/images/operation/biaoqian-w.png' |
| | | import tagW from '@/assets/images/operation/tag-w.svg' |
| | | import baiban from '@/assets/images/operation/baiban-w.png' |
| | | import biaozhu from '@/assets/images/operation/pencil-minus.svg' |
| | | import jieping from '@/assets/images/operation/screenshot-w.png' |
| | | import clearPrevious from '@/assets/images/operation/clearPrevious.png' |
| | | import hide from '@/assets/images/operation/hide.png' |
| | | import show from '@/assets/images/operation/show.png' |
| | | import tuichu from '@/assets/images/operation/tuichu.png' |
| | | import tuxing from '@/assets/images/operation/tuxing.png' |
| | | import chongzuo from '@/assets/images/operation/chongzuo.png' |
| | | import qingchu2 from '@/assets/images/operation/qingchu.png' |
| | | |
| | | import gaoliang from '../assets/images/operation/gaoliang.png' |
| | | import gaoliang1 from '../assets/images/operation/gaoliang-b.png' |
| | | import huaxian from '../assets/images/operation/huaxian.png' |
| | | import huaxian1 from '../assets/images/operation/huaxian1.png' |
| | | import biji2 from '../assets/images/operation/biji.png' |
| | | import biji1 from '../assets/images/operation/biji-b.png' |
| | | import biaozhu2 from '../assets/images/operation/biaozhu.png' |
| | | import biaozhu3 from '../assets/images/operation/biaozhu1.png' |
| | | import fuzhi from '../assets/images/operation/fuzhi.png' |
| | | import fuzhi1 from '../assets/images/operation/fuzhi-b.png' |
| | | import AIyuedu from '../assets/images/operation/AIyuedu.png' |
| | | import AIyuedu1 from '../assets/images/operation/AIyuedu-b.png' |
| | | import cidian2 from '../assets/images/operation/cidian.png' |
| | | import cidian1 from '../assets/images/operation/cidian-b.png' |
| | | import baidu from '../assets/images/operation/baidu.png' |
| | | import baidu1 from '../assets/images/operation/baidu-b.png' |
| | | import yuyinyuedu from '../assets/images/operation/yuyinyuedu.png' |
| | | import yuyinyuedu1 from '../assets/images/operation/yuyinyuedu-b.png' |
| | | import xuanzhong from '../assets/images/operation/xuanzhong.png' |
| | | import xuanzhong1 from '../assets/images/operation/xuanzhong1.png' |
| | | import gaoliang from '@/assets/images/operation/gaoliang.png' |
| | | import gaoliang1 from '@/assets/images/operation/gaoliang-b.png' |
| | | import huaxian from '@/assets/images/operation/huaxian.png' |
| | | import huaxian1 from '@/assets/images/operation/huaxian1.png' |
| | | import biji2 from '@/assets/images/operation/biji.png' |
| | | import biji1 from '@/assets/images/operation/biji-b.png' |
| | | import biaozhu2 from '@/assets/images/operation/biaozhu.png' |
| | | import biaozhu3 from '@/assets/images/operation/biaozhu1.png' |
| | | import fuzhi from '@/assets/images/operation/fuzhi.png' |
| | | import fuzhi1 from '@/assets/images/operation/fuzhi-b.png' |
| | | import AIyuedu from '@/assets/images/operation/AIyuedu.png' |
| | | import AIyuedu1 from '@/assets/images/operation/AIyuedu-b.png' |
| | | import cidian2 from '@/assets/images/operation/cidian.png' |
| | | import cidian1 from '@/assets/images/operation/cidian-b.png' |
| | | import baidu from '@/assets/images/operation/baidu.png' |
| | | import baidu1 from '@/assets/images/operation/baidu-b.png' |
| | | import yuyinyuedu from '@/assets/images/operation/yuyinyuedu.png' |
| | | import yuyinyuedu1 from '@/assets/images/operation/yuyinyuedu-b.png' |
| | | import xuanzhong from '@/assets/images/operation/xuanzhong.png' |
| | | import xuanzhong1 from '@/assets/images/operation/xuanzhong1.png' |
| | | |
| | | import zoomIn from '../assets/images/operation/zoomIn.png' |
| | | import zoomOut from '../assets/images/operation/zoomOut.png' |
| | | import huabi2 from '../assets/images/operation/huabi.svg' |
| | | import trash from '../assets/images/operation/trash.svg' |
| | | import noteUpdate from '../assets/images/operation/Note-b.svg' |
| | | import zoomIn from '@/assets/images/operation/zoomIn.png' |
| | | import zoomOut from '@/assets/images/operation/zoomOut.png' |
| | | import huabi2 from '@/assets/images/operation/huabi.svg' |
| | | import deleteIcon from '@/assets/images/operation/delete1.svg' |
| | | import noteUpdate from '@/assets/images/operation/Note-b.svg' |
| | | |
| | | import shanchu from '../assets/images/operation/delete.png' |
| | | import bianji from '../assets/images/operation/bianji.png' |
| | | import video from '../assets/images/content/resource.png' |
| | | import shanchu from '@/assets/images/operation/delete.png' |
| | | import bianji from '@/assets/images/operation/bianji.png' |
| | | import video from '@/assets/images/content/resource.png' |
| | | //引入VueOfficeDocx组件 |
| | | import VueOfficeDocx from '@vue-office/docx' |
| | | //引入相关样式 |
| | |
| | | |
| | | import { loadMicroApp } from 'qiankun' |
| | | import { microApps } from '@/child.ts' |
| | | let token = localStorage.getItem('token') |
| | | const canvasWith = ref(1000) |
| | | const canvasheight = ref(3000) |
| | | const screenWidth = ref( |
| | |
| | | const activeCatalog = ref() |
| | | const reMarResult = ref() |
| | | onMounted(() => { |
| | | getUserInfo() |
| | | if (token) { |
| | | getUserInfo() |
| | | } |
| | | setTimeout(() => { |
| | | canvasWith.value = document.querySelector('.content-box').offsetWidth |
| | | canvasheight.value = document.querySelector('.content-box').offsetHeight |
| | |
| | | window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth |
| | | })() |
| | | } |
| | | |
| | | // 加载微应用 |
| | | microApp = loadMicroApp(microApps.book1, { |
| | | microApp = loadMicroApp(microApps[localStorage.getItem('bookId')], { |
| | | sandbox: { |
| | | strictStyleIsolation: true, |
| | | experimentalStyleIsolation: true |
| | |
| | | window.qiankunActions.onGlobalStateChange((state, prev) => { |
| | | console.log('父层state变化', state) |
| | | window.qiankunState = state |
| | | |
| | | if (window.qiankunState && window.qiankunState.initTestBook) { |
| | | window.qiankunState.initTestBook( |
| | | localStorage.getItem('bookId') + '', |
| | |
| | | |
| | | // 定义父层方法 |
| | | window.qiankunActions.setGlobalState({ |
| | | state: 1, // 加载子应用 |
| | | state: 1, |
| | | disableSign: false, |
| | | windowSelection: (data) => { |
| | | // 绑定子应用选择监听事件 |
| | | console.log(data, '子应用选择') |
| | |
| | | showToolBox.value = false |
| | | lineDelete.showLineDelete = false |
| | | dictionaryData.showContent = false |
| | | isUpdate.value = false |
| | | toolActive.value = '' |
| | | lineDelete.top = data.y + 20 |
| | | lineDelete.left = data.x |
| | |
| | | }, |
| | | chooseWords: (data) => { |
| | | console.log(data, '英语生词') |
| | | if (data) { |
| | | dialogToolData.txt = data.word |
| | | dialogToolData.left = data.x |
| | | dialogToolData.top = data.y + 20 |
| | | getSearchResult() |
| | | switch (data.type) { |
| | | case 'word': |
| | | if (data) { |
| | | dialogToolData.txt = data.word |
| | | dialogToolData.left = data.x |
| | | dialogToolData.top = data.y + 20 |
| | | getSearchResult() |
| | | } |
| | | break |
| | | case 'swdt': |
| | | console.log() |
| | | siweiVisble.value = true |
| | | break |
| | | case 'readText': |
| | | window.speechSynthesis.cancel() |
| | | const synth = window.speechSynthesis |
| | | const utterances = new SpeechSynthesisUtterance(data.data) |
| | | // utterances.lang = 'EN' // 设置语言为中文 |
| | | synth.speak(utterances) |
| | | |
| | | break |
| | | } |
| | | }, |
| | | getBookConfig: (data) => { |
| | | console.log(data.bookConfig, '图书配置') |
| | | bookConfig.value = data.bookConfig |
| | | getCatalogueData() |
| | | getResourceData() |
| | | // getResourceData() |
| | | getTextbookComponents() |
| | | getReMarkList() |
| | | // getReMarkList() |
| | | }, |
| | | catalogChange: (data) => { |
| | | activeCatalog.value = data.showCatalogList |
| | | getSignData() |
| | | if (!window.qiankunState.disableSign && token) { |
| | | getSignData() |
| | | } |
| | | console.log(data, '章节切换:目前显示的三个章节') |
| | | }, |
| | | pageChange: (data) => { |
| | | headerData.process = Number(data.page) |
| | | currentChapter.value = data.catalog |
| | | // catalogTree.value.filter(Number(data.start)) |
| | | console.log(data, '页面切换:目前显示页面和对应的章节信息') |
| | | if (catalogTree.value) { |
| | | catalogTree.value.setCurrentKey(Number(data.page)) |
| | |
| | | showToolBox.value = false |
| | | lineDelete.showLineDelete = false |
| | | dictionaryData.showContent = false |
| | | |
| | | reMarkCon.value = data.text |
| | | reMarResult.value = reMarkData.value.find((item) => { |
| | | return item.chapterNum == data.catalog && item.page == data.page |
| | | }) |
| | | if (reMarResult.value) { |
| | | floatingToolData.activeBookmark = '书签' |
| | | floatingToolData.activeToolData = '书签' |
| | | } else { |
| | | floatingToolData.activeBookmark = '' |
| | | floatingToolData.activeToolData = '' |
| | | } |
| | | } |
| | | }) |
| | | // 调用子层方法 |
| | | // if (window.qiankunState && window.qiankunState.aa) window.qiankunState.aa(1) |
| | | // // 调用子层方法 |
| | | // if (window.qiankunState && window.qiankunState.getAnswers){ |
| | | // window.qiankunState.getAnswers(localStorage.getItem("")) |
| | | // } |
| | | }) |
| | | |
| | | onBeforeUnmount(() => { |
| | | if (microApp) { |
| | | microApp.unmount() // 卸载微应用 |
| | | } |
| | | }) |
| | | // watch( |
| | | // () => screenWidth.value, |
| | | // (val) => { |
| | |
| | | if (res) { |
| | | let teacherRole = res.roleLinks.find((item) => item.role.refCode == 'teacher') |
| | | let teacherInfos = res.infoList.find((item) => item.type == 'teacherInfo') |
| | | let wechatInfo = res.infoList.find((item) => item.type == 'WeChat') |
| | | let studentInfo = res.infoList.find((item) => item.type == 'Default') |
| | | let phoneInfo = res.secretList.find((item) => item.type == 'MobilePhone') |
| | | let nameAndPassword = res.secretList.find((item) => item.type == 'LoginNameAndPassword') |
| | | |
| | | if (nameAndPassword) { |
| | | if (teacherRole && teacherInfos) { |
| | | userInfo.value = { |
| | | name: nameAndPassword.credential |
| | | } |
| | | localStorage.setItem('userInfo', JSON.stringify(userInfo.value)) |
| | | } else if (teacherRole && teacherInfos) { |
| | | userInfo.value = { |
| | | ...teacherInfos, |
| | | name: teacherInfos.name, |
| | | role: 'Teacher', |
| | | roleId: teacherRole.role.id |
| | | } |
| | | localStorage.setItem('userInfo', JSON.stringify(userInfo.value)) |
| | | } else if (wechatInfo) { |
| | | userInfo.value = { |
| | | ...wechatInfo, |
| | | phoneNumber: phoneInfo?.credential, |
| | | Email: emailInfo?.credential, |
| | | role: 'Student' |
| | | } |
| | | } else if (phoneInfo) { |
| | | userInfo.value = { |
| | | name: phoneInfo.credential |
| | |
| | | isShow: bookConfig.value.textbookComponents.indexOf('1E16353F') > -1 |
| | | }, |
| | | { |
| | | name: '检索', |
| | | icon: allSearch, |
| | | isShow: bookConfig.value.textbookComponents.indexOf('B7C5B45D') > -1 |
| | | }, |
| | | { |
| | | name: '笔记', |
| | | icon: biji, |
| | | isShow: bookConfig.value.textbookComponents.indexOf('A3298FCF') > -1 |
| | |
| | | name: '书签', |
| | | icon: biaoqian, |
| | | isShow: bookConfig.value.textbookComponents.indexOf('CF2E1400') > -1 |
| | | } |
| | | }, |
| | | // { |
| | | // name: '习题', |
| | | // icon: zhishitupu, |
| | | // isShow: true |
| | | // } |
| | | ] |
| | | teachToolsMenuData = [ |
| | | { |
| | |
| | | isShow: bookConfig.value.textbookComponents.indexOf('83FB80FD') > -1 |
| | | }, |
| | | { |
| | | name: '生字卡片', |
| | | name: '生词卡片', |
| | | icon: shengzikapian, |
| | | isShow: bookConfig.value.textbookComponents.indexOf('38D32EE3') > -1 |
| | | }, |
| | |
| | | ] |
| | | } |
| | | |
| | | const listLoading = ref(false) |
| | | //获取目录 |
| | | const catalogueData = ref([]) |
| | | |
| | | const getCatalogueData = () => { |
| | | listLoading.value = true |
| | | axios |
| | | .get(bookConfig.value.resourceUrl + '/information.json') |
| | | .then(function (response) { |
| | |
| | | console.log(json, '目录') |
| | | catalogueData.value = json.data |
| | | headerData.totlePage = json.data[json.data.length - 1].end |
| | | listLoading.value = false |
| | | }) |
| | | .catch(function (error) { |
| | | console.log(error) |
| | |
| | | const defaultProps = { |
| | | children: 'children', |
| | | label: 'label', |
| | | page: 'page' |
| | | start: 'start' |
| | | } |
| | | |
| | | const filterNode = (value, data) => { |
| | |
| | | |
| | | const handleNodeClick = (data) => { |
| | | console.log(data) |
| | | headerData.process = data.start |
| | | if (window.qiankunState && window.qiankunState.gotoPage) |
| | | window.qiankunState.gotoPage(data.chapter, data.start) |
| | | if (localStorage.getItem('tryPageCount')) { |
| | | if (data.start < localStorage.getItem('tryPageCount')) { |
| | | headerData.process = data.start |
| | | if (window.qiankunState && window.qiankunState.gotoPage) |
| | | window.qiankunState.gotoPage(data.chapter, data.start) |
| | | } else { |
| | | ElMessage({ |
| | | message: '试读已结束!', |
| | | type: 'warning' |
| | | }) |
| | | } |
| | | } else { |
| | | headerData.process = data.start |
| | | if (window.qiankunState && window.qiankunState.gotoPage) |
| | | window.qiankunState.gotoPage(data.chapter, data.start) |
| | | } |
| | | } |
| | | |
| | | //获取资源 |
| | |
| | | const resourVisble = ref(false) |
| | | const resourType = ref('') //资源类型图片/音频 |
| | | const testVideo = ref('') //视频链接 |
| | | const testAudio = ref('') //音频链接 |
| | | const testWord = ref('') //word链接 |
| | | const showHandle = ref(null) |
| | | |
| | | const playIndex = ref(null) //音频播放 |
| | | const audioPlayer = ref(null) |
| | | const getResourceData = () => { |
| | | imgPreviewList.value = [] |
| | | axios |
| | | .get(bookConfig.value.resourceUrl + '/resource.json?t=12') |
| | | .then(function (response) { |
| | | var json = response.data |
| | | // 处理获取到的json数据 |
| | | if (json.length > 0) { |
| | | defaultResourceList.value = [] |
| | | teacherResourceList.value = [] |
| | | // 获取数组中所有对象的age属性的数量 |
| | | json.forEach((item) => { |
| | | if (resourceType.value == 'default') { |
| | | if (item.isTeacherResource == '否') { |
| | | defaultResourceList.value.push(item) |
| | | if (token) { |
| | | imgPreviewList.value = [] |
| | | listLoading.value = true |
| | | axios |
| | | .get(bookConfig.value.resourceUrl + '/resource.json?t=12') |
| | | .then(function (response) { |
| | | var json = response.data |
| | | // 处理获取到的json数据 |
| | | if (json.length > 0) { |
| | | defaultResourceList.value = [] |
| | | teacherResourceList.value = [] |
| | | // 获取数组中所有对象的age属性的数量 |
| | | json.forEach((item) => { |
| | | if (item.iconPath) { |
| | | item.icon = bookConfig.value.resourceUrl + '/' + item.iconPath |
| | | } else { |
| | | item.icon = '' |
| | | } |
| | | if (resourceType.value == 'default') { |
| | | if (item.isTeacherResource == '否') { |
| | | defaultResourceList.value.push(item) |
| | | } |
| | | } else { |
| | | if (item.isTeacherResource == '是') { |
| | | teacherResourceList.value.push(item) |
| | | } |
| | | } |
| | | }) |
| | | if (defaultResourceList.value.length > 0) { |
| | | let imgCount = 0 |
| | | let audioCount = 0 |
| | | let videoCount = 0 |
| | | let exercisesCount = 0 |
| | | let otherCount = 0 |
| | | resourceDataList.value = [] |
| | | defaultResourceList.value.forEach((resItem) => { |
| | | if (resItem.resourceType == '图片') { |
| | | if (resItem.resourcePath) { |
| | | resItem.resourcePath = bookConfig.value.resourceUrl + '/' + resItem.resourcePath |
| | | } else { |
| | | resItem.resourcePath = |
| | | bookConfig.value.requestCtx + '/file/GetPreViewImage?md5=' + resItem.md5 |
| | | } |
| | | |
| | | imgPreviewList.value.push(resItem.resourcePath) |
| | | if (activeClassify.value == 'image') { |
| | | resourceDataList.value.push(resItem) |
| | | } |
| | | imgCount++ |
| | | } else if (resItem.resourceType == '音频') { |
| | | if (activeClassify.value == 'audio') { |
| | | resourceDataList.value.push(resItem) |
| | | } |
| | | audioCount++ |
| | | } else if (resItem.resourceType == '视频') { |
| | | if (activeClassify.value == 'video') { |
| | | resourceDataList.value.push(resItem) |
| | | } |
| | | videoCount++ |
| | | } else { |
| | | if (activeClassify.value == 'other') { |
| | | resourceDataList.value.push(resItem) |
| | | } |
| | | otherCount++ |
| | | } |
| | | }) |
| | | classifySelectList.value = [] |
| | | if (imgCount > 0) { |
| | | classifySelectList.value.push({ |
| | | title: '图片', |
| | | count: imgCount, |
| | | key: 'image' |
| | | }) |
| | | } |
| | | if (audioCount > 0) { |
| | | classifySelectList.value.push({ |
| | | title: '音频', |
| | | count: audioCount, |
| | | key: 'audio' |
| | | }) |
| | | } |
| | | if (videoCount > 0) { |
| | | classifySelectList.value.push({ |
| | | title: '视频', |
| | | count: videoCount, |
| | | key: 'video' |
| | | }) |
| | | } |
| | | if (otherCount > 0) { |
| | | classifySelectList.value.push({ |
| | | title: '其他', |
| | | count: otherCount, |
| | | key: 'other' |
| | | }) |
| | | } |
| | | if (!activeClassify.value) { |
| | | activeClassify.value = classifySelectList.value[0].key |
| | | defaultResourceList.value.forEach((resItem1) => { |
| | | if (resItem1.resourceType == classifySelectList.value[0].title) { |
| | | resourceDataList.value.push(resItem1) |
| | | } |
| | | }) |
| | | } |
| | | } else { |
| | | if (item.isTeacherResource == '是') { |
| | | teacherResourceList.value.push(item) |
| | | let imgCount = 0 |
| | | let audioCount = 0 |
| | | let videoCount = 0 |
| | | let exercisesCount = 0 |
| | | let otherCount = 0 |
| | | resourceDataList.value = [] |
| | | teacherResourceList.value.forEach((resItem) => { |
| | | if (resItem.resourceType == '图片') { |
| | | if (resItem.resourcePath) { |
| | | resItem.resourcePath = bookConfig.value.resourceUrl + '/' + resItem.resourcePath |
| | | } else { |
| | | resItem.resourcePath = |
| | | bookConfig.value.requestCtx + '/file/GetPreViewImage?md5=' + resItem.md5 |
| | | } |
| | | imgPreviewList.value.push(resItem.resourcePath) |
| | | if (activeClassify.value == 'image') { |
| | | resourceDataList.value.push(resItem) |
| | | } |
| | | imgCount++ |
| | | } else if (resItem.resourceType == '音频') { |
| | | if (activeClassify.value == 'audio') { |
| | | resourceDataList.value.push(resItem) |
| | | } |
| | | audioCount++ |
| | | } else if (resItem.resourceType == '视频') { |
| | | if (activeClassify.value == 'video') { |
| | | resourceDataList.value.push(resItem) |
| | | } |
| | | videoCount++ |
| | | } else { |
| | | if (activeClassify.value == 'other') { |
| | | resourceDataList.value.push(resItem) |
| | | } |
| | | otherCount++ |
| | | } |
| | | }) |
| | | classifySelectList.value = [] |
| | | if (imgCount > 0) { |
| | | classifySelectList.value.push({ |
| | | title: '图片', |
| | | count: imgCount, |
| | | key: 'image' |
| | | }) |
| | | } |
| | | } |
| | | }) |
| | | if (defaultResourceList.value.length > 0) { |
| | | let imgCount = 0 |
| | | let audioCount = 0 |
| | | let videoCount = 0 |
| | | let exercisesCount = 0 |
| | | let otherCount = 0 |
| | | resourceDataList.value = [] |
| | | defaultResourceList.value.forEach((resItem) => { |
| | | if (resItem.resourceType == '图片') { |
| | | if (activeClassify.value == 'image') { |
| | | resourceDataList.value.push(resItem) |
| | | } |
| | | imgCount++ |
| | | } else if (resItem.resourceType == '音频') { |
| | | if (activeClassify.value == 'audio') { |
| | | resourceDataList.value.push(resItem) |
| | | } |
| | | audioCount++ |
| | | } else if (resItem.resourceType == '视频') { |
| | | if (activeClassify.value == 'video') { |
| | | resourceDataList.value.push(resItem) |
| | | } |
| | | videoCount++ |
| | | } else if (resItem.resourceType == '习题') { |
| | | if (activeClassify.value == 'exercises') { |
| | | resourceDataList.value.push(resItem) |
| | | } |
| | | exercisesCount++ |
| | | } else { |
| | | if (activeClassify.value == 'other') { |
| | | resourceDataList.value.push(resItem) |
| | | } |
| | | otherCount++ |
| | | if (audioCount > 0) { |
| | | classifySelectList.value.push({ |
| | | title: '音频', |
| | | count: audioCount, |
| | | key: 'audio' |
| | | }) |
| | | } |
| | | }) |
| | | classifySelectList.value = [] |
| | | if (imgCount > 0) { |
| | | classifySelectList.value.push({ |
| | | title: '图片', |
| | | count: imgCount, |
| | | key: 'image' |
| | | }) |
| | | imgPreviewList.value = resourceDataList.value |
| | | } |
| | | if (audioCount > 0) { |
| | | classifySelectList.value.push({ |
| | | title: '音频', |
| | | count: audioCount, |
| | | key: 'audio' |
| | | }) |
| | | } |
| | | if (videoCount > 0) { |
| | | classifySelectList.value.push({ |
| | | title: '视频', |
| | | count: videoCount, |
| | | key: 'video' |
| | | }) |
| | | } |
| | | if (exercisesCount > 0) { |
| | | classifySelectList.value.push({ |
| | | title: '习题', |
| | | count: exercisesCount, |
| | | key: 'exercises' |
| | | }) |
| | | } |
| | | if (otherCount > 0) { |
| | | classifySelectList.value.push({ |
| | | title: '其他', |
| | | count: otherCount, |
| | | key: 'other' |
| | | }) |
| | | } |
| | | if (!activeClassify.value) { |
| | | activeClassify.value = classifySelectList.value[0].key |
| | | defaultResourceList.value.forEach((resItem1) => { |
| | | if (resItem1.resourceType == classifySelectList.value[0].title) { |
| | | resourceDataList.value.push(resItem1) |
| | | } |
| | | }) |
| | | } |
| | | } else { |
| | | let imgCount = 0 |
| | | let audioCount = 0 |
| | | let videoCount = 0 |
| | | let exercisesCount = 0 |
| | | let otherCount = 0 |
| | | resourceDataList.value = [] |
| | | teacherResourceList.value.forEach((resItem) => { |
| | | if (resItem.resourceType == '图片') { |
| | | if (activeClassify.value == 'image') { |
| | | resourceDataList.value.push(resItem) |
| | | } |
| | | imgCount++ |
| | | } else if (resItem.resourceType == '音频') { |
| | | if (activeClassify.value == 'audio') { |
| | | resourceDataList.value.push(resItem) |
| | | } |
| | | audioCount++ |
| | | } else if (resItem.resourceType == '视频') { |
| | | if (activeClassify.value == 'video') { |
| | | resourceDataList.value.push(resItem) |
| | | } |
| | | videoCount++ |
| | | } else if (resItem.resourceType == '习题') { |
| | | if (activeClassify.value == 'exercises') { |
| | | resourceDataList.value.push(resItem) |
| | | } |
| | | exercisesCount++ |
| | | } else { |
| | | if (activeClassify.value == 'other') { |
| | | resourceDataList.value.push(resItem) |
| | | } |
| | | otherCount++ |
| | | if (videoCount > 0) { |
| | | classifySelectList.value.push({ |
| | | title: '视频', |
| | | count: videoCount, |
| | | key: 'video' |
| | | }) |
| | | } |
| | | }) |
| | | classifySelectList.value = [] |
| | | if (imgCount > 0) { |
| | | classifySelectList.value.push({ |
| | | title: '图片', |
| | | count: imgCount, |
| | | key: 'image' |
| | | }) |
| | | imgPreviewList.value = resourceDataList.value |
| | | } |
| | | if (audioCount > 0) { |
| | | classifySelectList.value.push({ |
| | | title: '音频', |
| | | count: audioCount, |
| | | key: 'audio' |
| | | }) |
| | | } |
| | | if (videoCount > 0) { |
| | | classifySelectList.value.push({ |
| | | title: '视频', |
| | | count: videoCount, |
| | | key: 'video' |
| | | }) |
| | | } |
| | | if (exercisesCount > 0) { |
| | | classifySelectList.value.push({ |
| | | title: '习题', |
| | | count: exercisesCount, |
| | | key: 'exercises' |
| | | }) |
| | | } |
| | | if (otherCount > 0) { |
| | | classifySelectList.value.push({ |
| | | title: '其他', |
| | | count: otherCount, |
| | | key: 'other' |
| | | }) |
| | | } |
| | | if (!activeClassify.value) { |
| | | activeClassify.value = classifySelectList.value[0].key |
| | | teacherResourceList.value.forEach((resItem1) => { |
| | | if (resItem1.resourceType == classifySelectList.value[0].title) { |
| | | resourceDataList.value.push(resItem1) |
| | | } |
| | | }) |
| | | if (otherCount > 0) { |
| | | classifySelectList.value.push({ |
| | | title: '其他', |
| | | count: otherCount, |
| | | key: 'other' |
| | | }) |
| | | } |
| | | if (!activeClassify.value) { |
| | | activeClassify.value = classifySelectList.value[0].key |
| | | teacherResourceList.value.forEach((resItem1) => { |
| | | if (resItem1.resourceType == classifySelectList.value[0].title) { |
| | | resourceDataList.value.push(resItem1) |
| | | } |
| | | }) |
| | | } |
| | | } |
| | | } |
| | | } |
| | | listLoading.value = false |
| | | }) |
| | | .catch(function (error) { |
| | | console.log(error) |
| | | }) |
| | | } else { |
| | | ElMessageBox.confirm('请先登录!', { |
| | | confirmButtonText: '去登录', |
| | | cancelButtonText: '取消', |
| | | autofocus: false, |
| | | type: 'warning' |
| | | }) |
| | | .catch(function (error) { |
| | | console.log(error) |
| | | }) |
| | | .then(() => { |
| | | router.push('/login') |
| | | }) |
| | | .catch(() => {}) |
| | | } |
| | | } |
| | | //资源播放视频 |
| | | const goPlay = (data) => { |
| | | const goPlay = (data, index) => { |
| | | resourType.value = data.resourceType |
| | | if (data.resourceType == '视频' || data.resourceType == '音频') { |
| | | resourVisble.value = true |
| | | if (data.resourceType == '视频') { |
| | | if (data.md5) { |
| | | testVideo.value = bookConfig.value.requestCtx + '/file/api/ApiDownload?md5=' + data.md5 |
| | | } else { |
| | | testVideo.value = bookConfig.value.resourceUrl + '/' + data.resourcePath |
| | | } |
| | | resourVisble.value = true |
| | | } else if (data.resourceType == '音频') { |
| | | playIndex.value = index |
| | | if (data.md5) { |
| | | testAudio.value = bookConfig.value.requestCtx + '/file/api/ApiDownload?md5=' + data.md5 |
| | | } else { |
| | | testAudio.value = bookConfig.value.resourceUrl + '/' + data.resourcePath |
| | | } |
| | | autoPlay() |
| | | } else { |
| | | if (data.md5) { |
| | | window.open(bookConfig.value.requestCtx + '/file/api/ApiDownload?md5=' + data.md5) |
| | |
| | | // testWord.value = bookConfig.value.resourceUrl + '/' + data.resourcePath |
| | | // } |
| | | } |
| | | // 关闭视频 |
| | | const resourVisbleClose = () => { |
| | | resourVisble.value = false |
| | | testVideo.value = '' |
| | | } |
| | | const autoPlay = () => { |
| | | if (audioPlayer.value) { |
| | | audioPlayer.value.play() |
| | | } |
| | | } |
| | | const goPause = () => { |
| | | playIndex.value = null |
| | | testAudio.value = '' |
| | | } |
| | | // |
| | | |
| | | //资源跳转到指定位置 |
| | | const JumpPosition = (data) => { |
| | | console.log(data, '跳转') |
| | | if (window.qiankunState && window.qiankunState.gotoPage) { |
| | | window.qiankunState.gotoPage(Number(data.chapterNum), Number(data.pagination)) |
| | | } |
| | |
| | | } |
| | | } |
| | | |
| | | //习题 |
| | | const exercisesType = ref('exercises') //习题类型 |
| | | const questionList = ref([]) |
| | | const getExercisesList = () => { |
| | | if (token) { |
| | | listLoading.value = true |
| | | questionList.value = [] |
| | | axios.get(bookConfig.value.resourceUrl + '/resource.json').then(function (response) { |
| | | var json = response.data |
| | | // 处理获取到的json数据 |
| | | if (json.length > 0) { |
| | | json.forEach((item) => { |
| | | if (item.resourceType == '习题') { |
| | | let text = searchText.value.replace(/^\s*|\s*$/g, '') |
| | | if (searchText.value) { |
| | | if (item.resourceName.indexOf(text) > -1) { |
| | | questionList.value.push(item) |
| | | } |
| | | } else { |
| | | questionList.value.push(item) |
| | | } |
| | | } |
| | | }) |
| | | } |
| | | listLoading.value = false |
| | | }) |
| | | } else { |
| | | ElMessageBox.confirm('请先登录!', { |
| | | confirmButtonText: '去登录', |
| | | cancelButtonText: '取消', |
| | | autofocus: false, |
| | | type: 'warning' |
| | | }) |
| | | .then(() => { |
| | | router.push('/login') |
| | | }) |
| | | .catch(() => {}) |
| | | } |
| | | } |
| | | const selectExercisesType = (type) => { |
| | | exercisesType.value = type |
| | | searchText.value = '' |
| | | |
| | | if (type == 'exercises') { |
| | | getExercisesList() |
| | | } else { |
| | | questionList.value = [] |
| | | } |
| | | } |
| | | |
| | | // 选中菜单 |
| | | const activeMenu = ref('目录') |
| | | |
| | | // 菜单点击 |
| | | const menuItemClick = (name) => { |
| | | searchText.value = '' |
| | | allSearchReault.value = [] |
| | | if (menuState.open && activeMenu.value == name) { |
| | | menuState.open = false |
| | | } else { |
| | |
| | | getNotesList() |
| | | break |
| | | case '资源': |
| | | getResourceData() |
| | | break |
| | | case '知识图谱': |
| | | break |
| | |
| | | break |
| | | case '书签': |
| | | getReMarkList() |
| | | break |
| | | case '检索': |
| | | break |
| | | case '习题': |
| | | getExercisesList() |
| | | break |
| | | } |
| | | } |
| | |
| | | animation: false, |
| | | bgColorList: [ |
| | | { |
| | | lable: '白', |
| | | key: '#fff' |
| | | }, |
| | | { |
| | | lable: '黄', |
| | | key: '#FBF9F4' |
| | | }, |
| | |
| | | }) |
| | | } |
| | | const bgColorSelect = (item) => { |
| | | window.qiankunActions.setGlobalState({ |
| | | bgColor: item.key |
| | | }) |
| | | settingForm.bgColorActive = item.key |
| | | } |
| | | //笔记颜色筛选 |
| | |
| | | } |
| | | |
| | | const catalogTree = ref() |
| | | const allSearchReault = ref([]) |
| | | const searchReaultData = reactive({ |
| | | isShow: true, |
| | | openIndex: 0 |
| | | }) |
| | | const searchBook = async () => { |
| | | switch (activeMenu.value) { |
| | | case '目录': |
| | |
| | | case '书签': |
| | | getReMarkList() |
| | | break |
| | | case '习题': |
| | | getExercisesList() |
| | | break |
| | | case '检索': |
| | | listLoading.value = true |
| | | allSearchReault.value = [] |
| | | console.log(window.qiankunState.searchBookByKeyword) |
| | | if (window.qiankunState && window.qiankunState.searchBookByKeyword) { |
| | | let searchReault = window.qiankunState.searchBookByKeyword(searchText.value) |
| | | if (searchReault.length > 0) { |
| | | let catalogueList = sortArr(catalogueData.value, 'chapter') |
| | | if (catalogueList.length > 0) { |
| | | catalogueList.forEach((item) => { |
| | | let labels = '' |
| | | if (item.length > 1) { |
| | | labels = item.map((i) => i.label).join('/') |
| | | } |
| | | let itemList = [] |
| | | let text = searchText.value.replace(/^\s*|\s*$/g, '') |
| | | searchReault.forEach((item1) => { |
| | | if (item[0].chapter == item1.catalog) { |
| | | item1.txt1 = item1.txt |
| | | let replaceStr = "<span class='searchColor'>" + text + '</span>' |
| | | |
| | | let htmlStr = item1.txt1.split(text).join(replaceStr) |
| | | item1.txt1 = '<p>' + htmlStr + '</p>' |
| | | itemList.push(item1) |
| | | } |
| | | }) |
| | | if (itemList.length > 0) { |
| | | allSearchReault.value.push({ |
| | | chapter: item[0].chapter, |
| | | chapterName: labels ? labels : item[0].label, |
| | | itemList: itemList |
| | | }) |
| | | } |
| | | }) |
| | | } |
| | | console.log(allSearchReault.value, 444) |
| | | listLoading.value = false |
| | | } |
| | | } |
| | | break |
| | | } |
| | | } |
| | | |
| | | function sortArr(arr, str) { |
| | | var _arr = [], |
| | | _t = [], |
| | | // 临时的变量 |
| | | _tmp |
| | | |
| | | // 按照特定的参数将数组排序将具有相同值得排在一起 |
| | | arr = arr.sort(function (a, b) { |
| | | var s = a[str], |
| | | t = b[str] |
| | | |
| | | return s < t ? -1 : 1 |
| | | }) |
| | | |
| | | if (arr.length) { |
| | | _tmp = arr[0][str] |
| | | } |
| | | // console.log( arr ); |
| | | // 将相同类别的对象添加到统一个数组 |
| | | for (var i in arr) { |
| | | if (arr[i][str] === _tmp) { |
| | | _t.push(arr[i]) |
| | | } else { |
| | | _tmp = arr[i][str] |
| | | _arr.push(_t) |
| | | _t = [arr[i]] |
| | | } |
| | | } |
| | | // 将最后的内容推出新数组 |
| | | _arr.push(_t) |
| | | return _arr |
| | | } |
| | | //检索章节收起 |
| | | const searchOpen = (index) => { |
| | | searchReaultData.isShow = true |
| | | searchReaultData.openIndex = index |
| | | } |
| | | //检索章节打开 |
| | | const searchClose = (index) => { |
| | | searchReaultData.isShow = false |
| | | searchReaultData.openIndex = index |
| | | } |
| | | |
| | | //检索跳转 |
| | | const goSearchContent = (item) => { |
| | | if (window.qiankunState && window.qiankunState.gotoPage) { |
| | | window.qiankunState.jumpSearchItem(item) |
| | | } |
| | | } |
| | | |
| | | const handleClear = () => { |
| | | switch (activeMenu.value) { |
| | | case '目录': |
| | | if (catalogTree) catalogTree.value.filter(searchText.value) |
| | | break |
| | | case '笔记': |
| | | getNotesList() |
| | | break |
| | | case '资源': |
| | | getResourceData() |
| | | break |
| | | case '知识图谱': |
| | | break |
| | | case '截图': |
| | | getScreenshotList() |
| | | break |
| | | case '书签': |
| | | getReMarkList() |
| | | break |
| | | case '检索': |
| | | allSearchReault.value = [] |
| | | break |
| | | case '习题': |
| | | getExercisesList() |
| | | break |
| | | } |
| | | } |
| | | |
| | |
| | | const functionVisible = ref(false) |
| | | const siweiVisble = ref(false) |
| | | const modelToolVisble = ref(false) |
| | | const shengciVisble = ref(false) |
| | | const activeTool = ref(0) |
| | | const toolState = reactive({ |
| | | open: true |
| | | }) |
| | | const resourceUrl = ref('') |
| | | |
| | | const selectTeachTools = (item) => { |
| | | activeTool.value = item.name |
| | | switch (item.name) { |
| | | case 'AI智能问答': |
| | | wendaVisible.value = true |
| | | break |
| | | case 'GGB函数工具': |
| | | functionVisible.value = true |
| | | break |
| | | case '思维导图': |
| | | siweiVisble.value = true |
| | | break |
| | | case '模型工具': |
| | | modelToolVisble.value = true |
| | | break |
| | | case '词典': |
| | | cidianVisible.value = true |
| | | break |
| | | if (token) { |
| | | activeTool.value = item.name |
| | | switch (item.name) { |
| | | case 'AI智能问答': |
| | | wendaVisible.value = true |
| | | break |
| | | case 'GGB函数工具': |
| | | functionVisible.value = true |
| | | break |
| | | case '思维导图': |
| | | siweiVisble.value = true |
| | | break |
| | | case '模型工具': |
| | | modelToolVisble.value = true |
| | | break |
| | | case '词典': |
| | | cidianVisible.value = true |
| | | break |
| | | case '生词卡片': |
| | | resourceUrl.value = bookConfig.value.resourceUrl |
| | | shengciVisble.value = true |
| | | } |
| | | } else { |
| | | ElMessageBox.confirm('请先登录!', { |
| | | confirmButtonText: '去登录', |
| | | cancelButtonText: '取消', |
| | | autofocus: false, |
| | | type: 'warning' |
| | | }) |
| | | .then(() => { |
| | | router.push('/login') |
| | | }) |
| | | .catch(() => {}) |
| | | } |
| | | } |
| | | |
| | |
| | | let canvas = null |
| | | const floatingToolData = reactive({ |
| | | activeToolData: '', //选中工具 |
| | | activeBookmark: '', //选中书签 |
| | | elLeft: 390, |
| | | startclientx: 0, |
| | | startclienty: 0 |
| | |
| | | console.log(floatingToolData.activeToolData, 'floatingToolData.activeToolData') |
| | | if (floatingToolData.activeToolData == '画笔') { |
| | | floatingToolData.activeToolData = '' |
| | | } else if (floatingToolData.activeToolData == '书签') { |
| | | delReMark() |
| | | floatingToolData.activeToolData = '' |
| | | } else { |
| | | floatingToolData.activeToolData = item.name |
| | | } |
| | |
| | | case '标记': |
| | | break |
| | | case '书签': |
| | | reMark() |
| | | if (floatingToolData.activeBookmark != '书签') { |
| | | floatingToolData.activeBookmark = '书签' |
| | | reMark() |
| | | } |
| | | break |
| | | case '截屏': |
| | | jitT() |
| | |
| | | console.log(str, '标记') |
| | | if (str == 'hide') { |
| | | if (window.qiankunState && window.qiankunState.delSign) { |
| | | window.qiankunState.delSign({ ids: [] }) |
| | | window.qiankunState.delSign({ type: 'Highlight' }) |
| | | window.qiankunState.delSign({ type: 'Dashing' }) |
| | | window.qiankunState.delSign({ type: 'Note' }) |
| | | } |
| | | window.qiankunActions.setGlobalState({ |
| | | disableSign: true |
| | | }) |
| | | } else { |
| | | window.qiankunActions.setGlobalState({ |
| | | disableSign: false |
| | | }) |
| | | getSignData() |
| | | } |
| | | } |
| | | |
| | |
| | | const reMarkList = ref([]) |
| | | const reMarkData = ref([]) |
| | | const reMarkId = ref([]) |
| | | const reMarkCon = ref('') |
| | | |
| | | const reMark = () => { |
| | | let chapterData = catalogueData.value.find((item) => item.chapter == Number(currentChapter.value)) |
| | | console.log(chapterData) |
| | | if (chapterData) { |
| | | reMarkData.value.push({ |
| | | id: toolClass.uuid(8), |
| | | createDate: new Date(), |
| | | page: headerData.process, |
| | | chapterNum: currentChapter.value, |
| | | chapterName: chapterData.label |
| | | }) |
| | | MG.identity |
| | | .setUserKey({ |
| | | setKeyRequests: [ |
| | | { |
| | | domain: 'reMark', |
| | | key: bookConfig.value.bookId, |
| | | value: JSON.stringify(reMarkData.value) |
| | | } |
| | | ] |
| | | if (token) { |
| | | let chapterData = catalogueData.value.find( |
| | | (item) => item.chapter == Number(currentChapter.value) |
| | | ) |
| | | if (catalogueData.value.length > 0) { |
| | | catalogueData.value.forEach((item1) => { |
| | | if (item1.chapter == Number(currentChapter.value) && item1.start == headerData.process) { |
| | | chapterData.label = item1.label |
| | | } |
| | | }) |
| | | .then((res) => { |
| | | floatingToolData.activeToolData = '' |
| | | ElMessage({ |
| | | message: '添加书签成功!', |
| | | type: 'success' |
| | | } |
| | | |
| | | if (chapterData) { |
| | | reMarkData.value.push({ |
| | | id: toolClass.uuid(8), |
| | | createDate: new Date(), |
| | | page: headerData.process, |
| | | chapterNum: currentChapter.value, |
| | | chapterName: chapterData.label, |
| | | content: reMarkCon.value || chapterData.label |
| | | }) |
| | | MG.identity |
| | | .setUserKey({ |
| | | setKeyRequests: [ |
| | | { |
| | | domain: 'reMark', |
| | | key: bookConfig.value.bookId, |
| | | value: JSON.stringify(reMarkData.value) |
| | | } |
| | | ] |
| | | }) |
| | | getReMarkList() |
| | | .then((res) => { |
| | | floatingToolData.activeToolData = '' |
| | | |
| | | ElMessage({ |
| | | message: '添加书签成功!', |
| | | type: 'success' |
| | | }) |
| | | getReMarkList() |
| | | }) |
| | | .catch(function (error) {}) |
| | | } |
| | | } else { |
| | | ElMessageBox.confirm('请先登录!', { |
| | | confirmButtonText: '去登录', |
| | | cancelButtonText: '取消', |
| | | autofocus: false, |
| | | type: 'warning' |
| | | }) |
| | | .then(() => { |
| | | router.push('/login') |
| | | }) |
| | | .catch(function (error) {}) |
| | | .catch(() => {}) |
| | | } |
| | | } |
| | | const getReMarkList = () => { |
| | | reMarkList.value = [] |
| | | reMarkData.value = [] |
| | | MG.identity |
| | | .getUserKey({ |
| | | domain: 'reMark', |
| | | keys: [bookConfig.value.bookId] |
| | | }) |
| | | .then((res) => { |
| | | if (res && res.length > 0 && res[0].value) { |
| | | reMarkData.value = JSON.parse(res[0].value) |
| | | let list = JSON.parse(res[0].value) |
| | | list.forEach((item) => { |
| | | let text = searchText.value.replace(/^\s*|\s*$/g, '') |
| | | if (searchText.value) { |
| | | if (item.name.indexOf(text) > -1) { |
| | | if (token) { |
| | | reMarkList.value = [] |
| | | reMarkData.value = [] |
| | | listLoading.value = true |
| | | MG.identity |
| | | .getUserKey({ |
| | | domain: 'reMark', |
| | | keys: [bookConfig.value.bookId] |
| | | }) |
| | | .then((res) => { |
| | | if (res && res.length > 0 && res[0].value) { |
| | | reMarkData.value = JSON.parse(res[0].value) |
| | | let list = JSON.parse(res[0].value) |
| | | list.forEach((item) => { |
| | | let text = searchText.value.replace(/^\s*|\s*$/g, '') |
| | | if (searchText.value) { |
| | | if (item.content.indexOf(text) > -1) { |
| | | reMarkList.value.push(item) |
| | | } |
| | | } else { |
| | | reMarkList.value.push(item) |
| | | } |
| | | } else { |
| | | reMarkList.value.push(item) |
| | | } |
| | | }) |
| | | } |
| | | }) |
| | | } |
| | | listLoading.value = false |
| | | }) |
| | | } else { |
| | | ElMessageBox.confirm('请先登录!', { |
| | | confirmButtonText: '去登录', |
| | | cancelButtonText: '取消', |
| | | autofocus: false, |
| | | type: 'warning' |
| | | }) |
| | | .then(() => { |
| | | router.push('/login') |
| | | }) |
| | | .catch(() => {}) |
| | | } |
| | | } |
| | | |
| | | //跳转 |
| | | const goReMark = (item) => { |
| | | console.log(item) |
| | | if (window.qiankunState && window.qiankunState.gotoPage) { |
| | | window.qiankunState.gotoPage(Number(item.chapterNum), Number(item.page)) |
| | | } |
| | | } |
| | | // 内容页删除书签 |
| | | const delReMark = () => { |
| | |
| | | //截图 |
| | | //截图事件 |
| | | function jitT() { |
| | | const screenShotHandler = new ScreenShort({ |
| | | enableWebRtc: false, // 是否显示选项框 |
| | | level: 99, // 层级级别 |
| | | completeCallback: callback, //确认回调 |
| | | closeCallback: closeFn //取消回调 |
| | | } as any) |
| | | if (token) { |
| | | const screenShotHandler = new ScreenShort({ |
| | | enableWebRtc: false, // 是否显示选项框 |
| | | level: 999, // 层级级别 |
| | | completeCallback: callback, //确认回调 |
| | | closeCallback: closeFn //取消回调 |
| | | } as any) |
| | | } else { |
| | | ElMessageBox.confirm('请先登录!', { |
| | | confirmButtonText: '去登录', |
| | | cancelButtonText: '取消', |
| | | autofocus: false, |
| | | type: 'warning' |
| | | }) |
| | | .then(() => { |
| | | router.push('/login') |
| | | }) |
| | | .catch(() => {}) |
| | | } |
| | | } |
| | | //确认回调 |
| | | const callback = (val: any) => { |
| | |
| | | if (isUpdateImg.value) { |
| | | screenshotData.value = [] |
| | | screenshotList.value.forEach((itemNote) => { |
| | | if ((itemNote.id = screenshotId.value)) { |
| | | if (itemNote.id == screenshotId.value) { |
| | | itemNote.name = nameData.value |
| | | } |
| | | }) |
| | |
| | | } |
| | | |
| | | const getScreenshotList = () => { |
| | | screenshotData.value = [] |
| | | screenshotList.value = [] |
| | | imgPreviewList.value = [] |
| | | MG.identity |
| | | .getUserKey({ |
| | | domain: 'screenshot', |
| | | keys: [bookConfig.value.bookId] |
| | | }) |
| | | .then((res) => { |
| | | if (res && res.length > 0 && res[0].value) { |
| | | screenshotData.value = JSON.parse(res[0].value) |
| | | let list = JSON.parse(res[0].value) |
| | | list.forEach((item) => { |
| | | let text = searchText.value.replace(/^\s*|\s*$/g, '') |
| | | if (searchText.value) { |
| | | if (item.name.indexOf(text) > -1) { |
| | | if (token) { |
| | | screenshotData.value = [] |
| | | screenshotList.value = [] |
| | | imgPreviewList.value = [] |
| | | listLoading.value = true |
| | | MG.identity |
| | | .getUserKey({ |
| | | domain: 'screenshot', |
| | | keys: [bookConfig.value.bookId] |
| | | }) |
| | | .then((res) => { |
| | | if (res && res.length > 0 && res[0].value) { |
| | | screenshotData.value = JSON.parse(res[0].value) |
| | | let list = JSON.parse(res[0].value) |
| | | list.forEach((item) => { |
| | | let text = searchText.value.replace(/^\s*|\s*$/g, '') |
| | | if (searchText.value) { |
| | | if (item.name.indexOf(text) > -1) { |
| | | screenshotList.value.push(item) |
| | | imgPreviewList.value.push(item.imgUrl) |
| | | } |
| | | } else { |
| | | screenshotList.value.push(item) |
| | | imgPreviewList.value.push(item.imgUrl) |
| | | } |
| | | } else { |
| | | screenshotList.value.push(item) |
| | | imgPreviewList.value.push(item.imgUrl) |
| | | } |
| | | }) |
| | | } |
| | | }) |
| | | } |
| | | listLoading.value = false |
| | | }) |
| | | } else { |
| | | ElMessageBox.confirm('请先登录!', { |
| | | confirmButtonText: '去登录', |
| | | cancelButtonText: '取消', |
| | | autofocus: false, |
| | | type: 'warning' |
| | | }) |
| | | .then(() => { |
| | | router.push('/login') |
| | | }) |
| | | .catch(() => {}) |
| | | } |
| | | } |
| | | //查看截图 |
| | | const getCapture = (item, index) => { |
| | | imgUrl.value = item.imgUrl |
| | | imgUrl.value = item.imgUrl || item.resourcePath |
| | | previewIndex.value = index |
| | | confirmDialog.value = true |
| | | } |
| | | const closePreview = () => { |
| | | imgPreviewList.value = [] |
| | | confirmDialog.value = false |
| | | } |
| | | // 编辑截图名称 |
| | |
| | | dialogToolData.left = data.x |
| | | dialogToolData.top = data.y |
| | | showToolBox.value = true |
| | | dictionaryData.showContent = false |
| | | lineDelete.showLineDelete = false |
| | | dictionaryData.showContent = false |
| | | } |
| | | } |
| | | |
| | |
| | | |
| | | const synth = window.speechSynthesis |
| | | const dialogToolHandle = async (item) => { |
| | | toolActive.value = item.name |
| | | colorActive.value = '' |
| | | switch (item.name) { |
| | | case 'AI阅读': |
| | | const utterance = new SpeechSynthesisUtterance(dialogToolData.txt) |
| | | utterance.lang = 'zh-CN' // 设置语言为中文 |
| | | synth.speak(utterance) |
| | | showToolBox.value = false |
| | | break |
| | | case '划线': |
| | | break |
| | | case '高亮': |
| | | break |
| | | case '笔记': |
| | | formData.desc = '' |
| | | noteColorActive.value = '#F5E12A' |
| | | addNoteVisble.value = true |
| | | showToolBox.value = false |
| | | break |
| | | case '标注': |
| | | break |
| | | case '复制': |
| | | try { |
| | | //复制 |
| | | await toClipboard(dialogToolData.txt) |
| | | //下面可以设置复制成功的提示框等操作 |
| | | ElMessage({ |
| | | message: '复制成功', |
| | | type: 'success' |
| | | }) |
| | | } catch (err) { |
| | | ElMessage.error('无法复制文本:' + err) |
| | | } |
| | | showToolBox.value = false |
| | | toolActive.value = '' |
| | | break |
| | | case '词典': |
| | | getSearchResult() |
| | | if (token) { |
| | | toolActive.value = item.name |
| | | colorActive.value = '' |
| | | switch (item.name) { |
| | | case 'AI阅读': |
| | | window.speechSynthesis.cancel() |
| | | const synth = window.speechSynthesis |
| | | const utterance = new SpeechSynthesisUtterance(dialogToolData.txt) |
| | | console.log(utterance, 1) |
| | | utterance.lang = 'zh-CN' // 设置语言为中文 |
| | | synth.speak(utterance) |
| | | showToolBox.value = false |
| | | break |
| | | case '划线': |
| | | break |
| | | case '高亮': |
| | | break |
| | | case '笔记': |
| | | formData.desc = '' |
| | | noteColorActive.value = '#F5E12A' |
| | | addNoteVisble.value = true |
| | | showToolBox.value = false |
| | | break |
| | | case '标注': |
| | | break |
| | | case '复制': |
| | | try { |
| | | //复制 |
| | | await toClipboard(dialogToolData.txt) |
| | | //下面可以设置复制成功的提示框等操作 |
| | | ElMessage({ |
| | | message: '复制成功', |
| | | type: 'success' |
| | | }) |
| | | } catch (err) { |
| | | ElMessage.error('无法复制文本:' + err) |
| | | } |
| | | showToolBox.value = false |
| | | toolActive.value = '' |
| | | break |
| | | case '词典': |
| | | getSearchResult() |
| | | |
| | | showToolBox.value = false |
| | | // cidianVisible.value = true |
| | | console.log(dialogToolData.txt) |
| | | break |
| | | case '百科': |
| | | console.log('https://baike.baidu.com/item/' + dialogToolData.txt) |
| | | baiduVisible.value = true |
| | | break |
| | | showToolBox.value = false |
| | | // cidianVisible.value = true |
| | | console.log(dialogToolData.txt) |
| | | break |
| | | case '百科': |
| | | console.log('https://baike.baidu.com/item/' + dialogToolData.txt) |
| | | baiduVisible.value = true |
| | | break |
| | | } |
| | | } else { |
| | | ElMessageBox.confirm('请先登录!', { |
| | | confirmButtonText: '去登录', |
| | | cancelButtonText: '取消', |
| | | autofocus: false, |
| | | type: 'warning' |
| | | }) |
| | | .then(() => { |
| | | router.push('/login') |
| | | }) |
| | | .catch(() => { |
| | | showToolBox.value = false |
| | | }) |
| | | } |
| | | } |
| | | |
| | |
| | | } |
| | | |
| | | const addUserKey = () => { |
| | | let dom = '' |
| | | let data = null |
| | | switch (toolActive.value) { |
| | | case '高亮': |
| | | dom = 'highLightData-' + bookConfig.value.bookId |
| | | data = dialogToolData.lineHeight[dialogToolData.chapter] |
| | | if (!data) data = [] |
| | | data.push({ |
| | | id: toolClass.uuid(8), |
| | | txt: dialogToolData.txt, |
| | | page: dialogToolData.page, |
| | | chapterNum: dialogToolData.chapter, |
| | | type: 'Highlight', |
| | | color: colorActive.value |
| | | }) |
| | | break |
| | | case '划线': |
| | | dom = 'underline-' + bookConfig.value.bookId |
| | | data = dialogToolData.scribeList[dialogToolData.chapter] |
| | | if (!data) data = [] |
| | | data.push({ |
| | | id: toolClass.uuid(8), |
| | | txt: dialogToolData.txt, |
| | | page: dialogToolData.page, |
| | | chapterNum: dialogToolData.chapter, |
| | | type: 'Dashing', |
| | | color: colorActive.value |
| | | }) |
| | | break |
| | | case '笔记': |
| | | if (!formData.desc.replace(/^\s*|\s*$/g, '')) { |
| | | ElMessage.error('笔记内容不能为空!') |
| | | return |
| | | } |
| | | if (!noteColorActive.value) { |
| | | ElMessage.error('请选择笔记颜色!') |
| | | return |
| | | } |
| | | dom = 'notes-' + bookConfig.value.bookId |
| | | data = dialogToolData.notesList[dialogToolData.chapter] |
| | | if (!data) data = [] |
| | | data.push({ |
| | | id: toolClass.uuid(8), |
| | | txt: dialogToolData.txt, |
| | | page: dialogToolData.page, |
| | | chapterNum: dialogToolData.chapter, |
| | | type: 'Note', |
| | | color: noteColorActive.value, |
| | | createDate: new Date(), |
| | | note: formData.desc.replace(/^\s*|\s*$/g, '') |
| | | }) |
| | | |
| | | break |
| | | } |
| | | MG.identity |
| | | .setUserKey({ |
| | | setKeyRequests: [ |
| | | { |
| | | domain: dom, |
| | | key: dialogToolData.chapter, |
| | | value: JSON.stringify(data) |
| | | if (token) { |
| | | let dom = '' |
| | | let data = null |
| | | switch (toolActive.value) { |
| | | case '高亮': |
| | | dom = 'highLightData-' + bookConfig.value.bookId |
| | | data = dialogToolData.lineHeight[dialogToolData.chapter] |
| | | if (!data) data = [] |
| | | data.push({ |
| | | id: toolClass.uuid(8), |
| | | txt: dialogToolData.txt, |
| | | page: dialogToolData.page, |
| | | chapterNum: dialogToolData.chapter, |
| | | type: 'Highlight', |
| | | color: colorActive.value |
| | | }) |
| | | break |
| | | case '划线': |
| | | dom = 'underline-' + bookConfig.value.bookId |
| | | data = dialogToolData.scribeList[dialogToolData.chapter] |
| | | if (!data) data = [] |
| | | data.push({ |
| | | id: toolClass.uuid(8), |
| | | txt: dialogToolData.txt, |
| | | page: dialogToolData.page, |
| | | chapterNum: dialogToolData.chapter, |
| | | type: 'Dashing', |
| | | color: colorActive.value |
| | | }) |
| | | break |
| | | case '笔记': |
| | | if (!formData.desc.replace(/^\s*|\s*$/g, '')) { |
| | | ElMessage.error('笔记内容不能为空!') |
| | | return |
| | | } |
| | | ] |
| | | if (!noteColorActive.value) { |
| | | ElMessage.error('请选择笔记颜色!') |
| | | return |
| | | } |
| | | dom = 'notes-' + bookConfig.value.bookId |
| | | data = dialogToolData.notesList[dialogToolData.chapter] |
| | | if (!data) data = [] |
| | | data.push({ |
| | | id: toolClass.uuid(8), |
| | | txt: dialogToolData.txt, |
| | | page: dialogToolData.page, |
| | | chapterNum: dialogToolData.chapter, |
| | | type: 'Note', |
| | | color: noteColorActive.value, |
| | | createDate: new Date(), |
| | | note: formData.desc.replace(/^\s*|\s*$/g, '') |
| | | }) |
| | | |
| | | break |
| | | } |
| | | MG.identity |
| | | .setUserKey({ |
| | | setKeyRequests: [ |
| | | { |
| | | domain: dom, |
| | | key: dialogToolData.chapter, |
| | | value: JSON.stringify(data) |
| | | } |
| | | ] |
| | | }) |
| | | .then((res) => { |
| | | showToolBox.value = false |
| | | addNoteVisble.value = false |
| | | colorActive.value = '' |
| | | noteColorActive.value = '' |
| | | toolActive.value = '' |
| | | getSignData() |
| | | getNotesList() |
| | | }) |
| | | } else { |
| | | ElMessageBox.confirm('请先登录!', { |
| | | confirmButtonText: '去登录', |
| | | cancelButtonText: '取消', |
| | | autofocus: false, |
| | | type: 'warning' |
| | | }) |
| | | .then((res) => { |
| | | showToolBox.value = false |
| | | addNoteVisble.value = false |
| | | colorActive.value = '' |
| | | noteColorActive.value = '' |
| | | toolActive.value = '' |
| | | getSignData() |
| | | getNotesList() |
| | | }) |
| | | .then(() => { |
| | | router.push('/login') |
| | | }) |
| | | .catch(() => {}) |
| | | } |
| | | } |
| | | |
| | | const getSignData = () => { |
| | | MG.identity |
| | | .getUserKey({ |
| | | domain: 'highLightData-' + bookConfig.value.bookId, |
| | | keys: activeCatalog.value.map((item) => item + '') |
| | | }) |
| | | .then((res) => { |
| | | if (res && res.length > 0) { |
| | | for (let i = 0; i < res.length; i++) { |
| | | const item = res[i] |
| | | const data = JSON.parse(item.value) |
| | | // 储值 |
| | | dialogToolData.lineHeight[item.key] = data |
| | | // 渲染 |
| | | for (let j = 0; j < data.length; j++) { |
| | | const citem = data[j] |
| | | console.log(citem.type, citem) |
| | | if (window.qiankunState && window.qiankunState.renderSign) |
| | | window.qiankunState.renderSign(citem.type, citem) |
| | | if (token) { |
| | | MG.identity |
| | | .getUserKey({ |
| | | domain: 'highLightData-' + bookConfig.value.bookId, |
| | | keys: activeCatalog.value.map((item) => item + '') |
| | | }) |
| | | .then((res) => { |
| | | if (res && res.length > 0) { |
| | | for (let i = 0; i < res.length; i++) { |
| | | const item = res[i] |
| | | const data = JSON.parse(item.value) |
| | | // 储值 |
| | | dialogToolData.lineHeight[item.key] = data |
| | | // 渲染 |
| | | for (let j = 0; j < data.length; j++) { |
| | | const citem = data[j] |
| | | if (window.qiankunState && window.qiankunState.renderSign) |
| | | window.qiankunState.renderSign(citem.type, citem) |
| | | } |
| | | } |
| | | } |
| | | } |
| | | }) |
| | | MG.identity |
| | | .getUserKey({ |
| | | domain: 'underline-' + bookConfig.value.bookId, |
| | | keys: activeCatalog.value.map((item) => item + '') |
| | | }) |
| | | .then((res) => { |
| | | if (res && res.length > 0) { |
| | | for (let i = 0; i < res.length; i++) { |
| | | const item = res[i] |
| | | const data = JSON.parse(item.value) |
| | | // 储值 |
| | | dialogToolData.scribeList[item.key] = data |
| | | }) |
| | | MG.identity |
| | | .getUserKey({ |
| | | domain: 'underline-' + bookConfig.value.bookId, |
| | | keys: activeCatalog.value.map((item) => item + '') |
| | | }) |
| | | .then((res) => { |
| | | if (res && res.length > 0) { |
| | | for (let i = 0; i < res.length; i++) { |
| | | const item = res[i] |
| | | const data = JSON.parse(item.value) |
| | | // 储值 |
| | | dialogToolData.scribeList[item.key] = data |
| | | |
| | | // 渲染 |
| | | for (let j = 0; j < data.length; j++) { |
| | | const citem = data[j] |
| | | if (window.qiankunState && window.qiankunState.renderSign) |
| | | window.qiankunState.renderSign(citem.type, citem) |
| | | // 渲染 |
| | | if (data.length > 0) { |
| | | for (let j = 0; j < data.length; j++) { |
| | | const citem = data[j] |
| | | if (window.qiankunState && window.qiankunState.renderSign) |
| | | window.qiankunState.renderSign(citem.type, citem) |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | }) |
| | | MG.identity |
| | | .getUserKey({ |
| | | domain: 'notes-' + bookConfig.value.bookId, |
| | | keys: activeCatalog.value.map((item) => item + '') |
| | | }) |
| | | .then((res) => { |
| | | if (res && res.length > 0) { |
| | | for (let i = 0; i < res.length; i++) { |
| | | const item = res[i] |
| | | const data = JSON.parse(item.value) |
| | | // 储值 |
| | | dialogToolData.notesList[item.key] = data |
| | | // 渲染 |
| | | for (let j = 0; j < data.length; j++) { |
| | | const citem = data[j] |
| | | if (window.qiankunState && window.qiankunState.renderSign) |
| | | window.qiankunState.renderSign(citem.type, citem) |
| | | }) |
| | | MG.identity |
| | | .getUserKey({ |
| | | domain: 'notes-' + bookConfig.value.bookId, |
| | | keys: activeCatalog.value.map((item) => item + '') |
| | | }) |
| | | .then((res) => { |
| | | if (res && res.length > 0) { |
| | | for (let i = 0; i < res.length; i++) { |
| | | const item = res[i] |
| | | const data = JSON.parse(item.value) |
| | | // 储值 |
| | | dialogToolData.notesList[item.key] = data |
| | | // 渲染 |
| | | if (data.length > 0) { |
| | | for (let j = 0; j < data.length; j++) { |
| | | const citem = data[j] |
| | | if (window.qiankunState && window.qiankunState.renderSign) |
| | | window.qiankunState.renderSign(citem.type, citem) |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | }) |
| | | } else { |
| | | ElMessageBox.confirm('请先登录!', { |
| | | confirmButtonText: '去登录', |
| | | cancelButtonText: '取消', |
| | | autofocus: false, |
| | | type: 'warning' |
| | | }) |
| | | .then(() => { |
| | | router.push('/login') |
| | | }) |
| | | .catch(() => {}) |
| | | } |
| | | } |
| | | |
| | | //菜单笔记列表 |
| | | const getNotesList = () => { |
| | | let chapterList = [] |
| | | catalogueData.value.forEach((item) => { |
| | | chapterList.push(item.chapter + '') |
| | | }) |
| | | let uniqueArray = [...new Set(chapterList)] |
| | | scribeData.noteList = [] |
| | | MG.identity |
| | | .getUserKey({ |
| | | domain: 'notes-' + bookConfig.value.bookId, |
| | | keys: uniqueArray |
| | | if (token) { |
| | | let chapterList = [] |
| | | listLoading.value = true |
| | | catalogueData.value.forEach((item) => { |
| | | chapterList.push(item.chapter + '') |
| | | }) |
| | | .then((res) => { |
| | | if (res && res.length > 0) { |
| | | for (let i = 0; i < res.length; i++) { |
| | | const item = res[i] |
| | | // 储值 |
| | | let data = catalogueData.value.find((item1) => item1.chapter == Number(item.key)) |
| | | // console.log(data,'666') |
| | | let dataList = [] |
| | | if (catalogueData.value.length > 0) { |
| | | catalogueData.value.forEach((item1) => { |
| | | if (item1.chapter == Number(item.key)) { |
| | | dataList.push(item1) |
| | | } |
| | | }) |
| | | } |
| | | let labels = '' |
| | | if (dataList.length > 1) labels = dataList.map((item) => item.label).join('/') |
| | | let uniqueArray = [...new Set(chapterList)] |
| | | scribeData.noteList = [] |
| | | MG.identity |
| | | .getUserKey({ |
| | | domain: 'notes-' + bookConfig.value.bookId, |
| | | keys: uniqueArray |
| | | }) |
| | | .then((res) => { |
| | | if (res && res.length > 0) { |
| | | for (let i = 0; i < res.length; i++) { |
| | | const item = res[i] |
| | | // 储值 |
| | | let data = catalogueData.value.find((item1) => item1.chapter == Number(item.key)) |
| | | // console.log(data,'666') |
| | | let dataList = [] |
| | | if (catalogueData.value.length > 0) { |
| | | catalogueData.value.forEach((item1) => { |
| | | if (item1.chapter == Number(item.key)) { |
| | | dataList.push(item1) |
| | | } |
| | | }) |
| | | } |
| | | let labels = '' |
| | | if (dataList.length > 1) labels = dataList.map((item) => item.label).join('/') |
| | | |
| | | let list = JSON.parse(item.value) |
| | | let itemList = [] |
| | | if (list.length > 0) { |
| | | list.forEach((item) => { |
| | | if (searchText.value) { |
| | | let text = searchText.value.replace(/^\s*|\s*$/g, '') |
| | | if (item.note.indexOf(text) > -1 || item.txt.indexOf(text) > -1) { |
| | | let list = JSON.parse(item.value) |
| | | let itemList = [] |
| | | if (list.length > 0) { |
| | | list.forEach((item) => { |
| | | if (searchText.value) { |
| | | let text = searchText.value.replace(/^\s*|\s*$/g, '') |
| | | if (item.note.indexOf(text) > -1 || item.txt.indexOf(text) > -1) { |
| | | if (menuState.notesColor == 'all') { |
| | | itemList.push(item) |
| | | } else if (item.color == menuState.notesColor) { |
| | | itemList.push(item) |
| | | } |
| | | } |
| | | } else { |
| | | if (menuState.notesColor == 'all') { |
| | | itemList = list |
| | | itemList.push(item) |
| | | } else if (item.color == menuState.notesColor) { |
| | | itemList.push(item) |
| | | } |
| | | } |
| | | } else { |
| | | if (menuState.notesColor == 'all') { |
| | | itemList = list |
| | | } else if (item.color == menuState.notesColor) { |
| | | itemList.push(item) |
| | | } |
| | | } |
| | | }) |
| | | }) |
| | | } |
| | | if (dataList[0].chapter == Number(item.key) && itemList.length > 0) { |
| | | scribeData.noteList.push({ |
| | | chapter: dataList[0].chapter, |
| | | chapterName: labels ? labels : dataList[0].label, |
| | | noteList: itemList |
| | | }) |
| | | } |
| | | } |
| | | if (dataList[0].chapter == Number(item.key) && itemList.length > 0) { |
| | | scribeData.noteList.push({ |
| | | chapter: dataList[0].chapter, |
| | | chapterName: labels ? labels : dataList[0].label, |
| | | noteList: itemList |
| | | }) |
| | | } |
| | | console.log(scribeData.noteList, 'scribeData.noteList') |
| | | } |
| | | console.log(scribeData.noteList, 'scribeData.noteList') |
| | | } |
| | | listLoading.value = false |
| | | }) |
| | | } else { |
| | | ElMessageBox.confirm('请先登录!', { |
| | | confirmButtonText: '去登录', |
| | | cancelButtonText: '取消', |
| | | autofocus: false, |
| | | type: 'warning' |
| | | }) |
| | | .then(() => { |
| | | router.push('/login') |
| | | }) |
| | | .catch(() => {}) |
| | | } |
| | | } |
| | | |
| | | //正文中删除高亮,划线,笔记操作框 |
| | |
| | | lineDelete.id = id |
| | | lineDelete.showLineDelete = true |
| | | if (type == 'Note') { |
| | | noteContent.show = false |
| | | let list = dialogToolData.notesList[chapterNum] |
| | | let data = list.find((item) => item.id == id) |
| | | formData.id = id |
| | |
| | | color: '' |
| | | }) |
| | | window.noteHover = (type, id, chapterNum) => { |
| | | console.log(type, 'typetype') |
| | | let list = dialogToolData.notesList[chapterNum] |
| | | let data = list.find((item) => item.id == id) |
| | | noteContent.note = data.note |
| | | noteContent.color = data.color |
| | | noteContent.show = true |
| | | document.addEventListener('mousemove', function (event) { |
| | | var x = event.offsetX |
| | | var y = event.offsetY |
| | | // console.log('鼠标坐标位置:', x, y) |
| | | noteContent.top = event.clientY + 10 |
| | | noteContent.top = event.clientY + 20 |
| | | noteContent.left = event.clientX |
| | | noteContent.show = true |
| | | }) |
| | | } |
| | | window.noteOut = () => { |
| | | console.log(123) |
| | | window.noteOut = (type) => { |
| | | console.log(type, 123) |
| | | noteContent.show = false |
| | | } |
| | | |
| | |
| | | if (window.qiankunState && window.qiankunState.delSign) { |
| | | window.qiankunState.delSign({ ids: [ids] }) |
| | | } |
| | | getSignData() |
| | | if (!window.qiankunState.disableSign) { |
| | | getSignData() |
| | | } |
| | | if (type == 'Note') { |
| | | getNotesList() |
| | | } |
| | |
| | | const updateUserKey = () => { |
| | | let data = scribeData.noteList.find((item1) => item1.chapter == dialogToolData.chapter) |
| | | data.noteList.forEach((itemNote) => { |
| | | if ((itemNote.id = formData.id)) { |
| | | if (itemNote.id == formData.id) { |
| | | itemNote.note = formData.desc |
| | | itemNote.color = noteColorActive.value |
| | | } |
| | |
| | | addNoteVisble.value = false |
| | | isUpdate.value = false |
| | | getNotesList() |
| | | getSignData() |
| | | if (!window.qiankunState.disableSign) { |
| | | getSignData() |
| | | } |
| | | }) |
| | | } |
| | | |
| | |
| | | }) |
| | | } |
| | | } |
| | | |
| | | //单词阅读 |
| | | const soundWord = (word, en) => { |
| | | window.speechSynthesis.cancel() |
| | | const synth = window.speechSynthesis |
| | | const utterances = new SpeechSynthesisUtterance(word) |
| | | // utterances.lang = en // 设置语言为中文 |
| | | synth.speak(utterances) |
| | | } |
| | | //内容区域顶部显示 |
| | | |
| | | const headerData = reactive({ |
| | |
| | | } |
| | | |
| | | const layoutBtn = () => { |
| | | localStorage.clear() |
| | | localStorage.removeItem('token') |
| | | localStorage.removeItem('userInfo') |
| | | router.push('/login') |
| | | } |
| | | const goLogin = () => { |
| | | localStorage.removeItem('userInfo') |
| | | router.push('/login') |
| | | } |
| | | </script> |
| | |
| | | display: flex; |
| | | flex-direction: column; |
| | | padding: 0 15px; |
| | | |
| | | .headerBox { |
| | | height: 48px; |
| | | // background-image: url('@/assets/images/header/top-bg.png'); |
| | |
| | | box-shadow: 10px 0 10px -10px rgba(0, 0, 0, 0.07); |
| | | background: #fff; |
| | | border-radius: 16px 0px 0px 0px; |
| | | -moz-user-select: none; |
| | | -khtml-user-select: none; |
| | | user-select: none; |
| | | |
| | | .menuItem { |
| | | text-align: center; |
| | | line-height: 1; |
| | |
| | | display: inline-block; |
| | | width: 32px; |
| | | height: 32px; |
| | | .name { |
| | | text-align: center; |
| | | line-height: 1; |
| | | color: #2c3e50; |
| | | } |
| | | } |
| | | .name { |
| | | text-align: center; |
| | | line-height: 1; |
| | | color: #2c3e50; |
| | | } |
| | | } |
| | | .reload { |
| | |
| | | height: calc(100vh - 48px); |
| | | overflow-y: auto; |
| | | background: #e0f2ff; |
| | | -moz-user-select: none; |
| | | -khtml-user-select: none; |
| | | user-select: none; |
| | | .searchBox { |
| | | width: 100%; |
| | | height: 60px; |
| | |
| | | align-items: center; |
| | | border-bottom: 1px solid #efefef; |
| | | } |
| | | .resourceBox { |
| | | .resourceSearchBox { |
| | | padding: 10px 0; |
| | | margin: 0 20px; |
| | | border-bottom: 1px solid rgba(204, 204, 204, 0.32); |
| | |
| | | background: #fff; |
| | | height: 34px; |
| | | } |
| | | |
| | | .is-focus, |
| | | .el-input__wrapper { |
| | | box-shadow: none !important; |
| | |
| | | border: none !important; |
| | | height: 34px !important; |
| | | } |
| | | } |
| | | .el-input-group__append { |
| | | padding: 0 10px !important; |
| | | background: none !important; |
| | | } |
| | | } |
| | | .screenBox { |
| | |
| | | border-radius: 10px; |
| | | padding: 10px; |
| | | display: flex; |
| | | justify-content: space-between; |
| | | .reMarkCon { |
| | | width: 240px; |
| | | // white-space: nowrap; |
| | | // overflow: hidden; |
| | | // text-overflow: ellipsis; |
| | | margin-right: 8px; |
| | | display: flex; |
| | | .con { |
| | | width: 200px; |
| | | white-space: nowrap; |
| | | overflow: hidden; |
| | | text-overflow: ellipsis; |
| | | margin-right: 8px; |
| | | } |
| | | } |
| | | .deleteReMarkImg { |
| | | display: flex; |
| | | align-items: center; |
| | | } |
| | | .questionCon { |
| | | width: 240px; |
| | | white-space: nowrap; |
| | | overflow: hidden; |
| | | text-overflow: ellipsis; |
| | | } |
| | | } |
| | | |
| | | .allSearchList { |
| | | .searchItem { |
| | | margin: 15px; |
| | | background: #fff; |
| | | border-radius: 10px; |
| | | padding: 10px; |
| | | display: flex; |
| | | .index { |
| | | line-height: 24px; |
| | | margin-right: 10px; |
| | | } |
| | | .searchCon { |
| | | flex: 1; |
| | | width: 240px; |
| | | overflow: hidden; |
| | | margin-right: 8px; |
| | | height: 45px; |
| | | line-height: 22px; |
| | | display: -webkit-box; |
| | | -webkit-box-orient: vertical; |
| | | -webkit-line-clamp: 2; |
| | | text-overflow: ellipsis; |
| | | .searchColor { |
| | | background: rgb(245, 225, 42, 0.5); |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | .allSearch, |
| | | .notesBox, |
| | | .resourceBox, |
| | | .reMarkList, |
| | | .questionList, |
| | | .screenshotList { |
| | | height: calc(100% - 60px); |
| | | overflow-y: auto; |
| | | } |
| | | } |
| | | .menuStateBox { |
| | |
| | | |
| | | div { |
| | | padding: 5px; |
| | | display: flex; |
| | | align-items: center; |
| | | img { |
| | | width: 18px; |
| | | height: 18px; |
| | |
| | | box-shadow: -3px 0px 6px 1px rgba(0, 0, 0, 0.07); |
| | | background: #fff; |
| | | border-radius: 0px 16px 0px 0px; |
| | | -moz-user-select: none; |
| | | -khtml-user-select: none; |
| | | user-select: none; |
| | | .toolTitle { |
| | | height: 57px; |
| | | line-height: 53px; |
| | |
| | | width: 190px; |
| | | display: flex; |
| | | background: #ffffff; |
| | | |
| | | box-shadow: 0px 0px 10px 1px rgba(0, 0, 0, 0.16); |
| | | border-radius: 5px; |
| | | margin-bottom: 10px; |
| | |
| | | z-index: 2; |
| | | box-shadow: 0px 0px 6px 1px rgba(0, 0, 0, 0.3); |
| | | padding: 5px 10px; |
| | | background: #fff; |
| | | // background: #fff; |
| | | background-color: rgba(90, 90, 90, 0.9); |
| | | border-radius: 5px; |
| | | display: flex; |
| | | .dialogToolItem { |
| | | padding: 3px; |
| | | margin: 0 10px; |
| | | margin: 0 5px; |
| | | border-radius: 5px; |
| | | display: flex; |
| | | justify-content: center; |
| | | align-items: center; |
| | | } |
| | | .dialogToolItem:hover { |
| | | background-color: rgba(44, 44, 44, 0.2); |
| | | background-color: rgba(255, 255, 255, 0.3); |
| | | } |
| | | } |
| | | .noteContentBox { |
| | | max-width: 240px; |
| | | position: fixed; |
| | | z-index: 2; |
| | | padding: 10px; |
| | |
| | | padding: 5px 20px; |
| | | background: #fff; |
| | | border-radius: 5px; |
| | | .word { |
| | | font-weight: bold; |
| | | } |
| | | .phone_con { |
| | | .per-phone { |
| | | width: 150px; |
| | | align-items: center; |
| | | // justify-content: space-between; |
| | | background: #f4f5f7; |
| | | border-radius: 15px; |
| | | box-sizing: border-box; |
| | |
| | | padding: 8px 10px; |
| | | span { |
| | | margin: 0 10px; |
| | | flex: 1; |
| | | } |
| | | } |
| | | .soundBtn { |
| | | width: 16px; |
| | | height: 14px; |
| | | } |
| | | } |
| | | .trans { |
| | |
| | | } |
| | | .wendabox { |
| | | width: 100%; |
| | | height: 700px; |
| | | height: 80vh; |
| | | |
| | | iframe { |
| | | width: 100%; |
| | | height: 100%; |
| | |
| | | box-sizing: border-box; |
| | | } |
| | | } |
| | | .myDialogs { |
| | | height: 90vh; |
| | | } |
| | | .myAnserDialogs { |
| | | width: 628px; |
| | | width: 700px; |
| | | height: 90vh; |
| | | } |
| | | .myNoteDialogs { |
| | | width: 500px !important; |
| | |
| | | video { |
| | | width: 100%; |
| | | } |
| | | audio { |
| | | width: 100%; |
| | | } |
| | | } |
| | | .audioBox { |
| | | // display:none; |
| | | } |
| | | |
| | | .wordBox { |