云端文件下载
This commit is contained in:
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user