PortalIndex.vue 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. <script setup lang="ts">
  2. import { onMounted, ref } from 'vue';
  3. import { useRouter } from 'vue-router';
  4. import { PAGInit } from 'libpag';
  5. const pagCanvas = ref<HTMLCanvasElement | null>(null);
  6. const router = useRouter();
  7. const addLog = () => {
  8. router.push('/login');
  9. };
  10. onMounted(async () => {
  11. if (!pagCanvas.value) {
  12. console.error('Canvas element not found');
  13. return;
  14. }
  15. // 初始化 libpag
  16. const PAG = await PAGInit();
  17. // 加载 PAG 文件
  18. const pagUrl = '/portal.pag';
  19. try {
  20. const response = await fetch(pagUrl);
  21. const buffer = await response.arrayBuffer();
  22. const pagFile = await PAG.PAGFile.load(buffer);
  23. // 创建 PAG 视图并初始化
  24. const pagView = await PAG.PAGView.init(pagFile, pagCanvas.value);
  25. if (pagView) {
  26. pagView.setRepeatCount(0); // 设置循环播放
  27. // 修复:使用直接属性访问或数值常量
  28. // 方法1: 检查 PAGScaleMode 是否直接作为 PAG 的属性
  29. if (PAG.PAGScaleMode) {
  30. pagView.setScaleMode(PAG.PAGScaleMode.Stretch);
  31. } else if (PAG.ScaleMode) {
  32. // 有些版本可能使用 PAG.ScaleMode
  33. pagView.setScaleMode(PAG.ScaleMode.Stretch);
  34. } else {
  35. // 方法2: 使用数值常量
  36. pagView.setScaleMode(1);
  37. }
  38. await pagView.play(); // 播放动画
  39. }
  40. } catch (error) {
  41. console.error('Failed to load or play PAG file:', error);
  42. }
  43. });
  44. </script>
  45. <template>
  46. <div class="fullscreen-container">
  47. <div class="header-bar">
  48. <AFlex justify="space-between" class="header-top" align="center">
  49. <div>
  50. <img class="aside-header-logo" src="@/assets/img/logo.png" />
  51. </div>
  52. <AFlex class="text-top">
  53. <div class="text-color">首页</div>
  54. <div>产品介绍</div>
  55. <div>关于我们</div>
  56. </AFlex>
  57. <div>
  58. <AButton type="primary" class="button-style" @click="addLog">立即体验</AButton>
  59. </div>
  60. </AFlex>
  61. <AFlex justify="center">
  62. <div class="portal-text">
  63. <div>智能能耗指挥官</div>
  64. <div>AI动态调控冷热平衡</div>
  65. <AButton type="primary" @click="addLog" class="lord-button-style">立即体验</AButton>
  66. </div>
  67. </AFlex>
  68. </div>
  69. <canvas ref="pagCanvas" class="fullscreen-canvas"></canvas>
  70. </div>
  71. </template>
  72. <style lang="scss" scoped>
  73. .text-top .text-color {
  74. color: var(--antd-color-primary-hover);
  75. }
  76. .text-top > div {
  77. margin-left: 56px;
  78. font-size: 14px;
  79. font-style: normal;
  80. font-weight: 500;
  81. line-height: 20px;
  82. color: #333;
  83. text-align: justify;
  84. cursor: pointer;
  85. }
  86. .lord-button-style {
  87. width: 172px;
  88. height: 56px;
  89. margin-top: 32px;
  90. border-radius: 28px;
  91. }
  92. .portal-text {
  93. margin-top: 85px;
  94. font-size: 40px;
  95. font-style: normal;
  96. font-weight: 500;
  97. line-height: 56px;
  98. color: #333;
  99. text-align: center;
  100. }
  101. .button-style {
  102. width: 112px;
  103. height: 48px;
  104. border-radius: 24px;
  105. }
  106. .header-top {
  107. width: 100%;
  108. height: 80px;
  109. padding: 0 80px;
  110. }
  111. .aside-header-logo {
  112. width: 48px;
  113. height: 48px;
  114. }
  115. .header-bar {
  116. position: fixed;
  117. top: 0;
  118. left: 0;
  119. width: 100vw;
  120. height: 269px;
  121. background: linear-gradient(180deg, #fff 0%, rgb(230 229 228 / 0%) 100%);
  122. }
  123. .fullscreen-container {
  124. position: fixed;
  125. top: 0;
  126. left: 0;
  127. width: 100vw;
  128. height: 100vh;
  129. overflow: hidden;
  130. }
  131. .fullscreen-canvas {
  132. display: block;
  133. width: 100vw;
  134. height: 100vh;
  135. }
  136. </style>