| | |
| | | <!-- 菜单 --> |
| | | <div class="menuBox"> |
| | | <div |
| | | :class="['menuItem', activeMenu == index ? 'active' : '']" |
| | | :class="['menuItem', activeMenu == item.name ? 'active' : '']" |
| | | v-for="(item, index) in menuData" |
| | | :key="index" |
| | | @click="menuItemClick(index)" |
| | | @click="menuItemClick(item.name)" |
| | | > |
| | | <div class="menuIcon imgBox"> |
| | | <img :src="item.icon" /> |
| | |
| | | </div> |
| | | </div> |
| | | </el-form-item> |
| | | <div class="inline"> |
| | | <!-- <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> |
| | | </div> --> |
| | | <el-form-item label="底色"> |
| | | <div class="bgColor"> |
| | | <div |
| | |
| | | <div class="menuContent" v-if="menuState.open"> |
| | | <div class="searchBox"> |
| | | <div class="inputBox" v-if="activeMenu !== 2"> |
| | | <el-input class="custom-input" placeholder="请输入内容" v-model="searchText" @keyup.enter="searchBook"> |
| | | <el-input |
| | | class="custom-input" |
| | | placeholder="请输入内容" |
| | | v-model="searchText" |
| | | @keyup.enter="searchBook" |
| | | > |
| | | <template #prefix> |
| | | <el-icon><Search /></el-icon> |
| | | <el-icon class="hover"><Search /></el-icon> |
| | | </template> |
| | | </el-input> |
| | | </div> |
| | |
| | | </div> |
| | | </div> |
| | | <!-- 目录 --> |
| | | <div class="menuList" v-if="activeMenu == 0"> |
| | | <div class="menuList" v-if="activeMenu == '目录'"> |
| | | <el-tree |
| | | ref="catalogTree" |
| | | style="max-width: 600px" |
| | |
| | | v-if="catalogueData.length > 0" |
| | | @node-click="handleNodeClick" |
| | | :filter-node-method="filterNode" |
| | | /> |
| | | > |
| | | <template #default="{ node, data }"> |
| | | <div class="custom-tree-node"> |
| | | <div class="catalogueLabel">{{ node.label }}</div> |
| | | <span class="pageNum">{{ data.page }}</span> |
| | | </div> |
| | | </template> |
| | | </el-tree> |
| | | <div v-if="catalogueData.length == 0"> |
| | | <el-empty :image-size="60" description="暂无数据" /> |
| | | </div> |
| | | </div> |
| | | <!-- 笔记 --> |
| | | <div class="notesBox" v-if="activeMenu == 1"> |
| | | <div class="notesBox" v-if="activeMenu == '笔记'"> |
| | | <div class="screenBox"> |
| | | <div class="title">筛选</div> |
| | | <div class="flex1 hover" @click="searchClick('all')"> |
| | |
| | | </div> |
| | | </div> |
| | | <div class="list-box"> |
| | | <div v-if="scribeData.noteList.length > 0 && !scribeData.loading"> |
| | | <div v-for="(item, index) in scribeData.noteList" :key="item.key" class="listItem"> |
| | | <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 v-if="scribeData.noteList.length > 0"> |
| | | <div v-for="(noteItem, index) in scribeData.noteList" :key="noteItem"> |
| | | <div class="chapterName">{{ noteItem.chapterName }}</div> |
| | | <div v-for="(item, index) in noteItem.noteList" :key="item.key" class="listItem"> |
| | | <div class="textBox"> |
| | | <div class="title"> |
| | | <div class="title-con"> |
| | | <div |
| | | class="border-left" |
| | | :style="{ 'border-right-color': item.color }" |
| | | ></div> |
| | | <span>{{ moment(item.createDate).format('YYYY-MM-DD') }}</span> |
| | | </div> |
| | | <div> |
| | | <img :src="bianji" @click="update(item)" /> |
| | | <img :src="shanchu" @click="deleteBtn(item)" /> |
| | | </div> |
| | | </div> |
| | | <div> |
| | | <img :src="bianji" @click="update(item, 'note')" /> |
| | | <img :src="shanchu" @click="deleteBtn(item, 'note')" /> |
| | | <div |
| | | class="noteText hover 123456" |
| | | @click="jumpContent(item)" |
| | | :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 hover"> |
| | | {{ item.note }} |
| | | </div> |
| | | </div> |
| | | <div class="chapter">{{ item.txt }}</div> |
| | | </div> |
| | | <div |
| | | class="noteText hover 123456" |
| | | @click="jumpContent(item)" |
| | | :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 hover"> |
| | | {{ item.note }} |
| | | </div> |
| | | </div> |
| | | <div class="chapter">{{ item.selectText }}</div> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | <div v-if="scribeData.noteList.length == 0 && !scribeData.loading"> |
| | | <div v-if="scribeData.noteList.length == 0"> |
| | | <el-empty :image-size="60" description="暂无数据" /> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | <!-- 资源 --> |
| | | <div class="" v-if="activeMenu == 2"> |
| | | <div class="" v-if="activeMenu == '资源'"> |
| | | <div class="resourceBox"> |
| | | <div class="classification"> |
| | | <div |
| | |
| | | </div> |
| | | </div> |
| | | <div class="inputBox" v-if="!searchShow"> |
| | | <el-input class="custom-input" placeholder="请输入内容" v-model="searchText"> |
| | | <el-input |
| | | class="custom-input" |
| | | placeholder="请输入内容" |
| | | v-model="searchText" |
| | | @keyup.enter="searchBook" |
| | | > |
| | | <template #prefix> |
| | | <el-icon @click="searchBook" class="hover"><Search /></el-icon> |
| | | <el-icon><Search /></el-icon> |
| | | </template> |
| | | </el-input> |
| | | </div> |
| | |
| | | ><Tickets |
| | | /></el-icon> |
| | | </div> |
| | | <div class="rName" v-if="searchText != ''" v-html="item.name"></div> |
| | | <div class="rName" v-else :title="item.resourceName"> |
| | | {{ item.resourceName }} |
| | | </div> |
| | | <div class="rName" v-html="item.resourceName"></div> |
| | | </div> |
| | | </el-col> |
| | | </el-row> |
| | |
| | | </div> |
| | | </div> |
| | | <!-- 知识图谱 --> |
| | | <div class="" v-if="activeMenu == 3"> |
| | | <div class="" v-if="activeMenu == '知识图谱'"> |
| | | <div class="list-box"> |
| | | <div> |
| | | <el-empty :image-size="60" description="暂无数据" /> |
| | |
| | | </div> |
| | | </div> |
| | | <!-- 截图 --> |
| | | <div class="" v-if="activeMenu == 4"> |
| | | <div class="" v-if="activeMenu == '截图'"> |
| | | <div class="list-box"> |
| | | <div class="screenshot" v-if="screenshotList.length > 0"> |
| | | <div v-for="(item, index) in screenshotList" :key="item" class="captureItem"> |
| | |
| | | </div> |
| | | </div> |
| | | <!-- 标签 --> |
| | | <div class="" v-if="activeMenu == 5"> |
| | | <div class="" v-if="activeMenu == '标签'"> |
| | | <div class="list-box"> |
| | | <div> |
| | | <el-empty :image-size="60" description="暂无数据" /> |
| | |
| | | <div class="pageBox"> |
| | | <!-- 头部显示 --> |
| | | <div class="pageBox-header"> |
| | | <div class="classTime"> |
| | | <div class="qureIcon"></div> |
| | | <div class="">已上课:{{ headerData.classTime }}</div> |
| | | <!-- <div class="classTime"> --> |
| | | <div style="width: 150px"> |
| | | <!-- <div class="qureIcon"></div> |
| | | <div class="">已上课:{{ headerData.classTime }}</div> --> |
| | | </div> |
| | | <div class="progress"> |
| | | <div class="bookName">{{ bookName }}</div> |
| | | <div>{{ headerData.process }}%</div> |
| | | <div v-if="headerData.totlePage && bookName"> |
| | | {{ headerData.process }}/{{ headerData.totlePage }} |
| | | </div> |
| | | </div> |
| | | <div class="rightBox"> |
| | | <div class="pageSizeBox"> |
| | |
| | | <div>{{ headerData.pageSize }}%</div> |
| | | <div><img :src="zoomOut" @click="changePageSize('reduce')" /></div> |
| | | </div> |
| | | <div class="brushImgBox"> |
| | | <!-- <div class="brushImgBox"> |
| | | <div @click="jumpContent('note' + index)"> |
| | | <img :src="huabi2" class="brushImg" />画笔 |
| | | </div> |
| | | </div> |
| | | </div> --> |
| | | </div> |
| | | </div> |
| | | <!-- 微应用盒子 --> |
| | |
| | | <!-- 教学组件 --> |
| | | <div class="toolBox"> |
| | | <div class="toolTitle"> |
| | | <span>{{ toolState.open ? '教学组件' : '组件' }}</span> |
| | | <span>{{ toolState.open ? '学习组件' : '组件' }}</span> |
| | | <div class="text"></div> |
| | | </div> |
| | | <div class="menuList"> |
| | |
| | | <img :src="shouqiR" v-if="toolState.open" @click="toolState.open = false" /> |
| | | <img :src="shouqiL" v-if="!toolState.open" @click="toolState.open = true" /> |
| | | </div> |
| | | <div class="classRoomBox" v-if="toolState.open"> |
| | | <div class="classRoomBox" v-if="false"> |
| | | <el-tabs v-model="activeName" class="demo-tabs" @tab-click="handleClick"> |
| | | <el-tab-pane label="备课组件" name="first"> |
| | | <div class="tabBox"> |
| | |
| | | </div> |
| | | </div> |
| | | </div> |
| | | <div class="brushBox" v-if="floatingToolData.activeToolData == '画笔'"> |
| | | <div |
| | | class="brushBox" |
| | | :style="{ left: brushBoxLeft + 'px' }" |
| | | v-if="floatingToolData.activeToolData == '画笔'" |
| | | > |
| | | <div class="toolList"> |
| | | <el-popover placement="top" width="250" trigger="click"> |
| | | <div class="popinnerBox"> |
| | |
| | | <template #reference> |
| | | <div class="floatToolItem" @click="toolSelectHandle('huabi')"> |
| | | <div class="imgBox"> |
| | | <img :src="hide" alt="" /> |
| | | <img :src="huabi2" alt="" /> |
| | | </div> |
| | | <div class="text">画笔</div> |
| | | </div> |
| | |
| | | </el-popover> |
| | | <el-popover placement="top" width="250" trigger="click"> |
| | | <div class="popinnerBox"> |
| | | <div class="write"> |
| | | <div class="characters"> |
| | | <div class="lineStyle"> |
| | | <div class="lineTypeBox"> |
| | | <div |
| | | :class="toolSelectData.fontSizeActive == '14' ? 'small active' : 'small'" |
| | | :class="toolSelectData.fontSizeActive == '14' ? 'typeItem lineTypeActive' : 'typeItem'" |
| | | @click="selectfontSize('14')" |
| | | > |
| | | 小 |
| | | <div class="activeIcon" v-if="toolSelectData.fontSizeActive == '14'"> |
| | | <img :src="xuanzhong" /> |
| | | </div> |
| | | </div> |
| | | <div |
| | | :class="toolSelectData.fontSizeActive == '16' ? 'middle active' : 'middle'" |
| | | :class="toolSelectData.fontSizeActive == '16' ? 'typeItem lineTypeActive' : 'typeItem'" |
| | | @click="selectfontSize('16')" |
| | | > |
| | | 中 |
| | | <div class="activeIcon" v-if="toolSelectData.fontSizeActive == '16'"> |
| | | <img :src="xuanzhong" /> |
| | | </div> |
| | | </div> |
| | | <div |
| | | :class="toolSelectData.fontSizeActive == '18' ? 'large active' : 'large'" |
| | | :class="toolSelectData.fontSizeActive == '18' ? 'typeItem lineTypeActive' : 'typeItem'" |
| | | @click="selectfontSize('18')" |
| | | > |
| | | 大 |
| | | <div class="activeIcon" v-if="toolSelectData.fontSizeActive == '18'"> |
| | | <img :src="xuanzhong" /> |
| | | </div> |
| | | </div> |
| | | </div> |
| | | <div class="lineStyle"> |
| | |
| | | </el-popover> |
| | | <el-popover placement="top" width="250" trigger="click"> |
| | | <div class="popinnerBox"> |
| | | <div class="write"> |
| | | <div class="characters"> |
| | | <div |
| | | :class="floatingToolData.fontSizeActive == '14' ? 'small active' : 'small'" |
| | | @click="selectfontSize('14')" |
| | | > |
| | | 小 |
| | | </div> |
| | | <div |
| | | :class="toolSelectData.fontSizeActive == '16' ? 'middle active' : 'middle'" |
| | | @click="selectfontSize('16')" |
| | | > |
| | | 中 |
| | | </div> |
| | | <div |
| | | :class="toolSelectData.fontSizeActive == '18' ? 'large active' : 'large'" |
| | | @click="selectfontSize('18')" |
| | | > |
| | | 大 |
| | | </div> |
| | | <div class="graphBox"> |
| | | <div class="graphSelect"> |
| | | |
| | | |
| | | </div> |
| | | <div class="lineStyle"> |
| | | <div class="colorSelectBox"> |
| | |
| | | </el-popover> |
| | | <div class="floatToolItem" @click="toolSelectHandle('xiangpi')"> |
| | | <div class="imgBox"> |
| | | <img :src="clearPrevious" alt="" /> |
| | | <img :src="clear" alt="" /> |
| | | </div> |
| | | <div class="text">橡皮擦</div> |
| | | </div> |
| | | <div class="floatToolItem" @click="toolSelectHandle('chexiao')"> |
| | | <div class="imgBox"> |
| | | <img :src="clear" alt="" /> |
| | | <img :src="clearPrevious" alt="" /> |
| | | </div> |
| | | <div class="text">撤销</div> |
| | | </div> |
| | | <div class="floatToolItem" @click="toolSelectHandle('chongzuo')"> |
| | | <div class="imgBox"> |
| | | <img :src="hide" alt="" /> |
| | | <img :src="chongzuo" alt="" /> |
| | | </div> |
| | | <div class="text">重做</div> |
| | | </div> |
| | | <div class="floatToolItem" @click="toolSelectHandle('qingchu')"> |
| | | <div class="imgBox"> |
| | | <img :src="hide" alt="" /> |
| | | <img :src="qingchu2" alt="" /> |
| | | </div> |
| | | <div class="text">清除</div> |
| | | </div> |
| | |
| | | v-show="lineDelete.showLineDelete" |
| | | :style="{ top: `${lineDelete.top}px`, left: `${lineDelete.left}px` }" |
| | | > |
| | | <el-button @click="lineDeleteBtn">删除</el-button> |
| | | <el-button @click="delUserKey">删除</el-button> |
| | | </div> |
| | | |
| | | <el-dialog title="资源" align-center v-model="resourVisble" width="845" class="resourDialog"> |
| | |
| | | <template #footer> |
| | | <span class="dialog-footer"> |
| | | <el-button @click="handleClose">取 消</el-button> |
| | | <el-button type="primary" @click="addUserKey">确 定</el-button> |
| | | <el-button type="primary" @click="addUserKey" v-if="!isUpdate">确 定</el-button> |
| | | <el-button type="primary" @click="updateUserKey" v-if="isUpdate">确 定</el-button> |
| | | </span> |
| | | </template> |
| | | </el-dialog> |
| | |
| | | </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> |
| | | <iframe :src="'https://baike.baidu.com/item/' + dialogToolData.txt" frameborder="0"></iframe> |
| | | </div> |
| | | </el-dialog> |
| | | <el-dialog title="AI智能问答" align-center v-model="wendaVisible" width="26%" class="myDialogs"> |
| | |
| | | <el-dialog title="词典" align-center v-model="cidianVisible" width="60%" class="myDialogs"> |
| | | <div class="wendabox"> |
| | | <!-- <iframe src="https://www.vocabulary.com/" frameborder="0"></iframe> --> |
| | | <dictionary :searchCon="selectText" /> |
| | | <dictionary :searchCon="dialogToolData.txt" /> |
| | | </div> |
| | | </el-dialog> |
| | | <el-dialog |
| | |
| | | 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' |
| | |
| | | const screenWidth = ref( |
| | | window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth |
| | | ) |
| | | |
| | | const brushBoxLeft = ref(500) |
| | | let microApp = null // 微应用实例 |
| | | const bookName = ref('') |
| | | const bookId = ref(1) |
| | |
| | | menuState.open = false |
| | | toolState.open = false |
| | | } |
| | | brushBoxLeft.value = (screenWidth.value - 450) / 2 |
| | | window.onresize = () => { |
| | | return (() => { |
| | | screenWidth.value = |
| | |
| | | windowSelection: (data) => { |
| | | // 绑定子应用选择监听事件 |
| | | console.log(data, '子应用选择') |
| | | if(data.txt){ |
| | | if (data.txt) { |
| | | getSelection(data) |
| | | }else{ |
| | | } else { |
| | | showToolBox.value = false |
| | | lineDelete.showLineDelete = false |
| | | toolActive.value = '' |
| | | lineDelete.top = data.y + 20 |
| | | lineDelete.left = data.x |
| | | } |
| | | }, |
| | | catalogChange: (data) => { |
| | |
| | | // catalogName: "", |
| | | // } |
| | | console.log(data, '页面切换:目前显示页面和对应的章节信息') |
| | | }, |
| | | |
| | | } |
| | | }) |
| | | // 调用子层方法 |
| | | // if (window.qiankunState && window.qiankunState.aa) window.qiankunState.aa(1) |
| | |
| | | if (screenWidth.value < 1180) { |
| | | menuState.open = false |
| | | toolState.open = false |
| | | floatingToolData.elLeft = 100 |
| | | } else { |
| | | floatingToolData.elLeft = 300 |
| | | } |
| | | } |
| | | ) |
| | | watch( |
| | | () => bookId.value, |
| | | (val) => { |
| | | // getNotesList() // 获取笔记 |
| | | getNotesList() // 获取菜单笔记 |
| | | // getlineHeightList() //获取高亮 |
| | | // getScribeList() //获取划线 |
| | | // getScreenshotList() //截图 |
| | | getScreenshotList() //截图 |
| | | } |
| | | ) |
| | | //获取目录 |
| | |
| | | axios |
| | | .get(resourceUrl + '/1/information.json?t=123') |
| | | .then(function (response) { |
| | | console.log(response.data) |
| | | console.log(response.data, '目录') |
| | | var json = response.data |
| | | // 处理获取到的json数据 |
| | | |
| | | catalogueData.value = json.data |
| | | headerData.totlePage = json.data[json.data.length - 1].end |
| | | console.log(json[json.length - 1]) |
| | | }) |
| | | .catch(function (error) { |
| | | console.log(error) |
| | |
| | | } |
| | | const defaultProps = { |
| | | children: 'children', |
| | | label: 'label' |
| | | label: 'label', |
| | | page: 'page' |
| | | } |
| | | const filterNode = (value, data) => { |
| | | if (!value) return true |
| | |
| | | |
| | | const handleNodeClick = (data) => { |
| | | console.log(data) |
| | | headerData.process = data.start |
| | | if (window.qiankunState && window.qiankunState.gotoPage) |
| | | window.qiankunState.gotoPage(data.chapter, data.start) |
| | | } |
| | |
| | | resourceDataList.value = resourceDocList.value |
| | | break |
| | | } |
| | | resourceDataList.value.forEach((item) => { |
| | | item.resourceName = '<p>' + htmlStr + '</p>' |
| | | }) |
| | | } |
| | | const searchBtn = () => { |
| | | if (searchShow.value) { |
| | |
| | | icon: jietu |
| | | }, |
| | | { |
| | | name: '标签', |
| | | name: '书签', |
| | | icon: biaoqian |
| | | } |
| | | ]) |
| | | // 选中菜单 |
| | | const activeMenu = ref(0) |
| | | const activeMenu = ref('目录') |
| | | //资源类型 |
| | | const resourceType = ref('default') |
| | | // 菜单点击 |
| | | const menuItemClick = (index) => { |
| | | activeMenu.value = index |
| | | const menuItemClick = (name) => { |
| | | activeMenu.value = name |
| | | searchText.value = '' |
| | | menuState.open = true |
| | | switch (index) { |
| | | case '0': |
| | | switch (name) { |
| | | case '目录': |
| | | break |
| | | case '1': |
| | | case '笔记': |
| | | getNotesList() |
| | | break |
| | | case '2': |
| | | case '资源': |
| | | break |
| | | case '3': |
| | | case '知识图谱': |
| | | break |
| | | case '4': |
| | | case '截图': |
| | | getScreenshotList() |
| | | break |
| | | case '5': |
| | | case '书签': |
| | | break |
| | | } |
| | | } |
| | |
| | | |
| | | const selectResourceType = (type) => { |
| | | resourceType.value = type |
| | | if (resourceType.value == 'teacher') { |
| | | activeClassify.value = 'image' |
| | | resourceDataList.value = [] |
| | | } else { |
| | | activeClassify.value = 'image' |
| | | resourceDataList.value = resourceImgList.value |
| | | } |
| | | } |
| | | const searchText = ref<string>('') //筛选 |
| | | const menuState = reactive({ |
| | |
| | | fontSizeList: [ |
| | | { |
| | | lable: '小', |
| | | key: '14' |
| | | key: 14 |
| | | }, |
| | | { |
| | | lable: '中', |
| | | key: '16' |
| | | key: 16 |
| | | }, |
| | | |
| | | { |
| | | lable: '大', |
| | | key: '18' |
| | | key: 18 |
| | | } |
| | | ], |
| | | fontSizeActive: '16', |
| | | fontSizeActive: 16, |
| | | acoustics: false, |
| | | animation: false, |
| | | bgColorList: [ |
| | |
| | | }) |
| | | const fontSizeSelect = (item) => { |
| | | settingForm.fontSizeActive = item.key |
| | | document.getElementById('app').style.fontSize = item.key + 'px' |
| | | window.qiankunActions.setGlobalState({ |
| | | fontSize: item.key |
| | | }) |
| | | } |
| | | const bgColorSelect = (item) => { |
| | | settingForm.bgColorActive = item.key |
| | |
| | | } |
| | | const catalogTree = ref() |
| | | const searchBook = async () => { |
| | | if (activeMenu.value == 0) { |
| | | if (catalogTree) catalogTree.value.filter(searchText.value) |
| | | } |
| | | 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) |
| | | switch (activeMenu.value) { |
| | | case '目录': |
| | | if (catalogTree) catalogTree.value.filter(searchText.value) |
| | | break |
| | | case '笔记': |
| | | getNotesList() |
| | | break |
| | | case '资源': |
| | | 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.resourceName.indexOf(text) > -1) { |
| | | let replaceStr = "<span style='background:#F5E12A'>" + text + '</span>' |
| | | let htmlStr = item.resourceName.split(text).join(replaceStr) |
| | | item.resourceName = '<p>' + htmlStr + '</p>' |
| | | resourceDataList.value.push(item) |
| | | } |
| | | }) |
| | | } else { |
| | | resourceDataList.value = [] |
| | | switch (activeClassify.value) { |
| | | case 'image': |
| | | resourceDataList.value = resourceImgList.value |
| | | break |
| | | case 'audio': |
| | | resourceDataList.value = resourceAudioList.value |
| | | break |
| | | case 'video': |
| | | resourceDataList.value = resourceVideoList.value |
| | | break |
| | | case 'other': |
| | | resourceDataList.value = resourceDocList.value |
| | | break |
| | | } |
| | | }) |
| | | } |
| | | resourceDataList.value.forEach((item) => { |
| | | item.resourceName = '<p>' + htmlStr + '</p>' |
| | | }) |
| | | } |
| | | break |
| | | case '知识图谱': |
| | | break |
| | | case '截图': |
| | | getScreenshotList() |
| | | break |
| | | case '书签': |
| | | break |
| | | } |
| | | } |
| | | |
| | |
| | | { |
| | | activeIcon: biaoqian1, |
| | | icon: biaoqianw, |
| | | name: '标签' |
| | | name: '书签' |
| | | }, |
| | | { |
| | | activeIcon: jieping1, |
| | |
| | | //浮窗工具栏点击事件 |
| | | const floatItemHandle = (item) => { |
| | | floatingToolData.activeToolData = item.name |
| | | switch (item.name) { |
| | | switch (floatingToolData.activeToolData) { |
| | | case '画笔': |
| | | canvasShow.value = true |
| | | toolSelectData.activeTool = 'huabi' |
| | | break |
| | | case '标注': |
| | | break |
| | | case '标签': |
| | | case '书签': |
| | | reMark() |
| | | break |
| | | case '截屏': |
| | |
| | | //标注显示隐藏 |
| | | const labelShow = (str) => {} |
| | | |
| | | //标签 |
| | | //书签 |
| | | const reMark = () => {} |
| | | //截图 |
| | | //截图事件 |
| | |
| | | } |
| | | }).then((res) => { |
| | | if (res && res.length > 0 && res[0].value) { |
| | | screenshotList.value = JSON.parse(res[0].value) |
| | | screenshotList.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) |
| | | } |
| | | } else { |
| | | screenshotList.value.push(item) |
| | | } |
| | | }) |
| | | console.log(screenshotList.value,"124") |
| | | } |
| | | }) |
| | | } |
| | |
| | | } |
| | | |
| | | //选中文字工具栏 |
| | | const selectText = ref('') //选中文字 |
| | | const showToolBox = ref(false) |
| | | const dialogToolData = reactive({ |
| | | left: 500, |
| | |
| | | { icon: fuzhi, activeIcon: fuzhi1, name: '复制' }, |
| | | { icon: AIyuedu, activeIcon: AIyuedu1, name: 'AI阅读' }, |
| | | { icon: cidian2, activeIcon: cidian1, name: '词典' }, |
| | | { icon: baidu, activeIcon: cidian1, name: '百科' } |
| | | { icon: baidu, activeIcon: baidu, name: '百科' } |
| | | // { icon: yuyinyuedu, activeIcon: yuyinyuedu1, name: '语音阅读' } |
| | | // { icon: cidian2, activeIcon: cidian1, name: '翻译' } |
| | | ]) |
| | |
| | | |
| | | //笔记弹窗 |
| | | const addNoteVisble = ref(false) |
| | | const isUpdate = ref(false) |
| | | const formData = reactive({ |
| | | id: '', |
| | | desc: '' |
| | | }) |
| | | //笔记弹窗关闭 |
| | |
| | | colorActive.value = '' |
| | | switch (item.name) { |
| | | case 'AI阅读': |
| | | const utterance = new SpeechSynthesisUtterance(selectText.value) |
| | | const utterance = new SpeechSynthesisUtterance(dialogToolData.txt) |
| | | utterance.lang = 'zh-CN' // 设置语言为中文 |
| | | synth.speak(utterance) |
| | | showToolBox.value = false |
| | | break |
| | | case '划线': |
| | | break |
| | |
| | | case '复制': |
| | | try { |
| | | //复制 |
| | | await toClipboard(selectText.value) |
| | | await toClipboard(dialogToolData.txt) |
| | | //下面可以设置复制成功的提示框等操作 |
| | | ElMessage({ |
| | | message: '复制成功', |
| | |
| | | cidianVisible.value = true |
| | | break |
| | | case '百科': |
| | | console.log('https://baike.baidu.com/item/' + dialogToolData.txt) |
| | | baiduVisible.value = true |
| | | break |
| | | } |
| | |
| | | case '高亮': |
| | | dom = 'highLightData-' + bookId.value |
| | | 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 |
| | | }) |
| | |
| | | case '划线': |
| | | dom = 'underline-' + bookId.value |
| | | 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 |
| | | }) |
| | |
| | | return |
| | | } |
| | | dom = 'notes-' + bookId.value |
| | | data = |
| | | dialogToolData.notesList.length != 0 ? dialogToolData.notesList[dialogToolData.chapter] : [] |
| | | 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(), |
| | |
| | | } |
| | | }).then((res) => { |
| | | showToolBox.value = false |
| | | addNoteVisble.value = false |
| | | colorActive.value = '' |
| | | noteColorActive.value = '' |
| | | toolActive.value = '' |
| | | getSignData() |
| | | getNotesList() |
| | | }) |
| | | } |
| | | |
| | | const delUserKey = (type, ids) => { |
| | | switch (type) { |
| | | case 'Highlight': |
| | | dom = 'highLightData-' + bookId.value |
| | | data = dialogToolData.lineHeight |
| | | break |
| | | case 'Dashing': |
| | | dom = 'underline-' + bookId.value |
| | | data = dialogToolData.scribeList |
| | | break |
| | | } |
| | | data = data.filter((item) => ids.indexOf(item.id) == -1) |
| | | request({ |
| | | url: '/identity/api/ApiAppUserSetKey', |
| | | method: 'post', |
| | | data: { |
| | | setKeyRequests: [ |
| | | { |
| | | domain: dom, |
| | | key: '', |
| | | value: JSON.stringify(data) |
| | | } |
| | | ] |
| | | } |
| | | }).then((res) => {}) |
| | | } |
| | | |
| | | const getSignData = () => { |
| | |
| | | const data = JSON.parse(item.value) |
| | | // 储值 |
| | | dialogToolData.scribeList[item.key] = data |
| | | |
| | | // 渲染 |
| | | for (let j = 0; j < data.length; j++) { |
| | | const citem = data[j] |
| | |
| | | }) |
| | | } |
| | | |
| | | //菜单笔记列表 |
| | | const getNotesList = () => { |
| | | let chapterList = [] |
| | | catalogueData.value.forEach((item) => { |
| | | chapterList.push(item.chapter + '') |
| | | }) |
| | | scribeData.noteList = [] |
| | | request({ |
| | | url: '/identity/api/ApiGetAppUserKey', |
| | | method: 'post', |
| | | data: { |
| | | domain: 'notes-' + bookId.value, |
| | | keys: chapterList |
| | | } |
| | | }).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)) |
| | | 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 = list |
| | | } 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 (data.chapter == Number(item.key) && itemList.length > 0) { |
| | | scribeData.noteList.push({ |
| | | chapter: data.chapter, |
| | | chapterName: data.label, |
| | | noteList: itemList |
| | | }) |
| | | } |
| | | } |
| | | console.log(scribeData.noteList, 'scribeData.noteList') |
| | | } |
| | | }) |
| | | } |
| | | |
| | | //正文中删除高亮,划线,笔记操作框 |
| | | const lineDelete = reactive({ |
| | | showLineDelete: false, |
| | | top: 0, |
| | | left: 0, |
| | | deleteType: '', |
| | | deleteTxt: '' |
| | | id: '' |
| | | }) |
| | | |
| | | // 划线、笔记、高亮点击回调 |
| | | window.signClick = (type, id) => { |
| | | console.log('signClick点击事件回调的实例', type, id) |
| | | } |
| | | |
| | | window.notesVisbleShow = function (txt) { |
| | | addNoteVisble.value = true |
| | | let notes = dialogToolData.notesList.find((item) => item.selectText == txt) |
| | | formData.desc = notes.note |
| | | colorActive.value = notes.color |
| | | selectNode.value = notes.selectNode |
| | | selectText.value = notes.selectText |
| | | selectPage.value = notes.selectPage |
| | | dialogToolData.chapter = notes.chapter |
| | | } |
| | | |
| | | window.deleteScribeShow = function (txt) { |
| | | let lines = scribeData.scribeDataList.find((item) => item.selectText == txt) |
| | | lineDelete.deleteType = 'underline' |
| | | lineDelete.deleteTxt = txt |
| | | lineDelete.top = event.screenY |
| | | lineDelete.left = event.screenX |
| | | lineDelete.showLineDelete = true |
| | | } |
| | | |
| | | window.deletelineHeightShow = function (txt) { |
| | | let lines = scribeData.lineHeightList.find((item) => item.selectText == txt) |
| | | lineDelete.deleteType = 'highLight' |
| | | lineDelete.deleteTxt = txt |
| | | lineDelete.top = event.screenY |
| | | lineDelete.left = event.screenX |
| | | lineDelete.showLineDelete = true |
| | | } |
| | | |
| | | const lineDeleteBtn = () => { |
| | | if (lineDelete.deleteType == 'underline') { |
| | | let list = scribeData.scribeDataList.filter((item) => item.selectText != lineDelete.deleteTxt) |
| | | request({ |
| | | url: '/identity/api/ApiAppUserSetKey', |
| | | method: 'post', |
| | | data: { |
| | | setKeyRequests: [ |
| | | { |
| | | domain: 'underline', |
| | | key: bookId.value, |
| | | value: JSON.stringify(list) |
| | | } |
| | | ] |
| | | } |
| | | }).then((res) => { |
| | | lineDelete.showLineDelete = false |
| | | let list = document.querySelectorAll('.underline') |
| | | list.forEach((itemNode) => { |
| | | if (itemNode.innerText == lineDelete.deleteTxt) { |
| | | itemNode.removeAttribute('style') |
| | | itemNode.className = '' |
| | | itemNode.removeAttribute('onclick') |
| | | } |
| | | }) |
| | | getScribeList() |
| | | }) |
| | | } else if (lineDelete.deleteType == 'highLight') { |
| | | let list = scribeData.lineHeightList.filter((item) => item.selectText != lineDelete.deleteTxt) |
| | | request({ |
| | | url: '/identity/api/ApiAppUserSetKey', |
| | | method: 'post', |
| | | data: { |
| | | setKeyRequests: [ |
| | | { |
| | | domain: 'highLight', |
| | | key: bookId.value, |
| | | value: JSON.stringify(list) |
| | | } |
| | | ] |
| | | } |
| | | }).then((res) => { |
| | | lineDelete.showLineDelete = false |
| | | let list = document.querySelectorAll('.highLight') |
| | | list.forEach((itemNode) => { |
| | | if (itemNode.innerText == lineDelete.deleteTxt) { |
| | | itemNode.removeAttribute('style') |
| | | itemNode.className = '' |
| | | itemNode.removeAttribute('onclick') |
| | | } |
| | | }) |
| | | getlineHeightList() |
| | | }) |
| | | window.signClick = (type, id, chapterNum) => { |
| | | console.log('signClick点击事件回调的实例', type, id, chapterNum) |
| | | dialogToolData.chapter = chapterNum |
| | | if (type == 'Note') { |
| | | let list = dialogToolData.notesList[chapterNum] |
| | | let data = list.find((item) => item.id == id) |
| | | console.log(data, 123) |
| | | formData.id = id |
| | | formData.desc = data.note |
| | | noteColorActive.value = data.color |
| | | addNoteVisble.value = true |
| | | isUpdate.value = true |
| | | } else { |
| | | lineDelete.showLineDelete = true |
| | | lineDelete.deleteType = type |
| | | lineDelete.id = id |
| | | dialogToolData.chapter = chapterNum |
| | | } |
| | | } |
| | | |
| | | const delUserKey = () => { |
| | | let type = lineDelete.deleteType |
| | | let ids = lineDelete.id |
| | | let dom = '' |
| | | let data = null |
| | | switch (type) { |
| | | case 'Highlight': |
| | | dom = 'highLightData-' + bookId.value |
| | | data = dialogToolData.lineHeight |
| | | break |
| | | case 'Dashing': |
| | | dom = 'underline-' + bookId.value |
| | | data = dialogToolData.scribeList |
| | | break |
| | | } |
| | | let list = data[dialogToolData.chapter].filter((item) => item.id != ids) |
| | | request({ |
| | | url: '/identity/api/ApiAppUserSetKey', |
| | | method: 'post', |
| | | data: { |
| | | setKeyRequests: [ |
| | | { |
| | | domain: dom, |
| | | key: dialogToolData.chapter, |
| | | value: JSON.stringify(list) |
| | | } |
| | | ] |
| | | } |
| | | }).then((res) => { |
| | | lineDelete.showLineDelete = false |
| | | if (window.qiankunState && window.qiankunState.delSign) |
| | | window.qiankunState.delSign({ ids: [ids] }) |
| | | getSignData() |
| | | }) |
| | | } |
| | | |
| | | //笔记跳转 |
| | | const jumpContent = (item) => { |
| | | console.log(item) |
| | | if (window.qiankunState && window.qiankunState.gotoPage) window.qiankunState.gotoPage(5, 100) |
| | | if (window.qiankunState && window.qiankunState.gotoPage) |
| | | window.qiankunState.gotoPage(Number(item.chapterNum), Number(item.page)) |
| | | } |
| | | |
| | | //笔记编辑 |
| | | const update = (item, type) => { |
| | | dialogToolData.notesList.splice( |
| | | dialogToolData.notesList.findIndex((itemData) => itemData.selectText == item.selectText), |
| | | 1 |
| | | ) |
| | | dialogToolData.txt = item.txt |
| | | dialogToolData.page = item.page |
| | | //菜单笔记编辑 |
| | | const update = (item) => { |
| | | console.log(item) |
| | | dialogToolData.chapter = item.chapterNum |
| | | noteColorActive.value = item.color |
| | | dialogToolData.chapter = item.chapter |
| | | formData.id = item.id |
| | | formData.desc = item.note |
| | | addNoteVisble.value = true |
| | | isUpdate.value = true |
| | | } |
| | | const updateUserKey = () => { |
| | | let data = scribeData.noteList.find((item1) => item1.chapter == dialogToolData.chapter) |
| | | data.noteList.forEach((itemNote) => { |
| | | if ((itemNote.id = formData.id)) { |
| | | itemNote.note = formData.desc |
| | | } |
| | | }) |
| | | request({ |
| | | url: '/identity/api/ApiAppUserSetKey', |
| | | method: 'post', |
| | | data: { |
| | | setKeyRequests: [ |
| | | { |
| | | domain: 'notes-' + bookId.value, |
| | | key: dialogToolData.chapter, |
| | | value: JSON.stringify(data.noteList) |
| | | } |
| | | ] |
| | | } |
| | | }).then((res) => { |
| | | addNoteVisble.value = false |
| | | isUpdate.value = false |
| | | getNotesList() |
| | | getSignData() |
| | | }) |
| | | } |
| | | |
| | | //删除 |
| | | const deleteBtn = (item, type) => { |
| | | if (type == 'note') { |
| | | // 移除 |
| | | let list = scribeData.noteList.filter((itemData) => itemData.selectText !== item.selectText) |
| | | request({ |
| | | url: '/identity/api/ApiAppUserSetKey', |
| | | method: 'post', |
| | | data: { |
| | | setKeyRequests: [ |
| | | { |
| | | domain: 'notes', |
| | | key: bookId.value, |
| | | value: JSON.stringify(list) |
| | | } |
| | | ] |
| | | } |
| | | }).then((res) => { |
| | | ElMessage({ |
| | | message: '删除笔记成功!', |
| | | type: 'success' |
| | | }) |
| | | console.log(document.querySelectorAll('.notesline')) |
| | | let list = document.querySelectorAll('.notesline') |
| | | list.forEach((itemNode) => { |
| | | if (itemNode.innerText == item.selectText) { |
| | | console.log(itemNode.nextSibling) |
| | | itemNode.removeAttribute('style') |
| | | itemNode.nextSibling?.remove() |
| | | //菜单删除笔记 |
| | | const deleteBtn = (item) => { |
| | | let data = scribeData.noteList.find((item1) => item1.chapter == Number(item.chapterNum)) |
| | | // 移除 |
| | | let list = data.noteList.filter((itemData) => itemData.id !== item.id) |
| | | request({ |
| | | url: '/identity/api/ApiAppUserSetKey', |
| | | method: 'post', |
| | | data: { |
| | | setKeyRequests: [ |
| | | { |
| | | domain: 'notes-' + bookId.value, |
| | | key: item.chapterNum, |
| | | value: JSON.stringify(list) |
| | | } |
| | | }) |
| | | getNotesList() |
| | | ] |
| | | } |
| | | }).then((res) => { |
| | | ElMessage({ |
| | | message: '删除笔记成功!', |
| | | type: 'success' |
| | | }) |
| | | } |
| | | getNotesList() |
| | | if (window.qiankunState && window.qiankunState.delSign) { |
| | | window.qiankunState.delSign({ ids: [item.id] }) |
| | | } |
| | | }) |
| | | } |
| | | |
| | | //内容区域顶部显示 |
| | |
| | | minutes: 0, |
| | | hours: 0, |
| | | process: 0, |
| | | totlePage: 0, |
| | | pageSize: 100 |
| | | }) |
| | | //上课时长计时器 |
| | |
| | | } |
| | | |
| | | const changePageSize = (str) => { |
| | | if (str == 'add') { |
| | | headerData.pageSize = Number(headerData.pageSize) + 5 |
| | | } else { |
| | | headerData.pageSize = Number(headerData.pageSize) - 5 |
| | | if (str == 'add' && headerData.pageSize < 150) { |
| | | headerData.pageSize = Number(headerData.pageSize) + 10 |
| | | window.qiankunActions.setGlobalState({ |
| | | scale: headerData.pageSize |
| | | }) |
| | | } else if (str == 'reduce' && headerData.pageSize > 50) { |
| | | headerData.pageSize = Number(headerData.pageSize) - 10 |
| | | window.qiankunActions.setGlobalState({ |
| | | scale: headerData.pageSize |
| | | }) |
| | | } |
| | | } |
| | | |
| | | const layoutBtn = () => { |
| | | localStorage.clear() |
| | | console.log(888) |
| | | router.push('/login') |
| | | } |
| | | </script> |
| | |
| | | align-items: center; |
| | | } |
| | | .resourceBox { |
| | | padding: 15px 0; |
| | | padding: 10px 0; |
| | | margin: 0 20px; |
| | | border-bottom: 1px solid rgba(204, 204, 204, 0.32); |
| | | .classification { |
| | |
| | | } |
| | | .count { |
| | | width: 35px; |
| | | margin: 5px auto; |
| | | margin: 0 auto; |
| | | margin-top: 5px; |
| | | border-radius: 10px; |
| | | background: #fff; |
| | | color: #c8c8c8; |
| | | height: 18px; |
| | | font-size: 12px; |
| | | } |
| | | .activeClassify, |
| | | .classifyItem:hover { |
| | |
| | | } |
| | | .inputBox { |
| | | margin-top: 10px; |
| | | width: 100% !important; |
| | | } |
| | | } |
| | | .resourceTab { |
| | |
| | | } |
| | | } |
| | | .inputBox { |
| | | width: 85%; |
| | | .custom-input { |
| | | border: 1px solid #0093ff !important; |
| | | border-radius: 50px; |
| | | overflow: hidden; |
| | | background: #fff; |
| | | height: 34px; |
| | | } |
| | | .is-focus, |
| | | .el-input__wrapper { |
| | |
| | | } |
| | | } |
| | | } |
| | | .chapterName { |
| | | margin: 15px; |
| | | } |
| | | } |
| | | } |
| | | .menuStateBox { |
| | |
| | | padding: 0 20px; |
| | | background: #fff; |
| | | display: flex; |
| | | z-index: 99; |
| | | align-items: center; |
| | | justify-content: space-between; |
| | | .classTime { |
| | |
| | | .progress { |
| | | text-align: center; |
| | | .bookName { |
| | | font-weight: bold; |
| | | margin-bottom: 3px; |
| | | font-weight: 800; |
| | | margin-bottom: 5px; |
| | | color: #333; |
| | | } |
| | | } |
| | | .rightBox { |
| | |
| | | display: flex; |
| | | align-items: center; |
| | | padding: 0 20px; |
| | | border-right: 1px solid #d8d8d8; |
| | | |
| | | div { |
| | | padding: 5px; |
| | | img { |
| | | width: 18px; |
| | | height: 18px; |
| | | } |
| | | } |
| | | } |
| | | .brushImgBox { |
| | | display: flex; |
| | | align-items: center; |
| | | border-left: 1px solid #d8d8d8; |
| | | div { |
| | | padding: 5px; |
| | | display: flex; |
| | |
| | | .pageBox-content { |
| | | height: calc(100% - 57px); |
| | | background: #fbf9f4; |
| | | padding: 10px 0; |
| | | .content-box { |
| | | height: 100%; |
| | | position: relative; |
| | |
| | | border-radius: 3px 0px 0px 3px; |
| | | border: 1px solid #bce3ff; |
| | | position: absolute; |
| | | line-height: 22px; |
| | | top: 50%; |
| | | right: 50px; |
| | | text-align: center; |
| | | box-shadow: 0px 0px 6px 1px rgba(0, 0, 0, 0.16); |
| | | display: flex; |
| | | align-items: center; |
| | | justify-content: center; |
| | | |
| | | img { |
| | | height: 10px; |
| | | width: 18px; |
| | |
| | | height: 310px; |
| | | top: 300px; |
| | | left: 450px; |
| | | z-index: 99; |
| | | z-index: 2000; |
| | | border-radius: 10px; |
| | | padding: 5px; |
| | | overflow: hidden; |
| | |
| | | align-items: center; |
| | | border-radius: 5px; |
| | | color: #fff; |
| | | cursor: pointer; |
| | | img { |
| | | margin-right: 8px; |
| | | } |
| | |
| | | |
| | | .brushBox { |
| | | position: fixed; |
| | | left: 500px; |
| | | // left: 40%; |
| | | bottom: 20px; |
| | | z-index: 99; |
| | | border-radius: 5px; |
| | |
| | | justify-content: center; |
| | | align-items: center; |
| | | .floatToolItem { |
| | | margin: 10px; |
| | | width: 48px; |
| | | margin: 6px; |
| | | width: 46px; |
| | | border-radius: 5px; |
| | | text-align: center; |
| | | flex: 1; |
| | | font-size: 14px; |
| | | .imgBox { |
| | | height: 22px; |
| | | width: 22px; |
| | | height: 18px; |
| | | width: 18px; |
| | | text-align: center; |
| | | margin: 0 auto; |
| | | margin-bottom: 5px; |