feat: assistant
This commit is contained in:
@@ -1,43 +1,103 @@
|
||||
<template>
|
||||
<div class="list-wrapper flex flex-col">
|
||||
<div class="greeting list-item flex">
|
||||
<div class="thumb">
|
||||
<img src="@/assets/images/assistant-head.png" class="assistant-head" />
|
||||
</div>
|
||||
<div class="list-item-content-text">
|
||||
{{$t('Assistant.greeting')}}
|
||||
</div>
|
||||
</div>
|
||||
<div
|
||||
class="list-item flex align-center"
|
||||
v-for="item in props.messageList"
|
||||
class="list-item flex"
|
||||
v-for="(item, index) in props.messageList"
|
||||
:key="item.id"
|
||||
:class="item.role"
|
||||
>
|
||||
<div class="thumb">
|
||||
<img
|
||||
v-show="index > 0"
|
||||
src="@/assets/images/assistant-head.png"
|
||||
class="assistant-head"
|
||||
/>
|
||||
</div>
|
||||
<div class="list-item-content-text">{{ item.content }}</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
<script setup lang="ts">
|
||||
import { VueMarkdown } from '@crazydos/vue-markdown'
|
||||
import type { CustomAttrs } from '@crazydos/vue-markdown'
|
||||
import rehypeRaw from 'rehype-raw'
|
||||
const customAttrs: CustomAttrs = {
|
||||
img: {
|
||||
style: 'max-width: 100%;'
|
||||
},
|
||||
a: (node, combinedAttrs) => {
|
||||
if (typeof node.properties.href === 'string') {
|
||||
return { target: '_blank', rel: 'noopener noreferrer' }
|
||||
} else {
|
||||
return {}
|
||||
}
|
||||
},
|
||||
heading: {
|
||||
style: {
|
||||
fontFamily: 'SemiBold',
|
||||
lineHeight: 2
|
||||
// fontSize: '1.4rem'
|
||||
}
|
||||
},
|
||||
p: {
|
||||
style: {
|
||||
fontSize: '1rem',
|
||||
lineHeight: 1.5
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
const props = defineProps<{
|
||||
messageList: Array<any>
|
||||
}>()
|
||||
</script>
|
||||
<style lang="less" scoped>
|
||||
.list-wrapper {
|
||||
row-gap: 1.6rem;
|
||||
row-gap: 1.2rem;
|
||||
.list-item {
|
||||
min-height: 3.86rem;
|
||||
width: fit-content;
|
||||
&.user {
|
||||
width: 26.2rem;
|
||||
align-self: end;
|
||||
column-gap: 1rem;
|
||||
white-space: pre-line;
|
||||
&.greeting {
|
||||
color: #d58c4d;
|
||||
font-family: 'Regular';
|
||||
}
|
||||
.thumb {
|
||||
width: 4rem;
|
||||
height: 4rem;
|
||||
.assistant-head {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
}
|
||||
}
|
||||
.list-item-content-text {
|
||||
min-height: 3.86rem;
|
||||
width: fit-content;
|
||||
// &.user {
|
||||
// width: 26.2rem;
|
||||
// align-self: end;
|
||||
// }
|
||||
font-size: 1.4rem;
|
||||
font-family: 'Regular';
|
||||
color: #333;
|
||||
padding: 1.1rem 1.7rem;
|
||||
background: linear-gradient(#fffcf4, #fffcf4) padding-box,
|
||||
linear-gradient(
|
||||
119.03deg,
|
||||
rgba(233, 121, 60, 0.3) 1.61%,
|
||||
rgba(255, 207, 144, 0.3) 101.01%
|
||||
)
|
||||
border-box;
|
||||
border: 1px solid transparent;
|
||||
border-radius: 0.8rem;
|
||||
}
|
||||
font-size: 1.4rem;
|
||||
font-family: 'Regular';
|
||||
color: #333;
|
||||
padding: 1.1rem 1.7rem;
|
||||
background: linear-gradient(#fffcf4, #fffcf4) padding-box,
|
||||
linear-gradient(
|
||||
119.03deg,
|
||||
rgba(233, 121, 60, 0.3) 1.61%,
|
||||
rgba(255, 207, 144, 0.3) 101.01%
|
||||
)
|
||||
border-box;
|
||||
border: 1px solid transparent;
|
||||
border-radius: 3.18rem;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
||||
@@ -62,7 +62,7 @@
|
||||
<threeModel :currentData="currentData" />
|
||||
</template>
|
||||
</baseModal>
|
||||
<!-- <Assistant /> -->
|
||||
<Assistant />
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
@@ -110,7 +110,7 @@
|
||||
const vueFlow = ref<any>()
|
||||
const nodeTypes = ref([NODE_TYPE.INPUT, NODE_TYPE.SECONDARY, NODE_TYPE.OUTPUT, NODE_TYPE.ALONE])
|
||||
// 状态管理器
|
||||
const stateManager = new StateManager({ vueFlow,sketchId:props.config.imgId })
|
||||
const stateManager = new StateManager({ vueFlow, sketchId: props.config.imgId })
|
||||
provide('stateManager', stateManager)
|
||||
|
||||
// 事件管理器
|
||||
@@ -197,25 +197,30 @@
|
||||
const downloadData = ref<any>({
|
||||
amount: 0,
|
||||
progress: 0,
|
||||
status: 'success',//success
|
||||
status: 'success' //success
|
||||
})
|
||||
const exportFlow = async () => {
|
||||
// console.log(vueFlow.value)
|
||||
// console.log(vueFlow.value.toImage)
|
||||
let arr = stateManager.nodes.value.filter((v) => v.data.type === NODE_COMPONENT.RESULT_IMAGE)
|
||||
let arr = stateManager.nodes.value.filter(
|
||||
(v) => v.data.type === NODE_COMPONENT.RESULT_IMAGE
|
||||
)
|
||||
let imgList = []
|
||||
arr.forEach((v,i) => {
|
||||
v.data.data.imageProcessTasks.forEach((item,index) => {
|
||||
arr.forEach((v, i) => {
|
||||
v.data.data.imageProcessTasks.forEach((item, index) => {
|
||||
let url = item.url
|
||||
let name = url?.split(".").pop().split("?").shift();
|
||||
imgList.push({url:url,name:`${v.data.type}${i}-${index == 0?'':index}.${name}`})
|
||||
let name = url?.split('.').pop().split('?').shift()
|
||||
imgList.push({
|
||||
url: url,
|
||||
name: `${v.data.type}${i}-${index == 0 ? '' : index}.${name}`
|
||||
})
|
||||
})
|
||||
})
|
||||
downloadData.value.amount = imgList.length
|
||||
downloadData.value.status = 'loading'
|
||||
await downImgListToZip(imgList,(progress)=>{
|
||||
await downImgListToZip(imgList, (progress) => {
|
||||
downloadData.value.progress = progress
|
||||
if(progress == downloadData.value.amount){
|
||||
if (progress == downloadData.value.amount) {
|
||||
downloadData.value.status = 'success'
|
||||
}
|
||||
})
|
||||
|
||||
Reference in New Issue
Block a user