有一个用户页面,有独立的 vue 前端和独立的 Fastapi 后端,这个用户页面可以启动停止和管理本机代理池 ["127.0.0.1:9360", ...] 。 用户页面采用 vue3(语法糖) + element-plus + fastapi + pywebview 架构做的一个本地桌面应用。虽然前后端都是在同一台机器上运行,但是考虑到未来可能或做成网页服务,因此代码仍遵循前后端分离。 我们姑且把前后端应用程序当成管理程序,通过 Fastapi / 路径来挂载前端编译好的静态文件,通过 /api 路径来处理前端的交互, 例如:
在另一个独立的项目中,有一个 celery 几个 worker 服务分别运行在不同进程中,在用户页面点击相关按钮,或者跟随用户页面,自启动这些 worker 、celery 、Redis ,具体启动逻辑在用户页面 ui\backend\src\services\celery_worker.py 文件中可以一键启动这些 worker celery。
未来 worker 可能还要扩展到别的电脑,不过现在暂时只有一台电脑。为了控制 worker 的任务启停,对外暴露 API 接口,该接口是 worker\api\search_cli.py 来监听各方的请求,包括用户页面也可以请求,请求接口中像 celery_app.send_task(...) 这样来调用各个 worker。
由于 worker 可能也用到代理池,也可能不用,仅默认使用系统代理池。而代理池又是由用户页面来管理,因此我打算采用 Redis 来作为中央代理池。
虽然我不对外使用,只在私有网络使用。
在用户页面中,哪个地方定期更新代理池比较好?
为了单一职责,帮我在 ui\backend\src 目录中新建一个类来管理订阅。 一个订阅来自一个 url 链接,该链接会得到一个 yaml 文件。大致内容如下:
mixed-port: 9360
allow-lan: false
bind-address: 127.0.0.1
mode: rule
log-level: info
external-controller: 127.0.0.1:9361
proxies:
- { name: '剩余流量:99.87 GB', type: trojan, server: spde.xn--e6q56cu20k.com, port: 443, password: f5cbdd91-fcfd-413c-8bad-af62aaa3c992, udp: true }
- { name: '距离下次重置剩余:24 天', type: trojan, server: spde.xn--e6q56cu20k.com, port: 443, password: f5cbdd91-fcfd-413c-8bad-af62aaa3c992, udp: true }
- { name: 套餐到期:2025-07-25, type: trojan, server: spde.xn--e6q56cu20k.com, port: 443, password: f5cbdd91-fcfd-413c-8bad-af62aaa3c992, udp: true }
- { name: trojan-测试, type: trojan, server: spde.xn--e6q56cu20k.com, port: 443, password: f5cbdd91-fcfd-413c-8bad-af62aaa3c992, udp: true }
- { name: 新加坡-vless, type: vless, server: 37.114.53.251, port: 56701, uuid: f5cbdd91-fcfd-413c-8bad-af62aaa3c992, udp: true, tls: true, skip-cert-verify: false, flow: xtls-rprx-vision, client-fingerprint: firefox, servername: addons.mozilla.org, reality-opts: { public-key: sW8BfHeovVzmbFuAnr9nH8oJaKYze6shKoKMdek5ai8, short-id: 792147b8 } }
- { name: '一元百G:https://fscloud.vip', server: jiedianfsc.fsc.interld123456789.com, port: 24000, ports: 24000-25000, mport: 24000-25000, udp: true, skip-cert-verify: true, sni: 234224.1234567890spcloud.com, type: hysteria2, password: f5cbdd91-fcfd-413c-8bad-af62aaa3c992 }
- { name: '日本aws - 003', server: jiedianfsc.fsc.interld123456789.com, port: 24000, ports: 24000-25000, mport: 24000-25000, udp: true, skip-cert-verify: true, sni: 234224.1234567890spcloud.com, type: hysteria2, password: f5cbdd91-fcfd-413c-8bad-af62aaa3c992 }
- { name: '新加坡aws - 003', server: jiedianfsc.fsc.interld123456789.com, port: 26000, ports: 26000-27000, mport: 26000-27000, udp: true, skip-cert-verify: true, sni: 234224.1234567890spcloud.com, type: hysteria2, password: f5cbdd91-fcfd-413c-8bad-af62aaa3c992 }
虽然上述是一个默认的 yaml 文件,但是用户可以另存为多个不同的 yaml 文件,只需要修改两个端口 external-controller 、mixed-port ,然后用 {mimo_exe} -f {yaml_file} 就能启动多个代理服务。
管理订阅可能有许多功能:
路径和文件:
5f3b4e06.yaml6137e542.yaml、{PROXY_POLL_DIR}/d92ef962.yaml (当前还不需要)我可能有描述不完善的地方,你自主根据最佳实践来设计。请继续完善代码。
务必符合最佳软件设计架构,务必符合 Vue3(语法糖) element-plus Fastapi 语法风格。
Proxy.vue 能否点击“代理池”后自动请求 proxy.py 中的 @router.get("/proxies") ,如果结果不是空,则展示到 ProxyPool.vue 表格中。
如果 ProxyPool.vue 表格是空,可以添加代理到表格中,完成添加后才请求 proxy.py 。
要求: 重构 ProxyPool.vue 代码
务必符合最佳软件设计架构,务必符合 Vue3(语法糖) element-plus Fastapi 语法风格。