feat(admin): 添加用户管理相关文件
添加用户管理视图、API和状态管理文件
This commit is contained in:
@@ -0,0 +1,115 @@
|
||||
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
|
||||
Reference in New Issue
Block a user