index.vue 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208
  1. <script setup>
  2. import { ref, onMounted, computed } from 'vue';
  3. import axios from 'axios';
  4. import packageJson from '@/../../package.json';
  5. import { ElMessage } from 'element-plus';
  6. import client from "@/stores/modules/client";
  7. import icpList from '@/utils/ipc'
  8. import socket from "@/stores/modules/socket";
  9. import UpdateDialog from '@/components/UpdateDialog'
  10. import { getVersionByRoleType } from '@/apis/other'
  11. const currentVersion = ref(packageJson.version);
  12. const latestVersion = ref('');
  13. const isLatest = ref(true);
  14. const versions = ref([]); // 所有版本数据
  15. // 分页相关
  16. const currentPage = ref(1);
  17. const pageSize = ref(20);
  18. const totalItems = ref(0);
  19. // 计算属性:获取当前页的数据
  20. const paginatedVersions = computed(() => {
  21. const start = (currentPage.value - 1) * pageSize.value;
  22. const end = start + pageSize.value;
  23. return (versions.value || []).slice(start, end);
  24. });
  25. // 获取版本信息
  26. const fetchVersions = async () => {
  27. try {
  28. // 添加时间戳避免缓存问题
  29. // const timestamp = new Date().getTime();
  30. // const response = await axios.get('https://ossimg.valimart.net/frontend/html/zhihuiyin/version.json', {
  31. // params: {
  32. // _t: timestamp
  33. // }
  34. // });
  35. const { data } = await getVersionByRoleType({ role_type: 6 })
  36. console.log('data' , data)
  37. // 确保 response.data 是 JSON 数据
  38. // let data;
  39. // if (typeof response.data === 'string') {
  40. // data = JSON.parse(response.data);
  41. // } else {
  42. // data = response.data;
  43. // }
  44. versions.value = data;
  45. if (data.length > 0) {
  46. const latest = data[0];
  47. latestVersion.value = latest.version;
  48. // 比较版本号
  49. isLatest.value = compareVersions(currentVersion.value, latest.version) >= 0;
  50. }
  51. // 初始化分页信息
  52. totalItems.value = versions.value.length;
  53. } catch (error) {
  54. console.error('获取版本信息失败:', error);
  55. ElMessage.error('无法获取版本信息');
  56. }
  57. };
  58. // 版本号比较函数
  59. const compareVersions = (v1, v2) => {
  60. const parts1 = v1.split('.').map(Number);
  61. const parts2 = v2.split('.').map(Number);
  62. for (let i = 0; i < Math.max(parts1.length, parts2.length); i++) {
  63. const num1 = parts1[i] || 0;
  64. const num2 = parts2[i] || 0;
  65. if (num1 > num2) return 1;
  66. if (num1 < num2) return -1;
  67. }
  68. return 0;
  69. };
  70. // 下载最新版本
  71. const downloadUpdate = () => {
  72. downloadSpecificVersion(versions.value[0].attachment)
  73. };
  74. const updateVisible = ref( false)
  75. const updateResult = ref({})
  76. const clientStore = client();
  77. const socketStore = socket()
  78. // 下载特定版本
  79. const downloadSpecificVersion = (url) => {
  80. clientStore.ipc.removeAllListeners('app.updater');
  81. clientStore.ipc.removeAllListeners(icpList.ota.updateVersion);
  82. clientStore.ipc.send(icpList.ota.updateVersion,url);
  83. clientStore.ipc.on(icpList.ota.updateVersion, async (event, result) => {
  84. console.log('==============================')
  85. console.log('checkUpdate')
  86. console.log(event)
  87. console.log(result)
  88. })
  89. clientStore.ipc.on('app.updater', async (event, result) => {
  90. try {
  91. let res = JSON.parse(result)
  92. if([1,3,4].includes(res.status)){
  93. updateResult.value = res
  94. updateVisible.value = true
  95. console.log(updateResult.value)
  96. console.log(updateVisible.value)
  97. }else{
  98. updateVisible.value = false
  99. ElMessage.error('下载失败')
  100. }
  101. }catch (e) {
  102. console.log(e)
  103. }
  104. })
  105. };
  106. // 处理分页变化
  107. const handlePageChange = (page) => {
  108. currentPage.value = page;
  109. };
  110. onMounted(() => {
  111. fetchVersions();
  112. });
  113. </script>
  114. <template>
  115. <el-container>
  116. <el-dialog
  117. v-model="updateVisible"
  118. :close-on-click-modal="false"
  119. title="软件下载中"
  120. >
  121. <div class="desc line-30 fs-16">{{updateResult.desc}}</div>
  122. </el-dialog>
  123. <el-main>
  124. <div class="version-check-container">
  125. <el-card class="current-version-card">
  126. <p>当前版本 <span class="fs-14">版本号: {{ currentVersion }}</span></p>
  127. <p>状态: <span :class="{ 'text-green': isLatest, 'text-red': !isLatest }">{{ isLatest ? '您已经是最新版本' : '发现新版本' }}</span></p>
  128. <p v-if="!isLatest">新版本: {{ latestVersion }}</p>
  129. <el-button v-if="!isLatest" type="primary" @click="downloadUpdate" v-log="{ describe: { action: '点击下载最新版本', latestVersion } }">下载更新</el-button>
  130. </el-card>
  131. <el-card class="history-versions-card mar-top-10">
  132. <h3>历史版本</h3>
  133. <!-- 使用计算属性获取分页数据 -->
  134. <el-table :data="paginatedVersions" border>
  135. <el-table-column prop="version" label="版本号" width="70"></el-table-column>
  136. <el-table-column prop="release_date" label="发布日期" width="100"></el-table-column>
  137. <el-table-column label="描述">
  138. <template #default="{ row }">
  139. <el-tooltip placement="top" :show-when="hover" :width="500">
  140. <template #content >
  141. <div v-html="row.detail"></div>
  142. </template>
  143. <span class="version-describe" v-html="row.detail"></span>
  144. </el-tooltip>
  145. </template>
  146. </el-table-column>
  147. <el-table-column label="操作" width="80">
  148. <template #default="{ row }">
  149. <el-button size="small" @click="downloadSpecificVersion(row.attachment)" v-log="{ describe: { action: '点击下载历史版本', version: row.version, url: row.attachment } }">下载</el-button>
  150. </template>
  151. </el-table-column>
  152. </el-table>
  153. <el-pagination
  154. layout="prev, pager, next"
  155. :total="totalItems"
  156. :page-size="pageSize"
  157. v-model:current-page="currentPage"
  158. @current-change="handlePageChange"
  159. style="margin-top: 15px;"
  160. />
  161. </el-card>
  162. </div>
  163. </el-main>
  164. </el-container>
  165. </template>
  166. <style scoped>
  167. .version-describe {
  168. display: inline-block;
  169. width: 100%; /* 根据需要调整 */
  170. white-space: nowrap;
  171. overflow: hidden;
  172. text-overflow: ellipsis;
  173. }
  174. </style>