面向独立开发者的创意验证工具。发布你的产品点子,让真实用户从 5 个维度帮你打分。
- Nuxt 3 — Vue 全栈框架
- Supabase — 数据库 + 认证 + 文件存储
- Tailwind CSS — 样式
- Pinia — 状态管理
- Lucide Icons — 图标
- 去 supabase.com 注册,创建一个新项目
- 记录下
Project URL和anon public key(在 Settings > API 中)
在 Supabase Dashboard 的 SQL Editor 中,粘贴运行 supabase/migrations/001_init.sql 的全部内容。
在 Supabase Dashboard > Storage 中:
- 点 "New bucket",名称填
covers,勾选 Public bucket - 在该 bucket 的 Policies 中添加:
- INSERT:Target roles =
authenticated - SELECT:Target roles = 空(所有人可访问)
- INSERT:Target roles =
在 Supabase Dashboard > Authentication > Providers 中:
- 确保 Email 已启用
- 关闭 "Confirm email"(或保持开启,Magic Link 默认会走确认流程)
- 在 URL Configuration 中将
Site URL设为你的域名(本地开发设为http://localhost:3000) - 将
http://localhost:3000/confirm添加到 Redirect URLs
# 克隆项目
git clone <your-repo>
cd ideavote
# 安装依赖
npm install
# 配置环境变量
cp .env.example .env
# 编辑 .env,填入你的 Supabase URL 和 Key
# 启动开发服务器
npm run dev# 安装 Vercel CLI
npm i -g vercel
# 部署
vercel
# 在 Vercel Dashboard 中配置环境变量:
# NUXT_PUBLIC_SUPABASE_URL
# NUXT_PUBLIC_SUPABASE_ANON_KEY
# NUXT_PUBLIC_SITE_URL (你的域名)ideavote/
├── app.vue # 根组件,初始化用户状态
├── nuxt.config.ts # Nuxt 配置
├── tailwind.config.ts # Tailwind 配置(Linear 风)
├── assets/css/main.css # 全局样式 + CSS 变量
├── plugins/
│ └── supabase.ts # Supabase 客户端(全局单例)
├── composables/
│ └── useSupabase.ts # 简化 Supabase 访问
├── stores/
│ └── user.ts # Pinia 用户状态(登录/登出/profile)
├── utils/
│ └── index.ts # cn() + formatRelativeTime()
├── components/
│ ├── AppNav.vue # 顶部导航
│ ├── IdeaCard.vue # 创意卡片(首页列表用)
│ ├── StarRating.vue # 5 星评分组件(核心)
│ ├── UiButton.vue # 按钮
│ ├── UiInput.vue # 输入框
│ └── UiTextarea.vue # 多行文本
├── layouts/
│ └── default.vue # 默认布局
├── pages/
│ ├── index.vue # 首页 Feed
│ ├── login.vue # 邮箱 Magic Link 登录
│ ├── confirm.vue # Magic Link 回调
│ ├── new.vue # 发布创意
│ ├── ideas/
│ │ └── [id].vue # 创意详情 + 投票 + 评论
│ ├── me.vue # 我的(发布/投票)
│ └── about.vue # 关于 + 免责声明
└── supabase/
└── migrations/
└── 001_init.sql # 数据库 schema(4 张表)
- profiles — 用户档案(auth.users 的扩展,注册时自动创建)
- ideas — 创意(标题/简介/描述/封面)
- votes — 投票(5 维度评分 + 文字反馈,每人每创意一票)
- comments — 评论(一级评论)
投票/评论的 count 和 avg 通过 PostgreSQL 触发器自动维护,不需要手动更新。
- 不能给自己投票:数据库层有触发器拦截
- 一人一票:votes 表有
unique (idea_id, user_id)约束 - RLS 已启用:所有表都有行级安全策略,不怕客户端直连
- 图片上传:走 Supabase Storage 的
coversbucket,5MB 限制在前端校验
MIT