配置页:订阅的增删改和立刻更新

写配置的纯逻辑在 shared/providers.ts。删除前 subscriptionReferences 同时查
直接 use 和经订阅副本(共用缓存文件 path)的间接引用,有被引用的就拦下并列出
策略组。订阅不允许改名:名字被 use: 和副本引用,同步所有引用不如删了重建。

页面还没挂进 App.vue 的导航,由集成者统一加。
This commit is contained in:
2026-08-11 18:50:13 +08:00
parent 6c8a1c4e0e
commit 0eef680fba
7 changed files with 1281 additions and 4 deletions
+17 -4
View File
@@ -99,6 +99,13 @@ export function latestDelay(info: ProxyInfo | undefined): number | null {
return last === undefined || last === 0 ? null : last
}
/** 一个订阅的运行时状态。updatedAt 是上次拉取成功的时刻,没拉过是 Go 的零值时间。 */
export interface ProviderInfo {
vehicleType: string
updatedAt?: string
proxies: ProxyInfo[]
}
export interface FieldSpec {
key: string
type: 'string' | 'number' | 'boolean' | 'string[]' | 'number[]' | 'object' | 'object[]'
@@ -158,6 +165,15 @@ export const api = {
return request<{ delay: number }>('GET', path)
},
/**
* 让内核立刻重新拉取某个订阅。
*
* 运行时动作,不写配置文件,所以不走 applyConfig 那条校验重载链路。成功时内核回
* 204 空响应,拉取失败回 503 带错误消息(内核源码 hub/route/provider.go:52-60)。
*/
refreshProvider: (name: string) =>
request<unknown>('PUT', `/api/kernel/providers/proxies/${encodeURIComponent(name)}`),
/**
* 订阅及其线路。配置文件里只有订阅地址,有哪些线路只有运行中的内核知道。
*
@@ -165,8 +181,5 @@ export const api = {
* 全局名字表里,这是拿到它们类型和延迟的唯一途径。
*/
providers: () =>
request<{ providers: Record<string, { vehicleType: string; proxies: ProxyInfo[] }> }>(
'GET',
'/api/kernel/providers/proxies',
),
request<{ providers: Record<string, ProviderInfo> }>('GET', '/api/kernel/providers/proxies'),
}