|
|
@ -1,96 +1,147 @@ |
|
|
|
<script setup> |
|
|
|
// 导入 |
|
|
|
import { ref, computed, onMounted, watch, nextTick } from 'vue' |
|
|
|
import { setHeight } from '../utils/setHeight' |
|
|
|
import { getReplyAPI } from '../api/AIxiaocaishen' |
|
|
|
import AIchat from '../views/AIchat.vue' |
|
|
|
import AIfind from '../views/AIfind.vue' |
|
|
|
import { ref, computed, onMounted, watch, nextTick } from "vue"; |
|
|
|
import { setHeight } from "../utils/setHeight"; |
|
|
|
import { getReplyAPI } from "../api/AIxiaocaishen"; |
|
|
|
import AIchat from "../views/AIchat.vue"; |
|
|
|
import AIfind from "../views/AIfind.vue"; |
|
|
|
// 变量 |
|
|
|
// 将默认值改为从 sessionStorage 中获取,如果没有则使用默认值 'aifindCow'为第一个默认tab |
|
|
|
const activeTab = ref(sessionStorage.getItem('activeTabAI') || 'AIchat') |
|
|
|
const activeIndex = ref(parseInt(sessionStorage.getItem('activeIndexAI') || '0')) |
|
|
|
const activeTab = ref(sessionStorage.getItem("activeTabAI") || "AIchat"); |
|
|
|
const activeIndex = ref( |
|
|
|
parseInt(sessionStorage.getItem("activeIndexAI") || "0") |
|
|
|
); |
|
|
|
|
|
|
|
const tabs = computed(() => [ |
|
|
|
{ |
|
|
|
name: 'AIchat', |
|
|
|
label: 'AI对话' |
|
|
|
name: "AIchat", |
|
|
|
label: "AI对话", |
|
|
|
}, |
|
|
|
{ |
|
|
|
name: 'AIfind', |
|
|
|
label: '发现' |
|
|
|
} |
|
|
|
]) |
|
|
|
const setActiveTab = (tab, index) => { |
|
|
|
activeTab.value = tab |
|
|
|
activeIndex.value = index // 给索引值 |
|
|
|
// 存储当前选中的 tab 和 index 到 sessionStorage |
|
|
|
sessionStorage.setItem('activeTabAI', tab) |
|
|
|
sessionStorage.setItem('activeIndexAI', index.toString()) |
|
|
|
setHeight(document.getElementById('testId')) // 给父组件发送窗口高度 |
|
|
|
} |
|
|
|
// 跳转 |
|
|
|
name: "AIfind", |
|
|
|
label: "发现", |
|
|
|
}, |
|
|
|
]); |
|
|
|
|
|
|
|
// 修改 setActiveTab 方法,添加一个可选参数 forceAIchat |
|
|
|
const setActiveTab = (tab, index, forceAIchat = false) => { |
|
|
|
isAnnouncementVisible.value = false; |
|
|
|
if (forceAIchat && activeTab.value !== "AIchat") { |
|
|
|
activeTab.value = "AIchat"; |
|
|
|
activeIndex.value = 0; |
|
|
|
sessionStorage.setItem("activeTabAI", "AIchat"); |
|
|
|
sessionStorage.setItem("activeIndexAI", "0"); |
|
|
|
} else { |
|
|
|
activeTab.value = tab; |
|
|
|
activeIndex.value = index; |
|
|
|
sessionStorage.setItem("activeTabAI", tab); |
|
|
|
sessionStorage.setItem("activeIndexAI", index.toString()); |
|
|
|
} |
|
|
|
setHeight(document.getElementById("testId")); // 给父组件发送窗口高度 |
|
|
|
}; |
|
|
|
|
|
|
|
// 修改 activeComponent 的计算逻辑 |
|
|
|
const activeComponent = computed(() => { |
|
|
|
return activeTab.value === 'AIchat' ? AIchat : AIfind |
|
|
|
}) |
|
|
|
if (isAnnouncementVisible.value) { |
|
|
|
return Announcement; |
|
|
|
} |
|
|
|
return activeTab.value === "AIchat" ? AIchat : AIfind; |
|
|
|
}); |
|
|
|
|
|
|
|
// 新增一个方法,调用时先判断是否处于 AIchat,若不在则跳转到 AIchat |
|
|
|
const ensureAIchat = () => { |
|
|
|
setActiveTab("AIchat", 0, true); |
|
|
|
}; |
|
|
|
|
|
|
|
// 获取次数 |
|
|
|
const getCount = () => { |
|
|
|
console.log('获取次数') |
|
|
|
} |
|
|
|
console.log("获取次数"); |
|
|
|
}; |
|
|
|
|
|
|
|
// 深度思考 |
|
|
|
const isThinking = ref(false) |
|
|
|
const isThinking = ref(false); |
|
|
|
const toggleThink = () => { |
|
|
|
isThinking.value = !isThinking.value |
|
|
|
} |
|
|
|
isThinking.value = !isThinking.value; |
|
|
|
}; |
|
|
|
|
|
|
|
// 发送消息 |
|
|
|
const message = ref(''); |
|
|
|
const message = ref(""); |
|
|
|
// 传输对象 |
|
|
|
const messages = ref([]) |
|
|
|
const messages = ref([]); |
|
|
|
// 信息加载状态 |
|
|
|
const isLoading = ref(false) |
|
|
|
const isLoading = ref(false); |
|
|
|
// 在 sendMessage 方法中添加触发逻辑 |
|
|
|
const triggerFetch = ref(false) |
|
|
|
const triggerFetch = ref(false); |
|
|
|
|
|
|
|
// 添加用户消息 |
|
|
|
const updateMessage = (title) => { |
|
|
|
message.value = title; |
|
|
|
console.log("updateMessage 的值:", title); |
|
|
|
}; |
|
|
|
const sendMessage = async () => { |
|
|
|
if (!message.value) return |
|
|
|
if (isLoading.value) return |
|
|
|
// 调用 ensureAIchat 确保跳转到 AIchat 页面 |
|
|
|
ensureAIchat(); |
|
|
|
|
|
|
|
// 添加用户消息 |
|
|
|
if (!message.value) return; |
|
|
|
if (isLoading.value) return; |
|
|
|
|
|
|
|
const sendMessage = () => { |
|
|
|
// 处理发送消息的逻辑 |
|
|
|
|
|
|
|
console.log("sendMessage 的值:", message.value); |
|
|
|
messages.value.push({ content: message.value, sender: "user" }); |
|
|
|
}; |
|
|
|
messages.value.push({ |
|
|
|
sender: 'user', |
|
|
|
sender: "user", |
|
|
|
content: message.value, |
|
|
|
timestamp: new Date().toISOString() |
|
|
|
}) |
|
|
|
|
|
|
|
timestamp: new Date().toISOString(), |
|
|
|
}); |
|
|
|
|
|
|
|
// 重置消息输入框 |
|
|
|
message.value = '' |
|
|
|
|
|
|
|
} |
|
|
|
message.value = ""; |
|
|
|
}; |
|
|
|
|
|
|
|
// 公告 |
|
|
|
// 引入公告组件 |
|
|
|
import Announcement from "./Announcement.vue"; |
|
|
|
|
|
|
|
// 新增一个变量来控制是否显示公告页面 |
|
|
|
const isAnnouncementVisible = ref(false); |
|
|
|
|
|
|
|
const showAnnouncement = () => { |
|
|
|
console.log('打开公告') |
|
|
|
} |
|
|
|
console.log("打开公告"); |
|
|
|
isAnnouncementVisible.value = true; // 显示公告页面 |
|
|
|
}; |
|
|
|
|
|
|
|
// 点击剩余次数会弹出的弹窗 |
|
|
|
// 新增一个 ref 来控制弹窗的显示与隐藏 |
|
|
|
const dialogVisible = ref(false); |
|
|
|
// 获取次数 |
|
|
|
const showCount = () => { |
|
|
|
console.log('显示剩余次数') |
|
|
|
} |
|
|
|
console.log("显示剩余次数"); |
|
|
|
// 显示弹窗 |
|
|
|
dialogVisible.value = true; |
|
|
|
console.log("dialogVisible 的值:", dialogVisible.value); // 添加日志确认 |
|
|
|
}; |
|
|
|
|
|
|
|
// 保证发送消息时,滚动屏在底部 |
|
|
|
const tabContent = ref(null) |
|
|
|
watch(messages, async () => { |
|
|
|
await nextTick() |
|
|
|
const tabContent = ref(null); |
|
|
|
watch( |
|
|
|
messages, |
|
|
|
async () => { |
|
|
|
await nextTick(); |
|
|
|
if (tabContent.value) { |
|
|
|
tabContent.value.scrollTop = tabContent.value.scrollHeight |
|
|
|
tabContent.value.scrollTop = tabContent.value.scrollHeight; |
|
|
|
} |
|
|
|
}, { deep: true, immediate: true }) |
|
|
|
}, |
|
|
|
{ deep: true, immediate: true } |
|
|
|
); |
|
|
|
|
|
|
|
onMounted(() => { |
|
|
|
setHeight(document.getElementById('testId')) // 给父组件发送窗口高度 |
|
|
|
}) |
|
|
|
|
|
|
|
setHeight(document.getElementById("testId")); // 给父组件发送窗口高度 |
|
|
|
}); |
|
|
|
</script> |
|
|
|
|
|
|
|
<template> |
|
|
@ -100,33 +151,55 @@ onMounted(() => { |
|
|
|
<el-header class="homepage-head"> |
|
|
|
<!-- logo --> |
|
|
|
<div class="homepage-logo"> |
|
|
|
<img src="src\assets\img\homePage\logo.png" alt="图片加载失败" class="logo1"> |
|
|
|
<img src="src\assets\img\homePage\madeInHL.png" alt="图片加载失败" class="logo2"> |
|
|
|
<img |
|
|
|
src="src\assets\img\homePage\logo.png" |
|
|
|
alt="图片加载失败" |
|
|
|
class="logo1" |
|
|
|
/> |
|
|
|
<img |
|
|
|
src="src\assets\img\homePage\madeInHL.png" |
|
|
|
alt="图片加载失败" |
|
|
|
class="logo2" |
|
|
|
/> |
|
|
|
</div> |
|
|
|
|
|
|
|
<div class="homepage-right-group"> |
|
|
|
<div class="count-badge" @click="showCount"> |
|
|
|
<img src="src\assets\img\homePage\get-count-all.png" class="action-btn"> |
|
|
|
<img |
|
|
|
src="src\assets\img\homePage\get-count-all.png" |
|
|
|
class="action-btn" |
|
|
|
/> |
|
|
|
<div class="count-number">1000次</div> |
|
|
|
</div> |
|
|
|
<img src="src\assets\img\homePage\announcement.png" class="announcement-btn action-btn" |
|
|
|
@click="showAnnouncement"> |
|
|
|
<img |
|
|
|
src="src\assets\img\homePage\announcement.png" |
|
|
|
class="announcement-btn action-btn" |
|
|
|
@click="showAnnouncement" |
|
|
|
/> |
|
|
|
</div> |
|
|
|
|
|
|
|
</el-header> |
|
|
|
<!-- 主体部分:小人 问题轮询图 对话内容 --> |
|
|
|
<el-main class="homepage-body"> |
|
|
|
<div class="main-wrapper"> |
|
|
|
<section class="tab-section"> |
|
|
|
<div class="tab-container"> |
|
|
|
<div v-for="(tab, index) in tabs" :key="tab.name" @click="setActiveTab(tab.name, index)" |
|
|
|
:class="['tab-item', { active: activeIndex === index }]"> |
|
|
|
<div |
|
|
|
v-for="(tab, index) in tabs" |
|
|
|
:key="tab.name" |
|
|
|
@click="setActiveTab(tab.name, index)" |
|
|
|
:class="['tab-item', { active: activeIndex === index }]" |
|
|
|
> |
|
|
|
<span>{{ tab.label }}</span> |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
</section> |
|
|
|
<div class="tab-content" ref="tabContent"> |
|
|
|
<component :is="activeComponent" :messages="messages" /> |
|
|
|
<component |
|
|
|
:is="activeComponent" |
|
|
|
:messages="messages" |
|
|
|
@updateMessage="updateMessage" |
|
|
|
@sendMessage="sendMessage" |
|
|
|
/> |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
</el-main> |
|
|
@ -135,26 +208,77 @@ onMounted(() => { |
|
|
|
<!-- 第一行按钮 --> |
|
|
|
<div class="footer-first-line"> |
|
|
|
<div class="left-group"> |
|
|
|
<img v-if="isThinking" src="src\assets\img\homePage\tail\think-active.png" @click="toggleThink" |
|
|
|
class="action-btn"> |
|
|
|
<img v-else src="src\assets\img\homePage\tail\think-no-active.png" @click="toggleThink" |
|
|
|
class="action-btn"> |
|
|
|
<img src="src\assets\img\homePage\tail\language.png" @click="changeLanguage" class="action-btn"> |
|
|
|
<img src="src\assets\img\homePage\tail\voice.png" @click="toggleVoice" class="action-btn"> |
|
|
|
<img |
|
|
|
v-if="isThinking" |
|
|
|
src="src\assets\img\homePage\tail\think-active.png" |
|
|
|
@click="toggleThink" |
|
|
|
class="action-btn" |
|
|
|
/> |
|
|
|
<img |
|
|
|
v-else |
|
|
|
src="src\assets\img\homePage\tail\think-no-active.png" |
|
|
|
@click="toggleThink" |
|
|
|
class="action-btn" |
|
|
|
/> |
|
|
|
<img |
|
|
|
src="src\assets\img\homePage\tail\language.png" |
|
|
|
@click="changeLanguage" |
|
|
|
class="action-btn" |
|
|
|
/> |
|
|
|
<img |
|
|
|
src="src\assets\img\homePage\tail\voice.png" |
|
|
|
@click="toggleVoice" |
|
|
|
class="action-btn" |
|
|
|
/> |
|
|
|
</div> |
|
|
|
<img src="src\assets\img\homePage\tail\send.png" @click="sendMessage" class="action-btn send-btn"> |
|
|
|
<img |
|
|
|
src="src\assets\img\homePage\tail\send.png" |
|
|
|
@click="sendMessage" |
|
|
|
class="action-btn send-btn" |
|
|
|
/> |
|
|
|
</div> |
|
|
|
|
|
|
|
<!-- 第二行输入框 --> |
|
|
|
<div class="footer-second-line"> |
|
|
|
<img src="src\assets\img\homePage\tail\msg.png" class="msg-icon"> |
|
|
|
<el-input type="textarea" v-model="message" :autosize="{ minRows: 1, maxRows: 4 }" |
|
|
|
placeholder="给AI小财神发消息..." class="msg-input" |
|
|
|
@keydown.enter.exact.prevent="isLoading ? null : sendMessage()" resize="none"> |
|
|
|
<img src="src\assets\img\homePage\tail\msg.png" class="msg-icon" /> |
|
|
|
<el-input |
|
|
|
type="textarea" |
|
|
|
v-model="message" |
|
|
|
:autosize="{ minRows: 1, maxRows: 4 }" |
|
|
|
placeholder="给AI小财神发消息..." |
|
|
|
class="msg-input" |
|
|
|
@keydown.enter.exact.prevent="isLoading ? null : sendMessage()" |
|
|
|
resize="none" |
|
|
|
> |
|
|
|
</el-input> |
|
|
|
</div> |
|
|
|
</el-footer> |
|
|
|
</el-container> |
|
|
|
<!-- 弹窗 --> |
|
|
|
<!-- 新增弹窗组件 --> |
|
|
|
<el-dialog v-model="dialogVisible" width="500"> |
|
|
|
<!-- 自定义标题插槽,实现居中显示 --> |
|
|
|
<template #header> |
|
|
|
<div style="text-align: center"> |
|
|
|
<span>活动规则</span> |
|
|
|
</div> |
|
|
|
</template> |
|
|
|
<!-- 中间内容部分 --> |
|
|
|
<p> |
|
|
|
活动规则活动规则活动规则活动规则活动规则活动规则活动规则活动规则活动规则活动规则活动规则活动规则活动规则活动规则活动规则活动规则活动规则活动规则活动规则活动规则活动规则活动规则活动规则活动规则活动规则活动规则活动规则活动规则活动规则活动规则活动规则活动规则活动规则活动规则活动规则活动规则活动规则活动规则活动规则活动规则活动规则活动规则活动规则活动规则活动规则活动规则活动规则活动规则活动规则 |
|
|
|
</p> |
|
|
|
<template #footer> |
|
|
|
<!-- 添加一个div来包裹按钮,并设置样式使其居中 --> |
|
|
|
<div style="text-align: center"> |
|
|
|
<el-button |
|
|
|
style="background-color: orange; color: white; border: none" |
|
|
|
@click="dialogVisible = false" |
|
|
|
> |
|
|
|
去充值 |
|
|
|
</el-button> |
|
|
|
</div> |
|
|
|
</template> |
|
|
|
</el-dialog> |
|
|
|
</div> |
|
|
|
</template> |
|
|
|
|
|
|
@ -226,7 +350,6 @@ onMounted(() => { |
|
|
|
overflow: hidden; |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
.el-container .el-header { |
|
|
|
height: 10%; |
|
|
|
/* 设置头部高度 */ |
|
|
@ -356,7 +479,6 @@ onMounted(() => { |
|
|
|
height: auto; |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/* 尾部 */ |
|
|
|
.homepage-footer { |
|
|
|
display: flex; |
|
|
@ -429,7 +551,6 @@ onMounted(() => { |
|
|
|
box-shadow: 0 4px 12px rgba(89, 24, 241, 0.3) !important; |
|
|
|
} */ |
|
|
|
|
|
|
|
|
|
|
|
.msg-input { |
|
|
|
min-height: 34px; |
|
|
|
max-height: 120px; |
|
|
@ -445,7 +566,6 @@ onMounted(() => { |
|
|
|
/* 隐藏垂直滚动条 */ |
|
|
|
box-shadow: 0 4px 12px rgba(89, 24, 241, 0.3); |
|
|
|
background: #fff; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
.msg-input:focus { |
|
|
|