PosterGenius大概的项目流程如下:
- 首先,用户上传一篇pdf格式的论文
- 通过调用deepseek的API来对pdf进行解析
- 将解析后得到的数据传入给其他两个大模型,一个负责生成poster的背景图片,一个生成poster的layout
- 最后只需要添加背景图片,按照layout生成html标签,再将提取的关键信息填入对应的标签即可
为了实现上述功能,我们需要一个类似的前端模板,为此,我们在GitHub上找到了一个生成简历的项目OpenResume,下面我将对这个项目进行简要的介绍
OpenResume项目定位
OpenResume 是一款开箱即用的开源简历解决方案,致力于提供:
- 现代化专业简历设计
- 智能简历解析能力
- 完全免费的隐私优先服务
通过消除简历制作的技术门槛,帮助全球求职者高效打造符合ATS系统的专业简历
核心代码介绍
OpenResume主要由以下几个页面组成,主页、简历导入页面、简历编辑页面
Home Page
import { Hero } from "home/Hero";
import { Steps } from "home/Steps";
import { Features } from "home/Features";
import { Testimonials } from "home/Testimonials";
import { QuestionsAndAnswers } from "home/QuestionsAndAnswers";
export default function Home() {
return (
<main className="mx-auto max-w-screen-2xl bg-dot px-8 pb-32 text-gray-900 lg:px-12">
<Hero />
<Steps />
<Features />
<Testimonials />
<QuestionsAndAnswers />
</main>
);
}
这段代码是 OpenResume 项目的核心页面组件,采用现代化 Web 开发范式构建,完整呈现了简历生成工具的核心价值主张。作为单页应用(SPA)的入口视图,其设计遵循原子化组件原则,通过模块化架构将复杂页面解耦为五个语义明确的独立单元:
-
首屏展示区(Hero)
承担第一视觉传达,通常包含动态简历预览、核心功能按钮(如"立即创建")和品牌标语,通过大字号标题与对比色按钮引导用户关键操作,配合微交互动效实现沉浸式初体验。 -
操作流程导引(Steps)
采用三步走线性结构(选择模板-填写内容-下载PDF),运用数字徽章和进度指示器可视化操作路径,通过卡片式布局配合悬停缩放效果,降低用户认知负荷。 -
差异化功能矩阵(Features)
以 3×2 网格系统展示技术亮点(如 ATS 优化、多语言支持、云同步等),每个功能点采用图标+文字描述形式,适配响应式断点实现移动端堆叠排列,运用渐变色边框和阴影深度强化视觉层次。 -
社会认同模块(Testimonials)
采用轮播图或瀑布流形式呈现用户评价,集成Star Rating组件与真实用户头像,通过引述框设计增强可信度,潜在集成CMS实现内容动态拉取。 -
决策障碍消除(QuestionsAndAnswers)
折叠式FAQ组件实现内容渐进披露,运用Schema标记增强SEO,问题分类导航与即时搜索功能提升交互效率,每个答案区集成分享按钮促进内容传播。主页效果如下图所示
Resume-Import Page
return (
<main>
<div className="mx-auto mt-14 max-w-3xl rounded-md border border-gray-200 px-10 py-10 text-center shadow-md">
{!hasUsedAppBefore ? (
<>
<h1 className="text-lg font-semibold text-gray-900">
Import data from an existing resume
</h1>
<ResumeDropzone
onFileUrlChange={onFileUrlChange}
className="mt-5"
/>
{!hasAddedResume && (
<>
<OrDivider />
<SectionWithHeadingAndCreateButton
heading="Don't have a resume yet?"
buttonText="Create from scratch"
/>
</>
)}
</>
) : (
<>
{!hasAddedResume && (
<>
<SectionWithHeadingAndCreateButton
heading="You have data saved in browser from prior session"
buttonText="Continue where I left off"
/>
<OrDivider />
</>
)}
<h1 className="font-semibold text-gray-900">
Override data with a new resume
</h1>
<ResumeDropzone
onFileUrlChange={onFileUrlChange}
className="mt-5"
/>
</>
)}
</div>
</main>
);
这段代码实现了一个 智能化的简历数据导入网关,采用渐进式交互设计引导用户完成简历创建路径选择。作为应用的核心入口节点,其技术实现融合了状态驱动渲染、无障碍交互和防御性编程思想,通过双重状态变量(hasUsedAppBefore和hasAddedResume)构建四象限渲染逻辑:
- 新用户初次访问
- 展示核心功能引导双通道:ResumeDropzone(PDF解析) + Create from scratch(空白创建)
- 视觉动线采用 Z 型布局:标题 → 拖放区 → 分隔线 → 创建按钮,符合尼尔森 F 型阅读模式
- 老用户未完成编辑
- 优先高亮显示「继续编辑」提示,通过「浏览器存储」关键词唤醒用户认知
- 保留覆盖上传能力作为次级选项,避免操作路径断裂
- 全局状态容错机制
- hasAddedResume状态校验防止重复渲染选项,确保逻辑互斥性
- 空状态边界条件处理(未上传/未存储)均有兜底界面
简历导入页面效果如下:
Resume-Builder Page
"use client";
import { Provider } from "react-redux";
import { store } from "lib/redux/store";
import { ResumeForm } from "components/ResumeForm";
import { Resume } from "components/Resume";
export default function Create() {
return (
<Provider store={store}>
<main className="relative h-full w-full overflow-hidden bg-gray-50">
<div className="grid grid-cols-3 md:grid-cols-6">
<div className="col-span-3">
<ResumeForm />
</div>
<div className="col-span-3">
<Resume />
</div>
</div>
</main>
</Provider>
);
}
这段代码构建了 简历编辑器的核心交互空间,采用 Redux 单向数据流架构实现跨组件状态同步,形成具备专业级交互的实时预览系统。同时实现了组件级交互设计如下
-
表单编辑器 (ResumeForm)
-
模块化表单结构:个人信息、工作经历、教育背景等可折叠面板
-
实时验证反馈:邮箱格式校验、日期范围冲突检测等
-
富文本编辑:集成 draft-js 实现加粗/斜体等格式控制
-
-
简历预览器 (Resume)
-
支持多模板切换:通过 URL 参数动态加载不同 TemplateComponent
-
分页导航:PDF 页码指示器与滚动同步
-
导出功能:调用 jspdf 生成印刷级 PDF/A 格式文件
-
-
双向数据绑定
// 在 ResumeForm 组件内
const personalInfo = useAppSelector(selectPersonalInfo);
const dispatch = useAppDispatch();
const handleChange = (e) => {
dispatch(updatePersonalInfo({ [e.target.name]: e.target.value }));
};
简历编辑页面效果如下
以上就是对该项目的简要介绍,后续会将这个项目作为我们的前端模板,在这个模板基础上进行修改,具体项目请见xitanggg/open-resume: OpenResume is a powerful open-source resume builder and resume parser. https://open-resume.com/ (github.com)