index.vue 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267
  1. <template>
  2. <headerBar title="首页">
  3. <template #title><div @click="handleSettingClick" v-log="{ describe: { action: '点击首页标题' } }">首页</div></template>
  4. </headerBar>
  5. <div class="home-container" v-loading="loading">
  6. <!--
  7. &lt;!&ndash; 背景图片 &ndash;&gt;
  8. <img src="@/assets/images/home/bg.png" alt="背景图片" class="background-image" />
  9. -->
  10. <!-- 左侧图片区域 -->
  11. <div class="image-container left-image" @click="goCheck" v-log="{ describe: { action: '点击拍照检查入口' } }">
  12. <img src="@/assets/images/home/left.jpg" alt="拍摄产品并处理图像" class="zoom-on-hover" />
  13. <div class="overlay-text">拍摄产品<br>并处理图像</div>
  14. </div>
  15. <!-- 右侧图片区域 -->
  16. <div class="image-container right-image" @click="goShot" v-log="{ describe: { action: '点击仅处理图像入口' } }">
  17. <img src="@/assets/images/home/right.jpg" alt="仅处理图像" class="zoom-on-hover" />
  18. <div class="overlay-text" style="line-height: 80px;">仅处理图像</div>
  19. </div>
  20. </div>
  21. </template>
  22. <script setup lang="ts">
  23. import headerBar from "@/components/header-bar/index.vue";
  24. import { useRouter } from "vue-router";
  25. import configInfo from '@/stores/modules/config';
  26. import { ref, onMounted } from 'vue';
  27. import axios from 'axios';
  28. import client from "@/stores/modules/client";
  29. import icpList from '@/utils/ipc';
  30. import packageJson from '@/../../package.json';
  31. import { getRouterUrl } from '@/utils/appfun';
  32. const configInfoStore = configInfo();
  33. const router = useRouter();
  34. const loading = ref(true);
  35. // 版本检查相关
  36. const currentVersion = ref(packageJson.version);
  37. const latestVersion = ref('');
  38. const isLatest = ref(true);
  39. import socket from "@/stores/modules/socket";
  40. // 初始化 WebSocket 状态管理
  41. const socketStore = socket();
  42. function socketConnect(){
  43. socketStore.connectSocket();
  44. }
  45. const goCheck = () => {
  46. configInfoStore.updateAppModel(1);
  47. router.push({
  48. name: 'PhotographyCheck'
  49. });
  50. };
  51. const goShot = () => {
  52. socketConnect();
  53. configInfoStore.updateAppModel(2);
  54. router.push({
  55. name: 'PhotographyShot'
  56. });
  57. };
  58. // 健康检查函数
  59. const checkHealth = async () => {
  60. try {
  61. const response = await axios.get('http://127.0.0.1:7074');
  62. if (response.status === 200) {
  63. loading.value = false; // 健康检查成功,关闭 loading
  64. }
  65. } catch (error) {
  66. console.error('健康检查失败:', error);
  67. setTimeout(() => {
  68. checkHealth(); // 延迟检查
  69. }, 2000);
  70. // 可以在这里处理错误,例如显示错误提示
  71. }
  72. };
  73. const settingClickCount = ref(0);
  74. // 修改headerBar的点击处理函数
  75. function handleSettingClick() {
  76. console.log('handleSettingClickhandleSettingClick')
  77. settingClickCount.value++;
  78. if (settingClickCount.value >= 5) {
  79. openResourceDirectory()
  80. settingClickCount.value = 0;
  81. }
  82. setTimeout(() => {
  83. settingClickCount.value = 0;
  84. }, 3000); // 3秒内未再次点击则重置计数器
  85. }
  86. const clientStore = client();
  87. function openResourceDirectory() {
  88. clientStore.ipc.removeAllListeners(icpList.utils.shellFun);
  89. let params = {
  90. action: 'openPath',
  91. params: configInfoStore.appConfig.userDataPath.replaceAll('/', '\\')
  92. };
  93. clientStore.ipc.send(icpList.utils.shellFun, params);
  94. }
  95. // 版本号比较函数
  96. const compareVersions = (v1, v2) => {
  97. const parts1 = v1.split('.').map(Number);
  98. const parts2 = v2.split('.').map(Number);
  99. for (let i = 0; i < Math.max(parts1.length, parts2.length); i++) {
  100. const num1 = parts1[i] || 0;
  101. const num2 = parts2[i] || 0;
  102. if (num1 > num2) return 1;
  103. if (num1 < num2) return -1;
  104. }
  105. return 0;
  106. };
  107. // 打开OTA窗口
  108. const openOTA = () => {
  109. const { href } = router.resolve({
  110. name: 'ota'
  111. });
  112. clientStore.ipc.removeAllListeners(icpList.utils.openMain);
  113. let params = {
  114. title: '版本更新',
  115. width: 900,
  116. height: 700,
  117. frame: true,
  118. id: 'ota',
  119. url: getRouterUrl(href)
  120. };
  121. clientStore.ipc.send(icpList.utils.openMain, params);
  122. };
  123. // 获取版本信息并检查更新
  124. const checkForUpdates = async () => {
  125. try {
  126. // 添加时间戳避免缓存问题
  127. const timestamp = new Date().getTime();
  128. const response = await axios.get('https://ossimg.valimart.net/frontend/html/zhihuiyin/yi/version.json', {
  129. params: {
  130. _t: timestamp
  131. }
  132. });
  133. // 确保 response.data 是 JSON 数据
  134. let data;
  135. if (typeof response.data === 'string') {
  136. data = JSON.parse(response.data);
  137. } else {
  138. data = response.data;
  139. }
  140. if (data.length > 0) {
  141. const latest = data[data.length - 1];
  142. latestVersion.value = latest.version;
  143. // 比较版本号
  144. isLatest.value = compareVersions(currentVersion.value, latest.version) >= 0;
  145. // 如果发现新版本,自动打开OTA窗口
  146. if (!isLatest.value) {
  147. openOTA();
  148. }
  149. }
  150. } catch (error) {
  151. console.error('检查版本更新失败:', error);
  152. // 静默处理错误,不影响用户体验
  153. }
  154. };
  155. // 在组件挂载时执行健康检查和版本检查
  156. onMounted(() => {
  157. checkHealth();
  158. // 延迟执行版本检查,避免影响健康检查
  159. setTimeout(() => {
  160. checkForUpdates();
  161. }, 1000);
  162. });
  163. </script>
  164. <style lang="scss" scoped>
  165. .home-container {
  166. position: relative;
  167. width: 100%;
  168. height: 100vh;
  169. overflow: hidden;
  170. }
  171. .background-image {
  172. position: absolute;
  173. top: 0;
  174. left: 0;
  175. width: 100%;
  176. height: 100%;
  177. object-fit: cover;
  178. z-index: -1;
  179. }
  180. .image-container {
  181. position: absolute;
  182. cursor: pointer;
  183. width: 400px; /* 设置宽度 */
  184. height: 400px; /* 设置高度 */
  185. overflow: hidden;
  186. box-shadow: 0 4px 10px rgba(0, 0, 0, 0.6); /* 添加阴影效果 */
  187. .zoom-on-hover {
  188. transition: transform 0.3s ease;
  189. width: 100%; /* 确保图片充满容器 */
  190. height: 100%; /* 确保图片充满容器 */
  191. object-fit: cover; /* 裁剪图片以适应容器 */
  192. }
  193. &:hover .zoom-on-hover {
  194. transform: scale(1.1);
  195. }
  196. }
  197. .left-image {
  198. top: 50%;
  199. right: 50%;
  200. transform: translateY(-50%);
  201. margin-right: 50px;
  202. }
  203. .right-image {
  204. top: 50%;
  205. left: 50%;
  206. transform: translateY(-50%);
  207. margin-left: 50px;
  208. }
  209. .overlay-text {
  210. position: absolute;
  211. top: 50%;
  212. left: 50%;
  213. transform: translate(-50%, -50%);
  214. color: white;
  215. font-size: 24px;
  216. text-align: center;
  217. z-index: 1;
  218. background-color: rgba(0, 0, 0, 0.5);
  219. padding: 10px 40px;
  220. line-height: 50px;
  221. min-height: 80px;
  222. min-width: 250px;
  223. }
  224. </style>