分享一下我开发第一个完整网站的过程(全部依靠ai完成)

各位佬友好,分享一下纯小白开发网站的过程,之前有做过几个网站练手,基本都是纯前端,这是第一个有完整前后端的网站
网站名: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提问回答完成

核心功能分解:

  1. 用户认证 (Firebase Authentication):
    • 用户必须通过 Firebase 登录(例如邮箱/密码或其他方式)才能使用。
    • 目的是区分用户身份,并将用户与他们所属的共享列表关联起来。
  2. 共享列表创建与加入:
    • 列表模型: 每个“列表”本质上是一个二人共享空间。
    • 创建: 已登录用户 A 可以创建一个新的共享空间。创建时,系统需要生成一个唯一的、可共享的链接或ID。此时,列表只包含用户 A。
    • 加入: 用户 A 将生成的链接分享给用户 B。用户 B(必须也已登录)访问该链接或输入该 ID。系统验证链接有效性,并将用户 B 添加到这个共享空间中。一个共享空间最多只能有两个人(创建者和加入者)。一旦两人满员,该链接可能失效或不允许第三人加入。
  3. 待办事项管理 (Firestore):
    • 单一列表: 在一个确定的二人共享空间内,只有一个待办事项列表。
    • 完全共享: 空间内的两个用户都可以查看、添加、编辑、标记完成、删除列表中的所有待办事项。权限完全对等。
    • 数据结构: 每个待办事项只需要包含:
      • 任务文本 (String)
      • 完成状态 (Boolean)
      • (建议:创建时间戳 Timestamp,用于排序)
      • (建议:创建者 UserID,虽然权限对等,但有时知道谁创建的可能有用)

关键约束与简化:

  • 用户数量: 严格限制为两人共享。
  • 列表数量: 每个配对的用户组合共享一个列表。
  • 权限: 无复杂的角色区分,两人权限完全相同。
  • 功能: 只包含最核心的待办事项 CRUD (创建、读取、更新、删除) 和完成状态切换。没有截止日期、优先级、分配等额外功能。
  • 目标: 主要目的是技术实践,而非功能复杂性。

cursor提示词:

角色与目标

你是一位资深的前端开发工程师,精通 ReactJS、JavaScript、TypeScript、HTML、CSS 以及现代 UI/UX 框架(特别是 TailwindCSS)。你的任务是协助我使用 ReactFirebase(包括 Authentication 和 Firestore)构建一个简单的共享待办事项(Todo List)应用程序,并完全使用 TailwindCSS 进行样式设计。

这个应用的核心概念是一个极简的双人待办事项列表,通过唯一的 ID/链接进行共享。

核心需求与约束

  1. 双用户限制: 每个共享列表空间严格限制为只有两个用户:创建者和一位通过唯一 ID 加入的用户。
  2. 链接/ID 共享: 共享方式是创建者分享为列表空间生成的唯一 ID。第二个用户通过输入此 ID 加入。
  3. 权限对等: 一旦两个用户进入共享空间,双方都拥有完全相同的权限,可以添加、查看、编辑、标记完成/未完成以及删除该共享列表中的任何待办事项。
  4. Firebase 后端:
    • 使用 Firebase Authentication 进行用户登录/注册(本项目练习使用简单的邮箱/密码方式即可)。用户必须登录才能使用应用。
    • 使用 Cloud Firestore 存储:
      • 每个共享“空间”的信息(包括两个成员的 userId 和唯一的 shareId)。
      • 属于每个空间的待办事项。
    • 构思基本的 Firestore 安全规则(目前用伪代码或文字描述即可,重点先放在应用逻辑上),确保只有空间成员可以访问其数据,并强制执行双用户限制。
  5. 简单的待办事项: 每个待办事项仅需要:
    • 任务描述文本 (string)。
    • 完成状态 (boolean)。
    • (隐式/推荐:创建时间戳用于排序)。
    • 不需要截止日期、优先级、任务分配等额外字段。
  6. 每对用户单一列表: 用户不管理多个列表。一旦用户加入了一个双人空间,他们主要就与这一个共享列表交互。(我们需要一个机制来处理用户尝试创建/加入另一个空间的情况)。
  7. 实时更新: 待办事项列表必须使用 Firestore 的 onSnapshot 功能为两个用户实时更新
  8. 项目焦点: 这是一个练习项目。优先考虑核心功能的清晰、可工作的代码,而不是复杂的边缘情况或高级 UI 元素。

开发计划(按步骤思考)

首先,请用伪代码或详细步骤概述你的组件和逻辑计划:

  1. Firebase 设置: 假设已存在 firebaseConfig.js 文件,并且它导出了已初始化的 authdb 实例(最好使用环境变量配置)。
  2. 用户认证:
    • 用于登录注册的 React 组件(使用 Firebase Auth 邮箱/密码)。
    • 全局管理用户认证状态的逻辑(例如,使用 React Context 或简单的状态管理方法)。
  3. 主应用流程(登录后):
    • 检查当前登录用户是否已在 Firestore 中属于一个已激活的双人空间
    • 如果是: 显示该空间的 TodoList 组件。
    • 如果否: 显示一个“仪表盘”或“初始页”组件,包含:
      • 一个“创建新共享空间”的选项/按钮。
      • 一个“使用 ID 加入已有空间”的输入框 + 按钮。
  4. 创建空间:
    • 点击“创建”时:
      • 生成一个唯一的、难以猜测的 shareId
      • 在 Firestore 的 spaces 集合中创建一个新文档。存储 shareId、创建者的 userId(放入 members 数组中),以及一个状态(例如 'waiting')。
      • 向创建者显示生成的 shareId,以便他们分享。
      • (可选)更新 UI 显示“等待伙伴加入…”
  5. 加入空间:
    • 用户输入 shareId 并点击“加入”。
    • 查询 Firestore 中具有该 shareId 的空间。
    • 验证:空间是否存在?状态是否为 'waiting'?当前是否只有一个成员?
    • 如果有效: 将当前用户的 userId 添加到 members 数组,并将状态更新为 'active'。重定向/更新 UI 以显示 TodoList 组件。
    • 如果无效(未找到、已满员等): 显示错误消息。
  6. 待办事项列表组件 (TodoList):
    • 接收活动的 spaceId 作为 prop 或从 context 获取。
    • 提供输入框和“添加”按钮来创建新的待办事项。将新的待办事项文档添加到 Firestore 中,并与 spaceId 关联。
    • 使用 onSnapshot 获取并显示当前 spaceId 的待办事项列表,以实现实时更新(按时间戳排序)。
    • 为每个待办事项渲染单独的 TodoItem 组件。
  7. 待办事项组件 (TodoItem):
    • 显示待办事项文本。
    • 提供复选框或按钮来切换 completed 状态(更新 Firestore 中的文档)。
    • 提供删除按钮(从 Firestore 中移除文档)。

代码实现指南

现在,请使用 React 函数式组件和 Hooks 编写代码。请严格遵守以下规则:

  • 使用 React 函数式组件和 Hooks (useState, useEffect, useContext 等)。
  • 完全使用 TailwindCSS 类进行所有样式设计。 不使用自定义 CSS 文件、<style> 标签或内联样式。
  • 使用描述性的名称 命名变量、函数(遵循 handleEvent 约定)和组件。
  • 实现可访问性 (Accessibility): 确保交互元素(按钮、输入框、复选框、列表项等)具有适当的属性(aria-labeltabindex、对于非原生交互元素使用 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的搬运工,如果各位佬友有什么建议还请尽管提出 :face_blowing_a_kiss:

80 个赞

感觉很厉害 :melting_face:

1 个赞

学习整合能力很强呀 爆赞

1 个赞

佬友厉害

1 个赞

不错不错

1 个赞

这提示词工程也得费一番脑力。

2 个赞

大佬太强了!

1 个赞

有点意思 mark了

1 个赞

这个是我提出自己的需求然后让gemini生成的,ai给的提示词肯定比我自己写的强 :wink:

1 个赞

谢谢佬友 :wink:

赞,提供了很好的参考

1 个赞

厉害了佬友

1 个赞

不错哦0

1 个赞

感谢佬友分享

1 个赞

很强大!不过,个人不建议太依赖ai,对于自身提高不大,甚至有反作用。尽量自己完成,ai,我的定位是尽量当做一个模板来用,在自己熟悉过程,不想重复的时候,让ai去完成,而不是让ai来思考怎么实现。个人观点:ai辅助编程会火一时,待降温后,会坑一大批初级程序员。

4 个赞

ai提示词不错

1 个赞

再把待办加密,就可以做成加密聊天软件 :smiling_face_with_sunglasses:

1 个赞

强的强的,怎么调教cursor啊

1 个赞

厉害了啊佬 :innocent: :bili_052:

1 个赞

好厉害!我也是纯前端,学习一下 :bili_081:

1 个赞