| src/main/webapp/static/js/common.js | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/main/webapp/views/ai/diagnosis.html | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/main/webapp/views/index.html | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
src/main/webapp/static/js/common.js
@@ -193,3 +193,57 @@ if (new RegExp("(" + k + ")").test(fmt)) fmt = fmt.replace(RegExp.$1, (RegExp.$1.length === 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length))); return fmt; } /** * 获取AI助手SVG图标HTML * @param {number} width 宽度,默认48 * @param {number} height 高度,默认48 * @returns {string} SVG HTML字符串 */ function getAiIconHtml(width, height) { width = width || 48; height = height || 48; // 生成唯一ID防止冲突 var uniqueId = 'ai_icon_' + Math.random().toString(36).substr(2, 9); var textGradientId = 'textGradient_' + uniqueId; var glowId = 'glow_' + uniqueId; var spinName = 'spin_' + uniqueId; return '<svg width="' + width + '" height="' + height + '" viewBox="0 0 100 100" xmlns="http://www.w3.org/2000/svg" fill="none">' + '<defs>' + '<linearGradient id="' + textGradientId + '" gradientUnits="userSpaceOnUse" x1="25" y1="50" x2="75" y2="50">' + '<stop offset="0%" stop-color="#8b5cf6"/>' + '<stop offset="20%" stop-color="#f472b6"/>' + '<stop offset="40%" stop-color="#fb923c"/>' + '<stop offset="60%" stop-color="#fbbf24"/>' + '<stop offset="80%" stop-color="#22d3ee"/>' + '<stop offset="100%" stop-color="#3b82f6"/>' + '<animateTransform attributeName="gradientTransform" type="rotate" from="0 50 50" to="360 50 50" dur="5s" repeatCount="indefinite" />' + '</linearGradient>' + '<filter id="' + glowId + '" x="-50%" y="-50%" width="200%" height="200%">' + '<feGaussianBlur stdDeviation="1.6" result="blur"/>' + '<feMerge>' + '<feMergeNode in="blur"/>' + '<feMergeNode in="SourceGraphic"/>' + '</feMerge>' + '</filter>' + '<style>' + '.' + spinName + ' { animation: ' + spinName + ' 5s linear infinite; transform-origin: 50px 50px; }' + '@keyframes ' + spinName + ' { from { transform: rotate(0deg); } to { transform: rotate(360deg); } }' + '.geo-text-' + uniqueId + ' { fill: url(#' + textGradientId + '); stroke: rgba(0,0,0,0.40); stroke-width: 0.45; paint-order: stroke fill; }' + '</style>' + '</defs>' + '<g class="' + spinName + '" filter="url(#' + glowId + ')">' + '<g transform="rotate(0 50 50)"><rect x="48" y="18" width="4.5" height="10" rx="2" fill="#8b5cf6"/></g>' + '<g transform="rotate(60 50 50)"><rect x="48" y="18" width="4.5" height="10" rx="2" fill="#f472b6"/></g>' + '<g transform="rotate(120 50 50)"><rect x="48" y="18" width="4.5" height="10" rx="2" fill="#fb923c"/></g>' + '<g transform="rotate(180 50 50)"><rect x="48" y="18" width="4.5" height="10" rx="2" fill="#fbbf24"/></g>' + '<g transform="rotate(240 50 50)"><rect x="48" y="18" width="4.5" height="10" rx="2" fill="#22d3ee"/></g>' + '<g transform="rotate(300 50 50)"><rect x="48" y="18" width="4.5" height="10" rx="2" fill="#3b82f6"/></g>' + '</g>' + '<g transform="translate(50 50) scale(0.35) translate(-32.5 -20)" class="geo-text-' + uniqueId + '">' + '<path d="M0 40 L20 0 L40 40 Z"/><rect x="12" y="22" width="16" height="4" rx="1"/>' + '<rect x="50" y="0" width="15" height="4" rx="1"/><rect x="55" y="4" width="5" height="32" rx="1.5"/><rect x="50" y="36" width="15" height="4" rx="1"/>' + '</g>' + '</svg>'; } src/main/webapp/views/ai/diagnosis.html
@@ -3,7 +3,7 @@ <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <title>WCS AI 诊断</title> <title>WCS AI 助手</title> <link rel="stylesheet" href="../../static/vue/element/element.css" /> <style> body { background: #f5f7fa; } @@ -16,81 +16,18 @@ .markdown-body h1, .markdown-body h2, .markdown-body h3 { margin-top: 8px; } .markdown-body pre { background: #f6f8fa; padding: 12px; border-radius: 6px; overflow: auto; } .status { color: #909399; } /* 整个图标旋转动画 */ .spinner { animation: spin 2.8s linear infinite; transform-origin: 50% 50%; } @keyframes spin { from { transform: rotate(0deg); } to { transform: rotate(360deg); } } </style> </head> <body> <div id="app" class="container"> <el-card shadow="hover"> <div slot="header" class="clearfix" style="display: flex; align-items: center;"> <svg width="32" height="32" viewBox="0 0 64 64" style="margin-right: 10px;" xmlns="http://www.w3.org/2000/svg"> <!-- 透明背景:不画任何底色即可 --> <!-- 一点柔和发光效果 --> <defs> <filter id="glow" x="-50%" y="-50%" width="200%" height="200%"> <feGaussianBlur stdDeviation="2.5" result="blur"/> <feMerge> <feMergeNode in="blur"/> <feMergeNode in="SourceGraphic"/> </feMerge> </filter> </defs> <!-- 旋转组 --> <g class="spinner" filter="url(#glow)"> <!-- 每一条彩色「小弯条」 --> <!-- 可以通过调整 rx/ry、width/height 来改粗细和弯度 --> <!-- 1. 紫色 --> <rect x="30" y="10" width="6" height="14" rx="3" ry="3" fill="#8b5cf6" /> <!-- 2. 粉色(顺时针旋转60°) --> <g transform="rotate(60 32 32)"> <rect x="30" y="10" width="6" height="14" rx="3" ry="3" fill="#f472b6" /> </g> <!-- 3. 橙色 --> <g transform="rotate(120 32 32)"> <rect x="30" y="10" width="6" height="14" rx="3" ry="3" fill="#fb923c" /> </g> <!-- 4. 金黄 --> <g transform="rotate(180 32 32)"> <rect x="30" y="10" width="6" height="14" rx="3" ry="3" fill="#fbbf24" /> </g> <!-- 5. 青色 --> <g transform="rotate(240 32 32)"> <rect x="30" y="10" width="6" height="14" rx="3" ry="3" fill="#22d3ee" /> </g> <!-- 6. 蓝色 --> <g transform="rotate(300 32 32)"> <rect x="30" y="10" width="6" height="14" rx="3" ry="3" fill="#3b82f6" /> </g> </g> </svg> <span>WCS AI 诊断</span> <div v-html="headerIcon" style="margin-right: 10px; display: flex;"></div> <span>WCS AI 助手</span> </div> <div class="actions"> <el-button type="primary" :loading="loading" :disabled="streaming" @click="start">开始诊断</el-button> <el-button type="primary" :loading="loading" :disabled="streaming" @click="start">一键诊断系统</el-button> <el-button type="warning" :disabled="!streaming" @click="stop">停止</el-button> <el-button @click="clear">清空</el-button> <span class="status">{{ statusText }}</span> @@ -119,6 +56,7 @@ el: '#app', data: function() { return { headerIcon: getAiIconHtml(50, 50), loading: false, streaming: false, source: null, src/main/webapp/views/index.html
@@ -146,71 +146,6 @@ <!-- 右下角SVG动画 --> <div id="ai-assistant-btn" style="position: fixed; bottom: 40px; right: 20px; z-index: 9999; cursor: pointer;"> <svg width="48" height="48" viewBox="0 0 64 64" xmlns="http://www.w3.org/2000/svg"> <!-- 透明背景:不画任何底色即可 --> <!-- 一点柔和发光效果 --> <defs> <filter id="glow" x="-50%" y="-50%" width="200%" height="200%"> <feGaussianBlur stdDeviation="2.5" result="blur"/> <feMerge> <feMergeNode in="blur"/> <feMergeNode in="SourceGraphic"/> </feMerge> </filter> <style> /* 整个图标旋转动画 */ .spinner { animation: spin 2.8s linear infinite; transform-origin: 50% 50%; } @keyframes spin { from { transform: rotate(0deg); } to { transform: rotate(360deg); } } </style> </defs> <!-- 旋转组 --> <g class="spinner" filter="url(#glow)"> <!-- 每一条彩色「小弯条」 --> <!-- 可以通过调整 rx/ry、width/height 来改粗细和弯度 --> <!-- 1. 紫色 --> <rect x="30" y="10" width="6" height="14" rx="3" ry="3" fill="#8b5cf6" /> <!-- 2. 粉色(顺时针旋转60°) --> <g transform="rotate(60 32 32)"> <rect x="30" y="10" width="6" height="14" rx="3" ry="3" fill="#f472b6" /> </g> <!-- 3. 橙色 --> <g transform="rotate(120 32 32)"> <rect x="30" y="10" width="6" height="14" rx="3" ry="3" fill="#fb923c" /> </g> <!-- 4. 金黄 --> <g transform="rotate(180 32 32)"> <rect x="30" y="10" width="6" height="14" rx="3" ry="3" fill="#fbbf24" /> </g> <!-- 5. 青色 --> <g transform="rotate(240 32 32)"> <rect x="30" y="10" width="6" height="14" rx="3" ry="3" fill="#22d3ee" /> </g> <!-- 6. 蓝色 --> <g transform="rotate(300 32 32)"> <rect x="30" y="10" width="6" height="14" rx="3" ry="3" fill="#3b82f6" /> </g> </g> </svg> </div> <script type="text/javascript" src="../static/js/jquery/jquery-3.3.1.min.js"></script> @@ -220,6 +155,9 @@ <script> console.log('%c 中扬立库平台 %c 1.0.0','background-color:rgb(53,73,94);color: #fff;border-radius:2px 0 0 2px;padding:2px 4px;','background-color:rgb(25,190,107);color: #fff;border-radius:0 2px 2px 0;padding:2px 4px;font: 9pt "Apercu Regular", Georgia, "Times New Roman", Times, serif;'); $(function () { // 注入AI助手图标 $('#ai-assistant-btn').html(getAiIconHtml(60, 60)); if ("" === localStorage.getItem('token')) { top.location.href = baseUrl + "/login"; }