Index.vue 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. <script lang="ts" setup>
  2. import { DESIGN_HEIGHT, DESIGN_WIDTH } from '@/utils/kb'
  3. import hsummary from './kb/hsummary.vue'
  4. import hdeviceType from './kb/hdeviceType.vue'
  5. import dayfinish from './kb/dayfinish.vue'
  6. import hsafe from './kb/hsafe.vue'
  7. import hdeviceStatus from './kb/hdeviceStatus.vue'
  8. import horderTrend from './kb/horderTrend.vue'
  9. const company = ref('首页')
  10. const wrapperRef = ref<HTMLDivElement>()
  11. const scale = ref(1)
  12. const supportsZoom = ref(false)
  13. let resizeObserver: ResizeObserver | null = null
  14. let resizeRaf = 0
  15. const targetWrapperStyle = computed(() => ({
  16. width: `${DESIGN_WIDTH * scale.value}px`,
  17. height: `${DESIGN_HEIGHT * scale.value}px`
  18. }))
  19. const targetAreaStyle = computed(() => {
  20. const style = {
  21. width: `${DESIGN_WIDTH}px`,
  22. height: `${DESIGN_HEIGHT}px`,
  23. transformOrigin: '0 0'
  24. } as Record<string, string | number>
  25. if (supportsZoom.value) {
  26. style.zoom = scale.value
  27. } else {
  28. style.transform = `scale(${scale.value})`
  29. }
  30. return style
  31. })
  32. function updateScale() {
  33. cancelAnimationFrame(resizeRaf)
  34. resizeRaf = requestAnimationFrame(() => {
  35. const wrapper = wrapperRef.value
  36. if (!wrapper) return
  37. const { clientWidth, clientHeight } = wrapper
  38. if (!clientWidth || !clientHeight) return
  39. scale.value = Math.min(clientWidth / DESIGN_WIDTH, clientHeight / DESIGN_HEIGHT)
  40. })
  41. }
  42. onMounted(() => {
  43. supportsZoom.value = typeof CSS !== 'undefined' && CSS.supports?.('zoom', '1') === true
  44. nextTick(updateScale)
  45. resizeObserver = new ResizeObserver(updateScale)
  46. if (wrapperRef.value) {
  47. resizeObserver.observe(wrapperRef.value)
  48. }
  49. window.addEventListener('resize', updateScale)
  50. })
  51. onUnmounted(() => {
  52. resizeObserver?.disconnect()
  53. window.removeEventListener('resize', updateScale)
  54. cancelAnimationFrame(resizeRaf)
  55. })
  56. </script>
  57. <template>
  58. <div ref="wrapperRef" class="bg absolute top-0 left-0 size-full z-10">
  59. <div class="mx-a overflow-hidden" :style="targetWrapperStyle">
  60. <div class="bg" :style="targetAreaStyle">
  61. <header class="header">{{ company }}</header>
  62. <div class="mt-3 px-5">
  63. <hsummary class="kb-stage-card kb-stage-card--1" />
  64. <div class="w-full h-96 grid grid-rows-2 grid-cols-3 gap-3 mt-3">
  65. <!-- <hmttr class="kb-stage-card kb-stage-card--2" /> -->
  66. <hsafe class="row-span-2 kb-stage-card kb-stage-card--3" />
  67. <hdeviceType class="row-span-2 kb-stage-card kb-stage-card--4" />
  68. <dayfinish class="row-span-2 kb-stage-card kb-stage-card--5" />
  69. </div>
  70. <div class="w-full h-107 grid grid-cols-2 gap-3 mt-3">
  71. <hdeviceStatus class="kb-stage-card kb-stage-card--6" />
  72. <horderTrend class="kb-stage-card kb-stage-card--7" />
  73. </div>
  74. </div>
  75. </div>
  76. </div>
  77. </div>
  78. </template>
  79. <style lang="scss" scoped>
  80. @import url('@/styles/kb.scss');
  81. </style>