Files
assist/create_admin_user.py

174 lines
6.6 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# -*- coding: utf-8 -*-
"""
创建或修复默认管理员用户
"""
import sys
import os
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
from src.core.database import db_manager
from src.core.models import User
from werkzeug.security import generate_password_hash, check_password_hash
from sqlalchemy import text, inspect
print("=" * 60)
print("创建/修复管理员用户")
print("=" * 60)
try:
with db_manager.get_session() as session:
# 检查表结构
inspector = inspect(db_manager.engine)
if 'users' not in inspector.get_table_names():
print("错误: users表不存在请先运行 python init_database.py")
sys.exit(1)
existing_columns = [col['name'] for col in inspector.get_columns('users')]
print(f"users表字段: {existing_columns}")
# 检查是否存在admin用户
admin_user = session.query(User).filter(User.username == 'admin').first()
if admin_user:
print(f"\n找到admin用户 (ID: {admin_user.id})")
print(f" 邮箱: {admin_user.email}")
print(f" 角色: {admin_user.role}")
print(f" 激活状态: {admin_user.is_active}")
# 验证密码
password_ok = check_password_hash(admin_user.password_hash, 'admin123')
print(f" 密码验证: {'正确' if password_ok else '错误'}")
if not password_ok:
print("\n密码不匹配,正在更新密码...")
admin_user.password_hash = generate_password_hash('admin123')
admin_user.is_active = True
if hasattr(admin_user, 'region'):
admin_user.region = None
session.commit()
print("密码已更新为: admin123")
if not admin_user.is_active:
print("用户未激活,正在激活...")
admin_user.is_active = True
session.commit()
print("用户已激活")
# 最终验证
test_password = check_password_hash(admin_user.password_hash, 'admin123')
if test_password and admin_user.is_active:
print("\n管理员用户已就绪!")
print(" 用户名: admin")
print(" 密码: admin123")
print(" 状态: 已激活")
else:
print("\n警告: 用户状态异常")
print(f" 密码正确: {test_password}")
print(f" 已激活: {admin_user.is_active}")
else:
print("\n未找到admin用户正在创建...")
# 准备密码哈希
password_hash = generate_password_hash('admin123')
# 检查表结构使用SQL直接插入避免字段不匹配
try:
# 先尝试使用模型创建
new_admin = User(
username='admin',
email='admin@tsp.com',
password_hash=password_hash,
role='admin',
is_active=True
)
if 'region' in existing_columns:
new_admin.region = None
session.add(new_admin)
session.commit()
print("使用模型创建成功")
except Exception as model_error:
print(f"模型创建失败: {model_error}")
print("尝试使用SQL直接插入...")
session.rollback()
# 使用SQL直接插入
insert_fields = ['username', 'email', 'password_hash', 'role']
insert_values = {
'username': 'admin',
'email': 'admin@tsp.com',
'password_hash': password_hash,
'role': 'admin'
}
if 'is_active' in existing_columns:
insert_fields.append('is_active')
insert_values['is_active'] = True
if 'region' in existing_columns:
insert_fields.append('region')
insert_values['region'] = None
fields_str = ', '.join(insert_fields)
values_str = ', '.join([f":{k}" for k in insert_fields])
sql = f"""
INSERT INTO users ({fields_str})
VALUES ({values_str})
"""
session.execute(text(sql), insert_values)
session.commit()
print("使用SQL创建成功")
# 验证创建结果
verify_user = session.query(User).filter(User.username == 'admin').first()
if verify_user:
test_password = check_password_hash(verify_user.password_hash, 'admin123')
print(f"\n验证结果:")
print(f" 用户ID: {verify_user.id}")
print(f" 密码正确: {test_password}")
print(f" 已激活: {verify_user.is_active}")
if test_password and verify_user.is_active:
print("\n管理员用户创建成功!")
print(" 用户名: admin")
print(" 密码: admin123")
else:
print("\n警告: 用户创建成功但状态异常")
# 创建其他示例用户
for username, email, password, role, region in [
('overseas_ops', 'overseas@tsp.com', 'ops123', 'overseas_ops', 'overseas'),
('domestic_ops', 'domestic@tsp.com', 'ops123', 'domestic_ops', 'domestic')
]:
ops_user = session.query(User).filter(User.username == username).first()
if not ops_user:
print(f"\n创建{username}用户...")
try:
new_user = User(
username=username,
email=email,
password_hash=generate_password_hash(password),
role=role,
is_active=True
)
if 'region' in existing_columns:
new_user.region = region
session.add(new_user)
session.commit()
print(f" {username}用户创建成功")
except Exception as e:
print(f" {username}用户创建失败: {e}")
session.rollback()
print("\n" + "=" * 60)
print("操作完成!")
print("=" * 60)
except Exception as e:
print(f"错误: {e}")
import traceback
traceback.print_exc()
sys.exit(1)