云端文件下载

This commit is contained in:
2026-06-25 17:48:58 +08:00
parent d284789240
commit 488bebcc87
30 changed files with 5442 additions and 426 deletions

View File

@@ -70,6 +70,9 @@
<view class="head-btn" @click="goWorkSpace">
<view class="iconfont icon-wenjianjia"></view>
</view>
<view class="head-btn" @click="goCloudDatabase">
<view class="iconfont icon-cloud"></view>
</view>
<view class="head-btn log-out" @click="logOut">
<view class="iconfont icon-tuichu"></view>
</view>
@@ -80,24 +83,46 @@
<scroll-view class="chat-messages" direction="vertical" scroll-y :scroll-into-view="scrollToView"
@scrolltoupper="loadMoreMessages" :upper-threshold="0" :scroll-with-animation="true"
@scroll="onScroll">
<!-- 与AI的对话内容展示 -->
<view v-if="ChatType === 0" class="chat-message" v-for="(message, index) in currentMessages"
:key="index" :id="'msg-' + index" :class="{'message-user':message.role==='user'}">
<view v-if="message.role ==='user'" class="chat-avatar"
<!-- 与AI的对话内容展示 -->
<view v-if="ChatType === 0" class="chat-message" v-for="(message, index) in currentMessages"
:key="index" :id="'msg-' + index" :class="{'message-user':message.role==='user'}">
<!-- <view class="chat-avatar" :class="{'chat-avatar-user':message.role==='user'}">
<image v-if="message.role === 'user' && UserData?.avatar" :src="UserData.avatar"
class="friend-avatar" mode="aspectFill"></image>
<view v-else-if="message.role === 'assistant'" class="iconfont icon-Robot"></view>
<view v-else class="iconfont icon-yonghuziliao"></view>
</view> -->
<view v-if="message.role ==='user'" class="chat-avatar"
:class="{'chat-avatar-user':message.role==='user'}">
<image v-if="message.role === 'user' && UserData?.avatar" :src="UserData.avatar"
class="friend-avatar" mode="aspectFill"></image>
<view v-else class="iconfont icon-yonghuziliao"></view>
<!-- <view v-if="message.role ==='assistant'" class="iconfont icon-Robot"></view> -->
<!-- <view v-if="message.role ==='user'" class="iconfont icon-yonghuziliao"></view> -->
</view>
<view class="chat-content" :class="{'chat-content-user':message.role==='user'}"
v-if="message.content && String(message.content).trim() !== ''">
<!-- <view><rich-text :nodes="pareseMarkdown(message.content)"></rich-text></view> -->
<view v-html="pareseMarkdown(message.content)"></view>
<!-- <mp-html :content="pareseMarkdown(message.content)" /> -->
</view>
<view class="chat-content" :class="{'chat-content-user':message.role==='user'}"
v-if="message.content && String(message.content).trim() !== ''">
<!-- 文本内容 -->
<view v-if="parseFileInfo(message.content).textContent"
v-html="pareseMarkdown(parseFileInfo(message.content).textContent)"></view>
<!-- 文件卡片列表 -->
<view v-if="parseFileInfo(message.content).files.length > 0" class="message-file-list">
<view v-for="(file, idx) in parseFileInfo(message.content).files" :key="idx" class="file-item">
<!-- 图片jpg/png/gif/webp -->
<image
v-if="['jpg','jpeg','png','gif','webp','bmp'].includes(file.extendName.toLowerCase())"
:src="file.url" mode="widthFix" class="message-image"
@click="previewImage(file.url)"></image>
<!-- 普通文件doc/xlsx/zip/pdf -->
<view v-else class="message-file" @click="openFile(file.url)">
<view class="file-icon">📄</view>
<view class="file-name">{{ file.name }}</view>
<view class="file-size">{{ formatFileSize(file.fileSize) }}</view>
</view>
</view>
</view>
</view>
</view>
<!-- 与好友的对话内容展示 -->
<view v-if="ChatType === 1" class="chat-message" v-for="(message, index) in currentMessages"
:key="index" :id="'msg-' + index" :class="{'message-user':message.sender === UserId}">
@@ -417,6 +442,22 @@
return size.toFixed(2) + 'MB'
}
// 从消息 content 中提取文件信息
// 格式: [文件信息:[{...}]]
const parseFileInfo = (content) => {
if (!content || typeof content !== 'string') return { textContent: content || '', files: [] }
const match = content.match(/\[文件信息:(\[.*?\])\]/)
if (!match) return { textContent: content, files: [] }
try {
const files = JSON.parse(match[1])
const textContent = content.replace(match[0], '').trim()
return { textContent, files }
} catch (e) {
console.error('解析文件信息失败:', e)
return { textContent: content, files: [] }
}
}
@@ -483,6 +524,17 @@
url: '/pages/WorkSpace/WorkSpace'
})
}
// 跳转到云端数据库
const goCloudDatabase = () => {
// 保存当前会话id确保从工作区返回时能恢复
if (currentSessionId.value) {
uni.setStorageSync('currentSessionId', currentSessionId.value)
}
uni.navigateTo({
url: '/pages/CloudDatabase/CloudDatabase'
})
}
const logOut = () => {
uni.reLaunch({
@@ -821,7 +873,7 @@
userToken.value = getToken();
console.log("token:", userToken.value);
UserConversations.value = await getUserConversations(userToken.value) || [];
console.log("UserConversations:", UserConversations.value);
// console.log("UserConversations:", JSON.stringify(UserConversations.value) );
// 优先恢复已保存的会话id避免刷新到列表第一个
const savedSessionId = getCurrentSessionId();
if (savedSessionId && UserConversations.value.some(c => c._id === savedSessionId)) {
@@ -964,7 +1016,7 @@
const takeConversationMessages = async () => {
try {
allmessages.value = await getConversationMessages(userToken.value, currentSessionId.value) || [];
// console.log("AI消息", allmessages.value);
// console.log("AI消息", JSON.stringify(allmessages.value) );
// currentMessages.value = allmessages.value.slice(-pageInfoNumber);
// 数据获取后执行滚动
scrollToBottom();