360 lines
12 KiB
Python
360 lines
12 KiB
Python
|
|
import json
|
|||
|
|
import re
|
|||
|
|
import os
|
|||
|
|
|
|||
|
|
# 读取环保岗位简历数据
|
|||
|
|
with open('网页未导入数据/环保产业/环保岗位简历.json', 'r', encoding='utf-8') as f:
|
|||
|
|
env_data = json.load(f)
|
|||
|
|
|
|||
|
|
# 读取面试题数据
|
|||
|
|
with open('网页未导入数据/岗位群面试题(全产业).json', 'r', encoding='utf-8') as f:
|
|||
|
|
interview_data = json.load(f)
|
|||
|
|
|
|||
|
|
# 读取修改版简历
|
|||
|
|
modified_resumes = {}
|
|||
|
|
modified_resume_dir = '网页未导入数据/环保产业/环保修改版简历'
|
|||
|
|
if os.path.exists(modified_resume_dir):
|
|||
|
|
for filename in os.listdir(modified_resume_dir):
|
|||
|
|
if filename.endswith('.md'):
|
|||
|
|
# 获取文件名(不含扩展名)
|
|||
|
|
file_position_name = filename.replace('.md', '')
|
|||
|
|
# 处理特殊的岗位名称映射
|
|||
|
|
if file_position_name == '环评工程师(环境影响评价工程师)':
|
|||
|
|
# 同时存储两种形式,以确保能匹配
|
|||
|
|
with open(os.path.join(modified_resume_dir, filename), 'r', encoding='utf-8') as f:
|
|||
|
|
content = f.read()
|
|||
|
|
modified_resumes['环评工程师'] = content
|
|||
|
|
modified_resumes['环评工程师(环境影响评价工程师)'] = content
|
|||
|
|
else:
|
|||
|
|
with open(os.path.join(modified_resume_dir, filename), 'r', encoding='utf-8') as f:
|
|||
|
|
modified_resumes[file_position_name] = f.read()
|
|||
|
|
|
|||
|
|
print(f"已加载{len(modified_resumes)}个修改版简历:{list(modified_resumes.keys())}")
|
|||
|
|
|
|||
|
|
# 按岗位群组织数据
|
|||
|
|
position_groups = {
|
|||
|
|
"环境规划": [],
|
|||
|
|
"节能与碳管理": [],
|
|||
|
|
"设备运维与支持": [],
|
|||
|
|
"生态修复": [],
|
|||
|
|
"污染治理": [],
|
|||
|
|
"资源回收与再生": [],
|
|||
|
|
"报告输出与管理": [],
|
|||
|
|
"环境监测": [],
|
|||
|
|
"环境体系咨询": [],
|
|||
|
|
"实验室检测": []
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
# 组织简历数据
|
|||
|
|
for item in env_data:
|
|||
|
|
group = item.get("简历岗位群", "")
|
|||
|
|
if group in position_groups:
|
|||
|
|
position_groups[group].append(item)
|
|||
|
|
|
|||
|
|
# 获取环保产业的面试题
|
|||
|
|
env_interview_questions = {}
|
|||
|
|
for item in interview_data:
|
|||
|
|
if item.get("所属就业管家") == "环保":
|
|||
|
|
group = item.get("简历岗位群", "")
|
|||
|
|
if group not in env_interview_questions:
|
|||
|
|
env_interview_questions[group] = item.get("面试题内容", "")
|
|||
|
|
|
|||
|
|
# 生成JavaScript格式的数据结构
|
|||
|
|
js_output = """// 岗位群列表
|
|||
|
|
const industries = [
|
|||
|
|
"""
|
|||
|
|
|
|||
|
|
# 生成所有岗位群的数据
|
|||
|
|
industry_configs = [
|
|||
|
|
("environment_planning", "环境规划"),
|
|||
|
|
("energy_carbon", "节能与碳管理"),
|
|||
|
|
("equipment_maintenance", "设备运维与支持"),
|
|||
|
|
("ecological_restoration", "生态修复"),
|
|||
|
|
("pollution_control", "污染治理"),
|
|||
|
|
("resource_recycling", "资源回收与再生"),
|
|||
|
|
("report_management", "报告输出与管理"),
|
|||
|
|
("environment_monitoring", "环境监测"),
|
|||
|
|
("environment_consulting", "环境体系咨询"),
|
|||
|
|
("laboratory_testing", "实验室检测")
|
|||
|
|
]
|
|||
|
|
|
|||
|
|
for idx, (industry_id, industry_name) in enumerate(industry_configs):
|
|||
|
|
js_output += f""" {{
|
|||
|
|
id: "{industry_id}",
|
|||
|
|
name: "{industry_name}",
|
|||
|
|
positions: [
|
|||
|
|
"""
|
|||
|
|
|
|||
|
|
# 获取该岗位群的岗位列表
|
|||
|
|
positions = position_groups.get(industry_name, [])
|
|||
|
|
for pos_idx, pos in enumerate(positions):
|
|||
|
|
position_name = pos.get("岗位名称", "")
|
|||
|
|
level = pos.get("岗位等级标签", "普通岗")
|
|||
|
|
avatar = pos.get("简历头像url", "")
|
|||
|
|
|
|||
|
|
js_output += f""" {{
|
|||
|
|
id: "{industry_id}_{pos_idx + 1}",
|
|||
|
|
title: "{position_name}",
|
|||
|
|
level: "{level}",
|
|||
|
|
avatar: "{avatar}",
|
|||
|
|
department: "{industry_name}",
|
|||
|
|
type: "全职",
|
|||
|
|
experience: "1-3年",
|
|||
|
|
education: "大专",
|
|||
|
|
salary: "6-10K",
|
|||
|
|
location: "苏州",
|
|||
|
|
updateTime: "2024-01-20",
|
|||
|
|
description: "{position_name}职位描述",
|
|||
|
|
requirements: [
|
|||
|
|
"熟悉{industry_name}相关工作",
|
|||
|
|
"具有良好的沟通能力",
|
|||
|
|
"有相关工作经验优先"
|
|||
|
|
]
|
|||
|
|
}}"""
|
|||
|
|
if pos_idx < len(positions) - 1:
|
|||
|
|
js_output += ","
|
|||
|
|
js_output += "\n"
|
|||
|
|
|
|||
|
|
js_output += """ ],
|
|||
|
|
questions: [
|
|||
|
|
{
|
|||
|
|
"""
|
|||
|
|
|
|||
|
|
# 添加面试题内容
|
|||
|
|
interview_content = env_interview_questions.get(industry_name, "")
|
|||
|
|
if interview_content:
|
|||
|
|
# 解析面试题内容,提取问答对
|
|||
|
|
questions = []
|
|||
|
|
lines = interview_content.split('\n')
|
|||
|
|
current_q = ""
|
|||
|
|
current_a = ""
|
|||
|
|
|
|||
|
|
in_answer = False
|
|||
|
|
for i, line in enumerate(lines):
|
|||
|
|
# 匹配题目行:数字开头,可能包含"问题:"
|
|||
|
|
if line.strip() and line.strip()[0].isdigit() and '.' in line:
|
|||
|
|
if current_q and current_a:
|
|||
|
|
questions.append((current_q, current_a))
|
|||
|
|
# 移除题号和"问题:"前缀
|
|||
|
|
current_q = re.sub(r'^\d+\.\s*', '', line.strip())
|
|||
|
|
current_q = re.sub(r'^问题:\s*', '', current_q)
|
|||
|
|
current_a = ""
|
|||
|
|
in_answer = False
|
|||
|
|
# 匹配答案标记行
|
|||
|
|
elif '答案' in line or '参考' in line or '回答' in line or '回复' in line:
|
|||
|
|
in_answer = True
|
|||
|
|
# 如果答案在同一行(冒号后)
|
|||
|
|
if ':' in line or ':' in line:
|
|||
|
|
parts = re.split('[::]', line, 1)
|
|||
|
|
if len(parts) > 1 and parts[1].strip():
|
|||
|
|
current_a = parts[1].strip()
|
|||
|
|
# 收集答案内容
|
|||
|
|
elif in_answer and line.strip():
|
|||
|
|
if not current_a:
|
|||
|
|
current_a = line.strip()
|
|||
|
|
else:
|
|||
|
|
current_a += " " + line.strip()
|
|||
|
|
# 空行可能表示答案结束
|
|||
|
|
elif in_answer and not line.strip() and current_a:
|
|||
|
|
in_answer = False
|
|||
|
|
|
|||
|
|
if current_q and current_a:
|
|||
|
|
questions.append((current_q, current_a))
|
|||
|
|
|
|||
|
|
# 不限制问题数量,显示所有题目
|
|||
|
|
# questions = questions[:6]
|
|||
|
|
|
|||
|
|
js_output += f""" id: "{industry_id}_q1",
|
|||
|
|
question: "{industry_name}岗位群面试题",
|
|||
|
|
subQuestions: [
|
|||
|
|
"""
|
|||
|
|
for q_idx, (question, answer) in enumerate(questions):
|
|||
|
|
# 清理问题和答案文本
|
|||
|
|
question = question.replace('"', '\\"').replace('\n', ' ')
|
|||
|
|
answer = answer.replace('"', '\\"').replace('\n', ' ')
|
|||
|
|
|
|||
|
|
js_output += f""" {{
|
|||
|
|
id: "q{q_idx + 1}",
|
|||
|
|
question: "{question}",
|
|||
|
|
answer: `{answer}`
|
|||
|
|
}}"""
|
|||
|
|
if q_idx < len(questions) - 1:
|
|||
|
|
js_output += ","
|
|||
|
|
js_output += "\n"
|
|||
|
|
|
|||
|
|
js_output += """ ]
|
|||
|
|
}
|
|||
|
|
]
|
|||
|
|
"""
|
|||
|
|
|
|||
|
|
js_output += " }"
|
|||
|
|
if idx < len(industry_configs) - 1:
|
|||
|
|
js_output += ","
|
|||
|
|
js_output += "\n"
|
|||
|
|
|
|||
|
|
js_output += """];
|
|||
|
|
|
|||
|
|
// 简历模板数据
|
|||
|
|
const resumeTemplates = {
|
|||
|
|
"""
|
|||
|
|
|
|||
|
|
# 生成简历模板数据
|
|||
|
|
for idx, (industry_id, industry_name) in enumerate(industry_configs):
|
|||
|
|
js_output += f' "{industry_name}": [\n'
|
|||
|
|
|
|||
|
|
positions = position_groups.get(industry_name, [])
|
|||
|
|
for pos_idx, pos in enumerate(positions):
|
|||
|
|
position_name = pos.get("岗位名称", "")
|
|||
|
|
level = pos.get("岗位等级标签", "普通岗")
|
|||
|
|
resume_content = pos.get("简历内容", "")
|
|||
|
|
project_name = pos.get("对应项目案例名称", "")
|
|||
|
|
avatar = pos.get("简历头像url", "")
|
|||
|
|
|
|||
|
|
# 解析简历内容
|
|||
|
|
project_desc = ""
|
|||
|
|
core_skills = []
|
|||
|
|
compound_skills = []
|
|||
|
|
personal_summary = ""
|
|||
|
|
|
|||
|
|
if resume_content:
|
|||
|
|
# 提取项目职责
|
|||
|
|
match = re.search(r'###\s*\(五\)\s*岗位职责[::](.*?)(?=\n#|$)', resume_content, re.DOTALL)
|
|||
|
|
if match:
|
|||
|
|
project_desc = match.group(1).strip()
|
|||
|
|
|
|||
|
|
# 提取垂直能力
|
|||
|
|
match = re.search(r'###\s*\(一\)\s*垂直能力(.*?)(?=###|\n#|$)', resume_content, re.DOTALL)
|
|||
|
|
if match:
|
|||
|
|
skills_text = match.group(1)
|
|||
|
|
core_skills = [s.strip() for s in re.findall(r'\d+\.\s*(.*?)(?=\n\d+\.|$)', skills_text, re.DOTALL)][:5]
|
|||
|
|
|
|||
|
|
# 提取复合能力
|
|||
|
|
match = re.search(r'###\s*\(二\)\s*复合能力(.*?)(?=\n#|$)', resume_content, re.DOTALL)
|
|||
|
|
if match:
|
|||
|
|
skills_text = match.group(1)
|
|||
|
|
compound_skills = [s.strip() for s in re.findall(r'\d+\.\s*(.*?)(?=\n\d+\.|$)', skills_text, re.DOTALL)][:5]
|
|||
|
|
|
|||
|
|
# 提取个人评价
|
|||
|
|
match = re.search(r'#\s*三、\s*个人评价(.*?)$', resume_content, re.DOTALL)
|
|||
|
|
if match:
|
|||
|
|
personal_summary = match.group(1).strip()
|
|||
|
|
|
|||
|
|
# 清理文本
|
|||
|
|
def clean_text(text):
|
|||
|
|
return text.replace('\\n', '\\\\n').replace('"', '\\"').replace('\n', '\\n')
|
|||
|
|
|
|||
|
|
# 获取修改版简历(如果存在)
|
|||
|
|
modified_content = modified_resumes.get(position_name)
|
|||
|
|
if not modified_content:
|
|||
|
|
# 尝试不同的岗位名称格式
|
|||
|
|
if '(' in position_name:
|
|||
|
|
# 尝试去掉括号部分
|
|||
|
|
short_name = position_name.split('(')[0]
|
|||
|
|
modified_content = modified_resumes.get(short_name)
|
|||
|
|
elif position_name == '环评工程师':
|
|||
|
|
# 特殊处理环评工程师
|
|||
|
|
modified_content = modified_resumes.get('环评工程师(环境影响评价工程师)')
|
|||
|
|
|
|||
|
|
# 如果没有修改版,使用原始版本
|
|||
|
|
if not modified_content:
|
|||
|
|
modified_content = resume_content
|
|||
|
|
|
|||
|
|
js_output += f""" {{
|
|||
|
|
position: "{position_name}",
|
|||
|
|
level: "{level}",
|
|||
|
|
avatar: "{avatar}",
|
|||
|
|
content: {{
|
|||
|
|
original: `{clean_text(resume_content)}`,
|
|||
|
|
modified: `{clean_text(modified_content)}`
|
|||
|
|
}},
|
|||
|
|
studentInfo: {{
|
|||
|
|
project_experience: {{
|
|||
|
|
project_name: "{project_name}",
|
|||
|
|
position: "{position_name}",
|
|||
|
|
time_period: "XXXXXX",
|
|||
|
|
company: "XXXXXX",
|
|||
|
|
description: `{clean_text(project_desc)}`
|
|||
|
|
}},
|
|||
|
|
core_skills: [
|
|||
|
|
"""
|
|||
|
|
|
|||
|
|
for skill_idx, skill in enumerate(core_skills):
|
|||
|
|
js_output += f' "{clean_text(skill)}"'
|
|||
|
|
if skill_idx < len(core_skills) - 1:
|
|||
|
|
js_output += ","
|
|||
|
|
js_output += "\n"
|
|||
|
|
|
|||
|
|
js_output += """ ],
|
|||
|
|
compound_skills: [
|
|||
|
|
"""
|
|||
|
|
|
|||
|
|
for skill_idx, skill in enumerate(compound_skills):
|
|||
|
|
js_output += f' "{clean_text(skill)}"'
|
|||
|
|
if skill_idx < len(compound_skills) - 1:
|
|||
|
|
js_output += ","
|
|||
|
|
js_output += "\n"
|
|||
|
|
|
|||
|
|
js_output += f""" ],
|
|||
|
|
personal_summary: "{clean_text(personal_summary)}"
|
|||
|
|
}}
|
|||
|
|
}}"""
|
|||
|
|
|
|||
|
|
if pos_idx < len(positions) - 1:
|
|||
|
|
js_output += ","
|
|||
|
|
js_output += "\n"
|
|||
|
|
|
|||
|
|
js_output += " ]"
|
|||
|
|
if idx < len(industry_configs) - 1:
|
|||
|
|
js_output += ","
|
|||
|
|
js_output += "\n"
|
|||
|
|
|
|||
|
|
js_output += """};
|
|||
|
|
|
|||
|
|
// 我的简历数据
|
|||
|
|
const myResume = {
|
|||
|
|
personalInfo: {
|
|||
|
|
name: "邓沐",
|
|||
|
|
phone: "138****8888",
|
|||
|
|
email: "dengmu@example.com",
|
|||
|
|
age: 22,
|
|||
|
|
education: "苏州农业职业技术学院 生态环境修复技术 2021.9-2024.6",
|
|||
|
|
experience: "1年",
|
|||
|
|
location: "苏州"
|
|||
|
|
},
|
|||
|
|
workExperience: [
|
|||
|
|
{
|
|||
|
|
company: "某环保科技公司",
|
|||
|
|
position: "环境监测实习生",
|
|||
|
|
duration: "2023.06-2024.01",
|
|||
|
|
description: "负责环境监测数据采集、分析和报告编制工作"
|
|||
|
|
}
|
|||
|
|
],
|
|||
|
|
skills: ["环境监测", "数据分析", "报告编制", "AutoCAD", "GIS"],
|
|||
|
|
projects: [
|
|||
|
|
{
|
|||
|
|
name: "某工业园区环境影响评价项目",
|
|||
|
|
role: "环评助理",
|
|||
|
|
duration: "2023.09-2024.01",
|
|||
|
|
description: "协助完成环境影响评价报告的编制和现场踏勘工作"
|
|||
|
|
}
|
|||
|
|
]
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
// 获取页面mock数据的函数
|
|||
|
|
export function getMockPageData() {
|
|||
|
|
return resumeInterviewMockData;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 导出合并的数据
|
|||
|
|
export const resumeInterviewMockData = {
|
|||
|
|
industries,
|
|||
|
|
resumeTemplates,
|
|||
|
|
myResume
|
|||
|
|
};
|
|||
|
|
"""
|
|||
|
|
|
|||
|
|
# 写入文件
|
|||
|
|
with open('src/mocks/resumeInterviewMock_env.js', 'w', encoding='utf-8') as f:
|
|||
|
|
f.write(js_output)
|
|||
|
|
|
|||
|
|
print("转换完成!已生成 src/mocks/resumeInterviewMock_env.js")
|