From 6d275fba7b4a17abcef770cdaba30e551f47c00d Mon Sep 17 00:00:00 2001 From: wanghanlin <1533525126@qq.com> Date: Fri, 26 Jun 2026 08:08:07 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E5=AE=A2=E6=88=B7=E7=AB=AF?= =?UTF-8?q?=E5=B7=A5=E7=A8=8B-chatSDK?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/resources/static/sdk/chatbot-sdk.js | 1378 +++++++++++++++++ .../resources/static/sdk/chatbot-sdk.js.map | 1 + .../resources/static/sdk/chatbot-sdk.min.js | 2 + .../static/sdk/chatbot-sdk.min.js.map | 1 + src/main/resources/static/sdk/test.html | 482 ++++++ 5 files changed, 1864 insertions(+) create mode 100644 src/main/resources/static/sdk/chatbot-sdk.js create mode 100644 src/main/resources/static/sdk/chatbot-sdk.js.map create mode 100644 src/main/resources/static/sdk/chatbot-sdk.min.js create mode 100644 src/main/resources/static/sdk/chatbot-sdk.min.js.map create mode 100644 src/main/resources/static/sdk/test.html diff --git a/src/main/resources/static/sdk/chatbot-sdk.js b/src/main/resources/static/sdk/chatbot-sdk.js new file mode 100644 index 0000000..c4b3740 --- /dev/null +++ b/src/main/resources/static/sdk/chatbot-sdk.js @@ -0,0 +1,1378 @@ +var ChatbotSDK = (function () { + 'use strict'; + + const PREFIX = '[ChatbotSDK]'; + let debugEnabled = true; + /** 设置是否开启调试日志 */ + function setDebug(enabled) { + debugEnabled = enabled; + } + const logger = { + /** 普通信息日志 */ + info(msg, data) { + if (debugEnabled) { + console.log(PREFIX, msg, data !== undefined ? data : ''); + } + }, + /** 警告日志 */ + warn(msg, data) { + if (debugEnabled) { + console.warn(PREFIX, msg, data !== undefined ? data : ''); + } + }, + /** 错误日志(始终输出,不受 debug 开关控制) */ + error(msg, data) { + console.error(PREFIX, msg, data !== undefined ? data : ''); + }, + }; + + /** 默认悬浮按钮 SVG 图标(客服对话气泡) */ + const DEFAULT_LAUNCHER_ICON = ` + + +`; + /** + * 解析并校验用户传入的配置,填充默认值 + */ + function parseConfig(raw) { + var _a, _b, _c, _d, _e, _f; + // 校验必传参数:integrateId + if (!raw.integrateId || typeof raw.integrateId !== 'string' || raw.integrateId.trim() === '') { + logger.error('integrateId 是必传参数,请检查 init() 调用。示例:ChatbotSDK.init({ integrateId: "my-app", requestDomain: "https://api.example.com" })'); + return null; + } + // 校验必传参数:requestDomain + if (!raw.requestDomain || typeof raw.requestDomain !== 'string' || raw.requestDomain.trim() === '') { + logger.error('requestDomain 是必传参数,请检查 init() 调用。示例:ChatbotSDK.init({ integrateId: "my-app", requestDomain: "https://api.example.com" })'); + return null; + } + // 校验 requestDomain 是否为合法 URL 格式 + try { + new URL(raw.requestDomain); + } + catch (_g) { + logger.error(`requestDomain 不是合法的 URL 格式:${raw.requestDomain}。请提供完整的域名,如 https://api.example.com`); + return null; + } + // 填充默认值 + const config = { + integrateId: raw.integrateId.trim(), + requestDomain: raw.requestDomain.replace(/\/+$/, ''), // 去掉末尾斜杠 + userId: raw.userId, + roleId: raw.roleId, + categoryId: raw.categoryId, + showCategorySwitch: (_a = raw.showCategorySwitch) !== null && _a !== void 0 ? _a : false, + title: raw.title || 'AI 智能助手', + width: (_b = raw.width) !== null && _b !== void 0 ? _b : 380, + position: raw.position === 'left-bottom' ? 'left-bottom' : 'right-bottom', + primaryColor: raw.primaryColor || '#4F46E5', + launcherIcon: raw.launcherIcon || DEFAULT_LAUNCHER_ICON, + showClear: (_c = raw.showClear) !== null && _c !== void 0 ? _c : true, + showAdminPanel: (_d = raw.showAdminPanel) !== null && _d !== void 0 ? _d : false, + streaming: (_e = raw.streaming) !== null && _e !== void 0 ? _e : true, + locale: raw.locale || 'zh-CN', + debug: (_f = raw.debug) !== null && _f !== void 0 ? _f : true, + }; + logger.info(`配置解析完成 integrateId=${config.integrateId} requestDomain=${config.requestDomain}`); + return config; + } + + /** 请求超时时间(毫秒) */ + const REQUEST_TIMEOUT = 30000; + let currentConfig = null; + /** 设置当前配置 */ + function setApiConfig(config) { + currentConfig = config; + } + /** 构建完整请求 URL,自动防御双斜杠 */ + function buildUrl(path) { + if (!currentConfig) { + throw new Error('API 配置未初始化'); + } + const domain = currentConfig.requestDomain.replace(/\/+$/, ''); + const cleanPath = path.startsWith('/') ? path : `/${path}`; + return `${domain}${cleanPath}`; + } + /** 构建同步对话请求 URL */ + function buildChatUrl(message) { + const params = new URLSearchParams(); + params.set('message', message); + params.set('chatId', currentConfig.integrateId); + if (currentConfig.userId) { + params.set('accountId', currentConfig.userId); + } + if (currentConfig.roleId) { + params.set('roleId', String(currentConfig.roleId)); + } + if (currentConfig.categoryId) { + params.set('categoryId', String(currentConfig.categoryId)); + } + return buildUrl(`/ai/assistant_app/chat/sync?${params.toString()}`); + } + /** 构建 SSE 流式请求 URL */ + function buildChatSSEUrl(message) { + const params = new URLSearchParams(); + params.set('message', message); + params.set('chatId', currentConfig.integrateId); + if (currentConfig.userId) { + params.set('accountId', currentConfig.userId); + } + if (currentConfig.roleId) { + params.set('roleId', String(currentConfig.roleId)); + } + if (currentConfig.categoryId) { + params.set('categoryId', String(currentConfig.categoryId)); + } + return buildUrl(`/ai/assistant_app/chat/sse?${params.toString()}`); + } + /** 带超时的 fetch 封装 */ + async function safeFetch(url, options = {}, timeout = REQUEST_TIMEOUT) { + const controller = new AbortController(); + const timer = setTimeout(() => controller.abort(), timeout); + try { + const response = await fetch(url, Object.assign(Object.assign({}, options), { signal: controller.signal, mode: 'cors', credentials: 'include' })); + return response; + } + catch (err) { + if (err instanceof DOMException && err.name === 'AbortError') { + throw new CskError('请求超时,请稍后重试', 'timeout'); + } + if (err instanceof TypeError && err.message.includes('Failed to fetch')) { + throw new CskError('跨域请求被拦截,请联系管理员将当前域名加入 API 白名单', 'cors'); + } + throw new CskError('网络连接失败,请检查网络', 'network'); + } + finally { + clearTimeout(timer); + } + } + /** 自定义错误类型 */ + class CskError extends Error { + constructor(message, type) { + super(message); + this.name = 'CskError'; + this.type = type; + } + } + /** 根据 HTTP 状态码返回对应的中文错误消息 */ + function getHttpErrorMessage(status) { + switch (status) { + case 401: + return '鉴权失败,请联系管理员'; + case 403: + return '无访问权限,请联系管理员配置'; + case 404: + return '请求的资源不存在'; + case 429: + return '请求过于频繁,请稍后重试'; + case 500: + return '服务器异常,请稍后重试'; + case 502: + case 503: + return '服务暂不可用,请稍后重试'; + default: + return `请求失败(状态码 ${status})`; + } + } + /** + * 同步对话请求 + */ + async function chatRequest(message) { + const url = buildChatUrl(message); + const startTime = Date.now(); + logger.info(`发送消息 integrateId=${currentConfig.integrateId} length=${message.length}`); + try { + const response = await safeFetch(url); + if (!response.ok) { + const errorMsg = getHttpErrorMessage(response.status); + logger.error(`请求失败 integrateId=${currentConfig.integrateId} status=${response.status} message=${errorMsg}`); + throw new CskError(errorMsg, `http_${response.status}`); + } + const text = await response.text(); + const duration = Date.now() - startTime; + logger.info(`AI 回复 integrateId=${currentConfig.integrateId} length=${text.length} duration=${duration}ms`); + return text; + } + catch (err) { + if (err instanceof CskError) { + throw err; + } + logger.error(`请求异常 integrateId=${currentConfig.integrateId}`, err); + throw new CskError('请求发生未知错误', 'unknown'); + } + } + /** + * SSE 流式对话请求 + * @param message 用户消息 + * @param onChunk 每次收到文本片段的回调 + * @param onDone 流结束时的回调 + * @param onError 发生错误时的回调 + */ + async function chatSSERequest(message, onChunk, onDone, onError) { + var _a; + const url = buildChatSSEUrl(message); + const startTime = Date.now(); + let totalText = ''; + logger.info(`发送流式消息 integrateId=${currentConfig.integrateId} length=${message.length}`); + try { + const response = await safeFetch(url, {}, REQUEST_TIMEOUT * 2); // SSE 超时更长 + if (!response.ok) { + const errorMsg = getHttpErrorMessage(response.status); + logger.error(`流式请求失败 integrateId=${currentConfig.integrateId} status=${response.status} message=${errorMsg}`); + onError(new CskError(errorMsg, `http_${response.status}`)); + return; + } + const reader = (_a = response.body) === null || _a === void 0 ? void 0 : _a.getReader(); + if (!reader) { + onError(new CskError('浏览器不支持流式读取', 'stream_unsupported')); + return; + } + const decoder = new TextDecoder('utf-8', { stream: true }); + let buffer = ''; + try { + while (true) { + const { done, value } = await reader.read(); + if (done) { + break; + } + // 解码并追加到 buffer + buffer += decoder.decode(value, { stream: true }); + // 按行解析 SSE 数据 + const lines = buffer.split('\n'); + // 最后一行可能不完整,保留到下次 + buffer = lines.pop() || ''; + for (const line of lines) { + const trimmed = line.trim(); + if (!trimmed || trimmed.startsWith(':')) { + // 跳过空行和 SSE 注释 + continue; + } + // 解析 "data: xxx" 格式 + if (trimmed.startsWith('data:')) { + const data = trimmed.substring(5).trim(); + if (data) { + totalText += data; + onChunk(data); + } + } + else if (trimmed === '[DONE]') { + // 流结束标记(OpenAI 风格,此处做兼容) + break; + } + else if (!trimmed.startsWith('event:') && !trimmed.startsWith('id:') && !trimmed.startsWith('retry:')) { + // 可能是 Flux 裸文本格式(无 data: 前缀) + totalText += trimmed; + onChunk(trimmed); + } + } + } + // 处理 buffer 中剩余的数据 + if (buffer.trim()) { + const trimmed = buffer.trim(); + if (trimmed.startsWith('data:')) { + const data = trimmed.substring(5).trim(); + if (data) { + totalText += data; + onChunk(data); + } + } + else if (trimmed !== '[DONE]') { + totalText += trimmed; + onChunk(trimmed); + } + } + } + catch (readErr) { + // 流中断不丢已接收的文本 + if (totalText.length > 0) { + onChunk('\n\n[网络不稳定,内容可能不完整]'); + } + else { + throw readErr; + } + } + finally { + reader.releaseLock(); + } + const duration = Date.now() - startTime; + logger.info(`流式回复完成 integrateId=${currentConfig.integrateId} length=${totalText.length} duration=${duration}ms`); + onDone(); + } + catch (err) { + if (err instanceof CskError) { + onError(err); + } + else { + logger.error(`流式请求异常 integrateId=${currentConfig.integrateId}`, err); + onError(new CskError('网络连接失败,请检查网络', 'network')); + } + } + } + + let styleElement = null; + /** CSS 变量:将配置中的主题色转换为 CSS 自定义属性 */ + function cssVars(config) { + // 简单的主色调加深(hover 用) + const darker = adjustColor(config.primaryColor, -15); + return ` + --csk-primary: ${config.primaryColor}; + --csk-primary-hover: ${darker}; + --csk-bg-user: var(--csk-primary); + --csk-bg-ai: #F3F4F6; + --csk-text-user: #FFFFFF; + --csk-text-ai: #1F2937; + --csk-window-width: ${config.width}px; + `; + } + /** 简单的颜色加深(HSL 方式) */ + function adjustColor(hex, amount) { + // 如果是 hex 格式,简单地对每个通道加减 + const match = hex.match(/^#([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/); + if (!match) { + return hex; + } + const clamp = (v) => Math.max(0, Math.min(255, v)); + const r = clamp(parseInt(match[1], 16) + amount); + const g = clamp(parseInt(match[2], 16) + amount); + const b = clamp(parseInt(match[3], 16) + amount); + return `#${r.toString(16).padStart(2, '0')}${g.toString(16).padStart(2, '0')}${b.toString(16).padStart(2, '0')}`; + } + /** 完整 CSS 样式表 */ + function getStyles(config) { + return ` +/* ChatbotSDK 样式 - csk- 命名空间 */ +.csk-root { + ${cssVars(config)} + font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans SC", sans-serif; + font-size: 14px; + line-height: 1.5; + color: #1F2937; +} + +/* ========== 悬浮按钮 ========== */ +.csk-launcher { + position: fixed; + bottom: 20px; + z-index: 9998; + width: 56px; + height: 56px; + border-radius: 50%; + background: #fff; + box-shadow: 0 4px 16px rgba(0, 0, 0, 0.15); + display: flex; + align-items: center; + justify-content: center; + cursor: pointer; + transition: all 0.2s ease; + border: none; + color: var(--csk-primary); + user-select: none; +} +.csk-launcher--right { + right: 20px; +} +.csk-launcher--left { + left: 20px; +} +.csk-launcher:hover { + transform: scale(1.1); + box-shadow: 0 6px 24px rgba(0, 0, 0, 0.2); +} +.csk-launcher:active { + transform: scale(0.95); +} + +/* ========== 聊天弹窗 ========== */ +.csk-window { + position: fixed; + bottom: 20px; + z-index: 9999; + width: var(--csk-window-width); + height: 560px; + background: #fff; + border-radius: 12px; + box-shadow: 0 8px 40px rgba(0, 0, 0, 0.18); + display: flex; + flex-direction: column; + overflow: hidden; + transition: opacity 0.2s ease, transform 0.2s ease; +} +.csk-window--right { + right: 20px; +} +.csk-window--left { + left: 20px; +} +.csk-window--hidden { + display: none; +} + +/* ========== 头部 ========== */ +.csk-header { + display: flex; + align-items: center; + justify-content: space-between; + padding: 0 16px; + height: 48px; + min-height: 48px; + background: var(--csk-primary); + color: #fff; + border-radius: 12px 12px 0 0; + cursor: move; + user-select: none; +} +.csk-header__title { + font-size: 15px; + font-weight: 600; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} +.csk-header__actions { + display: flex; + align-items: center; + gap: 4px; +} +.csk-header__btn { + display: flex; + align-items: center; + justify-content: center; + width: 32px; + height: 32px; + border: none; + background: transparent; + color: #fff; + cursor: pointer; + border-radius: 6px; + transition: background 0.15s; +} +.csk-header__btn:hover { + background: rgba(255, 255, 255, 0.2); +} + +/* ========== 消息区 ========== */ +.csk-messages { + flex: 1; + overflow-y: auto; + padding: 16px; + background: #FAFAFA; + scroll-behavior: smooth; +} +.csk-messages::-webkit-scrollbar { + width: 5px; +} +.csk-messages::-webkit-scrollbar-track { + background: transparent; +} +.csk-messages::-webkit-scrollbar-thumb { + background: #D1D5DB; + border-radius: 3px; +} + +/* 消息气泡 */ +.csk-msg { + display: flex; + flex-direction: column; + margin-bottom: 16px; + max-width: 85%; + word-break: break-word; +} +.csk-msg--user { + margin-left: auto; + align-items: flex-end; +} +.csk-msg--ai { + margin-right: auto; + align-items: flex-start; +} +.csk-msg__bubble { + padding: 10px 14px; + border-radius: 12px; + font-size: 14px; + line-height: 1.6; +} +.csk-msg--user .csk-msg__bubble { + background: var(--csk-bg-user); + color: var(--csk-text-user); + border-radius: 12px 12px 4px 12px; +} +.csk-msg--ai .csk-msg__bubble { + background: var(--csk-bg-ai); + color: var(--csk-text-ai); + border-radius: 12px 12px 12px 4px; +} +.csk-msg__time { + font-size: 11px; + color: #9CA3AF; + margin-top: 4px; + padding: 0 4px; +} + +/* ========== Loading 动画 ========== */ +.csk-loading { + display: flex; + align-items: center; + gap: 6px; + padding: 12px 14px; + margin-bottom: 16px; +} +.csk-loading__dot { + width: 8px; + height: 8px; + border-radius: 50%; + background: #D1D5DB; + animation: csk-bounce 1.4s ease-in-out infinite both; +} +.csk-loading__dot:nth-child(1) { animation-delay: 0s; } +.csk-loading__dot:nth-child(2) { animation-delay: 0.16s; } +.csk-loading__dot:nth-child(3) { animation-delay: 0.32s; } + +@keyframes csk-bounce { + 0%, 80%, 100% { transform: scale(0.6); } + 40% { transform: scale(1); } +} + +/* ========== 输入区 ========== */ +.csk-input-area { + display: flex; + align-items: center; + padding: 10px 12px; + border-top: 1px solid #E5E7EB; + background: #fff; + gap: 8px; +} +.csk-input { + flex: 1; + border: 1px solid #E5E7EB; + border-radius: 8px; + padding: 10px 12px; + font-size: 14px; + outline: none; + transition: border-color 0.2s; + font-family: inherit; + resize: none; + min-height: 20px; + max-height: 100px; +} +.csk-input:focus { + border-color: var(--csk-primary); +} +.csk-input::placeholder { + color: #9CA3AF; +} +.csk-send-btn { + display: flex; + align-items: center; + justify-content: center; + width: 40px; + height: 40px; + min-width: 40px; + border: none; + border-radius: 8px; + background: var(--csk-primary); + color: #fff; + cursor: pointer; + transition: background 0.2s; +} +.csk-send-btn:hover { + background: var(--csk-primary-hover); +} +.csk-send-btn:disabled { + background: #D1D5DB; + cursor: not-allowed; +} + +/* ========== 清空按钮 ========== */ +.csk-clear-btn { + display: inline-flex; + align-items: center; + gap: 4px; + padding: 6px 12px; + border: 1px solid #E5E7EB; + border-radius: 6px; + background: #fff; + color: #6B7280; + font-size: 12px; + cursor: pointer; + margin: 0 auto 8px; + transition: all 0.15s; +} +.csk-clear-btn:hover { + background: #FEE2E2; + border-color: #FCA5A5; + color: #DC2626; +} + +/* ========== 移动端适配 ========== */ +@media (max-width: 480px) { + .csk-window { + width: 100vw !important; + height: 100vh !important; + bottom: 0 !important; + right: 0 !important; + left: 0 !important; + border-radius: 0; + } + .csk-header { + border-radius: 0; + } +} +`; + } + /** + * 注入样式到 document.head + */ + function injectStyles(config) { + // 避免重复注入 + if (document.querySelector('style[data-csk-sdk]')) { + return; + } + styleElement = document.createElement('style'); + styleElement.setAttribute('data-csk-sdk', ''); + styleElement.textContent = getStyles(config); + document.head.appendChild(styleElement); + } + /** + * 移除注入的样式 + */ + function removeStyles() { + if (styleElement && styleElement.parentNode) { + styleElement.parentNode.removeChild(styleElement); + styleElement = null; + } + // 同时移除可能残留的其他 style 标签 + document.querySelectorAll('style[data-csk-sdk]').forEach((el) => el.remove()); + } + + /** + * 工具函数模块 + */ + /** 生成简短 UUID(取 crypto.randomUUID 前 8 位) */ + /** 生成完整 UUID */ + function uuid() { + if (typeof crypto !== 'undefined' && crypto.randomUUID) { + return crypto.randomUUID(); + } + // fallback + return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => { + const r = (Math.random() * 16) | 0; + const v = c === 'x' ? r : (r & 0x3) | 0x8; + return v.toString(16); + }); + } + /** 防抖函数 */ + function debounce(fn, delay) { + let timer = null; + return function (...args) { + if (timer !== null) { + clearTimeout(timer); + } + timer = setTimeout(() => { + fn.apply(this, args); + timer = null; + }, delay); + }; + } + /** 获取当前时间戳(毫秒) */ + function now() { + return Date.now(); + } + + // ==================== 悬浮按钮 ==================== + /** 创建悬浮按钮 */ + function createLauncher(config, onClick) { + const launcher = document.createElement('div'); + launcher.id = 'csk-launcher'; + launcher.className = `csk-launcher csk-launcher--${config.position === 'left-bottom' ? 'left' : 'right'}`; + launcher.setAttribute('title', config.title); + launcher.setAttribute('aria-label', config.title); + launcher.setAttribute('role', 'button'); + launcher.setAttribute('tabindex', '0'); + // 图标内容 + launcher.innerHTML = config.launcherIcon; + // 点击事件(300ms 防抖) + const debouncedClick = debounce(onClick, 300); + launcher.addEventListener('click', debouncedClick); + // 键盘支持 + launcher.addEventListener('keydown', (e) => { + if (e.key === 'Enter' || e.key === ' ') { + e.preventDefault(); + debouncedClick(); + } + }); + return launcher; + } + // ==================== 聊天弹窗 ==================== + /** 创建聊天弹窗完整结构,返回各区域引用 */ + function createChatWindow(config) { + // 最外层容器 + const windowEl = document.createElement('div'); + windowEl.id = 'csk-window'; + windowEl.className = `csk-root csk-window csk-window--${config.position === 'left-bottom' ? 'left' : 'right'} csk-window--hidden`; + // === 头部 === + const header = document.createElement('div'); + header.className = 'csk-header'; + const titleEl = document.createElement('span'); + titleEl.className = 'csk-header__title'; + titleEl.textContent = config.title; + const actions = document.createElement('div'); + actions.className = 'csk-header__actions'; + // 最小化按钮 + const minimizeBtn = document.createElement('button'); + minimizeBtn.className = 'csk-header__btn csk-header__btn--minimize'; + minimizeBtn.setAttribute('title', '最小化'); + minimizeBtn.innerHTML = ``; + minimizeBtn.addEventListener('click', () => { + windowEl.classList.add('csk-window--hidden'); + }); + // 关闭按钮 + const closeBtn = document.createElement('button'); + closeBtn.className = 'csk-header__btn csk-header__btn--close'; + closeBtn.setAttribute('title', '关闭'); + closeBtn.innerHTML = ``; + closeBtn.addEventListener('click', () => { + windowEl.classList.add('csk-window--hidden'); + }); + actions.appendChild(minimizeBtn); + actions.appendChild(closeBtn); + header.appendChild(titleEl); + header.appendChild(actions); + // === 消息区 === + const messagesContainer = document.createElement('div'); + messagesContainer.id = 'csk-messages'; + messagesContainer.className = 'csk-messages'; + // === 输入区 === + const inputArea = document.createElement('div'); + inputArea.className = 'csk-input-area'; + const inputEl = document.createElement('textarea'); + inputEl.id = 'csk-input'; + inputEl.className = 'csk-input'; + inputEl.setAttribute('placeholder', '输入您的问题...'); + inputEl.setAttribute('rows', '1'); + inputEl.setAttribute('autofocus', ''); + const sendBtn = document.createElement('button'); + sendBtn.id = 'csk-send-btn'; + sendBtn.className = 'csk-send-btn'; + sendBtn.setAttribute('title', '发送'); + sendBtn.setAttribute('disabled', 'true'); + sendBtn.innerHTML = ``; + inputArea.appendChild(inputEl); + inputArea.appendChild(sendBtn); + // === 组装 === + windowEl.appendChild(header); + windowEl.appendChild(messagesContainer); + windowEl.appendChild(inputArea); + // 清空按钮(可选) + let clearBtn = null; + if (config.showClear) { + clearBtn = document.createElement('button'); + clearBtn.className = 'csk-clear-btn'; + clearBtn.textContent = '清空对话'; + clearBtn.style.display = 'none'; // 初始隐藏,有消息后才显示 + // 插入到 messages 之后、inputArea 之前 + windowEl.insertBefore(clearBtn, inputArea); + } + // === Loading 动画 === + let loadingEl = null; + function showLoading() { + if (loadingEl) { + loadingEl.style.display = 'flex'; + return loadingEl; + } + const el = document.createElement('div'); + el.className = 'csk-loading'; + el.innerHTML = ` +
+
+
+ `; + messagesContainer.appendChild(el); + loadingEl = el; + return el; + } + function hideLoading() { + if (loadingEl && loadingEl.parentNode) { + loadingEl.parentNode.removeChild(loadingEl); + loadingEl = null; + } + } + return { + window: windowEl, + messagesContainer, + inputEl, + sendBtn, + clearBtn, + showLoading, + hideLoading, + }; + } + // ==================== 拖拽支持 ==================== + /** 启用弹窗拖拽 */ + function enableDrag(headerEl, windowEl) { + let dragging = false; + let startX = 0; + let startY = 0; + let offsetX = 0; + let offsetY = 0; + const onMouseDown = (e) => { + dragging = true; + startX = e.clientX; + startY = e.clientY; + const rect = windowEl.getBoundingClientRect(); + offsetX = startX - rect.left; + offsetY = startY - rect.top; + document.addEventListener('mousemove', onMouseMove); + document.addEventListener('mouseup', onMouseUp); + }; + const onMouseMove = (e) => { + if (!dragging) + return; + const x = e.clientX - offsetX; + const y = e.clientY - offsetY; + // 边界限制,防止拖出视口 + const maxX = window.innerWidth - windowEl.offsetWidth; + const maxY = window.innerHeight - windowEl.offsetHeight; + windowEl.style.right = 'auto'; + windowEl.style.bottom = 'auto'; + windowEl.style.left = `${Math.max(0, Math.min(x, maxX))}px`; + windowEl.style.top = `${Math.max(0, Math.min(y, maxY))}px`; + }; + const onMouseUp = () => { + dragging = false; + document.removeEventListener('mousemove', onMouseMove); + document.removeEventListener('mouseup', onMouseUp); + }; + headerEl.addEventListener('mousedown', onMouseDown); + // 清理函数 + return () => { + headerEl.removeEventListener('mousedown', onMouseDown); + document.removeEventListener('mousemove', onMouseMove); + document.removeEventListener('mouseup', onMouseUp); + }; + } + // ==================== 消息渲染 ==================== + /** 渲染用户消息气泡 */ + function renderUserBubble(container, text, timestamp) { + const wrapper = document.createElement('div'); + wrapper.className = 'csk-msg csk-msg--user'; + const bubble = document.createElement('div'); + bubble.className = 'csk-msg__bubble'; + bubble.textContent = text; + const time = document.createElement('div'); + time.className = 'csk-msg__time'; + time.textContent = formatTime(timestamp); + wrapper.appendChild(bubble); + wrapper.appendChild(time); + container.appendChild(wrapper); + return wrapper; + } + /** 渲染 AI 消息气泡 */ + function renderAIBubble(container, text, timestamp) { + const wrapper = document.createElement('div'); + wrapper.className = 'csk-msg csk-msg--ai'; + const bubble = document.createElement('div'); + bubble.className = 'csk-msg__bubble'; + bubble.textContent = text; + const time = document.createElement('div'); + time.className = 'csk-msg__time'; + time.textContent = formatTime(timestamp); + wrapper.appendChild(bubble); + wrapper.appendChild(time); + container.appendChild(wrapper); + return wrapper; + } + /** 创建空的 AI 气泡(流式追加用) */ + function createEmptyAIBubble(container, timestamp) { + const wrapper = document.createElement('div'); + wrapper.className = 'csk-msg csk-msg--ai'; + const bubble = document.createElement('div'); + bubble.className = 'csk-msg__bubble'; + bubble.innerHTML = ''; + const time = document.createElement('div'); + time.className = 'csk-msg__time'; + time.textContent = formatTime(timestamp); + wrapper.appendChild(bubble); + wrapper.appendChild(time); + container.appendChild(wrapper); + return { wrapper, bubble }; + } + /** 滚动消息区到底部 */ + function scrollToBottom(container) { + container.scrollTop = container.scrollHeight; + } + /** 格式化时间戳 */ + function formatTime(timestamp) { + const d = new Date(timestamp); + const hh = String(d.getHours()).padStart(2, '0'); + const mm = String(d.getMinutes()).padStart(2, '0'); + return `${hh}:${mm}`; + } + + const STORAGE_PREFIX = 'csk_history_'; + const MAX_MESSAGES = 200; + const TRIM_COUNT = 50; + /** 生成存储 key */ + function storageKey(integrateId) { + return `${STORAGE_PREFIX}${integrateId}`; + } + /** + * 保存消息到 localStorage + */ + function saveMessages(integrateId, messages) { + try { + // 消息上限裁剪:保留最新 200 条,超出裁剪最早 50 条 + let trimmed = messages; + if (trimmed.length > MAX_MESSAGES) { + trimmed = trimmed.slice(TRIM_COUNT); + logger.warn(`消息数量达到上限,已裁剪最早 ${TRIM_COUNT} 条,当前 ${trimmed.length} 条`); + } + const data = { + messages: trimmed, + updatedAt: Date.now(), + }; + localStorage.setItem(storageKey(integrateId), JSON.stringify(data)); + } + catch (e) { + if (e instanceof Error && e.name === 'QuotaExceededError') { + logger.error('localStorage 空间不足,会话历史保存失败。建议清空历史记录。'); + } + else { + logger.error('保存会话历史失败', e); + } + } + } + /** + * 从 localStorage 加载消息 + */ + function loadMessages(integrateId) { + try { + const raw = localStorage.getItem(storageKey(integrateId)); + if (!raw) { + return []; + } + const data = JSON.parse(raw); + if (!data || !Array.isArray(data.messages)) { + return []; + } + logger.info(`加载历史消息 integrateId=${integrateId} count=${data.messages.length}`); + return data.messages; + } + catch (e) { + logger.warn('加载会话历史失败', e); + return []; + } + } + /** + * 清空指定 integrateId 的本地缓存 + */ + function clearMessages(integrateId) { + try { + localStorage.removeItem(storageKey(integrateId)); + } + catch (e) { + logger.warn('清空会话历史失败', e); + } + } + + let config$1 = null; + let messages = []; + let messagesContainer$1 = null; + let inputEl$1 = null; + let sendBtn$1 = null; + let clearBtn$1 = null; + let showLoadingFn$1 = null; + let hideLoadingFn$1 = null; + let isSending = false; + /** + * 初始化对话模块 + */ + function initChat(cfg, dom) { + config$1 = cfg; + messagesContainer$1 = dom.messagesContainer; + inputEl$1 = dom.inputEl; + sendBtn$1 = dom.sendBtn; + clearBtn$1 = dom.clearBtn; + showLoadingFn$1 = dom.showLoading; + hideLoadingFn$1 = dom.hideLoading; + // 绑定发送事件 + bindSendEvents(); + // 恢复历史消息 + const history = loadMessages(cfg.integrateId); + if (history.length > 0) { + messages = history; + renderHistory(); + } + } + /** 绑定发送相关事件 */ + function bindSendEvents() { + if (!inputEl$1 || !sendBtn$1) + return; + // 发送按钮点击 + sendBtn$1.addEventListener('click', () => { + handleSend(); + }); + // 输入框键盘事件:回车发送 / Shift+Enter 换行 + inputEl$1.addEventListener('keydown', (e) => { + if (e.key === 'Enter' && !e.shiftKey) { + e.preventDefault(); + handleSend(); + } + }); + // 输入框内容变化时启用/禁用发送按钮 + inputEl$1.addEventListener('input', () => { + updateSendBtnState(); + }); + // 清空按钮 + if (clearBtn$1) { + clearBtn$1.addEventListener('click', () => { + handleClear(); + }); + } + } + /** 更新发送按钮状态 */ + function updateSendBtnState() { + if (!sendBtn$1 || !inputEl$1) + return; + const hasText = inputEl$1.value.trim().length > 0; + if (hasText && !isSending) { + sendBtn$1.removeAttribute('disabled'); + } + else { + sendBtn$1.setAttribute('disabled', 'true'); + } + } + /** 处理发送消息 */ + async function handleSend() { + if (!inputEl$1 || !config$1 || isSending) + return; + const text = inputEl$1.value.trim(); + if (text === '') + return; + // 清空输入框 + inputEl$1.value = ''; + updateSendBtnState(); + // 自动调整 textarea 高度 + inputEl$1.style.height = 'auto'; + isSending = true; + updateSendBtnState(); + // 1. 渲染用户气泡 + const userTimestamp = now(); + if (messagesContainer$1) { + renderUserBubble(messagesContainer$1, text, userTimestamp); + } + const userMsg = { + id: uuid(), + role: 'user', + content: text, + timestamp: userTimestamp, + }; + messages.push(userMsg); + // 显示清空按钮 + if (clearBtn$1 && messages.length > 0) { + clearBtn$1.style.display = 'inline-flex'; + } + // 滚动到底部 + if (messagesContainer$1) + scrollToBottom(messagesContainer$1); + // 2. 显示 loading + if (showLoadingFn$1) + showLoadingFn$1(); + if (messagesContainer$1) + scrollToBottom(messagesContainer$1); + // 3. 发送请求 + try { + let aiContent; + const aiTimestamp = now(); + if (config$1.streaming) { + // 流式输出 + aiContent = await sendStreamMessage(text, aiTimestamp); + } + else { + // 同步请求 + aiContent = await chatRequest(text); + } + // 4. 隐藏 loading + if (hideLoadingFn$1) + hideLoadingFn$1(); + // 5. 渲染 AI 气泡 + if (messagesContainer$1) { + renderAIBubble(messagesContainer$1, aiContent, aiTimestamp); + } + const aiMsg = { + id: uuid(), + role: 'ai', + content: aiContent, + timestamp: aiTimestamp, + }; + messages.push(aiMsg); + // 6. 保存到 localStorage + saveMessages(config$1.integrateId, messages); + // 7. 滚动到底部 + if (messagesContainer$1) + scrollToBottom(messagesContainer$1); + } + catch (err) { + // 隐藏 loading + if (hideLoadingFn$1) + hideLoadingFn$1(); + // 渲染错误提示 + const errMsg = err instanceof CskError ? err.message : '发送失败,请稍后重试'; + if (messagesContainer$1) { + const errorBubble = document.createElement('div'); + errorBubble.className = 'csk-msg csk-msg--ai'; + const bubble = document.createElement('div'); + bubble.className = 'csk-msg__bubble'; + bubble.style.color = '#DC2626'; + bubble.textContent = `⚠ ${errMsg}`; + errorBubble.appendChild(bubble); + messagesContainer$1.appendChild(errorBubble); + } + logger.error(`发送失败 integrateId=${config$1.integrateId}`, err); + } + finally { + isSending = false; + updateSendBtnState(); + } + } + /** 流式发送消息 */ + async function sendStreamMessage(text, aiTimestamp) { + return new Promise((resolve, reject) => { + let bubbleEl = null; + let wrapperEl = null; + let accumulated = ''; + let streamStarted = false; + chatSSERequest(text, + // onChunk + (chunk) => { + accumulated += chunk; + if (!streamStarted && messagesContainer$1) { + // 隐藏 loading,创建空 AI 气泡 + if (hideLoadingFn$1) + hideLoadingFn$1(); + const { wrapper, bubble } = createEmptyAIBubble(messagesContainer$1, aiTimestamp); + wrapperEl = wrapper; + bubbleEl = bubble; + streamStarted = true; + } + if (bubbleEl) { + bubbleEl.textContent = accumulated; + } + if (messagesContainer$1) + scrollToBottom(messagesContainer$1); + }, + // onDone + () => { + // 如果流没有产生任何内容,回退同步请求 + if (!streamStarted && accumulated === '') { + chatRequest(text) + .then((content) => resolve(content)) + .catch(reject); + return; + } + resolve(accumulated); + }, + // onError + (error) => { + if (accumulated.length > 0) { + // 有部分内容,保留并添加提示 + if (bubbleEl) { + bubbleEl.textContent = accumulated + '\n\n[回复被中断]'; + } + resolve(accumulated); + } + else { + reject(error); + } + }); + }); + } + /** 渲染历史消息 */ + function renderHistory() { + if (!messagesContainer$1) + return; + // 清空容器 + messagesContainer$1.innerHTML = ''; + for (const msg of messages) { + if (msg.role === 'user') { + renderUserBubble(messagesContainer$1, msg.content, msg.timestamp); + } + else { + renderAIBubble(messagesContainer$1, msg.content, msg.timestamp); + } + } + scrollToBottom(messagesContainer$1); + // 显示清空按钮 + if (clearBtn$1 && messages.length > 0) { + clearBtn$1.style.display = 'inline-flex'; + } + } + /** 清空对话历史 */ + function handleClear() { + if (!config$1) + return; + if (!confirm('确定清空所有对话记录?')) { + return; + } + messages = []; + if (messagesContainer$1) { + messagesContainer$1.innerHTML = ''; + } + if (clearBtn$1) { + clearBtn$1.style.display = 'none'; + } + clearMessages(config$1.integrateId); + logger.info(`清空会话 integrateId=${config$1.integrateId}`); + } + + // ==================== 单例状态 ==================== + let config = null; + let isInitialized = false; + let launcherEl = null; + let windowEl = null; + let messagesContainer = null; + let inputEl = null; + let sendBtn = null; + let clearBtn = null; + let showLoadingFn = null; + let hideLoadingFn = null; + let dragCleanup = null; + // ==================== 公开 API ==================== + /** 初始化 SDK */ + function init(rawConfig) { + if (isInitialized) { + logger.warn('SDK 已初始化,请先调用 destroy() 再重新初始化'); + return; + } + // 1. 配置解析与校验 + const parsed = parseConfig(rawConfig); + if (!parsed) { + return; // parseConfig 已输出错误 + } + config = parsed; + // 2. 设置日志级别 + setDebug(config.debug); + // 3. 设置 API 配置 + setApiConfig(config); + // 4. 注入样式 + injectStyles(config); + // 5. 创建悬浮按钮 + launcherEl = createLauncher(config, toggle); + document.body.appendChild(launcherEl); + // 6. 创建聊天弹窗 + const dom = createChatWindow(config); + windowEl = dom.window; + messagesContainer = dom.messagesContainer; + inputEl = dom.inputEl; + sendBtn = dom.sendBtn; + clearBtn = dom.clearBtn; + showLoadingFn = dom.showLoading; + hideLoadingFn = dom.hideLoading; + document.body.appendChild(windowEl); + // 7. 启用拖拽 + const headerEl = windowEl.querySelector('.csk-header'); + if (headerEl) { + dragCleanup = enableDrag(headerEl, windowEl); + } + // 8. 初始化对话模块 + initChat(config, { + messagesContainer, + inputEl, + sendBtn, + clearBtn, + showLoading: showLoadingFn, + hideLoading: hideLoadingFn, + }); + isInitialized = true; + logger.info(`初始化完成 integrateId=${config.integrateId} requestDomain=${config.requestDomain}`); + } + /** 销毁 SDK 实例 */ + function destroy() { + if (!isInitialized) { + return; + } + // 移除 DOM 元素 + if (launcherEl && launcherEl.parentNode) { + launcherEl.parentNode.removeChild(launcherEl); + launcherEl = null; + } + if (windowEl && windowEl.parentNode) { + windowEl.parentNode.removeChild(windowEl); + windowEl = null; + } + // 移除拖拽事件 + if (dragCleanup) { + dragCleanup(); + dragCleanup = null; + } + // 移除样式 + removeStyles(); + // 重置状态 + const oldIntegrateId = config === null || config === void 0 ? void 0 : config.integrateId; + config = null; + isInitialized = false; + messagesContainer = null; + inputEl = null; + sendBtn = null; + clearBtn = null; + showLoadingFn = null; + hideLoadingFn = null; + logger.info(`销毁实例 integrateId=${oldIntegrateId}`); + } + /** 打开聊天窗口 */ + function open() { + if (!windowEl) + return; + windowEl.classList.remove('csk-window--hidden'); + } + /** 关闭聊天窗口 */ + function close() { + if (!windowEl) + return; + windowEl.classList.add('csk-window--hidden'); + } + /** 切换窗口显示/隐藏 */ + function toggle() { + if (!windowEl) + return; + if (windowEl.classList.contains('csk-window--hidden')) { + open(); + // 聚焦输入框 + setTimeout(() => { + if (inputEl) + inputEl.focus(); + }, 100); + } + else { + close(); + } + } + /** 清空当前会话历史 */ + function clearHistory() { + if (!config) + return; + // 通过触发自定义事件,让 chat 模块处理 + if (clearBtn) { + clearBtn.click(); + } + else if (confirm('确定清空所有对话记录?')) { + clearMessages(config.integrateId); + } + } + // ==================== 挂载到全局 ==================== + const ChatbotSDK = { + init, + destroy, + open, + close, + toggle, + clearHistory, + }; + // IIFE 自动挂载 + if (typeof window !== 'undefined') { + window.ChatbotSDK = ChatbotSDK; + } + + return ChatbotSDK; + +})(); +//# sourceMappingURL=chatbot-sdk.js.map diff --git a/src/main/resources/static/sdk/chatbot-sdk.js.map b/src/main/resources/static/sdk/chatbot-sdk.js.map new file mode 100644 index 0000000..b5cd0d3 --- /dev/null +++ b/src/main/resources/static/sdk/chatbot-sdk.js.map @@ -0,0 +1 @@ +{"version":3,"file":"chatbot-sdk.js","sources":["../src/logger.ts","../src/config.ts","../src/api.ts","../src/styles.ts","../src/utils.ts","../src/dom.ts","../src/storage.ts","../src/chat.ts","../src/index.ts"],"sourcesContent":[null,null,null,null,null,null,null,null,null],"names":["config","messagesContainer","inputEl","sendBtn","clearBtn","showLoadingFn","hideLoadingFn"],"mappings":"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"} \ No newline at end of file diff --git a/src/main/resources/static/sdk/chatbot-sdk.min.js b/src/main/resources/static/sdk/chatbot-sdk.min.js new file mode 100644 index 0000000..b9e1b25 --- /dev/null +++ b/src/main/resources/static/sdk/chatbot-sdk.min.js @@ -0,0 +1,2 @@ +var ChatbotSDK=function(){"use strict";const n="[ChatbotSDK]";let e=!0;const t={info(t,r){e&&console.log(n,t,void 0!==r?r:"")},warn(t,r){e&&console.warn(n,t,void 0!==r?r:"")},error(e,t){console.error(n,e,void 0!==t?t:"")}};let r=null;function o(n){if(!r)throw new Error("API 配置未初始化");return`${r.requestDomain.replace(/\/+$/,"")}${n.startsWith("/")?n:`/${n}`}`}async function s(n,e={},t=3e4){const r=new AbortController,o=setTimeout(()=>r.abort(),t);try{return await fetch(n,Object.assign(Object.assign({},e),{signal:r.signal,mode:"cors",credentials:"include"}))}catch(n){if(n instanceof DOMException&&"AbortError"===n.name)throw new i("请求超时,请稍后重试","timeout");if(n instanceof TypeError&&n.message.includes("Failed to fetch"))throw new i("跨域请求被拦截,请联系管理员将当前域名加入 API 白名单","cors");throw new i("网络连接失败,请检查网络","network")}finally{clearTimeout(o)}}class i extends Error{constructor(n,e){super(n),this.name="CskError",this.type=e}}function a(n){switch(n){case 401:return"鉴权失败,请联系管理员";case 403:return"无访问权限,请联系管理员配置";case 404:return"请求的资源不存在";case 429:return"请求过于频繁,请稍后重试";case 500:return"服务器异常,请稍后重试";case 502:case 503:return"服务暂不可用,请稍后重试";default:return`请求失败(状态码 ${n})`}}async function c(n){const e=function(n){const e=new URLSearchParams;return e.set("message",n),e.set("chatId",r.integrateId),r.userId&&e.set("accountId",r.userId),r.roleId&&e.set("roleId",String(r.roleId)),r.categoryId&&e.set("categoryId",String(r.categoryId)),o(`/ai/assistant_app/chat/sync?${e.toString()}`)}(n),c=Date.now();t.info(`发送消息 integrateId=${r.integrateId} length=${n.length}`);try{const n=await s(e);if(!n.ok){const e=a(n.status);throw t.error(`请求失败 integrateId=${r.integrateId} status=${n.status} message=${e}`),new i(e,`http_${n.status}`)}const o=await n.text(),d=Date.now()-c;return t.info(`AI 回复 integrateId=${r.integrateId} length=${o.length} duration=${d}ms`),o}catch(n){if(n instanceof i)throw n;throw t.error(`请求异常 integrateId=${r.integrateId}`,n),new i("请求发生未知错误","unknown")}}async function d(n,e,c,d){var l;const u=function(n){const e=new URLSearchParams;return e.set("message",n),e.set("chatId",r.integrateId),r.userId&&e.set("accountId",r.userId),r.roleId&&e.set("roleId",String(r.roleId)),r.categoryId&&e.set("categoryId",String(r.categoryId)),o(`/ai/assistant_app/chat/sse?${e.toString()}`)}(n),m=Date.now();let p="";t.info(`发送流式消息 integrateId=${r.integrateId} length=${n.length}`);try{const n=await s(u,{},6e4);if(!n.ok){const e=a(n.status);return t.error(`流式请求失败 integrateId=${r.integrateId} status=${n.status} message=${e}`),void d(new i(e,`http_${n.status}`))}const o=null===(l=n.body)||void 0===l?void 0:l.getReader();if(!o)return void d(new i("浏览器不支持流式读取","stream_unsupported"));const g=new TextDecoder("utf-8",{stream:!0});let h="";try{for(;;){const{done:n,value:t}=await o.read();if(n)break;h+=g.decode(t,{stream:!0});const r=h.split("\n");h=r.pop()||"";for(const n of r){const t=n.trim();if(t&&!t.startsWith(":"))if(t.startsWith("data:")){const n=t.substring(5).trim();n&&(p+=n,e(n))}else{if("[DONE]"===t)break;t.startsWith("event:")||t.startsWith("id:")||t.startsWith("retry:")||(p+=t,e(t))}}}if(h.trim()){const n=h.trim();if(n.startsWith("data:")){const t=n.substring(5).trim();t&&(p+=t,e(t))}else"[DONE]"!==n&&(p+=n,e(n))}}catch(n){if(!(p.length>0))throw n;e("\n\n[网络不稳定,内容可能不完整]")}finally{o.releaseLock()}const f=Date.now()-m;t.info(`流式回复完成 integrateId=${r.integrateId} length=${p.length} duration=${f}ms`),c()}catch(n){n instanceof i?d(n):(t.error(`流式请求异常 integrateId=${r.integrateId}`,n),d(new i("网络连接失败,请检查网络","network")))}}let l=null;function u(n){const e=function(n,e){const t=n.match(/^#([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/);if(!t)return n;const r=n=>Math.max(0,Math.min(255,n)),o=r(parseInt(t[1],16)+e),s=r(parseInt(t[2],16)+e),i=r(parseInt(t[3],16)+e);return`#${o.toString(16).padStart(2,"0")}${s.toString(16).padStart(2,"0")}${i.toString(16).padStart(2,"0")}`}(n.primaryColor,-15);return`\n --csk-primary: ${n.primaryColor};\n --csk-primary-hover: ${e};\n --csk-bg-user: var(--csk-primary);\n --csk-bg-ai: #F3F4F6;\n --csk-text-user: #FFFFFF;\n --csk-text-ai: #1F2937;\n --csk-window-width: ${n.width}px;\n `}function m(n){document.querySelector("style[data-csk-sdk]")||(l=document.createElement("style"),l.setAttribute("data-csk-sdk",""),l.textContent=function(n){return`\n/* ChatbotSDK 样式 - csk- 命名空间 */\n.csk-root {\n ${u(n)}\n font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans SC", sans-serif;\n font-size: 14px;\n line-height: 1.5;\n color: #1F2937;\n}\n\n/* ========== 悬浮按钮 ========== */\n.csk-launcher {\n position: fixed;\n bottom: 20px;\n z-index: 9998;\n width: 56px;\n height: 56px;\n border-radius: 50%;\n background: #fff;\n box-shadow: 0 4px 16px rgba(0, 0, 0, 0.15);\n display: flex;\n align-items: center;\n justify-content: center;\n cursor: pointer;\n transition: all 0.2s ease;\n border: none;\n color: var(--csk-primary);\n user-select: none;\n}\n.csk-launcher--right {\n right: 20px;\n}\n.csk-launcher--left {\n left: 20px;\n}\n.csk-launcher:hover {\n transform: scale(1.1);\n box-shadow: 0 6px 24px rgba(0, 0, 0, 0.2);\n}\n.csk-launcher:active {\n transform: scale(0.95);\n}\n\n/* ========== 聊天弹窗 ========== */\n.csk-window {\n position: fixed;\n bottom: 20px;\n z-index: 9999;\n width: var(--csk-window-width);\n height: 560px;\n background: #fff;\n border-radius: 12px;\n box-shadow: 0 8px 40px rgba(0, 0, 0, 0.18);\n display: flex;\n flex-direction: column;\n overflow: hidden;\n transition: opacity 0.2s ease, transform 0.2s ease;\n}\n.csk-window--right {\n right: 20px;\n}\n.csk-window--left {\n left: 20px;\n}\n.csk-window--hidden {\n display: none;\n}\n\n/* ========== 头部 ========== */\n.csk-header {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 0 16px;\n height: 48px;\n min-height: 48px;\n background: var(--csk-primary);\n color: #fff;\n border-radius: 12px 12px 0 0;\n cursor: move;\n user-select: none;\n}\n.csk-header__title {\n font-size: 15px;\n font-weight: 600;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n.csk-header__actions {\n display: flex;\n align-items: center;\n gap: 4px;\n}\n.csk-header__btn {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 32px;\n height: 32px;\n border: none;\n background: transparent;\n color: #fff;\n cursor: pointer;\n border-radius: 6px;\n transition: background 0.15s;\n}\n.csk-header__btn:hover {\n background: rgba(255, 255, 255, 0.2);\n}\n\n/* ========== 消息区 ========== */\n.csk-messages {\n flex: 1;\n overflow-y: auto;\n padding: 16px;\n background: #FAFAFA;\n scroll-behavior: smooth;\n}\n.csk-messages::-webkit-scrollbar {\n width: 5px;\n}\n.csk-messages::-webkit-scrollbar-track {\n background: transparent;\n}\n.csk-messages::-webkit-scrollbar-thumb {\n background: #D1D5DB;\n border-radius: 3px;\n}\n\n/* 消息气泡 */\n.csk-msg {\n display: flex;\n flex-direction: column;\n margin-bottom: 16px;\n max-width: 85%;\n word-break: break-word;\n}\n.csk-msg--user {\n margin-left: auto;\n align-items: flex-end;\n}\n.csk-msg--ai {\n margin-right: auto;\n align-items: flex-start;\n}\n.csk-msg__bubble {\n padding: 10px 14px;\n border-radius: 12px;\n font-size: 14px;\n line-height: 1.6;\n}\n.csk-msg--user .csk-msg__bubble {\n background: var(--csk-bg-user);\n color: var(--csk-text-user);\n border-radius: 12px 12px 4px 12px;\n}\n.csk-msg--ai .csk-msg__bubble {\n background: var(--csk-bg-ai);\n color: var(--csk-text-ai);\n border-radius: 12px 12px 12px 4px;\n}\n.csk-msg__time {\n font-size: 11px;\n color: #9CA3AF;\n margin-top: 4px;\n padding: 0 4px;\n}\n\n/* ========== Loading 动画 ========== */\n.csk-loading {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 12px 14px;\n margin-bottom: 16px;\n}\n.csk-loading__dot {\n width: 8px;\n height: 8px;\n border-radius: 50%;\n background: #D1D5DB;\n animation: csk-bounce 1.4s ease-in-out infinite both;\n}\n.csk-loading__dot:nth-child(1) { animation-delay: 0s; }\n.csk-loading__dot:nth-child(2) { animation-delay: 0.16s; }\n.csk-loading__dot:nth-child(3) { animation-delay: 0.32s; }\n\n@keyframes csk-bounce {\n 0%, 80%, 100% { transform: scale(0.6); }\n 40% { transform: scale(1); }\n}\n\n/* ========== 输入区 ========== */\n.csk-input-area {\n display: flex;\n align-items: center;\n padding: 10px 12px;\n border-top: 1px solid #E5E7EB;\n background: #fff;\n gap: 8px;\n}\n.csk-input {\n flex: 1;\n border: 1px solid #E5E7EB;\n border-radius: 8px;\n padding: 10px 12px;\n font-size: 14px;\n outline: none;\n transition: border-color 0.2s;\n font-family: inherit;\n resize: none;\n min-height: 20px;\n max-height: 100px;\n}\n.csk-input:focus {\n border-color: var(--csk-primary);\n}\n.csk-input::placeholder {\n color: #9CA3AF;\n}\n.csk-send-btn {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 40px;\n height: 40px;\n min-width: 40px;\n border: none;\n border-radius: 8px;\n background: var(--csk-primary);\n color: #fff;\n cursor: pointer;\n transition: background 0.2s;\n}\n.csk-send-btn:hover {\n background: var(--csk-primary-hover);\n}\n.csk-send-btn:disabled {\n background: #D1D5DB;\n cursor: not-allowed;\n}\n\n/* ========== 清空按钮 ========== */\n.csk-clear-btn {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n padding: 6px 12px;\n border: 1px solid #E5E7EB;\n border-radius: 6px;\n background: #fff;\n color: #6B7280;\n font-size: 12px;\n cursor: pointer;\n margin: 0 auto 8px;\n transition: all 0.15s;\n}\n.csk-clear-btn:hover {\n background: #FEE2E2;\n border-color: #FCA5A5;\n color: #DC2626;\n}\n\n/* ========== 移动端适配 ========== */\n@media (max-width: 480px) {\n .csk-window {\n width: 100vw !important;\n height: 100vh !important;\n bottom: 0 !important;\n right: 0 !important;\n left: 0 !important;\n border-radius: 0;\n }\n .csk-header {\n border-radius: 0;\n }\n}\n`}(n),document.head.appendChild(l))}function p(){return"undefined"!=typeof crypto&&crypto.randomUUID?crypto.randomUUID():"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,n=>{const e=16*Math.random()|0;return("x"===n?e:3&e|8).toString(16)})}function g(){return Date.now()}function h(n,e){const t=document.createElement("div");t.id="csk-launcher",t.className="csk-launcher csk-launcher--"+("left-bottom"===n.position?"left":"right"),t.setAttribute("title",n.title),t.setAttribute("aria-label",n.title),t.setAttribute("role","button"),t.setAttribute("tabindex","0"),t.innerHTML=n.launcherIcon;const r=function(n,e){let t=null;return function(...r){null!==t&&clearTimeout(t),t=setTimeout(()=>{n.apply(this,r),t=null},e)}}(e,300);return t.addEventListener("click",r),t.addEventListener("keydown",n=>{"Enter"!==n.key&&" "!==n.key||(n.preventDefault(),r())}),t}function f(n,e,t){const r=document.createElement("div");r.className="csk-msg csk-msg--user";const o=document.createElement("div");o.className="csk-msg__bubble",o.textContent=e;const s=document.createElement("div");return s.className="csk-msg__time",s.textContent=w(t),r.appendChild(o),r.appendChild(s),n.appendChild(r),r}function x(n,e,t){const r=document.createElement("div");r.className="csk-msg csk-msg--ai";const o=document.createElement("div");o.className="csk-msg__bubble",o.textContent=e;const s=document.createElement("div");return s.className="csk-msg__time",s.textContent=w(t),r.appendChild(o),r.appendChild(s),n.appendChild(r),r}function k(n){n.scrollTop=n.scrollHeight}function w(n){const e=new Date(n);return`${String(e.getHours()).padStart(2,"0")}:${String(e.getMinutes()).padStart(2,"0")}`}function b(n){return`csk_history_${n}`}function y(n){try{localStorage.removeItem(b(n))}catch(n){t.warn("清空会话历史失败",n)}}let v=null,I=[],C=null,E=null,_=null,$=null,D=null,L=null,S=!1;function A(n,e){v=n,C=e.messagesContainer,E=e.inputEl,_=e.sendBtn,$=e.clearBtn,D=e.showLoading,L=e.hideLoading,function(){if(!E||!_)return;_.addEventListener("click",()=>{F()}),E.addEventListener("keydown",n=>{"Enter"!==n.key||n.shiftKey||(n.preventDefault(),F())}),E.addEventListener("input",()=>{N()}),$&&$.addEventListener("click",()=>{!function(){if(!v)return;if(!confirm("确定清空所有对话记录?"))return;I=[],C&&(C.innerHTML="");$&&($.style.display="none");y(v.integrateId),t.info(`清空会话 integrateId=${v.integrateId}`)}()})}();const r=function(n){try{const e=localStorage.getItem(b(n));if(!e)return[];const r=JSON.parse(e);return r&&Array.isArray(r.messages)?(t.info(`加载历史消息 integrateId=${n} count=${r.messages.length}`),r.messages):[]}catch(n){return t.warn("加载会话历史失败",n),[]}}(n.integrateId);r.length>0&&(I=r,function(){if(!C)return;C.innerHTML="";for(const n of I)"user"===n.role?f(C,n.content,n.timestamp):x(C,n.content,n.timestamp);k(C),$&&I.length>0&&($.style.display="inline-flex")}())}function N(){if(!_||!E)return;E.value.trim().length>0&&!S?_.removeAttribute("disabled"):_.setAttribute("disabled","true")}async function F(){if(!E||!v||S)return;const n=E.value.trim();if(""===n)return;E.value="",N(),E.style.height="auto",S=!0,N();const e=g();C&&f(C,n,e);const r={id:p(),role:"user",content:n,timestamp:e};I.push(r),$&&I.length>0&&($.style.display="inline-flex"),C&&k(C),D&&D(),C&&k(C);try{let e;const r=g();e=v.streaming?await async function(n,e){return new Promise((t,r)=>{let o=null,s=null,i="",a=!1;d(n,n=>{if(i+=n,!a&&C){L&&L();const{wrapper:n,bubble:t}=function(n,e){const t=document.createElement("div");t.className="csk-msg csk-msg--ai";const r=document.createElement("div");r.className="csk-msg__bubble",r.innerHTML="";const o=document.createElement("div");return o.className="csk-msg__time",o.textContent=w(e),t.appendChild(r),t.appendChild(o),n.appendChild(t),{wrapper:t,bubble:r}}(C,e);s=n,o=t,a=!0}o&&(o.textContent=i),C&&k(C)},()=>{a||""!==i?t(i):c(n).then(n=>t(n)).catch(r)},n=>{i.length>0?(o&&(o.textContent=i+"\n\n[回复被中断]"),t(i)):r(n)})})}(n,r):await c(n),L&&L(),C&&x(C,e,r);const o={id:p(),role:"ai",content:e,timestamp:r};I.push(o),function(n,e){try{let r=e;r.length>200&&(r=r.slice(50),t.warn(`消息数量达到上限,已裁剪最早 50 条,当前 ${r.length} 条`));const o={messages:r,updatedAt:Date.now()};localStorage.setItem(b(n),JSON.stringify(o))}catch(n){n instanceof Error&&"QuotaExceededError"===n.name?t.error("localStorage 空间不足,会话历史保存失败。建议清空历史记录。"):t.error("保存会话历史失败",n)}}(v.integrateId,I),C&&k(C)}catch(n){L&&L();const e=n instanceof i?n.message:"发送失败,请稍后重试";if(C){const n=document.createElement("div");n.className="csk-msg csk-msg--ai";const t=document.createElement("div");t.className="csk-msg__bubble",t.style.color="#DC2626",t.textContent=`⚠ ${e}`,n.appendChild(t),C.appendChild(n)}t.error(`发送失败 integrateId=${v.integrateId}`,n)}finally{S=!1,N()}}let B=null,M=!1,q=null,T=null,H=null,z=null,j=null,U=null,W=null,K=null,O=null;function P(){T&&T.classList.remove("csk-window--hidden")}function R(){T&&T.classList.add("csk-window--hidden")}function J(){T&&(T.classList.contains("csk-window--hidden")?(P(),setTimeout(()=>{z&&z.focus()},100)):R())}const X={init:function(n){if(M)return void t.warn("SDK 已初始化,请先调用 destroy() 再重新初始化");const o=function(n){var e,r,o,s,i,a;if(!n.integrateId||"string"!=typeof n.integrateId||""===n.integrateId.trim())return t.error('integrateId 是必传参数,请检查 init() 调用。示例:ChatbotSDK.init({ integrateId: "my-app", requestDomain: "https://api.example.com" })'),null;if(!n.requestDomain||"string"!=typeof n.requestDomain||""===n.requestDomain.trim())return t.error('requestDomain 是必传参数,请检查 init() 调用。示例:ChatbotSDK.init({ integrateId: "my-app", requestDomain: "https://api.example.com" })'),null;try{new URL(n.requestDomain)}catch(e){return t.error(`requestDomain 不是合法的 URL 格式:${n.requestDomain}。请提供完整的域名,如 https://api.example.com`),null}const c={integrateId:n.integrateId.trim(),requestDomain:n.requestDomain.replace(/\/+$/,""),userId:n.userId,roleId:n.roleId,categoryId:n.categoryId,showCategorySwitch:null!==(e=n.showCategorySwitch)&&void 0!==e&&e,title:n.title||"AI 智能助手",width:null!==(r=n.width)&&void 0!==r?r:380,position:"left-bottom"===n.position?"left-bottom":"right-bottom",primaryColor:n.primaryColor||"#4F46E5",launcherIcon:n.launcherIcon||'\n \n \n',showClear:null===(o=n.showClear)||void 0===o||o,showAdminPanel:null!==(s=n.showAdminPanel)&&void 0!==s&&s,streaming:null===(i=n.streaming)||void 0===i||i,locale:n.locale||"zh-CN",debug:null===(a=n.debug)||void 0===a||a};return t.info(`配置解析完成 integrateId=${c.integrateId} requestDomain=${c.requestDomain}`),c}(n);if(!o)return;var s;B=o,s=B.debug,e=s,function(n){r=n}(B),m(B),q=h(B,J),document.body.appendChild(q);const i=function(n){const e=document.createElement("div");e.id="csk-window",e.className=`csk-root csk-window csk-window--${"left-bottom"===n.position?"left":"right"} csk-window--hidden`;const t=document.createElement("div");t.className="csk-header";const r=document.createElement("span");r.className="csk-header__title",r.textContent=n.title;const o=document.createElement("div");o.className="csk-header__actions";const s=document.createElement("button");s.className="csk-header__btn csk-header__btn--minimize",s.setAttribute("title","最小化"),s.innerHTML='',s.addEventListener("click",()=>{e.classList.add("csk-window--hidden")});const i=document.createElement("button");i.className="csk-header__btn csk-header__btn--close",i.setAttribute("title","关闭"),i.innerHTML='',i.addEventListener("click",()=>{e.classList.add("csk-window--hidden")}),o.appendChild(s),o.appendChild(i),t.appendChild(r),t.appendChild(o);const a=document.createElement("div");a.id="csk-messages",a.className="csk-messages";const c=document.createElement("div");c.className="csk-input-area";const d=document.createElement("textarea");d.id="csk-input",d.className="csk-input",d.setAttribute("placeholder","输入您的问题..."),d.setAttribute("rows","1"),d.setAttribute("autofocus","");const l=document.createElement("button");l.id="csk-send-btn",l.className="csk-send-btn",l.setAttribute("title","发送"),l.setAttribute("disabled","true"),l.innerHTML='',c.appendChild(d),c.appendChild(l),e.appendChild(t),e.appendChild(a),e.appendChild(c);let u=null;n.showClear&&(u=document.createElement("button"),u.className="csk-clear-btn",u.textContent="清空对话",u.style.display="none",e.insertBefore(u,c));let m=null;return{window:e,messagesContainer:a,inputEl:d,sendBtn:l,clearBtn:u,showLoading:function(){if(m)return m.style.display="flex",m;const n=document.createElement("div");return n.className="csk-loading",n.innerHTML='\n
\n
\n
\n ',a.appendChild(n),m=n,n},hideLoading:function(){m&&m.parentNode&&(m.parentNode.removeChild(m),m=null)}}}(B);T=i.window,H=i.messagesContainer,z=i.inputEl,j=i.sendBtn,U=i.clearBtn,W=i.showLoading,K=i.hideLoading,document.body.appendChild(T);const a=T.querySelector(".csk-header");a&&(O=function(n,e){let t=!1,r=0,o=0,s=0,i=0;const a=n=>{t=!0,r=n.clientX,o=n.clientY;const a=e.getBoundingClientRect();s=r-a.left,i=o-a.top,document.addEventListener("mousemove",c),document.addEventListener("mouseup",d)},c=n=>{if(!t)return;const r=n.clientX-s,o=n.clientY-i,a=window.innerWidth-e.offsetWidth,c=window.innerHeight-e.offsetHeight;e.style.right="auto",e.style.bottom="auto",e.style.left=`${Math.max(0,Math.min(r,a))}px`,e.style.top=`${Math.max(0,Math.min(o,c))}px`},d=()=>{t=!1,document.removeEventListener("mousemove",c),document.removeEventListener("mouseup",d)};return n.addEventListener("mousedown",a),()=>{n.removeEventListener("mousedown",a),document.removeEventListener("mousemove",c),document.removeEventListener("mouseup",d)}}(a,T)),A(B,{messagesContainer:H,inputEl:z,sendBtn:j,clearBtn:U,showLoading:W,hideLoading:K}),M=!0,t.info(`初始化完成 integrateId=${B.integrateId} requestDomain=${B.requestDomain}`)},destroy:function(){if(!M)return;q&&q.parentNode&&(q.parentNode.removeChild(q),q=null),T&&T.parentNode&&(T.parentNode.removeChild(T),T=null),O&&(O(),O=null),l&&l.parentNode&&(l.parentNode.removeChild(l),l=null),document.querySelectorAll("style[data-csk-sdk]").forEach(n=>n.remove());const n=null==B?void 0:B.integrateId;B=null,M=!1,H=null,z=null,j=null,U=null,W=null,K=null,t.info(`销毁实例 integrateId=${n}`)},open:P,close:R,toggle:J,clearHistory:function(){B&&(U?U.click():confirm("确定清空所有对话记录?")&&y(B.integrateId))}};return"undefined"!=typeof window&&(window.ChatbotSDK=X),X}(); +//# sourceMappingURL=chatbot-sdk.min.js.map diff --git a/src/main/resources/static/sdk/chatbot-sdk.min.js.map b/src/main/resources/static/sdk/chatbot-sdk.min.js.map new file mode 100644 index 0000000..063a1b7 --- /dev/null +++ b/src/main/resources/static/sdk/chatbot-sdk.min.js.map @@ -0,0 +1 @@ +{"version":3,"file":"chatbot-sdk.min.js","sources":["../src/logger.ts","../src/api.ts","../src/styles.ts","../src/utils.ts","../src/dom.ts","../src/storage.ts","../src/chat.ts","../src/index.ts","../src/config.ts"],"sourcesContent":[null,null,null,null,null,null,null,null,null],"names":["PREFIX","debugEnabled","logger","info","msg","data","console","log","undefined","warn","error","currentConfig","buildUrl","path","Error","requestDomain","replace","startsWith","async","safeFetch","url","options","timeout","controller","AbortController","timer","setTimeout","abort","fetch","Object","assign","signal","mode","credentials","err","DOMException","name","CskError","TypeError","message","includes","clearTimeout","constructor","type","super","this","getHttpErrorMessage","status","chatRequest","params","URLSearchParams","set","integrateId","userId","roleId","String","categoryId","toString","buildChatUrl","startTime","Date","now","length","response","ok","errorMsg","text","duration","chatSSERequest","onChunk","onDone","onError","buildChatSSEUrl","totalText","REQUEST_TIMEOUT","reader","_a","body","getReader","decoder","TextDecoder","stream","buffer","done","value","read","decode","lines","split","pop","line","trimmed","trim","substring","readErr","releaseLock","styleElement","cssVars","config","darker","hex","amount","match","clamp","v","Math","max","min","r","parseInt","g","b","padStart","adjustColor","primaryColor","width","injectStyles","document","querySelector","createElement","setAttribute","textContent","getStyles","head","appendChild","uuid","crypto","randomUUID","c","random","createLauncher","onClick","launcher","id","className","position","title","innerHTML","launcherIcon","debouncedClick","fn","delay","args","apply","debounce","addEventListener","e","key","preventDefault","renderUserBubble","container","timestamp","wrapper","bubble","time","formatTime","renderAIBubble","scrollToBottom","scrollTop","scrollHeight","d","getHours","getMinutes","storageKey","clearMessages","localStorage","removeItem","messages","messagesContainer","inputEl","sendBtn","clearBtn","showLoadingFn","hideLoadingFn","isSending","initChat","cfg","dom","showLoading","hideLoading","handleSend","shiftKey","updateSendBtnState","confirm","style","display","handleClear","bindSendEvents","history","raw","getItem","JSON","parse","Array","isArray","loadMessages","role","content","renderHistory","removeAttribute","height","userTimestamp","userMsg","push","aiContent","aiTimestamp","streaming","Promise","resolve","reject","bubbleEl","wrapperEl","accumulated","streamStarted","chunk","createEmptyAIBubble","then","catch","sendStreamMessage","aiMsg","slice","updatedAt","setItem","stringify","saveMessages","errMsg","errorBubble","color","isInitialized","launcherEl","windowEl","dragCleanup","open","classList","remove","close","add","toggle","contains","focus","ChatbotSDK","init","rawConfig","parsed","URL","_g","showCategorySwitch","_b","showClear","_c","showAdminPanel","_d","_e","locale","debug","_f","parseConfig","enabled","setApiConfig","header","titleEl","actions","minimizeBtn","closeBtn","inputArea","insertBefore","loadingEl","window","el","parentNode","removeChild","createChatWindow","headerEl","dragging","startX","startY","offsetX","offsetY","onMouseDown","clientX","clientY","rect","getBoundingClientRect","left","top","onMouseMove","onMouseUp","x","y","maxX","innerWidth","offsetWidth","maxY","innerHeight","offsetHeight","right","bottom","removeEventListener","enableDrag","destroy","querySelectorAll","forEach","oldIntegrateId","clearHistory","click"],"mappings":"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"} \ No newline at end of file diff --git a/src/main/resources/static/sdk/test.html b/src/main/resources/static/sdk/test.html new file mode 100644 index 0000000..36f35b5 --- /dev/null +++ b/src/main/resources/static/sdk/test.html @@ -0,0 +1,482 @@ + + + + + + ChatbotSDK 验证测试 + + + +
+

🧪 ChatbotSDK 验证测试

+

P0 核心链路验证:初始化 → DOM 挂载 → 配置校验 → API 通信 → 缓存读写 → 销毁清理

+ + +
+

📋 SDK 配置

+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+
+ + +
+
+ + +
+
+
+
+ + +
+
+ + +
+
+ + +
+
+
+ + +
+
+ + +
+

📊 运行状态

+
+ ⭕ 全局挂载:未检测 + ⭕ 配置校验:未检测 + ⭕ DOM 挂载:未检测 + ⭕ API 通信:未检测 + ⭕ 缓存读写:未检测 +
+
+ + + + + +
+
+ + +
+

📝 测试日志

+
+等待测试开始... +
+
+ +
+
+
+ + + + + + +