377 lines
8.6 KiB
Python
377 lines
8.6 KiB
Python
from faker import Faker
|
|
import random
|
|
from datetime import datetime
|
|
|
|
# 初始化Faker生成器(简体中文)
|
|
fake = Faker("zh_CN")
|
|
|
|
# 定义固定值
|
|
TEAM_ID = 106
|
|
PLAN_ID = 131
|
|
|
|
# 常见民族列表
|
|
ETHNIC_GROUPS = [
|
|
"汉",
|
|
"壮",
|
|
"满",
|
|
"回",
|
|
"苗",
|
|
"维吾尔",
|
|
"土家",
|
|
"彝",
|
|
"蒙古",
|
|
"藏",
|
|
"布依",
|
|
"侗",
|
|
"瑶",
|
|
"朝鲜",
|
|
"白",
|
|
"哈尼",
|
|
"哈萨克",
|
|
"黎",
|
|
"傣",
|
|
"畲",
|
|
"傈僳",
|
|
"仡佬",
|
|
"东乡",
|
|
"高山",
|
|
"拉祜",
|
|
"水",
|
|
"佤",
|
|
"纳西",
|
|
"羌",
|
|
"土",
|
|
"仫佬",
|
|
"锡伯",
|
|
"柯尔克孜",
|
|
"达斡尔",
|
|
"景颇",
|
|
"毛南",
|
|
"撒拉",
|
|
"布朗",
|
|
"塔吉克",
|
|
"阿昌",
|
|
"普米",
|
|
"鄂温克",
|
|
"怒",
|
|
"京",
|
|
"基诺",
|
|
"德昂",
|
|
"保安",
|
|
"俄罗斯",
|
|
"裕固",
|
|
"乌兹别克",
|
|
"门巴",
|
|
"鄂伦春",
|
|
"独龙",
|
|
"塔塔尔",
|
|
"赫哲",
|
|
"珞巴",
|
|
]
|
|
|
|
# 疾病列表(健康状态)
|
|
HEALTH_CONDITIONS = [
|
|
"无",
|
|
"近视",
|
|
"弱视",
|
|
"鼻炎",
|
|
"哮喘",
|
|
"过敏体质",
|
|
"蛀牙",
|
|
"肥胖",
|
|
"发育迟缓",
|
|
"ADHD",
|
|
"缺铁性贫血",
|
|
"维生素缺乏",
|
|
"易感冒体质",
|
|
"偏瘦",
|
|
"过敏(花粉)",
|
|
"过敏(尘螨)",
|
|
"过敏(牛奶)",
|
|
"消化不良",
|
|
"多动症",
|
|
"抽动症",
|
|
"癫痫",
|
|
"小儿麻痹",
|
|
"乙肝病毒携带",
|
|
]
|
|
|
|
# 艺术特长
|
|
ART_TALENTS = [
|
|
"无",
|
|
"钢琴",
|
|
"小提琴",
|
|
"绘画",
|
|
"书法",
|
|
"舞蹈",
|
|
"声乐",
|
|
"戏剧表演",
|
|
"摄影",
|
|
"编程",
|
|
"动画制作",
|
|
"模型制作",
|
|
"手工艺术",
|
|
]
|
|
|
|
# 体育特长
|
|
SPORTS_TALENTS = [
|
|
"无",
|
|
"游泳",
|
|
"篮球",
|
|
"足球",
|
|
"乒乓球",
|
|
"羽毛球",
|
|
"田径",
|
|
"武术",
|
|
"跆拳道",
|
|
"空手道",
|
|
"轮滑",
|
|
"滑板",
|
|
"自行车",
|
|
"健美操",
|
|
]
|
|
|
|
# 科技特长
|
|
TECH_TALENTS = [
|
|
"无",
|
|
"机器人编程",
|
|
"电子制作",
|
|
"3D打印",
|
|
"人工智能",
|
|
"网页设计",
|
|
"科学实验",
|
|
"天文观测",
|
|
"植物培养",
|
|
"动物观察",
|
|
"航模制作",
|
|
]
|
|
|
|
# 职业列表
|
|
OCCUPATIONS = [
|
|
"医生",
|
|
"教师",
|
|
"工程师",
|
|
"程序员",
|
|
"设计师",
|
|
"建筑师",
|
|
"销售经理",
|
|
"会计",
|
|
"律师",
|
|
"公务员",
|
|
"记者",
|
|
"警察",
|
|
"消防员",
|
|
"厨师",
|
|
"商人",
|
|
"自由职业",
|
|
"个体经营者",
|
|
"银行职员",
|
|
"人力资源",
|
|
"市场营销",
|
|
]
|
|
|
|
# 公司类型
|
|
WORKPLACES = [
|
|
"国有企业",
|
|
"民营企业",
|
|
"外资企业",
|
|
"合资企业",
|
|
"政府机关",
|
|
"事业单位",
|
|
"学校",
|
|
"医院",
|
|
"设计事务所",
|
|
"律师事务所",
|
|
"科技公司",
|
|
"互联网公司",
|
|
"金融机构",
|
|
"建筑公司",
|
|
"零售企业",
|
|
]
|
|
|
|
# 小学名称
|
|
PRIMARY_SCHOOLS = [
|
|
"第一实验小学",
|
|
"第二实验小学",
|
|
"育才小学",
|
|
"阳光小学",
|
|
"希望小学",
|
|
"和平小学",
|
|
"实验小学分校",
|
|
"新世纪小学",
|
|
"东方小学",
|
|
"先锋小学",
|
|
"星光小学",
|
|
"明德小学",
|
|
]
|
|
|
|
|
|
def generate_id_num(birthday):
|
|
"""生成符合规则的身份证号"""
|
|
# 生成前6位(地区码,使用真实的地区码)
|
|
region_codes = [
|
|
"110101",
|
|
"110105",
|
|
"110106",
|
|
"110107",
|
|
"310112",
|
|
"330102",
|
|
"440106",
|
|
"440304",
|
|
]
|
|
|
|
# 出生日期码(8位)
|
|
birth_code = birthday.replace("-", "")
|
|
|
|
# 顺序码(3位)
|
|
sequence_code = str(random.randint(101, 998))
|
|
|
|
# 生成校验码(1位)
|
|
base = (
|
|
region_codes[random.randint(0, len(region_codes) - 1)]
|
|
+ birth_code
|
|
+ sequence_code
|
|
)
|
|
weight = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]
|
|
checksum_map = {
|
|
0: "1",
|
|
1: "0",
|
|
2: "X",
|
|
3: "9",
|
|
4: "8",
|
|
5: "7",
|
|
6: "6",
|
|
7: "5",
|
|
8: "4",
|
|
9: "3",
|
|
10: "2",
|
|
}
|
|
|
|
total = 0
|
|
for i in range(17):
|
|
total += int(base[i]) * weight[i]
|
|
checksum = checksum_map[total % 11]
|
|
|
|
return base + checksum
|
|
|
|
|
|
def generate_student_data():
|
|
"""生成单个学生数据"""
|
|
# 基础信息
|
|
sex = random.choice(["男", "女"])
|
|
|
|
# 生日 (2010-2015年出生)
|
|
birthday = fake.date_between(start_date="-15y", end_date="-8y").strftime("%Y-%m-%d")
|
|
|
|
# 生成符合规则的身份证号
|
|
id_num = generate_id_num(birthday)
|
|
|
|
# 计算年龄(仅用于展示)
|
|
birth_year = int(birthday[:4])
|
|
current_year = datetime.now().year
|
|
age = current_year - birth_year
|
|
|
|
# 生成学生信息
|
|
data = {
|
|
"teamId": TEAM_ID,
|
|
"stuName": fake.name(), # 学生姓名
|
|
"idNum": id_num, # 身份证号
|
|
"formerName": random.choices(
|
|
["无", fake.last_name() + fake.first_name()], weights=[0.8, 0.2]
|
|
)[
|
|
0
|
|
], # 曾用名
|
|
"sex": sex, # 性别
|
|
"nation": random.choice(ETHNIC_GROUPS), # 民族
|
|
"birthday": birthday, # 生日
|
|
"finishSchool": random.choice(PRIMARY_SCHOOLS), # 毕业学校
|
|
"file": None, # 文件
|
|
"hkadr": fake.province()
|
|
+ "/"
|
|
+ fake.city()
|
|
+ "/"
|
|
+ fake.district(), # 户口所在地
|
|
"homeAddress": fake.address(), # 家庭住址
|
|
"health": random.choice(HEALTH_CONDITIONS), # 健康状况
|
|
"artisticSpecialty": random.choice(ART_TALENTS), # 艺术特长
|
|
"artisticAchievements": "无", # 艺术成就
|
|
"technologicalSpecialty": random.choice(TECH_TALENTS), # 科技特长
|
|
"technologicalAchievements": "无", # 科技成就
|
|
"sportsSpecialty": random.choice(SPORTS_TALENTS), # 体育特长
|
|
"sportsAchievements": "无", # 体育成就
|
|
"planId": PLAN_ID, # 计划ID
|
|
"imageUrl": "", # 图片URL
|
|
"schoolCode": "G" + id_num[:-1], # 学籍号
|
|
"age": age, # 年龄(仅用于展示)
|
|
"email": fake.email() if random.random() > 0.7 else "", # 邮箱
|
|
"height": str(random.randint(130, 170)), # 身高
|
|
"weight": str(random.randint(25, 60)), # 体重
|
|
"measurements": f"{random.randint(60, 90)},{random.randint(60, 90)},{random.randint(60, 90)}", # 三围
|
|
}
|
|
|
|
# 生成监护人信息
|
|
guardian_prefix = fake.last_name()
|
|
|
|
# 监护人1 - 通常为父母之一
|
|
relationship_choices = ["父亲", "母亲", "爷爷", "奶奶", "外公", "外婆"]
|
|
relationship = random.choice(relationship_choices[:2]) # 主要选择父母
|
|
|
|
data.update(
|
|
{
|
|
"guardian1Name": guardian_prefix
|
|
+ ("先生" if relationship == "父亲" else "女士"), # 监护人1姓名
|
|
"guardian1Relationship": relationship, # 关系
|
|
"guardian1IdCardNumber": generate_id_num(
|
|
fake.date_between(start_date="-55y", end_date="-25y").strftime(
|
|
"%Y-%m-%d"
|
|
)
|
|
), # 身份证号
|
|
"guardian1Contact": fake.phone_number(), # 联系方式
|
|
"guardian1Occupation": random.choice(OCCUPATIONS), # 职业
|
|
"guardian1Workplace": random.choice(WORKPLACES), # 工作单位
|
|
}
|
|
)
|
|
|
|
# 监护人2 - 可能是另一位家长或其他人
|
|
if relationship == "父亲":
|
|
guardian2_relationship = "母亲"
|
|
else:
|
|
guardian2_relationship = random.choices(
|
|
["父亲", "爷爷", "奶奶", "外公", "外婆", "其他亲属"],
|
|
weights=[0.7, 0.1, 0.1, 0.05, 0.05, 0.1],
|
|
)[0]
|
|
|
|
data.update(
|
|
{
|
|
"guardian2Name": guardian_prefix
|
|
+ (
|
|
"先生" if guardian2_relationship in ["父亲", "爷爷", "外公"] else "女士"
|
|
), # 监护人2姓名
|
|
"guardian2Relationship": guardian2_relationship, # 关系
|
|
"guardian2IdCardNumber": generate_id_num(
|
|
fake.date_between(start_date="-55y", end_date="-25y").strftime(
|
|
"%Y-%m-%d"
|
|
)
|
|
), # 身份证号
|
|
"guardian2Contact": (
|
|
fake.phone_number() if guardian2_relationship != "无" else ""
|
|
), # 联系方式
|
|
"guardian2Occupation": (
|
|
random.choice(OCCUPATIONS) if guardian2_relationship != "无" else ""
|
|
), # 职业
|
|
"guardian2Workplace": (
|
|
random.choice(WORKPLACES) if guardian2_relationship != "无" else ""
|
|
), # 工作单位
|
|
}
|
|
)
|
|
|
|
return data
|
|
|
|
|
|
def generate_students():
|
|
student = generate_student_data()
|
|
return student
|
|
|
|
|
|
generate_students()
|