#!/usr/bin/env python3 """ 修复管理员密码脚本(简化版) 直接使用 bcrypt 生成密码哈希 """ import bcrypt import sys from pathlib import Path # 添加项目路径 sys.path.insert(0, str(Path(__file__).parent)) try: from app.database import SessionLocal from app.models.admin import Admin from datetime import datetime def get_password_hash(password: str) -> str: """获取密码哈希""" salt = bcrypt.gensalt() hashed = bcrypt.hashpw(password.encode('utf-8'), salt) return hashed.decode('utf-8') def verify_password(plain_password: str, hashed_password: str) -> bool: """验证密码""" return bcrypt.checkpw(plain_password.encode('utf-8'), hashed_password.encode('utf-8')) def fix_admin_password(): """修复管理员密码""" db = SessionLocal() try: # 查找 admin 用户 admin = db.query(Admin).filter(Admin.username == "admin").first() if not admin: print("❌ 未找到 admin 用户,正在创建...") # 创建新的 admin 用户 admin = Admin( username="admin", password=get_password_hash("admin123"), real_name="系统管理员", role="super_admin", status=1, created_at=datetime.now(), updated_at=datetime.now() ) db.add(admin) db.commit() print("✅ 已创建 admin 用户,密码: admin123") else: print(f"✅ 找到 admin 用户 (ID: {admin.id})") # 验证当前密码是否正确 try: if verify_password("admin123", admin.password): print("✅ 当前密码已经是 admin123,无需修改") else: print("⚠️ 当前密码不正确,正在重置...") # 更新密码 admin.password = get_password_hash("admin123") admin.updated_at = datetime.now() db.commit() print("✅ 密码已重置为: admin123") except Exception as e: print(f"⚠️ 密码验证失败: {e},正在重置密码...") admin.password = get_password_hash("admin123") admin.updated_at = datetime.now() db.commit() print("✅ 密码已重置为: admin123") # 确保状态正常 if admin.status != 1: print("⚠️ 账号状态异常,正在修复...") admin.status = 1 admin.updated_at = datetime.now() db.commit() print("✅ 账号状态已修复") # 验证最终结果 admin = db.query(Admin).filter(Admin.username == "admin").first() if verify_password("admin123", admin.password): print("\n✅ 验证成功!可以使用以下信息登录:") print(f" 用户名: admin") print(f" 密码: admin123") print(f" 角色: {admin.role}") print(f" 状态: {'正常' if admin.status == 1 else '禁用'}") else: print("\n❌ 验证失败,请检查代码") except Exception as e: print(f"❌ 错误: {e}") import traceback traceback.print_exc() db.rollback() finally: db.close() if __name__ == "__main__": fix_admin_password() except ImportError as e: print(f"❌ 导入错误: {e}") print("\n请先安装依赖:") print("pip install sqlalchemy pymysql python-dotenv bcrypt") print("\n或者直接使用 SQL 语句更新:") print("UPDATE admins SET password = '$2b$12$KcnY3KZGYXfb3RzN7YNoYOaq5kOlrsaA4Pcjw4WCGaG3rYjgv0nhi' WHERE username = 'admin';")