各位佬友好,分享一下纯小白开发网站的过程,之前有做过几个网站练手,基本都是纯前端,这是第一个有完整前后端的网站
网站名:todo-share
点子:
和Gemini对话挑选得出:练手,尽可能避免复杂后端,可供vercel部署
后端准备:
平台:firebase(免费额度)
添加项目-添加web应用(保存firebaseconfig对象的代码-**Build > Firestore Database-**创建数据库(生产模式,更安全)-择一个离目标用户最近的 Cloud Firestore 位置-进入 **Build > Authentication-**登陆方法(大陆的手机验证很可能失效,使用邮箱验证)
环境部署:本地安装nodejs:npx create-next-app@lastest xxx
本地安装firebase SDK:npm install firebase
任务定位:
一个极简的、基于链接共享的、双人待办事项协作工具
任务描述:
基于和Gemini提问回答完成
核心功能分解:
- 用户认证 (Firebase Authentication):
- 用户必须通过 Firebase 登录(例如邮箱/密码或其他方式)才能使用。
- 目的是区分用户身份,并将用户与他们所属的共享列表关联起来。
- 共享列表创建与加入:
- 列表模型: 每个“列表”本质上是一个二人共享空间。
- 创建: 已登录用户 A 可以创建一个新的共享空间。创建时,系统需要生成一个唯一的、可共享的链接或ID。此时,列表只包含用户 A。
- 加入: 用户 A 将生成的链接分享给用户 B。用户 B(必须也已登录)访问该链接或输入该 ID。系统验证链接有效性,并将用户 B 添加到这个共享空间中。一个共享空间最多只能有两个人(创建者和加入者)。一旦两人满员,该链接可能失效或不允许第三人加入。
- 待办事项管理 (Firestore):
- 单一列表: 在一个确定的二人共享空间内,只有一个待办事项列表。
- 完全共享: 空间内的两个用户都可以查看、添加、编辑、标记完成、删除列表中的所有待办事项。权限完全对等。
- 数据结构: 每个待办事项只需要包含:
- 任务文本 (String)
- 完成状态 (Boolean)
- (建议:创建时间戳 Timestamp,用于排序)
- (建议:创建者 UserID,虽然权限对等,但有时知道谁创建的可能有用)
关键约束与简化:
- 用户数量: 严格限制为两人共享。
- 列表数量: 每个配对的用户组合共享一个列表。
- 权限: 无复杂的角色区分,两人权限完全相同。
- 功能: 只包含最核心的待办事项 CRUD (创建、读取、更新、删除) 和完成状态切换。没有截止日期、优先级、分配等额外功能。
- 目标: 主要目的是技术实践,而非功能复杂性。
cursor提示词:
角色与目标
你是一位资深的前端开发工程师,精通 ReactJS、JavaScript、TypeScript、HTML、CSS 以及现代 UI/UX 框架(特别是 TailwindCSS)。你的任务是协助我使用 React 和 Firebase(包括 Authentication 和 Firestore)构建一个简单的共享待办事项(Todo List)应用程序,并完全使用 TailwindCSS 进行样式设计。
这个应用的核心概念是一个极简的双人待办事项列表,通过唯一的 ID/链接进行共享。
核心需求与约束
- 双用户限制: 每个共享列表空间严格限制为只有两个用户:创建者和一位通过唯一 ID 加入的用户。
- 链接/ID 共享: 共享方式是创建者分享为列表空间生成的唯一 ID。第二个用户通过输入此 ID 加入。
- 权限对等: 一旦两个用户进入共享空间,双方都拥有完全相同的权限,可以添加、查看、编辑、标记完成/未完成以及删除该共享列表中的任何待办事项。
- Firebase 后端:
- 使用 Firebase Authentication 进行用户登录/注册(本项目练习使用简单的邮箱/密码方式即可)。用户必须登录才能使用应用。
- 使用 Cloud Firestore 存储:
- 每个共享“空间”的信息(包括两个成员的
userId和唯一的shareId)。 - 属于每个空间的待办事项。
- 每个共享“空间”的信息(包括两个成员的
- 构思基本的 Firestore 安全规则(目前用伪代码或文字描述即可,重点先放在应用逻辑上),确保只有空间成员可以访问其数据,并强制执行双用户限制。
- 简单的待办事项: 每个待办事项仅需要:
- 任务描述文本 (string)。
- 完成状态 (boolean)。
- (隐式/推荐:创建时间戳用于排序)。
- 不需要截止日期、优先级、任务分配等额外字段。
- 每对用户单一列表: 用户不管理多个列表。一旦用户加入了一个双人空间,他们主要就与这一个共享列表交互。(我们需要一个机制来处理用户尝试创建/加入另一个空间的情况)。
- 实时更新: 待办事项列表必须使用 Firestore 的
onSnapshot功能为两个用户实时更新。 - 项目焦点: 这是一个练习项目。优先考虑核心功能的清晰、可工作的代码,而不是复杂的边缘情况或高级 UI 元素。
开发计划(按步骤思考)
首先,请用伪代码或详细步骤概述你的组件和逻辑计划:
- Firebase 设置: 假设已存在
firebaseConfig.js文件,并且它导出了已初始化的auth和db实例(最好使用环境变量配置)。 - 用户认证:
- 用于登录和注册的 React 组件(使用 Firebase Auth 邮箱/密码)。
- 全局管理用户认证状态的逻辑(例如,使用 React Context 或简单的状态管理方法)。
- 主应用流程(登录后):
- 检查当前登录用户是否已在 Firestore 中属于一个已激活的双人空间。
- 如果是: 显示该空间的
TodoList组件。 - 如果否: 显示一个“仪表盘”或“初始页”组件,包含:
- 一个“创建新共享空间”的选项/按钮。
- 一个“使用 ID 加入已有空间”的输入框 + 按钮。
- 创建空间:
- 点击“创建”时:
- 生成一个唯一的、难以猜测的
shareId。 - 在 Firestore 的
spaces集合中创建一个新文档。存储shareId、创建者的userId(放入members数组中),以及一个状态(例如'waiting')。 - 向创建者显示生成的
shareId,以便他们分享。 - (可选)更新 UI 显示“等待伙伴加入…”
- 生成一个唯一的、难以猜测的
- 点击“创建”时:
- 加入空间:
- 用户输入
shareId并点击“加入”。 - 查询 Firestore 中具有该
shareId的空间。 - 验证:空间是否存在?状态是否为
'waiting'?当前是否只有一个成员? - 如果有效: 将当前用户的
userId添加到members数组,并将状态更新为'active'。重定向/更新 UI 以显示TodoList组件。 - 如果无效(未找到、已满员等): 显示错误消息。
- 用户输入
- 待办事项列表组件 (
TodoList):- 接收活动的
spaceId作为 prop 或从 context 获取。 - 提供输入框和“添加”按钮来创建新的待办事项。将新的待办事项文档添加到 Firestore 中,并与
spaceId关联。 - 使用
onSnapshot获取并显示当前spaceId的待办事项列表,以实现实时更新(按时间戳排序)。 - 为每个待办事项渲染单独的
TodoItem组件。
- 接收活动的
- 待办事项组件 (
TodoItem):- 显示待办事项文本。
- 提供复选框或按钮来切换
completed状态(更新 Firestore 中的文档)。 - 提供删除按钮(从 Firestore 中移除文档)。
代码实现指南
现在,请使用 React 函数式组件和 Hooks 编写代码。请严格遵守以下规则:
- 使用 React 函数式组件和 Hooks (
useState,useEffect,useContext等)。 - 完全使用 TailwindCSS 类进行所有样式设计。 不使用自定义 CSS 文件、
<style>标签或内联样式。 - 使用描述性的名称 命名变量、函数(遵循
handleEvent约定)和组件。 - 实现可访问性 (Accessibility): 确保交互元素(按钮、输入框、复选框、列表项等)具有适当的属性(
aria-label、tabindex、对于非原生交互元素使用onKeyDown等键盘事件处理器)。 - 优先使用
const定义函数:const MyComponent = () => { ... }。如果使用 TypeScript,请添加类型定义(但如果为了简单起见,使用 JS 也可以)。 - 遵循 DRY 原则: 避免重复代码。在适当的地方创建可复用的组件。
- 包含所有必需的导入。
- 代码完整性: 实现所有描述的核心逻辑。不要留下 TODO 或占位符。确保组件间正确交互。
- 可读性优先: 优先编写清晰易读的代码。在能提高清晰度的地方使用提前返回 (early returns)。
请先概述计划,然后开始编写 React 组件和 Firebase 交互逻辑。
cursorrules
cursorrules.txt (2.1 KB)
文件名改为 .cursorrules 存放在项目根目录以供cursor遵守
把以上这些东西全部丢给cursor
调试:
先在本地配置.env.local变量用于调试,更新相关文件,运行
基本元素没有问题,但是注册后显示创建共享空间出现问题,把控制台的错误信息给cursor,得知要配置firebase的Cloud Firestore的开发规则
第二个问题是本地开发没有可以共享的对象,询问Gemini后决定使用 localtunnel将本地服务临时暴露到公网上让朋友访问测试
但是暴露后的url由于localtunnel的验证问题无法通过访问,决定使用ngrok
这次很顺利,朋友登录以后显示如下:
把报错丢给cursor后得知是firebase的索引出了问题
配置好以后可以正常使用
之后就是添加一大堆新功能,调试,修改ui
部署
配置gitignore和envexample,上传GitHub,部署到vercel,配置环境变量
配置域名,去cloudflare解析
到这里开发基本就完成了,我也在力所能及的范围做了测试,修复了可见的bug
最后附上网址和仓库,有兴趣的佬友可以来玩玩
https://todo-share.sundries.icu/
在开发的过程中我深感不足,与其说是开发者不如说是ai的搬运工,如果各位佬友有什么建议还请尽管提出 ![]()





