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

This commit is contained in:
X1627315083
2025-12-23 14:20:11 +08:00
15 changed files with 279 additions and 58 deletions

View File

@@ -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

View File

@@ -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;

View File

@@ -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,
})
},
},
]

View File

@@ -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)

View File

@@ -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 })
})
}

View File

@@ -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 {

View File

@@ -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>