用户系统
This commit is contained in:
67
art-agent/backend/app/db.py
Normal file
67
art-agent/backend/app/db.py
Normal file
@@ -0,0 +1,67 @@
|
||||
"""
|
||||
数据库初始化 + 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()
|
||||
Reference in New Issue
Block a user