提交 af8c3059 authored 作者: 王鹏飞's avatar 王鹏飞

feat: 技能大赛评分页面支持左右拖动改变大小

上级 861d956d
<script setup lang="ts"> <script setup lang="ts">
import Preview from '@/components/Preview.vue' import Preview from '@/components/Preview.vue'
import { getCheckView } from '../api' import { getCheckView } from '../api'
import { useStorage } from '@vueuse/core'
const ScoreDialog = defineAsyncComponent(() => import('../components/ScoreDialog.vue')) const ScoreDialog = defineAsyncComponent(() => import('../components/ScoreDialog.vue'))
...@@ -11,6 +12,10 @@ const props = defineProps<Props>() ...@@ -11,6 +12,10 @@ const props = defineProps<Props>()
// 左侧 // 左侧
const leftPanelVisible = $ref<boolean>(true) const leftPanelVisible = $ref<boolean>(true)
const leftPanelWidth = useStorage('leftPanelWidth', 400)
const leftPanelWidthText = $computed(() => {
return `${leftPanelWidth.value}px`
})
let detail = $ref<any>() let detail = $ref<any>()
provide('detail', $$(detail)) provide('detail', $$(detail))
...@@ -30,18 +35,50 @@ watchEffect(() => { ...@@ -30,18 +35,50 @@ watchEffect(() => {
// 评分 // 评分
const dialogVisible = $ref(false) const dialogVisible = $ref(false)
// 拖拽改变左侧宽度
// 因为鼠标移动文档和iframe影响不能move
let dragFlag = $ref(false)
let bookKey = $ref(0)
watchEffect(() => {
if (!dragFlag) {
bookKey = Date.now()
}
})
function dragControllerDiv() {
const dragDom = document.getElementById('panel-resize')
if (dragDom) {
dragDom.addEventListener('mousedown', e => {
e.preventDefault()
dragFlag = true
document.onmousemove = e => {
leftPanelWidth.value = e.clientX
}
document.onmouseup = () => {
document.onmousemove = null
document.onmouseup = null
dragFlag = false
}
})
}
}
onMounted(() => {
dragControllerDiv()
})
</script> </script>
<template> <template>
<section class="lab" v-if="detail"> <section class="lab">
<div class="lab-left" :class="{ 'is-hidden': !leftPanelVisible }"> <div class="lab-left" :class="{ 'is-hidden': !leftPanelVisible }">
<div class="lab-left__inner"> <div class="lab-left__inner">
<el-tabs type="border-card"> <el-tabs type="border-card">
<el-tab-pane label="评分规则" lazy> <el-tab-pane label="评分规则" lazy>
<Preview :url="file.url"></Preview> <div class="pop" v-if="dragFlag"></div>
<Preview :url="file.url" :key="bookKey"></Preview>
</el-tab-pane> </el-tab-pane>
</el-tabs> </el-tabs>
</div> </div>
<div class="panel-resize" id="panel-resize"></div>
<div class="panel-icon" @click="leftPanelVisible = !leftPanelVisible"> <div class="panel-icon" @click="leftPanelVisible = !leftPanelVisible">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 86" aria-hidden="true" width="16" height="86"> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 86" aria-hidden="true" width="16" height="86">
<g fill="none" fill-rule="evenodd"> <g fill="none" fill-rule="evenodd">
...@@ -58,7 +95,7 @@ const dialogVisible = $ref(false) ...@@ -58,7 +95,7 @@ const dialogVisible = $ref(false)
</svg> </svg>
</div> </div>
</div> </div>
<div class="lab-right"> <div class="lab-right" v-if="detail">
<AppCard> <AppCard>
<el-row justify="space-between"> <el-row justify="space-between">
<div class="info"> <div class="info">
...@@ -80,6 +117,7 @@ const dialogVisible = $ref(false) ...@@ -80,6 +117,7 @@ const dialogVisible = $ref(false)
</el-row> </el-row>
</AppCard> </AppCard>
<div class="lab-box"> <div class="lab-box">
<div class="pop" v-if="dragFlag"></div>
<iframe :src="detail.competition_uri" frameborder="0" class="iframe" ref="iframeRef"></iframe> <iframe :src="detail.competition_uri" frameborder="0" class="iframe" ref="iframeRef"></iframe>
</div> </div>
</div> </div>
...@@ -94,7 +132,7 @@ const dialogVisible = $ref(false) ...@@ -94,7 +132,7 @@ const dialogVisible = $ref(false)
} }
.lab-left { .lab-left {
position: relative; position: relative;
width: 400px; width: v-bind(leftPanelWidthText);
padding: 20px; padding: 20px;
background-color: #e1e4eb; background-color: #e1e4eb;
border-radius: 6px; border-radius: 6px;
...@@ -103,6 +141,9 @@ const dialogVisible = $ref(false) ...@@ -103,6 +141,9 @@ const dialogVisible = $ref(false)
&.is-hidden { &.is-hidden {
width: 0; width: 0;
padding: 0; padding: 0;
.panel-resize {
display: none;
}
.panel-icon { .panel-icon {
left: -20px; left: -20px;
right: 0; right: 0;
...@@ -141,6 +182,16 @@ const dialogVisible = $ref(false) ...@@ -141,6 +182,16 @@ const dialogVisible = $ref(false)
overflow-y: auto; overflow-y: auto;
} }
} }
.panel-resize {
position: absolute;
right: 0;
top: 0;
bottom: 0;
width: 20px;
cursor: col-resize;
z-index: 100;
}
.panel-icon { .panel-icon {
position: absolute; position: absolute;
top: 50%; top: 50%;
...@@ -159,6 +210,7 @@ const dialogVisible = $ref(false) ...@@ -159,6 +210,7 @@ const dialogVisible = $ref(false)
height: 100%; height: 100%;
} }
.lab-box { .lab-box {
position: relative;
flex: 1; flex: 1;
width: 100%; width: 100%;
margin-top: 20px; margin-top: 20px;
...@@ -178,4 +230,13 @@ const dialogVisible = $ref(false) ...@@ -178,4 +230,13 @@ const dialogVisible = $ref(false)
margin-left: 40px; margin-left: 40px;
} }
} }
.pop {
width: 100%;
height: 100%;
position: absolute;
top: 0;
left: 0;
z-index: 999999;
opacity: 0;
}
</style> </style>
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论