From e8b8181ef6a31af75c47365bf44f9172ad42d333 Mon Sep 17 00:00:00 2001 From: im0o <0ojixueseno0@gmail.com> Date: Mon, 10 Aug 2026 13:21:27 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9C=AC=E5=9C=B0=E5=BC=80=E5=8F=91=E6=8D=A2?= =?UTF-8?q?=E6=88=90=E7=9C=9F=E8=AE=A2=E9=98=85=EF=BC=9B=E9=97=AA=E7=94=B5?= =?UTF-8?q?=E6=8C=AA=E5=88=B0=E5=8D=A1=E7=89=87=E4=B8=8A=EF=BC=9B=E5=BF=99?= =?UTF-8?q?=E7=A2=8C=E7=8A=B6=E6=80=81=E6=94=B9=E6=88=90=E6=8C=89=E5=8D=A1?= =?UTF-8?q?=E7=89=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 占位线路删了。它们指向 127.0.0.1:1080,从来没测通过,而 URLTest 只在你选的那条 「对测试地址是活的」时才认账(urltest.go:106-111)——所以点了立刻被切回去, 一个正常行为看起来像 bug。现在本地内核直接用真订阅,通过隧道拉。 订阅地址带访问令牌,不能进 git:dev/config.yaml 变成模板,dev:reset 从 .env 取值生成 dev/home/config.yaml。顺带确认内核认 base64 分享链接格式(provider.go:384-390 回退到 ConvertsV2Ray),所以 Sub-Store 的输出直接能用。 闪电从组标题挪到每张卡的左下角,也就是延迟显示的位置:测过显示毫秒数,没测过显示闪电, 两种都能点,点了测这一条。忙碌状态从「禁用整个界面」改成只有正在提交的那张卡显示虚线边框。 --- .env.example | 4 + dev/config.yaml | 39 +-- package.json | 2 +- scripts/dev-reset.ts | 26 ++ web/components/OutboundCard.vue | 196 +++++++++++++ web/views/InboundDetail.vue | 481 +++++++++++--------------------- web/views/RouterPage.vue | 42 +-- 7 files changed, 429 insertions(+), 361 deletions(-) create mode 100644 scripts/dev-reset.ts create mode 100644 web/components/OutboundCard.vue diff --git a/.env.example b/.env.example index 92144ab..cb3ad68 100644 --- a/.env.example +++ b/.env.example @@ -10,6 +10,10 @@ PATCHBAY_CONFIG=./dev/home/config.yaml PATCHBAY_MIHOMO_BIN=../binary/mihomo-windows-amd64-v3-go125.exe PATCHBAY_MIHOMO_HOME=./dev/home +# 本地测试内核用的订阅地址,bun run dev:reset 会把它填进 dev/home/config.yaml。 +# 开发时一般是 SSH 隧道映射过来的 Sub-Store:ssh -N -L 3001:127.0.0.1:3001 用户名@服务器 +DEV_SUBSCRIPTION_URL= + # ── 想对着真实机器调试时改成这一套 ────────────────────── # 先开隧道把管理接口映射到本机: # ssh -N -f -L 9090:127.0.0.1:9090 用户名@服务器地址 diff --git a/dev/config.yaml b/dev/config.yaml index 201e4c8..45e87b0 100644 --- a/dev/config.yaml +++ b/dev/config.yaml @@ -1,7 +1,12 @@ -# 本地开发用的测试配置 — 不含任何真实信息 -# 端口刻意避开默认值(7890 / 9090),免得和机器上其它 mihomo 打架。 -# 里面的服务器地址全是占位的,从不会真的连上去;这份配置只用来验证 -# 「写回 → 校验 → 重载 → 失败还原」这条链路,不用来真的代理流量。 +# 本地开发用的测试配置模板。 +# +# 这是模板,不是实际运行的文件:`bun run dev:reset` 会把 __SUBSCRIPTION_URL__ 换成 +# .env 里的 DEV_SUBSCRIPTION_URL,生成 dev/home/config.yaml(那个文件不进 git)。 +# 订阅地址里通常带访问令牌,不能提交。 +# +# 端口刻意避开 mihomo 的默认值(7890 / 9090),免得和机器上其它内核打架。 +# 结构照着真实那台机器来:没有手写线路,全部通过订阅引入——这样开发时遇到的 +# 约束和真实环境一致(比如订阅线路无法被入站直接引用)。 mixed-port: 17890 # 代理端口,避开默认的 7890 allow-lan: false # 本地测试不对局域网开放 @@ -12,28 +17,30 @@ ipv6: false external-controller: 127.0.0.1:19090 # 管理接口,避开默认的 9090 secret: "dev-secret-local-only" -# 关掉自动更新,避免测试时下载 GEO 数据库 -geo-auto-update: false +geo-auto-update: false # 关掉自动更新,避免测试时下载 GEO 数据库 -proxies: - - name: 占位线路甲 - type: socks5 - server: 127.0.0.1 - port: 1080 - - name: 占位线路乙 - type: socks5 - server: 127.0.0.1 - port: 1081 +proxy-providers: + subs: + type: http + url: "__SUBSCRIPTION_URL__" + path: ./providers/subs.yaml + interval: 86400 + health-check: + enable: true + url: https://www.gstatic.com/generate_204 + interval: 300 proxy-groups: - name: PROXY # 总开关,手动选 type: select proxies: [AUTO, DIRECT] + use: [subs] - name: AUTO # 自动挑延迟最低的 type: url-test - proxies: [占位线路甲, 占位线路乙] + use: [subs] url: https://www.gstatic.com/generate_204 interval: 300 + tolerance: 50 rules: # 本机和内网地址一律直连 diff --git a/package.json b/package.json index 33a9101..5f76c65 100644 --- a/package.json +++ b/package.json @@ -9,7 +9,7 @@ "dev": "bun run --hot server/index.ts", "dev:web": "vite", "dev:kernel": "../binary/mihomo-windows-amd64-v3-go125.exe -d dev/home -f dev/home/config.yaml", - "dev:reset": "cp dev/config.yaml dev/home/config.yaml", + "dev:reset": "bun run scripts/dev-reset.ts", "build": "vite build", "test": "bun test", "smoke": "bun run scripts/api-smoke.ts", diff --git a/scripts/dev-reset.ts b/scripts/dev-reset.ts new file mode 100644 index 0000000..37d92cb --- /dev/null +++ b/scripts/dev-reset.ts @@ -0,0 +1,26 @@ +/** + * 从模板生成本地测试内核的配置。 + * + * 模板 dev/config.yaml 进 git,生成的 dev/home/config.yaml 不进——因为订阅地址里 + * 通常带访问令牌。所以模板里写占位符,这个脚本从 .env 取真值替换。 + * + * 用法:bun run dev:reset + */ +import { mkdir, readFile, writeFile } from 'node:fs/promises' + +const TEMPLATE = './dev/config.yaml' +const TARGET = './dev/home/config.yaml' +const PLACEHOLDER = '__SUBSCRIPTION_URL__' + +const url = Bun.env.DEV_SUBSCRIPTION_URL +const template = await readFile(TEMPLATE, 'utf8') + +if (template.includes(PLACEHOLDER) && !url) { + console.error(`模板里有 ${PLACEHOLDER},但 .env 里没有 DEV_SUBSCRIPTION_URL。`) + console.error('填一个能拉到线路的订阅地址;开发时通常是 SSH 隧道映射过来的 Sub-Store。') + process.exit(1) +} + +await mkdir('./dev/home', { recursive: true }) +await writeFile(TARGET, template.replaceAll(PLACEHOLDER, url ?? ''), 'utf8') +console.log(`${TARGET} 已从模板重新生成`) diff --git a/web/components/OutboundCard.vue b/web/components/OutboundCard.vue new file mode 100644 index 0000000..14f5964 --- /dev/null +++ b/web/components/OutboundCard.vue @@ -0,0 +1,196 @@ + + + + + diff --git a/web/views/InboundDetail.vue b/web/views/InboundDetail.vue index 72e4194..c51d787 100644 --- a/web/views/InboundDetail.vue +++ b/web/views/InboundDetail.vue @@ -1,26 +1,33 @@