添加通用交互重连

This commit is contained in:
junleea 2025-05-21 20:00:58 +08:00
parent 48289fafc6
commit 6a6c5c53fb
8 changed files with 75 additions and 110 deletions

View File

@ -35,6 +35,7 @@ const activePath = ref(route.fullPath)
const tabs = useTabsStore();
//
const setTags = (route: any) => {
console.log("set tag:",route);
const isExist = tabs.list.some(item => {
return item.path === route.fullPath;
});
@ -45,6 +46,7 @@ const setTags = (route: any) => {
path: route.fullPath
});
}
console.log("tabs list:", tabs.list);
};
setTags(route);
onBeforeRouteUpdate(to => {

View File

@ -553,22 +553,26 @@ onMounted(() => {
// //
// md.use(markdownItMermaid);
// }
let url =
"wss://pm.ljsea.top/im/ai_chat_ws?" +
"token=" +
localStorage.getItem("token");
//
let test_url = "ws://127.0.0.1:8084/im/ai_chat_ws?" + "token=" + localStorage.getItem("token");
//url =test_url;
socket.value = new WebSocket(url);
socket.value.onopen = () => {
console.log("WebSocket 连接已建立");
ElMessage.success("连接成功");
};
//getMessage(125);
messagesContainer.value = document.querySelector(".chat-messages");
IMWSConnect();
socket.value.onmessage = (event) => {
userUIconfigInfo.value = JSON.parse(
localStorage.getItem("userUIconfigInfo") || "{}"
);
console.log("userUIconfigInfo:", userUIconfigInfo.value);
messagesContainer.value = document.querySelector(".chat-messages");
//console.log("userUIconfigInfo:", userUIconfigInfo.value);
});
onUnmounted(() => {
if (socket.value) {
socket.value.close();
}
});
const doReceiveMessage = (event) => {
//
let msg: WSMessage = JSON.parse(event.data);
const existingMessage = messages.find(
(msg) => msg.role === "assistant" && !msg.finished
@ -584,64 +588,7 @@ onMounted(() => {
finished: false,
});
}
//console.log("resp:", msg);
sessionID.value = msg.session_id;
currentAIMessage.value += msg.msg.msg.response;
if (msg.msg.msg.done) {
const assistantMessage = messages[messages.length - 1];
assistantMessage.finished = true;
loading.value = false;
doButtonD();
}
nextTick(() => {
scrollToBottom(); //
});
};
socket.value.onclose = () => {
console.log("WebSocket 连接已关闭");
ElMessage.error("连接已关闭");
//
//socket.value = new WebSocket(url);
socket.value = null;
};
socket.value.onerror = (error) => {
//socket.value = new WebSocket(url);
socket.value = null;
console.error("WebSocket 发生错误:", error);
};
userUIconfigInfo.value = JSON.parse(
localStorage.getItem("userUIconfigInfo") || "{}"
);
//console.log("userUIconfigInfo:", userUIconfigInfo.value);
});
onUnmounted(() => {
if (socket.value) {
socket.value.close();
}
});
const doReceiveMessage = (event) => {
//
let msg: WSMessage = JSON.parse(event.data);
const existingMessage = messages.find(
(msg) => msg.role === "assistant" && !msg.finished
);
if (existingMessage) {
//
existingMessage.content += msg.msg.msg.response;
} else {
//
messages.push({
role: "assistant",
content: msg.msg.msg.response,
finished: false,
});
}
//console.log("resp:", msg);
sessionID.value = msg.session_id;
currentAIMessage.value += msg.msg.msg.response;
if (msg.msg.msg.done) {
@ -675,14 +622,23 @@ const updateUserUIconfigInfo = () => {
});
}
const sendMessage = () => {
localStorage.setItem("gen_ai_chat_model_id", selectModel.value.toString());
sendMessageWithFile()
const sendMessage = async () => {
//ws
if (socket.value == null) {
await IMWSConnect();
}
if(loading.value === true){
ElMessage.warning("正在等待AI回复请稍后再试");
return;
}
await nextTick();
sendMessageWithFile();
return;
};
const sendMessageWithFile = () => {
const sendMessageWithFile =async () => {
if (inputMessage.value.trim() === "") {
ElMessage.warning("消息不能为空");
return;
@ -725,33 +681,13 @@ const sendMessageWithFile = () => {
}
console.log("end_msg:", end_msg);
if(socket.value == null){
socket.value = new WebSocket(wssUrl);
socket.value.onmessage = (event) => {
doReceiveMessage(event);
};
socket.value.onclose = () => {
console.log("WebSocket 连接已关闭");
ElMessage.error("连接已关闭");
//
//socket.value = new WebSocket(url);
socket.value = null;
};
socket.value.onerror = (error) => {
//socket.value = new WebSocket(url);
socket.value = null;
console.error("WebSocket 发生错误:", error);
};
ElMessage.error("已重新连接!");
}
try {
socket.value.send(JSON.stringify(end_msg));
console.log("send msg:", end_msg);
} catch (e) {
ElMessage.error("发送失败!连接已断开!");
socket.value = new WebSocket(socket.value.url);
return;
//ElMessage.error("!!");
await IMWSConnect();
socket.value.send(JSON.stringify(end_msg));
}
if (sessionID.value == 0) {
sessionName.value = inputMessage.value;
@ -769,10 +705,6 @@ const sendMessageWithFile = () => {
}
}
// let img_content= img_msg.image_content
// for (let i = 0; i < img_content.length; i++) {
// pMsgContent += `![${img_content[i].img_name}](${img_content[i].img_url})` + "\n";
// }
pMsgContent = pMsgContent + "输入:" + file_msg.text;
} else {
pMsgContent = end_msg.msg;
@ -788,6 +720,37 @@ const sendMessageWithFile = () => {
}
};
const IMWSConnect = async () =>{
let url =
"wss://pm.ljsea.top/im/ai_chat_ws?" +
"token=" +
localStorage.getItem("token");
//
let test_url = "ws://127.0.0.1:8084/im/ai_chat_ws?" + "token=" + localStorage.getItem("token");
//url =test_url;
socket.value =new WebSocket(url);
socket.value.onopen = () => {
console.log("WebSocket 连接已建立");
ElMessage.success("连接成功");
};
socket.value.onmessage = (event) => {
doReceiveMessage(event);
};
socket.value.onclose = () => {
console.log("WebSocket 连接已关闭");
ElMessage.error("连接已关闭");
//
//socket.value = new WebSocket(url);
socket.value = null;
};
socket.value.onerror = (error) => {
socket.value = null;
console.log("WebSocket 连接发生错误:", error);
};
}
const loadSession = async (session_id: number) => {
sessionID.value = session_id;
messages.length = 0; //
@ -836,7 +799,7 @@ const getMessage = async (session_id: number) => {
};
result = await GetMessageService(req);
if (result["code"] === 0) {
console.log(result["data"]);
// console.log(result["data"]);
let data = result["data"];
for (let i = 0; i < data.length; i++) {
if (data[i]["Type"] === 3) {

View File

@ -21,7 +21,7 @@
<el-dialog title="查看详情" v-model="visible1" width="700px" destroy-on-close>
<TableDetail :data="viewData"></TableDetail>
</el-dialog>
<div>
<div v-if="code_edit">
<transition name="fade">
<div
v-if="code_edit"

View File

@ -82,7 +82,7 @@ let columns = ref([
{ prop: 'Function', label: '功能' },
{ prop: 'Info', label: '描述信息' },
{ prop: 'CreatedAt', label: '创建时间',type: 'date' },
{ prop: 'operator', label: '操作', width: 250 , operate: { view: true, edit: true, delete: true,push: {link: false,label:"继续该会话"},gen: {show: false,label:"下载文件"} }},
{ prop: 'operator', label: '操作', width: 250 , operate: { view: true, edit: true, delete: true,push: {link: false,label:"继续该会话"},gen: {show: false,label:"下载文件"}, genv2:{type:"", label:"", show:false} }},
])
const page = reactive({
index: 1,

View File

@ -87,7 +87,7 @@ let columns = ref([
{ prop: 'FileNameList', label:"知识库文件", width: 300},
{ prop: 'CreatedAt', label: '创建时间',type: 'date' },
{ prop: 'UpdatedAt', label: '上次更新时间', type: 'date'},
{ prop: 'operator', label: '操作', width: 250 , operate: { view: true, edit: true, delete: true,push: {link: false,label:"继续该会话"},gen: {show: false,label:"下载文件"} }},
{ prop: 'operator', label: '操作', width: 250 , operate: { view: true, edit: true, delete: true,push: {link: false,label:"继续该会话"},gen: {show: false,label:"下载文件"}, genv2:{type:"", label:"", show:false} }},
])
const page = reactive({
index: 1,

View File

@ -92,7 +92,7 @@ let columns = ref([
{prop: 'Url', label: 'URl'},
{ prop: 'token', label: '消耗token数',width:50},
{ prop: 'CreatedAt', label: '创建时间',type: 'date' },
{ prop: 'operator', label: '操作', width: 250 , operate: { view: true, edit: true, delete: true,push: {link: false,label:"继续该会话"},gen: {show: false,label:"下载文件"} }},
{ prop: 'operator', label: '操作', width: 250 , operate: { view: true, edit: true, delete: true,push: {link: false,label:"继续该会话"},gen: {show: false,label:"下载文件"},genv2:{type:"", label:"", show:false} }},
])
const page = reactive({
index: 1,

View File

@ -103,7 +103,7 @@ let columns = ref([
{ prop: "Context", label: "会话背景参数" ,width: 100},
{ prop: 'CreatedAt', label: '创建时间',type: 'date',width: 180 },
{ prop: 'UpdatedAt', label: '更新时间',type: 'date',width: 180 },
{ prop: 'operator', label: '操作' , operate: { view: false, edit: true, delete: true,push: {link: true,label:"继续该会话"},gen: {show: false,label:"下载文件"}}},
{ prop: 'operator', label: '操作' , operate: { view: false, edit: true, delete: true,push: {link: true,label:"继续该会话"},gen: {show: false,label:"下载文件"}, genv2:{type:"", label:"", show:false}}},
])
const getData = async () => {

View File

@ -1,6 +1,6 @@
<template>
<transition name="slide">
<div v-if="show" class="side-panel">
<div class="side-panel">
<button @click="handleClose" class="close-btn"></button>
<el-button type="primary" @click="UpdateFileCOntent">保存修改</el-button>
<div class="content">