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
+37
View File
@@ -0,0 +1,37 @@
"""数据库连接与会话管理(SQLAlchemy 2.0)。"""
from sqlalchemy import create_engine, event
from sqlalchemy.orm import DeclarativeBase, sessionmaker
from .config import get_database_url
_database_url = get_database_url()
_engine = create_engine(
_database_url,
pool_pre_ping=True,
connect_args={"check_same_thread": False} if _database_url.startswith("sqlite") else {},
echo=False,
)
@event.listens_for(_engine, "connect")
def _enable_sqlite_fk(dbapi_connection, connection_record):
"""SQLite 默认关闭外键约束,需显式开启以支持 CASCADE。"""
if _database_url.startswith("sqlite"):
cursor = dbapi_connection.cursor()
cursor.execute("PRAGMA foreign_keys=ON")
cursor.close()
SessionLocal = sessionmaker(bind=_engine, autocommit=False, autoflush=False)
class Base(DeclarativeBase):
pass
def get_db():
db = SessionLocal()
try:
yield db
finally:
db.close()