Files
python----/student.py
T
2025-10-20 12:32:18 +08:00

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()