《7 天 AI + Web3 起步挑战》:Day 7

这是我在「AI+Web3学习交流群」发起《7 天 AI + Web3 起步挑战》后的第 7 天,前 6 天的分享可跳转以下链接前往查看:

这也是我的 7 天挑战的最后一天,目标就是:Demo 展示 & 复盘

回顾下这 7 天来,我具体都做了什么呢?

Day 1

第一天,目标是 用 AI 想一个「能落地」的 Web3 产品 Idea

我分别让 ChatGPT、Gemini、Cursor、Claude 帮我生成多个「7 天内可以做出 Demo」的 Web3 产品 Idea。几个 AI 工具总共给我提供了十几款不同的 Idea,最终我选择了做一款 On-chain Invoice,即链上发票/收款单。这个 Idea 是由 Claude 提供的。

之后,我又让 AI 们帮我想一个产品名字。ChatGPT 对我比较了解,知道我已经有 BlockETFBlockLever 这两个项目,于是,它直接建议我给这个新产品取名为 BlockInvoice,我接受了。

于是,我又顺便去 Godaddy 给新产品注册域名。同样延续了 block-etf.comblock-lever.com 这两个域名的风格,我为新产品注册了 block-invoice.com 这个域名。

到此,第一天的任务就完成了,整个过程不到半个小时。

Day 2

第二天的目标是:把 Idea 拆成一个最小 PRD。其实就是要梳理出 MVP 版本的 PRD 文档。

这一天,我也是将同样的 Prompt 分别喂给了几个不同的 AI,看看哪个的输出最令我满意。最终,还是 Claude Code 生成的 PRD 文档质量最高。

首先,它给出了产品定位如下:

为 Web3 自由职业者和 DAO 提供去中心化、可验证的链上发票解决方案。
核心价值:
- 不可篡改的支付凭证
- 无需中间商的点对点收款
- 公开可验证的发票状态

核心功能就三个:

功能
优先级
描述
MVP 范围
创建发票
🔴 必须
填写金额、收款地址、付款方、到期日,生成链上发票
单币种(USDC)、单条目
链上支付
🔴 必须
付款方扫码/点击链接,连接钱包完成支付,自动更新发票状态
支持主流 EVM 钱包
发票查询
🔴 必须
通过发票 ID 或钱包地址查看发票状态(待支付/已支付/已过期)
只读视图,无需登录

最主要的还是功能详细设计,对三个核心功能都分别列出了页面结构、字段定义、交互流程、错误处理。比如,以下就是创建发票的页面结构:

┌─────────────────────────────────────────────────────────┐
│  [Logo]  BlockInvoice          [Connect Wallet] 🔗      │
├─────────────────────────────────────────────────────────┤
│                                                         │
│  ┌─────────────────────────────────────────────────┐   │
│  │           📄 Create New Invoice                  │   │
│  ├─────────────────────────────────────────────────┤   │
│  │                                                  │   │
│  │  Invoice Title *                                 │   │
│  │  ┌─────────────────────────────────────────┐    │   │
│  │  │ e.g. Website Development - March 2025   │    │   │
│  │  └─────────────────────────────────────────┘    │   │
│  │                                                  │   │
│  │  Description                                     │   │
│  │  ┌─────────────────────────────────────────┐    │   │
│  │  │                                         │    │   │
│  │  │                                         │    │   │
│  │  └─────────────────────────────────────────┘    │   │
│  │                                                  │   │
│  │  ┌──────────────────┐  ┌──────────────────┐     │   │
│  │  │ Amount *         │  │ Token            │     │   │
│  │  │ ┌──────────────┐ │  │ ┌──────────────┐ │     │   │
│  │  │ │ 1000         │ │  │ │ USDC ▼       │ │     │   │
│  │  │ └──────────────┘ │  │ └──────────────┘ │     │   │
│  │  └──────────────────┘  └──────────────────┘     │   │
│  │                                                  │   │
│  │  Payer Wallet Address                           │   │
│  │  ┌─────────────────────────────────────────┐    │   │
│  │  │ 0x... (optional, for private invoice)   │    │   │
│  │  └─────────────────────────────────────────┘    │   │
│  │                                                  │   │
│  │  Due Date *                                      │   │
│  │  ┌─────────────────────────────────────────┐    │   │
│  │  │ 📅 2025-01-20                           │    │   │
│  │  └─────────────────────────────────────────┘    │   │
│  │                                                  │   │
│  │  ┌─────────────────────────────────────────┐    │   │
│  │  │         🚀 Create Invoice               │    │   │
│  │  └─────────────────────────────────────────┘    │   │
│  │                                                  │   │
│  └─────────────────────────────────────────────────┘   │
│                                                         │
└─────────────────────────────────────────────────────────┘

接着,给出了很详细的字段定义如下:

字段
类型
必填
说明
验证规则
title
string
发票标题
最长 100 字符
description
string
发票描述/服务内容
最长 500 字符
amount
number
支付金额
> 0,最多 6 位小数
token
enum
代币类型
MVP 仅支持 USDC
payerAddress
address
指定付款方地址
有效 EVM 地址
dueDate
timestamp
到期时间
必须 > 当前时间
recipientAddress
address
收款方地址
自动填充已连接钱包

之后则是交互流程图:

┌──────────────┐     ┌──────────────┐     ┌──────────────┐     ┌──────────────┐
│   进入页面   │────▶│  连接钱包    │────▶│  填写表单    │────▶│  点击创建    │
└──────────────┘     └──────────────┘     └──────────────┘     └──────┬───────┘
                                                                       │
                                                                       ▼
┌──────────────┐     ┌──────────────┐     ┌──────────────┐     ┌──────────────┐
│  跳转详情页  │◀────│  获取发票ID  │◀────│  交易确认    │◀────│  签名交易    │
└──────────────┘     └──────────────┘     └──────────────┘     └──────────────┘

交互流程图下面还给出了详细的交互步骤说明。

虽然最终实现出来的 UI 页面并不和上面列出的完全一致,但这个详细设计的确为后面的工作提供了很好的素材。

这一天实际用时不到 15 分钟。

Day 3

第三天,我则在已生成的 PRD 文档的基础上,直接让 Claude Code 帮我生成了《前端技术架构文档(TAD v1)》。它生成的 TAD 文档也是质量挺高的,我挺满意。给出了很详细的技术栈概览和项目结构。

技术栈概览:

类别
技术选型
版本
说明
框架
Next.js
14.x
App Router, RSC
语言
TypeScript
5.x
严格模式
样式
Tailwind CSS
3.x
原子化 CSS
组件库
shadcn/ui
latest
可定制组件
Web3
wagmi + viem
2.x
类型安全的以太坊交互
钱包
RainbowKit
2.x
钱包连接 UI
状态管理
Zustand
4.x
轻量级状态管理
表单
React Hook Form + Zod
-
表单验证
数据请求
TanStack Query
5.x
服务端状态缓存
IPFS
Pinata SDK
-
元数据存储

项目结构:

src/
├── app/                          # Next.js App Router
│   ├── layout.tsx                # 根布局 (Providers)
│   ├── (dashboard)/              # 带侧边栏的路由组
│   │   ├── layout.tsx            # Dashboard 布局 (Sidebar + Content)
│   │   ├── page.tsx              # 首页 /
│   │   ├── create/
│   │   │   └── page.tsx          # 创建发票 /create
│   │   ├── invoices/
│   │   │   └── page.tsx          # 发票列表 /invoices
│   │   └── settings/
│   │       └── page.tsx          # 设置页 /settings
│   └── invoice/
│       └── [id]/
│           └── page.tsx          # 发票详情 /invoice/[id] (公开页面,无侧边栏)
│
├── components/
│   ├── ui/                       # shadcn/ui 基础组件
│   │   ├── button.tsx
│   │   ├── input.tsx
│   │   ├── card.tsx
│   │   ├── badge.tsx
│   │   ├── dialog.tsx
│   │   ├── select.tsx
│   │   ├── skeleton.tsx
│   │   ├── toast.tsx
│   │   └── ...
│   │
│   ├── layout/                   # 布局组件
│   │   ├── sidebar.tsx           # 左侧导航栏
│   │   ├── sidebar-nav.tsx       # 导航菜单项
│   │   ├── sidebar-wallet.tsx    # 侧边栏钱包状态
│   │   ├── content-header.tsx    # 内容区顶部(标题 + 操作)
│   │   └── page-container.tsx    # 页面内容容器
│   │
│   ├── wallet/                   # 钱包相关
│   │   ├── connect-button.tsx    # 连接钱包按钮
│   │   ├── wallet-guard.tsx      # 钱包连接守卫
│   │   ├── wallet-avatar.tsx     # 钱包头像
│   │   └── network-switch.tsx    # 网络切换提示
│   │
│   ├── invoice/                  # 发票相关
│   │   ├── invoice-form.tsx      # 创建发票表单
│   │   ├── invoice-card.tsx      # 发票详情卡片
│   │   ├── invoice-list.tsx      # 发票列表
│   │   ├── invoice-list-item.tsx # 列表单项
│   │   ├── invoice-status.tsx    # 状态徽章
│   │   ├── invoice-receipt.tsx   # 支付收据
│   │   ├── invoice-history.tsx   # 发票历史时间线
│   │   ├── invoice-parties.tsx   # From/To 双方信息
│   │   └── invoice-share.tsx     # 分享组件
│   │
│   ├── dashboard/                # Dashboard 专属组件
│   │   ├── stats-card.tsx        # 统计卡片
│   │   ├── stats-grid.tsx        # 统计卡片网格
│   │   └── recent-invoices.tsx   # 最近发票列表
│   │
│   └── common/                   # 通用组件
│       ├── address-display.tsx   # 地址显示/复制
│       ├── amount-display.tsx    # 金额显示
│       ├── date-picker.tsx       # 日期选择
│       ├── search-bar.tsx        # 搜索栏
│       ├── tx-status.tsx         # 交易状态
│       ├── empty-state.tsx       # 空状态
│       └── loading-skeleton.tsx  # 加载骨架屏
│
├── hooks/                        # 自定义 Hooks
│   ├── use-invoice.ts            # 发票数据查询
│   ├── use-invoices.ts           # 发票列表查询
│   ├── use-create-invoice.ts     # 创建发票
│   ├── use-pay-invoice.ts        # 支付发票
│   ├── use-approve-token.ts      # Token 授权
│   ├── use-token-balance.ts      # Token 余额
│   └── use-token-allowance.ts    # Token 授权额度
│
├── lib/                          # 工具库
│   ├── wagmi.ts                  # wagmi 配置
│   ├── contracts.ts              # 合约地址 & ABI
│   ├── ipfs.ts                   # IPFS 上传/下载
│   ├── utils.ts                  # 通用工具函数
│   └── constants.ts              # 常量定义
│
├── stores/                       # Zustand 状态
│   └── app-store.ts              # 应用全局状态
│
├── types/                        # 类型定义
│   ├── invoice.ts                # 发票类型
│   └── contract.ts               # 合约类型
│
└── styles/
    └── globals.css               # 全局样式

后面还有核心模块设计、核心 Hooks 设计、页面组件设计等。还给出了很多示例代码。

而整个 TAD 文档生成的时间才不到几分钟。

我自然不满足于此,于是,我又再进一步,让 Stitch 帮我生成了 UI 风格稿和几个核心页面的 UI 稿。也就是以下这些:

Image
Image

基于这些 UI 稿,我又让 Claude Code 进一步更完善了 TAD 文档,加上了整体布局结构和视觉规范。

Day 4

第四天则是完成智能合约的编写和部署了。

这次我分别使用 Claude Code 和 Gemini 来帮我实现合约。我让它们基于 PRD 和 TAD 两个文档,帮我设计和实现 Solidity 智能合约,很快它们就帮我把 BlockInvoice 合约实现出来了。但实际对比下来,很明显 Claude Code 生成的代码质量更高,最终我就采用了 Claude Code 的版本。

接着,我又让 Claude Code 帮我用 Foundry 搭建起部署环境,它不仅帮我搭建好了框架,写好了部署脚本,甚至还顺便帮我设计并实现了十几个测试用例,全都顺利通过了测试,这一点挺赞。

最终,我将合约部署到了 BSC 测试网。

Image
Image

Day 5

第五天的目标则是完成前端开发并连接上合约

这一天花的时间是最多的,因为 UI/UX 上有挺多细节在和 AI 不断完善。

比如,Dashboard 一开始显示的是 Welcome back,Alex,但我们的登录用户只有一个钱包地址,并没有名字,于是,去掉了名字。

再比如,创建发票页面,付款方地址原本设计还支持输入 ENS 的,但测试时一直没能成功将 ENS 转成地址,于是就移除了该功能。

还有 Faucet 页面,也是在这一天才想到加上去的。

还有很多其他交互细节,就不一一都展开介绍了。

简而言之,调 UI/UX 是一个比较耗时间的体力活。

Day 6

第六天的工作就非常简单了,无非就是把已经完成的前端部署到了 Vercel 上,同时配置上第一天就注册好的域名。从而实现了对外访问。也就是直接通过 https://block-invoice.com 就可以访问应用了。

Image
Image

Day 7

最后一天,也就是今天,就是对上面这几天的工作做一个回顾总结。

后面,我还会陆续迭代 BlockInvoice 这个项目,要将其进一步完善并部署到主网,并慢慢自己开始真正用起来。

写在最后

虽然,我发起的这个 7 天挑战,我自己已经完成了。但对于其他人,可以自己选择从哪天开始。对于中途暂停了的,也需要自己选择从哪天继续下去。其实,关键在于行动


原文链接:https://mp.weixin.qq.com/s/GUYy9sQwzmY7nGfvmdgVHQ

© 版权声明
THE END
喜欢就支持一下吧
点赞5 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容