规则页:全局分流规则的编辑与规则组管理

新增 RulesPage.vue 和规则、规则组、ini 导入三个对话框,纯逻辑放在
shared/rules.ts。拆分规则字符串复用 vendor 的 splitRuleFields——引号和
嵌套括号里的逗号不会被当成字段分隔;目标之后的选项段原样拼回,改一条
规则不会丢掉它的 no-resolve 尾巴。规则组的缓存路径显式生成:不写 path
时内核按 url 哈希自己算一个,那个路径这里算不出来。
This commit is contained in:
2026-08-11 18:53:21 +08:00
parent 6c8a1c4e0e
commit 9e87517a4e
7 changed files with 2397 additions and 0 deletions
+31
View File
@@ -113,6 +113,20 @@ export interface ListenerFields {
types: Record<string, { note: string; fields: FieldSpec[] }>
}
export interface RuleProviderInfo {
/** domain / ipcidr / classical */
behavior: string
/** yaml / text / mrs。inline 类型的没有这个字段 */
format?: string
name: string
/** 当前装了多少条规则 */
ruleCount: number
/** HTTP / File / Inline */
vehicleType: string
/** RFC3339。还没拉取过时是零值(0001-01-01) */
updatedAt: string
}
export const api = {
readConfig: () => request<ConfigSnapshot>('GET', '/api/config'),
@@ -158,6 +172,23 @@ export const api = {
return request<{ delay: number }>('GET', path)
},
/**
* 每个规则组的运行时状态:装了多少条规则、上次什么时候更新。
* 配置文件里只有声明,这两个数字只有运行中的内核知道。
*/
ruleProviders: () =>
request<{ providers: Record<string, RuleProviderInfo> }>('GET', '/api/kernel/providers/rules'),
/**
* 让内核立刻重新拉取某个规则组。
* 这是运行时动作,不写配置文件,所以不走落盘那条保护链路。
*/
updateRuleProvider: (name: string) =>
request<Record<string, never>>(
'PUT',
`/api/kernel/providers/rules/${encodeURIComponent(name)}`,
),
/**
* 订阅及其线路。配置文件里只有订阅地址,有哪些线路只有运行中的内核知道。
*