| | |
| | | <div>默认资源</div> |
| | | <div :class="resourceType == 'default' ? 'text' : 'line'"></div> |
| | | </div> |
| | | <hr class="hr" /> |
| | | <div class="tabItem hover" @click="selectResourceType('teacher')"> |
| | | <hr class="hr" v-if="userInfo.role == 'Teacher'"/> |
| | | <div class="tabItem hover" @click="selectResourceType('teacher')" v-if="userInfo.role == 'Teacher'"> |
| | | <div>教师资源</div> |
| | | <div :class="resourceType == 'teacher' ? 'text' : 'line'"></div> |
| | | </div> |
| | |
| | | @click="goPlay(item)" |
| | | size="20" |
| | | class="icon hover" |
| | | v-if="item.resourceType != '视频' && item.resourceType != '音频' && item.resourceType != '图片'" |
| | | v-if=" |
| | | item.resourceType != '视频' && |
| | | item.resourceType != '音频' && |
| | | item.resourceType != '图片' |
| | | " |
| | | > |
| | | <View /> |
| | | </el-icon> |
| | |
| | | <div class="graphBox"> |
| | | <div class="graphSelect"> |
| | | <div class="flex1"> |
| | | <div class="square hover" @click="graphSelect('square')"></div> |
| | | <div :class="toolSelectData.graphType == 'square' ? 'acitveGraphType' : ''"> |
| | | <div class="square hover" @click="graphSelect('square')"></div> |
| | | </div> |
| | | </div> |
| | | <div class="flex1"> |
| | | <div class="rotundity hover" @click="graphSelect('rotundity')"></div> |
| | | <div :class="toolSelectData.graphType == 'rotundity' ? 'acitveGraphType' : ''"> |
| | | <div class="rotundity hover" @click="graphSelect('rotundity')"></div> |
| | | </div> |
| | | </div> |
| | | <div class="flex1"> |
| | | <div class="triangle hover" @click="graphSelect('triangle')"></div> |
| | | <div :class="toolSelectData.graphType == 'triangle' ? 'acitveGraphType' : ''"> |
| | | <div class="triangle hover" @click="graphSelect('triangle')"></div> |
| | | </div> |
| | | </div> |
| | | <div class="flex1"> |
| | | <div class="lineSegment hover" @click="graphSelect('lineSegment')">/</div> |
| | | <div :class="toolSelectData.graphType == 'lineSegment' ? 'acitveGraphType' : ''"> |
| | | <div class="lineSegment hover" @click="graphSelect('lineSegment')">/</div> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | <div class="lineStyle"> |
| | |
| | | </div> |
| | | </div> |
| | | |
| | | <!-- 白板 --> |
| | | <div v-if="whiteBoard" class="whiteBoardBox"> |
| | | <whiteBoardBox @whiteBoardClose="whiteBoardClose"></whiteBoardBox> |
| | | </div> |
| | | |
| | | <el-dialog |
| | | title="资源" |
| | | align-center |
| | |
| | | </div> |
| | | |
| | | <div class="wordBox" v-if="resourType == 'PDF' || resourType == 'PPT' || resourType == 'WORD'"> |
| | | <div |
| | | v-for="(item, index) in showData" |
| | | :key="index" |
| | | class="pdfItem" |
| | | :page="index + 1" |
| | | > |
| | | <img :src="item.showSrc" alt="" style="min-height: 550px" loading="lazy" /> |
| | | <el-divider content-position="center"> 第 {{ index + 1 }} 页 </el-divider> |
| | | </div> |
| | | </div> |
| | | <div v-for="(item, index) in showData" :key="index" class="pdfItem" :page="index + 1"> |
| | | <img :src="item.showSrc" alt="" style="min-height: 550px" loading="lazy" /> |
| | | <el-divider content-position="center"> 第 {{ index + 1 }} 页 </el-divider> |
| | | </div> |
| | | </div> |
| | | </el-dialog> |
| | | <div class="audioBox" v-show="false"> |
| | | <!-- <video controls controlslist="nodownload" :src="testVideo"></video> --> |
| | |
| | | </el-dialog> |
| | | <el-dialog title="模型工具" align-center v-model="modelTool" width="80%" class="myDialogs"> |
| | | <div class="wendabox"> |
| | | <iframe src='https://adjam93.github.io/threejs-model-viewer/#' frameborder="0"></iframe> |
| | | <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"> |
| | |
| | | <wrongQuestion /> |
| | | </div> |
| | | </el-dialog> |
| | | <el-dialog |
| | | title="公式编辑" |
| | | align-center |
| | | v-model="formulaDialog" |
| | | class="myDialogs" |
| | | > |
| | | <el-dialog title="公式编辑" align-center v-model="formulaDialog" class="myDialogs"> |
| | | <div class="wendabox"> |
| | | <formula /> |
| | | </div> |
| | |
| | | import formula from '@/views/components/formula.vue' |
| | | import wrongQuestion from '@/views/components/wrongQuestion.vue' |
| | | import voiceReader from '@/views/components/voiceReader.vue' |
| | | import whiteBoardBox from '@/views/components/whiteBoard.vue' |
| | | import logo from '@/assets/images/header/logo.png' |
| | | import mulu from '@/assets/images/menu/mulu.png' |
| | | import biji from '@/assets/images/menu/biji.png' |
| | |
| | | import { microApps } from '@/child.ts' |
| | | import { open } from 'fs' |
| | | let token = localStorage.getItem('token') |
| | | const canvasWith = ref(1000) |
| | | const canvasWith = ref(800) |
| | | const canvasheight = ref(3000) |
| | | const screenWidth = ref( |
| | | window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth |
| | |
| | | window.qiankunState.initTestBook(localStorage.getItem('bookId') + '', tryPageCount.value) |
| | | } |
| | | } |
| | | |
| | | }) |
| | | |
| | | // 定义父层方法 |
| | |
| | | // if (window.qiankunState && window.qiankunState.getAnswers){ |
| | | // window.qiankunState.getAnswers(localStorage.getItem("")) |
| | | // } |
| | | |
| | | }) |
| | | |
| | | onBeforeUnmount(() => { |
| | |
| | | MG.store.getProductList(obj).then((res) => { |
| | | console.log(res.datas, '图书信息') |
| | | bookInfo.value = res.datas[0] |
| | | if (res.datas[0].purchasedSaleMethodIdList.includes(res.datas[0].defaultSaleMethodId)) { |
| | | if (res.datas[0].purchasedSaleMethodIdList.indexOf(res.datas[0].defaultSaleMethodId) > -1) { |
| | | isBuy.value = true |
| | | } else { |
| | | isBuy.value = false |
| | |
| | | name: '知识图谱', |
| | | icon: zhishitupu, |
| | | isShow: bookConfig.value.textbookComponents.indexOf('6BE6A3DC') > -1 |
| | | }, |
| | | { |
| | | name: '截图', |
| | | icon: jietu, |
| | | isShow: bookConfig.value.textbookComponents.indexOf('CB0EACEC') > -1 |
| | | // isShow: true |
| | | }, |
| | | { |
| | | name: '书签', |
| | |
| | | bookConfig.value.textbookComponents.indexOf('AFC1A288') > -1 || |
| | | bookConfig.value.textbookComponents.indexOf('A434F2C0') > -1 || |
| | | bookConfig.value.textbookComponents.indexOf('A4821F71') > -1 |
| | | }, |
| | | { |
| | | name: '截图', |
| | | icon: jietu, |
| | | isShow: bookConfig.value.textbookComponents.indexOf('CB0EACEC') > -1 |
| | | } |
| | | ] |
| | | teachToolsMenuData = [ |
| | |
| | | icon: baiban, |
| | | name: '白板', |
| | | isShow: bookConfig.value.textbookComponents.indexOf('029DB3E0') > -1 |
| | | // isShow: true |
| | | }, |
| | | { |
| | | icon: biaozhu, |
| | |
| | | if (localStorage.getItem('chapter') && localStorage.getItem('startPage')) { |
| | | let chapter = Number(localStorage.getItem('chapter')) |
| | | let start = Number(localStorage.getItem('startPage')) |
| | | |
| | | |
| | | if (window.qiankunState && window.qiankunState.gotoPage) { |
| | | window.qiankunState.gotoPage(chapter,start) |
| | | window.qiankunState.gotoPage(chapter, start) |
| | | localStorage.removeItem('chapter') |
| | | localStorage.removeItem('startPage') |
| | | } |
| | |
| | | }) |
| | | .catch(function (error) { |
| | | listLoading.value = false |
| | | |
| | | }) |
| | | } |
| | | const defaultProps = { |
| | |
| | | if (resItem1.resourceType == classifySelectList.value[0].title) { |
| | | resourceDataList.value.push(resItem1) |
| | | } |
| | | if(activeClassify.value == 'other'){ |
| | | if (resItem1.resourceType != '图片' && resItem1.resourceType != '视频' && resItem1.resourceType != '音频') { |
| | | if (activeClassify.value == 'other') { |
| | | if ( |
| | | resItem1.resourceType != '图片' && |
| | | resItem1.resourceType != '视频' && |
| | | resItem1.resourceType != '音频' |
| | | ) { |
| | | resourceDataList.value.push(resItem1) |
| | | } |
| | | } |
| | |
| | | if (resItem1.resourceType == classifySelectList.value[0].title) { |
| | | resourceDataList.value.push(resItem1) |
| | | } |
| | | if(activeClassify.value == 'other'){ |
| | | if (resItem1.resourceType != '图片' && resItem1.resourceType != '视频' && resItem1.resourceType != '音频') { |
| | | if (activeClassify.value == 'other') { |
| | | if ( |
| | | resItem1.resourceType != '图片' && |
| | | resItem1.resourceType != '视频' && |
| | | resItem1.resourceType != '音频' |
| | | ) { |
| | | resourceDataList.value.push(resItem1) |
| | | } |
| | | } |
| | |
| | | const sceneUrl = ref() |
| | | const showData = ref() |
| | | const goPlay = (data, index) => { |
| | | console.log(data.resourceType,123) |
| | | console.log(data.resourceType, 123) |
| | | resourType.value = data.resourceType |
| | | if (data.resourceType == '视频') { |
| | | if (data.md5) { |
| | |
| | | } |
| | | autoPlay() |
| | | } else if (data.resourceType == '模型') { |
| | | console.log(data,222) |
| | | console.log(data, 222) |
| | | let file = bookConfig.value.requestCtx + '/file/api/ApiDownload?md5=' + data.md5 |
| | | console.log(file.exd,777) |
| | | console.log(file.exd, 777) |
| | | const ctx = 'https://jsek.bnuic.com' |
| | | if (data.md5) { |
| | | sceneUrl.value = 'https://jsek.bnuic.com/books/book/civilAviation/static/modelView/index.html?md5=' + data.md5 + '&name=je' + '&domain=' + ctx + '&exd=obj' + '&target=iframe' |
| | | sceneUrl.value = |
| | | 'https://jsek.bnuic.com/books/book/civilAviation/static/modelView/index.html?md5=' + |
| | | data.md5 + |
| | | '&name=je' + |
| | | '&domain=' + |
| | | ctx + |
| | | '&exd=obj' + |
| | | '&target=iframe' |
| | | } else { |
| | | sceneUrl.value = bookConfig.value.resourceUrl + '/' + data.resourcePath |
| | | } |
| | |
| | | // } else if (data.resourcePath) { |
| | | // window.open(bookConfig.value.resourceUrl + '/' + data.resourcePath) |
| | | // } |
| | | }else if(data.resourceType == 'PPT' || data.resourceType == 'PDF'){ |
| | | } else if (data.resourceType == 'PPT' || data.resourceType == 'PDF') { |
| | | let md5 = data.md5 |
| | | let dataList = [] |
| | | MG.file |
| | | .getPdfInfo({ |
| | | md5 |
| | | }) |
| | | .then((res: any) => { |
| | | console.log() |
| | | if (res && res.totalPages) { |
| | | for (let i = 0; i < res.totalPages; i++) { |
| | | const src = |
| | | MG.file |
| | | .getPdfInfo({ |
| | | md5 |
| | | }) |
| | | .then((res: any) => { |
| | | console.log() |
| | | if (res && res.totalPages) { |
| | | for (let i = 0; i < res.totalPages; i++) { |
| | | const src = |
| | | bookConfig.value.requestCtx + |
| | | '/file/GetPdfPageImage?md5=' + |
| | | md5 + |
| | | '&index=' + |
| | | (i + 1) + |
| | | '&dpi=300' |
| | | dataList.push({ |
| | | showSrc: src |
| | | }) |
| | | } |
| | | console.log(dataList) |
| | | showData.value = dataList |
| | | // 启动页码观察 |
| | | setTimeout(() => { |
| | | resourVisble.value = true |
| | | }, 500) |
| | | '/file/GetPdfPageImage?md5=' + |
| | | md5 + |
| | | '&index=' + |
| | | (i + 1) + |
| | | '&dpi=300' |
| | | dataList.push({ |
| | | showSrc: src |
| | | }) |
| | | } |
| | | }) |
| | | |
| | | }else { |
| | | console.log(dataList) |
| | | showData.value = dataList |
| | | // 启动页码观察 |
| | | setTimeout(() => { |
| | | resourVisble.value = true |
| | | }, 500) |
| | | } |
| | | }) |
| | | } else { |
| | | if (data.md5) { |
| | | window.open(bookConfig.value.requestCtx + '/file/api/ApiDownload?md5=' + data.md5) |
| | | } else if (data.resourcePath) { |
| | |
| | | // testWord.value = bookConfig.value.resourceUrl + '/' + data.resourcePath |
| | | // } |
| | | } |
| | | const goDownload =(data) =>{ |
| | | const goDownload = (data) => { |
| | | if (data.md5) { |
| | | window.open(bookConfig.value.requestCtx + '/file/api/ApiDownload?md5=' + data.md5) |
| | | } else if (data.resourcePath) { |
| | |
| | | if (resItem1.resourceType == classifySelectList.value[0].title) { |
| | | resourceDataList.value.push(resItem1) |
| | | } |
| | | if(activeClassify.value == 'other'){ |
| | | if (resItem1.resourceType != '图片' && resItem1.resourceType != '视频' && resItem1.resourceType != '音频') { |
| | | if (activeClassify.value == 'other') { |
| | | if ( |
| | | resItem1.resourceType != '图片' && |
| | | resItem1.resourceType != '视频' && |
| | | resItem1.resourceType != '音频' |
| | | ) { |
| | | resourceDataList.value.push(resItem1) |
| | | } |
| | | } |
| | |
| | | const menuItemClick = (name) => { |
| | | searchText.value = '' |
| | | allSearchReault.value = [] |
| | | listLoading.value = false |
| | | if (menuState.open && activeMenu.value == name) { |
| | | menuState.open = false |
| | | } else { |
| | |
| | | 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) { |
| | | listLoading.value = true |
| | | let catalogueList = sortArr(catalogueData.value, 'chapter') |
| | | if (catalogueList.length > 0) { |
| | | catalogueList.forEach((item) => { |
| | |
| | | } |
| | | }) |
| | | } |
| | | console.log(allSearchReault.value, 444) |
| | | listLoading.value = false |
| | | }else{ |
| | | listLoading.value = false |
| | | } |
| | | } |
| | |
| | | siweiVisble.value = true |
| | | break |
| | | case '模型工具': |
| | | modelTool.value = true |
| | | modelTool.value = true |
| | | break |
| | | case '词典': |
| | | cidianVisible.value = true |
| | |
| | | |
| | | //画布悬浮操作 |
| | | |
| | | let canvas = null |
| | | let canvasBox: any = null |
| | | const floatingToolData = reactive({ |
| | | activeToolData: '', //选中工具 |
| | | activeBookmark: '', //选中书签 |
| | |
| | | |
| | | //画布 |
| | | const canvasShow = ref(false) |
| | | let textBox: any = null |
| | | let activeElBox: any = null |
| | | //白板 |
| | | const whiteBoard = ref(false) |
| | | |
| | | //截图事件 |
| | | const nameRef = ref() |
| | |
| | | } |
| | | |
| | | canvasShow.value = false |
| | | whiteBoard.value = false |
| | | switch (floatingToolData.activeToolData) { |
| | | case '画笔': |
| | | canvasShow.value = true |
| | | toolSelectData.activeTool = 'huabi' |
| | | canvasBox = new fabric.Canvas('canvasRef') |
| | | canvasBox.setZoom(1); // 设置画布缩放比例为1 |
| | | canvasBox.absolutePan({ x: 0, y: 0 }); |
| | | break |
| | | case '白板': |
| | | whiteBoard.value = true |
| | | break |
| | | case '标记': |
| | | break |
| | |
| | | const toolSelectHandle = (title) => { |
| | | toolSelectData.activeTool = title |
| | | toolSelectData.lineColorActive = '' |
| | | canvasBox.isDrawingMode = false |
| | | switch (title) { |
| | | case 'huabi': |
| | | init() |
| | | canvasBox.skipTargetFind = false |
| | | canvasBox.isDrawingMode = true |
| | | toolSelectData.graphType = '' |
| | | canvasBox.freeDrawingBrush.color = '#333' |
| | | canvasBox.freeDrawingBrush.width = '3' |
| | | canvasBox.on('mouse:down', '') // 鼠标在画布上按下 |
| | | canvasBox.on('mouse:up', '') |
| | | canvasBox.on('mouse:move', '') |
| | | break |
| | | case 'wenzi': |
| | | canvasBox.skipTargetFind = false |
| | | canvasBox.isDrawingMode = false |
| | | toolSelectData.graphType = '' |
| | | textBox = new fabric.IText('请输入文本', { |
| | | left: 50, |
| | | top: 50, |
| | | fontSize: toolSelectData.fontSizeActive |
| | | }) |
| | | canvasBox.add(textBox) |
| | | canvasBox.on('mouse:down', '') // 鼠标在画布上按下 |
| | | canvasBox.on('mouse:up', '') |
| | | canvasBox.on('mouse:move', '') |
| | | break |
| | | case 'tuxing': |
| | | canvasBox.isDrawingMode = false |
| | | canvasBox.selectionColor = 'transparent' |
| | | canvasBox.skipTargetFind = true |
| | | toolSelectData.lineColorActive = '#000' |
| | | break |
| | | case 'chexiao': |
| | | canvasBox.skipTargetFind = false |
| | | canvasBox.isDrawingMode = false |
| | | canvasBox.remove(activeElBox) |
| | | canvasBox.requestRenderAll() |
| | | activeElBox = null |
| | | break |
| | | case 'tuichu': |
| | | canvasBox.skipTargetFind = false |
| | | canvasBox.isDrawingMode = false |
| | | canvasShow.value = false |
| | | floatingToolData.activeToolData = '' |
| | | break |
| | | case 'qingchu': |
| | | canvas.clear() |
| | | canvasBox.clear() |
| | | break |
| | | } |
| | | } |
| | |
| | | //选中画笔粗细 |
| | | const selectThickness = (str) => { |
| | | toolSelectData.thicknessActive = str |
| | | canvas.freeDrawingBrush.color = toolSelectData.thicknessActive |
| | | canvasBox.freeDrawingBrush.width = toolSelectData.thicknessActive |
| | | } |
| | | |
| | | const selectLineType = (str) => { |
| | | toolSelectData.lineTypeActive = str |
| | | init() |
| | | if (toolSelectData.lineTypeActive == 'dashed') { |
| | | canvasBox.freeDrawingBrush.strokeDashArray = [10] |
| | | } else { |
| | | canvasBox.freeDrawingBrush.strokeDashArray = null |
| | | } |
| | | } |
| | | //画笔颜色选择 |
| | | const lineColorSelect = (item) => { |
| | | toolSelectData.lineColorActive = item.key |
| | | canvas.freeDrawingBrush.color = item.key |
| | | } |
| | | //画布属性 |
| | | const isDrawing = ref(true) // 是否开启绘图,true 开启;false 关闭 |
| | | const init = () => { |
| | | canvas = new fabric.Canvas('canvasRef', { |
| | | isDrawingMode: isDrawing.value // 启用绘画模式 |
| | | }) |
| | | canvas.freeDrawingBrush.color = toolSelectData.lineColorActive |
| | | canvas.freeDrawingBrush.width = toolSelectData.thicknessActive |
| | | if ((toolSelectData.activeTool == 'huabi')) { |
| | | canvasBox.freeDrawingBrush.color = item.key |
| | | } |
| | | if ((toolSelectData.activeTool == 'wenzi')) { |
| | | textBox.fill = toolSelectData.lineColorActive |
| | | } |
| | | } |
| | | |
| | | //文字大小 |
| | | const selectfontSize = (str) => { |
| | | toolSelectData.fontSizeActive = str |
| | | textBox.fontSize = toolSelectData.fontSizeActive |
| | | } |
| | | |
| | | //选择图形 |
| | |
| | | toolSelectData.graphType = type |
| | | switch (type) { |
| | | case 'square': |
| | | canvasBox.on('mouse:down', canvasMouseDown) // 鼠标在画布上按下 |
| | | canvasBox.on('mouse:up', canvasMouseUp) |
| | | canvasBox.selectionBorderColor = toolSelectData.lineColorActive |
| | | break |
| | | case 'rotundity': |
| | | canvasBox.on('mouse:down', canvasMouseDown) // 鼠标在画布上按下 |
| | | canvasBox.on('mouse:up', canvasMouseUp) |
| | | canvasBox.on('mouse:move', canvasMouseMove) |
| | | break |
| | | case 'triangle': |
| | | canvasBox.on('mouse:down', canvasMouseDown) // 鼠标在画布上按下 |
| | | canvasBox.on('mouse:up', canvasMouseUp) |
| | | canvasBox.on('mouse:move', canvasMouseMove) |
| | | break |
| | | case 'lineSegment': |
| | | canvasBox.on('mouse:down', canvasMouseDown) // 鼠标在画布上按下 |
| | | canvasBox.on('mouse:move', canvasMouseMove) // 鼠标在画布上移动 |
| | | canvasBox.on('mouse:up', canvasMouseUp) |
| | | break |
| | | } |
| | | } |
| | | |
| | | let downPoint = null // 鼠标按下的坐标 |
| | | let upPoint = null |
| | | let currentCircle = null // 临时圆,创建圆的时候使用 |
| | | let currentTriangle = null // 临时三角形 |
| | | let currentLine = null // 临时线段 |
| | | function canvasOnMouseDownDel(opt) { |
| | | // 右键,且在元素上右键 |
| | | // button: 1-左键;2-中键;3-右键 |
| | | // 在画布上右键,target 为 null |
| | | if (opt.button === 1 && opt.target) { |
| | | // 获取当前元素 |
| | | activeElBox = opt.target |
| | | } |
| | | } |
| | | // 鼠标在画布上按下 |
| | | function canvasMouseDown(e) { |
| | | downPoint = e.absolutePointer |
| | | if (toolSelectData.graphType === 'rotundity') { |
| | | currentCircle = new fabric.Circle({ |
| | | top: downPoint.y, |
| | | left: downPoint.x, |
| | | radius: 0, |
| | | fill: 'transparent', |
| | | stroke: toolSelectData.lineColorActive |
| | | }) |
| | | |
| | | canvasBox.add(currentCircle) |
| | | } |
| | | if (toolSelectData.graphType === 'triangle') { |
| | | currentTriangle = new fabric.Triangle({ |
| | | top: downPoint.y, |
| | | left: downPoint.x, |
| | | width: 0, |
| | | height: 0, |
| | | fill: 'transparent', |
| | | stroke: toolSelectData.lineColorActive |
| | | }) |
| | | canvasBox.add(currentTriangle) |
| | | } |
| | | if (toolSelectData.graphType === 'lineSegment') { |
| | | currentLine = new fabric.Line( |
| | | [ |
| | | downPoint.x, |
| | | downPoint.y, // 起始点坐标 |
| | | downPoint.x, |
| | | downPoint.y // 结束点坐标 |
| | | ], |
| | | { |
| | | stroke: toolSelectData.lineColorActive // 笔触颜色 |
| | | } |
| | | ) |
| | | canvasBox.add(currentLine) |
| | | } |
| | | } |
| | | // 鼠标在画布上松开 |
| | | function canvasMouseUp(e) { |
| | | if (toolSelectData.graphType === 'square') { |
| | | // 创建矩形 |
| | | createRect(e.absolutePointer) |
| | | } |
| | | |
| | | if (toolSelectData.graphType === 'rotundity') { |
| | | if (JSON.stringify(downPoint) === JSON.stringify(upPoint)) { |
| | | canvasBox.remove(currentCircle) |
| | | } else { |
| | | if (currentCircle) { |
| | | currentCircle.set('stroke', toolSelectData.lineColorActive) |
| | | } |
| | | } |
| | | currentCircle = null |
| | | } |
| | | |
| | | if (toolSelectData.graphType === 'triangle') { |
| | | if (JSON.stringify(downPoint) === JSON.stringify(upPoint)) { |
| | | canvasBox.remove(currentTriangle) |
| | | } else { |
| | | currentTriangle.set('stroke', toolSelectData.lineColorActive) |
| | | } |
| | | currentTriangle = null |
| | | } |
| | | |
| | | if (toolSelectData.graphType === 'lineSegment') { |
| | | if (JSON.stringify(downPoint) === JSON.stringify(upPoint)) { |
| | | canvasBox.remove(currentLine) |
| | | } else { |
| | | currentLine.set('stroke', toolSelectData.lineColorActive) |
| | | } |
| | | currentLine = null |
| | | } |
| | | } |
| | | // 创建矩形 |
| | | function createRect(pointer) { |
| | | // 点击事件,不生成矩形 |
| | | if (JSON.stringify(downPoint) === JSON.stringify(pointer)) { |
| | | return |
| | | } |
| | | |
| | | // 创建矩形 |
| | | // 矩形参数计算 |
| | | let top = Math.min(downPoint.y, pointer.y) |
| | | let left = Math.min(downPoint.x, pointer.x) |
| | | let width = Math.abs(downPoint.x - pointer.x) |
| | | let height = Math.abs(downPoint.y - pointer.y) |
| | | |
| | | // 矩形对象 |
| | | const rect = new fabric.Rect({ |
| | | top, |
| | | left, |
| | | width, |
| | | height, |
| | | fill: 'transparent', |
| | | stroke: toolSelectData.lineColorActive |
| | | }) |
| | | // 将矩形添加到画布上 |
| | | canvasBox.add(rect) |
| | | downPoint = null |
| | | } |
| | | // 鼠标在画布上移动 |
| | | function canvasMouseMove(e) { |
| | | if (toolSelectData.graphType === 'rotundity' && currentCircle) { |
| | | const currentPoint = e.absolutePointer |
| | | |
| | | let radius = |
| | | Math.min(Math.abs(downPoint.x - currentPoint.x), Math.abs(downPoint.y - currentPoint.y)) / 2 |
| | | let top = currentPoint.y > downPoint.y ? downPoint.y : downPoint.y - radius * 2 |
| | | let left = currentPoint.x > downPoint.x ? downPoint.x : downPoint.x - radius * 2 |
| | | |
| | | currentCircle.set('radius', radius) |
| | | currentCircle.set('top', top) |
| | | currentCircle.set('left', left) |
| | | |
| | | canvasBox.requestRenderAll() |
| | | } |
| | | if (toolSelectData.graphType === 'triangle' && currentTriangle) { |
| | | const currentPoint = e.absolutePointer |
| | | |
| | | let width = Math.abs(downPoint.x - currentPoint.x) |
| | | let height = Math.abs(downPoint.y - currentPoint.y) |
| | | |
| | | let top = currentPoint.y > downPoint.y ? downPoint.y : currentPoint.y |
| | | let left = currentPoint.x > downPoint.x ? downPoint.x : currentPoint.x |
| | | |
| | | currentTriangle.set('width', width) |
| | | currentTriangle.set('height', height) |
| | | currentTriangle.set('top', top) |
| | | currentTriangle.set('left', left) |
| | | canvasBox.requestRenderAll() |
| | | } |
| | | if (toolSelectData.graphType === 'lineSegment' && currentLine) { |
| | | const currentPoint = e.absolutePointer |
| | | |
| | | currentLine.set('x2', currentPoint.x) |
| | | currentLine.set('y2', currentPoint.y) |
| | | |
| | | canvasBox.requestRenderAll() |
| | | } |
| | | } |
| | | |
| | | //白板关闭 |
| | | const whiteBoardClose = () => { |
| | | whiteBoard.value = false |
| | | floatingToolData.activeToolData = '' |
| | | } |
| | | //标记显示隐藏 |
| | | const labelShow = (str) => { |
| | |
| | | |
| | | li > div { |
| | | // height: 50px; |
| | | padding: 10px 36px; |
| | | padding: 10px 36px 10px 25px; |
| | | font-size: 16px; |
| | | display: flex; |
| | | align-items: center; |
| | |
| | | .wendabox { |
| | | width: 100%; |
| | | height: 82vh; |
| | | padding:20px; |
| | | |
| | | iframe { |
| | | width: 100%; |
| | | height: 100%; |
| | | } |
| | | } |
| | | |
| | | .whiteBoardBox { |
| | | width: 100%; |
| | | height: 100%; |
| | | position: fixed; |
| | | top: 0; |
| | | left: 0; |
| | | z-index: 2000; |
| | | background-color: rgba(2, 2, 2, 0.3); |
| | | } |
| | | |
| | | .myDialogs, |
| | |
| | | right: 0px !important; |
| | | } |
| | | |
| | | .el-dialog__body { |
| | | padding: 20px !important; |
| | | } |
| | | // .el-dialog__body { |
| | | // padding: 20px !important; |
| | | // } |
| | | |
| | | .el-dialog__footer { |
| | | padding: 10px 20px 20px !important; |
| | |
| | | width: 100%; |
| | | overflow-y: scroll; |
| | | |
| | | img { |
| | | display: block; |
| | | margin: 0 auto; |
| | | width: 90%; |
| | | height: auto; |
| | | box-shadow: 0px 0px 10px 1px rgba(0, 0, 0, 0.1); |
| | | object-fit: contain; |
| | | } |
| | | img { |
| | | display: block; |
| | | margin: 0 auto; |
| | | width: 90%; |
| | | height: auto; |
| | | box-shadow: 0px 0px 10px 1px rgba(0, 0, 0, 0.1); |
| | | object-fit: contain; |
| | | } |
| | | } |
| | | |
| | | .imgUrlBox { |
| | |
| | | left: 50px; |
| | | } |
| | | .iframe-box { |
| | | width:100%; |
| | | width: 100%; |
| | | height: 800px; |
| | | } |
| | | </style> |