|  | @ -8,14 +8,13 @@ import { marked } from 'marked'; // 引入marked库 | 
		
	
		
			
				|  |  | import katex from 'katex'; // 引入 KaTeX 库 |  |  | import katex from 'katex'; // 引入 KaTeX 库 | 
		
	
		
			
				|  |  | import 'katex/dist/katex.min.css'; // 引入 KaTeX 样式 |  |  | import 'katex/dist/katex.min.css'; // 引入 KaTeX 样式 | 
		
	
		
			
				|  |  | 
 |  |  | 
 | 
		
	
		
			
				|  |  | const { getQueryVariable } = useUserInfo() |  |  |  | 
		
	
		
			
				|  |  | // 假设 getSessionId 已经正确定义 |  |  |  | 
		
	
		
			
				|  |  | const { getSessionId } = useUserInfo() |  |  |  | 
		
	
		
			
				|  |  |  |  |  | const { getQueryVariable,getSessionId,fetchUserInfo,loading,isReady } = useUserInfo() | 
		
	
		
			
				|  |  |  |  |  | const errorMsg = ref('') | 
		
	
		
			
				|  |  | 
 |  |  | 
 | 
		
	
		
			
				|  |  | const isTokenValid = ref(false) |  |  | const isTokenValid = ref(false) | 
		
	
		
			
				|  |  | const fnGetToken = () => { |  |  | const fnGetToken = () => { | 
		
	
		
			
				|  |  |     localStorage.setItem('localToken', decodeURIComponent(String(getQueryVariable('token')))) |  |  |     localStorage.setItem('localToken', decodeURIComponent(String(getQueryVariable('token')))) | 
		
	
		
			
				|  |  |     console.log(localStorage.getItem('localToken')); |  |  |  | 
		
	
		
			
				|  |  |  |  |  |     // console.log(localStorage.getItem('localToken')); | 
		
	
		
			
				|  |  | } |  |  | } | 
		
	
		
			
				|  |  | setTimeout(() => { |  |  | setTimeout(() => { | 
		
	
		
			
				|  |  |     fnGetToken() |  |  |     fnGetToken() | 
		
	
	
		
			
				|  | @ -24,11 +23,20 @@ setTimeout(() => { | 
		
	
		
			
				|  |  | // 验证 token |  |  | // 验证 token | 
		
	
		
			
				|  |  | const validateToken = async () => { |  |  | const validateToken = async () => { | 
		
	
		
			
				|  |  |     const token = localStorage.getItem('localToken') |  |  |     const token = localStorage.getItem('localToken') | 
		
	
		
			
				|  |  |     console.log('token',token); |  |  |  | 
		
	
		
			
				|  |  |  |  |  |     // console.log('token', token); | 
		
	
		
			
				|  |  |     if (!token) { |  |  |     if (!token) { | 
		
	
		
			
				|  |  |         console.error('未找到 token,请重新登录') |  |  |         console.error('未找到 token,请重新登录') | 
		
	
		
			
				|  |  |  |  |  |         errorMsg.value = '用户未登录' | 
		
	
		
			
				|  |  |         return false |  |  |         return false | 
		
	
		
			
				|  |  |     } |  |  |     } | 
		
	
		
			
				|  |  |  |  |  |     // 如果token验证通过,获取权限 | 
		
	
		
			
				|  |  |  |  |  |     await fetchUserInfo(); | 
		
	
		
			
				|  |  |  |  |  |     console.log('loading', loading.value); | 
		
	
		
			
				|  |  |  |  |  |     if(!isReady.value){ | 
		
	
		
			
				|  |  |  |  |  |         errorMsg.value = 'token 验证失败' | 
		
	
		
			
				|  |  |  |  |  |        return false  | 
		
	
		
			
				|  |  |  |  |  |     } | 
		
	
		
			
				|  |  |  |  |  | 
 | 
		
	
		
			
				|  |  |     return true |  |  |     return true | 
		
	
		
			
				|  |  | } |  |  | } | 
		
	
		
			
				|  |  | // 创建新对话 |  |  | // 创建新对话 | 
		
	
	
		
			
				|  | @ -246,9 +254,6 @@ onMounted(async () => { | 
		
	
		
			
				|  |  |     // 再验证 token |  |  |     // 再验证 token | 
		
	
		
			
				|  |  |     const isValid = await validateToken() |  |  |     const isValid = await validateToken() | 
		
	
		
			
				|  |  |     isTokenValid.value = isValid |  |  |     isTokenValid.value = isValid | 
		
	
		
			
				|  |  |     if (!isValid) { |  |  |  | 
		
	
		
			
				|  |  |         console.error('Token 验证失败,请重新登录') |  |  |  | 
		
	
		
			
				|  |  |     } |  |  |  | 
		
	
		
			
				|  |  | }) |  |  | }) | 
		
	
		
			
				|  |  | </script> |  |  | </script> | 
		
	
		
			
				|  |  | <template> |  |  | <template> | 
		
	
	
		
			
				|  | @ -301,42 +306,54 @@ onMounted(async () => { | 
		
	
		
			
				|  |  |         </div> |  |  |         </div> | 
		
	
		
			
				|  |  |         <!-- 未登录覆盖层 --> |  |  |         <!-- 未登录覆盖层 --> | 
		
	
		
			
				|  |  |         <div v-if="!isTokenValid" class="overlay"> |  |  |         <div v-if="!isTokenValid" class="overlay"> | 
		
	
		
			
				|  |  |             <div class="overlay-content">用户未登录</div> |  |  |  | 
		
	
		
			
				|  |  |  |  |  |             <div class="overlay-content">{{errorMsg}}</div> | 
		
	
		
			
				|  |  |         </div> |  |  |         </div> | 
		
	
		
			
				|  |  |     </div> |  |  |     </div> | 
		
	
		
			
				|  |  | </template> |  |  | </template> | 
		
	
		
			
				|  |  | 
 |  |  | 
 | 
		
	
		
			
				|  |  | 
 |  |  | 
 | 
		
	
		
			
				|  |  | <style scoped> |  |  | <style scoped> | 
		
	
		
			
				|  |  | table{ |  |  |  | 
		
	
		
			
				|  |  |  |  |  | table { | 
		
	
		
			
				|  |  |     border-color: black |  |  |     border-color: black | 
		
	
		
			
				|  |  | } |  |  | } | 
		
	
		
			
				|  |  |  |  |  | 
 | 
		
	
		
			
				|  |  | /* 使用更具体的选择器 */ |  |  | /* 使用更具体的选择器 */ | 
		
	
		
			
				|  |  | .message-bubble .message-content .thinking-content { |  |  | .message-bubble .message-content .thinking-content { | 
		
	
		
			
				|  |  |     color: #c8c4c4; |  |  |     color: #c8c4c4; | 
		
	
		
			
				|  |  |     font-style: italic; |  |  |     font-style: italic; | 
		
	
		
			
				|  |  | } |  |  | } | 
		
	
		
			
				|  |  |  |  |  | 
 | 
		
	
		
			
				|  |  | /* 新增表格样式 */ |  |  | /* 新增表格样式 */ | 
		
	
		
			
				|  |  | .message-bubble .message-content table { |  |  | .message-bubble .message-content table { | 
		
	
		
			
				|  |  |     border-collapse: collapse; /* 合并边框 */ |  |  |  | 
		
	
		
			
				|  |  |     width: 100%; /* 表格宽度为 100% */ |  |  |  | 
		
	
		
			
				|  |  |  |  |  |     border-collapse: collapse; | 
		
	
		
			
				|  |  |  |  |  |     /* 合并边框 */ | 
		
	
		
			
				|  |  |  |  |  |     width: 100%; | 
		
	
		
			
				|  |  |  |  |  |     /* 表格宽度为 100% */ | 
		
	
		
			
				|  |  | } |  |  | } | 
		
	
		
			
				|  |  | 
 |  |  | 
 | 
		
	
		
			
				|  |  | .message-bubble .message-content th, |  |  | .message-bubble .message-content th, | 
		
	
		
			
				|  |  | .message-bubble .message-content td { |  |  | .message-bubble .message-content td { | 
		
	
		
			
				|  |  |     border: 1px solid #e0e0e0; /* 单元格边框 */ |  |  |  | 
		
	
		
			
				|  |  |     padding: 8px; /* 单元格内边距 */ |  |  |  | 
		
	
		
			
				|  |  |     text-align: left; /* 文本左对齐 */ |  |  |  | 
		
	
		
			
				|  |  |  |  |  |     border: 1px solid #e0e0e0; | 
		
	
		
			
				|  |  |  |  |  |     /* 单元格边框 */ | 
		
	
		
			
				|  |  |  |  |  |     padding: 8px; | 
		
	
		
			
				|  |  |  |  |  |     /* 单元格内边距 */ | 
		
	
		
			
				|  |  |  |  |  |     text-align: left; | 
		
	
		
			
				|  |  |  |  |  |     /* 文本左对齐 */ | 
		
	
		
			
				|  |  | } |  |  | } | 
		
	
		
			
				|  |  | 
 |  |  | 
 | 
		
	
		
			
				|  |  | .message-bubble .message-content th { |  |  | .message-bubble .message-content th { | 
		
	
		
			
				|  |  |     background-color: #f1f3f5; /* 表头背景颜色 */ |  |  |  | 
		
	
		
			
				|  |  |  |  |  |     background-color: #f1f3f5; | 
		
	
		
			
				|  |  |  |  |  |     /* 表头背景颜色 */ | 
		
	
		
			
				|  |  | } |  |  | } | 
		
	
		
			
				|  |  |  |  |  | 
 | 
		
	
		
			
				|  |  | /* 其他样式保持不变 */ |  |  | /* 其他样式保持不变 */ | 
		
	
		
			
				|  |  | .message-item.bot { |  |  | .message-item.bot { | 
		
	
		
			
				|  |  |     justify-content: flex-start; /* 让机器人消息靠左对齐 */ |  |  |  | 
		
	
		
			
				|  |  |     text-align: left; /* 新增:设置文本左对齐 */ |  |  |  | 
		
	
		
			
				|  |  |  |  |  |     justify-content: flex-start; | 
		
	
		
			
				|  |  |  |  |  |     /* 让机器人消息靠左对齐 */ | 
		
	
		
			
				|  |  |  |  |  |     text-align: left; | 
		
	
		
			
				|  |  |  |  |  |     /* 新增:设置文本左对齐 */ | 
		
	
		
			
				|  |  | } |  |  | } | 
		
	
		
			
				|  |  |  |  |  | 
 | 
		
	
		
			
				|  |  | .chat-container { |  |  | .chat-container { | 
		
	
		
			
				|  |  |     display: flex; |  |  |     display: flex; | 
		
	
		
			
				|  |  |     flex-direction: column; |  |  |     flex-direction: column; | 
		
	
	
		
			
				|  | @ -547,7 +564,4 @@ table{ | 
		
	
		
			
				|  |  |     box-shadow: 0 0 10px rgba(0, 0, 0, 0.1); |  |  |     box-shadow: 0 0 10px rgba(0, 0, 0, 0.1); | 
		
	
		
			
				|  |  |     text-align: center; |  |  |     text-align: center; | 
		
	
		
			
				|  |  | } |  |  | } | 
		
	
		
			
				|  |  | 
 |  |  |  | 
		
	
		
			
				|  |  | 
 |  |  |  | 
		
	
		
			
				|  |  | 
 |  |  |  | 
		
	
		
			
				|  |  | </style> |  |  | </style> |