🚀 一个 ProductHunt 投票中间页,帮助创作者更好地管理投票流程,让每一票都有价值。
👤 运营人员(无需技术背景)
👨💻 技术人员
📚 通用文档
- 🎯 智能投票管理 - 记录访问和投票统计,提供投票建议
- 📊 实时数据展示 - 显示近期访问人数、投票人数等统计信息
⚠️ 智能警告系统 - 根据投票频率和数量提供等待建议- 📋 任务清单界面 - 引导用户完成投票前的准备工作
- 📱 响应式设计 - 支持桌面和移动设备
- 🎨 现代化 UI - 使用 Tailwind CSS 构建的美观界面
- 🔧 易于配置 - 通过环境变量快速配置产品信息
- 🎉 感谢页面 - 投票后显示个性化感谢页面和优惠信息
- 💾 动态数据存储 - 支持 Vercel KV 数据库和 localStorage 双重模式
- 框架: Next.js 15.4.1
- 样式: Tailwind CSS
- 图标: Lucide React
- 数据存储: Upstash Redis / localStorage
- 部署: Vercel (推荐)
git clone https://github.com/huglemon/hophunt.git
cd hophuntnpm install
# 或
yarn install
# 或
pnpm install编辑 lib/config.js 文件,配置你的产品信息:
export const config = {
// 产品信息
product: {
name: 'Your Product Name',
description: 'Your amazing product description',
logoUrl: '/logo.png',
productUrl: 'https://github.com/huglemon/hothunt',
productHuntUrl: 'https://www.producthunt.com',
},
// 首页文本配置
homepage: {
title: '感谢你来投票',
subtitle: '你的每一票都很珍贵,感谢你愿意为我们的产品投出支持的一票',
},
// 投票建议配置
voting: {
minWaitTime: 300000, // 5分钟 (毫秒)
maxHourlyVotes: 10,
warningThreshold: 5,
},
// 数据库配置
database: {
mode: 'auto', // 'auto' | 'localStorage' | 'database'
dataExpiration: 24, // 数据过期时间(小时)
keyPrefix: 'hophunt:', // 数据库键名前缀
},
// 感谢页面配置
thankYou: {
title: 'Thank you for your support!',
message: 'Your vote means a lot to us!',
couponCode: 'VOTE2024',
couponDiscount: '20% OFF',
couponImage: '/coupon.png', // 可选,如果为空则显示优惠码文本
},
// 任务清单配置
tasks: [
{ id: 1, text: '复制产品名称', completed: true },
{ id: 2, text: '检查近期投票量', completed: false },
],
};HopHunt 支持两种数据存储模式:
- 数据只存储在用户本地浏览器
- 无需额外配置
- 适合测试和小规模使用
- 真正的跨用户数据统计
- 实时同步所有用户的投票数据
- 适合生产环境使用
📊 添加数据库支持(可选)
如果你想要真正的跨用户统计功能,可以添加数据库:
-
在 Vercel 项目中添加数据库
- 进入你的项目设置
- 点击 "Storage" 标签
- 选择 "Create Database" → "KV (Redis)"
- 环境变量会自动添加,无需手动配置
-
不添加数据库也可以正常使用
- 项目会自动使用浏览器本地存储
- 功能完全正常,只是统计数据只对当前用户可见
说明: 项目使用 Upstash Redis 作为数据库,Vercel 会自动配置所有必要的环境变量,你无需手动操作。
npm run dev
# 或
yarn dev
# 或
pnpm dev打开 http://localhost:3000 查看效果。
👆 点击按钮即可快速部署,无需任何技术背景!
- 请保留页面底部的版权信息不变
- 这是使用本项目的必要条件
📋 部署后的简单配置:
-
打开项目设置
- 在 Vercel 控制台找到你的项目
- 点击 "Settings" → "Environment Variables"
-
配置你的产品信息(必需)
💡 快速配置方法:
- 复制下面的环境变量(全选复制)
- 在 Vercel 的 "Environment Variables" 页面直接粘贴
- Vercel 会自动识别并创建多个环境变量
NEXT_PUBLIC_PRODUCT_NAME=你的产品名称 NEXT_PUBLIC_PRODUCT_DESCRIPTION=你的产品描述 NEXT_PUBLIC_PRODUCTHUNT_URL=https://www.producthunt.com/posts/your-product
📝 编辑说明:
- 将
你的产品名称替换为实际的产品名称 - 将
你的产品描述替换为实际的产品描述 - 将
https://your-product-website.com替换为你的产品官网或GitHub仓库链接 - 将
your-product替换为你的 ProductHunt 产品页面链接
-
添加数据库(推荐,实现真正的统计功能)
- 在 Vercel 项目中点击 "Storage" 标签
- 选择 "Create Database" → "KV (Redis)"
- 创建后,环境变量会自动添加,无需手动配置
-
重新部署
- 保存配置后,点击 "Deployments" → "Redeploy"
- 等待部署完成
🎉 完成!你的投票页面就可以使用了!
为了让配置更简单,你可以使用 Vercel 的批量粘贴功能:
Vercel 支持批量粘贴环境变量! 只需复制下面的配置,直接粘贴到 Vercel 即可:
NEXT_PUBLIC_PRODUCT_NAME=你的产品名称
NEXT_PUBLIC_PRODUCT_DESCRIPTION=你的产品描述
NEXT_PUBLIC_PRODUCT_URL=https://your-product-website.com
NEXT_PUBLIC_PRODUCTHUNT_URL=https://www.producthunt.com/posts/your-productNEXT_PUBLIC_HOMEPAGE_TITLE=感谢你来投票
NEXT_PUBLIC_HOMEPAGE_SUBTITLE=你的每一票都很珍贵,感谢你愿意为我们的产品投出支持的一票NEXT_PUBLIC_THANKYOU_TITLE=谢谢你的支持!
NEXT_PUBLIC_THANKYOU_MESSAGE=你的每一票都很珍贵!
NEXT_PUBLIC_COUPON_CODE=VOTE2024
NEXT_PUBLIC_COUPON_DISCOUNT=8折优惠
NEXT_PUBLIC_COUPON_IMAGE=/coupon.pngNEXT_PUBLIC_MIN_WAIT_TIME=300000
NEXT_PUBLIC_MAX_HOURLY_VOTES=10
NEXT_PUBLIC_WARNING_THRESHOLD=5-
复制需要的配置
- 选择上面的配置块(基础配置是必需的)
- 全选复制(Ctrl+A, Ctrl+C 或 Cmd+A, Cmd+C)
-
编辑配置信息
- 将配置中的示例值替换为你的实际信息
- 只需要修改
=后面的值即可
-
粘贴到 Vercel
- 在 Vercel 项目设置的 "Environment Variables" 页面
- 直接粘贴(Ctrl+V 或 Cmd+V)
- Vercel 会自动识别并创建多个环境变量
-
重新部署
- 粘贴完成后,点击 "Redeploy" 重新部署
- 等待部署完成即可
- 一键粘贴:不用逐个添加环境变量
- 自动识别:Vercel 自动解析多行环境变量
- 减少错误:避免手动输入时的拼写错误
- 按需选择:可以只复制需要的配置块
简单方式:重新部署
- 当项目有重要更新时,直接重新点击部署按钮
- 这会创建一个包含最新功能的新版本
高级方式:技术用户专用
点击展开详细步骤
如果你有技术背景,可以使用以下方式获取更新:
-
Fork 方式(推荐)
- Fork 这个项目
- 在 Vercel 中连接你的 Fork 仓库
- 在 GitHub 上点击 "Sync fork" 获取更新
-
Git 命令方式
git remote add upstream https://github.com/huglemon/hophunt.git git fetch upstream git merge upstream/main git push origin main
| 配置方式 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|
| 环境变量 | 一键部署、多环境部署 | 无需修改代码,支持不同环境 | 配置项较多 |
| 直接修改代码 | Fork 后自定义部署 | 配置简单,一目了然 | 需要修改代码 |
| 环境变量 | 说明 | 默认值 |
|---|---|---|
NEXT_PUBLIC_PRODUCT_NAME |
产品名称 | 'HopHunt - 让每一票都有价值' |
NEXT_PUBLIC_PRODUCT_DESCRIPTION |
产品描述 | 'HopHunt 是一个 ProductHunt 投票中间页...' |
NEXT_PUBLIC_LOGO_URL |
Logo URL | '/logo.png' |
NEXT_PUBLIC_PRODUCT_URL |
产品主页链接 | 'https://github.com/huglemon/hophunt' |
NEXT_PUBLIC_PRODUCTHUNT_URL |
ProductHunt 链接 | 'https://www.producthunt.com' |
重要提示:
NEXT_PUBLIC_PRODUCT_URL是你的产品官网或GitHub仓库链接NEXT_PUBLIC_PRODUCTHUNT_URL是你的具体ProductHunt产品页面链接
| 环境变量 | 说明 | 默认值 |
|---|---|---|
NEXT_PUBLIC_HOMEPAGE_TITLE |
首页主标题 | '感谢你来投票' |
NEXT_PUBLIC_HOMEPAGE_SUBTITLE |
首页副标题 | '你的每一票都很珍贵...' |
| 环境变量 | 说明 | 默认值 |
|---|---|---|
NEXT_PUBLIC_MIN_WAIT_TIME |
最小等待时间(毫秒) | 300000 |
NEXT_PUBLIC_MAX_HOURLY_VOTES |
每小时最大投票数 | 10 |
NEXT_PUBLIC_WARNING_THRESHOLD |
警告阈值 | 5 |
| 环境变量 | 说明 | 默认值 |
|---|---|---|
NEXT_PUBLIC_DATABASE_MODE |
数据存储模式 | 'auto' |
NEXT_PUBLIC_DATA_EXPIRATION |
数据过期时间(小时) | 24 |
NEXT_PUBLIC_KEY_PREFIX |
数据库键名前缀 | 'hophunt:' |
KV_REST_API_URL |
Upstash Redis API URL | - |
KV_REST_API_TOKEN |
Upstash Redis API Token | - |
| 环境变量 | 说明 | 默认值 |
|---|---|---|
NEXT_PUBLIC_THANKYOU_TITLE |
感谢页面标题 | '谢谢你的支持!' |
NEXT_PUBLIC_THANKYOU_MESSAGE |
感谢页面消息 | '你的每一票都很珍贵!' |
NEXT_PUBLIC_COUPON_CODE |
优惠券代码 | 'VOTE2024' |
NEXT_PUBLIC_COUPON_DISCOUNT |
优惠券折扣 | '8 折优惠' |
NEXT_PUBLIC_COUPON_IMAGE |
优惠券图片路径 | '/coupon.png' |
优惠券图片说明:
NEXT_PUBLIC_COUPON_IMAGE可以是优惠券图片路径,也可以是微信群二维码等- 如果设置为空字符串,则只显示优惠码文本
- 支持本地图片(如
/coupon.png)或外部图片链接(如https://example.com/coupon.png)
🎯 推荐方式:重新部署
- 当项目有重要更新时,直接重新点击部署按钮
- 这是最简单的方式,适合所有用户
⚙️ 高级方式(技术用户)
点击展开技术细节
如果你有技术背景且需要保持代码同步:
-
Fork 方式
- Fork 项目
- 在 Vercel 中连接 Fork 仓库
- 使用 GitHub 的 "Sync fork" 功能
-
Git 命令方式
git remote add upstream https://github.com/huglemon/hophunt.git git fetch upstream git merge upstream/main git push origin main
- 统计面板 - 显示近 1 小时访问量、投票数和总统计
- 投票建议 - 根据投票频率智能提示等待时间
- 任务清单 - 引导用户完成投票前的准备工作:
- 复制产品名称
- 检查近期投票量
- 切换全局 IP(如需要)
- 前往 ProductHunt 投票
- 一键复制 - 点击复制产品名称到剪贴板
- 延迟跳转 - 点击投票按钮后延迟跳转到 ProductHunt
- 感谢信息 - 个性化的感谢消息
- 优惠券展示 - 显示优惠码和折扣信息
- 一键复制 - 复制优惠码到剪贴板
- 快速导航 - 返回首页或再次访问 ProductHunt
- 智能模式切换 - 自动检测数据库可用性,优雅降级
- 实时统计 - 跨用户的实时投票和访问统计
- 数据过期 - 自动清理过期数据,保持性能
- 错误恢复 - 数据库不可用时自动回退到 localStorage
项目使用 Tailwind CSS,你可以在以下文件中自定义样式:
app/globals.css- 全局样式components/VotingPage.js- 主页面样式components/Footer.js- 底部样式app/thank-you/page.js- 感谢页面样式
// 存储在Vercel KV中的数据结构
{
visits: [timestamp1, timestamp2, ...], // 访问时间戳数组
votes: [timestamp1, timestamp2, ...], // 投票时间戳数组
totalVisits: number, // 总访问数
totalVotes: number, // 总投票数
}- 过期时间: 24 小时(可在 config 中配置)
- 清理机制: 每次 API 调用时自动清理过期数据
- 存储方式: Redis List(时间戳)+ 计数器(总数)
| 配置项 | 说明 | 示例 |
|---|---|---|
product.name |
产品名称,显示在页面标题和导航栏 | 'HopHunt - ProductHunt 投票中间页' |
product.description |
产品描述,用于 SEO | '防止同 IP 大量投票的 ProductHunt 投票中间页' |
product.logoUrl |
产品 Logo URL | '/logo.png' |
product.productUrl |
产品主页链接,用于跳转到产品主页 | 'https://github.com/huglemon/hophunt' |
product.productHuntUrl |
ProductHunt 跳转 URL | 'https://www.producthunt.com' |
homepage.title |
首页主标题 | "感谢你来投票" |
homepage.subtitle |
首页副标题 | "你的每一票都很珍贵,感谢你愿意..." |
voting.minWaitTime |
最小等待时间(毫秒) | 300000 (5 分钟) |
voting.maxHourlyVotes |
每小时最大投票数 | 10 |
voting.warningThreshold |
警告阈值 | 5 |
database.mode |
数据存储模式 | 'auto' | 'localStorage' | 'database' |
database.dataExpiration |
数据过期时间(小时) | 24 |
database.keyPrefix |
数据库键名前缀 | 'hophunt:' |
thankYou.title |
感谢页面标题 | 'Thank you for your support!' |
thankYou.message |
感谢页面消息 | 'Your vote means a lot to us!' |
thankYou.couponCode |
优惠券代码 | 'VOTE2024' |
thankYou.couponDiscount |
优惠券折扣 | '20% OFF' |
thankYou.couponImage |
优惠券图片路径,可以是优惠券图片或微信群二维码等,如果为空则显示优惠码文本 | '/coupon.png' |
tasks |
任务清单配置 | 见下方说明 |
tasks 数组用于配置投票前的任务清单,每个任务包含以下字段:
id: 任务唯一标识符text: 任务显示文本completed: 是否默认完成(true/false)
注意事项:
- 第一个任务通常设置为已完成,因为产品名称会自动复制
- 可以根据需要添加或删除任务
- 任务会按顺序逐个显示,增强用户体验
示例:
tasks: [
{ id: 1, text: '复制产品名称', completed: true },
{ id: 2, text: '检查近期投票量', completed: false },
{ id: 3, text: '切换IP地址', completed: false },
],- Fork 项目
- 创建功能分支 (
git checkout -b feature/AmazingFeature) - 提交更改 (
git commit -m 'Add some AmazingFeature') - 推送到分支 (
git push origin feature/AmazingFeature) - 创建 Pull Request
- 请勿修改或删除
components/Footer.js中的版权信息 - Footer 中的版权声明必须保持完整:
© [年份] HopHunt with ❤️ by DirsHunt | Huglemon - 任何修改或删除 footer 版权信息的 PR 将被拒绝
本项目使用 MIT 许可证,但有一个额外要求:不允许修改或删除 footer 中的版权信息。
特别说明:
- 你可以自由使用、修改、分发本项目
- 但必须保留 footer 组件中的版权信息不变
- 包括:"© [年份] HopHunt with ❤️ by DirsHunt | Huglemon" 及相关链接
- 此要求适用于所有副本、分发和衍生作品
查看 LICENSE 文件了解完整详情。
如果你遇到问题或有建议,请:
- 查看 Issues
- 创建新的 Issue
- 联系作者:hi@huglemon.com / Wechat: YFLowerRed
- Next.js - React 框架
- Tailwind CSS - CSS 框架
- Lucide React - 图标库
- Vercel - 部署平台
- Upstash - Redis 数据库服务
- DirsHunt - 目录导航和发现平台
- DirsHunt Ext - 智能填写导航站表单
- HopHunt - ProductHunt 投票中间页
如果这个项目对你有帮助,欢迎支持作者继续创作更多优质的开源项目!
- ⭐ 给项目点个 Star
- 🐛 提交 Bug 报告和功能建议
- 📝 贡献代码和文档
- 📢 向朋友推荐这个项目
Made with ❤️ by Huglemon
