186 lines
6.4 KiB
Python
186 lines
6.4 KiB
Python
#!/usr/bin/env python3
|
||
"""
|
||
创建测试用户(简化版)
|
||
直接使用预设的密码哈希值
|
||
"""
|
||
import asyncio
|
||
import sys
|
||
import os
|
||
from sqlalchemy import text
|
||
from sqlalchemy.ext.asyncio import create_async_engine
|
||
|
||
# 添加项目根目录到路径
|
||
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
|
||
|
||
from app.config import settings
|
||
|
||
# 使用预设的bcrypt哈希值(密码: password123)
|
||
# 这是通过 bcrypt.hashpw(b'password123', bcrypt.gensalt()).decode() 生成的
|
||
PASSWORD_HASH = "$2b$12$LQv3c1yqBWVHxkd0LHAkCOYz6TtxMQJqhN8/LewdBPj8dJJC1V2bS"
|
||
|
||
async def create_test_users():
|
||
"""创建测试用户"""
|
||
print("="*60)
|
||
print("创建测试用户并设置实体关联(简化版)")
|
||
print("="*60)
|
||
|
||
# 创建数据库引擎
|
||
engine = create_async_engine(
|
||
settings.DATABASE_URL,
|
||
echo=False,
|
||
future=True,
|
||
)
|
||
|
||
async with engine.connect() as conn:
|
||
try:
|
||
# 1. 创建主播测试用户
|
||
print("\n1. 创建主播测试用户...")
|
||
|
||
# 主播用户1
|
||
await conn.execute(text("""
|
||
INSERT INTO sys_user (
|
||
username, password, full_name, email,
|
||
is_active, is_superuser, created_at, updated_at,
|
||
entity_id, entity_type
|
||
)
|
||
VALUES (
|
||
'streamer1', :password, '测试主播1', 'streamer1@test.com',
|
||
true, false, now(), now(),
|
||
'streamer_TEST_001', 'streamer'
|
||
)
|
||
ON CONFLICT (username) DO UPDATE
|
||
SET password = EXCLUDED.password,
|
||
entity_id = EXCLUDED.entity_id,
|
||
entity_type = EXCLUDED.entity_type,
|
||
updated_at = now();
|
||
"""), {"password": PASSWORD_HASH})
|
||
|
||
print(" ✅ 主播用户 streamer1 已创建/更新")
|
||
|
||
# 主播用户2
|
||
await conn.execute(text("""
|
||
INSERT INTO sys_user (
|
||
username, password, full_name, email,
|
||
is_active, is_superuser, created_at, updated_at,
|
||
entity_id, entity_type
|
||
)
|
||
VALUES (
|
||
'streamer2', :password, '测试主播2', 'streamer2@test.com',
|
||
true, false, now(), now(),
|
||
'streamer_TEST_002', 'streamer'
|
||
)
|
||
ON CONFLICT (username) DO UPDATE
|
||
SET password = EXCLUDED.password,
|
||
entity_id = EXCLUDED.entity_id,
|
||
entity_type = EXCLUDED.entity_type,
|
||
updated_at = now();
|
||
"""), {"password": PASSWORD_HASH})
|
||
|
||
print(" ✅ 主播用户 streamer2 已创建/更新")
|
||
|
||
# 2. 创建MCN测试用户
|
||
print("\n2. 创建MCN测试用户...")
|
||
|
||
await conn.execute(text("""
|
||
INSERT INTO sys_user (
|
||
username, password, full_name, email,
|
||
is_active, is_superuser, created_at, updated_at,
|
||
entity_id, entity_type
|
||
)
|
||
VALUES (
|
||
'mcn_admin', :password, 'MCN管理员', 'mcn_admin@test.com',
|
||
true, false, now(), now(),
|
||
'mcn_TEST_001', 'mcn'
|
||
)
|
||
ON CONFLICT (username) DO UPDATE
|
||
SET password = EXCLUDED.password,
|
||
entity_id = EXCLUDED.entity_id,
|
||
entity_type = EXCLUDED.entity_type,
|
||
updated_at = now();
|
||
"""), {"password": PASSWORD_HASH})
|
||
|
||
print(" ✅ MCN用户 mcn_admin 已创建/更新")
|
||
|
||
# 3. 验证用户创建
|
||
print("\n3. 验证用户数据...")
|
||
|
||
result = await conn.execute(text("""
|
||
SELECT username, full_name, entity_id, entity_type, is_active
|
||
FROM sys_user
|
||
WHERE username IN ('streamer1', 'streamer2', 'mcn_admin')
|
||
ORDER BY username;
|
||
"""))
|
||
|
||
users = result.fetchall()
|
||
|
||
if users:
|
||
print(f" 共 {len(users)} 个测试用户:")
|
||
for user in users:
|
||
status = '✅ 活跃' if user[4] else '❌ 禁用'
|
||
print(f" - {user[0]} ({user[1]}): {user[2]} - {user[3]} - {status}")
|
||
else:
|
||
print(" ❌ 没有找到测试用户")
|
||
|
||
# 4. 检查streamer数据
|
||
print("\n4. 检查streamer数据...")
|
||
|
||
result = await conn.execute(text("""
|
||
SELECT COUNT(*) FROM streamer WHERE streamer_id IN ('streamer_TEST_001', 'streamer_TEST_002');
|
||
"""))
|
||
streamer_count = result.scalar()
|
||
|
||
if streamer_count > 0:
|
||
print(f" ✅ 找到 {streamer_count} 个streamer记录")
|
||
else:
|
||
print(" ⚠️ 未找到streamer记录")
|
||
|
||
# 提交事务
|
||
await conn.commit()
|
||
|
||
print("\n" + "="*60)
|
||
print("✅ 测试用户创建完成!")
|
||
print("="*60)
|
||
|
||
print("\n📝 测试用户信息:")
|
||
print(" 主播用户:")
|
||
print(" - 用户名: streamer1 / 密码: password123")
|
||
print(" - 用户名: streamer2 / 密码: password123")
|
||
print(" MCN用户:")
|
||
print(" - 用户名: mcn_admin / 密码: password123")
|
||
|
||
print("\n📝 使用方法:")
|
||
print(" 1. 访问前端页面: http://localhost:3000")
|
||
print(" 2. 使用上述用户名和密码登录")
|
||
print(" 3. 测试自动实体绑定功能")
|
||
|
||
return True
|
||
|
||
except Exception as e:
|
||
print(f"\n❌ 创建用户失败: {str(e)}")
|
||
import traceback
|
||
traceback.print_exc()
|
||
await conn.rollback()
|
||
return False
|
||
|
||
finally:
|
||
await engine.dispose()
|
||
|
||
async def main():
|
||
"""主函数"""
|
||
try:
|
||
success = await create_test_users()
|
||
if success:
|
||
print("\n✅ 所有操作已成功完成")
|
||
sys.exit(0)
|
||
else:
|
||
print("\n❌ 操作过程中出现问题")
|
||
sys.exit(1)
|
||
except Exception as e:
|
||
print(f"\n❌ 执行失败: {str(e)}")
|
||
import traceback
|
||
traceback.print_exc()
|
||
sys.exit(1)
|
||
|
||
if __name__ == "__main__":
|
||
asyncio.run(main())
|