Files
ljwx-health/utils/batch_create_users.py
2025-09-09 22:13:47 +08:00

208 lines
7.0 KiB
Python
Executable File

#!/usr/bin/env python3
"""
批量创建sys_user的脚本
为1000个手表序列号创建对应的用户
"""
import mysql.connector
import random
from datetime import datetime, date
import sys
import hashlib
import json
def generate_password_hash(password, salt):
"""生成密码哈希值"""
return hashlib.md5((password + salt).encode()).hexdigest()
def generate_random_salt():
"""生成随机盐值"""
import string
return ''.join(random.choices(string.ascii_letters + string.digits, k=6))
def generate_user_data(serial_number, index):
"""生成单个用户的数据"""
# 生成随机生日(20-65岁)
birth_year = random.randint(1959, 2004)
birth_month = random.randint(1, 12)
birth_day = random.randint(1, 28) # 简化处理,避免月份天数问题
birthday = date(birth_year, birth_month, birth_day)
# 生成随机手机号
def random_phone():
return f"1{random.choice([3,4,5,6,7,8,9])}{random.randint(0,9):01d}{random.randint(10000000,99999999)}"
# 生成密码盐值和哈希
salt = generate_random_salt()
password = "123456" # 默认密码
password_hash = generate_password_hash(password, salt)
now = datetime.now()
# 生成唯一ID (雪花算法模拟)
user_id = 1939964806110937090 + index
return {
'id': user_id,
'userName': serial_number,
'password': password_hash,
'userCardNumber': f"{random.randint(100000000000000000, 999999999999999999)}", # 18位身份证号
'nickName': f"用户{serial_number[-6:]}",
'realName': f"测试用户{index:04d}",
'avatar': None,
'email': f"{serial_number.lower()}@test.com",
'phone': random_phone(),
'gender': random.choice(['0', '1', '2']), # 0保密 1男 2女
'status': '1', # 启用
'salt': salt,
'deviceSn': serial_number,
'customerId': 1,
'workingYears': random.randint(0, 40),
'orgId': 1939964806110937090,
'orgName': '租户名称 123',
'birthday': birthday,
'lastLoginTime': None,
'updatePasswordTime': None,
'createUser': 'system',
'createUserId': 1,
'createTime': now,
'updateUser': 'system',
'updateUserId': 1,
'updateTime': now,
'isDeleted': 0
}
def get_db_connection():
"""获取数据库连接"""
try:
connection = mysql.connector.connect(
host='127.0.0.1',
port=3306,
database='test',
user='root',
password='123456',
charset='utf8mb4',
autocommit=False
)
return connection
except mysql.connector.Error as e:
print(f"数据库连接失败: {e}")
return None
def insert_user(cursor, user_data):
"""插入单个用户"""
sql = """
INSERT INTO sys_user (
id, user_name, password, user_card_number, nick_name, real_name, avatar, email, phone,
gender, status, salt, device_sn, customer_id, working_years, org_id, org_name,
birthday, last_login_time, update_password_time, create_user, create_user_id, create_time,
update_user, update_user_id, update_time, is_deleted
) VALUES (
%(id)s, %(userName)s, %(password)s, %(userCardNumber)s, %(nickName)s, %(realName)s, %(avatar)s,
%(email)s, %(phone)s, %(gender)s, %(status)s, %(salt)s, %(deviceSn)s, %(customerId)s,
%(workingYears)s, %(orgId)s, %(orgName)s, %(birthday)s, %(lastLoginTime)s,
%(updatePasswordTime)s, %(createUser)s, %(createUserId)s, %(createTime)s,
%(updateUser)s, %(updateUserId)s, %(updateTime)s, %(isDeleted)s
)
"""
cursor.execute(sql, user_data)
def main():
"""主函数:批量创建1000个用户"""
print("开始批量创建1000个sys_user用户...")
print(f"手表序列号范围: CRFTQ23409000000 到 CRFTQ23409000999")
print(f"组织: org_id=1939964806110937090, org_name='租户名称 123'")
print("-" * 50)
# 获取数据库连接
connection = get_db_connection()
if not connection:
print("无法连接到数据库,脚本退出")
return False
success_count = 0
failed_count = 0
failed_users = []
try:
cursor = connection.cursor()
# 检查表是否存在
cursor.execute("SHOW TABLES LIKE 'sys_user'")
if not cursor.fetchone():
print("错误: sys_user表不存在")
return False
# 生成1000个用户
for i in range(1000):
serial_number = f"CRFTQ23409{i:06d}"
try:
# 检查用户是否已存在
cursor.execute("SELECT id FROM sys_user WHERE user_name = %s", (serial_number,))
if cursor.fetchone():
print(f"⚠ [{i+1:4d}/1000] {serial_number} - 用户已存在,跳过")
continue
# 生成用户数据
user_data = generate_user_data(serial_number, i)
# 插入用户
insert_user(cursor, user_data)
success_count += 1
print(f"✓ [{i+1:4d}/1000] {serial_number} - 创建成功")
# 每100个用户提交一次事务
if (i + 1) % 100 == 0:
connection.commit()
print(f"进度: {i+1}/1000 用户已处理 (成功: {success_count}, 失败: {failed_count})")
except mysql.connector.Error as e:
failed_count += 1
error_msg = str(e)
failed_users.append((serial_number, error_msg))
print(f"✗ [{i+1:4d}/1000] {serial_number} - 失败: {error_msg}")
# 最终提交
connection.commit()
except Exception as e:
print(f"脚本执行出错: {e}")
connection.rollback()
return False
finally:
cursor.close()
connection.close()
# 输出最终统计
print("\n" + "=" * 50)
print("批量创建用户完成!")
print(f"总计: 1000 个用户")
print(f"成功: {success_count} 个")
print(f"失败: {failed_count} 个")
# 输出失败的用户详情
if failed_users:
print("\n失败的用户:")
for username, error in failed_users[:10]: # 只显示前10个失败的
print(f" {username}: {error}")
if len(failed_users) > 10:
print(f" ... 还有 {len(failed_users) - 10} 个失败用户")
# 输出默认密码信息
print(f"\n默认密码: 123456")
print(f"组织信息: org_id=1939964806110937090, org_name='租户名称 123'")
return failed_count == 0
if __name__ == "__main__":
try:
success = main()
sys.exit(0 if success else 1)
except KeyboardInterrupt:
print("\n\n用户中断创建...")
sys.exit(1)
except Exception as e:
print(f"\n脚本执行出错: {e}")
sys.exit(1)