Merge branch 'main' of ssh://18.167.251.121:10002/aidlab/lanecarford_front
All checks were successful
git提交控制 AiDA WEB-Node.js main 分支构建部署 / build (20.19.0) (push) Has been skipped
All checks were successful
git提交控制 AiDA WEB-Node.js main 分支构建部署 / build (20.19.0) (push) Has been skipped
This commit is contained in:
@@ -40,6 +40,10 @@
|
||||
navLst.forEach((v) => {
|
||||
if (v.flowType === query.value.flowType) navActive.value = v.value
|
||||
})
|
||||
navLst.forEach((v) => {
|
||||
if (v.flowType === query.value.active) navActive.value = v.value
|
||||
})
|
||||
|
||||
const clickNav = (v) => {
|
||||
if (v.value === navActive.value || loading.value) return
|
||||
navActive.value = v.value
|
||||
|
||||
@@ -3,21 +3,21 @@
|
||||
import { ref, onMounted, computed } from 'vue'
|
||||
import {
|
||||
generateTryOnEffect,
|
||||
generateTryOnEffectDemo,
|
||||
setTryOnEffectFavorite,
|
||||
cancelTryOnEffectFavorite
|
||||
} from '@/api/workshop'
|
||||
const emit = defineEmits(['viewType'])
|
||||
import { useRouter, useRoute } from 'vue-router'
|
||||
import { useGenerateStore } from '@/stores'
|
||||
import { useGenerateStore, useHGenerateStore } from '@/stores'
|
||||
import { FlowType, IsHistoryFlow } from '@/types/enum'
|
||||
const generateStore = useGenerateStore()
|
||||
const hGenerateStore = useHGenerateStore()
|
||||
const router = useRouter()
|
||||
const route = useRoute()
|
||||
const query = computed(() => route.query)
|
||||
const isHistoryFlow = computed(() => IsHistoryFlow(query.value.flowType))
|
||||
const customizeInfo = isHistoryFlow.value
|
||||
? generateStore.customizeInfoDemo
|
||||
? hGenerateStore.customizeInfo
|
||||
: generateStore.customizeInfo
|
||||
const loading = ref(false)
|
||||
const onSend = () => {
|
||||
@@ -53,7 +53,7 @@
|
||||
}
|
||||
if (isHistoryFlow.value) {
|
||||
data['originalTryOnId'] =
|
||||
type === 'reload' ? customizeInfo.oldTryOnId : generateStore.customizeInfoDemo.tryOnId
|
||||
type === 'reload' ? customizeInfo.oldTryOnId : hGenerateStore.originalTryOnId
|
||||
} else {
|
||||
data['styleId'] = generateStore.styleId
|
||||
data['originalTryOnId'] =
|
||||
@@ -62,7 +62,7 @@
|
||||
generateTryOnEffect(data)
|
||||
.then((res: any) => {
|
||||
customizeInfo.count++
|
||||
customizeInfo.tryOnId = res.tryOnId
|
||||
customizeInfo.tryOnId = res.id
|
||||
customizeInfo.tryOnUrl = res.tryOnUrl
|
||||
customizeInfo.styleUrl = res.styleUrl
|
||||
customizeInfo.isRegenerated = res.isRegenerated
|
||||
@@ -102,7 +102,11 @@
|
||||
}
|
||||
const onFinish = () => {
|
||||
// router.push({ name: 'creation', query: query.value })
|
||||
router.push({ name: 'creation', query: { flowType: FlowType.H_AI } })
|
||||
const query_ = {
|
||||
...query.value,
|
||||
active: FlowType.H_AI
|
||||
}
|
||||
router.push({ name: 'creation', query: query_ })
|
||||
// if (isHistoryFlow.value) {
|
||||
// router.push({ name: 'end' })
|
||||
// } else {
|
||||
@@ -280,7 +284,7 @@
|
||||
}
|
||||
> .btns {
|
||||
margin-top: 4rem;
|
||||
width: 68%;
|
||||
min-width: 68%;
|
||||
display: flex;
|
||||
// justify-content: center;
|
||||
justify-content: space-between;
|
||||
|
||||
@@ -6,8 +6,8 @@ const route = useRoute()
|
||||
import { showConfirmDialog } from 'vant'
|
||||
import MyEvent from '@/utils/myEvent'
|
||||
import { FlowType, IsHistoryFlow } from '@/types/enum'
|
||||
import { useGenerateStore } from '@/stores'
|
||||
const generateStore = useGenerateStore()
|
||||
import { useHGenerateStore } from '@/stores'
|
||||
const hGenerateStore = useHGenerateStore()
|
||||
|
||||
|
||||
//const props = defineProps({
|
||||
@@ -66,13 +66,22 @@ onMounted(()=>{
|
||||
path: 'uploadFace',
|
||||
imgPath: new URL('@/assets/images/nav3.png',import.meta.url).href,
|
||||
flowTypeList: [FlowType.H_TRYON,FlowType.H_AI],
|
||||
click(){
|
||||
hGenerateStore.clearCustomizeInfo()
|
||||
},
|
||||
},
|
||||
{
|
||||
path: 'customize',
|
||||
imgPath: new URL('@/assets/images/nav4.png',import.meta.url).href,
|
||||
flowTypeList: [FlowType.H_TRYON,FlowType.H_AI],
|
||||
click(){
|
||||
generateStore.updatePhotoInfo({})
|
||||
hGenerateStore.clearCustomizeInfo()
|
||||
hGenerateStore.uploadCustomizeInfo({
|
||||
tryOnId: hGenerateStore.originalTryOn.id,
|
||||
tryOnUrl: hGenerateStore.originalTryOn.tryOnUrl,
|
||||
isFavorite: hGenerateStore.originalTryOn.isLike,
|
||||
styleUrl: hGenerateStore.style.url,
|
||||
})
|
||||
},
|
||||
},
|
||||
]
|
||||
|
||||
@@ -61,7 +61,7 @@ const startGenerate = ()=>{
|
||||
generateTryOnEffect(value).then((res:any)=>{
|
||||
data.isLoading = false;
|
||||
generateStore.originalTryOn.isLike = false
|
||||
generateStore.originalTryOn.id = res.tryOnId
|
||||
generateStore.originalTryOn.id = res.id
|
||||
generateStore.originalTryOn.tryOnUrl = res.tryOnUrl
|
||||
// generateStore.useStyleGenerate()//生成后需要对选择衣服页面设置不可选中样式
|
||||
generateStore.setIsGenerate(false)
|
||||
|
||||
@@ -2,9 +2,10 @@
|
||||
import { ref, reactive, onMounted, computed } from 'vue'
|
||||
import { useRouter, useRoute } from 'vue-router'
|
||||
import { uploadCustomerPhoto } from '@/api/workshop'
|
||||
import { useGenerateStore } from '@/stores'
|
||||
import { useGenerateStore, useHGenerateStore } from '@/stores'
|
||||
import { IsHistoryFlow } from '@/types/enum'
|
||||
const generateStore = useGenerateStore()
|
||||
const hGenerateStore = useHGenerateStore()
|
||||
|
||||
const emit = defineEmits(['view-type'])
|
||||
onMounted(() => {
|
||||
@@ -47,7 +48,7 @@
|
||||
formData.append('file', fileData.file)
|
||||
uploadCustomerPhoto(formData).then((res) => {
|
||||
generateStore.updatePhotoInfo({ ...res, file: fileData.file })
|
||||
isHistoryFlow.value ? generateStore.clearCustomizeInfoDemo() : generateStore.clearCustomizeInfo()
|
||||
isHistoryFlow.value ? hGenerateStore.clearCustomizeInfo() : generateStore.clearCustomizeInfo()
|
||||
router.push({ name: 'customize', query: query.value })
|
||||
})
|
||||
}
|
||||
|
||||
@@ -4,12 +4,19 @@
|
||||
<img src="@/assets/images/chat_loading.png" alt="Loading" class="loading-image" />
|
||||
<!-- 阴影效果 -->
|
||||
<div class="loading-shadow"></div>
|
||||
<div class="loading-text">{{ title }}</div>
|
||||
<div class="loading-text" ref="textBox">
|
||||
<span>{{ text }}</span>
|
||||
<div class="loading-dot" ref="dotBox"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { onMounted, watch, reactive, toRefs, nextTick, ref } from "vue";
|
||||
import { gsap, TweenMax } from "gsap";
|
||||
|
||||
|
||||
// 这个组件只负责显示loading动画
|
||||
|
||||
// 定义组件props类型
|
||||
@@ -20,6 +27,76 @@ const props = defineProps({
|
||||
}
|
||||
})
|
||||
|
||||
const dotBox = ref(null)
|
||||
const textBox = ref(null)
|
||||
let tl1 = null;
|
||||
const text = ref('')
|
||||
|
||||
watch(() => props.title, (newVal, oldVal) => {
|
||||
if (newVal !== oldVal) {
|
||||
destroyAnimation()
|
||||
fadeOut(newVal)
|
||||
}
|
||||
})
|
||||
|
||||
function fadeOut(newVal) {
|
||||
gsap.to(textBox.value,.5, {
|
||||
opacity: 0,
|
||||
duration: 1,
|
||||
ease: "power2.in",
|
||||
onComplete: () => {
|
||||
// 消失后更换文字
|
||||
text.value = newVal
|
||||
// 然后出现
|
||||
fadeIn();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// 出现动画
|
||||
function fadeIn() {
|
||||
gsap.to(textBox.value,.5, {
|
||||
opacity: 1,
|
||||
duration: 1,
|
||||
onComplete:()=>{
|
||||
setTl1();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
const setTl1 = ()=>{
|
||||
nextTick(()=>{
|
||||
let el = dotBox.value
|
||||
let width = el.offsetWidth + el.parentElement.offsetWidth
|
||||
let time = el.parentElement.offsetWidth / 35
|
||||
console.log(time,width)
|
||||
tl1 = gsap.timeline();
|
||||
tl1.to(el,time,
|
||||
{
|
||||
ease: "power1.in",
|
||||
left:width,
|
||||
onComplete:()=>{
|
||||
setTimeout(() => {
|
||||
tl1.restart()
|
||||
}, 1000)
|
||||
}
|
||||
},
|
||||
)
|
||||
tl1.progress(0);
|
||||
})
|
||||
}
|
||||
|
||||
function destroyAnimation() {
|
||||
if (tl1) {
|
||||
tl1.progress(0);
|
||||
tl1.kill();
|
||||
tl1 = null;
|
||||
}
|
||||
}
|
||||
onMounted(() => {
|
||||
text.value = props.title
|
||||
setTl1()
|
||||
})
|
||||
|
||||
</script>
|
||||
|
||||
@@ -54,6 +131,18 @@ const props = defineProps({
|
||||
font-size: 4.8rem;
|
||||
letter-spacing: 0.02em;
|
||||
line-height: 124%;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.loading-dot{
|
||||
height: 100%;
|
||||
aspect-ratio: 1/1;
|
||||
background: radial-gradient(ellipse 150% 150% at center, #ffffff,rgba(255,255,255,.4), transparent);
|
||||
border-radius: 50%;
|
||||
position: absolute;
|
||||
top: 50%;
|
||||
left: 0;
|
||||
transform: translate(-100%, -50%);
|
||||
}
|
||||
|
||||
@keyframes rotate {
|
||||
|
||||
@@ -3,11 +3,8 @@
|
||||
<div class="header">
|
||||
<HeaderTitle hasSetting styleType="3" />
|
||||
</div>
|
||||
<div class="loading-container" v-if="isLoading">
|
||||
<GenerateLoading />
|
||||
</div>
|
||||
<template v-else>
|
||||
<div class="content flex-1" v-if="!isLoading">
|
||||
<template>
|
||||
<div class="content flex-1">
|
||||
<NoticeList
|
||||
ref="noticeListRef"
|
||||
:list="messageList"
|
||||
@@ -15,7 +12,7 @@
|
||||
:streaming-message="currentStreamingMessage"
|
||||
/>
|
||||
</div>
|
||||
<div class="footer" v-if="!isLoading">
|
||||
<div class="footer">
|
||||
<InputArea @send-message="handleSendMessage" />
|
||||
<div class="continue flex">
|
||||
<div class="btn flex flex-center" @click="handleContinue">Continue</div>
|
||||
@@ -28,7 +25,6 @@
|
||||
import HeaderTitle from '@/components/HeaderTitle.vue'
|
||||
import NoticeList from './components/NoticeList.vue'
|
||||
import InputArea from './components/InputArea.vue'
|
||||
import GenerateLoading from './components/GenerateLoading.vue'
|
||||
import { ref, onMounted, onUnmounted, onActivated } from 'vue'
|
||||
import { useRouter, useRoute } from 'vue-router'
|
||||
import { useUserInfoStore, useGenerateStore } from '@/stores'
|
||||
@@ -60,7 +56,6 @@ interface ChatMessage {
|
||||
self?: boolean
|
||||
}
|
||||
|
||||
const isLoading = ref<boolean>(false)
|
||||
const noticeListRef = ref<NoticeListRef | null>(null)
|
||||
const messageList = ref<ChatMessage[]>([])
|
||||
|
||||
@@ -273,12 +268,8 @@ const handleFetchMessage = (message: string) => {
|
||||
const handleContinue = () => {
|
||||
// router.push('/workshop/selectStyle')
|
||||
// 模拟接口之后再跳转
|
||||
isLoading.value = true
|
||||
generateStore.clearProductData()
|
||||
setTimeout(() => {
|
||||
router.push('/workshop/selectStyle')
|
||||
isLoading.value = false
|
||||
}, 1000)
|
||||
router.push('/workshop/selectStyle')
|
||||
}
|
||||
</script>
|
||||
<style lang="less" scoped>
|
||||
@@ -316,11 +307,4 @@ const handleContinue = () => {
|
||||
}
|
||||
}
|
||||
|
||||
.loading-container {
|
||||
flex: 1;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
background-color: #fff;
|
||||
}
|
||||
</style>
|
||||
|
||||
Reference in New Issue
Block a user