chore: 基线提交(重构前快照)
重构前保存现有 apps/ 结构基线,供后续各阶段回滚。 Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@@ -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',
|
||||
]
|
||||
@@ -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'))
|
||||
@@ -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'))
|
||||
@@ -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')
|
||||
@@ -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"
|
||||
@@ -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', '')
|
||||
@@ -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')
|
||||
@@ -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', '')
|
||||
Reference in New Issue
Block a user