feat: 对话显示sketch
This commit is contained in:
@@ -20,7 +20,7 @@
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { ref, reactive, computed, onUnmounted, onMounted, nextTick } from 'vue'
|
||||
import { ref, reactive, computed, onUnmounted, onMounted, nextTick,watch } from 'vue'
|
||||
import List from './List.vue'
|
||||
import Input from '../../components/Input.vue'
|
||||
import { fetchAgentReply } from '@/api/agent'
|
||||
@@ -31,6 +31,8 @@
|
||||
const userStore = useUserInfoStore()
|
||||
const agentStore = useAgentStore()
|
||||
const projectStore = useProjectStore()
|
||||
|
||||
const emits = defineEmits(['update:sketchList'])
|
||||
const props = withDefaults(
|
||||
defineProps<{
|
||||
title: string
|
||||
@@ -41,6 +43,7 @@
|
||||
)
|
||||
|
||||
const messageList = ref([])
|
||||
|
||||
const listRef = ref()
|
||||
const isGenerating = ref(false)
|
||||
const isPaused = ref(false) // 标记是否为主动暂停
|
||||
@@ -58,6 +61,13 @@
|
||||
imageUrlList: []
|
||||
})
|
||||
|
||||
const sketchList = ref([])
|
||||
watch(sketchList, (newVal) => {
|
||||
console.log('添加图片链接--------');
|
||||
|
||||
emits('update:sketchList', newVal)
|
||||
}, { deep: true })
|
||||
|
||||
// 每次请求时创建新的 AbortController
|
||||
let abort: AbortController
|
||||
|
||||
@@ -97,10 +107,13 @@
|
||||
}
|
||||
})
|
||||
|
||||
const handleSendMessage = async (message: {
|
||||
const handleSendMessage = async (
|
||||
message: {
|
||||
text: string
|
||||
images: Array<{ url: string; name: string }>
|
||||
}, skipUserMessage = false) => {
|
||||
},
|
||||
skipUserMessage = false
|
||||
) => {
|
||||
console.log('Message sent:', message)
|
||||
isPaused.value = false
|
||||
isGenerating.value = true
|
||||
@@ -197,6 +210,7 @@
|
||||
console.log('传输结束 end---', contentBody)
|
||||
aiMessage.streaming = false
|
||||
aiMessage.loading = false
|
||||
isGenerating.value = false
|
||||
flag = false
|
||||
break
|
||||
}
|
||||
@@ -217,12 +231,21 @@
|
||||
isNodeIdEvent = true
|
||||
// continue
|
||||
}
|
||||
console.log('event', event)
|
||||
if (event.includes('error')) {
|
||||
aiMessage.text = '出现错误,请重试'
|
||||
aiMessage.streaming = false
|
||||
aiMessage.loading = false
|
||||
isGenerating.value = false
|
||||
flag = false
|
||||
break
|
||||
}
|
||||
|
||||
const dataLines = event
|
||||
.split(/\n/)
|
||||
.filter((line) => line.startsWith('data:'))
|
||||
.map((line) => line.replace(/^data:\s*/, '').trim())
|
||||
console.log('dataLInes', dataLines)
|
||||
// console.log('dataLInes', dataLines)
|
||||
if (isNodeIdEvent) {
|
||||
params.versionID = dataLines[0]
|
||||
}
|
||||
@@ -232,10 +255,14 @@
|
||||
|
||||
try {
|
||||
const jsonData = JSON.parse(jsonText)
|
||||
console.log('jsonData', jsonData);
|
||||
|
||||
// 赋值 project_id 和 version_id
|
||||
if (jsonData.project_id) params.projectID = jsonData.project_id
|
||||
if (jsonData.version_id) params.versionID = jsonData.version_id
|
||||
// if (jsonData.project_id) params.projectID = jsonData.project_id
|
||||
// if (jsonData.version_id) params.versionID = jsonData.version_id
|
||||
if (jsonData.image_url) {
|
||||
sketchList.value.push(jsonData.image_url)
|
||||
}
|
||||
if (
|
||||
jsonData.content &&
|
||||
jsonData.content.length > 0 &&
|
||||
@@ -243,6 +270,7 @@
|
||||
) {
|
||||
contentBody += jsonData.content
|
||||
aiMessage.text = contentBody
|
||||
aiMessage.loading = false
|
||||
}
|
||||
if (jsonData.type === 'end') {
|
||||
aiMessage.streaming = false
|
||||
|
||||
@@ -4,13 +4,21 @@
|
||||
:class="type === 'sketch' ? 'sketch-preview' : 'report-preview'"
|
||||
>
|
||||
<template v-if="type === 'sketch'">
|
||||
<div class="sketch-item" v-for="item in 12">
|
||||
<div
|
||||
class="sketch-item"
|
||||
v-for="(item, index) in sketchList"
|
||||
:key="'sketch-item-' + index"
|
||||
>
|
||||
<Menu class="menu-btn" @click="handleClickMenu" />
|
||||
<div class="edit-btn flex align-center space-between" @click="handleClickEdit">
|
||||
<div>Edit</div>
|
||||
<img src="@/assets/images/arrow-top-right.png" alt="" />
|
||||
<img src="@/assets/images/arrow-top-right.png" />
|
||||
</div>
|
||||
<img :src="LoadingImg" alt="" />
|
||||
<img
|
||||
:src="getImageSrc(item, index)"
|
||||
:alt="'sketch-' + index"
|
||||
@load="handleImageLoad(index)"
|
||||
/>
|
||||
</div>
|
||||
</template>
|
||||
<div v-else class="reportBorder">
|
||||
@@ -107,26 +115,39 @@
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { ref } from 'vue'
|
||||
import { ref, reactive } from 'vue'
|
||||
import Menu from './Menu.vue'
|
||||
import LoadingImg from '@/assets/images/sketch-loading.gif'
|
||||
import reportNull from '@/assets/images/reportNull.png'
|
||||
|
||||
// 存储每个图片的加载状态
|
||||
const loadedStatus = reactive<Record<number, boolean>>({})
|
||||
|
||||
const props = withDefaults(
|
||||
defineProps<{
|
||||
type: 'sketch' | 'report'
|
||||
sketchList: Array<string>
|
||||
}>(),
|
||||
{
|
||||
type: 'sketch'
|
||||
type: 'sketch',
|
||||
sketchList: []
|
||||
}
|
||||
)
|
||||
|
||||
// 图片加载完成时触发
|
||||
const handleImageLoad = (index: number) => {
|
||||
loadedStatus[index] = true
|
||||
}
|
||||
|
||||
// 获取当前显示的图片源
|
||||
const getImageSrc = (item: string, index: number) => {
|
||||
return loadedStatus[index] ? item : LoadingImg
|
||||
}
|
||||
|
||||
const handleClickEdit = () => {
|
||||
// 编辑按钮点击逻辑
|
||||
@@ -136,8 +157,6 @@
|
||||
// 菜单按钮点击逻辑
|
||||
console.log('Menu button clicked')
|
||||
}
|
||||
|
||||
|
||||
</script>
|
||||
|
||||
<style lang="less" scoped>
|
||||
@@ -190,7 +209,11 @@
|
||||
&::before {
|
||||
content: '';
|
||||
position: absolute;
|
||||
background: linear-gradient(119.03deg, rgba(233, 121, 60, 0.3) 1.61%, rgba(255, 207, 144, 0.3) 101.01%);
|
||||
background: linear-gradient(
|
||||
119.03deg,
|
||||
rgba(233, 121, 60, 0.3) 1.61%,
|
||||
rgba(255, 207, 144, 0.3) 101.01%
|
||||
);
|
||||
border-radius: 2.3rem;
|
||||
z-index: -1;
|
||||
width: 100%;
|
||||
@@ -229,7 +252,7 @@
|
||||
color: #fff;
|
||||
cursor: pointer;
|
||||
.icon {
|
||||
margin-right: .02rem;
|
||||
margin-right: 0.02rem;
|
||||
}
|
||||
span {
|
||||
font-weight: 500;
|
||||
|
||||
@@ -1,14 +1,12 @@
|
||||
<template>
|
||||
<div class="agent-wrapper flex space-between">
|
||||
<div class="openVersionTree">
|
||||
<div class="btn" @click="versionTreeData.drawer = true">
|
||||
Version Tree
|
||||
</div>
|
||||
<div class="btn" @click="versionTreeData.drawer = true">Version Tree</div>
|
||||
</div>
|
||||
<div class="content-wrapper">
|
||||
<Agent :title="agentTitle" />
|
||||
<Agent :title="agentTitle" @update:sketchList="updateSketchList" />
|
||||
<div class="preview-wrapper">
|
||||
<Preview :type="previewType" />
|
||||
<Preview :type="previewType" :sketchList="sketchList" />
|
||||
</div>
|
||||
</div>
|
||||
<VersionTreeIndex v-model:versionTreeData="versionTreeData" />
|
||||
@@ -22,7 +20,13 @@
|
||||
import VersionTreeIndex from './components/versionTree/index.vue'
|
||||
|
||||
const agentTitle = ref('Retro Sofa Sketch')
|
||||
const previewType = ref<'sketch' | 'report'>('report')
|
||||
const previewType = ref<'sketch' | 'report'>('sketch')
|
||||
|
||||
const sketchList = ref([])
|
||||
const updateSketchList = (newVal) => {
|
||||
console.log('newVal', newVal)
|
||||
sketchList.value = newVal
|
||||
}
|
||||
|
||||
const versionTreeData = ref({
|
||||
drawer: false,
|
||||
@@ -57,7 +61,11 @@
|
||||
content: '';
|
||||
position: absolute;
|
||||
inset: -1px;
|
||||
background: linear-gradient(119.03deg, rgba(233, 121, 60, 0.8) 1.61%, rgba(255, 207, 144, 0.8) 101.01%);
|
||||
background: linear-gradient(
|
||||
119.03deg,
|
||||
rgba(233, 121, 60, 0.8) 1.61%,
|
||||
rgba(255, 207, 144, 0.8) 101.01%
|
||||
);
|
||||
border-radius: 2.2rem;
|
||||
z-index: -1;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user