深浅主题切换并持久化到 localStorage,带过渡效果
Portfolio (Ahmedmo-27) — React 作品集模板
作者 Ahmedmo-27
基于 React 与 Vite 的个人作品集网站模板,包含深浅主题、玻璃拟态界面、动画效果,以及由 Express 提供支持的邮件联系表单。
看看你的网站会是什么样
浏览真实页面截图,比较内容排版与手机效果。点击下方缩略图切换,放大查看整页细节。
全部页面与视图 2
截图用于了解视觉与布局,交互效果请以实际项目为准。
值得关注的模板亮点
从已有项目资料中,快速了解它的特点。
玻璃拟态视觉风格与 Framer Motion 动画
Express + Nodemailer 实现的联系表单,含校验、蜜罐与限流
支持通过环境变量接入 Cloudflare R2 公共地址加载媒体资源
生产模式下由 Express 同时提供静态前端与 API
模板详细介绍
这是一个面向开发者个人展示的作品集网站模板,前端使用 React 与 Vite 构建,样式基于 TailwindCSS 与 CSS 变量,动画使用 Framer Motion,图标来自 Lucide React。页面包含 Hero、Projects、Experience、Contact 等区块,支持深浅主题切换并写入 localStorage,布局适配移动端到桌面端。
联系表单由独立的 Express 后端处理,通过 Nodemailer 经 SMTP 发送邮件,表单带校验、蜜罐字段和基础限流。开发时 Vite 开发服务器与 Express 服务同时运行,前端请求 /api/contact 被代理到后端;生产模式下 Express 同时提供 dist/ 静态资源和 API。项目还支持通过环境变量配置 Cloudflare R2 公共地址来加载图片与 PDF,PDF 以内联方式提供。
使用前需自行准备 SMTP 账号并配置 .env,Gmail 需使用应用专用密码。模板以 MIT 许可发布,代码可免费使用、修改和分发,但演示图片、字体、图标等第三方素材以及域名、托管、邮件等外部服务需另行核对许可与费用。
适合你的项目吗?
适用场景
- 开发者搭建个人作品集与简历展示页面
- 需要带邮件通知联系表单的静态站点
- 希望以 React 与 TailwindCSS 快速起步并自行调整内容区块
适合人群
- 熟悉 React 与 Node.js 的前端开发者
- 需要可自行部署的个人作品集项目
- 愿意配置 SMTP 环境变量以启用联系表单的用户
上手与定制指南
结合仓库当前版本的说明,按下面的资料检查内容、配置与运行要求。
- 1
需要 Node.js 18+ 与 npm,安装依赖后运行 npm run dev 可同时启动前端与 Express 服务
- 2
在项目根目录创建 .env,配置 SMTP_HOST、SMTP_PORT、SMTP_USER、SMTP_PASS、CONTACT_TO_EMAIL 等变量
- 3
Gmail 需使用应用专用密码,遇到 smtp_tls_failed 通常与 VPN、代理或杀毒软件的 SSL 检查有关
- 4
生产运行使用 npm run build 后执行 npm run start,npm run preview 仅启动前端预览
- 5
可选设置 VITE_R2_PUBLIC_URL 以从 R2 公共地址加载图片与 PDF
授权与来源资料
使用条件与限制
免费使用 · 保留许可声明本次收录的是公开仓库中采用 MIT 许可的免费版本;免费范围为该版本代码,不代表外部服务或第三方素材免费。
使用时需要遵守
- 允许免费使用、修改、商用和分发该版本代码。
- 分发代码副本或实质性部分时,保留原作者版权声明和完整 MIT 许可声明。
- 代码按现状提供;担保与责任限制以原许可证及适用法律为准。
额外费用与待核对事项
- 演示图片、字体、图标及其他第三方素材需按各自许可核对,不能仅凭代码的 MIT 许可判断。
- 域名、托管、数据库、支付或 AI 等外部服务可能另外收费。
- 使用前需在项目根目录创建 .env 文件并自行配置环境变量,且不应将其提交到版本库。
- 联系表单依赖外部 SMTP 邮件服务,需自行提供 SMTP 主机、端口、账号、密码与收件邮箱,否则后端无法发送邮件。
- 若使用 Gmail,必须使用应用专用密码而非普通账号密码,需额外在 Google 账号中开启并生成。
- 可选配置 VITE_R2_PUBLIC_URL 以从 Cloudflare R2 公共地址加载图片与 PDF,涉及第三方存储服务。
- 后端对联系表单接口施加基于 IP 的限流,频繁提交可能被拒绝。
查看原文依据
Permission is hereby granted, free of charge
许可证原文
Create a `.env` file in the project root (don’t commit it).
README 原文
SMTP_HOST=smtp.gmail.com SMTP_PORT=587 SMTP_SECURE=false [email protected] SMTP_PASS=your_app_password [email protected]
README 原文
For Gmail, use an **App Password** (not your normal password).
README 原文
If set, images/PDFs can be built/loaded from an R2 public base URL
README 原文
https://github.com/Ahmedmo-27/Portfolio/blob/main/LICENSEhttps://github.com/Ahmedmo-27/Portfolio/blob/main/README.mdThe backend applies a small per-IP limit to reduce spam.
README 原文
DeepSeek 根据仓库许可证和 README 整理 ·2026-10-13。结果仅覆盖已读取资料,依赖、图片、字体及后续条款变更以各自原文为准。
项目核对记录与介绍依据
模板资料
- 来源平台
- GitHub
- 资料与维护参考分
- 资料较完整 · 80 / 100
- 技术栈
- React
- 网站类型
- 作品集
这个分数如何计算
本站按许可资料(最高30分)、演示链接(12分)、预览图(10分)、Star数(15分)、记录的维护时间(15分)、描述完整度(8分)、功能记录(5分)和分类资料(5分)计算。它不是代码、安全或性能测试,也不是 Google 评分;有链接不代表已实测可用。
这个项目需要核对什么
- 记录的仓库更新时间
- 2026-08-16
- 截图检查日期
- 2026-10-13
已收录演示链接。请用你的内容与屏幕尺寸检查;有演示不代表表单、认证或支付已经可用。
目录记录的主要技术栈是 React。请通过依赖清单和锁文件核对实际版本与托管要求。这些说明基于收录资料,不代表代码审计或部署实测。
查看具体选型方法 →介绍的制作与核对状态
介绍由 AI 辅助整理目录与仓库资料。仓库作者不等于这篇介绍的审核者。
审核声明: [email protected] · 2026-10-13
查看当时使用的来源资料
SHA-256: 94fa7a8687464fd7954eb2333d74b9c4ae9c07ed309ccf59a4fae4c92b0deb43
2026-10-13T06:52:46.861Z
来源文件 / 仓库# Ahmed Mostafa — Portfolio Website Modern, responsive developer portfolio built with **React 19 + Vite** and a small **Express** backend for the contact form (`POST /api/contact`). ## Tech Stack - **Frontend:** React 19 (JavaScript/JSX), Vite - **Styling:** TailwindCSS + CSS variables - **Animations:** Framer Motion - **Icons:** Lucide React - **Backend:** Express + Nodemailer (SMTP) - **Runtime:** Node.js 18+ (ESM project) ## Features - **Dark/Light mode** with persistence (localStorage) + smooth transitions - **Responsive layout** optimized for mobile → desktop - **SEO-friendly** structure/meta tags - **Contact form** with validation, honeypot, and basic rate-limiting - **Media support** with optional Cloudflare R2 public base URL - **PDFs served inline** (both dev + production) ## Getting Started ### Prerequisites - Node.js 18+ - npm (or yarn/pnpm if you prefer) ### Install ```bash npm install ``` ### Run locally (recommended) This starts **both**: - Vite dev server (frontend) - Express server on `http://localhost:3000` (API) ```bash npm run dev ``` The frontend calls `/api/contact`, which is proxied in dev to the Express server. ### Environment Variables Create a `.env` file in the project root (don’t commit it). ```bash # Backend (Express / Nodemailer) SMTP_HOST=smtp.gmail.com SMTP_PORT=587 SMTP_SECURE=false [email protected] SMTP_PASS=your_app_password [email protected] # Optional: [email protected] SITE_URL=https://your-domain.com BRAND_NAME=Ahmed Mostafa BRAND_LOGO_URL=https://your-domain.com/logo.png # Frontend (Vite) # If set, images/PDFs can be built/loaded from an R2 public base URL VITE_R2_PUBLIC_URL=https://your-public-bucket-domain ``` ## Production ### Build ```bash npm run build ``` ### Run (serves `dist/` + `/api`) In production, the Express server serves the built frontend from `dist/` and handles `/api/contact`. ```bash npm run start ``` ### Note about `npm run preview` `npm run preview` runs Vite’s preview server (frontend only). For a full production-like run (frontend + API), use `npm run build` then `npm run start`. ## Project Structure ``` src/ ├── components/ # UI sections and shared components (.jsx/.css) ├── context/ # Theme provider ├── utils/ # Helpers (animations, asset URL helpers, ...) ├── App.jsx # App composition ├── main.jsx # Entry point └── index.css # Global styles + theme variables server/ ├── mailApi.js # POST /api/contact ├── emailConfig.js # SMTP + brand/contact config from env └── contactEmailTemplate.js # Styled HTML + text email body server.js # Express app (API + serving dist/) ``` ## Customization - **Sections/content:** update components in `src/components/` (e.g. `Hero.jsx`, `Projects.jsx`, `Experience.jsx`, `Contact.jsx`) - **Social links:** typically in `Hero.jsx`, `Contact.jsx`, and `Footer.jsx` - **Theme/styling:** `src/index.css` + Tailwind classes (see `tailwind.config.js`) - **Profile image/static assets:** place files in `public/` and reference them via `/your-file.png` ## Troubleshooting - **`server_not_configured`** - Ensure the required env vars exist: `SMTP_HOST`, `SMTP_PORT`, `SMTP_USER`, `SMTP_PASS`, `CONTACT_TO_EMAIL`. - **`smtp_tls_failed` / “self-signed certificate in certificate chain”** - Usually caused by VPN/corporate proxy/antivirus SSL inspection. Try a different network or disable SSL inspection. - **`smtp_auth_failed`** - For Gmail, use an **App Password** (not your normal password). - **`rate_limited`** - The backend applies a small per-IP limit to reduce spam. ## Notes - Performance docs: `PERFORMANCE_ANALYSIS.md`, `HEAVIEST_COMPONENTS.md` - Deployment entrypoint: `server.js` (see `Procfile`) ## License MIT — see `LICENSE`. ## Author **Ahmed Mostafa** - Email: [email protected] - GitHub: [@ahmedmo-27](https://github.com/ahmedmo-27) - LinkedIn: [Ahmed Mostafa](https://linkedin.com/in/ahmedmostafa-swe)
看看同类模板
对比同技术栈与用途的模板,找到更适合的视觉与内容结构。

react-portfolio-template
React powered portfolio website template for developers
React · 作品集

personal-website-react
personal-website-react 是一个面向开发者的个人作品集单页模板,由 React 和 Material-UI 构建,并通过 Create React App 初始化。
React · 作品集

karngyan.com
karngyan.com 是一个面向开发者的个人网站与博客模板,作者用它搭建了自己的站点,并公开了完整代码。 模板的核心定位很明确:让写作者专注于内容,而不是花时间搭建基础设施。
React · 作品集

react-portfolio-template
react-portfolio-template 是一个由 Ryan Balieiro 开发的 React 作品集模板,定位为“sleek, futuristic”,适合开发者展示个人履历。
React · 作品集

portfolio
Personal website, Data scientist portfolio template
React · 作品集

react-portfolio
react-portfolio 是一个面向开发者的个人作品集模板,基于 React 16 和 Create React App 构建,界面样式采用 Material-UI。
React · 作品集
