feat: 实现简历编辑功能并清理修改版内容
- 添加简历编辑功能,支持contentEditable直接编辑 - 保持原有页面样式不变,仅在编辑时显示虚线边框 - 支持保存为个人修改版,支持版本管理和删除 - 清理10个岗位修改版内容中的删除线和加粗符号 - 编辑按钮样式调整为白底蓝字带圆角 - 调整布局,编辑按钮与岗位名称在同一行 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
165
src/services/resumeManager.js
Normal file
165
src/services/resumeManager.js
Normal file
@@ -0,0 +1,165 @@
|
||||
/**
|
||||
* 简历管理服务
|
||||
* 处理个人修改版简历的CRUD操作
|
||||
*/
|
||||
|
||||
const STORAGE_KEY = 'resume_custom_versions';
|
||||
|
||||
// 获取所有个人修改版
|
||||
export const getCustomVersions = () => {
|
||||
try {
|
||||
const saved = localStorage.getItem(STORAGE_KEY);
|
||||
return saved ? JSON.parse(saved) : [];
|
||||
} catch (error) {
|
||||
console.error('获取个人修改版失败:', error);
|
||||
return [];
|
||||
}
|
||||
};
|
||||
|
||||
// 保存个人修改版列表
|
||||
export const saveCustomVersions = (versions) => {
|
||||
try {
|
||||
localStorage.setItem(STORAGE_KEY, JSON.stringify(versions));
|
||||
return { success: true };
|
||||
} catch (error) {
|
||||
console.error('保存个人修改版失败:', error);
|
||||
return { success: false, error: error.message };
|
||||
}
|
||||
};
|
||||
|
||||
// 创建新的个人修改版
|
||||
export const createCustomVersion = (data) => {
|
||||
try {
|
||||
const versions = getCustomVersions();
|
||||
const newVersion = {
|
||||
id: Date.now().toString(),
|
||||
name: data.name,
|
||||
content: data.content,
|
||||
positionTitle: data.positionTitle,
|
||||
originalVersion: data.originalVersion || 'default',
|
||||
tags: data.tags || [],
|
||||
createdAt: new Date().toISOString(),
|
||||
updatedAt: new Date().toISOString()
|
||||
};
|
||||
|
||||
const updatedVersions = [...versions, newVersion];
|
||||
const result = saveCustomVersions(updatedVersions);
|
||||
|
||||
if (result.success) {
|
||||
return { success: true, data: newVersion };
|
||||
} else {
|
||||
return result;
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('创建个人修改版失败:', error);
|
||||
return { success: false, error: error.message };
|
||||
}
|
||||
};
|
||||
|
||||
// 更新个人修改版
|
||||
export const updateCustomVersion = (id, data) => {
|
||||
try {
|
||||
const versions = getCustomVersions();
|
||||
const index = versions.findIndex(v => v.id === id);
|
||||
|
||||
if (index === -1) {
|
||||
return { success: false, error: '版本不存在' };
|
||||
}
|
||||
|
||||
versions[index] = {
|
||||
...versions[index],
|
||||
...data,
|
||||
updatedAt: new Date().toISOString()
|
||||
};
|
||||
|
||||
const result = saveCustomVersions(versions);
|
||||
|
||||
if (result.success) {
|
||||
return { success: true, data: versions[index] };
|
||||
} else {
|
||||
return result;
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('更新个人修改版失败:', error);
|
||||
return { success: false, error: error.message };
|
||||
}
|
||||
};
|
||||
|
||||
// 删除个人修改版
|
||||
export const deleteCustomVersion = (id) => {
|
||||
try {
|
||||
const versions = getCustomVersions();
|
||||
const updatedVersions = versions.filter(v => v.id !== id);
|
||||
|
||||
const result = saveCustomVersions(updatedVersions);
|
||||
return result;
|
||||
} catch (error) {
|
||||
console.error('删除个人修改版失败:', error);
|
||||
return { success: false, error: error.message };
|
||||
}
|
||||
};
|
||||
|
||||
// 根据岗位获取版本
|
||||
export const getVersionsByPosition = (positionTitle) => {
|
||||
const versions = getCustomVersions();
|
||||
return versions.filter(v => v.positionTitle === positionTitle);
|
||||
};
|
||||
|
||||
// 根据ID获取单个版本
|
||||
export const getVersionById = (id) => {
|
||||
const versions = getCustomVersions();
|
||||
return versions.find(v => v.id === id);
|
||||
};
|
||||
|
||||
// 检查版本名称是否重复
|
||||
export const isVersionNameExists = (name, positionTitle) => {
|
||||
const versions = getCustomVersions();
|
||||
return versions.some(v => v.name === name && v.positionTitle === positionTitle);
|
||||
};
|
||||
|
||||
// 导出版本为JSON
|
||||
export const exportVersion = (id) => {
|
||||
const version = getVersionById(id);
|
||||
if (!version) {
|
||||
return { success: false, error: '版本不存在' };
|
||||
}
|
||||
|
||||
try {
|
||||
const dataStr = JSON.stringify(version, null, 2);
|
||||
const dataUri = 'data:application/json;charset=utf-8,'+ encodeURIComponent(dataStr);
|
||||
|
||||
const exportFileDefaultName = `resume_${version.positionTitle}_${version.name}.json`;
|
||||
|
||||
const linkElement = document.createElement('a');
|
||||
linkElement.setAttribute('href', dataUri);
|
||||
linkElement.setAttribute('download', exportFileDefaultName);
|
||||
linkElement.click();
|
||||
|
||||
return { success: true };
|
||||
} catch (error) {
|
||||
console.error('导出版本失败:', error);
|
||||
return { success: false, error: error.message };
|
||||
}
|
||||
};
|
||||
|
||||
// 导入版本
|
||||
export const importVersion = (jsonData) => {
|
||||
try {
|
||||
const version = JSON.parse(jsonData);
|
||||
version.id = Date.now().toString(); // 生成新ID
|
||||
version.importedAt = new Date().toISOString();
|
||||
|
||||
const versions = getCustomVersions();
|
||||
const updatedVersions = [...versions, version];
|
||||
const result = saveCustomVersions(updatedVersions);
|
||||
|
||||
if (result.success) {
|
||||
return { success: true, data: version };
|
||||
} else {
|
||||
return result;
|
||||
}
|
||||
} catch (error) {
|
||||
console.error('导入版本失败:', error);
|
||||
return { success: false, error: '无效的JSON格式' };
|
||||
}
|
||||
};
|
||||
Reference in New Issue
Block a user