diff --git a/apps/fronted/src/components/editor/education/EducationItem.tsx b/apps/fronted/src/components/editor/education/EducationItem.tsx index 98fcf4d..b237f01 100644 --- a/apps/fronted/src/components/editor/education/EducationItem.tsx +++ b/apps/fronted/src/components/editor/education/EducationItem.tsx @@ -26,7 +26,7 @@ import { interface EducationEditorProps { education: Education; - onSave: (educaton: Education) => void; + onSave: (education: Education) => void; onDelete: () => void; onCancel: () => void; } @@ -40,41 +40,28 @@ const EducationEditor: React.FC = ({ education, onSave }) => { - const theme = useResumeStore((state) => state.theme); - const [data, setData] = useState(education); - - const handleSave = (e: React.FormEvent) => { - e.preventDefault(); - if ( - !data.school || - !data.major || - !data.degree || - !data.startDate || - !data.endDate - ) - return; - onSave(data); + const handleChange = (field: keyof Education, value: string) => { + onSave({ + ...education, + [field]: value + }); }; return ( -
+
- setData((prev) => ({ ...prev, school: value })) - } + value={education.school} + onChange={(value) => handleChange("school", value)} placeholder="学校名称" required /> - setData((prev) => ({ ...prev, location: value })) - } + value={education.location || ""} + onChange={(value) => handleChange("location", value)} placeholder="城市" />
@@ -82,40 +69,33 @@ const EducationEditor: React.FC = ({
setData((prev) => ({ ...prev, major: value }))} + value={education.major} + onChange={(value) => handleChange("major", value)} placeholder="专业名称" required /> - setData((prev) => ({ ...prev, degree: value })) - } + value={education.degree} + onChange={(value) => handleChange("degree", value)} placeholder="学历" required />
- {/* 时间和GPA */}
- setData((prev) => ({ ...prev, startDate: value })) - } + value={education.startDate} + onChange={(value) => handleChange("startDate", value)} type="date" placeholder="YYYY-MM" required /> - setData((prev) => ({ ...prev, endDate: value })) - } + value={education.endDate} + onChange={(value) => handleChange("endDate", value)} type="date" placeholder="YYYY-MM" required @@ -124,37 +104,20 @@ const EducationEditor: React.FC = ({ setData((prev) => ({ ...prev, gpa: value }))} + value={education.gpa || ""} + onChange={(value) => handleChange("gpa", value)} placeholder="选填" /> - {/* 在校经历描述 */} - setData((prev) => ({ ...prev, description: value })) - } + value={education.description} + onChange={(value) => handleChange("description", value)} type="editor" placeholder="描述你的在校表现、获奖经历等..." />
- -
- -
- +
); }; @@ -271,7 +234,6 @@ const EducationItem = ({ education }: { education: Education }) => { "dark:hover:border-indigo-600" )} > - {/* 拖拽手柄区域 */}
{ if (expandedId === education.id) return; @@ -295,7 +257,6 @@ const EducationItem = ({ education }: { education: Education }) => { />
- {/* 内容区域 */}
{ /> { - updateEducation(updatedEducation); - setExpandedId(null); - }} + onSave={updateEducation} onDelete={() => { deleteEducation(education.id); setExpandedId(null); diff --git a/apps/fronted/src/components/editor/experience/ExperienceItem.tsx b/apps/fronted/src/components/editor/experience/ExperienceItem.tsx index 0027fa4..45bf67a 100644 --- a/apps/fronted/src/components/editor/experience/ExperienceItem.tsx +++ b/apps/fronted/src/components/editor/experience/ExperienceItem.tsx @@ -114,67 +114,48 @@ const ProjectEditor: React.FC = ({ experience, onSave }) => { - const theme = useResumeStore((state) => state.theme); - const [data, setData] = useState(experience); - - const handleSave = (e: React.FormEvent) => { - e.preventDefault(); - if (!data.company || !data.position || !data.date) return; - onSave(data); + const handleChange = (field: keyof Experience, value: string) => { + onSave({ + ...experience, + [field]: value + }); }; return ( -
+
- setData((prev) => ({ ...prev, company: value })) - } + value={experience.company} + onChange={(value) => handleChange("company", value)} placeholder="项目名称" required /> - setData((prev) => ({ ...prev, position: value })) - } + value={experience.position} + onChange={(value) => handleChange("position", value)} placeholder="如:前端工程师" required />
setData((prev) => ({ ...prev, date: value }))} + value={experience.date} + onChange={(value) => handleChange("date", value)} placeholder="如:2023.01 - 2023.06" required /> setData((prev) => ({ ...prev, details: value }))} + value={experience.details} + onChange={(value) => handleChange("details", value)} type="editor" placeholder="简要描述项目的背景和目标..." />
-
- -
- +
); }; @@ -219,7 +200,6 @@ const ExperienceItem = ({ experience }: { experience: Experience }) => { "dark:hover:border-indigo-600" )} > - {/* 拖拽手柄区域 */}
{ if (expandedId === experience.id) return; @@ -250,7 +230,6 @@ const ExperienceItem = ({ experience }: { experience: Experience }) => { />
- {/* 内容区域 */}
{ /> { - updateExperience(updatedData); - setExpandedId(null); - }} + onSave={updateExperience} onDelete={() => { deleteExperience(experience.id); setExpandedId(null); diff --git a/apps/fronted/src/components/editor/project/ProjectItem.tsx b/apps/fronted/src/components/editor/project/ProjectItem.tsx index 7908e85..378d905 100644 --- a/apps/fronted/src/components/editor/project/ProjectItem.tsx +++ b/apps/fronted/src/components/editor/project/ProjectItem.tsx @@ -122,65 +122,69 @@ const DeleteConfirmDialog: React.FC = ({ }; const ProjectEditor: React.FC = ({ project, onSave }) => { - const theme = useResumeStore((state) => state.theme); - const [data, setData] = useState(project); - - const handleSave = (e: React.FormEvent) => { - e.preventDefault(); - if (!data.name || !data.role || !data.date) return; - onSave(data); + const handleChange = (field: keyof Project, value: string) => { + onSave({ + ...project, + [field]: value + }); }; return ( -
+
setData((prev) => ({ ...prev, name: value }))} + value={project.name} + onChange={(value) => handleChange("name", value)} placeholder="项目名称" required /> setData((prev) => ({ ...prev, role: value }))} + value={project.role} + onChange={(value) => handleChange("role", value)} placeholder="如:前端负责人" required />
setData((prev) => ({ ...prev, date: value }))} + value={project.date} + onChange={(value) => handleChange("date", value)} placeholder="如:2023.01 - 2023.06" required /> - setData((prev) => ({ ...prev, description: value })) - } + value={project.description} + onChange={(value) => handleChange("description", value)} type="editor" placeholder="简要描述项目的背景和目标..." /> + handleChange("technologies", value)} + type="editor" + placeholder="使用的技术栈和工具..." + /> + handleChange("responsibilities", value)} + type="editor" + placeholder="在项目中的主要职责..." + /> + handleChange("achievements", value)} + type="editor" + placeholder="项目取得的成果..." + />
-
- -
- +
); }; @@ -353,7 +357,6 @@ const ProjectItem = ({ project }: { project: Project }) => { project={project} onSave={(updatedProject) => { updateProjects(updatedProject); - setExpandedId(null); }} onDelete={() => { deleteProject(project.id); diff --git a/apps/fronted/src/components/preview/ExperienceSection.tsx b/apps/fronted/src/components/preview/ExperienceSection.tsx index e9a03d1..f933120 100644 --- a/apps/fronted/src/components/preview/ExperienceSection.tsx +++ b/apps/fronted/src/components/preview/ExperienceSection.tsx @@ -62,15 +62,14 @@ export function ExperienceSection({ {exp.date}
-

- {exp.details} -

+ dangerouslySetInnerHTML={{ __html: exp.details }} + />
) )}