08ea5fbe98
添加用户管理视图、API和状态管理文件
116 lines
3.3 KiB
Python
116 lines
3.3 KiB
Python
import random
|
|
import string
|
|
from datetime import datetime, timedelta
|
|
from typing import Dict, Any
|
|
|
|
|
|
class DataGenerator:
|
|
"""数据生成器类"""
|
|
|
|
@staticmethod
|
|
def random_username(length: int = 8) -> str:
|
|
"""生成随机用户名"""
|
|
return "".join(random.choices(string.ascii_lowercase + string.digits, k=length))
|
|
|
|
@staticmethod
|
|
def random_password(length: int = 12) -> str:
|
|
"""生成随机密码"""
|
|
chars = string.ascii_letters + string.digits + "!@#$%^&*"
|
|
return "".join(random.choices(chars, k=length))
|
|
|
|
@staticmethod
|
|
def random_email() -> str:
|
|
"""生成随机邮箱"""
|
|
username = "".join(random.choices(string.ascii_lowercase + string.digits, k=8))
|
|
domains = ["gmail.com", "qq.com", "163.com", "outlook.com"]
|
|
domain = random.choice(domains)
|
|
return f"{username}@{domain}"
|
|
|
|
@staticmethod
|
|
def random_phone() -> str:
|
|
"""生成随机手机号"""
|
|
prefix = random.choice(["138", "139", "150", "151", "186", "188"])
|
|
suffix = "".join(random.choices(string.digits, k=8))
|
|
return f"{prefix}{suffix}"
|
|
|
|
@staticmethod
|
|
def random_date(start_date: datetime = None, end_date: datetime = None) -> datetime:
|
|
"""生成随机日期"""
|
|
if start_date is None:
|
|
start_date = datetime.now() - timedelta(days=365)
|
|
if end_date is None:
|
|
end_date = datetime.now()
|
|
|
|
time_between = end_date - start_date
|
|
days_between = time_between.days
|
|
random_days = random.randrange(days_between)
|
|
return start_date + timedelta(days=random_days)
|
|
|
|
@staticmethod
|
|
def generate_user_data(overrides: Dict[str, Any] = None) -> Dict[str, Any]:
|
|
"""生成用户数据
|
|
|
|
Args:
|
|
overrides: 覆盖的字段
|
|
|
|
Returns:
|
|
用户数据字典
|
|
"""
|
|
data = {
|
|
"username": DataGenerator.random_username(),
|
|
"password": DataGenerator.random_password(),
|
|
"email": DataGenerator.random_email(),
|
|
"phone": DataGenerator.random_phone(),
|
|
"status": "active",
|
|
}
|
|
|
|
if overrides:
|
|
data.update(overrides)
|
|
|
|
return data
|
|
|
|
@staticmethod
|
|
def generate_role_data(overrides: Dict[str, Any] = None) -> Dict[str, Any]:
|
|
"""生成角色数据
|
|
|
|
Args:
|
|
overrides: 覆盖的字段
|
|
|
|
Returns:
|
|
角色数据字典
|
|
"""
|
|
data = {
|
|
"role_name": f"test_role_{random.randint(1000, 9999)}",
|
|
"role_code": f"test_role_{random.randint(1000, 9999)}",
|
|
"description": "测试角色",
|
|
"status": 1,
|
|
}
|
|
|
|
if overrides:
|
|
data.update(overrides)
|
|
|
|
return data
|
|
|
|
@staticmethod
|
|
def generate_menu_data(overrides: Dict[str, Any] = None) -> Dict[str, Any]:
|
|
"""生成菜单数据
|
|
|
|
Args:
|
|
overrides: 覆盖的字段
|
|
|
|
Returns:
|
|
菜单数据字典
|
|
"""
|
|
data = {
|
|
"menu_name": f"test_menu_{random.randint(1000, 9999)}",
|
|
"menu_type": 1,
|
|
"path": f"/test/{random.randint(1000, 9999)}",
|
|
"icon": "test-icon",
|
|
"status": 0,
|
|
}
|
|
|
|
if overrides:
|
|
data.update(overrides)
|
|
|
|
return data
|