77from pydantic_settings import BaseSettings , SettingsConfigDict
88
99from backend .core .path_conf import BASE_PATH
10- import os
1110
1211
1312class Settings (BaseSettings ):
@@ -20,27 +19,8 @@ class Settings(BaseSettings):
2019 case_sensitive = True ,
2120 )
2221
23- # .env 环境
24- ENVIRONMENT : Literal ['dev' , 'pro' ]
25-
26- # .env 数据库
27- DATABASE_TYPE : Literal ['mysql' , 'postgresql' ]
28- DATABASE_HOST : str
29- DATABASE_PORT : int
30- DATABASE_USER : str
31- DATABASE_PASSWORD : str
32-
33- # .env Redis
34- REDIS_HOST : str
35- REDIS_PORT : int
36- REDIS_PASSWORD : str
37- REDIS_DATABASE : int
38-
39- # .env Token
40- TOKEN_SECRET_KEY : str # 密钥 secrets.token_urlsafe(32)
41-
42- # .env 操作日志加密密钥
43- OPERA_LOG_ENCRYPT_SECRET_KEY : str # 密钥 os.urandom(32), 需使用 bytes.hex() 方法转换为 str
22+ # .env 当前环境
23+ ENVIRONMENT : Literal ['dev' , 'prod' ]
4424
4525 # FastAPI
4626 FASTAPI_API_V1_PATH : str = '/api/v1'
@@ -52,15 +32,31 @@ class Settings(BaseSettings):
5232 FASTAPI_OPENAPI_URL : str | None = '/openapi'
5333 FASTAPI_STATIC_FILES : bool = True
5434
35+ # .env 数据库
36+ DATABASE_TYPE : Literal ['mysql' , 'postgresql' ]
37+ DATABASE_HOST : str
38+ DATABASE_PORT : int
39+ DATABASE_USER : str
40+ DATABASE_PASSWORD : str
41+
5542 # 数据库
5643 DATABASE_ECHO : bool | Literal ['debug' ] = False
5744 DATABASE_POOL_ECHO : bool | Literal ['debug' ] = False
5845 DATABASE_SCHEMA : str = 'fba'
5946 DATABASE_CHARSET : str = 'utf8mb4'
6047
48+ # .env Redis
49+ REDIS_HOST : str
50+ REDIS_PORT : int
51+ REDIS_PASSWORD : str
52+ REDIS_DATABASE : int
53+
6154 # Redis
6255 REDIS_TIMEOUT : int = 5
6356
57+ # .env Token
58+ TOKEN_SECRET_KEY : str # 密钥 secrets.token_urlsafe(32)
59+
6460 # Token
6561 TOKEN_ALGORITHM : str = 'HS256'
6662 TOKEN_EXPIRE_SECONDS : int = 60 * 60 * 24 # 1 天
@@ -90,7 +86,11 @@ class Settings(BaseSettings):
9086 COOKIE_REFRESH_TOKEN_KEY : str = 'fba_refresh_token'
9187 COOKIE_REFRESH_TOKEN_EXPIRE_SECONDS : int = 60 * 60 * 24 * 7 # 7 天
9288
93- # 数据权限配置
89+ # 验证码
90+ CAPTCHA_LOGIN_REDIS_PREFIX : str = 'fba:login:captcha'
91+ CAPTCHA_LOGIN_EXPIRE_SECONDS : int = 60 * 5 # 3 分钟
92+
93+ # 数据权限
9494 DATA_PERMISSION_MODELS : dict [str , str ] = { # 允许进行数据过滤的 SQLA 模型,它必须以模块字符串的方式定义
9595 '部门' : 'backend.app.admin.model.Dept' ,
9696 }
@@ -163,6 +163,9 @@ class Settings(BaseSettings):
163163 LOG_ACCESS_FILENAME : str = 'fba_access.log'
164164 LOG_ERROR_FILENAME : str = 'fba_error.log'
165165
166+ # .env 操作日志
167+ OPERA_LOG_ENCRYPT_SECRET_KEY : str # 密钥 os.urandom(32), 需使用 bytes.hex() 方法转换为 str
168+
166169 # 操作日志
167170 OPERA_LOG_PATH_EXCLUDE : list [str ] = [
168171 '/favicon.ico' ,
@@ -188,30 +191,12 @@ class Settings(BaseSettings):
188191 PLUGIN_PIP_INDEX_URL : str = 'https://mirrors.aliyun.com/pypi/simple/'
189192 PLUGIN_REDIS_PREFIX : str = 'fba:plugin'
190193
191- # App Admin
192- # .env OAuth2
193- OAUTH2_GITHUB_CLIENT_ID : str
194- OAUTH2_GITHUB_CLIENT_SECRET : str
195- OAUTH2_LINUX_DO_CLIENT_ID : str
196- OAUTH2_LINUX_DO_CLIENT_SECRET : str
194+ # I18n 配置
195+ I18N_DEFAULT_LANGUAGE : str = 'zh-CN'
197196
198- # OAuth2
199- OAUTH2_FRONTEND_REDIRECT_URI : str = 'http://localhost:5173/oauth2/callback'
200-
201- # 验证码
202- CAPTCHA_LOGIN_REDIS_PREFIX : str = 'fba:login:captcha'
203- CAPTCHA_LOGIN_EXPIRE_SECONDS : int = 60 * 5 # 3 分钟
204-
205- # 短信验证码
206- TENCENTCLOUD_SECRET_ID : str
207- TENCENTCLOUD_SECRET_KEY : str
208- SMS_LOGIN_REDIS_PREFIX : str = "fba:sms:login"
209- SMS_LOGIN_EXPIRE_SECONDS : int = 300 # 短信验证码有效期,5分钟
210- SMS_LOGIN_TEMPLATE_ID : str # 短信登录模板ID
211- SMS_SIGN_NAME : str # 短信签名
212- SMS_SDK_APP_ID : str # 短信应用ID
213-
214- # App Task
197+ ##################################################
198+ # [ App ] task
199+ ##################################################
215200 # .env Redis
216201 CELERY_BROKER_REDIS_DATABASE : int
217202
@@ -227,18 +212,47 @@ class Settings(BaseSettings):
227212 CELERY_REDIS_PREFIX : str = 'fba:celery'
228213 CELERY_TASK_MAX_RETRIES : int = 5
229214
230- # Plugin Code Generator
215+ ##################################################
216+ # [ Plugin ] code_generator
217+ ##################################################
231218 CODE_GENERATOR_DOWNLOAD_ZIP_FILENAME : str = 'fba_generator'
232219
220+ ##################################################
221+ # [ Plugin ] oauth2
222+ ##################################################
223+ # .env
224+ OAUTH2_GITHUB_CLIENT_ID : str
225+ OAUTH2_GITHUB_CLIENT_SECRET : str
226+ OAUTH2_LINUX_DO_CLIENT_ID : str
227+ OAUTH2_LINUX_DO_CLIENT_SECRET : str
228+
229+ # 基础配置
230+ OAUTH2_FRONTEND_REDIRECT_URI : str = 'http://localhost:5173/oauth2/callback'
231+
232+ ##################################################
233+ # [ Plugin ] email
234+ ##################################################
235+ # .env
236+ EMAIL_USERNAME : str
237+ EMAIL_PASSWORD : str
238+
239+ # 基础配置
240+ EMAIL_HOST : str = 'smtp.qq.com'
241+ EMAIL_PORT : int = 465
242+ EMAIL_SSL : bool = True
243+ EMAIL_CAPTCHA_REDIS_PREFIX : str = 'fba:email:captcha'
244+ EMAIL_CAPTCHA_EXPIRE_SECONDS : int = 60 * 3 # 3 分钟
245+
233246 @model_validator (mode = 'before' )
234247 @classmethod
235248 def check_env (cls , values : Any ) -> Any :
236249 """检查环境变量"""
237- if values .get ('ENVIRONMENT' ) == 'pro ' :
250+ if values .get ('ENVIRONMENT' ) == 'prod ' :
238251 # FastAPI
239252 values ['FASTAPI_OPENAPI_URL' ] = None
240253 values ['FASTAPI_STATIC_FILES' ] = False
241- # Task
254+
255+ # task
242256 values ['CELERY_BROKER' ] = 'rabbitmq'
243257
244258 return values
0 commit comments