库存数据看板

This commit is contained in:
砂糖
2025-08-11 18:07:01 +08:00
parent 6f415c44d1
commit 68f5f5bdab
8 changed files with 1264 additions and 259 deletions

View File

@@ -0,0 +1,207 @@
<template>
<div class="chart-wrapper" ref="chartWrapper">
<!-- 操作按钮组 -->
<div class="chart-actions">
<button
class="action-btn fullscreen-btn"
@click="toggleFullscreen"
title="全屏预览"
>
<i :class="isFullscreen? 'el-icon-close' : 'el-icon-full-screen'"></i>
</button>
</div>
<!-- 图表容器插槽内容 -->
<div class="chart-container" ref="chartContainer">
<slot></slot>
</div>
</div>
</template>
<script>
export default {
data() {
return {
isFullscreen: false, // 是否处于全屏状态
fullscreenElement: null, // 存储全屏元素引用
};
},
mounted() {
// 监听浏览器全屏状态变化事件
document.addEventListener('fullscreenchange', this.handleFullscreenChange);
document.addEventListener('webkitfullscreenchange', this.handleFullscreenChange);
document.addEventListener('mozfullscreenchange', this.handleFullscreenChange);
document.addEventListener('msfullscreenchange', this.handleFullscreenChange);
},
methods: {
// 切换全屏/退出全屏
toggleFullscreen() {
if (!this.isFullscreen) {
this.enterFullscreen();
} else {
this.exitFullscreen();
}
},
// 进入全屏模式
enterFullscreen() {
const container = this.$refs.chartWrapper;
// 不同浏览器的全屏 API 兼容
if (container.requestFullscreen) {
container.requestFullscreen();
} else if (container.webkitRequestFullscreen) { /* Safari */
container.webkitRequestFullscreen();
} else if (container.msRequestFullscreen) { /* IE11 */
container.msRequestFullscreen();
} else if (container.mozRequestFullScreen) { /* Firefox */
container.mozRequestFullScreen();
}
this.fullscreenElement = container;
},
// 退出全屏模式
exitFullscreen() {
if (!document.fullscreenElement) return;
// 不同浏览器的退出全屏 API 兼容
if (document.exitFullscreen) {
document.exitFullscreen();
} else if (document.webkitExitFullscreen) { /* Safari */
document.webkitExitFullscreen();
} else if (document.msExitFullscreen) { /* IE11 */
document.msExitFullscreen();
} else if (document.mozCancelFullScreen) { /* Firefox */
document.mozCancelFullScreen();
}
this.fullscreenElement = null;
},
// 处理全屏状态变化
handleFullscreenChange() {
// 检查当前是否处于全屏状态
const isFull =!!(
document.fullscreenElement ||
document.webkitFullscreenElement ||
document.mozFullScreenElement ||
document.msFullscreenElement
);
this.isFullscreen = isFull;
// 触发窗口 resize 事件,让图表自适应
this.triggerResize();
},
// 触发窗口 resize 事件(让图表自适应)
triggerResize() {
const event = document.createEvent('Event');
event.initEvent('resize', true, true);
window.dispatchEvent(event);
}
},
beforeDestroy() {
// 移除事件监听
document.removeEventListener('fullscreenchange', this.handleFullscreenChange);
document.removeEventListener('webkitfullscreenchange', this.handleFullscreenChange);
document.removeEventListener('mozfullscreenchange', this.handleFullscreenChange);
document.removeEventListener('msfullscreenchange', this.handleFullscreenChange);
// 组件销毁时如果处于全屏状态则退出
if (this.isFullscreen) {
this.exitFullscreen();
}
}
};
</script>
<style scoped>
.chart-wrapper {
position: relative;
width: 100%;
height: 100%;
min-height: 100px; /* 最小高度防止内容为空时样式异常 */
}
/* 全屏状态下的样式调整 */
.chart-wrapper:-webkit-full-screen {
background-color: #fff;
width: 100%!important;
height: 100%!important;
}
.chart-wrapper:-moz-full-screen {
background-color: #fff;
width: 100%!important;
height: 100%!important;
}
.chart-wrapper:fullscreen {
background-color: #fff;
width: 100%!important;
height: 100%!important;
}
.chart-container {
width: 100%;
height: 100%;
min-height: inherit;
}
/* 操作按钮组样式 */
.chart-actions {
position: absolute;
top: 10px;
right: 10px;
z-index: 10; /* 确保按钮在图表上方 */
display: flex;
gap: 8px;
}
.action-btn {
width: 32px;
height: 32px;
border-radius: 4px;
border: none;
background-color: rgba(255, 255, 255, 0.8);
cursor: pointer;
display: flex;
align-items: center;
justify-content: center;
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
transition: all 0.2s ease;
}
.action-btn:hover {
background-color: #fff;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.2);
}
/* 图标样式(适配 Element UI 图标) */
.action-btn i {
font-size: 16px;
color: #666;
}
.action-btn:hover i {
color: #1890ff;
}
/* 全屏状态下的按钮样式优化 */
:fullscreen.chart-actions {
top: 20px;
right: 20px;
}
:-webkit-full-screen.chart-actions {
top: 20px;
right: 20px;
}
:-moz-full-screen.chart-actions {
top: 20px;
right: 20px;
}
</style>