Răsfoiți Sursa

新增 readme.md

mrh 1 an în urmă
părinte
comite
fcf6d08bd0
3 a modificat fișierele cu 78 adăugiri și 4 ștergeri
  1. 68 0
      README.md
  2. 7 2
      backend/demo/client.py
  3. 3 2
      backend/routers/mihomo.py

+ 68 - 0
README.md

@@ -0,0 +1,68 @@
+# 项目概述
+
+本项目是一个基于 FastAPI + Vue3 的代理池管理系统,主要用于通过订阅链接获取服务商提供的代理池数据,并通过 mihomo 工具启动本地代理池服务。系统支持对代理池进行增删改查操作,方便用户管理和使用代理服务器。
+
+## 核心功能
+
+### 1. 订阅管理
+- 用户可以通过 API 添加订阅链接。
+- 系统会自动解析订阅链接中的代理服务器信息,并将其存储到数据库中。
+
+### 2. 代理池管理
+- **随机获取代理**:通过 `/get` 接口可以随机获取一个代理,支持过滤仅返回支持 HTTPS 的代理。
+- **删除代理**:通过 `/delete` 接口可以删除指定的代理。
+- **添加代理**:通过 `/add` 接口可以手动添加新的代理。
+- **查看所有代理**:通过 `/all` 接口可以获取当前所有的代理列表。
+- **统计代理数量**:通过 `/count` 接口可以查看当前代理池中的代理数量。
+
+### 3. 本地代理池启动
+- 使用 mihomo 工具启动本地代理池服务,方便开发和测试。
+
+## 技术实现
+
+### 后端实现细节
+后端基于 FastAPI 框架开发,主要功能模块包括:
+
+1. **生命周期管理**:
+   - `lifespan(app: FastAPI)` 函数用于管理应用的启动和关闭流程,确保资源的正确初始化和释放。
+
+2. **健康检查**:
+   - `health_check()` 函数提供了一个健康检查接口,用于验证服务是否正常运行。
+
+3. **API 接口**:
+   - `root()` 函数定义了根路径接口,返回 API 的基本介绍。
+   - `get_random_proxy()` 函数实现了随机获取代理的功能,支持根据需求过滤代理类型。
+
+4. **Mihomo 相关路由**:
+   - `POST /mihomo/start`: 启动 Mihomo 代理。
+   - `POST /mihomo/start-each-provider`: 启动每个服务商的代理。
+   - `POST /mihomo/stop`: 停止指定的 Mihomo 代理。
+   - `GET /mihomo/status`: 获取当前运行的 Mihomo 状态。
+   - `GET /mihomo/reachability`: 检查代理的可达性。
+   - `POST /mihomo/reachability/start-all`: 启动所有代理的可达性检查。
+   - `GET /mihomo/controller-urls`: 获取控制器 URL 列表。
+   - `POST /mihomo/stop-all`: 停止所有 Mihomo 代理。
+
+5. **订阅相关路由**:
+   - `POST /subscriptions/add`: 添加订阅链接。
+   - `GET /subscriptions/list`: 列出所有订阅。
+   - `GET /proxies/list`: 列出所有代理。
+
+### 进程管理
+系统通过 `ProcessManager` 类管理子进程,主要功能包括:
+- **启动子进程**: `start_process(command: str, process_name: str)` 方法用于启动一个子进程并记录其 PID。
+- **停止子进程**: `stop_process(process_name: str)` 方法用于停止指定名称的子进程。
+- **停止所有子进程**: `stop_all_processes()` 方法用于停止所有子进程。
+
+### 数据库设计
+- 系统使用数据库存储代理池数据和订阅链接信息,确保数据的持久化和高效查询。
+
+## 当前状态
+
+- **后端**: 已完成
+- **前端**: 尚未开始
+
+## 后续计划
+
+- 完成前端开发
+- 进行整体测试和部署

+ 7 - 2
backend/demo/client.py

@@ -90,9 +90,14 @@ async def get_random_proxy():
         addr = f'http://127.0.0.1:{port}'
         logger.info(f"curl -i -x {addr} https://www.google.com")
         return results
+
+async def start_by_ids(proxy_ids: list):
+    for proxy_id in proxy_ids:
+        await start_proxy(proxy_id)
 async def main():
-    await start_proxies()
-    await get_random_proxy()
+    # await start_proxies()
+    # await get_random_proxy()
+    await start_by_ids([26,27,28,38,39,40,41])
     
 if __name__ == "__main__":
     asyncio.run(main())

+ 3 - 2
backend/routers/mihomo.py

@@ -8,7 +8,8 @@ from datetime import datetime, timedelta
 from pydantic import BaseModel
 from typing import Dict, List, Optional, Union
 import httpx
-from sqlmodel import Session, select, or_,func, update
+from sqlalchemy import JSON
+from sqlmodel import Field, Session, select, or_,func, update
 import yaml
 import signal
 from asyncio import subprocess
@@ -44,7 +45,7 @@ class MihomoMetaWithURL(MihomoMeta, table=False):
     subscript_file: Optional[int] = None
     external_controller_url: Optional[str] = None
     error: Optional[str] = None  # 新增错误信息字段
-    detail: Optional[dict] = None
+    detail: Optional[Dict] = Field(default={}, sa_type=JSON)
     class Config:
         arbitrary_types_allowed = True