100 lines
3.6 KiB
JavaScript
100 lines
3.6 KiB
JavaScript
|
|
import { defineStore } from 'pinia'
|
||
|
|
import { ref } from 'vue'
|
||
|
|
import axios from 'axios'
|
||
|
|
|
||
|
|
const api = axios.create({
|
||
|
|
baseURL: '/api',
|
||
|
|
timeout: 30000
|
||
|
|
})
|
||
|
|
|
||
|
|
export const useChatStore = defineStore('chat', () => {
|
||
|
|
const messages = ref([])
|
||
|
|
const isLoading = ref(false)
|
||
|
|
const currentSession = ref(null)
|
||
|
|
|
||
|
|
// Mock responses for when backend is not available
|
||
|
|
const mockResponses = {
|
||
|
|
'城市生命线': '城市生命线是指城市中维持城市正常运转的关键基础设施系统,包括供水、供电、供气、通信、交通等系统。这些系统如同城市的"生命线",一旦发生故障,将对城市运行和居民生活产生重大影响。',
|
||
|
|
'关键设施': '城市生命线关键设施包括:\n1. 供水系统:水厂、管网、加压站\n2. 供电系统:变电站、配电网\n3. 供气系统:门站、调压站、管网\n4. 通信系统:基站、光纤网络\n5. 交通系统:道路、桥梁、隧道',
|
||
|
|
'消防安全': '消防安全隐患常见问题及处理措施:\n1. 消防通道堵塞 - 立即清理,保持畅通\n2. 灭火器过期 - 及时更换检修\n3. 电气线路老化 - 专业检测更换\n4. 易燃物品堆放 - 规范存储管理\n5. 消防设施损坏 - 定期检查维护',
|
||
|
|
'排水': '如何平衡排水能力和生态环境保护:\n1. 采用海绵城市理念,增加透水面积\n2. 建设生态调蓄池,减缓雨水径流\n3. 推广透水铺装,促进雨水下渗\n4. 保护自然水系,维护生态平衡\n5. 雨污分流改造,提高污水处理效率'
|
||
|
|
}
|
||
|
|
|
||
|
|
const getMockResponse = (input) => {
|
||
|
|
for (const [key, value] of Object.entries(mockResponses)) {
|
||
|
|
if (input.includes(key)) {
|
||
|
|
return value
|
||
|
|
}
|
||
|
|
}
|
||
|
|
return `您好!关于"${input}"的问题,我正在为您查询相关资料。作为城市生命线智能助手,我可以帮助您:\n\n1. 查询城市生命线相关知识\n2. 识别潜在安全隐患\n3. 编制应急预案\n4. 撰写公文报告\n\n请问还有什么可以帮助您的?`
|
||
|
|
}
|
||
|
|
|
||
|
|
const sendMessage = async (content) => {
|
||
|
|
isLoading.value = true
|
||
|
|
try {
|
||
|
|
const response = await api.post('/chat/send', {
|
||
|
|
content,
|
||
|
|
role: 'user',
|
||
|
|
sessionId: currentSession.value
|
||
|
|
})
|
||
|
|
return response.data
|
||
|
|
} catch (error) {
|
||
|
|
console.log('Backend not available, using mock response')
|
||
|
|
// Return mock response when backend is not available
|
||
|
|
return {
|
||
|
|
id: Date.now().toString(),
|
||
|
|
content: getMockResponse(content),
|
||
|
|
role: 'assistant',
|
||
|
|
timestamp: new Date().toISOString()
|
||
|
|
}
|
||
|
|
} finally {
|
||
|
|
isLoading.value = false
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
const getHistory = async () => {
|
||
|
|
try {
|
||
|
|
const response = await api.get('/chat/history')
|
||
|
|
messages.value = response.data
|
||
|
|
return response.data
|
||
|
|
} catch (error) {
|
||
|
|
console.log('Backend not available')
|
||
|
|
return []
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
const getSuggestions = async () => {
|
||
|
|
try {
|
||
|
|
const response = await api.get('/chat/suggestions')
|
||
|
|
return response.data
|
||
|
|
} catch (error) {
|
||
|
|
return [
|
||
|
|
'城市生命线关键设施有哪些?',
|
||
|
|
'消防安全隐患常见问题以及处理措施有哪些?',
|
||
|
|
'如何平衡排水能力和生态环境保护?'
|
||
|
|
]
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
const newChat = async () => {
|
||
|
|
try {
|
||
|
|
await api.post('/chat/new')
|
||
|
|
messages.value = []
|
||
|
|
currentSession.value = Date.now().toString()
|
||
|
|
} catch (error) {
|
||
|
|
messages.value = []
|
||
|
|
currentSession.value = Date.now().toString()
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
return {
|
||
|
|
messages,
|
||
|
|
isLoading,
|
||
|
|
currentSession,
|
||
|
|
sendMessage,
|
||
|
|
getHistory,
|
||
|
|
getSuggestions,
|
||
|
|
newChat
|
||
|
|
}
|
||
|
|
})
|