Files
FastapiAdmin/backend/tests/tools/random_tool.py
T
zhangtao 80263e98e1 feat: 重构前端项目结构并优化代码
refactor: 迁移前端资源文件至web目录
feat: 新增多种图标资源
style: 统一代码风格和格式化配置
docs: 更新README和文档说明
chore: 更新依赖和配置文件
fix: 修复部分类型定义和枚举
perf: 优化路由和组件加载逻辑
2026-05-01 01:01:17 +08:00

282 lines
7.9 KiB
Python

# -*- coding: utf-8 -*-
import string
import random
import datetime
from faker import Faker
from dateutil.relativedelta import relativedelta
class ContextPack:
def __init__(self):
self.faker = Faker(locale='zh_CN')
@property
def get_phone(self) -> int:
"""
:return: 随机生成手机号码
"""
phone = self.faker.phone_number()
return phone
@property
def get_id_number(self) -> int:
"""
:return: 随机生成身份证号码
"""
id_number = self.faker.ssn()
return id_number
@property
def get_female_name(self) -> str:
"""
:return: 女生姓名
"""
female_name = self.faker.name_male()
return female_name
@property
def get_male_name(self) -> str:
"""
:return: 男生姓名
"""
male_name = self.faker.name_female()
return male_name
@property
def get_email(self) -> str:
"""
:return: 生成邮箱
"""
email = self.faker.email()
return email
@property
def merchantSelfOperatedShop(self) -> int:
"""
:return: 商家端自营店铺ID
"""
SelfOperatedShop = 515
return SelfOperatedShop
@property
def get_secend_time(self)->datetime:
"""
计算当前时间: 年-月-日 时:分:秒:毫秒
:return:
"""
return datetime.datetime.now()
@property
def get_day_time(self)->str:
"""
计算当前时间: 年-月-日
:return:
"""
return datetime.datetime.now().strftime('%Y-%m-%d')
def generate_bank_card(self):
"""
生成随机银行卡号
"""
return self.faker.credit_card_number()
def generate_email(self):
"""
生成随机邮箱号
"""
return self.random_str(4) + self.faker.free_email()
@property
def generate_company(self):
"""
生成随机公司名称
"""
return self.faker.company_prefix() + self.random_str(5) + '测试' + self.faker.company_suffix()
@property
def generate_name(self):
"""
生成随机姓名
"""
return self.faker.name()
@property
def generate_unreal_phone(self):
"""
生成不存在的手机号
"""
phone = random.choice(['100', '110', '120']) + \
''.join(random.choice('0123456789') for _ in range(8))
return phone
def random_str(self, str_len: int) -> str:
"""从a-zA-Z0-9生成制定数量的随机字符
:param str_len: 字符串长度
:return:
"""
try:
str_len = int(str_len)
except ValueError:
raise Exception("调用随机字符失败,[ %s ]长度参数有误!" % str_len)
strings = ''.join(random.sample(string.hexdigits, +str_len))
return strings
def random_int(self, scope) -> int:
"""获取随机整型数据
:param scope: 数据范围
:return:
"""
try:
start_num, end_num = scope.split(",")
start_num = int(start_num)
end_num = int(end_num)
except ValueError:
raise Exception("调用随机整数失败,[ %s ]范围参数有误!" % str(scope))
if start_num <= end_num:
number = random.randint(start_num, end_num)
else:
number = random.randint(end_num, start_num)
return number
def random_float(self, data) -> float:
"""获取随机浮点数据
:param data: 数组
:return:
"""
try:
start_num, end_num, accuracy = data.split(",")
start_num = int(start_num)
end_num = int(end_num)
accuracy = int(accuracy)
except ValueError:
raise Exception("调用随机浮点数失败,[ %s ]范围参数或精度有误!" % data)
if start_num <= end_num:
number = random.uniform(start_num, end_num)
else:
number = random.uniform(end_num, start_num)
number = round(number, accuracy)
return number
def random_choice(self, data):
"""获取数组随机值
:param data: 数组
:return:
"""
_list = data.split(",")
each = random.choice(_list)
return each
def get_date_mark(self, now, mark, num):
if 'y' == mark:
return now + relativedelta(years=num)
elif 'm' == mark:
return now + relativedelta(months=num)
elif 'd' == mark:
return now + relativedelta(days=num)
elif 'h' == mark:
return now + relativedelta(hours=num)
elif 'M' == mark:
return now + relativedelta(minutes=num)
elif 's' == mark:
return now + relativedelta(seconds=num)
else:
raise Exception("日期字段标识[ %s ]错误, 请使用[年y,月m,日d,时h,分M,秒s]标识!" % mark)
def generate_date(self, expr=''):
"""生成日期对象(不含时分秒)
:param expr: 日期表达式,如"d-1"代表日期减1
:return:
"""
today = datetime.date.today()
if expr:
try:
mark = expr[:1]
num = int(expr[1:])
except (TypeError, NameError):
raise Exception("调用生成日期失败,日期表达式[ %s ]有误!" % expr)
return self.get_date_mark(today, mark, num)
else:
return today
def generate_datetime(self, expr=''):
"""生成日期时间对象(含时分秒)
:param expr: 日期表达式,如"d-1"代表日期减1
:return:
"""
now = datetime.datetime.now().replace(microsecond=0)
if expr:
try:
mark = expr[:1]
num = int(expr[1:])
except (TypeError, NameError):
raise Exception("调用生成日期失败,日期表达式[ %s ]有误!" % expr)
return self.get_date_mark(now, mark, num)
else:
return now
def generate_timestamp(self, expr='') -> int:
"""生成时间戳(13位)
:param expr: 日期表达式,如"d-1"代表日期减1
:return:
"""
datetime_obj = self.generate_datetime(expr)
return int(datetime.datetime.timestamp(datetime_obj)) * 1000
def generate_guid(self) -> str:
"""基于MAC地址+时间戳+随机数来生成GUID
:param:
:return:
"""
import uuid
return str(uuid.uuid1()).upper()
def generate_wxid(self):
"""基于AUTO标识+26位英文字母大小写+数字生成伪微信ID
:param:
:return:
"""
return 'AUTO' + ''.join(random.sample(string.ascii_letters + string.digits, 24))
def generate_noid(self, expr=''):
"""基于6位随机数字+出生日期+4位随机数生成伪身份证
:param expr: 日期表达式,如"d-1"代表日期减1
:return:
"""
# birthday = generate_date(expr)
# birthday = str(birthday).replace('-', '')
# return int(str(random.randint(100000, 999999)) + birthday + str(random.randint(1000, 9999)))
faker = Faker(locale='zh_CN')
return faker.ssn()
def generate_phone(self):
"""基于三大运营商号段+随机数生成伪手机号
:param:
:return:
"""
ctcc = [133, 153, 173, 177, 180, 181, 189, 191, 193, 199]
cucc = [130, 131, 132, 155, 156, 166, 175, 176, 185, 186, 166]
cmcc = [134, 135, 136, 137, 138, 139, 147, 150, 151, 152, 157, 158, 159, 172, 178, 182, 183, 184, 187, 188, 198]
begin = 10 ** 7
end = 10 ** 8 - 1
prefix = random.choice(ctcc + cucc + cmcc)
return str(prefix) + str(random.randint(begin, end))