|
@@ -34,7 +34,26 @@
|
|
</div>
|
|
</div>
|
|
<!-- 使用 v-html 来渲染 Markdown 文本 -->
|
|
<!-- 使用 v-html 来渲染 Markdown 文本 -->
|
|
<div class="message-content">
|
|
<div class="message-content">
|
|
- <div
|
|
|
|
|
|
+ <!-- 添加文件预览区域 -->
|
|
|
|
+ <div class="message-files" v-if="message.files && message.files.length > 0">
|
|
|
|
+ <div
|
|
|
|
+ v-for="(file, index) in message.files"
|
|
|
|
+ :key="index"
|
|
|
|
+ class="message-file-item"
|
|
|
|
+ >
|
|
|
|
+ <img
|
|
|
|
+ v-if="file.type.startsWith('image/')"
|
|
|
|
+ :src="file.url"
|
|
|
|
+ class="message-image"
|
|
|
|
+ alt="uploaded image"
|
|
|
|
+ />
|
|
|
|
+ <div v-else class="message-document">
|
|
|
|
+ <i class="el-icon-document"></i>
|
|
|
|
+ <span>{{ file.name }}</span>
|
|
|
|
+ </div>
|
|
|
|
+ </div>
|
|
|
|
+ </div>
|
|
|
|
+ <div
|
|
class="message-text"
|
|
class="message-text"
|
|
v-html="renderMarkdown(message.message)"
|
|
v-html="renderMarkdown(message.message)"
|
|
@click="handleLinkClick"
|
|
@click="handleLinkClick"
|
|
@@ -43,7 +62,7 @@
|
|
</li>
|
|
</li>
|
|
</ul>
|
|
</ul>
|
|
</div>
|
|
</div>
|
|
- <!-- <div class="input-container">
|
|
|
|
|
|
+ <!-- <div class="input-container">
|
|
<textarea
|
|
<textarea
|
|
v-model="userInput"
|
|
v-model="userInput"
|
|
rows="4"
|
|
rows="4"
|
|
@@ -279,6 +298,7 @@ export default {
|
|
removeDocument(index) {
|
|
removeDocument(index) {
|
|
this.documents.splice(index, 1);
|
|
this.documents.splice(index, 1);
|
|
},
|
|
},
|
|
|
|
+
|
|
/* */
|
|
/* */
|
|
checkAIData() {
|
|
checkAIData() {
|
|
const aiData = localStorage.getItem("AIData");
|
|
const aiData = localStorage.getItem("AIData");
|
|
@@ -421,6 +441,20 @@ export default {
|
|
const documentUrls = this.documents.map((doc) => doc.url);
|
|
const documentUrls = this.documents.map((doc) => doc.url);
|
|
if (!message) return;
|
|
if (!message) return;
|
|
|
|
|
|
|
|
+ // 添加文件信息到消息中
|
|
|
|
+ const files = [
|
|
|
|
+ ...this.uploadFiles.map(file => ({
|
|
|
|
+ type: file.type,
|
|
|
|
+ url: file.url,
|
|
|
|
+ name: file.name
|
|
|
|
+ })),
|
|
|
|
+ ...this.documents.map(doc => ({
|
|
|
|
+ type: 'document',
|
|
|
|
+ url: doc.url,
|
|
|
|
+ name: doc.name
|
|
|
|
+ }))
|
|
|
|
+ ];
|
|
|
|
+
|
|
// 添加用户消息
|
|
// 添加用户消息
|
|
this.messages.push({
|
|
this.messages.push({
|
|
time: Date.now(),
|
|
time: Date.now(),
|
|
@@ -428,6 +462,7 @@ export default {
|
|
messageType: "TEXT",
|
|
messageType: "TEXT",
|
|
user: "user",
|
|
user: "user",
|
|
done: true,
|
|
done: true,
|
|
|
|
+ files: files // 添加文件数组
|
|
});
|
|
});
|
|
this.userInput = "";
|
|
this.userInput = "";
|
|
this.uploadFiles = [];
|
|
this.uploadFiles = [];
|
|
@@ -479,7 +514,6 @@ export default {
|
|
const idObject = { ids: this.idArray };
|
|
const idObject = { ids: this.idArray };
|
|
await this.getMinioUrls(idObject);
|
|
await this.getMinioUrls(idObject);
|
|
}
|
|
}
|
|
- // 如果有音频,播放音频
|
|
|
|
if (
|
|
if (
|
|
response.data.data.audio_info &&
|
|
response.data.data.audio_info &&
|
|
response.data.data.audio_info.audio
|
|
response.data.data.audio_info.audio
|
|
@@ -505,7 +539,7 @@ export default {
|
|
console.log("Sending to backend:", JSON.stringify(idObject));
|
|
console.log("Sending to backend:", JSON.stringify(idObject));
|
|
|
|
|
|
const response = await axios.post(
|
|
const response = await axios.post(
|
|
- `${process.env.VUE_APP_BASE_AI_API}/milvus/getMinioURl`,
|
|
|
|
|
|
+ `${process.env.VUE_APP_BASE_API}/milvus/getMinioURl`,
|
|
idObject,
|
|
idObject,
|
|
{
|
|
{
|
|
headers: {
|
|
headers: {
|
|
@@ -637,7 +671,7 @@ export default {
|
|
|
|
|
|
const renderedHtml = md.render(rawMarkdown);
|
|
const renderedHtml = md.render(rawMarkdown);
|
|
|
|
|
|
- // 使用 setTimeout 来确保 DOM 更新后再添加事件监听器
|
|
|
|
|
|
+ // 使用 setTimeout ���确保 DOM 更新后再添加事件监听器
|
|
setTimeout(() => {
|
|
setTimeout(() => {
|
|
const links = document.querySelectorAll(".custom-link");
|
|
const links = document.querySelectorAll(".custom-link");
|
|
links.forEach((link) => {
|
|
links.forEach((link) => {
|
|
@@ -1002,7 +1036,8 @@ export default {
|
|
max-width: 800px; /* 设置最大宽度 */
|
|
max-width: 800px; /* 设置最大宽度 */
|
|
display: flex;
|
|
display: flex;
|
|
justify-content: space-between;
|
|
justify-content: space-between;
|
|
- align-items: center;
|
|
|
|
|
|
+ align-items: flex-start;
|
|
|
|
+ flex-direction: column;
|
|
padding: 10px;
|
|
padding: 10px;
|
|
background: #fdfdfd;
|
|
background: #fdfdfd;
|
|
border-radius: 10px;
|
|
border-radius: 10px;
|
|
@@ -1176,4 +1211,46 @@ textarea {
|
|
text-overflow: ellipsis;
|
|
text-overflow: ellipsis;
|
|
white-space: nowrap;
|
|
white-space: nowrap;
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+.message-files {
|
|
|
|
+ display: flex;
|
|
|
|
+ flex-wrap: wrap;
|
|
|
|
+ gap: 8px;
|
|
|
|
+ margin-bottom: 8px;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+.message-file-item {
|
|
|
|
+ max-width: 200px;
|
|
|
|
+ border-radius: 4px;
|
|
|
|
+ overflow: hidden;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+.message-image {
|
|
|
|
+ width: 100%;
|
|
|
|
+ height: auto;
|
|
|
|
+ max-height: 200px;
|
|
|
|
+ object-fit: cover;
|
|
|
|
+ border-radius: 4px;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+.message-document {
|
|
|
|
+ display: flex;
|
|
|
|
+ align-items: center;
|
|
|
|
+ padding: 8px;
|
|
|
|
+ background-color: #f5f5f5;
|
|
|
|
+ border: 1px solid #e0e0e0;
|
|
|
|
+ border-radius: 4px;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+.message-document i {
|
|
|
|
+ font-size: 20px;
|
|
|
|
+ color: #666;
|
|
|
|
+ margin-right: 8px;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+.message-document span {
|
|
|
|
+ font-size: 14px;
|
|
|
|
+ color: #333;
|
|
|
|
+ word-break: break-all;
|
|
|
|
+}
|
|
</style>
|
|
</style>
|