init: EasyScreen 电子菜单系统

- server: FastAPI 后端(多屏管理、素材上传、节目编排、客户端注册/配置/心跳/崩溃上报、管理台托管)
- android: Java 客户端(minSdk 23,全屏图片/视频轮播、远程配置、开机自启、崩溃上报)
- web: React + Vite + antd 管理台(屏幕/素材/节目管理)
- 屏幕设备 ID 关联机制、gunicorn 生产部署脚本
This commit is contained in:
Tatta
2026-08-12 20:57:55 +08:00
commit 4e2775c8c3
58 changed files with 6451 additions and 0 deletions
+42
View File
@@ -0,0 +1,42 @@
"""应用配置:读取 settings.json,支持多数据源切换(不硬编码连接信息)。"""
import json
import os
from functools import lru_cache
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
DEFAULT_SETTINGS_PATH = os.path.join(os.path.dirname(BASE_DIR), "settings.json")
@lru_cache(maxsize=1)
def load_settings() -> dict:
path = os.environ.get("EASYSCREEN_SETTINGS", DEFAULT_SETTINGS_PATH)
with open(path, "r", encoding="utf-8") as f:
return json.load(f)
def get_active_db() -> dict:
settings = load_settings()
name = settings["active_db"]
return settings["databases"][name]
def get_database_url() -> str:
db = get_active_db()
if db["type"] == "sqlite":
return f"sqlite:///{os.path.join(os.path.dirname(BASE_DIR), db['path'])}"
if db["type"] == "mysql":
password = db.get("password", "")
auth = db["user"] if not password else f"{db['user']}:{password}"
return (
f"mysql+pymysql://{auth}@{db['host']}:{db['port']}/"
f"{db['database_name']}?charset={db.get('charset', 'utf8mb4')}"
)
raise ValueError(f"不支持的数据库类型: {db['type']}")
def get_server_config() -> dict:
return load_settings()["server"]
def get_admin_config() -> dict:
return load_settings()["admin"]