#!/usr/bin/env python3 """ 重置管理员密码脚本 用于解决密码哈希兼容性问题 """ import sys import os # 添加项目根目录到Python路径 sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) # 尝试加载.env文件(在导入app之前,确保环境变量生效) try: from dotenv import load_dotenv env_loaded = load_dotenv() if env_loaded: print("成功加载.env文件") else: print("未找到或无法加载.env文件,将使用默认配置") except ImportError: print("python-dotenv未安装,跳过.env文件加载") from app import create_app, db from app.models.admin import Admin from werkzeug.security import generate_password_hash def reset_admin_password(username='admin', new_password='admin123'): """重置管理员密码""" # 检测环境配置 config_name = os.environ.get('FLASK_CONFIG', 'production') # 检查数据库配置 database_url = os.environ.get('DATABASE_URL', '') if database_url: print(f"使用数据库: {database_url.split('@')[-1] if '@' in database_url else database_url[:50]}...") else: print("警告: 未设置 DATABASE_URL 环境变量,将使用默认配置") # 使用生产环境配置 app = create_app(config_name) with app.app_context(): # 查找管理员用户(排除已删除的) admin = Admin.query.filter_by(username=username, is_deleted=0).first() if not admin: print(f"错误: 用户 '{username}' 不存在或已被删除") return False try: # 重新设置密码(使用新格式) admin.set_password(new_password) db.session.commit() print(f"成功: 用户 '{username}' 的密码已重置为: {new_password}") print(f"新的密码哈希格式: {admin.password_hash[:50]}...") return True except Exception as e: db.session.rollback() print(f"错误: 重置密码失败 - {str(e)}") import traceback traceback.print_exc() return False if __name__ == '__main__': # 支持命令行参数或交互式输入 if len(sys.argv) > 1: # 命令行参数方式 username = sys.argv[1] new_password = sys.argv[2] if len(sys.argv) > 2 else 'admin123' else: # 交互式输入方式 username = input("请输入要重置的用户名 (默认: admin): ").strip() or 'admin' new_password = input("请输入新密码 (默认: admin123): ").strip() or 'admin123' print(f"正在重置用户 '{username}' 的密码...") success = reset_admin_password(username, new_password) if success: print("密码重置完成!现在可以使用新密码登录了。") else: print("密码重置失败,请检查错误信息。") sys.exit(0 if success else 1)