|
@@ -17,6 +17,16 @@
|
|
|
<div class="bs-time">{{ currentTime }}</div>
|
|
<div class="bs-time">{{ currentTime }}</div>
|
|
|
<div class="bs-date">{{ currentDate }}</div>
|
|
<div class="bs-date">{{ currentDate }}</div>
|
|
|
</div>
|
|
</div>
|
|
|
|
|
+ <div class="bs-header-actions">
|
|
|
|
|
+ <el-button type="primary" size="small" @click="enterFullscreen">
|
|
|
|
|
+ <el-icon><FullScreen /></el-icon>
|
|
|
|
|
+ <span style="margin-left: 4px">浏览器全屏</span>
|
|
|
|
|
+ </el-button>
|
|
|
|
|
+ <el-button type="warning" size="small" @click="exitToPlatform">
|
|
|
|
|
+ <el-icon><Back /></el-icon>
|
|
|
|
|
+ <span style="margin-left: 4px">退出大屏</span>
|
|
|
|
|
+ </el-button>
|
|
|
|
|
+ </div>
|
|
|
</div>
|
|
</div>
|
|
|
|
|
|
|
|
<!-- 顶部: 6 张业务数据卡片 -->
|
|
<!-- 顶部: 6 张业务数据卡片 -->
|
|
@@ -151,12 +161,15 @@ import { onBeforeUnmount, onMounted, ref } from 'vue';
|
|
|
import * as echarts from 'echarts';
|
|
import * as echarts from 'echarts';
|
|
|
import {
|
|
import {
|
|
|
Aim,
|
|
Aim,
|
|
|
|
|
+ Back,
|
|
|
Document,
|
|
Document,
|
|
|
|
|
+ FullScreen,
|
|
|
Shop,
|
|
Shop,
|
|
|
Tools,
|
|
Tools,
|
|
|
User,
|
|
User,
|
|
|
Warning
|
|
Warning
|
|
|
} from '@element-plus/icons-vue';
|
|
} from '@element-plus/icons-vue';
|
|
|
|
|
+import { useRouter } from 'vue-router';
|
|
|
import {
|
|
import {
|
|
|
getBigScreenCards,
|
|
getBigScreenCards,
|
|
|
getBigScreenCharts,
|
|
getBigScreenCharts,
|
|
@@ -216,6 +229,40 @@ const dotColor = (c?: string): string => {
|
|
|
return '#1890ff';
|
|
return '#1890ff';
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
|
|
+// ===== 浏览器原生全屏 + 退出大屏 =====
|
|
|
|
|
+const router = useRouter();
|
|
|
|
|
+
|
|
|
|
|
+function enterFullscreen() {
|
|
|
|
|
+ const docEl = document.documentElement;
|
|
|
|
|
+ const req =
|
|
|
|
|
+ docEl.requestFullscreen ||
|
|
|
|
|
+ (docEl as any).webkitRequestFullscreen ||
|
|
|
|
|
+ (docEl as any).mozRequestFullScreen ||
|
|
|
|
|
+ (docEl as any).msRequestFullscreen;
|
|
|
|
|
+ if (req) {
|
|
|
|
|
+ const ret = req.call(docEl);
|
|
|
|
|
+ if (ret && typeof (ret as any).then === 'function') {
|
|
|
|
|
+ (ret as Promise<void>).catch(() => {
|
|
|
|
|
+ // 用户拒绝则保持 CSS 全屏(layout 已是 router-view 直接占满)
|
|
|
|
|
+ });
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+function exitFullscreen() {
|
|
|
|
|
+ const doc: any = document;
|
|
|
|
|
+ if (doc.exitFullscreen) doc.exitFullscreen();
|
|
|
|
|
+ else if (doc.webkitExitFullscreen) doc.webkitExitFullscreen();
|
|
|
|
|
+ else if (doc.mozCancelFullScreen) doc.mozCancelFullScreen();
|
|
|
|
|
+ else if (doc.msExitFullscreen) doc.msExitFullscreen();
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+function exitToPlatform() {
|
|
|
|
|
+ // 优先尝试退出浏览器原生全屏,再退回首页
|
|
|
|
|
+ exitFullscreen();
|
|
|
|
|
+ router.push('/index');
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
// ===== 加载 =====
|
|
// ===== 加载 =====
|
|
|
async function loadCards() {
|
|
async function loadCards() {
|
|
|
try {
|
|
try {
|
|
@@ -452,6 +499,39 @@ function renderComplaintBar(months: string[], counts: number[]) {
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// ===== 生命周期 =====
|
|
// ===== 生命周期 =====
|
|
|
|
|
+onBeforeUnmount(() => {
|
|
|
|
|
+ if (timer) {
|
|
|
|
|
+ clearInterval(timer);
|
|
|
|
|
+ timer = undefined;
|
|
|
|
|
+ }
|
|
|
|
|
+ if (streamTimer) {
|
|
|
|
|
+ clearInterval(streamTimer);
|
|
|
|
|
+ streamTimer = undefined;
|
|
|
|
|
+ }
|
|
|
|
|
+ if (resizeHandler) {
|
|
|
|
|
+ window.removeEventListener('resize', resizeHandler);
|
|
|
|
|
+ }
|
|
|
|
|
+ document.removeEventListener('fullscreenchange', onFullscreenChange);
|
|
|
|
|
+ document.removeEventListener('keydown', onKeyDown);
|
|
|
|
|
+ personnelPieChart?.dispose();
|
|
|
|
|
+ accidentPieChart?.dispose();
|
|
|
|
|
+ trendLineChart?.dispose();
|
|
|
|
|
+ complaintBarChart?.dispose();
|
|
|
|
|
+});
|
|
|
|
|
+
|
|
|
|
|
+// ===== 浏览器全屏监听 + ESC 退出 =====
|
|
|
|
|
+function onFullscreenChange() {
|
|
|
|
|
+ // ESC 退出全屏时只更新状态,不做其他动作
|
|
|
|
|
+ // 监听浏览器原生全屏状态变化,留作扩展点
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+function onKeyDown(e: KeyboardEvent) {
|
|
|
|
|
+ if (e.key === 'Escape') {
|
|
|
|
|
+ exitFullscreen();
|
|
|
|
|
+ }
|
|
|
|
|
+ // F11 由浏览器原生处理
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
onMounted(() => {
|
|
onMounted(() => {
|
|
|
loadAll();
|
|
loadAll();
|
|
|
tickClock();
|
|
tickClock();
|
|
@@ -465,6 +545,8 @@ onMounted(() => {
|
|
|
complaintBarChart?.resize();
|
|
complaintBarChart?.resize();
|
|
|
};
|
|
};
|
|
|
window.addEventListener('resize', resizeHandler);
|
|
window.addEventListener('resize', resizeHandler);
|
|
|
|
|
+ document.addEventListener('fullscreenchange', onFullscreenChange);
|
|
|
|
|
+ document.addEventListener('keydown', onKeyDown);
|
|
|
|
|
|
|
|
setTimeout(() => {
|
|
setTimeout(() => {
|
|
|
personnelPieChart?.resize();
|
|
personnelPieChart?.resize();
|
|
@@ -473,24 +555,6 @@ onMounted(() => {
|
|
|
complaintBarChart?.resize();
|
|
complaintBarChart?.resize();
|
|
|
}, 200);
|
|
}, 200);
|
|
|
});
|
|
});
|
|
|
-
|
|
|
|
|
-onBeforeUnmount(() => {
|
|
|
|
|
- if (timer) {
|
|
|
|
|
- clearInterval(timer);
|
|
|
|
|
- timer = undefined;
|
|
|
|
|
- }
|
|
|
|
|
- if (streamTimer) {
|
|
|
|
|
- clearInterval(streamTimer);
|
|
|
|
|
- streamTimer = undefined;
|
|
|
|
|
- }
|
|
|
|
|
- if (resizeHandler) {
|
|
|
|
|
- window.removeEventListener('resize', resizeHandler);
|
|
|
|
|
- }
|
|
|
|
|
- personnelPieChart?.dispose();
|
|
|
|
|
- accidentPieChart?.dispose();
|
|
|
|
|
- trendLineChart?.dispose();
|
|
|
|
|
- complaintBarChart?.dispose();
|
|
|
|
|
-});
|
|
|
|
|
</script>
|
|
</script>
|
|
|
|
|
|
|
|
<style scoped lang="scss">
|
|
<style scoped lang="scss">
|
|
@@ -511,9 +575,9 @@ onBeforeUnmount(() => {
|
|
|
height: 60px;
|
|
height: 60px;
|
|
|
display: flex;
|
|
display: flex;
|
|
|
align-items: center;
|
|
align-items: center;
|
|
|
- justify-content: space-between;
|
|
|
|
|
margin-bottom: 16px;
|
|
margin-bottom: 16px;
|
|
|
- padding: 0 8px;
|
|
|
|
|
|
|
+ padding: 0 16px;
|
|
|
|
|
+ position: relative;
|
|
|
|
|
|
|
|
.bs-title-wrap {
|
|
.bs-title-wrap {
|
|
|
flex: 1;
|
|
flex: 1;
|
|
@@ -537,9 +601,9 @@ onBeforeUnmount(() => {
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
.bs-clock {
|
|
.bs-clock {
|
|
|
- position: absolute;
|
|
|
|
|
- right: 24px;
|
|
|
|
|
|
|
+ flex: 0 0 auto;
|
|
|
text-align: right;
|
|
text-align: right;
|
|
|
|
|
+ margin-right: 16px;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
.bs-time {
|
|
.bs-time {
|
|
@@ -554,6 +618,12 @@ onBeforeUnmount(() => {
|
|
|
color: #aac8ff;
|
|
color: #aac8ff;
|
|
|
margin-top: 2px;
|
|
margin-top: 2px;
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
|
|
+ .bs-header-actions {
|
|
|
|
|
+ flex: 0 0 auto;
|
|
|
|
|
+ display: flex;
|
|
|
|
|
+ gap: 8px;
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// ===== 卡片行 =====
|
|
// ===== 卡片行 =====
|