feat: 合并边缘节点运维并完善 Surge 配置安全
迁入通用节点部署工具、离线交付页生成器和共用技能,隔离真实配置与交付产物。统一 Codex 与 Claude Code 开发约定,补充节点迁移与运维文档。 完善 FINAL、策略组引用、输入校验、Surge 字段编码与 AI DNS 例外保护,增加隔离测试和订阅验证工具。 验证:全量类型检查、44 项单测、前端构建、脚本语法、技能入口与凭据隔离检查均通过。
This commit is contained in:
@@ -224,9 +224,10 @@ function memberLabel(m: GroupDto['members'][number]): string {
|
||||
<NInput v-model:value="form.filterRegex" placeholder="如 SG|Singapore(配合收纳全部节点或成员组)" class="mono" />
|
||||
</NFormItem>
|
||||
<template v-if="form.type !== 'select'">
|
||||
<NFormItem label="测速 URL">
|
||||
<NFormItem label="测速 URL(Clash/ShadowRocket)">
|
||||
<NInput v-model:value="form.testUrl" placeholder="http://cp.cloudflare.com/generate_204" class="mono" />
|
||||
</NFormItem>
|
||||
<p class="form-hint">Surge 使用设置页 General 中的 proxy-test-url;不支持组级测速 URL。</p>
|
||||
<NFormItem label="间隔(秒)">
|
||||
<NInputNumber v-model:value="form.interval" :min="10" style="width: 100%" />
|
||||
</NFormItem>
|
||||
|
||||
@@ -43,7 +43,7 @@ const form = ref<RuleInput>({ type: 'DOMAIN-SUFFIX', value: '', policy: 'DIRECT'
|
||||
|
||||
const policyOptions = computed(() => [
|
||||
...['DIRECT', 'REJECT', 'REJECT-DROP', 'REJECT-NO-DROP'].map((p) => ({ label: p, value: p })),
|
||||
...groupsStore.groups.map((g) => ({ label: g.name, value: g.name })),
|
||||
...groupsStore.groups.filter((g) => g.enabled).map((g) => ({ label: g.name, value: g.name })),
|
||||
]);
|
||||
|
||||
const typeOptions = RULE_TYPES.filter((t) => t !== 'RULE-SET' && t !== 'DOMAIN-SET' && t !== 'FINAL').map((t) => ({
|
||||
@@ -170,7 +170,7 @@ const columns = computed<DataTableColumns<RuleDto>>(() => [
|
||||
title: '启用',
|
||||
key: 'enabled',
|
||||
width: 70,
|
||||
render: (row) => h(NSwitch, { size: 'small', value: row.enabled, onUpdateValue: (v: boolean) => store.toggle(row.id, v) }),
|
||||
render: (row) => h(NSwitch, { size: 'small', value: row.enabled, disabled: row.type === 'FINAL', onUpdateValue: (v: boolean) => store.toggle(row.id, v) }),
|
||||
},
|
||||
{
|
||||
title: '',
|
||||
@@ -178,12 +178,12 @@ const columns = computed<DataTableColumns<RuleDto>>(() => [
|
||||
width: 170,
|
||||
render: (row, i) =>
|
||||
h(NSpace, { size: 2 }, () => [
|
||||
h(NButton, { size: 'tiny', quaternary: true, disabled: i === 0, onClick: () => move(row, -1) }, () => '↑'),
|
||||
h(NButton, { size: 'tiny', quaternary: true, disabled: i === store.rules.length - 1, onClick: () => move(row, 1) }, () => '↓'),
|
||||
h(NButton, { size: 'tiny', quaternary: true, disabled: i === 0 || row.type === 'FINAL', onClick: () => move(row, -1) }, () => '↑'),
|
||||
h(NButton, { size: 'tiny', quaternary: true, disabled: i >= store.rules.length - 2 || row.type === 'FINAL', onClick: () => move(row, 1) }, () => '↓'),
|
||||
...(row.type !== 'RULE-SET' && row.type !== 'DOMAIN-SET' && row.type !== 'FINAL'
|
||||
? [h(NButton, { size: 'tiny', quaternary: true, onClick: () => openEdit(row) }, () => '编辑')]
|
||||
: []),
|
||||
...(row.source === 'custom'
|
||||
...(row.source === 'custom' && row.type !== 'FINAL'
|
||||
? [h(NButton, { size: 'tiny', quaternary: true, type: 'error', onClick: () => confirmDelete(row) }, () => '删除')]
|
||||
: []),
|
||||
]),
|
||||
|
||||
Reference in New Issue
Block a user