28 KiB
AI Chatbot 开发文档
目录
项目概述
这是一个基于 Next.js 16 和 AI SDK 构建的现代化 AI 聊天机器人应用。项目提供了完整的聊天功能、用户认证、消息持久化、以及多种 AI 工具集成(文档创建、代码编辑、表格处理等)。
主要特性
- ✅ Next.js App Router 架构
- ✅ React Server Components (RSCs) 和 Server Actions
- ✅ AI SDK 统一 API,支持多种模型提供商
- ✅ 完整的用户认证系统(支持注册用户和访客模式)
- ✅ 消息历史持久化
- ✅ 多种 Artifact 类型(文本、代码、表格、图片)
- ✅ 实时流式响应
- ✅ 可恢复的流式传输(需要 Redis)
- ✅ 消息投票功能
- ✅ 文档建议系统
- ✅ 响应式 UI(基于 shadcn/ui)
技术栈
核心框架
- Next.js 16.0.5 - React 框架,使用 App Router
- React 19.0.0-rc - UI 库
- TypeScript 5.6.3 - 类型安全
AI 相关
- AI SDK 5.0.26 - Vercel AI SDK,统一 AI 模型接口
- @ai-sdk/gateway - Vercel AI Gateway,统一访问多个 AI 模型
- @ai-sdk/react - React hooks for AI
- tokenlens - Token 使用量统计和分析
数据库
- Drizzle ORM 0.34.0 - 类型安全的 ORM
- PostgreSQL - 主数据库(通过 Neon Serverless Postgres)
- Redis 5.0.0 - 可恢复流式传输(可选)
认证
- NextAuth 5.0.0-beta.25 - 认证框架
- bcrypt-ts - 密码加密
UI 组件
- shadcn/ui - UI 组件库
- Radix UI - 无障碍组件原语
- Tailwind CSS 4.1.13 - 样式框架
- Framer Motion - 动画库
编辑器
- CodeMirror 6 - 代码编辑器
- ProseMirror - 富文本编辑器
- react-data-grid - 表格编辑器
工具库
- Zod - 模式验证
- date-fns - 日期处理
- SWR - 数据获取和缓存
- nanoid - ID 生成
开发工具
- Biome - 代码格式化和 linting
- Playwright - E2E 测试
- Drizzle Kit - 数据库迁移工具
项目结构
ai-chatbot-main/
├── app/ # Next.js App Router 目录
│ ├── (auth)/ # 认证相关路由组
│ │ ├── actions.ts # Server Actions
│ │ ├── auth.ts # NextAuth 配置
│ │ ├── auth.config.ts # 认证配置
│ │ ├── login/ # 登录页面
│ │ └── register/ # 注册页面
│ ├── (chat)/ # 聊天相关路由组
│ │ ├── actions.ts # Server Actions
│ │ ├── api/ # API 路由
│ │ │ ├── chat/ # 聊天 API
│ │ │ ├── document/ # 文档 API
│ │ │ ├── files/ # 文件 API
│ │ │ ├── history/ # 历史记录 API
│ │ │ ├── suggestions/ # 建议 API
│ │ │ └── vote/ # 投票 API
│ │ ├── chat/[id]/ # 聊天详情页
│ │ ├── layout.tsx # 聊天布局
│ │ └── page.tsx # 聊天首页
│ ├── layout.tsx # 根布局
│ └── globals.css # 全局样式
├── artifacts/ # Artifact 实现
│ ├── code/ # 代码 Artifact
│ ├── image/ # 图片 Artifact
│ ├── sheet/ # 表格 Artifact
│ └── text/ # 文本 Artifact
├── components/ # React 组件
│ ├── elements/ # 消息元素组件
│ ├── ui/ # shadcn/ui 组件
│ ├── artifact.tsx # Artifact 容器
│ ├── chat.tsx # 聊天主组件
│ ├── messages.tsx # 消息列表
│ └── ...
├── hooks/ # React Hooks
│ ├── use-artifact.ts # Artifact 管理
│ ├── use-chat-visibility.ts # 聊天可见性
│ ├── use-messages.tsx # 消息管理
│ └── ...
├── lib/ # 工具库
│ ├── ai/ # AI 相关
│ │ ├── models.ts # 模型定义
│ │ ├── providers.ts # 模型提供商
│ │ ├── prompts.ts # 提示词模板
│ │ ├── entitlements.ts # 用户权限
│ │ └── tools/ # AI 工具
│ ├── db/ # 数据库
│ │ ├── schema.ts # 数据库模式
│ │ ├── queries.ts # 数据库查询
│ │ ├── migrations/ # 数据库迁移
│ │ └── utils.ts # 数据库工具
│ ├── artifacts/ # Artifact 服务端逻辑
│ ├── editor/ # 编辑器配置
│ ├── errors.ts # 错误处理
│ ├── types.ts # 类型定义
│ └── utils.ts # 工具函数
├── tests/ # 测试文件
│ ├── e2e/ # E2E 测试
│ ├── pages/ # 页面对象模型
│ └── routes/ # API 路由测试
├── public/ # 静态资源
├── biome.jsonc # Biome 配置
├── drizzle.config.ts # Drizzle 配置
├── next.config.ts # Next.js 配置
├── package.json # 依赖配置
└── tsconfig.json # TypeScript 配置
环境配置
必需的环境变量
创建 .env.local 文件并配置以下变量:
# 数据库
POSTGRES_URL=postgresql://user:password@host:port/database
# NextAuth
AUTH_SECRET=your-secret-key-here
AUTH_URL=http://localhost:3000
# AI Gateway (非 Vercel 部署时需要)
AI_GATEWAY_API_KEY=your-gateway-api-key
# Redis (可选,用于可恢复流式传输)
REDIS_URL=redis://localhost:6379
# Vercel Blob (文件存储,可选)
BLOB_READ_WRITE_TOKEN=your-blob-token
环境变量说明
- POSTGRES_URL: PostgreSQL 数据库连接字符串(必需)
- AUTH_SECRET: NextAuth 加密密钥,使用
openssl rand -base64 32生成(必需) - AUTH_URL: 应用的基础 URL(必需)
- AI_GATEWAY_API_KEY: Vercel AI Gateway API 密钥(非 Vercel 部署时必需)
- REDIS_URL: Redis 连接字符串(可选,用于可恢复流式传输)
- BLOB_READ_WRITE_TOKEN: Vercel Blob 存储令牌(可选)
安装和运行
# 安装依赖
pnpm install
# 运行数据库迁移
pnpm db:migrate
# 启动开发服务器
pnpm dev
应用将在 http://localhost:3000 运行。
核心功能模块
1. 聊天系统
聊天系统是应用的核心,位于 app/(chat)/ 目录。
主要组件
components/chat.tsx: 聊天主组件,管理消息状态和 UIcomponents/messages.tsx: 消息列表组件components/message.tsx: 单条消息组件components/multimodal-input.tsx: 多模态输入组件(支持文本、文件等)
关键功能
- 实时流式响应
- 消息历史持久化
- 消息投票(点赞/点踩)
- 消息重新生成
- 消息编辑
- 自动滚动到底部
2. 用户认证
认证系统使用 NextAuth 5,支持两种用户类型:
- 注册用户: 通过邮箱和密码注册
- 访客用户: 临时用户,无需注册
注意: 当前版本没有管理员功能,所有用户都是普通用户。如需添加管理员功能,需要扩展用户表和认证系统。
认证流程
- 用户访问应用
- 未登录用户自动创建访客账户
- 注册用户通过登录页面登录
- 会话信息存储在 JWT 中
相关文件
app/(auth)/auth.ts: NextAuth 配置app/(auth)/auth.config.ts: 认证配置app/(auth)/login/page.tsx: 登录页面app/(auth)/register/page.tsx: 注册页面
3. 消息系统
消息系统使用新的 parts 架构,支持多种内容类型。
消息结构
type DBMessage = {
id: string;
chatId: string;
role: "user" | "assistant";
parts: MessagePart[]; // 消息部分数组
attachments: Attachment[];
createdAt: Date;
};
消息部分类型
text: 文本内容tool-call: 工具调用tool-result: 工具结果data: 自定义数据
4. Artifact 系统
Artifact 是 AI 生成的可编辑文档,支持四种类型:
- text: 富文本文档
- code: 代码文件
- sheet: 表格数据
- image: 图片生成
Artifact 架构
每个 Artifact 类型包含:
- 客户端组件 (
artifacts/{kind}/client.tsx): UI 渲染和交互 - 服务端处理器 (
artifacts/{kind}/server.ts): 创建和更新逻辑
创建 Artifact
// AI 工具调用
createDocument({
title: "示例代码",
kind: "code"
})
更新 Artifact
// AI 工具调用
updateDocument({
documentId: "...",
description: "添加错误处理"
})
数据库设计
表结构
User 表
{
id: uuid (主键)
email: varchar(64) (唯一)
password: varchar(64) (可空,访客用户无密码)
}
Chat 表
{
id: uuid (主键)
createdAt: timestamp
title: text
userId: uuid (外键 -> User.id)
visibility: "public" | "private"
lastContext: jsonb (最后的使用统计)
}
Message_v2 表
{
id: uuid (主键)
chatId: uuid (外键 -> Chat.id)
role: "user" | "assistant"
parts: json (消息部分数组)
attachments: json (附件数组)
createdAt: timestamp
}
Document 表
{
id: uuid (主键)
createdAt: timestamp (主键的一部分)
title: text
content: text (可空)
kind: "text" | "code" | "image" | "sheet"
userId: uuid (外键 -> User.id)
}
Vote_v2 表
{
chatId: uuid (主键的一部分)
messageId: uuid (主键的一部分)
isUpvoted: boolean
}
Suggestion 表
{
id: uuid (主键)
documentId: uuid
documentCreatedAt: timestamp
originalText: text
suggestedText: text
description: text (可空)
isResolved: boolean
userId: uuid (外键 -> User.id)
createdAt: timestamp
}
Stream 表
{
id: uuid (主键)
chatId: uuid (外键 -> Chat.id)
createdAt: timestamp
}
数据库查询
所有数据库查询函数位于 lib/db/queries.ts,包括:
getUser(): 获取用户createUser(): 创建用户createGuestUser(): 创建访客用户saveChat(): 保存聊天getChatById(): 获取聊天getMessagesByChatId(): 获取消息列表saveMessages(): 保存消息saveDocument(): 保存文档getDocumentById(): 获取文档- 等等...
数据库迁移
使用 Drizzle Kit 管理数据库迁移:
# 生成迁移文件
pnpm db:generate
# 应用迁移
pnpm db:migrate
# 推送更改(开发环境)
pnpm db:push
# 打开 Drizzle Studio
pnpm db:studio
API 路由
聊天 API
路径: /api/chat
POST - 发送消息
创建新聊天或继续现有聊天。
请求体:
{
id: string; // 聊天 ID
message: ChatMessage; // 用户消息
selectedChatModel: string; // 选择的模型 ID
selectedVisibilityType: "public" | "private";
}
响应: Server-Sent Events (SSE) 流
功能:
- 验证用户身份
- 检查速率限制
- 创建或获取聊天
- 流式生成 AI 响应
- 保存消息到数据库
DELETE - 删除聊天
查询参数:
id: 聊天 ID
响应: 删除的聊天对象
文档 API
路径: /api/document/[id]
GET - 获取文档
获取指定 ID 的文档。
POST - 更新文档
更新文档内容。
文件 API
路径: /api/files
处理文件上传和存储。
历史记录 API
路径: /api/history
获取用户的聊天历史记录(分页)。
建议 API
路径: /api/suggestions
获取文档的建议列表。
投票 API
路径: /api/vote
对消息进行投票(点赞/点踩)。
认证系统
NextAuth 配置
认证系统使用 NextAuth 5,配置在 app/(auth)/auth.ts。
认证提供者
- Credentials Provider: 邮箱密码登录
- Guest Provider: 访客模式(自动创建临时用户)
会话结构
{
user: {
id: string;
email: string | null;
type: "guest" | "regular";
}
}
认证中间件
使用 auth() 函数获取当前会话:
import { auth } from "@/app/(auth)/auth";
const session = await auth();
if (!session?.user) {
// 未登录
}
用户权限
用户权限定义在 lib/ai/entitlements.ts:
export const entitlementsByUserType = {
guest: {
maxMessagesPerDay: 10,
},
regular: {
maxMessagesPerDay: 100,
},
};
AI 集成
模型提供商
项目使用 Vercel AI Gateway 统一访问多个 AI 模型,配置在 lib/ai/providers.ts。
可用模型
- chat-model: Grok Vision (xai/grok-2-vision-1212)
- chat-model-reasoning: Grok Reasoning (xai/grok-3-mini)
- title-model: Grok 2 (xai/grok-2-1212)
- artifact-model: Grok 2 (xai/grok-2-1212)
切换模型提供商
要切换到其他提供商(如 OpenAI),修改 lib/ai/providers.ts:
import { openai } from "@ai-sdk/openai";
export const myProvider = customProvider({
languageModels: {
"chat-model": openai("gpt-4"),
// ...
},
});
AI 工具
AI 可以调用以下工具:
- getWeather: 获取天气信息
- createDocument: 创建文档(text/code/sheet/image)
- updateDocument: 更新文档
- requestSuggestions: 请求文档建议
添加新工具
- 在
lib/ai/tools/创建工具文件 - 在
app/(chat)/api/chat/route.ts注册工具:
tools: {
// ... 现有工具
myNewTool: myNewTool({ session, dataStream }),
}
- 在
experimental_activeTools数组中添加工具名称
提示词系统
系统提示词定义在 lib/ai/prompts.ts,包括:
systemPrompt(): 主聊天提示词titlePrompt: 标题生成提示词codePrompt: 代码生成提示词textPrompt: 文本生成提示词sheetPrompt: 表格生成提示词updateDocumentPrompt(): 文档更新提示词
流式响应
使用 AI SDK 的 streamText() 和 createUIMessageStream() 实现流式响应:
const stream = createUIMessageStream({
execute: ({ writer: dataStream }) => {
const result = streamText({
model: myProvider.languageModel(selectedChatModel),
messages: convertToModelMessages(uiMessages),
tools: { /* ... */ },
});
dataStream.merge(result.toUIMessageStream());
},
onFinish: async ({ messages }) => {
// 保存消息到数据库
},
});
Artifact 系统
Artifact 类型
1. Text Artifact
富文本文档,使用 ProseMirror 编辑器。
文件:
artifacts/text/client.tsx: 客户端组件artifacts/text/server.ts: 服务端处理器
功能:
- Markdown 支持
- 实时编辑
- 版本历史
2. Code Artifact
代码文件,使用 CodeMirror 编辑器。
文件:
artifacts/code/client.tsx: 客户端组件artifacts/code/server.ts: 服务端处理器
功能:
- 语法高亮
- 代码补全
- 多语言支持(JavaScript、Python 等)
- 代码执行(通过 Pyodide)
3. Sheet Artifact
表格数据,使用 react-data-grid。
文件:
artifacts/sheet/client.tsx: 客户端组件artifacts/sheet/server.ts: 服务端处理器
功能:
- CSV 导入/导出
- 数据格式化
- 数据清理工具
4. Image Artifact
图片生成和编辑。
文件:
artifacts/image/client.tsx: 客户端组件
功能:
- 图片生成
- 图片编辑
- 版本历史
创建自定义 Artifact
- 定义 Artifact 类型
在 components/artifact.tsx 中添加类型:
export const artifactDefinitions = [
// ... 现有 Artifact
myCustomArtifact,
];
- 创建客户端组件
artifacts/my-custom/client.tsx:
import { Artifact } from "@/components/create-artifact";
export const myCustomArtifact = new Artifact({
kind: "my-custom",
description: "我的自定义 Artifact",
initialize: () => null,
onStreamPart: ({ setArtifact, streamPart }) => {
if (streamPart.type === "data-myCustomDelta") {
setArtifact((draft) => ({
...draft,
content: streamPart.data,
isVisible: true,
status: "streaming",
}));
}
},
content: ({ content }) => {
return <MyCustomEditor content={content} />;
},
});
- 创建服务端处理器
artifacts/my-custom/server.ts:
import { createDocumentHandler } from "@/lib/artifacts/server";
export const myCustomDocumentHandler = createDocumentHandler({
kind: "my-custom",
onCreateDocument: async ({ title, dataStream }) => {
// 生成内容逻辑
// 使用 dataStream.write() 发送增量更新
return finalContent;
},
onUpdateDocument: async ({ document, description, dataStream }) => {
// 更新内容逻辑
return updatedContent;
},
});
- 注册处理器
在 lib/artifacts/server.ts 中注册:
export const documentHandlersByArtifactKind = [
// ... 现有处理器
myCustomDocumentHandler,
];
- 更新数据库模式
在 lib/db/schema.ts 中更新 Document.kind 类型:
kind: varchar("text", {
enum: ["text", "code", "image", "sheet", "my-custom"]
})
开发指南
代码规范
项目使用 Biome 进行代码格式化和 linting,配置继承自 Ultracite。
运行检查
# 检查代码
pnpm lint
# 自动修复
pnpm format
主要规则
- 使用 TypeScript 严格模式
- 遵循 React Hooks 规则
- 使用函数式组件和 Hooks
- 避免使用
any类型 - 使用 Zod 进行数据验证
- 遵循无障碍性 (a11y) 标准
添加新功能
1. 添加新的 API 路由
在 app/(chat)/api/ 下创建新目录和 route.ts 文件:
import { auth } from "@/app/(auth)/auth";
export async function GET(request: Request) {
const session = await auth();
if (!session?.user) {
return new Response("Unauthorized", { status: 401 });
}
// 处理逻辑
return Response.json({ data: "..." });
}
2. 添加新的 Server Action
在 app/(chat)/actions.ts 中添加:
"use server";
export async function myAction() {
// 服务端逻辑
}
3. 添加新的 UI 组件
在 components/ 目录下创建组件:
"use client";
export function MyComponent() {
return <div>...</div>;
}
测试
项目使用 Playwright 进行 E2E 测试。
运行测试
pnpm test
测试文件结构
tests/e2e/: E2E 测试用例tests/pages/: 页面对象模型tests/routes/: API 路由测试
调试
开发模式
pnpm dev
数据库调试
使用 Drizzle Studio:
pnpm db:studio
查看日志
- 服务端日志:控制台输出
- 客户端日志:浏览器控制台
部署指南
Vercel 部署
- 连接 GitHub 仓库
在 Vercel 控制台连接你的 GitHub 仓库。
- 配置环境变量
在 Vercel 项目设置中添加环境变量:
POSTGRES_URLAUTH_SECRETAUTH_URLREDIS_URL(可选)BLOB_READ_WRITE_TOKEN(可选)
- 部署
推送代码到 GitHub,Vercel 会自动部署。
数据库迁移
在部署前或部署后运行迁移:
pnpm db:migrate
或在 Vercel 的构建命令中:
{
"scripts": {
"build": "tsx lib/db/migrate && next build"
}
}
环境检查清单
- PostgreSQL 数据库已配置
- 环境变量已设置
- 数据库迁移已运行
- AI Gateway API 密钥已配置(如需要)
- Redis 已配置(如需要可恢复流式传输)
系统设置和管理员功能
功能概述
项目已实现完整的管理员系统设置功能,包括:
- ✅ 用户管理(激活/删除/编辑用户)
- ✅ 网站设置(LOGO、网站名、浏览器图标、主题模式LOGO)
- ✅ 工具库管理(启用/禁用 AI 工具)
数据库 Schema
User 表扩展
已为 User 表添加以下字段:
{
role: "guest" | "regular" | "admin" (默认: "regular")
isActive: boolean (默认: true)
createdAt: timestamp
updatedAt: timestamp
}
SystemSettings 表
用于存储系统配置:
{
id: uuid (主键)
key: string (唯一键)
value: jsonb (配置值)
updatedAt: timestamp
updatedBy: uuid (外键 -> User.id)
}
支持的配置键:
siteName: 网站名称siteLogo: 网站 LOGO URLfavicon: 浏览器图标 URLlogoLight: 白天模式 LOGO URLlogoDark: 黑夜模式 LOGO URL
ToolConfig 表
用于管理 AI 工具配置:
{
id: uuid (主键)
toolName: string (唯一键)
isEnabled: boolean (是否启用)
description: string (工具描述)
config: jsonb (工具配置)
updatedAt: timestamp
updatedBy: uuid (外键 -> User.id)
}
认证系统
用户类型
系统支持三种用户类型:
- guest: 访客用户(临时账户)
- regular: 普通注册用户
- admin: 管理员用户
管理员权限
管理员拥有以下权限:
- 无限消息数量(
maxMessagesPerDay: Infinity) - 访问所有 AI 模型
- 访问系统设置页面
- 管理用户账户
- 配置系统设置
- 管理 AI 工具
管理员中间件
使用 lib/middleware/admin.ts 中的 requireAdmin() 函数保护管理员路由:
import { requireAdmin } from "@/lib/middleware/admin";
export async function GET(request: Request) {
const session = await requireAdmin();
// 只有管理员可以访问
}
API 路由
用户管理 API
路径: /api/admin/users
- GET: 获取用户列表(支持分页)
- 查询参数:
limit,offset
- 查询参数:
- PATCH: 更新用户信息
- 请求体:
{ id, email?, role?, isActive? }
- 请求体:
- DELETE: 删除用户
- 查询参数:
id
- 查询参数:
系统设置 API
路径: /api/admin/settings
- GET: 获取系统设置
- 查询参数:
key(可选,获取特定设置)
- 查询参数:
- POST: 更新系统设置
- 请求体:
{ key, value }
- 请求体:
工具管理 API
路径: /api/admin/tools
- GET: 获取工具配置列表
- 查询参数:
toolName(可选,获取特定工具)
- 查询参数:
- POST: 更新工具配置
- 请求体:
{ toolName, isEnabled, description?, config? }
- 请求体:
系统设置页面
路径: /admin/settings
管理员可以通过此页面管理:
1. 用户管理
- 查看所有用户列表
- 修改用户角色(guest/regular/admin)
- 激活/禁用用户账户
- 删除用户账户
2. 网站设置
- 设置网站名称
- 配置网站 LOGO URL
- 配置浏览器图标(Favicon)URL
- 配置白天模式 LOGO URL
- 配置黑夜模式 LOGO URL
3. 工具库管理
- 查看所有可用 AI 工具
- 启用/禁用工具
- 工具状态实时更新
工具注册系统
系统使用 lib/ai/tools-registry.ts 管理工具启用状态:
import { getEnabledTools } from "@/lib/ai/tools-registry";
// 获取启用的工具列表
const enabledTools = await getEnabledTools();
// 返回: ["getWeather", "createDocument", ...]
聊天 API 会自动根据工具配置决定哪些工具可用。
数据库迁移
运行以下命令创建数据库迁移:
# 生成迁移文件
pnpm db:generate
# 应用迁移
pnpm db:migrate
创建管理员账户
要创建管理员账户,可以通过以下方式:
- 通过数据库直接更新:
UPDATE "User" SET role = 'admin' WHERE email = 'admin@example.com';
- 通过系统设置页面:
- 以管理员身份登录
- 访问
/admin/settings - 在"用户管理"标签页中找到目标用户
- 将角色修改为"管理员"
使用示例
访问系统设置页面
- 以管理员身份登录
- 访问
http://localhost:3000/admin/settings - 使用三个标签页管理不同功能
更新网站设置
// 通过 API
await fetch("/api/admin/settings", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
key: "siteName",
value: "我的 AI 聊天机器人",
}),
});
禁用工具
// 通过 API
await fetch("/api/admin/tools", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
toolName: "getWeather",
isEnabled: false,
description: "获取天气信息",
}),
});
安全注意事项
- 所有管理员 API 都使用
requireAdmin()中间件保护 - 只有管理员角色的用户才能访问系统设置页面
- 用户删除操作需要确认,防止误操作
- 系统设置更改会记录更新者信息
常见问题
1. 数据库连接失败
问题: 无法连接到 PostgreSQL 数据库
解决方案:
- 检查
POSTGRES_URL环境变量是否正确 - 确认数据库服务正在运行
- 检查网络连接和防火墙设置
2. 认证失败
问题: 用户无法登录
解决方案:
- 检查
AUTH_SECRET是否设置 - 确认
AUTH_URL与部署 URL 匹配 - 检查数据库中的用户数据
3. AI 模型无响应
问题: AI 模型不返回响应
解决方案:
- 检查 AI Gateway API 密钥(非 Vercel 部署)
- 确认模型 ID 正确
- 检查网络连接
- 查看控制台错误日志
4. 流式传输中断
问题: 流式响应中途断开
解决方案:
- 配置 Redis 以启用可恢复流式传输
- 检查网络稳定性
- 增加超时时间设置
5. Artifact 不显示
问题: Artifact 创建后不显示
解决方案:
- 检查
dataStream.write()调用是否正确 - 确认 Artifact 类型已注册
- 查看浏览器控制台错误
- 检查数据库中的文档记录
6. 消息不保存
问题: 消息发送后未保存到数据库
解决方案:
- 检查数据库连接
- 确认
saveMessages()函数被调用 - 查看服务端日志
- 检查数据库表结构
7. 如何添加管理员功能
问题: 项目没有管理员功能,如何添加?
解决方案:
- 参考文档中的"系统设置和管理员功能"章节
- 扩展数据库 schema 添加角色字段
- 更新认证系统支持管理员类型
- 创建管理员中间件和页面
- 实现管理员专用的 API 路由
扩展资源
官方文档
相关链接
贡献指南
代码提交
- 创建功能分支
- 编写代码并添加测试
- 运行
pnpm lint和pnpm format - 提交 Pull Request
代码审查
- 确保所有测试通过
- 遵循代码规范
- 添加必要的文档
- 更新 CHANGELOG(如适用)
许可证
查看 LICENSE 文件了解许可证信息。
更新日志
v3.1.0
- 支持多种 Artifact 类型
- 改进的消息系统(parts 架构)
- 可恢复流式传输支持
- 用户权限系统
- 消息投票功能
最后更新: 2024年
维护者: 项目团队