diff --git a/src/api/boe/aiChat.js b/src/api/boe/aiChat.js index fc2282ca..accb9f23 100644 --- a/src/api/boe/aiChat.js +++ b/src/api/boe/aiChat.js @@ -28,3 +28,9 @@ export function getChatMessages(conversationId) { export function showCaseAiEntrance() { return ajax.get('/xboe/m/boe/case/ai/show-entrance') } +export function likeMsg(data) { + return ajax.postJson('/xboe/m/boe/case/ai/likeMsg',data) +} +export function msgFeedback(data) { + return ajax.postJson('/xboe/m/boe/case/ai/msgFeedback',data) +} diff --git a/src/assets/images/case/cai-yes.svg b/src/assets/images/case/cai-yes.svg new file mode 100644 index 00000000..d0447617 --- /dev/null +++ b/src/assets/images/case/cai-yes.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/images/case/cai.svg b/src/assets/images/case/cai.svg new file mode 100644 index 00000000..ba1e9716 --- /dev/null +++ b/src/assets/images/case/cai.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/images/case/zan-yes.svg b/src/assets/images/case/zan-yes.svg new file mode 100644 index 00000000..de9f83a5 --- /dev/null +++ b/src/assets/images/case/zan-yes.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/images/case/zan.svg b/src/assets/images/case/zan.svg new file mode 100644 index 00000000..6e92fc7b --- /dev/null +++ b/src/assets/images/case/zan.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/views/portal/case/AICall.vue b/src/views/portal/case/AICall.vue index de28de92..f9f0a7ee 100644 --- a/src/views/portal/case/AICall.vue +++ b/src/views/portal/case/AICall.vue @@ -9,7 +9,7 @@ @close="onClose" class="case-expert-dialog" :modal="false" - :fullscreen="false" + :fullscreen="dialogFullscreen" top="0" v-resizeable v-draggable @@ -17,14 +17,24 @@
案例专家 - + + + + + + +
+ @@ -36,7 +46,7 @@ @wheel="handleWheel" >
- +
@@ -153,13 +163,19 @@ export default { let startY = 0; let startLeft = 0; let startTop = 0; - const startDrag = (event) => { // 只有在标题栏上按下鼠标才开始拖动 if (event.target.closest('.resize-handle')) { return; // 如果点击的是resize-handle,则不触发拖动 } - + if (event.target.closest('.window-control-btn')) { + return; // 如果点击的是控制按钮,则不触发拖动 + } + // 全屏状态下拖动为正常弹窗大小 + if (vnode.context.dialogFullscreen) { + vnode.context.onRestoreWindowClick(); + return; + } isDragging = true; startX = event.clientX; startY = event.clientY; @@ -186,14 +202,12 @@ export default { const stopDrag = () => { isDragging = false; - // 保存当前位置到 sessionStorage const currentPosition = { left: parseInt(dialogEl.style.left), top: parseInt(dialogEl.style.top) }; // sessionStorage.setItem('aiCallDialogPosition', JSON.stringify(currentPosition)); - // 移除全局事件监听 document.removeEventListener('mousemove', handleMouseMove); document.removeEventListener('mouseup', stopDrag); @@ -468,6 +482,7 @@ export default { }, data() { return { + dialogFullscreen:false, openImg, AIContent: '', isLoading: false, @@ -475,6 +490,7 @@ export default { messageList: [ { typing:true, + isFirstMessage: true, // 添加 isFirstMessage 属性不展示赞 踩 isBot: true, // 是否为机器人 text: `

您好!我是京东方案例智能问答助手,随时为您服务。

我可以帮您快速查找和解读平台内的各类案例内容。只需输入您想了解的问题或关键词,我会从案例库中精准匹配相关信息,并提供清晰的解答。每条回答都会附上来源链接,方便您随时查阅原始案例全文。

@@ -554,6 +570,90 @@ export default { } }, methods: { + onbigWindowClick() { + console.log('放大'); + // 保存当前非全屏状态的尺寸和位置(仅当当前不是全屏状态时) + if (!this.dialogFullscreen) { + const dialogEl = document.querySelector('.case-expert-dialog .el-dialog'); + if (dialogEl) { + const normalSize = { + width: parseInt(dialogEl.style.width) || dialogEl.offsetWidth, + height: parseInt(dialogEl.style.height) || dialogEl.offsetHeight, + left: parseInt(dialogEl.style.left) || dialogEl.offsetLeft, + top: parseInt(dialogEl.style.top) || dialogEl.offsetTop + }; + sessionStorage.setItem('aiCallDialogNormalSize', JSON.stringify(normalSize)); + } + } + + // 设置全屏状态 + this.dialogFullscreen = true; + + // 设置全屏尺寸和位置 + this.$nextTick(() => { + const dialogEl = document.querySelector('.case-expert-dialog .el-dialog'); + if (dialogEl) { + dialogEl.style.width = '100vw'; + dialogEl.style.height = '100vh'; + dialogEl.style.left = '0px'; + dialogEl.style.top = '0px'; + + // 更新消息容器高度 + const messageContainer = document.querySelector('.welcome-message'); + const inputArea = document.querySelector('.input-area-wrapper'); + if (messageContainer && inputArea) { + messageContainer.style.height = `calc(100vh - ${inputArea.offsetHeight}px - 120px)`; + } + } + }); +}, +onRestoreWindowClick(){ + console.log('缩小'); + this.dialogFullscreen = false; + + this.$nextTick(() => { + const dialogEl = document.querySelector('.case-expert-dialog .el-dialog'); + if (dialogEl) { + // 从 sessionStorage 中获取保存的正常窗口尺寸和位置 + const savedNormalSize = sessionStorage.getItem('aiCallDialogNormalSize'); + const savedSize = sessionStorage.getItem('aiCallDialogSize'); + const savedPosition = sessionStorage.getItem('aiCallDialogPosition'); + + if (savedNormalSize) { + // 使用之前保存的正常尺寸 + const { width, height, left, top } = JSON.parse(savedNormalSize); + dialogEl.style.width = width + 'px'; + dialogEl.style.height = height + 'px'; + dialogEl.style.left = left + 'px'; + dialogEl.style.top = top + 'px'; + } else if (savedSize) { + // 回退到通用保存的尺寸 + const { width, height, left, top } = JSON.parse(savedSize); + dialogEl.style.width = width + 'px'; + dialogEl.style.height = height + 'px'; + dialogEl.style.left = left + 'px'; + dialogEl.style.top = top + 'px'; + } else { + // 如果没有保存的尺寸,则使用默认值 + dialogEl.style.width = '800px'; + dialogEl.style.height = '600px'; + dialogEl.style.left = (window.innerWidth - 800) / 2 + 'px'; + dialogEl.style.top = '100px'; + } + + // 应用相应的消息容器高度 + this.$nextTick(() => { + const messageContainer = document.querySelector('.welcome-message'); + const inputArea = document.querySelector('.input-area-wrapper'); + if (messageContainer && inputArea) { + const dialogHeight = dialogEl.style.height || '600px'; + messageContainer.style.height = `calc(${dialogHeight} - ${inputArea.offsetHeight}px - 120px)`; + } + }); + } + }); +}, + // / 关闭最小化窗口 closeMinimizedWindow() { this.$store.commit('app/SET_SHOW_AI_CALL_MINIMIZED', false); @@ -570,10 +670,13 @@ closeMinimizedWindow() { sessionStorage.removeItem('aiCallDialogSize'); // sessionStorage.removeItem('aiCallDialogPosition'); this.$emit('close') + this.dialogFullscreen=false // 可以在这里执行其他逻辑 }, minimizeWindow() { + console.log(131); + this.windowState = 'minimized'; this.$store.commit('app/SET_SHOW_AI_CALL_MINIMIZED', true); }, @@ -625,6 +728,7 @@ closeMinimizedWindow() { this.messageList = [ { isBot: true, + isFirstMessage: true, text: `

您好!我是京东方案例智能问答助手,随时为您服务。

我可以帮您快速查找和解读平台内的各类案例内容。只需输入您想了解的问题或关键词,我会从案例库中精准匹配相关信息,并提供清晰的解答。每条回答都会附上来源链接,方便您随时查阅原始案例全文。

我还会根据您的提问,智能推荐相关延伸问题,助您更高效地探索知识、解决问题。

@@ -743,6 +847,7 @@ closeMinimizedWindow() { font-size: 18px; padding: 5px 10px; color: #333; /* 黑色图标 */ + margin-top: -13px; } } @@ -770,6 +875,8 @@ closeMinimizedWindow() { //margin-bottom: 20px; display: flex; flex-direction: column; + max-width: 800px; + margin: 0 auto; .welcome-message { display: flex; @@ -903,4 +1010,13 @@ closeMinimizedWindow() { align-items: center; } } +.case-expert-dialog { + ::v-deep .el-dialog.fullscreen { + border-radius: 0; + + .el-dialog__body { + height: calc(100vh - 120px); // 减去标题栏高度 + } + } + } diff --git a/src/views/portal/case/components/messages.vue b/src/views/portal/case/components/messages.vue index 72ec2379..dd0e5ccb 100644 --- a/src/views/portal/case/components/messages.vue +++ b/src/views/portal/case/components/messages.vue @@ -6,15 +6,13 @@
-
+
+
+ -
+
引用案例 @@ -22,11 +20,7 @@
-
+
{{ item.title }} {{ item.uploadTime }} @@ -43,27 +37,52 @@
+ +
+ + zan + + + +
+ {{ + item.name}} +
+ + +
+ 确定 +
+ cai +
+
+
- - - - - - - - - - - - - - + + + + + + + + + + + + +
@@ -73,6 +92,7 @@ import highlight from 'markdown-it-highlightjs'; import 'highlight.js/styles/a11y-dark.css'; import markdownItMermaid from 'markdown-it-mermaid'; import mermaid from 'mermaid'; +import { likeMsg, msgFeedback } from '@/api/boe/aiChat.js' // 初始化 Mermaid mermaid.initialize({ startOnLoad: false }); @@ -97,6 +117,11 @@ export default { type: Array, default: () => [], }, + // 添加 isFirstMessage 属性来标识是否为第一条消息 + isFirstMessage: { + type: Boolean, + default: false + } }, data() { return { @@ -105,6 +130,18 @@ export default { typingTimer: null, typingSpeed: 30, // 毫秒/字符 showAllCaseRefers: false, + isLike: false, // 添加赞状态 + isDislike: false, // 控制踩状态 + caiDialogShow: false, + tagList: [ + { name: '回答不准确' }, + { name: '逻辑不清晰' }, + { name: '内容不完整' }, + { name: '其他' }, + ], + feedbackText: '', + showFeedbackIcons: false // 新增:控制赞/踩图标显示 + }; }, computed: { @@ -123,6 +160,7 @@ export default { handler(newVal) { if (!newVal) { this.displayText = ''; + this.showFeedbackIcons = false; // 隐藏图标 return; } @@ -130,15 +168,73 @@ export default { // this.startTyping(newVal); // 启动打字机效果/**/ this.displayText = newVal || '' + // 文本加载完成后显示图标 + this.$nextTick(() => { + this.showFeedbackIcons = true; + }); } else { this.displayText = this.md.render(newVal); - this.$nextTick(this.renderMermaid); // 直接渲染 Mermaid + this.$nextTick(() => { + this.showFeedbackIcons = true; // 显示图标 + this.renderMermaid(); + }); } }, immediate: true, }, }, methods: { + // 赞 + toggleStar() { + // 点击第一个图标时,激活它并取消第二个图标的激活状态 + this.isLike = !this.isLike; + this.isDislike = false; + let params = { + docId: this.messageData.docId, + likeStatus: this.isLike ? "1" : "", + } + likeMsg(params).then(res => { + console.log(res); + }) + }, + // 踩 + toggleSecondIcon() { + this.feedbackText = null + let params = { + docId: this.messageData.docId, + likeStatus: !this.isDislike ? "-1" : '' + } + likeMsg(params).then(res => { + console.log(res); + }) + // 点击第二个图标时,激活它并取消第一个图标的激活状态 + this.isDislike = !this.isDislike; + this.isLike = false; + if (this.isDislike) { + this.caiDialogShow = true + } else { + this.caiDialogShow = false + } + }, + // 标签选择 + handleTag(item) { + this.feedbackText = item.name + }, + // 确定 + handleSure() { + let params = { + docId: this.messageData.docId, + feedback: this.feedbackText + } + msgFeedback(params).then(res => { + console.log(res); + if(res.status ==200){ + this.$message.success('反馈成功') + this.caiDialogShow = false + } + + }) + }, toUrl(item) { this.$router.push({ path: '/case/detail', @@ -166,6 +262,7 @@ export default { } else { clearInterval(this.typingTimer); this.typingTimer = null; + this.showFeedbackIcons = true; // 打字完成后显示图标 this.$nextTick(this.renderMermaid); // 渲染 Mermaid 图表 } }, this.typingSpeed); @@ -207,14 +304,16 @@ export default { diff --git a/src/views/portal/case/components/sendMessage.vue b/src/views/portal/case/components/sendMessage.vue index f529b232..941dbcfa 100644 --- a/src/views/portal/case/components/sendMessage.vue +++ b/src/views/portal/case/components/sendMessage.vue @@ -1,15 +1,8 @@