chore: 基线提交(重构前快照)

重构前保存现有 apps/ 结构基线,供后续各阶段回滚。

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
Claude
2026-08-07 09:43:18 +08:00
co-authored by Claude
commit dbcce79536
112 changed files with 9677 additions and 0 deletions
+104
View File
@@ -0,0 +1,104 @@
import os
from dotenv import load_dotenv
def _load_env_file():
"""加载 .env 配置文件"""
root_path = os.path.abspath(os.path.dirname(os.path.dirname(__file__)))
env_path = os.path.join(root_path, '.env')
if os.path.exists(env_path):
load_dotenv(env_path)
return True
return False
# 在任何 config 子模块被 import 之前加载 .env
_load_env_file()
# ============================================================
# 重新导出所有子模块配置(统一入口)
# ============================================================
# 应用基础配置
from config.app import (
FASTAPI_NAME, FASTAPI_VERSION, FASTAPI_HOST, FASTAPI_PORT,
FASTAPI_APP, FASTAPI_ENV, FASTAPI_DEBUG, FASTAPI_DEMO,
FASTAPI_ROOT_PATH, FASTAPI_TEMPLATE_FOLDER, FASTAPI_STATIC_FOLDER,
FASTAPI_UPLOAD_DIR, FASTAPI_IMAGE_PATH, FASTAPI_TEMP_PATH, FASTAPI_IMAGE_URL,
TRUSTED_PROXY_COUNT,
)
# 数据库配置
from config.database import (
DB_DRIVER, DB_HOST, DB_PORT, DB_DATABASE, DB_USERNAME, DB_PASSWORD,
DB_PREFIX, DB_DEBUG, DB_POOL_SIZE, DB_MAX_OVERFLOW, DB_POOL_RECYCLE,
DB_POOL_TIMEOUT, DB_CONNECT_TIMEOUT, SQLALCHEMY_MYSQL_URL,
SQLALCHEMY_POSTGRESQL_URL, SQLALCHEMY_SQLITE_URL,
)
# Redis 缓存配置
from config.redis import (
REDIS_HOST, REDIS_PORT, REDIS_PASSWORD, REDIS_INDEX,
REDIS_AUTH, REDIS_DECODE_RESPONSES,
)
# JWT 认证配置
from config.auth import (
JWT_SALT, JWT_EXPIRE_MINUTES,
LOGIN_FAIL_MAX, LOGIN_LOCK_SECONDS,
)
# 验证码配置
from config.captcha import (
CAPTCHA_LENGTH, CAPTCHA_EXPIRE, CAPTCHA_RATE_LIMIT, CAPTCHA_RATE_WINDOW,
CAPTCHA_CHARS, CAPTCHA_FONT_PATH, CAPTCHA_IMAGE_WIDTH, CAPTCHA_IMAGE_HEIGHT,
CAPTCHA_FONT_SIZE, CAPTCHA_NOISE_LINES, CAPTCHA_NOISE_DOTS, CAPTCHA_BYPASS_CODE,
)
# 邮件配置
from config.email import (
MAIL_MAILER, MAIL_SERVER, MAIL_PORT, MAIL_USE_SSL,
MAIL_USERNAME, MAIL_PASSWORD, MAIL_ENCRYPTION,
MAIL_FROM_NAME, MAIL_FROM_ADDRESS,
)
# 短信配置
from config.sms import (
SMS_URL, SMS_API_KEY, SMS_SIGN, SMS_TEMPLATE_ID,
)
__all__ = [
# 应用基础配置
'FASTAPI_NAME', 'FASTAPI_VERSION', 'FASTAPI_HOST', 'FASTAPI_PORT',
'FASTAPI_APP', 'FASTAPI_ENV', 'FASTAPI_DEBUG', 'FASTAPI_DEMO',
'FASTAPI_ROOT_PATH', 'FASTAPI_TEMPLATE_FOLDER', 'FASTAPI_STATIC_FOLDER',
'FASTAPI_UPLOAD_DIR', 'FASTAPI_IMAGE_PATH', 'FASTAPI_TEMP_PATH', 'FASTAPI_IMAGE_URL',
'TRUSTED_PROXY_COUNT',
# 数据库配置
'DB_DRIVER', 'DB_HOST', 'DB_PORT', 'DB_DATABASE', 'DB_USERNAME', 'DB_PASSWORD',
'DB_PREFIX', 'DB_DEBUG', 'DB_POOL_SIZE', 'DB_MAX_OVERFLOW', 'DB_POOL_RECYCLE',
'DB_POOL_TIMEOUT', 'DB_CONNECT_TIMEOUT', 'SQLALCHEMY_MYSQL_URL',
'SQLALCHEMY_POSTGRESQL_URL', 'SQLALCHEMY_SQLITE_URL',
# Redis 配置
'REDIS_HOST', 'REDIS_PORT', 'REDIS_PASSWORD', 'REDIS_INDEX',
'REDIS_AUTH', 'REDIS_DECODE_RESPONSES',
# JWT 认证配置
'JWT_SALT', 'JWT_EXPIRE_MINUTES',
'LOGIN_FAIL_MAX', 'LOGIN_LOCK_SECONDS',
# 验证码配置
'CAPTCHA_LENGTH', 'CAPTCHA_EXPIRE', 'CAPTCHA_RATE_LIMIT', 'CAPTCHA_RATE_WINDOW',
'CAPTCHA_CHARS', 'CAPTCHA_FONT_PATH', 'CAPTCHA_IMAGE_WIDTH', 'CAPTCHA_IMAGE_HEIGHT',
'CAPTCHA_FONT_SIZE', 'CAPTCHA_NOISE_LINES', 'CAPTCHA_NOISE_DOTS', 'CAPTCHA_BYPASS_CODE',
# 邮件配置
'MAIL_MAILER', 'MAIL_SERVER', 'MAIL_PORT', 'MAIL_USE_SSL',
'MAIL_USERNAME', 'MAIL_PASSWORD', 'MAIL_ENCRYPTION',
'MAIL_FROM_NAME', 'MAIL_FROM_ADDRESS',
# 短信配置
'SMS_URL', 'SMS_API_KEY', 'SMS_SIGN', 'SMS_TEMPLATE_ID',
]
+49
View File
@@ -0,0 +1,49 @@
import logging
import os
_logger = logging.getLogger(__name__)
# 应用名称
FASTAPI_NAME = os.getenv('FASTAPI_NAME', 'FastAPI+EleVue旗舰版')
# 应用版本
FASTAPI_VERSION = os.getenv('FASTAPI_VERSION', 'v2.8.0')
# 应用运行地址
FASTAPI_HOST = os.getenv('FASTAPI_HOST', '127.0.0.1')
# 应用运行端口
FASTAPI_PORT = os.getenv('FASTAPI_PORT', 8031)
# 应用启动文件
FASTAPI_APP = os.getenv('FASTAPI_APP', 'main.py')
# 应用环境变量
FASTAPI_ENV = os.getenv('FASTAPI_ENV', 'development')
# 是否调试模式
FASTAPI_DEBUG = (os.getenv('FASTAPI_DEBUG', 'False') == 'True')
# 是否演示模式
FASTAPI_DEMO = (os.getenv('FASTAPI_DEMO', 'False') == 'True')
# 应用根目录
FASTAPI_ROOT_PATH = os.path.abspath(os.path.dirname(os.path.dirname(os.path.dirname(__file__))))
# 应用模板路径
FASTAPI_TEMPLATE_FOLDER = os.path.join(FASTAPI_ROOT_PATH, 'templates')
# 应用静态资源路径
FASTAPI_STATIC_FOLDER = os.path.join(FASTAPI_ROOT_PATH, 'static')
# 应用文件存储路径
FASTAPI_UPLOAD_DIR = os.getenv('FASTAPI_UPLOAD_DIR', os.path.join(FASTAPI_ROOT_PATH, 'uploads'))
# 正式图片路径
FASTAPI_IMAGE_PATH = os.path.join(FASTAPI_UPLOAD_DIR, 'images')
# 临时文件路径
FASTAPI_TEMP_PATH = os.path.join(FASTAPI_UPLOAD_DIR, 'temp')
# 应用图片域名
FASTAPI_IMAGE_URL = os.getenv('FASTAPI_IMAGE_URL', '')
# CORS允许的源(逗号分隔),未配置则允许所有源但不携带凭证
CORS_ALLOWED_ORIGINS = os.getenv('CORS_ALLOWED_ORIGINS', '')
# 可信代理层数(0=不信任X-Forwarded-For,1=一层反向代理,2=两层…)
# 仅当应用部署在Nginx等反向代理后才应设置为>=1
TRUSTED_PROXY_COUNT = int(os.getenv('TRUSTED_PROXY_COUNT', '0'))
# 允许上传的文件扩展名(逗号分隔,带点号)
UPLOAD_ALLOWED_EXTS = os.getenv('UPLOAD_ALLOWED_EXTS', '.jpg,.jpeg,.png,.gif,.bmp,.webp,.svg,.ico,.txt,.pdf,.doc,.docx,.xls,.xlsx,.ppt,.pptx,.mp3,.mp4,.zip,.rar,.7z')
# 上传文件大小上限(MB)
UPLOAD_MAX_SIZE_MB = int(os.getenv('UPLOAD_MAX_SIZE_MB', '10'))
+12
View File
@@ -0,0 +1,12 @@
import os
# JWT签名密钥(必须通过环境变量设置,不能使用默认值上线)
JWT_SALT = os.getenv('JWT_SALT', '')
# JWT令牌过期时间(分钟)
JWT_EXPIRE_MINUTES = int(os.getenv('JWT_EXPIRE_MINUTES', '20'))
# 登录防暴力破解配置
# 登录失败次数上限(超过后锁定账户)
LOGIN_FAIL_MAX = int(os.getenv('LOGIN_FAIL_MAX', '5'))
# 登录锁定时间(秒)
LOGIN_LOCK_SECONDS = int(os.getenv('LOGIN_LOCK_SECONDS', '300'))
+26
View File
@@ -0,0 +1,26 @@
import os
# 验证码字符长度
CAPTCHA_LENGTH = int(os.getenv('CAPTCHA_LENGTH', '6'))
# 验证码过期时间(秒)
CAPTCHA_EXPIRE = int(os.getenv('CAPTCHA_EXPIRE', '300'))
# 验证码防刷窗口期(秒)
CAPTCHA_RATE_WINDOW = int(os.getenv('CAPTCHA_RATE_WINDOW', '60'))
# 验证码防刷上限(窗口期内最大获取次数)
CAPTCHA_RATE_LIMIT = int(os.getenv('CAPTCHA_RATE_LIMIT', '10'))
# 验证码字符集
CAPTCHA_CHARS = os.getenv('CAPTCHA_CHARS', 'ABCDEFGHJKLMNPQRSTUVWXYZ2346789')
# 验证码字体路径
CAPTCHA_FONT_PATH = os.getenv('CAPTCHA_FONT_PATH', 'static/fonts/Vera.ttf')
# 验证码图片宽度
CAPTCHA_IMAGE_WIDTH = int(os.getenv('CAPTCHA_IMAGE_WIDTH', '160'))
# 验证码图片高度
CAPTCHA_IMAGE_HEIGHT = int(os.getenv('CAPTCHA_IMAGE_HEIGHT', '50'))
# 验证码字体大小
CAPTCHA_FONT_SIZE = int(os.getenv('CAPTCHA_FONT_SIZE', '28'))
# 干扰线数量
CAPTCHA_NOISE_LINES = int(os.getenv('CAPTCHA_NOISE_LINES', '6'))
# 噪点数量
CAPTCHA_NOISE_DOTS = int(os.getenv('CAPTCHA_NOISE_DOTS', '30'))
# 万能验证码(仅 FASTAPI_DEMO=True 时生效,方便演示环境登录)
CAPTCHA_BYPASS_CODE = os.getenv('CAPTCHA_BYPASS_CODE', '618618')
+38
View File
@@ -0,0 +1,38 @@
import os
from urllib.parse import quote_plus
# 数据库驱动
DB_DRIVER = os.getenv('DB_DRIVER', 'mysql')
# 数据库地址
DB_HOST = os.getenv('DB_HOST', '127.0.0.1')
# 数据库端口
DB_PORT = int(os.getenv('DB_PORT', '3306'))
# 数据库名称
DB_DATABASE = os.getenv('DB_DATABASE', 'djangoadmin.fastapi.elevue')
# 数据库账号
DB_USERNAME = os.getenv('DB_USERNAME', 'root')
# 数据库密码
DB_PASSWORD = os.getenv('DB_PASSWORD', '')
# 数据表前缀
DB_PREFIX = os.getenv('DB_PREFIX', 'fastapi_')
# 是否开启调试模式
DB_DEBUG = (os.getenv('DB_DEBUG', 'True') == 'True')
# 连接池大小(每个 worker 保持的常驻连接数)
DB_POOL_SIZE = int(os.getenv('DB_POOL_SIZE', '20'))
# 连接池最大溢出(超出 pool_size 后允许临时创建的连接数)
DB_MAX_OVERFLOW = int(os.getenv('DB_MAX_OVERFLOW', '2'))
# 连接回收时间(秒),应小于 MySQL wait_timeout
DB_POOL_RECYCLE = int(os.getenv('DB_POOL_RECYCLE', '1800'))
# 获取连接超时(秒),池满且无可用连接时的等待时间
DB_POOL_TIMEOUT = int(os.getenv('DB_POOL_TIMEOUT', '15'))
# 连接建立超时(秒)
DB_CONNECT_TIMEOUT = int(os.getenv('DB_CONNECT_TIMEOUT', '60'))
# MySQL数据库链接
SQLALCHEMY_MYSQL_URL = 'mysql+pymysql://' + quote_plus(DB_USERNAME) + ':' + quote_plus(DB_PASSWORD) + '@' + DB_HOST + ':' + str(
DB_PORT) + '/' + DB_DATABASE + '?charset=utf8mb4'
# PostgreSQL数据库链接(预留扩展)
SQLALCHEMY_POSTGRESQL_URL = "postgresql://user:password@postgresserver/db"
# SQLite数据库链接(预留扩展)
SQLALCHEMY_SQLITE_URL = "sqlite:///./test.db"
+20
View File
@@ -0,0 +1,20 @@
import os
# 邮寄者
MAIL_MAILER = os.getenv('MAIL_MAILER', 'smtp')
# 邮件服务
MAIL_SERVER = os.getenv('MAIL_SERVER', 'smtp.163.com')
# 邮件端口
MAIL_PORT = os.getenv('MAIL_PORT', 465)
# 邮件SSL证书
MAIL_USE_SSL = (os.getenv('MAIL_USE_SSL', 'True') == 'True')
# 授权邮箱用户名
MAIL_USERNAME = os.getenv('MAIL_USERNAME', '')
# 授权邮箱授权码
MAIL_PASSWORD = os.getenv('MAIL_PASSWORD', '')
# 邮件加密串
MAIL_ENCRYPTION = os.getenv('MAIL_ENCRYPTION', '')
# 邮件发件人名称
MAIL_FROM_NAME = os.getenv('MAIL_FROM_NAME', '')
# 邮件发件人地址
MAIL_FROM_ADDRESS = os.getenv('MAIL_FROM_ADDRESS', '')
+14
View File
@@ -0,0 +1,14 @@
import os
# 缓存服务地址
REDIS_HOST = os.getenv('REDIS_HOST', '127.0.0.1')
# 缓存服务端口
REDIS_PORT = os.getenv('REDIS_PORT', 6379)
# 缓存服务密码
REDIS_PASSWORD = os.getenv('REDIS_PASSWORD', '')
# 缓存库索引
REDIS_INDEX = os.getenv('REDIS_INDEX', 0)
# AUTH 为 True 时需要进行用户认证
REDIS_AUTH = (os.getenv('REDIS_AUTH', 'True') == 'True')
# 是否对查询结果进行编码处理
REDIS_DECODE_RESPONSES = (os.getenv('REDIS_DECODE_RESPONSES', 'True') == 'True')
+10
View File
@@ -0,0 +1,10 @@
import os
# 短信服务地址
SMS_URL = os.getenv('SMS_URL', '')
# 短信服务API密钥
SMS_API_KEY = os.getenv('SMS_API_KEY', '')
# 短信签名
SMS_SIGN = os.getenv('SMS_SIGN', '')
# 短信模板ID
SMS_TEMPLATE_ID = os.getenv('SMS_TEMPLATE_ID', '')