from pathlib import Path from datetime import datetime from chongming_worker import auto_bind_models from chongming_worker.runtime import create_workers as _create_workers from chongming_password import hash_password from .router import * auto_bind_models("auth") async def create_workers(session, config, count=1, worker_manager=None): from chongming_database import Database from .global_var import set_global_var from .models.auth import Users from sqlalchemy import select db_path = Path(config.get("data_dir", "./data")) / "auth.db" db = Database(db_path) await db.initialize() # 初始化管理员(多进程并发启动时必须幂等,避免 UNIQUE 约束冲突) from sqlalchemy.exc import IntegrityError async with db.get_session() as sess: select_stmt = select(Users) \ .where(Users.username == "admin") # type: ignore result = await sess.execute(select_stmt) user: Users | None = result.scalar_one_or_none() # 按用户名未命中时,再按邮箱兜底,避免历史数据中已存在同邮箱用户 if user is None: select_stmt = select(Users) \ .where(Users.email == "admin@example.com") # type: ignore result = await sess.execute(select_stmt) user = result.scalar_one_or_none() if user is None: user = Users( username="admin", hashed_password=hash_password("admin"), email="admin@example.com", created_at=datetime.now(), updated_at=datetime.now(), is_superuser=True ) sess.add(user) try: await sess.commit() except IntegrityError: # 其他并发进程已抢先创建 admin,当前进程忽略即可 await sess.rollback() set_global_var("db", db) return _create_workers(session, config, count, worker_manager) async def cleanup(worker_item: str): from .global_var import db if db is not None: await db.dispose() print(f"{worker_item} 清理完毕")