feat: 优化更新检查 下载 功能

This commit is contained in:
alger
2025-01-04 16:13:37 +08:00
parent 3d3992154a
commit 11ced6b418
6 changed files with 91 additions and 26 deletions

View File

@@ -44,10 +44,11 @@
</template>
<script setup lang="ts">
import { onMounted, ref, computed } from 'vue';
import { onMounted, ref, computed, watch } from 'vue';
import { marked } from 'marked';
import { checkUpdate, UpdateResult } from '@/utils/update';
import config from '../../../../package.json';
import { useStore } from 'vuex';
// 配置 marked
marked.setOptions({
@@ -64,6 +65,25 @@ const updateInfo = ref<UpdateResult>({
releaseInfo: null
});
const store = useStore()
// 添加计算属性
const showUpdateModalState = computed({
get: () => store.state.showUpdateModal,
set: (val) => store.commit('SET_SHOW_UPDATE_MODAL', val)
})
// 替换原来的 watch
watch(showUpdateModalState, (newVal) => {
if (newVal) {
showModal.value = true
}
})
watch(() => showModal.value, (newVal) => {
showUpdateModalState.value = newVal
})
// 解析 Markdown
const parsedReleaseNotes = computed(() => {
if (!updateInfo.value.releaseInfo?.body) return '';
@@ -96,12 +116,30 @@ const checkForUpdates = async () => {
}
};
const handleUpdate = async () => {
const assets = updateInfo.value.releaseInfo?.assets || [];
const platform = window.electron.process.platform;
const arch = window.electron.ipcRenderer.sendSync('get-arch');
console.log(arch);
console.log(platform);
console.log('arch',arch)
console.log('platform',platform)
const version = updateInfo.value.latestVersion
const downUrls = {
win32: {
all: `https://github.com/algerkong/AlgerMusicPlayer/releases/download/v${version}/AlgerMusicPlayer-${version}-win.exe`,
x64: `https://github.com/algerkong/AlgerMusicPlayer/releases/download/v${version}/AlgerMusicPlayer-${version}-win-x64.exe`,
ia32: `https://github.com/algerkong/AlgerMusicPlayer/releases/download/v${version}/AlgerMusicPlayer-${version}-win-ia32.exe`,
},
darwin: {
all: `https://github.com/algerkong/AlgerMusicPlayer/releases/download/v${version}AlgerMusicPlayer-${version}-mac-universal.dmg`,
},
linux: {
AppImage: `https://github.com/algerkong/AlgerMusicPlayer/releases/download/v${version}/AlgerMusicPlayer-${version}-linux-x64.AppImage`,
deb: `https://github.com/algerkong/AlgerMusicPlayer/releases/download/v${version}/AlgerMusicPlayer-${version}-linux-x64.deb`,
}
}
let downloadUrl = '';
@@ -111,30 +149,29 @@ const handleUpdate = async () => {
const macAsset = assets.find(asset =>
asset.name.includes('mac')
);
downloadUrl = macAsset?.browser_download_url || '';
downloadUrl = macAsset?.browser_download_url || downUrls.darwin.all || '';
} else if (platform === 'win32') {
// Windows
const winAsset = assets.find(asset =>
asset.name.includes('win') &&
(arch === 'x64' ? asset.name.includes('x64') : asset.name.includes('ia32'))
);
downloadUrl = winAsset?.browser_download_url || '';
downloadUrl = winAsset?.browser_download_url || downUrls.win32[arch] || downUrls.win32.all || '';
} else if (platform === 'linux') {
// Linux
const linuxAsset = assets.find(asset =>
(asset.name.endsWith('.AppImage') || asset.name.endsWith('.deb')) &&
asset.name.includes('x64')
);
downloadUrl = linuxAsset?.browser_download_url || '';
downloadUrl = linuxAsset?.browser_download_url || downUrls.linux[arch] || '';
}
if (downloadUrl) {
window.open(`https://ghproxy.cn/${downloadUrl}`, '_blank');
window.open(`https://www.ghproxy.cn/${downloadUrl}`, '_blank');
} else {
// 如果没有找到对应的安装包,跳转到 release 页面
window.open('https://github.com/algerkong/AlgerMusicPlayer/releases/latest', '_blank');
}
closeModal();
};
onMounted(() => {

View File

@@ -28,7 +28,7 @@
<play-bar v-if="isPlay" :style="isMobile && store.state.musicFull ? 'bottom: 0;' : ''" />
</div>
<install-app-modal v-if="!isElectron"></install-app-modal>
<update-modal />
<update-modal v-if="isElectron"/>
</div>
</template>

View File

@@ -237,7 +237,7 @@ const checkForUpdates = async () => {
const toGithubRelease = () => {
if (updateInfo.value.hasUpdate) {
window.open(updateInfo.value.releaseInfo?.html_url || 'https://github.com/algerkong/AlgerMusicPlayer/releases/latest', '_blank');
store.commit('SET_SHOW_UPDATE_MODAL', true)
} else {
window.open('https://github.com/algerkong/AlgerMusicPlayer/releases', '_blank');
}

View File

@@ -38,6 +38,7 @@ interface State {
playMode: number;
theme: ThemeType;
musicFull: boolean;
showUpdateModal: boolean;
}
const state: State = {
@@ -57,7 +58,8 @@ const state: State = {
favoriteList: getLocalStorageItem('favoriteList', []),
playMode: getLocalStorageItem('playMode', 0),
theme: getCurrentTheme(),
musicFull: false
musicFull: false,
showUpdateModal: false
};
const { handlePlayMusic, nextPlay, prevPlay } = useMusicListHook();
@@ -117,6 +119,9 @@ const mutations = {
toggleTheme(state: State) {
state.theme = state.theme === 'dark' ? 'light' : 'dark';
applyTheme(state.theme);
},
SET_SHOW_UPDATE_MODAL(state, value) {
state.showUpdateModal = value
}
};

View File

@@ -1,7 +1,6 @@
import axios from 'axios';
import config from '../../../package.json';
import { useDateFormat } from '@vueuse/core';
interface GithubReleaseInfo {
tag_name: string;
body: string;
@@ -36,20 +35,41 @@ export const getLatestReleaseInfo = async (): Promise<GithubReleaseInfo | null>
try {
const token = import.meta.env.VITE_GITHUB_TOKEN;
const headers = {};
if (token) {
headers['Authorization'] = `token ${token}`;
}
const response = await axios.get(
const apiUrls = [
// 原始地址
'https://api.github.com/repos/algerkong/AlgerMusicPlayer/releases/latest',
{
headers
}
);
if (response.data) {
return response.data;
// 使用 ghproxy.com 代理
'https://www.ghproxy.cn/https://raw.githubusercontent.com/algerkong/AlgerMusicPlayer/dev_electron/package.json',
// 使用 gitee 镜像(如果有的话)
// 'https://gitee.com/api/v5/repos/[用户名]/AlgerMusicPlayer/releases/latest'
];
if (token) {
headers['Authorization'] = `token ${token}`;
}
return null;
for (const url of apiUrls) {
try {
const response = await axios.get(url, { headers });
if (url.includes('package.json')) {
// 如果是 package.json直接读取版本号
return {
tag_name: response.data.version,
body:(await axios.get('https://raw.githubusercontent.com/algerkong/AlgerMusicPlayer/dev_electron/CHANGELOG.md')).data,
html_url: 'https://github.com/algerkong/AlgerMusicPlayer/releases/latest',
assets: []
} as unknown as GithubReleaseInfo;
}
return response.data;
} catch (err) {
console.warn(`尝试访问 ${url} 失败:`, err);
continue;
}
}
throw new Error('所有 API 地址均无法访问');
} catch (error) {
console.error('获取 GitHub Release 信息失败:', error);
return null;
@@ -69,6 +89,7 @@ const formatDate = (dateStr: string): string => {
export const checkUpdate = async (currentVersion: string = config.version): Promise<UpdateResult | null> => {
try {
const releaseInfo = await getLatestReleaseInfo();
console.log('releaseInfo',releaseInfo)
if (!releaseInfo) {
return null;
}
@@ -77,6 +98,8 @@ export const checkUpdate = async (currentVersion: string = config.version): Prom
if (latestVersion === currentVersion) {
return null;
}
console.log('latestVersion',latestVersion)
console.log('currentVersion',currentVersion)
return {
hasUpdate: true,
@@ -84,7 +107,7 @@ export const checkUpdate = async (currentVersion: string = config.version): Prom
currentVersion,
releaseInfo: {
tag_name: latestVersion,
body: `## 更新内容\n\n- 版本: ${latestVersion}\n- 发布时间: ${formatDate(releaseInfo.published_at)}\n\n${releaseInfo.body}`,
body: `## 更新内容\n\n- 版本: ${latestVersion}\n${releaseInfo.body}`,
html_url: releaseInfo.html_url,
assets: releaseInfo.assets.map(asset => ({
browser_download_url: asset.browser_download_url,

View File

@@ -290,7 +290,7 @@ const checkForUpdates = async (isClick = false) => {
};
const openReleasePage = () => {
window.open(updateInfo.value.releaseInfo?.html_url || 'https://github.com/algerkong/AlgerMusicPlayer/releases/latest', '_blank');
store.commit('SET_SHOW_UPDATE_MODAL', true)
};
const selectDownloadPath = async () => {