mirror of
https://codeup.aliyun.com/67762337eccfc218f6110e0e/vue/learning-system-portal.git
synced 2025-12-07 01:46:42 +08:00
新增AI聊天对话接口和会话消息记录查询接口,支持SSE流式响应处理。 在sendMessage组件中集成真实SE调用逻辑,替换原有模拟实现, 并完善conversationId的获取与保存机制。新增sseHelper工具类用于统一处理SSE连接和数据解析。
83 lines
2.2 KiB
JavaScript
83 lines
2.2 KiB
JavaScript
/**
|
||
* SSE流式数据处理工具
|
||
*/
|
||
|
||
/**
|
||
* 处理SSE响应数据
|
||
* @param {String} data - SSE响应数据
|
||
* @param {Function} onMessage - 处理消息的回调函数
|
||
* @param {Function} onComplete - 完成时的回调函数
|
||
* @param {Function} onError - 错误处理回调函数
|
||
*/
|
||
export function processSSEData(data, onMessage, onComplete, onError) {
|
||
try {
|
||
const lines = data.split('\n')
|
||
for (const line of lines) {
|
||
if (line.startsWith('data: ')) {
|
||
const jsonData = JSON.parse(line.substring(6))
|
||
onMessage(jsonData)
|
||
|
||
// 如果状态为4,表示对话结束
|
||
if (jsonData.data && jsonData.data.status === 4) {
|
||
onComplete()
|
||
}
|
||
}
|
||
}
|
||
} catch (error) {
|
||
console.error('处理SSE数据时出错:', error)
|
||
if (onError) {
|
||
onError(error)
|
||
}
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 创建SSE连接
|
||
* @param {String} url - 请求地址
|
||
* @param {Object} data - 请求数据
|
||
* @param {Function} onMessage - 消息处理回调
|
||
* @param {Function} onComplete - 完成回调
|
||
* @param {Function} onError - 错误回调
|
||
* @returns {Promise} - 返回fetch Promise
|
||
*/
|
||
export function createSSEConnection(url, data, onMessage, onComplete, onError) {
|
||
return fetch(url, {
|
||
method: 'POST',
|
||
headers: {
|
||
'Content-Type': 'application/json'
|
||
},
|
||
body: JSON.stringify(data)
|
||
}).then(response => {
|
||
if (!response.ok) {
|
||
throw new Error(`HTTP error! status: ${response.status}`)
|
||
}
|
||
|
||
const reader = response.body.getReader()
|
||
const decoder = new TextDecoder('utf-8')
|
||
let buffer = ''
|
||
|
||
function read() {
|
||
reader.read().then(({ done, value }) => {
|
||
if (done) {
|
||
if (onComplete) onComplete()
|
||
return
|
||
}
|
||
|
||
buffer += decoder.decode(value, { stream: true })
|
||
processSSEData(buffer, onMessage, onComplete, onError)
|
||
|
||
// 继续读取
|
||
read()
|
||
}).catch(error => {
|
||
console.error('SSE读取错误:', error)
|
||
if (onError) onError(error)
|
||
})
|
||
}
|
||
|
||
// 开始读取数据
|
||
read()
|
||
}).catch(error => {
|
||
console.error('SSE连接错误:', error)
|
||
if (onError) onError(error)
|
||
})
|
||
} |