feat: 新增游客订阅链接与节点拖动排序

游客链接:可建多个带独立 token 的订阅,按节点名勾选白名单
(抗重新抓取),/surge|/clash|/ssr 复用同一路径回落匹配 guest
token,三个 generator 接收可选 whitelist 过滤生成。

节点排序:fetched_nodes 新增 sort_order,重抓时按名保留顺序,
选择/节点面板支持原生拖拽排序,输出按此顺序排列。

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-06-23 23:43:28 +08:00
parent c3d8e1a961
commit fb7a30489e
14 changed files with 737 additions and 44 deletions

View File

@@ -89,6 +89,14 @@ export const nodes = {
staticDelete: (id: number) => request<{ ok: boolean }>(`/nodes/static/${id}`, {
method: 'DELETE',
}),
staticReorder: (ids: number[]) => request<{ ok: boolean }>('/nodes/static/reorder', {
method: 'PUT',
body: JSON.stringify({ ids }),
}),
fetchedReorder: (ids: number[]) => request<{ ok: boolean }>('/nodes/fetched/reorder', {
method: 'PUT',
body: JSON.stringify({ ids }),
}),
};
// Rules
@@ -118,6 +126,24 @@ export const config = {
regenerateSurgeToken: () => request<{ token: string }>('/config/surge-token', { method: 'POST' }),
};
// Guest links
export const guests = {
list: () => request<any[]>('/guests'),
availableNodes: () => request<{ static: any[]; subscriptions: any[] }>('/guests/available-nodes'),
create: (name: string) => request<{ id: number; token: string }>('/guests', {
method: 'POST',
body: JSON.stringify({ name }),
}),
get: (id: number) => request<any>(`/guests/${id}`),
update: (id: number, data: any) => request<{ ok: boolean }>(`/guests/${id}`, {
method: 'PUT',
body: JSON.stringify(data),
}),
delete: (id: number) => request<{ ok: boolean }>(`/guests/${id}`, {
method: 'DELETE',
}),
};
// Stats
export const stats = {
get: () => request<any>('/stats'),