Files
----/后端源码/yifan.action-ai.cn/index/js/index.BCV3d1ft.js

4 lines
8.3 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import{W as e,a7 as a,ab as s,h as l,aa as t,ac as n,g as c,ad as o,ae as i,af as r,ag as u,ah as d,K as v,a0 as p,y as g,ai as m,a as h,D as y}from"./element-plus.DhcJM-BD.js";import{o as f,ej as k,ek as b,B as w,a5 as _,t as x,H as C,K as A,I as E,J as S,v as F,u as T,M as j,Z as z,Y as D,X as H,R as W,am as I,aQ as K,a9 as M,r as P,c as B,D as L,el as R}from"./.pnpm.DGfAnZKL.js";import{_ as V}from"./_plugin-vue_export-helper.BCo6x5W8.js";const N={class:"chatgpt-container"},O={class:"main-chat"},Y={class:"chat-navbar"},$={class:"navbar-right"},J={class:"connection-status"},Q={class:"status-text"},U={key:0,class:"welcome-screen"},X={class:"welcome-content"},Z={class:"ai-logo"},q={class:"example-prompts"},G={key:1,class:"messages-list"},ee={class:"message-avatar"},ae={key:0,class:"user-avatar"},se={key:1,class:"ai-avatar"},le={class:"message-content"},te={class:"message-header"},ne={class:"sender-name"},ce={class:"message-body"},oe=["innerHTML"],ie={key:1,class:"typing-indicator"},re={key:0,class:"message-actions"},ue={key:2,class:"error-banner"},de={class:"chat-input"},ve={class:"input-wrapper"},pe={class:"input-container"},ge=V(f({__name:"index",setup(f){const V=new k({html:!0,linkify:!0,typographer:!0,breaks:!0,highlight(e,a){if(a&&R.getLanguage(a))try{return`<pre class="hljs"><code>${R.highlight(e,{language:a,ignoreIllegals:!0}).value}</code></pre>`}catch{}return`<pre class="hljs"><code>${V.utils.escapeHtml(e)}</code></pre>`}}).use(b),ge=V.renderer.rules.link_open||function(e,a,s,l,t){return t.renderToken(e,a,s,l,t)};V.renderer.rules.link_open=function(e,a,s,l,t){return e[a].attrPush(["target","_blank"]),e[a].attrPush(["rel","noopener noreferrer"]),ge(e,a,s,l,t)};const me=P([]),he=P(""),ye=P(!1),fe=P(!1),ke=P("disconnected"),be=P(""),we=P();let _e=null;const xe=B(()=>{switch(ke.value){case"connected":return"已连接";case"connecting":return"连接中...";case"disconnected":return"未连接";default:return"未知状态"}}),Ce=()=>{if((null==_e?void 0:_e.readyState)!==WebSocket.OPEN){ke.value="connecting",be.value="";try{_e=new WebSocket("wss://yifan.action-ai.cn/api/v1/application/ai/ws"),_e.onopen=()=>{fe.value=!0,ke.value="connected",h.success("连接成功")},_e.onmessage=e=>{Se({content:e.data})},_e.onclose=e=>{fe.value=!1,ke.value="disconnected",me.value.forEach(e=>{"assistant"===e.type&&e.loading&&(e.loading=!1,e.collapsed=e.content.length>200)})},_e.onerror=e=>{fe.value=!1,ke.value="disconnected",h.error("连接失败,请检查服务器状态"),me.value.forEach(e=>{"assistant"===e.type&&e.loading&&(e.loading=!1,e.collapsed=e.content.length>200)})}}catch(e){ke.value="disconnected",be.value="无法创建连接"}}},Ae=()=>{_e&&(_e.close(1e3,"用户主动断开"),_e=null),fe.value=!1,ke.value="disconnected",me.value.forEach(e=>{"assistant"===e.type&&e.loading&&(e.loading=!1)})},Ee=()=>{fe.value?(Ae(),h.info("已断开连接")):Ce()},Se=e=>{const a=me.value[me.value.length-1];a&&"assistant"===a.type&&a.loading?a.content+=e.content||e.message||"":Te("assistant",e.content||e.message||"收到回复"),De()},Fe=async()=>{const e=he.value.trim();if(!e||!fe.value||ye.value)return;const a=me.value[me.value.length-1];a&&"assistant"===a.type&&a.loading&&(a.loading=!1),Te("user",e),he.value="";const s={id:He(),type:"assistant",content:"",timestamp:Date.now(),loading:!0};me.value.push(s),ye.value=!0,De();try{if((null==_e?void 0:_e.readyState)!==WebSocket.OPEN)throw new Error("WebSocket 连接未建立");_e.send(e)}catch(l){me.value.pop(),be.value="发送消息失败,请检查连接状态",h.error("发送失败")}finally{ye.value=!1}},Te=(e,a)=>{const s={id:He(),type:e,content:a,timestamp:Date.now(),
// 长消息自动折叠
collapsed:a.length>200};me.value.push(s),L(()=>De())},je=async()=>{try{await y.confirm("确定要清空当前对话吗?此操作不可恢复。","确认清空",{confirmButtonText:"确定",cancelButtonText:"取消",type:"warning"}),me.value=[],h.success("对话已清空")}catch{}},ze=e=>{he.value=e},De=()=>{L(()=>{we.value&&(we.value.scrollTop=we.value.scrollHeight)})},He=()=>Date.now().toString(36)+Math.random().toString(36).substr(2);return w(()=>{Ce()}),_(()=>{Ae()}),(y,f)=>{const k=l,b=c,w=p,_=g;return x(),C("div",N,[A("div",O,[A("div",Y,[f[8]||(f[8]=A("div",{class:"navbar-left"},[A("h2",null,"FA智能助手")],-1)),A("div",$,[A("div",J,[E(k,{class:j(["status-icon",ke.value])},{default:S(()=>["connected"===ke.value?(x(),F(T(e),{key:0})):"connecting"===ke.value?(x(),F(T(a),{key:1})):(x(),F(T(s),{key:2}))]),_:1},8,["class"]),A("span",Q,z(xe.value),1)]),me.value.length>0?(x(),F(b,{key:0,text:"",icon:T(t),onClick:je},{default:S(()=>[...f[7]||(f[7]=[D(" 清空对话 ",-1)])]),_:1},8,["icon"])):H("",!0),E(b,{text:"",icon:T(n),onClick:Ee},{default:S(()=>[D(z(fe.value?"断开连接":"重新连接"),1)]),_:1},8,["icon"])])]),A("div",{ref_key:"messagesContainer",ref:we,class:"chat-messages"},[0===me.value.length?(x(),C("div",U,[A("div",X,[A("div",Z,[E(k,{size:"64"},{default:S(()=>[E(T(o))]),_:1})]),f[13]||(f[13]=A("h1",null,"FA智能助手",-1)),f[14]||(f[14]=A("p",{class:"welcome-subtitle"}," 我是您的专属AI助手可以帮您回答问题、处理任务和进行智能对话 ",-1)),A("div",q,[A("div",{class:"prompt-card",onClick:f[0]||(f[0]=e=>ze("请介绍一下FastApiAdmin系统"))},[...f[9]||(f[9]=[A("h4",null,"系统介绍",-1),A("p",null,"请介绍一下FastApiAdmin系统",-1)])]),A("div",{class:"prompt-card",onClick:f[1]||(f[1]=e=>ze("如何在系统中创建新的模块?"))},[...f[10]||(f[10]=[A("h4",null,"开发指导",-1),A("p",null,"如何在系统中创建新的模块?",-1)])]),A("div",{class:"prompt-card",onClick:f[2]||(f[2]=e=>ze("系统的权限管理是如何工作的?"))},[...f[11]||(f[11]=[A("h4",null,"权限管理",-1),A("p",null,"FA系统的权限管理是如何工作的",-1)])]),A("div",{class:"prompt-card",onClick:f[3]||(f[3]=e=>ze("如何优化FA系统的性能"))},[...f[12]||(f[12]=[A("h4",null,"性能优化",-1),A("p",null,"如何优化系统的性能?",-1)])])])])])):(x(),C("div",G,[(x(!0),C(W,null,I(me.value,e=>{return x(),C("div",{key:e.id,class:j(["message-group",e.type])},[A("div",ee,["user"===e.type?(x(),C("div",ae,[E(k,null,{default:S(()=>[E(T(i))]),_:1})])):(x(),C("div",se,[E(k,null,{default:S(()=>[E(T(o))]),_:1})]))]),A("div",le,[A("div",te,[A("strong",ne,z("user"===e.type?"You":"FA助手"),1)]),A("div",ce,[e.content.length>200?(x(),F(b,{key:0,text:"",size:"small",icon:e.collapsed?T(r):T(u),class:"fold-button",onClick:a=>(e=>{e.collapsed=!e.collapsed})(e)},{default:S(()=>[D(z(e.collapsed?"展开":"收起"),1)]),_:2},1032,["icon","onClick"])):H("",!0),A("div",{class:j(["message-text",{collapsed:e.collapsed}]),innerHTML:(a=e.content,a?V.render(a):"")},null,10,oe),"assistant"===e.type&&e.loading&&!e.content?(x(),C("div",ie,[...f[15]||(f[15]=[A("div",{class:"typing-dots"},[A("span"),A("span"),A("span")],-1)])])):H("",!0)]),e.loading?H("",!0):(x(),C("div",re,[E(b,{text:"",size:"small",icon:T(d),onClick:a=>(async e=>{try{await navigator.clipboard.writeText(e),h.success("已复制到剪贴板")}catch{const a=document.createElement("textarea");a.value=e,document.body.appendChild(a),a.select(),document.execCommand("copy"),document.body.removeChild(a),h.success("已复制到剪贴板")}})(e.content)},null,8,["icon","onClick"]),"assistant"===e.type?(x(),F(b,{key:0,text:"",size:"small",icon:T(v)},null,8,["icon"])):H("",!0)]))])],2);var a}),128))])),be.value?(x(),C("div",ue,[E(w,{title:be.value,type:"error",closable:!0,"show-icon":"",onClose:f[4]||(f[4]=e=>be.value="")},null,8,["title"])])):H("",!0)],512),A("div",de,[A("div",ve,[A("div",pe,[E(_,{modelValue:he.value,"onUpdate:modelValue":f[5]||(f[5]=e=>he.value=e),placeholder:fe.value?"向FA助手发送消息...":"请先连接到服务器",disabled:!fe.value||ye.value,type:"textarea",rows:1,autosize:{minRows:1,maxRows:6},resize:"none",class:"message-input",onKeydown:[K(M(Fe,["exact","prevent"]),["enter"]),f[6]||(f[6]=K(M(e=>he.value+="\n",["shift","exact"]),["enter"]))]},null,8,["modelValue","placeholder","disabled","onKeydown"]),E(b,{disabled:!he.value.trim()||!fe.value||ye.value,loading:ye.value,class:"send-button",type:"primary",circle:"",onClick:Fe},{default:S(()=>[E(k,null,{default:S(()=>[E(T(m))]),_:1})]),_:1},8,["disabled","loading"])]),f[16]||(f[16]=A("div",{class:"input-footer"},[A("span",{class:"input-hint"},"按 Enter 发送消息Shift + Enter 换行")],-1))])])])])}}}),[["__scopeId","data-v-2fe5cc49"]]);export{ge as default};