24小时在线咨询 186 7123 0772
保姆级,10 分钟教你用deepseek api 搭建一个聊天网站
已浏览:57 来源:本站 发布时间:2025-04-16 16:05

下面我将详细介绍如何使用DeepSeek API搭建一个功能完整的聊天网站,从前端到后端再到部署的全过程。

1. 准备工作

1.1 获取DeepSeek API密钥

访问DeepSeek官网注册账号

进入开发者平台获取API密钥

了解API的计费方式使用限制

1.2 技术栈选择

前端:React.js + Vite (轻量快速)

后端:Node.js + Express (简单易用)

部署:Vercel (全栈部署平台)

2. 前端实现

2.1 创建React项目

npm create vite@latest deepseek-chat --template react cd deepseek-chat npm install

2.2 安装必要依赖

 

 

npm install axios react-icons @uiw/react-markdown-preview

2.3 核心聊天组件代码

src/components/ChatInterface.jsx

jsx

 

import { useState, useRef, useEffect } from 'react'; import axios from 'axios'; import Markdown from '@uiw/react-markdown-preview'; export default function ChatInterface() {  const [messages, setMessages] = useState([]);  const [input, setInput] = useState('');  const [isLoading, setIsLoading] = useState(false);  const messagesEndRef = useRef(null);  // 自动滚动到底部  useEffect(() => {    messagesEndRef.current?.scrollIntoView({ behavior: 'smooth' });  }, [messages]);  const handleSend = async () => {    if (!input.trim() || isLoading) return;        // 添加用户消息    const userMessage = { role: 'user', content: input };    setMessages(prev => [...prev, userMessage]);    setInput('');    setIsLoading(true);        try {      // 调用后端API      const response = await axios.post('/api/chat', {        messages: [...messages, userMessage]      });            // 添加AI回复      setMessages(prev => [...prev, {        role: 'assistant',        content: response.data.reply      }]);    } catch (error) {      console.error('API调用失败:', error);      setMessages(prev => [...prev, {        role: 'assistant',        content: '抱歉,发生错误,请稍后再试。'      }]);    } finally {      setIsLoading(false);    }  };  return (    

className="flex flex-col h-screen max-w-3xl mx-auto p-4">      
className="flex-1 overflow-y-auto mb-4 space-y-4">        {messages.map((msg, i) => (          
key={i}            className={`flex ${msg.role === 'user' ? 'justify-end' : 'justify-start'}`}          >            
className={`max-w-3/4 rounded-lg p-4 ${              msg.role === 'user'                ? 'bg-blue-500 text-white'                : 'bg-gray-100 text-gray-800'            }`}>              {msg.role === 'assistant' ? (                <Markdown source={msg.content} />              ) : (                msg.content              )}            
         
       ))}        {isLoading && (          
className="flex justify-start">            
className="bg-gray-100 rounded-lg p-4 text-gray-800">              
className="flex space-x-2">                
className="w-2 h-2 rounded-full bg-gray-400 animate-bounce">
               
className="w-2 h-2 rounded-full bg-gray-400 animate-bounce delay-100">
               
className="w-2 h-2 rounded-full bg-gray-400 animate-bounce delay-200">
             
           
         
       )}        
ref={messagesEndRef} />      
           
className="flex space-x-2">        type="text"          value={input}          onChange={(e) => setInput(e.target.value)}          onKeyDown={(e) => e.key === 'Enter' && handleSend()}          placeholder="输入消息..."          className="flex-1 border border-gray-300 rounded-lg p-2 focus:outline-none focus:ring-2 focus:ring-blue-500"          disabled={isLoading}        />              
   
 ); }

3. 后端实现

3.1 创建后端服务

在项目根目录创建api文件夹:

 

 

mkdir api cd api npm init -y npm install express axios cors dotenv

3.2 后端API代码

api/index.js

javascript

 

require('dotenv').config(); const express = require('express'); const cors = require('cors'); const axios = require('axios'); const app = express(); const PORT = process.env.PORT || 3001; // 中间件 app.use(cors()); app.use(express.json()); // DeepSeek API配置 const DEEPSEEK_API_URL = 'https://api.deepseek.com/v1/chat/completions'; const DEEPSEEK_API_KEY = process.env.DEEPSEEK_API_KEY; // 聊天端点 app.post('/chat', async (req, res) => {  try {    const { messages } = req.body;        const response = await axios.post(DEEPSEEK_API_URL, {      model: 'deepseek-chat',      messages: messages.map(msg => ({        role: msg.role,        content: msg.content      })),      temperature: 0.7,      max_tokens: 2000    }, {      headers: {        'Content-Type': 'application/json',        'Authorization': `Bearer ${DEEPSEEK_API_KEY}`      }    });    const reply = response.data.choices[0].message.content;    res.json({ reply });  } catch (error) {    console.error('DeepSeek API错误:', error.response?.data || error.message);    res.status(500).json({ error: '调用AI服务时出错' });  } }); app.listen(PORT, () => {  console.log(`后端服务运行在 http://localhost:${PORT}`); });

3.3 环境变量配置

创建.env文件:

 

DEEPSEEK_API_KEY=你的API密钥 PORT=3001

4. 项目配置

4.1 配置Vite代理

vite.config.js

javascript

 

import { defineConfig } from 'vite' import react from '@vitejs/plugin-react' export default defineConfig({  plugins: [react()],  server: {    proxy: {      '/api': {        target: 'http://localhost:3001',        changeOrigin: true,        rewrite: (path) => path.replace(/^\/api/, '')      }    }  } })

5. 运行项目

5.1 启动后端服务

 

cd api node index.js

5.2 启动前端开发服务器

 

npm run dev

现在访问http://localhost:5173应该可以看到聊天界面了。

6. 部署到Vercel

6.1 创建Vercel项目

在Vercel官网注册/登录

安装Vercel CLI: npm install -g vercel

登录: vercel login

6.2 配置部署

创建vercel.json配置文件:

json

{  "version": 2,  "builds": [    {      "src": "api/index.js",      "use": "@vercel/node"    },    {      "src": "vite.config.js",      "use": "@vercel/static-build",      "config": {        "distDir": "dist"      }    }  ],  "routes": [    {      "src": "/api/(.*)",      "dest": "api/index.js"    },    {      "src": "/(.*)",      "dest": "dist/$1"    }  ] }

修改后端代码以适应Vercel环境:

javascript

 

// 修改api/index.js的导出方式 module.exports = app;

6.3 部署命令

 

 

vercel vercel --prod

7. 高级功能扩展

7.1 添加对话历史

javascript

 

// 在后端添加数据库连接

const mongoose = require('mongoose'); mongoose.connect(process.env.MONGODB_URI); const conversationSchema = new mongoose.Schema({  userId: String,  messages: Array,  createdAt: { type: Date, default: Date.now } }); const Conversation = mongoose.model('Conversation', conversationSchema); // 修改聊天端点保存历史 app.post('/chat', async (req, res) => {  try {    const { messages, userId } = req.body;        // ...原有API调用代码        // 保存对话    await Conversation.findOneAndUpdate(      { userId },      { $push: { messages: { $each: [userMessage, aiMessage] } } },      { upsert: true, new: true }    );        res.json({ reply });  } catch (error) {    // 错误处理  } });

7.2 添加文件上传功能

javascript

 

// 前端添加文件上传组件

const handleFileUpload = async (file) => {  const formData = new FormData();  formData.append('file', file);    const response = await axios.post('/api/upload', formData, {    headers: { 'Content-Type': 'multipart/form-data' }  });    setMessages(prev => [...prev, {    role: 'user',    content: `[文件] ${file.name}\n${response.data.text}`  }]); }; // 后端添加文件处理端点 const multer = require('multer'); const upload = multer({ dest: 'uploads/' }); app.post('/upload', upload.single('file'), async (req, res) => {  // 处理文件内容提取  // 返回提取的文本 });

8. 安全增强

8.1 添加API密钥保护

javascript

 

// 后端添加API密钥验证中间件

const apiKeyMiddleware = (req, res, next) => {  const apiKey = req.headers['x-api-key'];  if (apiKey !== process.env.API_SECRET) {    return res.status(403).json({ error: '未授权的访问' });  }  next(); }; app.use('/chat', apiKeyMiddleware);

8.2 添加速率限制

javascript

 

const rateLimit = require('express-rate-limit'); const limiter = rateLimit({  windowMs: 15 * 60 * 1000, // 15分钟  max: 100 // 每个IP限制100次请求 }); app.use(limiter);

9. 项目结构最终版

 

deepseek-chat/ ├── api/ │   ├── index.js         # 后端主文件 │   ├── package.json │   └── .env            # 环境变量 ├── public/ ├── src/ │   ├── components/ │   │   └── ChatInterface.jsx │   ├── App.jsx │   └── main.jsx ├── vite.config.js ├── vercel.json         # Vercel配置 └── package.json

这样你就完成了一个基于DeepSeek API的完整聊天网站!根据你的需求,可以继续扩展用户认证、对话历史、文件上传等功能。

看了今天的文章是不是觉得自己动手搭建网站是不是很容易了呢?