简历生成器
题目如下:
Step1. 将自己简历里的字段结构化为一个 json 文件
Step2. 参考下图,我们对简历显示规则字段做以下约定:
"[1|1|1]":表示一行显示3个字段,以 1:1:1 的形式显示;
"[2|1]":表示一行显示2个字段,以 2:1 的形式显示;
"-": 表示一行显示1个字段,等价于[1]。
请按照以上规则,自定义你的简历显示规则。例如:"-[1|1|1]---"。
Step3. 写一个函数,接受 Step2 设定的规则字符串和 Step1 的 json 为条件:
function generPaper(layoutStr, json){}
生成简历页面,样式自行决定。(也可传入控制显示字段顺序的相关信息)
延伸要求:
手机端第一个区块部分滚动时依然在顶部
页面支持打印
参考GPT和自己的思路,首先,你需要将你的简历信息结构化为一个 JSON 文件。这个文件应该包含你的个人信息、教育背景、工作经历、技能、项目经验等。每个部分都应该是一个对象,具有相应的属性和值。例如:
{
"personalInfo": {
"name": "张三",
"email": "zhangsan@example.com",
"phone": "13800000000",
"address": "北京市海淀区"
},
"education": [
{
"degree": "本科",
"major": "计算机科学与技术",
"school": "清华大学",
"startDate": "2012年09月",
"endDate": "2016年07月"
},
{
"degree": "硕士",
"major": "计算机科学与技术",
"school": "清华大学",
"startDate": "2016年09月",
"endDate": "2018年07月"
}
],
"workExperience": [
{
"company": "阿里巴巴",
"position": "软件工程师",
"startDate": "2018年08月",
"endDate": "2020年06月",
"responsibilities": [
"负责支付宝用户体验优化",
"参与支付宝国际化项目"
]
},
{
"company": "字节跳动",
"position": "高级软件工程师",
"startDate": "2020年07月",
"endDate": "至今",
"responsibilities": [
"负责抖音直播核心功能开发",
"参与抖音直播技术架构设计"
]
}
],
"skills": [
"Java",
"Python",
"JavaScript",
"React",
"Vue",
"Node.js",
"Spring",
"MySQL",
"MongoDB"
],
"projects": [
{
"name": "在线教育平台",
"description": "一个基于 Spring Boot 和 Vue.js 的在线教育平台,提供在线课程和考试",
"responsibilities": [
"负责后端开发",
"参与前端开发"
],
"technologies": [
"Java",
"Spring Boot",
"Vue.js",
"MySQL"
]
},
{
"name": "微信小程序",
"description": "一个用于记录每日开销的微信小程序",
"responsibilities": [
"负责前端开发",
"参与后端开发"
],
"technologies": [
"JavaScript",
"Node.js",
"MongoDB"
]
}
]
}
接下来,你需要定义一个函数来根据指定的布局规则和 JSON 数据生成简历页面。这个函数应该首先解析布局规则,确定每一行应该包含哪些字段。然后,根据每一行的字段,从 JSON 数据中提取相应的值,生成 HTML 元素,并将它们拼接在一起,形成简历页面的 HTML 代码。
这个函数的大致逻辑如下:
1.解析布局规则,确定每一行应该包含哪些字段;
2.从 JSON 数据中提取相应的值;
3.生成 HTML 元素,并将它们拼接在一起;
4.返回拼接好的 HTML 代码。
下面是一个示例实现:
function generateResume(layoutStr, jsonData) {
// 解析布局规则,确定每一行应该包含哪些字段
const layout = layoutStr.split("|").map((s) => s.split(":").map(Number));
// 从 JSON 数据中提取相应的值
const personalInfo = jsonData.personalInfo;
const education = jsonData.education;
const workExperience = jsonData.workExperience;
const skills = jsonData.skills;
const projects = jsonData.projects;
// 生成 HTML 元素,并将它们拼接在一起
let html = "";
// 个人信息部分
html += '<div class="section">';
html += '<h2>个人信息</h2>';
html += '<ul>';
if (layout[0].length === 1) {
html += `<li>${personalInfo.name}</li>`;
} else if (layout[0].length === 2) {
html += `<li>${personalInfo.name}</li>`;
html += `<li>${personalInfo.email}</li>`;
} else {
html += `<li>${personalInfo.name}</li>`;
html += `<li>${personalInfo.email}</li>`;
html += `<li>${personalInfo.phone}</li>`;
}
html += '</ul>';
html += '</div>';
// 教育背景部分
html += '<div class="section">';
html += '<h2>教育背景</h2>';
for (let i = 0; i < education.length; i++) {
const edu = education[i];
html += '<ul>';
if (layout[i+1].length === 1) {
html += `<li>${edu.degree} - ${edu.major}</li>`;
} else {
html += `<li>${edu.degree} - ${edu.major}</li>`;
html += `<li>${edu.school}</li>`;
html += `<li>${edu.startDate} - ${edu.endDate}</li>`;
}
html += '</ul>';
}
html += '</div>';
// 工作经历部分
html += '<div class="section">';
html += '<h2>工作经历</h2>';
for (let i = 0; i < workExperience.length; i++) {
const exp = workExperience[i];
html += '<ul>';
if (layout[i+3].length === 1) {
html += `<li>${exp.company} - ${exp.position}</li>`;
} else {
html += `<li>${exp.company} - ${exp.position}</li>`;
html += `<li>${exp.startDate} - ${exp.endDate}</li>`;
html += '<li><ul>';
for (let j = 0; j < exp.responsibilities.length; j++) {
const res = exp.responsibilities[j];
html += `<li>${res}</li
}
html += '</ul></li>';
}
html += '</ul>';
// 返回拼接好的 HTML 代码
return html;
}
这个函数中,我们首先解析了布局规则,然后从 JSON 数据中提取了个人信息、教育背景、工作经历、技能和项目经历这些部分的数据。接下来,我们根据布局规则,生成相应的 HTML 元素,最后将它们拼接在一起,形成完整的简历页面。
回答不易,还请采纳!!!
以下是可能的解决方案,实现了基本的简历生成器功能。请注意,该代码仅为示例,仍有改进的空间。此外,需要注意输入参数的正确性和有效性。
//生成简历页面函数
function generPaper(layoutStr, json) {
var layoutArr = parseLayoutStr(layoutStr);
var contentArr = parseJson(json);
var result = '';
for (var i = 0; i < layoutArr.length; i++) {
var row = '';
var cols = layoutArr[i];
for (var j = 0; j < cols.length; j++) {
var col = '';
var fields = cols[j].split(':');
for (var k = 0; k < fields.length; k++) {
var field = contentArr.shift();
if (field) {
col += '<div>' + field + '</div>';
}
}
row += '<div class="col">' + col + '</div>';
}
result += '<div class="row">' + row + '</div>';
}
//生成简历页面,样式自行决定
var resume = document.createElement('div');
resume.innerHTML = result;
document.body.appendChild(resume);
}
//解析简历显示规则字符串
function parseLayoutStr(layoutStr) {
var arr = layoutStr.split('');
var result = [];
var i = 0;
while (i < arr.length) {
var n = '';
while (/\d/.test(arr[i])) {
n += arr[i];
i++;
}
if (n === '') {
result.push(['1']);
} else {
var cols = parseInt(n);
var row = [];
for (var j = 0; j < cols; j++) {
var m = '';
while (/\d/.test(arr[i])) {
m += arr[i];
i++;
}
if (m === '') {
row.push('1');
} else {
row.push(m);
}
}
result.push(row);
}
i++;
}
return result;
}
//解析简历json数据
function parseJson(json) {
var result = [];
for (var key in json) {
if (json.hasOwnProperty(key)) {
result.push(json[key]);
}
}
return result;
}
使用示例:
var layoutStr = "-[1:1:1]-[2:1]-_";
var json = {
name: '张三',
age: '25',
gender: '男',
education: '本科',
major: '计算机科学与技术',
workExperience: '2年',
skills: '熟悉JavaScript、HTML、CSS等前端技术'
};
generPaper(layoutStr, json);
以上代码只是一个基本的解决方案,仍然有改进的空间,例如错误处理,样式细节等。
下面是一个简单的 JavaScript 代码示例,实现了将 JSON 数据按照规则字符串 layoutStr 所定义的布局形式动态生成简历页面,并添加了手机端固定位置和打印功能。
function generPaper(layoutStr, json) {
const paper = document.createElement('div');
let row = null;
let fieldsInRow = 0;
for (let i = 0; i < layoutStr.length; i++) {
const currChar = layoutStr.charAt(i);
if (currChar === '-') {
// 当前行只显示一个字段
const fieldKey = Object.keys(json)[fieldsInRow];
const fieldValue = json[fieldKey];
const fieldWrapper = document.createElement('div');
fieldWrapper.className = 'field-wrapper';
const keyElement = document.createElement('div');
keyElement.className = 'field-key';
keyElement.textContent = fieldKey;
const valueElement = document.createElement('div');
valueElement.className = 'field-value';
valueElement.textContent = fieldValue;
fieldWrapper.appendChild(keyElement);
fieldWrapper.appendChild(valueElement);
if (row !== null) {
row.appendChild(fieldWrapper);
fieldsInRow++;
} else {
row = document.createElement('div');
row.className = 'row';
row.appendChild(fieldWrapper);
fieldsInRow = 1;
}
} else if (/\d/.test(currChar)) {
// 当前行显示多个字段
const numFields = parseInt(currChar);
for (let j = 0; j < numFields; j++) {
const fieldKey = Object.keys(json)[fieldsInRow];
const fieldValue = json[fieldKey];
const fieldWrapper = document.createElement('div');
fieldWrapper.className = 'field-wrapper';
const keyElement = document.createElement('div');
keyElement.className = 'field-key';
keyElement.textContent = fieldKey;
const valueElement = document.createElement('div');
valueElement.className = 'field-value';
valueElement.textContent = fieldValue;
fieldWrapper.appendChild(keyElement);
fieldWrapper.appendChild(valueElement);
if (row !== null) {
row.appendChild(fieldWrapper);
fieldsInRow++;
} else {
row = document.createElement('div');
row.className = 'row';
row.appendChild(fieldWrapper);
fieldsInRow = 1;
}
}
}
if (fieldsInRow === 3 || i === layoutStr.length - 1) {
// 当前行已经显示满了三个字段,或者是最后一个字符了
paper.appendChild(row);
row = null;
fieldsInRow = 0;
}
}
// 将 paper 添加到页面上
document.body.appendChild(paper);
// 在手机端设置第一个区块部分为固定位置
if (/Android|webOS|iPhone|iPod|BlackBerry/i.test(navigator.userAgent)) {
const firstFieldWrapper = document.querySelector('.field-wrapper:first-child');
firstFieldWrapper.style.position = 'sticky';
firstFieldWrapper.style.top = '0';
}
// 添加打印功能
const printButton = document.createElement('button');
printButton.textContent = '打印';
printButton.addEventListener('click', () => {
window.print();
});
document.body.appendChild(printButton);
}
在这段代码中,我们首先判断传入的规则字符串中每个字符对应的意义,并根据情况来生成 HTML 元素。然后,我们将这些元素拼接成一个完整的简历页面,并将其添加到页面上。接着,我们为手机端添加固定位置和打印功能。
请注意,这只是一个简单的示例代码,您需要根据自己的需求来修改和扩展它。