<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>http://mobinets.cn/site/index.php?action=history&amp;feed=atom&amp;title=ZhiweiTalk</id>
	<title>ZhiweiTalk - Revision history</title>
	<link rel="self" type="application/atom+xml" href="http://mobinets.cn/site/index.php?action=history&amp;feed=atom&amp;title=ZhiweiTalk"/>
	<link rel="alternate" type="text/html" href="http://mobinets.cn/site/index.php?title=ZhiweiTalk&amp;action=history"/>
	<updated>2026-04-15T01:04:41Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.36.0</generator>
	<entry>
		<id>http://mobinets.cn/site/index.php?title=ZhiweiTalk&amp;diff=3478&amp;oldid=prev</id>
		<title>Zhiwei: Replaced content with &quot;&lt;html&gt; &lt;iframe src=&quot;https://mns.uestc.cn/resource/talk2zhiwei.html&quot; width=&quot;100%&quot; frameborder=&quot;0&quot;&gt;&lt;/iframe&gt; &lt;/html&gt;&quot;</title>
		<link rel="alternate" type="text/html" href="http://mobinets.cn/site/index.php?title=ZhiweiTalk&amp;diff=3478&amp;oldid=prev"/>
		<updated>2026-01-23T11:32:31Z</updated>

		<summary type="html">&lt;p&gt;Replaced content with &amp;quot;&amp;lt;html&amp;gt; &amp;lt;iframe src=&amp;quot;https://mns.uestc.cn/resource/talk2zhiwei.html&amp;quot; width=&amp;quot;100%&amp;quot; frameborder=&amp;quot;0&amp;quot;&amp;gt;&amp;lt;/iframe&amp;gt; &amp;lt;/html&amp;gt;&amp;quot;&lt;/p&gt;
&lt;a href=&quot;http://mobinets.cn/site/index.php?title=ZhiweiTalk&amp;amp;diff=3478&amp;amp;oldid=3477&quot;&gt;Show changes&lt;/a&gt;</summary>
		<author><name>Zhiwei</name></author>
	</entry>
	<entry>
		<id>http://mobinets.cn/site/index.php?title=ZhiweiTalk&amp;diff=3477&amp;oldid=prev</id>
		<title>Zhiwei: Created page with &quot;&lt;html lang=&quot;zh-CN&quot;&gt; &lt;head&gt;     &lt;meta charset=&quot;UTF-8&quot;&gt;     &lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&gt;     &lt;title&gt;赵老师的数字分身&lt;/title&gt;...&quot;</title>
		<link rel="alternate" type="text/html" href="http://mobinets.cn/site/index.php?title=ZhiweiTalk&amp;diff=3477&amp;oldid=prev"/>
		<updated>2026-01-23T11:25:55Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;&amp;lt;html lang=&amp;quot;zh-CN&amp;quot;&amp;gt; &amp;lt;head&amp;gt;     &amp;lt;meta charset=&amp;quot;UTF-8&amp;quot;&amp;gt;     &amp;lt;meta name=&amp;quot;viewport&amp;quot; content=&amp;quot;width=device-width, initial-scale=1.0&amp;quot;&amp;gt;     &amp;lt;title&amp;gt;赵老师的数字分身&amp;lt;/title&amp;gt;...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&amp;lt;html lang=&amp;quot;zh-CN&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
    &amp;lt;meta charset=&amp;quot;UTF-8&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;meta name=&amp;quot;viewport&amp;quot; content=&amp;quot;width=device-width, initial-scale=1.0&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;title&amp;gt;赵老师的数字分身&amp;lt;/title&amp;gt;&lt;br /&gt;
    &amp;lt;style&amp;gt;&lt;br /&gt;
        /* 仅保留核心样式，移除背景色 */&lt;br /&gt;
        .dt-container {&lt;br /&gt;
            max-width: 800px;&lt;br /&gt;
            margin: 0 auto;&lt;br /&gt;
            background: white;&lt;br /&gt;
            border-radius: 15px;&lt;br /&gt;
            box-shadow: 0 10px 30px rgba(0,0,0,0.2);&lt;br /&gt;
            overflow: hidden;&lt;br /&gt;
            font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        .dt-header {&lt;br /&gt;
            background: linear-gradient(135deg, #4a90e2 0%, #667eea 100%);&lt;br /&gt;
            color: white;&lt;br /&gt;
            padding: 20px;&lt;br /&gt;
            text-align: center;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        .dt-header h1 {&lt;br /&gt;
            font-size: 24px;&lt;br /&gt;
            margin-bottom: 5px;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        .dt-header p {&lt;br /&gt;
            font-size: 14px;&lt;br /&gt;
            opacity: 0.9;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        .dt-chat-area {&lt;br /&gt;
            height: 400px;&lt;br /&gt;
            overflow-y: auto;&lt;br /&gt;
            padding: 20px;&lt;br /&gt;
            background: #f8f9fa;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        .dt-message {&lt;br /&gt;
            margin-bottom: 15px;&lt;br /&gt;
            padding: 12px 16px;&lt;br /&gt;
            border-radius: 12px;&lt;br /&gt;
            max-width: 80%;&lt;br /&gt;
            word-wrap: break-word;&lt;br /&gt;
            line-height: 1.5;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        .dt-user-message {&lt;br /&gt;
            background: linear-gradient(135deg, #4a90e2 0%, #667eea 100%);&lt;br /&gt;
            color: white;&lt;br /&gt;
            margin-left: auto;&lt;br /&gt;
            text-align: right;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        .dt-bot-message {&lt;br /&gt;
            background: #e9ecef;&lt;br /&gt;
            color: #333;&lt;br /&gt;
            margin-right: auto;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        .dt-input-area {&lt;br /&gt;
            padding: 20px;&lt;br /&gt;
            background: white;&lt;br /&gt;
            border-top: 1px solid #eee;&lt;br /&gt;
            display: flex;&lt;br /&gt;
            gap: 10px;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        .dt-message-input {&lt;br /&gt;
            flex: 1;&lt;br /&gt;
            padding: 12px 15px;&lt;br /&gt;
            border: 2px solid #e1e5e9;&lt;br /&gt;
            border-radius: 25px;&lt;br /&gt;
            resize: none;&lt;br /&gt;
            height: 50px;&lt;br /&gt;
            font-size: 14px;&lt;br /&gt;
            transition: border-color 0.3s;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        .dt-message-input:focus {&lt;br /&gt;
            outline: none;&lt;br /&gt;
            border-color: #4a90e2;&lt;br /&gt;
            box-shadow: 0 0 0 3px rgba(74, 144, 226, 0.1);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        .dt-button-group {&lt;br /&gt;
            display: flex;&lt;br /&gt;
            gap: 10px;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        .dt-send-button, .dt-save-button {&lt;br /&gt;
            padding: 12px 20px;&lt;br /&gt;
            border: none;&lt;br /&gt;
            border-radius: 25px;&lt;br /&gt;
            cursor: pointer;&lt;br /&gt;
            font-size: 14px;&lt;br /&gt;
            font-weight: 500;&lt;br /&gt;
            transition: transform 0.2s, box-shadow 0.2s;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        .dt-send-button {&lt;br /&gt;
            background: linear-gradient(135deg, #4a90e2 0%, #667eea 100%);&lt;br /&gt;
            color: white;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        .dt-save-button {&lt;br /&gt;
            background: linear-gradient(135deg, #28a745 0%, #20c997 100%);&lt;br /&gt;
            color: white;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        .dt-send-button:hover, .dt-save-button:hover {&lt;br /&gt;
            transform: translateY(-2px);&lt;br /&gt;
            box-shadow: 0 4px 12px rgba(0,0,0,0.15);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        .dt-send-button:active, .dt-save-button:active {&lt;br /&gt;
            transform: translateY(0);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        .dt-typing-indicator {&lt;br /&gt;
            display: inline-block;&lt;br /&gt;
            padding: 12px 16px;&lt;br /&gt;
            background: #e9ecef;&lt;br /&gt;
            border-radius: 12px;&lt;br /&gt;
            font-style: italic;&lt;br /&gt;
            color: #666;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        .dt-status-bar {&lt;br /&gt;
            background: #f8f9fa;&lt;br /&gt;
            padding: 10px 20px;&lt;br /&gt;
            border-top: 1px solid #eee;&lt;br /&gt;
            font-size: 12px;&lt;br /&gt;
            color: #666;&lt;br /&gt;
            text-align: center;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        .dt-welcome-message {&lt;br /&gt;
            text-align: center;&lt;br /&gt;
            color: #666;&lt;br /&gt;
            font-style: italic;&lt;br /&gt;
            padding: 20px;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        /* Markdown 样式 */&lt;br /&gt;
        .markdown-content {&lt;br /&gt;
            line-height: 1.6;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        .markdown-content h1,&lt;br /&gt;
        .markdown-content h2,&lt;br /&gt;
        .markdown-content h3 {&lt;br /&gt;
            margin: 10px 0 5px 0;&lt;br /&gt;
            font-weight: bold;&lt;br /&gt;
            color: #333;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        .markdown-content h1 {&lt;br /&gt;
            font-size: 1.5em;&lt;br /&gt;
            border-bottom: 1px solid #eee;&lt;br /&gt;
            padding-bottom: 5px;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        .markdown-content h2 {&lt;br /&gt;
            font-size: 1.3em;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        .markdown-content h3 {&lt;br /&gt;
            font-size: 1.1em;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        .markdown-content p {&lt;br /&gt;
            margin: 8px 0;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        .markdown-content ul,&lt;br /&gt;
        .markdown-content ol {&lt;br /&gt;
            margin: 8px 0;&lt;br /&gt;
            padding-left: 20px;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        .markdown-content li {&lt;br /&gt;
            margin: 4px 0;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        .markdown-content strong {&lt;br /&gt;
            font-weight: bold;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        .markdown-content em {&lt;br /&gt;
            font-style: italic;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        .markdown-content code {&lt;br /&gt;
            background: #f1f1f1;&lt;br /&gt;
            padding: 2px 4px;&lt;br /&gt;
            border-radius: 3px;&lt;br /&gt;
            font-family: monospace;&lt;br /&gt;
            font-size: 0.9em;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        .markdown-content pre {&lt;br /&gt;
            background: #f8f8f8;&lt;br /&gt;
            padding: 10px;&lt;br /&gt;
            border-radius: 5px;&lt;br /&gt;
            overflow-x: auto;&lt;br /&gt;
            margin: 10px 0;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        .markdown-content pre code {&lt;br /&gt;
            background: none;&lt;br /&gt;
            padding: 0;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        .markdown-content blockquote {&lt;br /&gt;
            border-left: 3px solid #ccc;&lt;br /&gt;
            padding-left: 10px;&lt;br /&gt;
            margin: 10px 0;&lt;br /&gt;
            color: #666;&lt;br /&gt;
            font-style: italic;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        .markdown-content a {&lt;br /&gt;
            color: #4a90e2;&lt;br /&gt;
            text-decoration: none;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        .markdown-content a:hover {&lt;br /&gt;
            text-decoration: underline;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        @media (max-width: 600px) {&lt;br /&gt;
            .dt-container {&lt;br /&gt;
                margin: 10px;&lt;br /&gt;
                border-radius: 10px;&lt;br /&gt;
            }&lt;br /&gt;
            &lt;br /&gt;
            .dt-chat-area {&lt;br /&gt;
                height: 300px;&lt;br /&gt;
            }&lt;br /&gt;
            &lt;br /&gt;
            .dt-message {&lt;br /&gt;
                max-width: 90%;&lt;br /&gt;
            }&lt;br /&gt;
            &lt;br /&gt;
            .dt-input-area {&lt;br /&gt;
                flex-direction: column;&lt;br /&gt;
            }&lt;br /&gt;
            &lt;br /&gt;
            .dt-button-group {&lt;br /&gt;
                flex-direction: row;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    &amp;lt;/style&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
    &amp;lt;!-- 这个容器可以嵌入到其他网页中 --&amp;gt;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;dt-container&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;div class=&amp;quot;dt-header&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;h1&amp;gt;🤖 赵老师的数字分身&amp;lt;/h1&amp;gt;&lt;br /&gt;
            &amp;lt;p&amp;gt;由于学校网络管理，偶遇重大节日或特殊日期时可能无法回答，请谅解~&amp;lt;/p&amp;gt;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
        &lt;br /&gt;
        &amp;lt;div class=&amp;quot;dt-chat-area&amp;quot; id=&amp;quot;dt-chat-messages&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;div class=&amp;quot;dt-welcome-message&amp;quot;&amp;gt;&lt;br /&gt;
                正在连接服务器...&lt;br /&gt;
            &amp;lt;/div&amp;gt;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
        &lt;br /&gt;
        &amp;lt;div class=&amp;quot;dt-input-area&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;textarea class=&amp;quot;dt-message-input&amp;quot; id=&amp;quot;dt-message-input&amp;quot; placeholder=&amp;quot;请输入您的问题...&amp;quot;&amp;gt;&amp;lt;/textarea&amp;gt;&lt;br /&gt;
            &amp;lt;div class=&amp;quot;dt-button-group&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;button class=&amp;quot;dt-send-button&amp;quot; id=&amp;quot;dt-send-button&amp;quot;&amp;gt;发送&amp;lt;/button&amp;gt;&lt;br /&gt;
                &amp;lt;button class=&amp;quot;dt-save-button&amp;quot; id=&amp;quot;dt-save-button&amp;quot;&amp;gt;保存对话&amp;lt;/button&amp;gt;&lt;br /&gt;
            &amp;lt;/div&amp;gt;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
        &lt;br /&gt;
        &amp;lt;div class=&amp;quot;dt-status-bar&amp;quot; id=&amp;quot;dt-status-bar&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;span id=&amp;quot;dt-connection-status&amp;quot;&amp;gt;正在初始化...&amp;lt;/span&amp;gt;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;script&amp;gt;&lt;br /&gt;
        // 获取配置信息，允许通过属性传入&lt;br /&gt;
        const container = document.querySelector('.dt-container');&lt;br /&gt;
        const backendUrl = container.dataset.backendUrl || 'https://mns.uestc.cn/vs';&lt;br /&gt;
        const knowledgeBase = container.dataset.knowledgeBase || 'default'; // 可指定知识库&lt;br /&gt;
&lt;br /&gt;
        document.addEventListener('DOMContentLoaded', function() {&lt;br /&gt;
            const chatMessages = document.getElementById('dt-chat-messages');&lt;br /&gt;
            const messageInput = document.getElementById('dt-message-input');&lt;br /&gt;
            const sendButton = document.getElementById('dt-send-button');&lt;br /&gt;
            const saveButton = document.getElementById('dt-save-button');&lt;br /&gt;
            const connectionStatus = document.getElementById('dt-connection-status');&lt;br /&gt;
            &lt;br /&gt;
            // 生成唯一的会话ID&lt;br /&gt;
            const sessionId = 'session_' + Date.now() + '_' + Math.random().toString(36).substr(2, 9);&lt;br /&gt;
            &lt;br /&gt;
            // 简单的Markdown解析函数&lt;br /&gt;
            function renderMarkdown(text) {&lt;br /&gt;
                // 替换标题&lt;br /&gt;
                text = text.replace(/^### (.*$)/gim, '&amp;lt;h3&amp;gt;$1&amp;lt;/h3&amp;gt;');&lt;br /&gt;
                text = text.replace(/^## (.*$)/gim, '&amp;lt;h2&amp;gt;$1&amp;lt;/h2&amp;gt;');&lt;br /&gt;
                text = text.replace(/^# (.*$)/gim, '&amp;lt;h1&amp;gt;$1&amp;lt;/h1&amp;gt;');&lt;br /&gt;
                &lt;br /&gt;
                // 替换粗体和斜体&lt;br /&gt;
                text = text.replace(/\*\*(.*?)\*\*/g, '&amp;lt;strong&amp;gt;$1&amp;lt;/strong&amp;gt;');&lt;br /&gt;
                text = text.replace(/\*(.*?)\*/g, '&amp;lt;em&amp;gt;$1&amp;lt;/em&amp;gt;');&lt;br /&gt;
                &lt;br /&gt;
                // 替换行内代码&lt;br /&gt;
                text = text.replace(/`(.*?)`/g, '&amp;lt;code&amp;gt;$1&amp;lt;/code&amp;gt;');&lt;br /&gt;
                &lt;br /&gt;
                // 替换链接&lt;br /&gt;
                text = text.replace(/\[(.*?)\]\((.*?)\)/g, '&amp;lt;a href=&amp;quot;$2&amp;quot; target=&amp;quot;_blank&amp;quot;&amp;gt;$1&amp;lt;/a&amp;gt;');&lt;br /&gt;
                &lt;br /&gt;
                // 替换引用&lt;br /&gt;
                text = text.replace(/^&amp;gt; (.*$)/gim, '&amp;lt;blockquote&amp;gt;$1&amp;lt;/blockquote&amp;gt;');&lt;br /&gt;
                &lt;br /&gt;
                // 替换列表&lt;br /&gt;
                text = text.replace(/^\- (.*$)/gim, '&amp;lt;li&amp;gt;$1&amp;lt;/li&amp;gt;');&lt;br /&gt;
                text = text.replace(/^\* (.*$)/gim, '&amp;lt;li&amp;gt;$1&amp;lt;/li&amp;gt;');&lt;br /&gt;
                &lt;br /&gt;
                // 将连续的&amp;lt;li&amp;gt;包装到&amp;lt;ul&amp;gt;中&lt;br /&gt;
                text = text.replace(/(&amp;lt;li&amp;gt;.*&amp;lt;\/li&amp;gt;)/gs, '&amp;lt;ul&amp;gt;$1&amp;lt;/ul&amp;gt;');&lt;br /&gt;
                &lt;br /&gt;
                // 替换换行符为&amp;lt;p&amp;gt;标签&lt;br /&gt;
                text = text.replace(/\n\s*\n/g, '&amp;lt;/p&amp;gt;&amp;lt;p&amp;gt;');&lt;br /&gt;
                &lt;br /&gt;
                // 包装剩余文本到&amp;lt;p&amp;gt;标签中&lt;br /&gt;
                text = '&amp;lt;p&amp;gt;' + text + '&amp;lt;/p&amp;gt;';&lt;br /&gt;
                &lt;br /&gt;
                // 清理多余的&amp;lt;p&amp;gt;标签&lt;br /&gt;
                text = text.replace(/&amp;lt;p&amp;gt;\s*&amp;lt;\/p&amp;gt;/g, '');&lt;br /&gt;
                &lt;br /&gt;
                return text;&lt;br /&gt;
            }&lt;br /&gt;
            &lt;br /&gt;
            // 首次连接：发送&amp;quot;欢迎接入&amp;quot;获取欢迎信息&lt;br /&gt;
            async function initializeConnection() {&lt;br /&gt;
                try {&lt;br /&gt;
                    connectionStatus.textContent = '正在初始化...';&lt;br /&gt;
                    connectionStatus.style.color = '#ffc107';&lt;br /&gt;
                    &lt;br /&gt;
                    const response = await fetch(`${backendUrl}/query`, {&lt;br /&gt;
                        method: 'POST',&lt;br /&gt;
                        headers: {&lt;br /&gt;
                            'Content-Type': 'application/json'&lt;br /&gt;
                        },&lt;br /&gt;
                        body: JSON.stringify({ &lt;br /&gt;
                            query: &amp;quot;欢迎接入&amp;quot;,&lt;br /&gt;
                            session_id: sessionId,&lt;br /&gt;
                            knowledge_base: knowledgeBase&lt;br /&gt;
                        })&lt;br /&gt;
                    });&lt;br /&gt;
                    &lt;br /&gt;
                    if (response.ok) {&lt;br /&gt;
                        const data = await response.json();&lt;br /&gt;
                        if (data.response) {&lt;br /&gt;
                            // 成功连接，显示欢迎信息&lt;br /&gt;
                            connectionStatus.textContent = '连接正常';&lt;br /&gt;
                            connectionStatus.style.color = '#28a745';&lt;br /&gt;
                            &lt;br /&gt;
                            // 清空欢迎消息并显示欢迎信息&lt;br /&gt;
                            chatMessages.innerHTML = '';&lt;br /&gt;
                            addMessage(data.response, 'bot');&lt;br /&gt;
                            return true;&lt;br /&gt;
                        }&lt;br /&gt;
                    }&lt;br /&gt;
                    &lt;br /&gt;
                    connectionStatus.textContent = '连接异常';&lt;br /&gt;
                    connectionStatus.style.color = '#dc3545';&lt;br /&gt;
                    return false;&lt;br /&gt;
                } catch (error) {&lt;br /&gt;
                    console.error('初始化连接失败:', error);&lt;br /&gt;
                    connectionStatus.textContent = '连接失败';&lt;br /&gt;
                    connectionStatus.style.color = '#dc3545';&lt;br /&gt;
                    return false;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
            &lt;br /&gt;
            // 定期连接测试（不返回消息，只检查连接状态）&lt;br /&gt;
            async function testConnection() {&lt;br /&gt;
                try {&lt;br /&gt;
                    const response = await fetch(`${backendUrl}/query`, {&lt;br /&gt;
                        method: 'POST',&lt;br /&gt;
                        headers: {&lt;br /&gt;
                            'Content-Type': 'application/json'&lt;br /&gt;
                        },&lt;br /&gt;
                        body: JSON.stringify({ &lt;br /&gt;
                            query: &amp;quot;连接测试&amp;quot;,&lt;br /&gt;
                            session_id: sessionId,&lt;br /&gt;
                            knowledge_base: knowledgeBase&lt;br /&gt;
                        })&lt;br /&gt;
                    });&lt;br /&gt;
                    &lt;br /&gt;
                    if (response.ok) {&lt;br /&gt;
                        const data = await response.json();&lt;br /&gt;
                        // 连接测试只检查状态，不显示消息&lt;br /&gt;
                        if (data.response === &amp;quot;pong&amp;quot;) {&lt;br /&gt;
                            connectionStatus.textContent = '连接正常';&lt;br /&gt;
                            connectionStatus.style.color = '#28a745';&lt;br /&gt;
                            return true;&lt;br /&gt;
                        }&lt;br /&gt;
                    }&lt;br /&gt;
                    &lt;br /&gt;
                    connectionStatus.textContent = '连接异常';&lt;br /&gt;
                    connectionStatus.style.color = '#dc3545';&lt;br /&gt;
                    return false;&lt;br /&gt;
                } catch (error) {&lt;br /&gt;
                    console.error('连接测试失败:', error);&lt;br /&gt;
                    connectionStatus.textContent = '连接失败';&lt;br /&gt;
                    connectionStatus.style.color = '#dc3545';&lt;br /&gt;
                    return false;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
            &lt;br /&gt;
            // 添加消息到聊天记录&lt;br /&gt;
            function addMessage(text, sender) {&lt;br /&gt;
                const messageDiv = document.createElement('div');&lt;br /&gt;
                messageDiv.className = `dt-message dt-${sender}-message`;&lt;br /&gt;
                &lt;br /&gt;
                // 如果是机器人消息，应用Markdown渲染&lt;br /&gt;
                if (sender === 'bot') {&lt;br /&gt;
                    messageDiv.innerHTML = `&amp;lt;div class=&amp;quot;markdown-content&amp;quot;&amp;gt;${renderMarkdown(text)}&amp;lt;/div&amp;gt;`;&lt;br /&gt;
                } else {&lt;br /&gt;
                    // 用户消息直接显示&lt;br /&gt;
                    messageDiv.textContent = text;&lt;br /&gt;
                }&lt;br /&gt;
                &lt;br /&gt;
                chatMessages.appendChild(messageDiv);&lt;br /&gt;
                &lt;br /&gt;
                // 自动滚动到底部&lt;br /&gt;
                chatMessages.scrollTop = chatMessages.scrollHeight;&lt;br /&gt;
            }&lt;br /&gt;
            &lt;br /&gt;
            // 发送消息&lt;br /&gt;
            async function sendMessage() {&lt;br /&gt;
                const message = messageInput.value.trim();&lt;br /&gt;
                if (!message) return;&lt;br /&gt;
                &lt;br /&gt;
                // 添加用户消息&lt;br /&gt;
                addMessage(message, 'user');&lt;br /&gt;
                messageInput.value = '';&lt;br /&gt;
                &lt;br /&gt;
                // 显示打字指示器&lt;br /&gt;
                const typingIndicator = document.createElement('div');&lt;br /&gt;
                typingIndicator.className = 'dt-message dt-bot-message';&lt;br /&gt;
                typingIndicator.innerHTML = '&amp;lt;div class=&amp;quot;dt-typing-indicator&amp;quot;&amp;gt;正在思考...&amp;lt;/div&amp;gt;';&lt;br /&gt;
                chatMessages.appendChild(typingIndicator);&lt;br /&gt;
                chatMessages.scrollTop = chatMessages.scrollHeight;&lt;br /&gt;
                &lt;br /&gt;
                try {&lt;br /&gt;
                    const response = await fetch(`${backendUrl}/query`, {&lt;br /&gt;
                        method: 'POST',&lt;br /&gt;
                        headers: {&lt;br /&gt;
                            'Content-Type': 'application/json'&lt;br /&gt;
                        },&lt;br /&gt;
                        body: JSON.stringify({ &lt;br /&gt;
                            query: message,&lt;br /&gt;
                            session_id: sessionId,&lt;br /&gt;
                            knowledge_base: knowledgeBase&lt;br /&gt;
                        })&lt;br /&gt;
                    });&lt;br /&gt;
                    &lt;br /&gt;
                    const data = await response.json();&lt;br /&gt;
                    &lt;br /&gt;
                    // 移除打字指示器&lt;br /&gt;
                    chatMessages.removeChild(typingIndicator);&lt;br /&gt;
                    &lt;br /&gt;
                    if (data.response) {&lt;br /&gt;
                        addMessage(data.response, 'bot');&lt;br /&gt;
                    } else {&lt;br /&gt;
                        addMessage('抱歉，服务器返回了错误信息。', 'bot');&lt;br /&gt;
                    }&lt;br /&gt;
                } catch (error) {&lt;br /&gt;
                    console.error('Error:', error);&lt;br /&gt;
                    chatMessages.removeChild(typingIndicator);&lt;br /&gt;
                    addMessage('抱歉，连接服务器失败: ' + error.message, 'bot');&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
            &lt;br /&gt;
            // 保存对话历史&lt;br /&gt;
            function saveChatHistory() {&lt;br /&gt;
                const messages = chatMessages.querySelectorAll('.dt-message');&lt;br /&gt;
                let historyText = `数字分身对话历史\n${new Date().toLocaleString()}\n知识库: ${knowledgeBase}\n会话ID: ${sessionId}\n\n`;&lt;br /&gt;
                &lt;br /&gt;
                messages.forEach(msg =&amp;gt; {&lt;br /&gt;
                    if (msg.classList.contains('dt-user-message')) {&lt;br /&gt;
                        historyText += `用户: ${msg.textContent}\n`;&lt;br /&gt;
                    } else if (msg.classList.contains('dt-bot-message') &amp;amp;&amp;amp; !msg.querySelector('.dt-typing-indicator')) {&lt;br /&gt;
                        historyText += `数字分身: ${msg.textContent}\n`;&lt;br /&gt;
                    }&lt;br /&gt;
                });&lt;br /&gt;
                &lt;br /&gt;
                // 创建下载链接&lt;br /&gt;
                const blob = new Blob([historyText], { type: 'text/plain;charset=utf-8' });&lt;br /&gt;
                const url = URL.createObjectURL(blob);&lt;br /&gt;
                const a = document.createElement('a');&lt;br /&gt;
                a.href = url;&lt;br /&gt;
                a.download = `数字分身对话_${knowledgeBase}_${new Date().toISOString().slice(0, 19).replace(/:/g, '-')}.txt`;&lt;br /&gt;
                document.body.appendChild(a);&lt;br /&gt;
                a.click();&lt;br /&gt;
                document.body.removeChild(a);&lt;br /&gt;
                URL.revokeObjectURL(url);&lt;br /&gt;
            }&lt;br /&gt;
            &lt;br /&gt;
            // 事件监听器&lt;br /&gt;
            sendButton.addEventListener('click', sendMessage);&lt;br /&gt;
            saveButton.addEventListener('click', saveChatHistory);&lt;br /&gt;
            &lt;br /&gt;
            messageInput.addEventListener('keypress', function(e) {&lt;br /&gt;
                if (e.key === 'Enter' &amp;amp;&amp;amp; !e.shiftKey) {&lt;br /&gt;
                    e.preventDefault();&lt;br /&gt;
                    sendMessage();&lt;br /&gt;
                }&lt;br /&gt;
            });&lt;br /&gt;
            &lt;br /&gt;
            // 页面加载时初始化连接并获取欢迎信息&lt;br /&gt;
            initializeConnection();&lt;br /&gt;
            &lt;br /&gt;
            // 每30秒自动测试连接状态（不显示消息）&lt;br /&gt;
            const connectionInterval = setInterval(async () =&amp;gt; {&lt;br /&gt;
                await testConnection();&lt;br /&gt;
            }, 30000);&lt;br /&gt;
        });&lt;br /&gt;
    &amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;/div&gt;</summary>
		<author><name>Zhiwei</name></author>
	</entry>
</feed>