#!/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) 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, nickname, email, status, 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, nickname = EXCLUDED.nickname, 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, nickname, email, status, 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, nickname = EXCLUDED.nickname, 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, nickname, email, status, 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, nickname = EXCLUDED.nickname, 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, nickname, entity_id, entity_type, status 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数据...") try: 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记录") except Exception as e: print(f" ⚠️ 无法查询streamer表(表不存在或无权限): {str(e)[:50]}") # 提交事务 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())