From 94010c8c2b796cd9ea1ddc1c690421497dad2556 Mon Sep 17 00:00:00 2001 From: NoahLan <6995syu@163.com> Date: Tue, 13 Jan 2026 11:15:22 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=89=8D=E7=AB=AF=E6=B8=B2=E6=9F=93?= =?UTF-8?q?=E4=BB=A5=E5=8F=8A=20=E6=94=BE=E5=BC=80.env=E7=9A=84ignore?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 2 -- iti/.env | 40 +++++++++++++++++++++++++++++ iti/.env.dev | 17 ++++++++++++ iti/.env.prod | 7 +++++ iti/applications/routes/__init__.py | 6 ++++- iti/applications/routes/front.py | 22 ++++++++++++++++ iti/config.py | 19 ++++++++++++++ 7 files changed, 110 insertions(+), 3 deletions(-) create mode 100644 iti/.env create mode 100644 iti/.env.dev create mode 100644 iti/.env.prod create mode 100644 iti/applications/routes/front.py diff --git a/.gitignore b/.gitignore index a8747fe..7b7f60c 100644 --- a/.gitignore +++ b/.gitignore @@ -37,8 +37,6 @@ ENV/ # Flask 实例与本地配置 instance/ .flaskenv -.env -.env.* .envrc # 运行期与数据库文件(你的项目含 iti/runtime/iti-flask_dev.db) diff --git a/iti/.env b/iti/.env new file mode 100644 index 0000000..9c58d13 --- /dev/null +++ b/iti/.env @@ -0,0 +1,40 @@ +FLASK_ENV=dev +SECRET_KEY=iti-flask +JWT_SECRET_KEY=iti-flask +DATABASE_URL=sqlite:///runtime/iti-flask_dev.db + +# 前端相关 +# FRONTEND_ENABLED=False # 是否启用前端渲染 +# FRONTEND_PATH=dist # 前端文件所在位置,若static则无需填写 + +# ============================================ +# 文件存储 - 阿里云OSS +# ============================================ +# ALIYUN_OSS_ACCESS_KEY_ID=LTAI5t... +# ALIYUN_OSS_ACCESS_KEY_SECRET=your_access_key_secret +# ALIYUN_OSS_ENDPOINT=oss-cn-hangzhou.aliyuncs.com +# ALIYUN_OSS_BUCKET=your-bucket-name + +# ============================================ +# 文件存储 - 腾讯云COS +# ============================================ +# TENCENT_COS_SECRET_ID=AKIDxxx +# TENCENT_COS_SECRET_KEY=your_secret_key +# TENCENT_COS_REGION=ap-guangzhou +# TENCENT_COS_BUCKET=your-bucket-1234567890 + +# ============================================ +# 文件存储 - 七牛云Kodo +# ============================================ +# QINIU_KODO_ACCESS_KEY=your_access_key +# QINIU_KODO_SECRET_KEY=your_secret_key +# QINIU_KODO_BUCKET=your-bucket-name +# QINIU_KODO_DOMAIN=cdn.example.com + +# ============================================ +# 文件存储 - 华为云OBS +# ============================================ +# HUAWEI_OBS_ACCESS_KEY_ID=your_access_key_id +# HUAWEI_OBS_SECRET_ACCESS_KEY=your_secret_access_key +# HUAWEI_OBS_SERVER=obs.cn-north-4.myhuaweicloud.com +# HUAWEI_OBS_BUCKET=your-bucket-name \ No newline at end of file diff --git a/iti/.env.dev b/iti/.env.dev new file mode 100644 index 0000000..e56a452 --- /dev/null +++ b/iti/.env.dev @@ -0,0 +1,17 @@ +BASE_DIR=D:/Projects/iTi/iTi-Flask/iti +# +FLASK_ENV=dev +SECRET_KEY=iti-flask +JWT_SECRET_KEY=iti-flask +DATABASE_URL=sqlite:///${BASE_DIR}/runtime/iti-flask_dev.db +# 前端相关 +FRONTEND_ENABLED=False # 是否启用前端渲染 +FRONTEND_PATH=dist # 前端文件所在位置,若static则无需填写 + +# ============================================ +# 文件存储 - 阿里云OSS +# ============================================ +ALIYUN_OSS_ACCESS_KEY_ID=LTAI5t9cymUAWHVEo36yygaT +ALIYUN_OSS_ACCESS_KEY_SECRET=FaaUsxadRYyshbYeAV8ypZNYVOx3tE +ALIYUN_OSS_ENDPOINT=oss-cn-chengdu.aliyuncs.com +ALIYUN_OSS_BUCKET=maintaince-dev \ No newline at end of file diff --git a/iti/.env.prod b/iti/.env.prod new file mode 100644 index 0000000..b1d943e --- /dev/null +++ b/iti/.env.prod @@ -0,0 +1,7 @@ +FLASK_ENV=prod +SECRET_KEY=zhSYJn577LgxyWDuQboM9wX3j2BHEFUP +JWT_SECRET_KEY=8YD37VvM3WgdpmKNt7kVFNbKnya4hBRh +DATABASE_URL=sqlite:///runtime/iti-flask_dev.db +# 前端相关 +FRONTEND_ENABLED=False # 是否启用前端渲染 +FRONTEND_PATH=dist # 前端文件所在位置,若static则无需填写 \ No newline at end of file diff --git a/iti/applications/routes/__init__.py b/iti/applications/routes/__init__.py index 8921668..c644d98 100644 --- a/iti/applications/routes/__init__.py +++ b/iti/applications/routes/__init__.py @@ -1,11 +1,15 @@ from iti.applications.extensions import broadcast_execute from iti.applications.routes.sys import register_sys_bp from iti.applications.routes.index import bp as index_bp - +from iti.applications.routes.front import bp as frontend_bp def init_routes(app): # 蓝图注册 app.register_blueprint(index_bp) + # 前端路由注册(可选) + if app.config.get("FRONTEND_ENABLED", False): + app.register_blueprint(frontend_bp) + # 系统蓝图注册 register_sys_bp(app) diff --git a/iti/applications/routes/front.py b/iti/applications/routes/front.py new file mode 100644 index 0000000..e1c149d --- /dev/null +++ b/iti/applications/routes/front.py @@ -0,0 +1,22 @@ +from apiflask import APIBlueprint +from flask import send_from_directory, current_app +import os + +bp = APIBlueprint("front", __name__, tag="前端") + +def _get_frontend_path(): + return os.path.join(current_app.static_folder, current_app.config.get("FRONTEND_PATH", "")) + +@bp.get("/") +def index(): + """渲染前端 SPA 入口页面""" + return send_from_directory(_get_frontend_path(), "index.html") + +@bp.get('/') +def fallback(fallback): + """兜底: 避免history模式下的影响""" + frontend_path = _get_frontend_path() + if not os.path.exists(os.path.join(frontend_path, fallback)): + return send_from_directory(frontend_path, 'index.html') + else: + return send_from_directory(frontend_path, fallback) \ No newline at end of file diff --git a/iti/config.py b/iti/config.py index 4df184c..5659f23 100644 --- a/iti/config.py +++ b/iti/config.py @@ -6,6 +6,20 @@ import json # 项目根目录 BASE_DIR = os.path.abspath(os.path.dirname(__file__)) +def _get_bool_env(key: str, default: bool = False) -> bool: + """从环境变量获取布尔值 + + Args: + key: 环境变量名 + default: 默认值 + + Returns: + 布尔值 + """ + value = os.getenv(key) + if value is None: + return default + return value.lower() in ('true', '1', 'yes', 'on') def _load_env_file(): """加载 .env 文件(模块级别调用)""" @@ -177,6 +191,11 @@ class BaseConfig: }, } + # 是否启用前端渲染 + FRONTEND_ENABLED = _get_bool_env("FRONTEND_ENABLED", False) + # 前端页面文件路径 + FRONTEND_PATH = os.getenv("FRONTEND_PATH", "dist") + # 业务日志配置 SYSLOG_MAX_BODY_CHARS = 2048 SYSLOG_ITEMS_SAMPLE = 5