68 lines
1.8 KiB
Python
68 lines
1.8 KiB
Python
"""
|
||
数据库初始化 + 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()
|