Files
urbanLifeline/江西城市生命线-可交互原型/frontend/src/stores/chat.js

100 lines
3.6 KiB
JavaScript
Raw Normal View History

2025-12-12 18:32:14 +08:00
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
}
})