GitHub 项目地址
您可以通过以下地址获取完整项目代码:
git clone https://github.com/18253236955/CustomerServiceAI
git clone https://github.com/18253236955/chatbot
项目结构说明
后端目录结构 (Spring Boot)
src/main/java/com/example/aics/
├── config/ # 配置类
│ ├── SecurityConfig.java
│ └── WebConfig.java
├── controller/ # API控制器
│ ├── AuthController.java
│ └── ChatController.java
├── dto/ # 数据传输对象
│ ├── ChatRequest.java
│ └── ChatResponse.java
├── entity/ # 数据库实体
│ └── Message.java
├── repository/ # 数据访问层
│ └── MessageRepository.java
├── service/ # 业务逻辑
│ ├── ChatService.java
│ └── UserService.java
├── util/ # 工具类
│ └── JwtUtil.java
└── AicsApplication.java # 启动类
前端目录结构 (Vue 3)
src/
├── api/ # API接口定义
│ └── chat.js
├── assets/ # 静态资源
├── components/ # 公共组件
│ ├── ChatWindow.vue
│ └── LoginForm.vue
├── router/ # 路由配置
│ └── index.js
├── store/ # Vuex状态管理
│ └── index.js
├── views/ # 页面视图
│ ├── ChatView.vue
│ └── LoginView.vue
└── main.js # 入口文件
快速启动指南
1. 环境准备
# 后端环境
JDK 11+
Maven 3.6+
MySQL 8.0+
# 前端环境
Node.js 16+
npm 8+
2. 数据库配置
CREATE DATABASE aics_db;
CREATE USER 'aics_user'@'%' IDENTIFIED BY 'Aics@1234';
GRANT ALL PRIVILEGES ON aics_db.* TO 'aics_user'@'%';
FLUSH PRIVILEGES;
3. 后端配置
application.properties 配置示例:
# 数据源配置
spring.datasource.url=jdbc:mysql://localhost:3306/aics_db
spring.datasource.username=aics_user
spring.datasource.password=Aics@1234
# JWT配置
jwt.secret=your-256-bit-secret
jwt.expiration=86400000 # 24小时
# DeepSeek API配置
deepseek.api.url=https://api.deepseek.com/v1/chat
deepseek.api.key=${DEEPSEEK_API_KEY}
4. 前端配置
.env.development 配置示例:
VUE_APP_API_BASE_URL=http://localhost:8080
VUE_APP_WS_URL=ws://localhost:8080/ws
核心功能实现代码
1. WebSocket 实时通信(后端)
@Configuration
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer {
@Override
public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
registry.addHandler(chatHandler(), "/ws/chat")
.setAllowedOrigins("*")
.addInterceptors(new HttpSessionHandshakeInterceptor());
}
@Bean
public ChatHandler chatHandler() {
return new ChatHandler();
}
}
public class ChatHandler extends TextWebSocketHandler {
@Autowired
private ChatService chatService;
@Override
protected void handleTextMessage(WebSocketSession session, TextMessage message) {
String payload = message.getPayload();
String reply = chatService.processMessage(payload);
session.sendMessage(new TextMessage(reply));
}
}
2. 前端聊天组件
<template>
<div class="chat-container">
<div class="message-list">
<div v-for="(msg, index) in messages"
:key="index"
:class="['message', msg.sender]">
<div class="avatar">
<img :src="msg.sender === 'user' ? userAvatar : botAvatar" />
</div>
<div class="content">
<div class="text">{{ msg.content }}</div>
<div class="time">{{ formatTime(msg.timestamp) }}</div>
</div>
</div>
</div>
<div class="input-area">
<el-input
v-model="inputMessage"
placeholder="请输入您的问题..."
@keyup.enter.native="sendMessage"
>
<template #append>
<el-button @click="sendMessage">
<i class="el-icon-s-promotion"></i>
</el-button>
</template>
</el-input>
</div>
</div>
</template>
<script>
export default {
data() {
return {
inputMessage: '',
messages: [],
ws: null
};
},
mounted() {
this.connectWebSocket();
},
methods: {
connectWebSocket() {
this.ws = new WebSocket(process.env.VUE_APP_WS_URL);
this.ws.onmessage = (event) => {
this.messages.push({
sender: 'bot',
content: event.data,
timestamp: new Date()
});
};
},
sendMessage() {
if (this.inputMessage.trim()) {
const msg = {
sender: 'user',
content: this.inputMessage,
timestamp: new Date()
};
this.messages.push(msg);
this.ws.send(this.inputMessage);
this.inputMessage = '';
}
}
}
};
</script>
部署配置
Docker Compose 配置
version: '3'
services:
backend:
build: ./backend
environment:
- DEEPSEEK_API_KEY=your_api_key
ports:
- "8080:8080"
depends_on:
- mysql
frontend:
build: ./frontend
ports:
- "80:80"
depends_on:
- backend
mysql:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: rootpass
MYSQL_DATABASE: aics_db
MYSQL_USER: aics_user
MYSQL_PASSWORD: Aics@1234
volumes:
- mysql_data:/var/lib/mysql
volumes:
mysql_data:
项目扩展建议
1. 知识库增强(python)
# knowledge_enhancer.py
from sentence_transformers import SentenceTransformer
import numpy as np
class KnowledgeEnhancer:
def __init__(self):
self.model = SentenceTransformer('paraphrase-multilingual-MiniLM-L12-v2')
self.knowledge_base = {}
def add_knowledge(self, question, answer):
embedding = self.model.encode(question)
self.knowledge_base[question] = {
'answer': answer,
'embedding': embedding
}
def find_best_match(self, query, threshold=0.8):
query_embed = self.model.encode(query)
best_score = 0
best_match = None
for q, data in self.knowledge_base.items():
similarity = np.dot(query_embed, data['embedding'])
if similarity > best_score:
best_score = similarity
best_match = data['answer']
return best_match if best_score > threshold else None
2. 监控仪表盘
// 使用ECharts实现数据可视化
export default {
mounted() {
this.initChart();
},
methods: {
initChart() {
const chart = echarts.init(this.$refs.chart);
chart.setOption({
title: { text: '对话统计' },
tooltip: {},
xAxis: {
data: ['周一','周二','周三','周四','周五','周六','周日']
},
yAxis: {},
series: [{
name: '对话量',
type: 'bar',
data: [5, 20, 36, 10, 10, 20, 15]
}]
});
}
}
}
项目运行验证
测试用例(Postman Collection)
{
"info": {
"name": "AI Customer Service Test",
"schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json"
},
"item": [
{
"name": "用户登录",
"request": {
"method": "POST",
"header": [],
"body": {
"mode": "raw",
"raw": "{"username":"testuser","password":"Test@1234"}"
},
"url": "http://localhost:8080/api/auth/login"
}
},
{
"name": "发送消息",
"request": {
"method": "POST",
"header": [
{
"key": "Authorization",
"value": "Bearer {{token}}"
}
],
"body": {
"mode": "raw",
"raw": "{"message":"如何重置密码?"}"
},
"url": "http://localhost:8080/api/chat"
}
}
]
}
该完整项目包含以下关键特性:
- 前后端完整交互流程
- JWT认证与权限管理
- WebSocket实时通信
- 消息持久化存储
- 响应式前端界面
- Docker容器化部署
- 知识库增强支持
- 数据可视化监控
可以通过修改配置文件和补充业务逻辑,快速适配不同企业的实际需求。建议在实际部署时配置HTTPS证书,并使用Nginx进行负载均衡。