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)
服务端地址
+