| | |
| | | <template> |
| | | <div class="homeBox"> |
| | | <div class="headerBox"> |
| | | <div><img :src="logo" /></div> |
| | | <!-- <span class="logoTxt">北京师范大学出版集团</span> --> |
| | | <img :src="logo" /> |
| | | <div class="userInfoBox"> |
| | | <div></div> |
| | | <div></div> |
| | | <div><div class="layout">退出</div></div> |
| | | <div><div class="layout hover" @click="layoutBtn">退出</div></div> |
| | | </div> |
| | | </div> |
| | | <div class="contentBox"> |
| | |
| | | </div> |
| | | <div class="reload hover" @click="reload()">刷新</div> |
| | | <!-- 设置 --> |
| | | <el-popover placement="right" :width="200" trigger="click"> |
| | | <el-popover placement="right" :width="300" trigger="click"> |
| | | <div class="settingBox"> |
| | | <el-form :model="settingForm" label-width="auto" style="max-width: 400px"> |
| | | <el-form-item label="答题音效"> |
| | | <el-switch v-model="settingForm.acoustics" /> |
| | | <el-form-item label="字体大小"> |
| | | <div class="lineStyle"> |
| | | <div class="lineTypeBox"> |
| | | <div |
| | | v-for="item in settingForm.fontSizeList" |
| | | :key="item.key" |
| | | :class=" |
| | | settingForm.fontSizeActive == item.key |
| | | ? 'typeItem lineTypeActive' |
| | | : 'typeItem' |
| | | " |
| | | @click="fontSizeSelect(item)" |
| | | > |
| | | {{ item.lable }} |
| | | <div class="activeIcon" v-if="settingForm.fontSizeActive == item.key"> |
| | | <img :src="xuanzhong" /> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </el-form-item> |
| | | <el-form-item label="答题动画"> |
| | | <el-switch v-model="settingForm.animation" /> |
| | | <div class="inline"> |
| | | <el-form-item label="答题音效"> |
| | | <el-switch v-model="settingForm.acoustics" /> |
| | | </el-form-item> |
| | | <el-form-item label="答题动画"> |
| | | <el-switch v-model="settingForm.animation" /> |
| | | </el-form-item> |
| | | </div> |
| | | <el-form-item label="底色"> |
| | | <div class="bgColor"> |
| | | <div |
| | | v-for="item in settingForm.bgColorList" |
| | | :key="item.key" |
| | | class="flex1 hover" |
| | | @click="bgColorSelect(item)" |
| | | > |
| | | <div |
| | | :style="{ |
| | | background: item.key, |
| | | 'border-color': |
| | | item.key == settingForm.bgColorActive ? '#0093FF' : '#EBEBEB' |
| | | }" |
| | | class="scribeItem" |
| | | > |
| | | <img :src="xuanzhong1" v-if="item.key == settingForm.bgColorActive" /> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | </el-form-item> |
| | | </el-form> |
| | | </div> |
| | |
| | | <div class="list-box" v-loading="scribeData.loading"> |
| | | <div v-if="scribeData.noteList.length > 0 && !scribeData.loading"> |
| | | <div v-for="(item, index) in scribeData.noteList" :key="item.key" class="listItem"> |
| | | <div class="itemBox noteStyle"> |
| | | <div class="textBox"> |
| | | <div class="title"> |
| | | <div class="title-con"> |
| | | <div class="round" :style="{ background: item.color }"></div> |
| | | <span>{{ item.name }}</span> |
| | | </div> |
| | | <div> |
| | | <el-icon size="18" color="#0093ff" @click="jumpContent('note' + index)" |
| | | ><LocationInformation |
| | | /></el-icon> |
| | | <img :src="bianji" @click="update(item, 'note')" /> |
| | | <img :src="shanchu" @click="deleteBtn(item, 'note')" /> |
| | | </div> |
| | | <div class="textBox"> |
| | | <div class="title"> |
| | | <div class="title-con"> |
| | | <div class="border-left" :style="{ 'border-right-color': item.color }"></div> |
| | | <span>{{ item.createDate }}</span> |
| | | </div> |
| | | <div class="noteText"> |
| | | <div class="con">{{ item.note }}</div> |
| | | </div> |
| | | <div class="chapter"> |
| | | <span class="createDate">{{ item.createDate }}</span> |
| | | <span class="chapterName">{{ item.chapter }}</span> |
| | | <div> |
| | | <img :src="bianji" @click="update(item, 'note')" /> |
| | | <img :src="shanchu" @click="deleteBtn(item, 'note')" /> |
| | | </div> |
| | | </div> |
| | | <div |
| | | class="noteText hover" |
| | | @click="jumpContent('note' + index)" |
| | | :style="{ |
| | | background: |
| | | item.color == '#F5E12A' |
| | | ? 'rgba(255,234,41,0.1)' |
| | | : item.color == '#76F0AE' |
| | | ? 'rgba(83,255,162,0.1)' |
| | | : item.color == '#59CFF5' |
| | | ? 'rgba(93,216,255,0.1)' |
| | | : item.color == '#CAA5FC' |
| | | ? 'rgba(205,167,255,0.1)' |
| | | : item.color == '#F5A0B9' |
| | | ? 'rgba(255,167,193,0.1)' |
| | | : item.color |
| | | }" |
| | | > |
| | | <div class="con">{{ item.note }}</div> |
| | | </div> |
| | | <div class="chapter">{{ item.selectText }}</div> |
| | | </div> |
| | | </div> |
| | | </div> |
| | |
| | | <div class="inputBox" v-if="!searchShow"> |
| | | <el-input class="custom-input" placeholder="请输入内容" v-model="searchText"> |
| | | <template #prefix> |
| | | <el-icon @click="searchBook"><Search /></el-icon> |
| | | <el-icon @click="searchBook" class="hover"><Search /></el-icon> |
| | | </template> |
| | | </el-input> |
| | | </div> |
| | | </div> |
| | | <div class="list-box"> |
| | | <div v-if="resourceData.length > 0" class="resourceList"> |
| | | <div v-if="resourceDataList.length > 0" class="resourceList"> |
| | | <el-row :gutter="20"> |
| | | <el-col :span="12" v-for="(item, index) in resourceData" :key="item"> |
| | | <div class="resourceItem hover"> |
| | | <el-col :span="12" v-for="(item, index) in resourceDataList" :key="item"> |
| | | <div class="resourceItem hover" @click="goResourceDetail(item)"> |
| | | <div class="resourceImg"> |
| | | <img :src="video" mode="" /> |
| | | </div> |
| | | <div class="rName" @click="goResourceDetail(item)">{{ item.name }}</div> |
| | | <div class="rName" v-if="searchText !=''" v-html="item.name"></div> |
| | | <div class="rName" v-else>{{ item.name }}</div> |
| | | </div> |
| | | </el-col> |
| | | </el-row> |
| | |
| | | class="captureItem" |
| | | @click="getCapture(item)" |
| | | > |
| | | <img :src="item.imgUrl" class="capture" mode="aspectFill" /> |
| | | <div class="imgBox"> |
| | | <img :src="item.imgUrl" class="capture" mode="aspectFill" /> |
| | | </div> |
| | | <div class="captureName">{{ item.name }}</div> |
| | | </div> |
| | | </div> |
| | | <div v-else> |
| | |
| | | <!-- 教学组件 --> |
| | | <div class="toolBox"> |
| | | <div class="toolTitle"> |
| | | 教学组件 |
| | | <span>{{ toolState.open ? '教学组件' : '组件' }}</span> |
| | | <div class="text"></div> |
| | | </div> |
| | | <div class="menuList"> |
| | |
| | | v-show="showToolBox" |
| | | :style="{ top: `${dialogToolData.top}px`, left: `${dialogToolData.left}px` }" |
| | | > |
| | | <div |
| | | class="colorSelectBox" |
| | | v-show="toolActive == '高亮' || toolActive == '划线' || toolActive == '笔记'" |
| | | > |
| | | <div class="colorSelectBox" v-show="toolActive == '高亮' || toolActive == '划线'"> |
| | | <div |
| | | v-for="item in colorSelectList" |
| | | :key="item.key" |
| | |
| | | @click="clickSelect(item)" |
| | | > |
| | | <div :style="{ background: item.key }" class="scribeItem"> |
| | | <img :src="xuanzhong" v-if="item.key == colorActive" /> |
| | | <img :src="xuanzhong1" v-if="item.key == colorActive" /> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | <div class="toolSelectBox"> |
| | | <div class="toolSelectBox" v-show="!(toolActive == '高亮' || toolActive == '划线')"> |
| | | <div |
| | | :class="item.name == toolActive ? 'dialogToolItem active' : 'dialogToolItem'" |
| | | v-for="item in dialogToolList" |
| | |
| | | </div> |
| | | </div> |
| | | </div> |
| | | <el-dialog title="资源" align-center v-model="resourVisble" width="840"> |
| | | <el-dialog title="资源" align-center v-model="resourVisble" width="845" class="resourDialog"> |
| | | <div class="videoBox" v-if="resourType == 'video'"> |
| | | <video controls object-fit="fill" :src="testVideo"></video> |
| | | </div> |
| | |
| | | class="myNoteDialogs" |
| | | > |
| | | <div class="formBox"> |
| | | <el-form ref="form" :model="formData" label-width="80px"> |
| | | <el-form-item label="笔记标题"> |
| | | <el-input v-model="formData.name"></el-input> |
| | | </el-form-item> |
| | | <el-form-item label="笔记内容"> |
| | | <el-input type="textarea" v-model="formData.desc"></el-input> |
| | | </el-form-item> |
| | | </el-form> |
| | | <el-input |
| | | type="textarea" |
| | | :rows="4" |
| | | v-model="formData.desc" |
| | | placeholder="请输入笔记内容" |
| | | ></el-input> |
| | | </div> |
| | | <div class="noteColorSelectBox"> |
| | | <div |
| | | v-for="item in colorSelectList" |
| | | :key="item.key" |
| | | class="flex1 hover" |
| | | @click="clickSelect(item)" |
| | | > |
| | | <div :style="{ background: item.key }" class="scribeItem"> |
| | | <img :src="xuanzhong" v-if="item.key == colorActive" /> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | <template #footer> |
| | | <span class="dialog-footer"> |
| | |
| | | width="60%" |
| | | :closeOnClickModal="false" |
| | | title="图片" |
| | | class="resourDialog" |
| | | > |
| | | <div class="imgUrlBox"> |
| | | <img :src="imgUrl" mode="aspectFill" /> |
| | | </div> |
| | | </el-dialog> |
| | | <el-dialog |
| | | title="保存截图" |
| | | align-center |
| | | v-model="screenshotVisble" |
| | | :before-close="screenshotClose" |
| | | width="400" |
| | | class="resourDialog" |
| | | > |
| | | <div class="formBox"> |
| | | <el-input v-model="nameData" placeholder="请输入截图名称"></el-input> |
| | | </div> |
| | | <template #footer> |
| | | <span class="dialog-footer"> |
| | | <el-button @click="screenshotClose">取 消</el-button> |
| | | <el-button type="primary" @click="addScreenshot">确 定</el-button> |
| | | </span> |
| | | </template> |
| | | </el-dialog> |
| | | <el-dialog title="百度百科" align-center v-model="baiduVisible" width="60%" class="myDialogs"> |
| | | <div class="wendabox"> |
| | | <iframe :src="'https://baike.baidu.com/item/'+ selectText" frameborder="0"></iframe> |
| | | </div> |
| | | </el-dialog> |
| | | <el-dialog title="AI智能问答" align-center v-model="wendaVisible" width="26%" class="myDialogs"> |
| | |
| | | </el-dialog> |
| | | <el-dialog title="词典" align-center v-model="cidianVisible" width="60%" class="myDialogs"> |
| | | <div class="wendabox"> |
| | | <iframe src="https://www.vocabulary.com/" frameborder="0"></iframe> |
| | | <!-- <iframe src="https://www.vocabulary.com/" frameborder="0"></iframe> --> |
| | | <dictionary :searchCon="selectText" /> |
| | | </div> |
| | | </el-dialog> |
| | | <el-dialog |
| | |
| | | |
| | | <script setup lang="ts"> |
| | | import { ref, reactive, watch, onMounted, inject } from 'vue' |
| | | import { ctxUrl } from '@/assets/js/config' |
| | | import { useRouter, useRoute } from 'vue-router' |
| | | import useClipboard from 'vue-clipboard3' |
| | | const { toClipboard } = useClipboard() |
| | | const request = inject('request') |
| | | //获取路由器 |
| | | let $router = useRouter() |
| | | let router = useRouter() |
| | | //获取当前路由的信息 |
| | | let $route = useRoute() |
| | | let route = useRoute() |
| | | import moment from 'moment' |
| | | import dictionary from '@/views/components/dictionary.vue' |
| | | import { ElMessage, ElMessageBox } from 'element-plus' |
| | | import logo from '@/assets/images/header/logo.png' |
| | | import mulu from '@/assets/images/menu/mulu.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 { fabric } from 'fabric' |
| | | const canvasWith = ref(1000) |
| | | const canvasheight = ref(3000) |
| | | |
| | | const screenWidth = ref( |
| | | window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth |
| | | ) |
| | | onMounted(() => { |
| | | // canvasWith.value = window.innerWidth - 540 |
| | | // canvasheight.value = window.innerHeight - 110 |
| | |
| | | // canvasWith.value = document.getElementById('container').offsetWidth |
| | | // canvasheight.value = document.getElementById('container').offsetHeight |
| | | // }, 5000) |
| | | if (screenWidth.value < 1180) { |
| | | menuState.open = false |
| | | toolState.open = false |
| | | } |
| | | window.onresize = () => { |
| | | return (() => { |
| | | screenWidth.value = |
| | | window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth |
| | | })() |
| | | } |
| | | }) |
| | | |
| | | watch( |
| | | () => screenWidth.value, |
| | | (val) => { |
| | | screenWidth.value = val |
| | | if (screenWidth.value < 1180) { |
| | | menuState.open = false |
| | | toolState.open = false |
| | | } |
| | | } |
| | | ) |
| | | //获取目录 |
| | | const catalogueData = ref([]) |
| | | const getCatalogueData = () => { |
| | | axios |
| | | .get('http://182.92.203.7:3007/books/test/information.json') |
| | | .get(ctxUrl + '/books/test/information.json') |
| | | .then(function (response) { |
| | | var json = response.data |
| | | // 处理获取到的json数据 |
| | |
| | | } |
| | | ]) |
| | | const activeClassify = ref('image') |
| | | const searchShow = ref(false) |
| | | const resourceData = ref([]) |
| | | const searchShow = ref(true) |
| | | const resourceData = ref({}) |
| | | const resourceDataList = ref([]) |
| | | const resourVisble = ref(false) |
| | | const resourType = ref('') |
| | | const testVideo = ref('') //视频链接 |
| | | const testWord = ref('') //word链接 |
| | | const getResourceData = () => { |
| | | axios |
| | | .get('http://182.92.203.7:3007/books/test/resource.json') |
| | | .get(ctxUrl + '/books/test/resource.json') |
| | | .then(function (response) { |
| | | var json = response.data |
| | | // 处理获取到的json数据 |
| | | console.log(json, '资源') |
| | | resourceData.value = json |
| | | resourceDataList.value = json.imgList |
| | | classifySelectList[0].count = json.imgList.length |
| | | classifySelectList[1].count = json.audioList.length |
| | | classifySelectList[2].count = json.videoList.length |
| | | classifySelectList[3].count = json.attachmentList.length |
| | | }) |
| | | .catch(function (error) { |
| | | console.log(error) |
| | |
| | | } |
| | | |
| | | const goResourceDetail = (data) => { |
| | | console.log(data, 23) |
| | | resourVisble.value = true |
| | | resourType.value = data.type |
| | | if (data.type == 'video') { |
| | | testVideo.value = 'http://182.92.203.7:3007/books/test/resourceData/' + data.name |
| | | testVideo.value = ctxUrl + '/books/test/resourceData/' + data.name |
| | | } else if (data.type == 'word') { |
| | | testWord.value = 'http://182.92.203.7:3007/books/test/resourceData/' + data.name |
| | | testWord.value = ctxUrl + '/books/test/resourceData/' + data.name |
| | | } |
| | | } |
| | | |
| | | const classifyClick = (item) => { |
| | | activeClassify.value = item.key |
| | | resourceDataList.value = [] |
| | | searchText.value = '' |
| | | switch (item.key) { |
| | | case 'image': |
| | | resourceDataList.value = resourceData.value.imgList |
| | | break |
| | | case 'audio': |
| | | resourceDataList.value = resourceData.value.audioList |
| | | break |
| | | case 'video': |
| | | resourceDataList.value = resourceData.value.videoList |
| | | break |
| | | case 'other': |
| | | resourceDataList.value = resourceData.value.attachmentList |
| | | break |
| | | } |
| | | console.log(resourceDataList.value) |
| | | } |
| | | const searchBtn = () => { |
| | | if (searchShow.value) { |
| | |
| | | }) |
| | | |
| | | const settingForm = reactive({ |
| | | fontSizeList: [ |
| | | { |
| | | lable: '小', |
| | | key: '14' |
| | | }, |
| | | { |
| | | lable: '中', |
| | | key: '16' |
| | | }, |
| | | |
| | | { |
| | | lable: '大', |
| | | key: '20' |
| | | } |
| | | ], |
| | | fontSizeActive: '16', |
| | | acoustics: false, |
| | | animation: false |
| | | animation: false, |
| | | bgColorList: [ |
| | | { |
| | | lable: '黄', |
| | | key: '#FBF9F4' |
| | | }, |
| | | { |
| | | lable: '绿', |
| | | key: '#F2FFF7' |
| | | }, |
| | | { |
| | | lable: '紫', |
| | | key: '#F6F4FC' |
| | | }, |
| | | { |
| | | lable: '粉', |
| | | key: '#FFFAF9' |
| | | } |
| | | ], |
| | | bgColorActive: '#FBF9F4' |
| | | }) |
| | | const fontSizeSelect = (item) => { |
| | | settingForm.fontSizeActive = item.key |
| | | } |
| | | const bgColorSelect = (item) => { |
| | | settingForm.bgColorActive = item.key |
| | | } |
| | | //笔记颜色筛选 |
| | | const searchClick = (item) => { |
| | | if (item != 'all') { |
| | |
| | | const searchBook = async () => { |
| | | if (activeMenu.value == 1) { |
| | | getNotesList() |
| | | } |
| | | if (activeMenu.value == 2) { |
| | | let dataList = JSON.parse(JSON.stringify(resourceDataList.value)) |
| | | if (searchText.value) { |
| | | resourceDataList.value = [] |
| | | searchText.value = searchText.value.replace(/^\s*|\s*$/g, '') |
| | | let text = searchText.value.replace(/^\s*|\s*$/g, '') |
| | | dataList.forEach((item) => { |
| | | if (item.name.indexOf(text) > -1) { |
| | | let replaceStr = "<span style='background:#F5E12A'>" + text + '</span>' |
| | | let htmlStr = item.name.split(text).join(replaceStr) |
| | | item.name = '<p>' + htmlStr + '</p>' |
| | | resourceDataList.value.push(item) |
| | | } |
| | | }) |
| | | } |
| | | } |
| | | } |
| | | |
| | |
| | | icon: moxinggongju |
| | | } |
| | | ]) |
| | | const baiduVisible = ref(false) |
| | | const wendaVisible = ref(false) |
| | | const cidianVisible = ref(false) |
| | | const functionVisible = ref(false) |
| | |
| | | const nameRef = ref() |
| | | const imgUrl = ref() |
| | | const confirmDialog = ref<Boolean>(false) |
| | | const nameData = ref({ name: '' }) |
| | | const screenshotVisble = ref<Boolean>(false) |
| | | const nameData = ref('') //截图名称 |
| | | const urlData = ref('') //截图base64 |
| | | const screenshotList = ref([]) |
| | | |
| | | //浮窗工具栏点击事件 |
| | |
| | | } |
| | | //确认回调 |
| | | const callback = (val: any) => { |
| | | ElMessageBox.confirm('确认要保存截图?', '提示', { |
| | | confirmButtonText: '确认', |
| | | cancelButtonText: '取消' |
| | | }) |
| | | .then(() => { |
| | | screenshotList.value.push({ |
| | | createDate: new Date(), |
| | | imgUrl: val.base64 |
| | | }) |
| | | request({ |
| | | url: '/identity/api/ApiAppUserSetKey', |
| | | method: 'post', |
| | | data: { |
| | | setKeyRequests: [ |
| | | { |
| | | domain: 'screenshot', |
| | | key: '1', |
| | | value: JSON.stringify(screenshotList.value) |
| | | } |
| | | ] |
| | | } |
| | | }).then((res) => { |
| | | getScreenshotList() |
| | | }) |
| | | }) |
| | | .catch(() => {}) |
| | | screenshotVisble.value = true |
| | | urlData.value = val.base64 |
| | | } |
| | | //取消回调 |
| | | const closeFn = (base64: any) => { |
| | | console.log(base64) |
| | | } |
| | | const addScreenshot = () => { |
| | | if (nameData.value) { |
| | | screenshotList.value.push({ |
| | | createDate: new Date(), |
| | | imgUrl: urlData.value, |
| | | name: nameData.value |
| | | }) |
| | | request({ |
| | | url: '/identity/api/ApiAppUserSetKey', |
| | | method: 'post', |
| | | data: { |
| | | setKeyRequests: [ |
| | | { |
| | | domain: 'screenshot', |
| | | key: '2358', |
| | | value: JSON.stringify(screenshotList.value) |
| | | } |
| | | ] |
| | | } |
| | | }).then((res) => { |
| | | getScreenshotList() |
| | | screenshotVisble.value = false |
| | | }) |
| | | } else { |
| | | ElMessage.error('截图名称不能为空!') |
| | | } |
| | | } |
| | | const screenshotClose = () => { |
| | | screenshotVisble.value = false |
| | | } |
| | | |
| | | const getScreenshotList = () => { |
| | |
| | | method: 'post', |
| | | data: { |
| | | domain: 'screenshot', |
| | | keys: ['1'] |
| | | keys: ['2358'] |
| | | } |
| | | }).then((res) => { |
| | | if (res && res.length > 0 && res[0].value) { |
| | |
| | | const node = window.getSelection() |
| | | let html = node.anchorNode.parentNode.parentNode |
| | | dialogToolData.chapter = html.firstChild.innerHTML |
| | | console.log(dialogToolData.chapter) |
| | | if (txt) { |
| | | showToolBox.value = true |
| | | dialogToolData.top = e.y |
| | |
| | | { icon: biji2, activeIcon: biji1, name: '笔记' }, |
| | | { icon: biaozhu2, activeIcon: biaozhu3, name: '标注' }, |
| | | { icon: fuzhi, activeIcon: fuzhi1, name: '复制' }, |
| | | { icon: AIyuedu, activeIcon: AIyuedu1, name: 'AI阅读' } |
| | | // { icon: cidian2, activeIcon: cidian1, name: '词典' }, |
| | | { icon: AIyuedu, activeIcon: AIyuedu1, name: 'AI阅读' }, |
| | | { icon: cidian2, activeIcon: cidian1, name: '词典' }, |
| | | { icon: baidu, activeIcon: cidian1, name: '百科' } |
| | | // { icon: yuyinyuedu, activeIcon: yuyinyuedu1, name: '语音阅读' } |
| | | // { icon: cidian2, activeIcon: cidian1, name: '翻译' } |
| | | ]) |
| | |
| | | }, |
| | | { |
| | | label: '紫色', |
| | | key: '#CAA5FC ' |
| | | key: '#CAA5FC' |
| | | }, |
| | | { |
| | | label: '粉色', |
| | |
| | | //笔记弹窗 |
| | | const addNoteVisble = ref(false) |
| | | const formData = reactive({ |
| | | name: '', |
| | | desc: '' |
| | | }) |
| | | //笔记弹窗关闭 |
| | |
| | | dialogToolList[6].icon = cidian1 |
| | | break |
| | | case 7: |
| | | dialogToolList[7].icon = yuyinyuedu1 |
| | | dialogToolList[7].icon = baidu1 |
| | | break |
| | | } |
| | | } |
| | |
| | | dialogToolList[6].icon = cidian2 |
| | | break |
| | | case 7: |
| | | dialogToolList[7].icon = yuyinyuedu |
| | | dialogToolList[7].icon = baidu |
| | | break |
| | | } |
| | | } |
| | |
| | | case '高亮': |
| | | break |
| | | case '笔记': |
| | | formData.name = '' |
| | | formData.desc = '' |
| | | addNoteVisble.value = true |
| | | showToolBox.value = false |
| | | break |
| | | case '标注': |
| | | break |
| | |
| | | case '词典': |
| | | cidianVisible.value = true |
| | | break |
| | | case '百科': |
| | | baiduVisible.value = true |
| | | break |
| | | } |
| | | } |
| | | |
| | | const clickSelect = (item) => { |
| | | colorActive.value = item.key |
| | | if (toolActive.value == '笔记') { |
| | | addNoteVisble.value = true |
| | | } |
| | | if (toolActive.value == '高亮') { |
| | | dialogToolData.lineHeight.push({ |
| | | selectNode: selectNode.value, |
| | | selectText: selectText.value, |
| | | color: colorActive.value, |
| | | chapter: dialogToolData.chapter, |
| | | color: item.key, |
| | | createDate: new Date() |
| | | }) |
| | | request({ |
| | |
| | | setKeyRequests: [ |
| | | { |
| | | domain: 'highLight', |
| | | key: '1', |
| | | value: JSON.stringify([dialogToolData.lineHeight]) |
| | | key: '2358', |
| | | value: JSON.stringify(dialogToolData.lineHeight) |
| | | } |
| | | ] |
| | | } |
| | |
| | | selectText: selectText.value, |
| | | color: colorActive.value, |
| | | chapter: dialogToolData.chapter, |
| | | color: item.key, |
| | | createDate: new Date() |
| | | }) |
| | | request({ |
| | |
| | | setKeyRequests: [ |
| | | { |
| | | domain: 'underline', |
| | | key: '1', |
| | | key: '2358', |
| | | value: JSON.stringify(dialogToolData.scribeList) |
| | | } |
| | | ] |
| | |
| | | const lock = ref(false) |
| | | const addNote = () => { |
| | | const obj = { |
| | | name: formData.name, |
| | | desc: formData.desc |
| | | } |
| | | if (!lock.value) { |
| | | lock.value = true |
| | | if (formData.desc.replace(/^\s*|\s*$/g, '')) { |
| | | if (formData.name.replace(/^\s*|\s*$/g, '')) { |
| | | dialogToolData.notesList.push({ |
| | | selectText: selectText.value, |
| | | color: colorActive.value, |
| | | chapter: dialogToolData.chapter, |
| | | createDate: new Date(), |
| | | name: formData.name.replace(/^\s*|\s*$/g, ''), |
| | | note: formData.desc.replace(/^\s*|\s*$/g, '') |
| | | }) |
| | | request({ |
| | | url: '/identity/api/ApiAppUserSetKey', |
| | | method: 'post', |
| | | data: { |
| | | setKeyRequests: [ |
| | | { |
| | | domain: 'notes', |
| | | key: '1', |
| | | value: JSON.stringify(dialogToolData.notesList) |
| | | } |
| | | ] |
| | | } |
| | | }).then((res) => { |
| | | showToolBox.value = false |
| | | addNoteVisble.value = false |
| | | colorActive.value = '' |
| | | toolActive.value = '' |
| | | // getNotesList() |
| | | setTimeout(() => { |
| | | lock.value = false |
| | | }, 1000) |
| | | }) |
| | | } else { |
| | | ElMessage.error('笔记标题不能为空!') |
| | | lock.value = false |
| | | } |
| | | dialogToolData.notesList.push({ |
| | | selectText: selectText.value, |
| | | color: colorActive.value, |
| | | chapter: dialogToolData.chapter, |
| | | createDate: new Date(), |
| | | note: formData.desc.replace(/^\s*|\s*$/g, '') |
| | | }) |
| | | request({ |
| | | url: '/identity/api/ApiAppUserSetKey', |
| | | method: 'post', |
| | | data: { |
| | | setKeyRequests: [ |
| | | { |
| | | domain: 'notes', |
| | | key: '2358', |
| | | value: JSON.stringify(dialogToolData.notesList) |
| | | } |
| | | ] |
| | | } |
| | | }).then((res) => { |
| | | showToolBox.value = false |
| | | addNoteVisble.value = false |
| | | colorActive.value = '' |
| | | toolActive.value = '' |
| | | getNotesList() |
| | | setTimeout(() => { |
| | | lock.value = false |
| | | }, 1000) |
| | | }) |
| | | } else { |
| | | ElMessage.error('笔记内容不能为空!') |
| | | lock.value = false |
| | |
| | | method: 'post', |
| | | data: { |
| | | domain: 'notes', |
| | | keys: ['1'] |
| | | keys: ['2358'] |
| | | } |
| | | }).then((res) => { |
| | | if (res && res.length > 0 && res[0].value) { |
| | | scribeData.loading = false |
| | | dialogToolData.notesList = JSON.parse(res[0].value) |
| | | let list = JSON.parse(res[0].value) |
| | | let textDom1 = document.getElementById('container') |
| | | console.log(list, '笔记') |
| | | if (list.length > 0) { |
| | | list.forEach((item, index) => { |
| | | item.createDate = moment(item.createDate).format('YYYY-MM-DD') |
| | |
| | | let rHtml1 = '' |
| | | rHtml1 = text1.replace( |
| | | rReg1, |
| | | `<span style="text-decoration:underline;text-underline-thickness:2px;text-underline-offset:4px;text-decoration-color:${item.color}" class="underline">${item.selectText}</span><img src="${biji1}" style="cursor: pointer" onclick="notesVisbleShow('${item.selectText}')"/>` |
| | | `<span style="padding-bottom:2px; border-bottom: 2px solid;border-bottom-color:${item.color}" class="underline">${item.selectText}</span><img src="${biji1}" style="cursor: pointer" onclick="notesVisbleShow('${item.selectText}')"/>` |
| | | ) |
| | | textDom1.innerHTML = rHtml1 |
| | | }) |
| | | } |
| | | scribeData.loading = false |
| | | } |
| | | |
| | | }) |
| | | } |
| | | //划线 |
| | |
| | | method: 'post', |
| | | data: { |
| | | domain: 'underline', |
| | | keys: ['1'] |
| | | keys: ['2358'] |
| | | } |
| | | }).then((res) => { |
| | | if (res && res.length > 0 && res[0].value) { |
| | |
| | | method: 'post', |
| | | data: { |
| | | domain: 'highLight', |
| | | keys: ['1'] |
| | | keys: ['2358'] |
| | | } |
| | | }).then((res) => { |
| | | if (res && res.length > 0 && res[0].value) { |
| | |
| | | window.notesVisbleShow = function (txt) { |
| | | addNoteVisble.value = true |
| | | let notes = dialogToolData.notesList.find((item) => item.selectText == txt) |
| | | formData.name = notes.name |
| | | formData.desc = notes.note |
| | | } |
| | | window.deleteScribeShow = function (txt) { |
| | |
| | | setKeyRequests: [ |
| | | { |
| | | domain: 'underline', |
| | | key: '1', |
| | | key: '2358', |
| | | value: JSON.stringify(list) |
| | | } |
| | | ] |
| | |
| | | setKeyRequests: [ |
| | | { |
| | | domain: 'highLight', |
| | | key: '1', |
| | | key: '2358', |
| | | value: JSON.stringify(list) |
| | | } |
| | | ] |
| | |
| | | selectText.value = item.selectText |
| | | colorActive.value = item.color |
| | | dialogToolData.chapter = item.chapter |
| | | formData.name = item.name |
| | | formData.desc = item.note |
| | | addNoteVisble.value = true |
| | | } |
| | |
| | | setKeyRequests: [ |
| | | { |
| | | domain: 'notes', |
| | | key: '1', |
| | | key: '2358', |
| | | value: JSON.stringify(list) |
| | | } |
| | | ] |
| | |
| | | headerData.pageSize = Number(headerData.pageSize) - 5 |
| | | } |
| | | } |
| | | |
| | | const layoutBtn = () => { |
| | | localStorage.clear() |
| | | console.log(888) |
| | | router.push('/login') |
| | | } |
| | | </script> |
| | | |
| | | <style lang="less"> |
| | | .homeBox { |
| | | width: 100%; |
| | | height: 100%; |
| | | background:#C6C6C6; |
| | | background: #87ccff; |
| | | border-radius: 10px; |
| | | display: flex; |
| | | flex-direction: column; |
| | | padding:0 15px; |
| | | padding: 0 15px; |
| | | .headerBox { |
| | | height: 48px; |
| | | // background-image: url('@/assets/images/header/top-bg.png'); |
| | | background-size: 100% 100%; |
| | | background-repeat: no-repeat; |
| | | padding: 0 20px; |
| | | display:flex; |
| | | display: flex; |
| | | justify-content: space-between; |
| | | align-items: center; |
| | | p { |
| | | .logoTxt { |
| | | font-size: 24px; |
| | | color: #ffffff; |
| | | color: #333; |
| | | letter-spacing: 2px; |
| | | font-weight: bold; |
| | | } |
| | | .userInfoBox{ |
| | | display:flex; |
| | | .userInfoBox { |
| | | display: flex; |
| | | align-items: center; |
| | | .layout{ |
| | | .layout { |
| | | width: 69px; |
| | | height: 30px; |
| | | background: #0093FF; |
| | | background: #0093ff; |
| | | border-radius: 15px; |
| | | color:#fff; |
| | | text-align:center; |
| | | line-height:30px; |
| | | |
| | | color: #fff; |
| | | text-align: center; |
| | | line-height: 30px; |
| | | } |
| | | } |
| | | } |
| | |
| | | box-sizing: border-box; |
| | | position: relative; |
| | | box-shadow: 10px 0 10px -10px rgba(0, 0, 0, 0.07); |
| | | background:#fff; |
| | | border-radius:16px 0px 0px 0px; |
| | | background: #fff; |
| | | border-radius: 16px 0px 0px 0px; |
| | | .menuItem { |
| | | text-align: center; |
| | | line-height: 1; |
| | | cursor: pointer; |
| | | padding: 5px 0 10px 0; |
| | | width:63px; |
| | | width: 63px; |
| | | margin: 10px auto; |
| | | border-radius: 10px; |
| | | &.active, |
| | |
| | | border: 1px solid #0093ff !important; |
| | | border-radius: 50px; |
| | | overflow: hidden; |
| | | background:#fff; |
| | | background: #fff; |
| | | } |
| | | .is-focus, |
| | | .el-input__wrapper { |
| | |
| | | |
| | | .all { |
| | | width: 50px; |
| | | height: 20px; |
| | | height: 22px; |
| | | border-radius: 17px; |
| | | margin: 10px 10px 10px 0; |
| | | border: 1px solid #d8d8d8; |
| | | text-align: center; |
| | | line-height: 17px; |
| | | line-height: 20px; |
| | | font-size: 12px; |
| | | } |
| | | |
| | | .allActive { |
| | | width: 50px; |
| | | height: 20px; |
| | | height: 22px; |
| | | border-radius: 17px; |
| | | margin: 10px 10px 10px 0; |
| | | text-align: center; |
| | | line-height: 17px; |
| | | line-height: 20px; |
| | | color: #fff; |
| | | background: #0093ff; |
| | | border: 1px solid #0093ff; |
| | |
| | | .scribeItem { |
| | | width: 18px; |
| | | height: 18px; |
| | | border-radius: 50%; |
| | | border-radius: 3px; |
| | | margin: 10px auto; |
| | | border: none; |
| | | } |
| | |
| | | width: 130px; |
| | | height: 80px; |
| | | background: #fff; |
| | | border-radius:5px; |
| | | border-radius: 5px; |
| | | overflow: hidden; |
| | | img { |
| | | height: 100%; |
| | |
| | | } |
| | | |
| | | .rName { |
| | | margin-top:10px; |
| | | margin-top: 10px; |
| | | height: 20px; |
| | | line-height: 20px; |
| | | display: -webkit-box; |
| | |
| | | flex-wrap: wrap; |
| | | justify-content: space-between; |
| | | .captureItem { |
| | | border: 1px solid #d8d8d8; |
| | | margin-bottom: 10px; |
| | | width: 46%; |
| | | .capture { |
| | | .imgBox { |
| | | border: 1px solid #d8d8d8; |
| | | width: 100%; |
| | | height: 80px; |
| | | margin-bottom: 5px; |
| | | } |
| | | // .capture { |
| | | // width: 100%; |
| | | // } |
| | | .captureName { |
| | | height: 20px; |
| | | line-height: 20px; |
| | | display: -webkit-box; |
| | | -webkit-box-orient: vertical; |
| | | -webkit-line-clamp: 1; |
| | | overflow: hidden; |
| | | text-overflow: ellipsis; |
| | | color: #000; |
| | | } |
| | | } |
| | | } |
| | |
| | | position: relative; |
| | | margin: 10px; |
| | | line-height: 20px; |
| | | background: #fff; |
| | | border-radius: 5px; |
| | | padding: 10px 0; |
| | | .textBox { |
| | | padding: 0 5px 10px 5px; |
| | | .title { |
| | | display: flex; |
| | | justify-content: space-between; |
| | | align-items: center; |
| | | margin-right: 10px; |
| | | .border-left { |
| | | height: 25px; |
| | | border-right: 4px solid; |
| | | border-radius: 0 5px 5px 0; |
| | | margin-right: 10px; |
| | | } |
| | | .title-con { |
| | | display: flex; |
| | | align-items: center; |
| | | color: #949494; |
| | | .round { |
| | | width: 10px; |
| | | height: 10px; |
| | |
| | | } |
| | | .chapter { |
| | | color: #b7b7b7; |
| | | margin-top: 5px; |
| | | } |
| | | .chapterName { |
| | | float: right; |
| | | width: 150px; |
| | | margin: 5px 5px 5px 14px; |
| | | display: -webkit-box; |
| | | -webkit-box-orient: vertical; |
| | | -webkit-line-clamp: 1; |
| | | overflow: hidden; |
| | | white-space: nowrap; |
| | | text-overflow: ellipsis; |
| | | text-align: right; |
| | | border-left: 3px solid #b7b7b7; |
| | | border-left-radius: 20px; |
| | | padding: 0 5px; |
| | | } |
| | | } |
| | | .noteText { |
| | | text-indent: 2ch; |
| | | margin-top: 5px; |
| | | .label { |
| | | width: 40px; |
| | | flex-shrink: 0; |
| | | } |
| | | |
| | | margin: 10px 10px 10px 15px; |
| | | border-radius: 3px; |
| | | padding: 2px 5px; |
| | | // opacity: 0.1; |
| | | .con { |
| | | all: initial; |
| | | max-height: 65px; |
| | | display: -webkit-box; |
| | | -webkit-box-orient: vertical; |
| | | -webkit-line-clamp: 3; |
| | | overflow: hidden; |
| | | } |
| | | } |
| | | .deleteBox { |
| | | position: absolute; |
| | | right: 0; |
| | | top: 0; |
| | | height: 100%; |
| | | width: 70px; |
| | | background-color: #0093ff; |
| | | color: #fff; |
| | | display: flex; |
| | | align-items: center; |
| | | |
| | | span { |
| | | margin: 0 auto; |
| | | } |
| | | |
| | | .el-icon { |
| | | margin-right: 5px; |
| | | } |
| | | } |
| | | } |
| | |
| | | margin: 0 5px; |
| | | } |
| | | } |
| | | .progress{ |
| | | text-align:center; |
| | | .bookName{ |
| | | font-weight:bold; |
| | | margin-bottom:3px; |
| | | .progress { |
| | | text-align: center; |
| | | .bookName { |
| | | font-weight: bold; |
| | | margin-bottom: 3px; |
| | | } |
| | | |
| | | } |
| | | .rightBox { |
| | | display: flex; |
| | |
| | | .toolBox { |
| | | position: relative; |
| | | box-shadow: -3px 0px 6px 1px rgba(0, 0, 0, 0.07); |
| | | background:#fff; |
| | | border-radius:0px 16px 0px 0px; |
| | | background: #fff; |
| | | border-radius: 0px 16px 0px 0px; |
| | | .toolTitle { |
| | | height: 57px; |
| | | line-height: 53px; |
| | |
| | | position: absolute; |
| | | line-height: 22px; |
| | | top: 50%; |
| | | right: 65px; |
| | | right: 50px; |
| | | text-align: center; |
| | | box-shadow: 0px 0px 6px 1px rgba(0, 0, 0, 0.16); |
| | | img { |
| | |
| | | } |
| | | } |
| | | .right { |
| | | right: 174px !important; |
| | | right: 184px !important; |
| | | border-radius: 0px 3px 3px 0px !important; |
| | | } |
| | | .classRoomBox { |
| | |
| | | height: 100%; |
| | | } |
| | | } |
| | | .myNoteDialogs { |
| | | width: 400px !important; |
| | | } |
| | | .myDialogs { |
| | | width: 628px; |
| | | |
| | | .myDialogs, |
| | | .myNoteDialogs, |
| | | .resourDialog { |
| | | padding: 0 !important; |
| | | border-radius: 10px !important; |
| | | overflow: hidden; |
| | | |
| | | .el-dialog__header { |
| | | padding: 15px; |
| | | margin-right: 0; |
| | | border-bottom: 1px solid #f4f4f4; |
| | | padding: 10px; |
| | | text-align: center; |
| | | background: #f4f5f9; |
| | | } |
| | | |
| | | .el-dialog__title { |
| | |
| | | } |
| | | |
| | | .el-dialog__headerbtn { |
| | | top: 6px; |
| | | right: 6px; |
| | | top: 0px !important; |
| | | right: 0px !important; |
| | | } |
| | | |
| | | .el-dialog__body { |
| | | padding: 20px !important; |
| | | } |
| | | .el-dialog__footer { |
| | | padding: 15px; |
| | | border-top: 1px solid #f4f4f4; |
| | | padding: 10px 20px 20px !important; |
| | | text-align: right; |
| | | box-sizing: border-box; |
| | | } |
| | | |
| | | .myDialogs-footer { |
| | | .el-button { |
| | | padding: 0 20px; |
| | | } |
| | | .myDialogs { |
| | | width: 628px; |
| | | } |
| | | .myNoteDialogs { |
| | | width: 500px !important; |
| | | } |
| | | .noteColorSelectBox { |
| | | margin-top: 10px; |
| | | width: 190px; |
| | | display: flex; |
| | | .flex1 { |
| | | flex: 1; |
| | | .scribeItem { |
| | | width: 18px; |
| | | height: 18px; |
| | | border-radius: 3px; |
| | | margin: 10px auto; |
| | | border: none; |
| | | display: flex; |
| | | justify-content: center; |
| | | align-items: center; |
| | | } |
| | | } |
| | | } |
| | |
| | | .imgUrlBox { |
| | | width: 100%; |
| | | text-align: center; |
| | | img { |
| | | width: 100%; |
| | | } |
| | | } |
| | | </style> |