""" 数据库初始化 + User 模型。 使用 SQLite(单文件),存放在 data/epeekit.db。 """ import secrets import uuid from datetime import datetime from pathlib import Path from sqlmodel import Field, Session, SQLModel, create_engine, select DATA_DIR = Path(__file__).parent.parent / "data" DATA_DIR.mkdir(exist_ok=True) DATABASE_URL = f"sqlite:///{DATA_DIR / 'epeekit.db'}" engine = create_engine(DATABASE_URL, echo=False) class User(SQLModel, table=True): id: str = Field(default_factory=lambda: uuid.uuid4().hex, primary_key=True) username: str = Field(index=True, unique=True) hashed_password: str display_name: str = "" is_admin: bool = False is_active: bool = True created_at: datetime = Field(default_factory=datetime.utcnow) def create_db_and_tables(): SQLModel.metadata.create_all(engine) def get_session(): with Session(engine) as session: yield session def ensure_default_admin(): """如果 users 表为空,创建默认管理员账号。""" import os from app.auth import hash_password with Session(engine) as session: user = session.exec(select(User).limit(1)).first() if user is not None: return password = os.getenv("ADMIN_DEFAULT_PASSWORD", "") if not password: password = secrets.token_urlsafe(12) print(f"\n{'='*50}") print(f" 默认管理员账号已创建") print(f" 用户名: admin") print(f" 密码: {password}") print(f" 请登录后尽快修改密码!") print(f"{'='*50}\n") admin = User( username="admin", hashed_password=hash_password(password), display_name="管理员", is_admin=True, ) session.add(admin) session.commit()