From fef0978a0e176bc0198ab72dd49c2f933c4e8005 Mon Sep 17 00:00:00 2001 From: cnlimiter Date: Wed, 18 Mar 2026 19:57:49 +0800 Subject: [PATCH] =?UTF-8?q?fix(main):=20=E4=BC=98=E5=8C=96=E9=A1=B9?= =?UTF-8?q?=E7=9B=AE=E7=BB=93=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pyproject.toml | 1 + src/core/__init__.py | 2 +- src/core/openai/__init__.py | 3 +++ src/core/{ => openai}/oauth.py | 2 +- src/core/{ => openai}/payment.py | 2 +- src/core/{ => openai}/token_refresh.py | 8 ++++---- src/core/register.py | 2 +- src/core/upload/__init__.py | 3 +++ src/core/{ => upload}/cpa_upload.py | 6 +++--- src/core/{ => upload}/sub2api_upload.py | 4 ++-- .../team_manager_upload.py} | 6 +++--- src/services/__init__.py | 6 +++--- src/services/{custom_domain.py => moe_mail.py} | 2 +- .../{outlook_legacy.py => outlook_legacy_mail.py} | 0 src/web/routes/__init__.py | 8 ++++---- src/web/routes/{email_services.py => email.py} | 0 src/web/routes/payment.py | 4 ++-- src/web/routes/settings.py | 6 ++++-- src/web/routes/upload/__init__.py | 2 ++ src/web/routes/{ => upload}/cpa_services.py | 6 +++--- src/web/routes/{ => upload}/sub2api_services.py | 6 +++--- src/web/routes/{ => upload}/tm_services.py | 6 +++--- uv.lock | 11 +++++++++++ 23 files changed, 59 insertions(+), 37 deletions(-) create mode 100644 src/core/openai/__init__.py rename src/core/{ => openai}/oauth.py (99%) rename src/core/{ => openai}/payment.py (99%) rename src/core/{ => openai}/token_refresh.py (98%) create mode 100644 src/core/upload/__init__.py rename src/core/{ => upload}/cpa_upload.py (98%) rename src/core/{ => upload}/sub2api_upload.py (98%) rename src/core/{team_manager.py => upload/team_manager_upload.py} (97%) rename src/services/{custom_domain.py => moe_mail.py} (99%) rename src/services/{outlook_legacy.py => outlook_legacy_mail.py} (100%) rename src/web/routes/{email_services.py => email.py} (100%) create mode 100644 src/web/routes/upload/__init__.py rename src/web/routes/{ => upload}/cpa_services.py (97%) rename src/web/routes/{ => upload}/sub2api_services.py (97%) rename src/web/routes/{ => upload}/tm_services.py (97%) diff --git a/pyproject.toml b/pyproject.toml index bf01157..6f1b63f 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -15,6 +15,7 @@ dependencies = [ "aiosqlite>=0.19.0", "psycopg[binary]>=3.1.18", "websockets>=16.0", + "path>=17.1.1", ] [project.optional-dependencies] diff --git a/src/core/__init__.py b/src/core/__init__.py index a849736..7ec7c6f 100644 --- a/src/core/__init__.py +++ b/src/core/__init__.py @@ -2,7 +2,7 @@ 核心功能模块 """ -from .oauth import OAuthManager, OAuthStart, generate_oauth_url, submit_callback_url +from .openai.oauth import OAuthManager, OAuthStart, generate_oauth_url, submit_callback_url from .http_client import ( OpenAIHTTPClient, HTTPClient, diff --git a/src/core/openai/__init__.py b/src/core/openai/__init__.py new file mode 100644 index 0000000..3a2da6d --- /dev/null +++ b/src/core/openai/__init__.py @@ -0,0 +1,3 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +# @Time : 2026/3/18 19:55 \ No newline at end of file diff --git a/src/core/oauth.py b/src/core/openai/oauth.py similarity index 99% rename from src/core/oauth.py rename to src/core/openai/oauth.py index c621355..e8dc0fa 100644 --- a/src/core/oauth.py +++ b/src/core/openai/oauth.py @@ -14,7 +14,7 @@ from typing import Any, Dict, Optional from curl_cffi import requests as cffi_requests -from ..config.constants import ( +from ...config.constants import ( OAUTH_CLIENT_ID, OAUTH_AUTH_URL, OAUTH_TOKEN_URL, diff --git a/src/core/payment.py b/src/core/openai/payment.py similarity index 99% rename from src/core/payment.py rename to src/core/openai/payment.py index 24e2182..d584a58 100644 --- a/src/core/payment.py +++ b/src/core/openai/payment.py @@ -9,7 +9,7 @@ from typing import Optional from curl_cffi import requests as cffi_requests -from ..database.models import Account +from ...database.models import Account logger = logging.getLogger(__name__) diff --git a/src/core/token_refresh.py b/src/core/openai/token_refresh.py similarity index 98% rename from src/core/token_refresh.py rename to src/core/openai/token_refresh.py index 9475a71..394c56e 100644 --- a/src/core/token_refresh.py +++ b/src/core/openai/token_refresh.py @@ -12,10 +12,10 @@ from datetime import datetime, timedelta from curl_cffi import requests as cffi_requests -from ..config.settings import get_settings -from ..database.session import get_db -from ..database import crud -from ..database.models import Account +from ...config.settings import get_settings +from ...database.session import get_db +from ...database import crud +from ...database.models import Account logger = logging.getLogger(__name__) diff --git a/src/core/register.py b/src/core/register.py index 7411b51..56bc401 100644 --- a/src/core/register.py +++ b/src/core/register.py @@ -15,7 +15,7 @@ from datetime import datetime from curl_cffi import requests as cffi_requests -from .oauth import OAuthManager, OAuthStart +from .openai.oauth import OAuthManager, OAuthStart from .http_client import OpenAIHTTPClient, HTTPClientError from ..services import EmailServiceFactory, BaseEmailService, EmailServiceType from ..database import crud diff --git a/src/core/upload/__init__.py b/src/core/upload/__init__.py new file mode 100644 index 0000000..059e515 --- /dev/null +++ b/src/core/upload/__init__.py @@ -0,0 +1,3 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- +# @Time : 2026/3/18 19:54 \ No newline at end of file diff --git a/src/core/cpa_upload.py b/src/core/upload/cpa_upload.py similarity index 98% rename from src/core/cpa_upload.py rename to src/core/upload/cpa_upload.py index 1583bd0..d61758c 100644 --- a/src/core/cpa_upload.py +++ b/src/core/upload/cpa_upload.py @@ -10,9 +10,9 @@ from datetime import datetime from curl_cffi import requests as cffi_requests from curl_cffi import CurlMime -from ..database.session import get_db -from ..database.models import Account -from ..config.settings import get_settings +from ...database.session import get_db +from ...database.models import Account +from ...config.settings import get_settings logger = logging.getLogger(__name__) diff --git a/src/core/sub2api_upload.py b/src/core/upload/sub2api_upload.py similarity index 98% rename from src/core/sub2api_upload.py rename to src/core/upload/sub2api_upload.py index 2874f04..2fae618 100644 --- a/src/core/sub2api_upload.py +++ b/src/core/upload/sub2api_upload.py @@ -10,8 +10,8 @@ from typing import List, Tuple, Optional from curl_cffi import requests as cffi_requests -from ..database.session import get_db -from ..database.models import Account +from ...database.session import get_db +from ...database.models import Account logger = logging.getLogger(__name__) diff --git a/src/core/team_manager.py b/src/core/upload/team_manager_upload.py similarity index 97% rename from src/core/team_manager.py rename to src/core/upload/team_manager_upload.py index b51b5fe..267e2a2 100644 --- a/src/core/team_manager.py +++ b/src/core/upload/team_manager_upload.py @@ -9,9 +9,9 @@ from datetime import datetime from curl_cffi import requests as cffi_requests -from ..database.session import get_db -from ..database.models import Account -from ..config.settings import get_settings +from ...database.session import get_db +from ...database.models import Account +from ...config.settings import get_settings logger = logging.getLogger(__name__) diff --git a/src/services/__init__.py b/src/services/__init__.py index 7718a09..816d60b 100644 --- a/src/services/__init__.py +++ b/src/services/__init__.py @@ -12,13 +12,13 @@ from .base import ( ) from .tempmail import TempmailService from .outlook import OutlookService -from .custom_domain import CustomDomainEmailService +from .moe_mail import MeoMailEmailService from .temp_mail import TempMailService # 注册服务 EmailServiceFactory.register(EmailServiceType.TEMPMAIL, TempmailService) EmailServiceFactory.register(EmailServiceType.OUTLOOK, OutlookService) -EmailServiceFactory.register(EmailServiceType.CUSTOM_DOMAIN, CustomDomainEmailService) +EmailServiceFactory.register(EmailServiceType.CUSTOM_DOMAIN, MeoMailEmailService) EmailServiceFactory.register(EmailServiceType.TEMP_MAIL, TempMailService) # 导出 Outlook 模块的额外内容 @@ -48,7 +48,7 @@ __all__ = [ # 服务类 'TempmailService', 'OutlookService', - 'CustomDomainEmailService', + 'MeoMailEmailService', 'TempMailService', # Outlook 模块 'ProviderType', diff --git a/src/services/custom_domain.py b/src/services/moe_mail.py similarity index 99% rename from src/services/custom_domain.py rename to src/services/moe_mail.py index 816447f..d5715a0 100644 --- a/src/services/custom_domain.py +++ b/src/services/moe_mail.py @@ -18,7 +18,7 @@ from ..config.constants import OTP_CODE_PATTERN logger = logging.getLogger(__name__) -class CustomDomainEmailService(BaseEmailService): +class MeoMailEmailService(BaseEmailService): """ 自定义域名邮箱服务 基于 REST API 接口 diff --git a/src/services/outlook_legacy.py b/src/services/outlook_legacy_mail.py similarity index 100% rename from src/services/outlook_legacy.py rename to src/services/outlook_legacy_mail.py diff --git a/src/web/routes/__init__.py b/src/web/routes/__init__.py index cffe794..7748775 100644 --- a/src/web/routes/__init__.py +++ b/src/web/routes/__init__.py @@ -7,11 +7,11 @@ from fastapi import APIRouter from .accounts import router as accounts_router from .registration import router as registration_router from .settings import router as settings_router -from .email_services import router as email_services_router +from .email import router as email_services_router from .payment import router as payment_router -from .cpa_services import router as cpa_services_router -from .sub2api_services import router as sub2api_services_router -from .tm_services import router as tm_services_router +from .upload.cpa_services import router as cpa_services_router +from .upload.sub2api_services import router as sub2api_services_router +from .upload.tm_services import router as tm_services_router api_router = APIRouter() diff --git a/src/web/routes/email_services.py b/src/web/routes/email.py similarity index 100% rename from src/web/routes/email_services.py rename to src/web/routes/email.py diff --git a/src/web/routes/payment.py b/src/web/routes/payment.py index 049946d..b8210f1 100644 --- a/src/web/routes/payment.py +++ b/src/web/routes/payment.py @@ -14,13 +14,13 @@ from ...database.models import Account from ...database import crud from ...config.settings import get_settings from .accounts import resolve_account_ids -from ...core.payment import ( +from ...core.openai.payment import ( generate_plus_link, generate_team_link, open_url_incognito, check_subscription_status, ) -from ...core.team_manager import ( +from ...core.upload.team_manager_upload import ( upload_to_team_manager, batch_upload_to_team_manager, ) diff --git a/src/web/routes/settings.py b/src/web/routes/settings.py index 63bc107..9b7f47b 100644 --- a/src/web/routes/settings.py +++ b/src/web/routes/settings.py @@ -3,14 +3,15 @@ """ import logging -from typing import Optional, Dict, Any, List +import os +from typing import Optional from fastapi import APIRouter, HTTPException from pydantic import BaseModel +from ...config.settings import get_settings, update_settings from ...database import crud from ...database.session import get_db -from ...config.settings import get_settings, update_settings logger = logging.getLogger(__name__) router = APIRouter() @@ -289,6 +290,7 @@ async def backup_database(): raise HTTPException(status_code=404, detail="数据库文件不存在") # 创建备份目录 + from fastapi import Path backup_dir = Path(db_path).parent / "backups" backup_dir.mkdir(exist_ok=True) diff --git a/src/web/routes/upload/__init__.py b/src/web/routes/upload/__init__.py new file mode 100644 index 0000000..1f776fc --- /dev/null +++ b/src/web/routes/upload/__init__.py @@ -0,0 +1,2 @@ +#!/usr/bin/env python3 +# -*- coding: utf-8 -*- \ No newline at end of file diff --git a/src/web/routes/cpa_services.py b/src/web/routes/upload/cpa_services.py similarity index 97% rename from src/web/routes/cpa_services.py rename to src/web/routes/upload/cpa_services.py index cc80375..f98ec2f 100644 --- a/src/web/routes/cpa_services.py +++ b/src/web/routes/upload/cpa_services.py @@ -6,9 +6,9 @@ from typing import List, Optional from fastapi import APIRouter, HTTPException from pydantic import BaseModel -from ...database import crud -from ...database.session import get_db -from ...core.cpa_upload import test_cpa_connection +from ....database import crud +from ....database.session import get_db +from ....core.upload.cpa_upload import test_cpa_connection router = APIRouter() diff --git a/src/web/routes/sub2api_services.py b/src/web/routes/upload/sub2api_services.py similarity index 97% rename from src/web/routes/sub2api_services.py rename to src/web/routes/upload/sub2api_services.py index d682665..ddd7759 100644 --- a/src/web/routes/sub2api_services.py +++ b/src/web/routes/upload/sub2api_services.py @@ -6,9 +6,9 @@ from typing import List, Optional from fastapi import APIRouter, HTTPException from pydantic import BaseModel -from ...database import crud -from ...database.session import get_db -from ...core.sub2api_upload import test_sub2api_connection, batch_upload_to_sub2api +from ....database import crud +from ....database.session import get_db +from ....core.upload.sub2api_upload import test_sub2api_connection, batch_upload_to_sub2api router = APIRouter() diff --git a/src/web/routes/tm_services.py b/src/web/routes/upload/tm_services.py similarity index 97% rename from src/web/routes/tm_services.py rename to src/web/routes/upload/tm_services.py index b3c64b7..b363139 100644 --- a/src/web/routes/tm_services.py +++ b/src/web/routes/upload/tm_services.py @@ -6,9 +6,9 @@ from typing import List, Optional from fastapi import APIRouter, HTTPException from pydantic import BaseModel -from ...database import crud -from ...database.session import get_db -from ...core.team_manager import test_team_manager_connection +from ....database import crud +from ....database.session import get_db +from ....core.upload.team_manager_upload import test_team_manager_connection router = APIRouter() diff --git a/uv.lock b/uv.lock index bf0945e..9715718 100644 --- a/uv.lock +++ b/uv.lock @@ -164,6 +164,7 @@ dependencies = [ { name = "curl-cffi" }, { name = "fastapi" }, { name = "jinja2" }, + { name = "path" }, { name = "psycopg", extra = ["binary"] }, { name = "pydantic" }, { name = "pydantic-settings" }, @@ -194,6 +195,7 @@ requires-dist = [ { name = "fastapi", specifier = ">=0.100.0" }, { name = "httpx", marker = "extra == 'dev'", specifier = ">=0.24.0" }, { name = "jinja2", specifier = ">=3.1.0" }, + { name = "path", specifier = ">=17.1.1" }, { name = "playwright", marker = "extra == 'payment'", specifier = ">=1.40.0" }, { name = "psycopg", extras = ["binary"], specifier = ">=3.1.18" }, { name = "pydantic", specifier = ">=2.0.0" }, @@ -502,6 +504,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/b7/b9/c538f279a4e237a006a2c98387d081e9eb060d203d8ed34467cc0f0b9b53/packaging-26.0-py3-none-any.whl", hash = "sha256:b36f1fef9334a5588b4166f8bcd26a14e521f2b55e6b9de3aaa80d3ff7a37529", size = 74366, upload-time = "2026-01-21T20:50:37.788Z" }, ] +[[package]] +name = "path" +version = "17.1.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/dd/52/a7bdd5ef8488977d354b7915d1e75009bebbd04f73eff14e52372d5e9435/path-17.1.1.tar.gz", hash = "sha256:2dfcbfec8b4d960f3469c52acf133113c2a8bf12ac7b98d629fa91af87248d42", size = 50528, upload-time = "2025-07-27T20:40:23.79Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7c/50/11c9ee1ede64b45d687fd36eb8768dafc57afc78b4d83396920cfd69ed30/path-17.1.1-py3-none-any.whl", hash = "sha256:ec7e136df29172e5030dd07e037d55f676bdb29d15bfa09b80da29d07d3b9303", size = 23936, upload-time = "2025-07-27T20:40:22.453Z" }, +] + [[package]] name = "pefile" version = "2024.8.26"