使用说明
📝 备忘录应用程序(Memo App)
用于手机实习的Next.js笔记应用程序
具有基于Supabase数据库的完整CRUD功能的备忘录应用程序,是MCP集成和GitHub PR生成实践的基础项目。
🚀 主要功能
- 创建、读取、修改和删除注释(CRUD)
- 📂 按类别分类注释(个人、工作、学习、想法、其他)
- 🏷️ 使用标记系统标记注释
- 🔍 基于标题、内容和标记的实时搜索
- 📱 响应式设计(移动、平板电脑、台式机)
- 💾 基于Supabase数据库的数据存储
- 🤖 基于AI的笔记摘要功能(Google Gemini)
- 🎨 现代UI/UX with Tailwind CSS
🛠 技术堆栈
- 框架:Next.js 15.4.4(应用路由器)
- 语言:TypeScript
- 样式:顺风CSS v4
- 数据库:Supabase(PostgreSQL)
- 状态管理:React钩子(useState、useEffect、useMemo、useTransition、useOptimistic)
- 服务器操作:Next.js服务器操作
- 人工智能:Google Gemini API
- 包管理器:npm
📦 安装和运行
1.安装依赖性
npm install
2.设置环境变量
.env.local 创建文件并设置以下环境变量:
# Google Gemini API Key
GEMINI_API_KEY=your_gemini_api_key
# Supabase Configuration (Server)
SUPABASE_URL=your_supabase_project_url
SUPABASE_SERVICE_ROLE_KEY=your_supabase_service_role_key
SUPABASE_ANON_KEY=your_supabase_anon_key
# Supabase Configuration (Client exposure)
NEXT_PUBLIC_SUPABASE_URL=your_supabase_project_url
NEXT_PUBLIC_SUPABASE_ANON_KEY=your_supabase_anon_key
Supabase项目设置:
- Supabase在中创建新项目
- 从项目设置>API复制URL、Anon Key、Service Role Key
- 使用Supabase CLI连接项目:
supabase link
3.数据库迁移
通过Supabase MCP自动应用迁移。要手动应用,请:
# Supabase CLI 사용 시
supabase db push
或者,可以在Supabase Dashboard上使用SQL Editor执行迁移。
4.运行开发服务器
npm run dev
5.浏览器连接
http://localhost:3000
📁 项目结构
memo-app/
├── src/
│ ├── app/
│ │ ├── actions/
│ │ │ └── memoActions.ts # 서버 액션 (CRUD)
│ │ ├── api/
│ │ │ └── memos/
│ │ │ └── summary/
│ │ │ └── route.ts # 요약 API 라우트
│ │ ├── globals.css # 글로벌 스타일
│ │ ├── layout.tsx # 루트 레이아웃
│ │ └── page.tsx # 메인 페이지 (서버 컴포넌트)
│ ├── components/
│ │ ├── MemoAppClient.tsx # 클라이언트 앱 컴포넌트
│ │ ├── MemoForm.tsx # 메모 생성/편집 폼
│ │ ├── MemoItem.tsx # 개별 메모 카드
│ │ ├── MemoList.tsx # 메모 목록 및 필터
│ │ └── MemoViewerModal.tsx # 메모 상세 뷰어
│ ├── hooks/
│ │ └── useMemos.ts # 메모 관리 커스텀 훅
│ ├── lib/
│ │ └── supabase/
│ │ ├── client.ts # 클라이언트 Supabase 클라이언트
│ │ └── server.ts # 서버 Supabase 클라이언트
│ ├── types/
│ │ └── memo.ts # 메모 타입 정의
│ └── utils/
│ ├── localStorage.ts # LocalStorage 유틸리티 (레거시)
│ └── seedData.ts # 샘플 데이터 시딩
└── README.md # 프로젝트 문서
💡 主要元件
MemoItem
- 以卡片形式显示单个注释
- 编辑/删除动作按钮
- 显示类别徽章和标记
- 日期格式化和文本修剪
备忘录表格
- 用于创建/编辑注释的模式表单
- 输入标题、内容、类别和标签
- 添加/删除标签功能
- 表单验证和错误处理
备忘录列表
- 显示注释列表网格
- 实时搜索和类别过滤
- 统计信息和空状态处理
- 反应式网格布局
📊 数据结构
TypeScript接口
interface Memo {
id: string // 고유 식별자 (UUID)
title: string // 메모 제목
content: string // 메모 내용
category: string // 카테고리 (personal, work, study, idea, other)
tags: string[] // 태그 배열
summary?: string // AI 생성 요약 (선택적)
createdAt: string // 생성 날짜 (ISO string)
updatedAt: string // 수정 날짜 (ISO string)
}
数据库模式
CREATE TABLE memos (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
title TEXT NOT NULL,
content TEXT NOT NULL,
category TEXT NOT NULL CHECK (category IN ('personal', 'work', 'study', 'idea', 'other')),
tags TEXT[] DEFAULT '{}',
summary TEXT,
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
);
索引:
idx_memos_category:筛选类别idx_memos_created_at:对齐创建
🎯 迁移完成
此项目已成功从LocalStorage迁移到Supabase数据库:
已完成的任务
- 创建Supabase数据库模式
- 实现基于服务器动作的CRUD
- 集成Next.js服务器组件
- 实现Optimistic Updates
- AI摘要功能DB集成
- 创建牧业数据
主要更改
- 数据存储:本地存储→ Supabase PostgreSQL
- 数据关闭:客户端→服务器端(Server Actions)
- 状态管理:使用状态→ use过渡+use乐观
- 保存摘要:内存→数据库永久存储
🎯 其他实践方案
练习1:功能扩展+GitHub PR(60分钟)
- 添加注释收藏夹功能
- 使用Cursor Custom Modes创建PR
- 代码审查和协作实践
练习2:测试Playwright MCP(45分钟)
- 创建E2E测试
- 浏览器自动化和可视化测试
- 性能测量和报告
详细的实习指南请参考课程资料。
🎨 示例数据
首次运行应用程序时,将自动生成6个示例注释:
- 准备项目会议(工作)
- React 18学习新功能(学习)
- 新的应用程序创意:习惯交易者(创意)
- 周末旅行计划(个人)
- 阅读列表(个人)
- 性能优化创意(创意)
🔧 开发指南
使用服务器动作
import {
getMemos,
getMemoById,
createMemo,
updateMemo,
deleteMemo,
updateMemoSummary,
} from '@/app/actions/memoActions'
// 서버 컴포넌트에서
const memos = await getMemos()
// 서버 액션에서
const newMemo = await createMemo({
title: '새 메모',
content: '내용',
category: 'personal',
tags: ['태그1'],
})
使用客户端挂钩
// useMemos 훅 사용 예시
const {
memos, // 필터링된 메모 목록
loading, // 로딩 상태
createMemo, // 메모 생성 (서버 액션 호출)
updateMemo, // 메모 수정 (서버 액션 호출)
deleteMemo, // 메모 삭제 (서버 액션 호출)
searchMemos, // 검색
filterByCategory, // 카테고리 필터링
stats, // 통계 정보
} = useMemos({ initialMemos })
使用摘要功能
在注释详细查看器中自动生成摘要,生成的摘要存储在数据库中。
// API 라우트에서 요약 생성 및 저장
POST /api/memos/summary
{
"content": "메모 내용",
"memoId": "메모 ID"
}
🚀 部署
Vercel分发
npm run build
npx vercel --prod
Netlify部署
npm run build
# dist 폴더를 Netlify에 드래그 앤 드롭
📄 许可证
MIT许可证-用于学习和实践。
🤝 贡献
这个项目是为了培训而制作的。请将改善事项或错误报告提交到热点或PR。
由以下材料制成❤️ 用于实践工作坊