diff --git a/examples/client-integration/main.go b/examples/client-integration/main.go index 5a427e4..86eede4 100644 --- a/examples/client-integration/main.go +++ b/examples/client-integration/main.go @@ -17,12 +17,8 @@ func main() { if server == "" { server = "http://127.0.0.1:8080" } - api, err := client.New(server, client.WithSessionToken(os.Getenv("SCOUT_SESSION"))) - if err != nil { - fail(err) - } - - manager, err := updater.New(updater.Config{ + project := os.Getenv("SCOUT_PROJECT") var api *client.Client var err error if project == "" || project == "default" { api, err = client.New(server, client.WithSessionToken(os.Getenv("SCOUT_SESSION"))) } else { api, err = client.NewProject(server, project, client.WithSessionToken(os.Getenv("SCOUT_SESSION"))) } if err != nil { fail(err) } +manager, err := updater.New(updater.Config{ Client: api, PackageName: "demo-core", CurrentVersion: "1.0.0", diff --git a/frontend/src/views/Home/Home.js b/frontend/src/views/Home/Home.js index 91eb7b1..2204a38 100644 --- a/frontend/src/views/Home/Home.js +++ b/frontend/src/views/Home/Home.js @@ -2,6 +2,7 @@ import { computed, ref } from 'vue' const defaultApi = import.meta.env.VITE_API_BASE || (['5173', '5174'].includes(window.location.port) ? 'http://127.0.0.1:8080' : window.location.origin) const sessionKey = 'scout-session' +const projectKey = 'scout-project' export function useHome() { const apiBase = ref(defaultApi) @@ -12,6 +13,8 @@ export function useHome() { const authForm = ref({ email: '', name: '', password: '' }) const resetForm = ref({ email: '', token: '', password: '' }) const adminUsers = ref([]) + const projects = ref([]) + const selectedProject = ref(localStorage.getItem(projectKey) || 'default') const search = ref('') const filters = ref({ platform: '', architecture: '', channel: '', currentVersion: '' }) const packages = ref([]) @@ -66,6 +69,36 @@ export function useHome() { return session.value ? { Authorization: `Bearer ${session.value}` } : {} } + function resourcePath(path) { + if (selectedProject.value === 'default' || !path.startsWith('/api/v1')) return path + return `/api/v1/projects/${encodeURIComponent(selectedProject.value)}${path.slice('/api/v1'.length)}` + } + + async function loadProjects() { + try { + const payload = await request('/api/v1/projects') + projects.value = payload.projects || [] + const selected = projects.value.find((item) => item.id === selectedProject.value) + if (!selected || selected.status !== 'active') { + selectedProject.value = 'default' + localStorage.setItem(projectKey, selectedProject.value) + } + } catch (reason) { + error.value = reason.message + } + } + + async function changeProject() { + const selected = projects.value.find((item) => item.id === selectedProject.value) + if (!selected || selected.status !== 'active') { + selectedProject.value = 'default' + } + localStorage.setItem(projectKey, selectedProject.value) + selectedPackage.value = null + versions.value = [] + await refreshPackages() + } + async function readResponse(response) { const contentType = response.headers.get('content-type') || '' const payload = contentType.includes('application/json') @@ -94,7 +127,7 @@ export function useHome() { if (filters.value.channel) params.set('channel', filters.value.channel) if (filters.value.currentVersion) params.set('current_version', filters.value.currentVersion) const query = params.toString() ? `?${params.toString()}` : '' - const payload = await request(`/api/v1/packages${query}`) + const payload = await request(`${resourcePath('/api/v1/packages')}${query}`) packages.value = payload.packages || [] if (selectedPackage.value) { const latest = packages.value.find((item) => item.name === selectedPackage.value.name) @@ -156,7 +189,7 @@ export function useHome() { if (filters.value.channel) params.set('channel', filters.value.channel) if (filters.value.currentVersion) params.set('current_version', filters.value.currentVersion) const query = params.toString() ? `?${params.toString()}` : '' - const payload = await request(`/api/v1/packages/${encodeURIComponent(item.name)}/versions${query}`) + const payload = await request(`${resourcePath(`/api/v1/packages/${encodeURIComponent(item.name)}/versions`)}${query}`) versions.value = payload.versions || [] } catch (reason) { error.value = reason.message @@ -194,7 +227,7 @@ export function useHome() { const headers = session.value ? authHeaders() : { Authorization: `Bearer ${developerToken.value}` } - const payload = await request('/api/v1/packages/upload', { + const payload = await request(resourcePath('/api/v1/packages/upload'), { method: 'POST', headers, body: formData, @@ -329,7 +362,7 @@ export function useHome() { if (filters.value.architecture) params.set('architecture', filters.value.architecture) if (filters.value.currentVersion) params.set('current_version', filters.value.currentVersion) const query = params.toString() ? `?${params.toString()}` : '' - return endpoint(`/api/v1/packages/${encodeURIComponent(item.name)}/${encodeURIComponent(item.version)}/download${query}`) + return endpoint(`${resourcePath(`/api/v1/packages/${encodeURIComponent(item.name)}/${encodeURIComponent(item.version)}/download`)}${query}`) } function startNotifications() { @@ -343,7 +376,7 @@ export function useHome() { params.set('versions', `${selectedPackage.value.name}:${filters.value.currentVersion}`) } const query = params.toString() ? `?${params.toString()}` : '' - eventSource = new EventSource(endpoint(`/api/v1/updates/stream${query}`)) + eventSource = new EventSource(endpoint(`${resourcePath('/api/v1/updates/stream')}${query}`)) eventSource.addEventListener('package_updated', async (event) => { const payload = JSON.parse(event.data) message.value = `收到更新通知:${payload.package.name} ${payload.package.version}` @@ -372,6 +405,8 @@ export function useHome() { authForm, resetForm, adminUsers, + projects, + selectedProject, search, filters, packages, @@ -392,6 +427,8 @@ export function useHome() { uploadArchitectureOptions, channelOptions, roleText, + loadProjects, + changeProject, loadPackages, refreshPackages, scheduleRefresh, diff --git a/frontend/src/views/Home/Home.vue b/frontend/src/views/Home/Home.vue index bbd9d58..8b81a6b 100644 --- a/frontend/src/views/Home/Home.vue +++ b/frontend/src/views/Home/Home.vue @@ -11,6 +11,8 @@ const { authForm, resetForm, adminUsers, + projects, + selectedProject, search, filters, packages, @@ -31,6 +33,8 @@ const { uploadArchitectureOptions, channelOptions, roleText, + loadProjects, + changeProject, loadPackages, refreshPackages, scheduleRefresh, @@ -53,6 +57,7 @@ const { onMounted(async () => { await loadMe() + await loadProjects() await refreshPackages() }) @@ -79,6 +84,14 @@ onUnmounted(stopNotifications) 服务端地址 +