Skip to content

Commit c195cc0

Browse files
authored
下载页面支持通过 github api 实时获取最新版本号 (#271)
(若获取失败则回退为当前硬编码的数据)
1 parent d48b32b commit c195cc0

3 files changed

Lines changed: 66 additions & 10 deletions

File tree

en/guide/download.md

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,11 @@ home: hello
33
---
44

55
<script setup lang="ts">
6-
import { ref } from 'vue'
6+
import { computed, ref } from 'vue'
77
import { data } from '../../metadata.data.js'
8+
import { useLatestVersion } from '../../useLatestVersion.ts'
9+
10+
const { latestVersion, prereleaseVersion, loading, error } = useLatestVersion()
811

912
interface Package {
1013
os: string
@@ -132,8 +135,15 @@ const filter_os = ref('')
132135
const filter_arch = ref('')
133136
const accel_proxy = ref('')
134137

138+
const vers = computed(() => ({
139+
easytier_latest_version: (!loading.value && !error.value && latestVersion.value) ? latestVersion.value : data.easytier_latest_version,
140+
easytier_pre_release_version: (!loading.value && !error.value && prereleaseVersion.value) ? prereleaseVersion.value : data.easytier_pre_release_version,
141+
}))
142+
143+
const currentVersion = computed(() => vers.value[channel.value as keyof typeof vers.value])
144+
135145
function renderUrlTmpl(url_tmpl: string): string {
136-
return accel_proxy.value + url_tmpl.replace(/\{\}/g, data[channel.value])
146+
return accel_proxy.value + url_tmpl.replace(/\{\}/g, currentVersion.value)
137147
}
138148

139149
</script>
@@ -153,12 +163,12 @@ The command line program package includes four executables:
153163

154164
<div>
155165
<select name="channel-select" id="channel-select" v-model="channel" class="filter-select">
156-
<option value="easytier_latest_version"> Stable Version(v{{ data.easytier_latest_version }}) </option>
157-
<option value="easytier_pre_release_version"> Pre-release Version(v{{ data.easytier_pre_release_version }}) </option>
166+
<option value="easytier_latest_version"> Stable Version(v{{ vers.easytier_latest_version }}) </option>
167+
<option value="easytier_pre_release_version"> Pre-release Version(v{{ vers.easytier_pre_release_version }}) </option>
158168
</select>
159169
</div>
160170

161-
## <a :href="url + data[channel]">EasyTier v{{ data[channel] }}</a> { #latest }
171+
## <a :href="url + currentVersion">EasyTier v{{ currentVersion }}</a> { #latest }
162172

163173
- GitHub Acceleration
164174
<div>

guide/download.md

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,11 @@ home: hello
33
---
44

55
<script setup lang="ts">
6-
import { ref } from 'vue'
6+
import { computed, ref } from 'vue'
77
import { data } from '../metadata.data.js'
8+
import { useLatestVersion } from '../useLatestVersion.ts'
9+
10+
const { latestVersion, prereleaseVersion, loading, error } = useLatestVersion()
811

912
interface Package {
1013
os: string
@@ -132,8 +135,15 @@ const filter_os = ref('')
132135
const filter_arch = ref('')
133136
const accel_proxy = ref('')
134137

138+
const vers = computed(() => ({
139+
easytier_latest_version: (!loading.value && !error.value && latestVersion.value) ? latestVersion.value : data.easytier_latest_version,
140+
easytier_pre_release_version: (!loading.value && !error.value && prereleaseVersion.value) ? prereleaseVersion.value : data.easytier_pre_release_version,
141+
}))
142+
143+
const currentVersion = computed(() => vers.value[channel.value as keyof typeof vers.value])
144+
135145
function renderUrlTmpl(url_tmpl: string): string {
136-
return accel_proxy.value + url_tmpl.replace(/\{\}/g, data[channel.value])
146+
return accel_proxy.value + url_tmpl.replace(/\{\}/g, currentVersion.value)
137147
}
138148

139149
</script>
@@ -153,12 +163,12 @@ function renderUrlTmpl(url_tmpl: string): string {
153163

154164
<div>
155165
<select name="channel-select" id="channel-select" v-model="channel" class="filter-select">
156-
<option value="easytier_latest_version"> 稳定版(v{{ data.easytier_latest_version }}) </option>
157-
<option value="easytier_pre_release_version"> 预发布版(v{{ data.easytier_pre_release_version }}) </option>
166+
<option value="easytier_latest_version"> 稳定版(v{{ vers.easytier_latest_version }}) </option>
167+
<option value="easytier_pre_release_version"> 预发布版(v{{ vers.easytier_pre_release_version }}) </option>
158168
</select>
159169
</div>
160170

161-
## <a :href="url + data[channel]">EasyTier v{{ data[channel] }}</a> { #latest }
171+
## <a :href="url + currentVersion">EasyTier v{{ currentVersion }}</a> { #latest }
162172

163173
- Github 加速
164174
<div>

useLatestVersion.ts

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
import { ref, onMounted } from 'vue'
2+
3+
export function useLatestVersion() {
4+
const latestVersion = ref<string | null>(null)
5+
const prereleaseVersion = ref<string | null>(null)
6+
const loading = ref(true)
7+
const error = ref<string | null>(null)
8+
9+
onMounted(async () => {
10+
try {
11+
const [latestRes, releasesRes] = await Promise.all([
12+
fetch('https://api.github.com/repos/EasyTier/EasyTier/releases/latest'),
13+
fetch('https://api.github.com/repos/EasyTier/EasyTier/releases?per_page=5')
14+
])
15+
16+
if (!latestRes.ok || !releasesRes.ok) {
17+
throw new Error('Failed to fetch releases from GitHub API')
18+
}
19+
20+
const latestData = await latestRes.json() as { tag_name?: string }
21+
const releases = await releasesRes.json() as Array<{ tag_name?: string; prerelease?: boolean }>
22+
23+
latestVersion.value = latestData.tag_name ?? null
24+
prereleaseVersion.value = releases.find((item) => item.prerelease)?.tag_name ?? null
25+
} catch (err) {
26+
error.value = err instanceof Error ? err.message : 'Unknown error'
27+
} finally {
28+
loading.value = false
29+
}
30+
31+
if (latestVersion.value?.startsWith('v')) latestVersion.value = latestVersion.value.slice(1)
32+
if (prereleaseVersion.value?.startsWith('v')) prereleaseVersion.value = prereleaseVersion.value.slice(1)
33+
})
34+
35+
return { latestVersion, prereleaseVersion, loading, error }
36+
}

0 commit comments

Comments
 (0)