From 86091b8e40567180c56f68ec8a0396ae7bc2a17a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E5=BF=97=E9=B9=8F?= <2916022834@qq.com> Date: Thu, 23 Oct 2025 16:41:38 +0800 Subject: [PATCH 1/3] 121 --- src/stores/modules/generate.ts | 17 ++++++++++++----- src/views/Workshop/customize.vue | 2 +- 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/src/stores/modules/generate.ts b/src/stores/modules/generate.ts index 6da1adc..f728c8a 100644 --- a/src/stores/modules/generate.ts +++ b/src/stores/modules/generate.ts @@ -21,11 +21,18 @@ export const useGenerateStore = defineStore({ } }, getters: { - customerId: (state) => state.userData.style.id,//顾客id - visitRecordId: (state) => state.userData.style.id,//进店记录id - styleId: (state) => state.userData.style.id,//服装id - modelPhotoId: (state) => state.userData.model.id,//模特照片id - originalTryOnId: (state) => state.userData.style.id,//原始试穿id + /** 顾客id */ + customerId: (state) => state.userData.style.id, + /** 进店记录id */ + visitRecordId: (state) => state.userData.style.id, + /** 服装id */ + styleId: (state) => state.userData.style.id, + /** 模特照片id */ + modelPhotoId: (state) => state.userData.model.id, + /** 原始试穿id */ + originalTryOnId: (state) => state.userData.style.id, + /** 顾客照片id */ + customerPhotoId: (state) => state.userData.id, }, actions: { selectStyle(data: any) { diff --git a/src/views/Workshop/customize.vue b/src/views/Workshop/customize.vue index b3a97e7..128d521 100644 --- a/src/views/Workshop/customize.vue +++ b/src/views/Workshop/customize.vue @@ -32,7 +32,7 @@ visitRecordId: store.visitRecordId, styleId: store.styleId, modelPhotoId: store.modelPhotoId, - customerPhotoId: store.userData.id, + customerPhotoId: store.customerPhotoId, originalTryOnId: store.originalTryOnId, isRegenerated: isRegenerated ? 1 : 0, prompt: inputText.value, From c1d57f2347f2d09e7a82fe2d754ad78332f83554 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E5=BF=97=E9=B9=8F?= <2916022834@qq.com> Date: Thu, 23 Oct 2025 17:01:13 +0800 Subject: [PATCH 2/3] 333 --- src/api/workshop.ts | 3 ++- src/stores/modules/generate.ts | 17 ++++++++++--- src/views/Workshop/customize.vue | 39 +++++++++++++++++------------- src/views/Workshop/uploadFace2.vue | 9 ++++--- 4 files changed, 43 insertions(+), 25 deletions(-) diff --git a/src/api/workshop.ts b/src/api/workshop.ts index 52740d3..d644c17 100644 --- a/src/api/workshop.ts +++ b/src/api/workshop.ts @@ -6,7 +6,7 @@ const request = (config: any) => { if (config.loading) useOverallStore().setLoading(true) setTimeout(() => { res({}) - if (!config.loading) useOverallStore().setLoading(false) + if (config.loading) useOverallStore().setLoading(false) }, 1000) }) } @@ -42,6 +42,7 @@ export function uploadCustomerPhoto(data: FormData) { url: '/api/customer-photos/upload', method: 'post', data, + loading: true, }) } /** diff --git a/src/stores/modules/generate.ts b/src/stores/modules/generate.ts index f728c8a..12010bf 100644 --- a/src/stores/modules/generate.ts +++ b/src/stores/modules/generate.ts @@ -17,7 +17,13 @@ export const useGenerateStore = defineStore({ id: -1, } }, - queryList: [] + queryList: [], + + /** 顾客照片信息 */ + photoInfo: { + id: "", + url: "", + } } }, getters: { @@ -32,7 +38,7 @@ export const useGenerateStore = defineStore({ /** 原始试穿id */ originalTryOnId: (state) => state.userData.style.id, /** 顾客照片id */ - customerPhotoId: (state) => state.userData.id, + customerPhotoId: (state) => state.photoInfo.id, }, actions: { selectStyle(data: any) { @@ -54,6 +60,11 @@ export const useGenerateStore = defineStore({ selectModel(data: any) { this.userData.model.id = data.id console.log(this.userData) - } + }, + /** 更新顾客照片信息 */ + updatePhotoInfo(data: any) { + this.photoInfo.id = data.visitRecordId || "" + this.photoInfo.url = data.defaultImageUrl || "" + }, } }) diff --git a/src/views/Workshop/customize.vue b/src/views/Workshop/customize.vue index 128d521..9f99b4f 100644 --- a/src/views/Workshop/customize.vue +++ b/src/views/Workshop/customize.vue @@ -3,7 +3,11 @@ import FooterNavigation from '@/components/FooterNavigation.vue' import GenerateLoading from '@/views/asistant/components/GenerateLoading.vue' import { ref, onMounted } from 'vue' - import { generateTryOnEffect, setTryOnEffectFavorite, cancelTryOnEffectFavorite } from '@/api/workshop' + import { + generateTryOnEffect, + setTryOnEffectFavorite, + cancelTryOnEffectFavorite + } from '@/api/workshop' const emit = defineEmits(['viewType']) import { useRouter } from 'vue-router' import { useGenerateStore } from '@/stores' @@ -11,18 +15,19 @@ const router = useRouter() const inputText = ref('') - const isLoved = ref(false) + const isFavorite = ref(false) + const tryOnUrl = ref('') const loading = ref(false) const onSend = () => { if (inputText.value === '') return - generate(); + generate() const text = inputText.value inputText.value = '' - console.log('发送消息:', text) + // console.log('发送消息:', text) } const onReload = () => { inputText.value = '' - generate(true); + generate(true) } // 生成结果 @@ -35,30 +40,30 @@ customerPhotoId: store.customerPhotoId, originalTryOnId: store.originalTryOnId, isRegenerated: isRegenerated ? 1 : 0, - prompt: inputText.value, - - }; + prompt: inputText.value + } loading.value = true generateTryOnEffect(data) - .then(res => { - console.log(res) + .then((res) => { + tryOnUrl.value = res.tryOnUrl + isFavorite.value = !!res.isFavorite loading.value = false }) - .catch(err => { + .catch((err) => { console.error(err) loading.value = false }) } - generate(); + generate() // 喜欢 const isLoveLoading = ref(false) const onLove = () => { if (isLoveLoading.value) return - const http = isLoved.value ? cancelTryOnEffectFavorite : setTryOnEffectFavorite + const http = isFavorite.value ? cancelTryOnEffectFavorite : setTryOnEffectFavorite isLoveLoading.value = true - isLoved.value = !isLoved.value - http("tryOnId") + isFavorite.value = !isFavorite.value + http('tryOnId') .then(() => { isLoveLoading.value = false }) @@ -96,14 +101,14 @@
- +
-
+
diff --git a/src/views/Workshop/uploadFace2.vue b/src/views/Workshop/uploadFace2.vue index b0fe7ca..f5a5ca7 100644 --- a/src/views/Workshop/uploadFace2.vue +++ b/src/views/Workshop/uploadFace2.vue @@ -4,6 +4,9 @@ import { ref, reactive, onMounted } from 'vue' import { useRouter } from 'vue-router' import { uploadCustomerPhoto } from '@/api/workshop' + import { useGenerateStore } from '@/stores' + const generateStore = useGenerateStore() + const emit = defineEmits(['view-type']) onMounted(() => { emit('view-type', 1) @@ -13,13 +16,12 @@ url:"", file: null, }); - console.log(fileData) // 上传照片 const handleUploadFace = () => { const input = document.createElement('input') input.type = 'file' input.accept = 'image/*' - input.capture = 'camera' + // input.capture = 'camera' input.click() input.onchange = (e: any) => { const file = e.target.files[0] @@ -42,8 +44,7 @@ formData.append('visitRecordId', "1") formData.append('file', fileData.file) uploadCustomerPhoto(formData).then(res => { - console.log(res, res.photoUrl) - + generateStore.updatePhotoInfo(res); router.push({ name: 'customize' }) }) } From 9fff109c778588204bc56f5012641683d2f48824 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9D=8E=E5=BF=97=E9=B9=8F?= <2916022834@qq.com> Date: Fri, 24 Oct 2025 11:47:07 +0800 Subject: [PATCH 3/3] =?UTF-8?q?=E8=AE=BE=E7=BD=AEstore?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/workshop.ts | 21 +++++++++++++++++ src/stores/modules/generate.ts | 25 +++++++++++++++++++-- src/views/Workshop/customize.vue | 36 +++++++++++++++++------------- src/views/Workshop/uploadFace1.vue | 9 ++++++-- src/views/Workshop/uploadFace2.vue | 16 ++++++------- 5 files changed, 79 insertions(+), 28 deletions(-) diff --git a/src/api/workshop.ts b/src/api/workshop.ts index d644c17..9b6302d 100644 --- a/src/api/workshop.ts +++ b/src/api/workshop.ts @@ -24,6 +24,17 @@ const request = (config: any) => { * @param data.isRegenerated 是否重新生成 0-否,1-是 */ export function generateTryOnEffect(data: Object) { + return new Promise(resolve => { + setTimeout(() => { + resolve({ + tryOnId: 1, + tryOnUrl: "http://118.31.39.42:3000/falls/1.png", + styleUrl: "http://118.31.39.42:3000/falls/1.png", + isRegenerated: 0, + isFavorite: 0, + }) + }, 1000) + }) return request({ url: '/api/try-on-effects/generate', method: 'post', @@ -38,6 +49,16 @@ export function generateTryOnEffect(data: Object) { * @param data.file 顾客照片文件 */ export function uploadCustomerPhoto(data: FormData) { + return new Promise(resolve => { + useOverallStore().setLoading(true) + setTimeout(() => { + resolve({ + visitRecordId: "2", + defaultImageUrl: URL.createObjectURL(data.get('file')), + }) + useOverallStore().setLoading(false) + }, 1000) + }) return request({ url: '/api/customer-photos/upload', method: 'post', diff --git a/src/stores/modules/generate.ts b/src/stores/modules/generate.ts index 12010bf..210cdae 100644 --- a/src/stores/modules/generate.ts +++ b/src/stores/modules/generate.ts @@ -23,7 +23,18 @@ export const useGenerateStore = defineStore({ photoInfo: { id: "", url: "", - } + file: null, + }, + /** AI魔改信息 */ + customizeInfo: { + inputText:"", + + tryOnId: "", + tryOnUrl: "", + styleUrl: "", + isRegenerated: "", + isFavorite: false, + }, } }, getters: { @@ -65,6 +76,16 @@ export const useGenerateStore = defineStore({ updatePhotoInfo(data: any) { this.photoInfo.id = data.visitRecordId || "" this.photoInfo.url = data.defaultImageUrl || "" + this.photoInfo.file = null + }, + /** 更新AI魔改信息 */ + clearCustomizeInfo(data: any) { + this.customizeInfo.inputText = data.inputText || "" + this.customizeInfo.tryOnId = data.tryOnId || "" + this.customizeInfo.tryOnUrl = data.tryOnUrl || "" + this.customizeInfo.styleUrl = data.styleUrl || "" + this.customizeInfo.isRegenerated = data.isRegenerated || "" + this.customizeInfo.isFavorite = data.isFavorite || "" }, } -}) +}) \ No newline at end of file diff --git a/src/views/Workshop/customize.vue b/src/views/Workshop/customize.vue index 9f99b4f..0573bb4 100644 --- a/src/views/Workshop/customize.vue +++ b/src/views/Workshop/customize.vue @@ -13,20 +13,19 @@ import { useGenerateStore } from '@/stores' const store = useGenerateStore() + const customizeInfo = store.customizeInfo const router = useRouter() - const inputText = ref('') - const isFavorite = ref(false) - const tryOnUrl = ref('') const loading = ref(false) const onSend = () => { - if (inputText.value === '') return + if (customizeInfo.inputText === '') return generate() - const text = inputText.value - inputText.value = '' + customizeInfo.inputText = '' + // const text = inputText.value + // inputText.value = '' // console.log('发送消息:', text) } const onReload = () => { - inputText.value = '' + customizeInfo.inputText = '' generate(true) } @@ -40,13 +39,16 @@ customerPhotoId: store.customerPhotoId, originalTryOnId: store.originalTryOnId, isRegenerated: isRegenerated ? 1 : 0, - prompt: inputText.value + prompt: customizeInfo.inputText } loading.value = true generateTryOnEffect(data) .then((res) => { - tryOnUrl.value = res.tryOnUrl - isFavorite.value = !!res.isFavorite + customizeInfo.tryOnId = res.tryOnId + customizeInfo.tryOnUrl = res.tryOnUrl + customizeInfo.styleUrl = res.styleUrl + customizeInfo.isRegenerated = res.isRegenerated + customizeInfo.isFavorite = !!res.isFavorite loading.value = false }) .catch((err) => { @@ -54,15 +56,15 @@ loading.value = false }) } - generate() + if (customizeInfo.tryOnId === '') generate() // 喜欢 const isLoveLoading = ref(false) const onLove = () => { if (isLoveLoading.value) return - const http = isFavorite.value ? cancelTryOnEffectFavorite : setTryOnEffectFavorite + const http = customizeInfo.isFavorite ? cancelTryOnEffectFavorite : setTryOnEffectFavorite + customizeInfo.isFavorite = !customizeInfo.isFavorite isLoveLoading.value = true - isFavorite.value = !isFavorite.value http('tryOnId') .then(() => { isLoveLoading.value = false @@ -94,21 +96,23 @@
?
- +
-
+
+ +
diff --git a/src/views/Workshop/uploadFace1.vue b/src/views/Workshop/uploadFace1.vue index d4171a2..996f3e8 100644 --- a/src/views/Workshop/uploadFace1.vue +++ b/src/views/Workshop/uploadFace1.vue @@ -3,6 +3,8 @@ import FooterNavigation from '@/components/FooterNavigation.vue' import { ref, onMounted } from 'vue' import { useRouter } from 'vue-router' + import { useGenerateStore } from '@/stores' + const generateStore = useGenerateStore() const emit = defineEmits(['view-type']) onMounted(() => { emit('view-type', 1) @@ -11,10 +13,13 @@ const faceUrl = ref('') // 上传照片 const handleUploadFace = () => { + generateStore.updatePhotoInfo({}) router.push({ name: 'uploadFace2' }) } - // 完成上传 + // 跳过上传 const handleFinish = () => { + generateStore.updatePhotoInfo({}) + generateStore.clearCustomizeInfo({}) router.push({ name: 'customize' }) } @@ -71,7 +76,7 @@ line-height: 132%; } } - >.btns { + > .btns { width: 100%; display: flex; justify-content: center; diff --git a/src/views/Workshop/uploadFace2.vue b/src/views/Workshop/uploadFace2.vue index f5a5ca7..6f6cc98 100644 --- a/src/views/Workshop/uploadFace2.vue +++ b/src/views/Workshop/uploadFace2.vue @@ -12,10 +12,7 @@ emit('view-type', 1) }) const router = useRouter() - const fileData = reactive({ - url:"", - file: null, - }); + const fileData = generateStore.photoInfo // 上传照片 const handleUploadFace = () => { const input = document.createElement('input') @@ -27,6 +24,7 @@ const file = e.target.files[0] if (!file) return const url = URL.createObjectURL(file) + fileData.id = '' fileData.url = url fileData.file = file // const reader = new FileReader() @@ -38,13 +36,15 @@ } // 生成照片 const handleGenerate = () => { + if (fileData.id) return router.push({ name: 'customize' }) if (!fileData.file) return const formData = new FormData() - formData.append('customerId', "1") - formData.append('visitRecordId', "1") + formData.append('customerId', '1') + formData.append('visitRecordId', '1') formData.append('file', fileData.file) - uploadCustomerPhoto(formData).then(res => { - generateStore.updatePhotoInfo(res); + uploadCustomerPhoto(formData).then((res) => { + generateStore.updatePhotoInfo(res) + generateStore.clearCustomizeInfo({}) router.push({ name: 'customize' }) }) }