Files
mnote/design/stage0-2.0.md
T

304 lines
9.4 KiB
Markdown
Raw Normal View History

2025-11-23 10:55:04 +08:00
以下是**完全适配 design3.0.md(前后端分离 + MinerU + LightRAG 版)的全新阶段 0 重做指南**。
目标:在 1~2 天(AI 助手 < 4 小时)内把你已经跑完旧 stage0 的项目**安全迁移/拆分**成两个干净仓库:
```
wolai-frontend ← 只负责 UI + 实时协作 + 轻量调用后端 API
wolai-backend ← FastAPI + Celery Redis LightRAG MinerU 全包
```
最终状态:
- 前端仍然是 Next.js 15 App Router + Supabase Auth/Realtime/Storage
- 所有重量级任务(OCR、向量化、知识图谱构建、RAG 查询)全部后端完成
- 0 客户端卡顿
- 两边共享同一 Supabase 项目(Auth + Postgres + Storage + Realtime
- 代码结构、环境变量、数据库表 100% 符合 design3.0.md 最新要求
---
### 第一步:备份 & 拆分仓库(必须先做,防止误删)
```bash
# 在你当前项目根目录
mv wolai-clone wolai-clone-old-backup-$(date +%Y%m%d)
# 新建两个干净文件夹
mkdir wolai-frontend wolai-backend
```
### 第二步:创建全新前端项目(保留必要依赖,卸载已迁移到后端的包
```bash
# 进入前端目录
cd wolai-frontend
npx create-next-app@latest . \
--typescript \
--tailwind \
--eslint \
--app \
--src-dir \
--import-alias "@/*" \
--turbo \
--yes
# 初始化 shadcn2025-11 最新版默认 darkMode: "class"
npx shadcn@latest init -d
# 安装前端真正需要的依赖(精简版)
pnpm add \
@supabase/supabase-js \
@supabase/auth-helpers-nextjs \
@supabase/auth-helpers-react \
@blocknote/core \
@blocknote/react \
@xyflow/react \
yjs \
y-protocols \
@hocuspocus/provider \
zustand \
@tanstack/react-query \
react-dropzone \
sonner \
uuid \
@hello-pangea/dnd \
lucide-react
# 一次性加常用 shadcn 组件(和以前一样)
npx shadcn@latest add button card dialog toast dropdown-menu avatar separator sheet input label textarea badge command popover scroll-area skeleton tabs toggle drawer
```
**需要卸载的旧依赖(因为已移到后端)**
```bash
pnpm remove \
@blocknote/mantine \
tesseract.js \
pdfjs-dist \
langchain \
@langchain/openai \
@langchain/community \
neo4j-driver \
@neo4j/graphql
```
### 第三步:前端目录结构(AI 接手零摩擦)
```
src/
├── app/
│ ├── (auth)/ # 登录注册页
│ ├── (app)/ # 主体布局
│ │ ├── documents/
│ │ │ ├── [id]/
│ │ │ │ ├── page.tsx # BlockNote + XYFlow 切换
│ │ │ │ └── mindmap/page.tsx
│ │ └── layout.tsx # Sidebar + Breadcrumb + BottomToolbar
│ ├── api/ # 只保留轻量 route handlers(如上传文件到 Storage
│ ├── globals.css
│ └── layout.tsx
├── components/
│ ├── editor/ # BlockNoteEditor.tsx + 实时协作
│ ├── mindmap/ # ReactFlow 组件
│ ├── sidebar/
│ ├── ui/ # shadcn
│ └── common/
├── lib/
│ └── supabase/ # client.ts + server.ts(保持不变)
├── hooks/
└── store/ # zustand
```
### 第四步:创建后端 FastAPI 项目(全新仓库)
```bash
cd ../wolai-backend
python -m venv venv
source venv/bin/activate # Windows 用 venv\Scripts\activate
pip install \
fastapi \
"uvicorn[standard]" \
celery[redis] \
redis \
lightrag[hf] \
mineru \
supabase-py \
python-dotenv \
pgvector \
openai \
python-multipart \
python-jose[cryptography] \
passlib[bcrypt]
# 创建基本结构
mkdir app
touch app/main.py app/celery_app.py app/tasks.py app/lightrag_utils.py app/__init__.py
```
**推荐的初始文件(直接复制即可)**
```python
# app/main.py
from fastapi import FastAPI, Depends, HTTPException
from fastapi.middleware.cors import CORSMiddleware
from supabase import create_client
import os
from dotenv import load_dotenv
load_dotenv()
app = FastAPI(title="Wolai Backend v3.0")
app.add_middleware(
CORSMiddleware,
allow_origins=["http://localhost:3000", os.getenv("FRONTEND_URL")],
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
supabase = create_client(os.getenv("SUPABASE_URL"), os.getenv("SUPABASE_SERVICE_ROLE_KEY"))
@app.get("/health")
async def health():
return {"status": "ok"}
```
```python
# app/celery_app.py
from celery import Celery
celery = Celery(
"worker",
broker=os.getenv("REDIS_URL"),
backend=os.getenv("REDIS_URL")
)
celery.conf.task_default_queue = "wolai"
celery.conf.worker_concurrency = 3
```
### 第五步:Supabase 数据库表(2025-11-17 最新版)直接在 SQL Editor 全部执行
```sql
-- 1. 启用扩展
create extension if not exists "uuid-ossp";
create extension if not exists vector;
-- 2. 文档表(新增字段)
create table if not exists documents (
id uuid primary key default uuid_generate_v4(),
user_id uuid references auth.users not null,
parent_id uuid references documents(id) on delete set null,
title text default '无标题',
content jsonb default '{}'::jsonb,
mindmap_data jsonb,
raw_text text, -- MinerU 提取的纯文本
index_status text default 'pending', -- pending / processing / completed / failed
created_at timestamptz default now(),
updated_at timestamptz default now()
);
-- 3. 后台任务进度表(前端轮询或 Realtime 订阅)
create table if not exists background_tasks (
id uuid primary key default uuid_generate_v4(),
user_id uuid references auth.users not null,
document_id uuid references documents(id),
task_type text check (task_type in ('ocr', 'index')),
status text default 'pending',
progress integer default 0,
message text,
created_at timestamptz default now(),
updated_at timestamptz default now()
);
-- 4. RLS
alter table documents enable row level security;
alter table background_tasks enable row level security;
create policy "own docs" on documents for all using (auth.uid() = user_id);
create policy "own tasks" on background_tasks for all using (auth.uid() = user_id);
```
> LightRAG 会自动在你的 Supabase 里创建自己的表(embeddings、entities、relationships 等),不需要手动建。
### 第六步:环境变量(两个项目都要)
**前端 .env.local**
```env
NEXT_PUBLIC_SUPABASE_URL=https://xxxx.supabase.co
NEXT_PUBLIC_SUPABASE_ANON_KEY=eyJ...
NEXT_PUBLIC_BACKEND_URL=http://localhost:8000 # 开发时
# 生产时改成你的 Railway/Fly.io 域名
```
**后端 .env**
```env
SUPABASE_URL=https://xxxx.supabase.co
SUPABASE_SERVICE_ROLE_KEY=xxxxxx # 危险!只在后端使用,绝不泄露
REDIS_URL=redis://default:xxxx@redis.upstash.io:6379
OPENAI_API_KEY=sk-...
FRONTEND_URL=https://your-frontend.vercel.app
```
### 第七步:Git 初始化(推荐两个仓库)
```bash
# 前端
cd wolai-frontend
git init
git add .
git commit -m "chore: phase0 frontend - nextjs15 + supabase + blocknote + xyflow (2025-11-17 v3)"
git tag -a "v0.1.0-phase0-frontend" -m "design v3.0 ready"
# 后端
cd ../wolai-backend
git init
git add .
git commit -m "chore: phase0 backend - fastapi + celery + lightrag + mineru (2025-11-17 v3)"
git tag -a "v0.1.0-phase0-backend" -m "design v3.0 ready"
```
### 第八步:交给 AI 编码助手的“一键 Prompt”(直接复制丢给 Claude/Cursor/Codex
```text
你现在是一个顶级全栈工程师,需要严格按照 design3.0.md2025-11-17 最新版)实现 Wolai 克隆,要求前后端完全分离。
仓库状态:
- wolai-frontendNext.js 15 App Router + TypeScript + Tailwind + shadcn/ui + Supabase 客户端已就绪,依赖已精简
- wolai-backendFastAPI + Celery + Redis + LightRAG + MinerU 骨架已就绪,Supabase service_role 已配置
请完成以下阶段 1 任务(只做前端 + 后端必要接口):
前端:
1. 实现递归侧边栏(240px@hello-pangea/dnd 拖拽,无限嵌套,参考 ui_react.md 像素级复刻)
2. /documents/[id]/page.tsx 使用 BlockNote + @hocuspocus/provider + Supabase Realtime 实现多人实时协作
3. 实现面包屑、底部固定 AI 工具栏、移动端 Drawer 侧边栏
4. 文件上传 → Supabase Storage → 调用后端 POST /api/v1/tasks/ocr {document_id, file_url} → 显示 background_tasks 进度(Realtime 订阅)
后端:
1. /api/v1/tasks/ocr 接口(接收 document_id + signed_url,使用 service_role 下载文件 → Celery 任务执行 MinerU → 保存 markdown 到 documents.content + raw_text → LightRAG.index
2. /api/v1/chat SSE 流式接口(LightRAG.query + OpenAI gpt-4o,带来源引用)
全部使用 Server Components + Server Actions(前端) 和 FastAPI Depends 验证 Supabase JWT(后端)。
代码必须 100% 符合 design3.0.md 表结构与数据流。
请输出完整文件列表与代码。
```
执行完以上所有步骤后,你就拥有了一个**完全符合 2025-11-17 最新 design3.0.md 的干净双仓库**,可以直接丢给 AI 继续阶段 1。
现在只需要运行:
```bash
# 前端
cd wolai-frontend && pnpm dev
# 后端
cd wolai-backend
uvicorn app.main:app --reload --port 8000
celery -A app.celery_app worker --loglevel=info
```
两个项目同时启动,就能看到熟悉的 Wolai 界面,上传 PDF 后进度条实时显示,AI 问答秒回。
到此,阶段 0(v3.0 版)完成。接下来直接把第八步的 Prompt 丢给 Claude/Cursor 即可进入高速开发阶段。
祝编码愉快!