开发状态与交接文档
开发状态与交接文档
最后更新: 2026-04-21 当前分支:
feat/chat-mode基于分支:master
1. 项目概述
AI 决策思想客厅 — 一个多视角 AI 认知陪练 SaaS 产品。用户可以选择不同的"人物角色"(persona)进行 1v1 或群聊对话,在重大决策前获得多角度分析。
技术栈: Next.js 16 (App Router) + Tailwind CSS 4 + shadcn/ui + PostgreSQL (Neon) + Drizzle ORM + NextAuth.js
2. 当前分支完成的功能
2.1 用户认证系统 (已完成)
- NextAuth.js + Credentials Provider 登录/注册
- Session-based 鉴权,middleware 保护路由
- 所有 chat API 已加 userId 数据隔离
关键文件:
auth.config.ts,auth.ts— NextAuth 配置middleware.ts— 路由保护src/app/auth/signin/page.tsx,src/app/auth/register/page.tsxsrc/components/auth/session-provider.tsx,src/components/auth/user-menu.tsxsrc/lib/auth/queries.ts
2.2 聊天系统 (已完成)
核心聊天功能已全部打通,包括:
- 1v1 对话: 选择 persona → 自动创建/复用 conversation → 实时对话
- 群聊: 多 persona 群组对话,支持创建时预选 persona
- SSE 流式输出: assistant 回复以 SSE 逐 chunk 推送,前端实时渲染
- 消息分页: cursor-based 分页,支持加载更多历史消息
- 消息搜索: sidebar 搜索框,按关键词搜索消息
- 会话管理: 重命名、删除、sidebar 列表
关键文件:
| 层 | 文件 | 职责 |
|---|---|---|
| 页面 | src/app/chat/page.tsx |
聊天主页面,状态管理,SSE 解析 |
| 组件 | src/components/chat/chat-sidebar.tsx |
左侧栏:会话列表 + persona 列表 + 搜索 |
| 组件 | src/components/chat/chat-window.tsx |
聊天窗口:消息列表 + 输入框 |
| 组件 | src/components/chat/chat-input.tsx |
消息输入框 + @mention 弹窗 |
| 组件 | src/components/chat/chat-message.tsx |
单条消息气泡 |
| 组件 | src/components/chat/markdown-renderer.tsx |
Markdown 渲染(含代码高亮) |
| 组件 | src/components/chat/message-actions.tsx |
消息操作按钮(复制等) |
| 组件 | src/components/chat/group-create-dialog.tsx |
群聊创建弹窗 |
| 组件 | src/components/chat/mention-popover.tsx |
@提及弹出面板 |
| API | src/app/api/chat/conversations/route.ts |
GET 列表 / POST 创建 |
| API | src/app/api/chat/conversations/[id]/route.ts |
GET 详情 / PATCH 重命名 / DELETE |
| API | src/app/api/chat/conversations/[id]/messages/route.ts |
GET 分页消息 / POST 发送(SSE 流式) |
| API | src/app/api/chat/search/route.ts |
搜索消息 |
| 数据 | src/lib/chat/queries.ts |
数据库查询函数 |
| 数据 | src/lib/chat/service.ts |
业务逻辑:编排 AI 回复、流式输出 |
| 数据 | src/lib/chat/prompts.ts |
AI prompt 模板 |
| 类型 | src/types/index.ts |
类型定义(ChatConversation, ChatMessage 等) |
| Schema | src/lib/db/schema.ts |
数据库表结构 |
2.3 主题系统 (进行中)
三主题切换架构已搭建完成,但 配色方案尚未最终确定。
当前状态:
| 主题 | class 名 | 状态 |
|---|---|---|
| 晨光(浅色) | (无 class / light) | 已完成,保持不变 |
| 深夜(深色) | .dark |
CSS 变量已定义,但配色需重新设计 |
| 沙龙(彩色) | .color |
CSS 变量已定义,但配色需重新设计 |
关键文件:
src/app/globals.css— 所有主题 CSS 变量定义(:root,.dark,.color)src/components/theme-provider.tsx— ThemeProvider 组件,class 切换逻辑src/components/theme-switcher.tsx— 主题切换按钮 UI
主题切换机制:
ThemeProvider在<html>元素上切换 class: 无 class = light,.dark= dark,.color= color- 主题偏好存在 localStorage key
theme - Tailwind dark mode 通过
@custom-variant dark (&:is(.dark *))配置
3. 进行中的任务
3.1 主题配色重新设计 (未完成)
目标:
- 晨光: 保持现有浅色主题不变
- 深夜: 亮绿色 + 暗黑色搭配,参考 qoder.com 的深色美学风格
- 沙龙: 更彩色、更醒目,视觉冲击力强
待完成的具体工作:
-
修改
src/app/globals.css中的.dark变量- 当前是标准 shadcn 灰色暗色主题
- 需改为: 深黑背景 + 亮绿色 accent
- 参考 qoder.com 风格: 近黑底 (
#090A0B) + 鲜明 accent 色 - 需要调整的变量:
--primary,--primary-foreground,--accent,--accent-foreground,--background,--card等
-
修改
src/app/globals.css中的.color变量- 当前是暖色烛光书房风格 (oklch 暖黄色调)
- 需改为: 更丰富、更醒目的配色
- 可考虑赛博朋克/霓虹风格,或大胆的多色搭配
-
更新
.prose-chat相关样式.dark .prose-chat和.color .prose-chat的代码块背景色需同步调整
-
视觉验证
- 三个主题都需要在浏览器中实际验证
- 重点检查: 消息气泡可读性、代码块对比度、sidebar 高亮、输入框可读性
设计参考:
- qoder.com 已抓取分析,其 theme-color 为
#8B5CF6(紫色) 配#090A0B(近黑) - 用户要求深夜主题用绿色而非紫色
4. 已修复的 Bug
4.1 React Hooks 顺序违规 + TDZ 错误
commit: f4bda7e
问题: ChatPageContent 组件中 if (status === 'loading') return 早期返回放在了 hooks 声明之前,导致:
- React 报 hooks 数量不一致错误
openConversation函数在 TDZ 中被访问
修复: 将早期返回移到所有 hooks 和函数声明之后、JSX return 之前。
正确顺序:
useState hooks (×7)
→ useCallback(loadConversations)
→ useEffect(loadConversations)
→ useEffect(URL params check)
→ async function openConversation
→ async function loadMoreMessages
→ async function handleSendMessage
→ async function handleSelectPersona
→ async function handleGroupCreated
→ function handleUpgradeToGroup
→ if (status === 'loading') return ← 早期返回在这里
→ return JSX
5. 数据库
两个 migration 文件:
drizzle/0000_clean_harpoon.sql— 初始 schemadrizzle/0001_smooth_the_watchers.sql— 用户认证相关表
主要表: users, conversations, conversation_members, messages
6. 开发命令
pnpm dev # 启动开发服务器 (port 3000)
pnpm build # 构建
pnpm lint # ESLint
pnpm db:push # 推送 schema 到数据库
pnpm db:generate # 生成 migration
pnpm sync:personas # 同步人物配置7. 接手注意事项
- Next.js 版本: 本项目用的是 Next.js 16,与常见教程有差异,开发前先读
node_modules/next/dist/docs/下的文档 - Tailwind CSS 4: 使用新版语法,主题通过
@theme inline和 CSS 变量定义 - SSE 流式: 发送消息后前端解析 SSE 事件流,事件类型:
assistant_start,assistant_chunk,assistant_complete,done - 乐观更新: 用户发送消息时先乐观添加到 UI,再等 SSE 流式响应
- 数据隔离: 所有 chat API 都通过 session 获取 userId,查询带 userId 条件