diff --git a/src/api/workshop.ts b/src/api/workshop.ts index 1032a94..9e27bb0 100644 --- a/src/api/workshop.ts +++ b/src/api/workshop.ts @@ -8,26 +8,26 @@ import request from '@/utils/request' * @param data.stylist 提示词 * @param data.gender 原始试穿效果id * @param data.num 是否重新生成 0-否,1-是 -*/ + */ export function generateRequestOutfit(data: Object) { - return request({ - url: '/api/style/requestOutfit', - method: 'post', - data, - }) + return request({ + url: '/api/style/requestOutfit', + method: 'post', + data + }) } /** * 获取传达风格 * @param data 获取传达风格数据 * @param data.requestIDs 获取生成结果的taskId -*/ + */ export function getRequestOutfit(data: Object) { - return request({ - url: '/api/style/getOutfitResult', - method: 'get', - params:data - }) + return request({ + url: '/api/style/getOutfitResult', + method: 'get', + params: data + }) } /** @@ -41,13 +41,13 @@ export function getRequestOutfit(data: Object) { * @param data.prompt 提示词 * @param data.originalTryOnId 原始试穿效果id * @param data.isRegenerated 是否重新生成 0-否,1-是 -*/ + */ export function generateTryOnEffect(data: Object) { - return request({ - url: '/api/try-on-effects/generate', - method: 'post', - data, - }) + return request({ + url: '/api/try-on-effects/generate', + method: 'post', + data + }) } /** * 生成试穿效果-演示 @@ -55,13 +55,13 @@ export function generateTryOnEffect(data: Object) { * @param data.customerPhotoId 顾客照片id * @param data.prompt 提示词 * @param data.tryonUrl AI魔改url -*/ + */ export function generateTryOnEffectDemo(data: Object) { - return request({ - url: '/api/try-on-effects/reFace', - method: 'post', - data, - }) + return request({ + url: '/api/try-on-effects/reFace', + method: 'post', + data + }) } /** 上传图片-AI换脸 @@ -71,56 +71,111 @@ export function generateTryOnEffectDemo(data: Object) { * @param data.file 顾客照片文件 */ export function uploadCustomerPhoto(data: FormData) { - return request({ - url: '/api/customer-photos/upload', - method: 'post', - data, - loading: true, - }) + return request({ + url: '/api/customer-photos/upload', + method: 'post', + data, + loading: true + }) } /** * 设置喜欢 * @param tryOnId 试穿效果id -*/ + */ export function setTryOnEffectFavorite(tryOnId: string | number) { - if (!tryOnId) return Promise.reject('试穿效果id不能为空'); - return request({ - url: `/api/try-on-effects/set-favorite/${tryOnId}`, - method: 'post', - }) + if (!tryOnId) return Promise.reject('试穿效果id不能为空') + return request({ + url: `/api/try-on-effects/set-favorite/${tryOnId}`, + method: 'post' + }) } /** * 取消喜欢 * @param tryOnId 试穿效果id -*/ + */ export function cancelTryOnEffectFavorite(tryOnId: string | number) { - if (!tryOnId) return Promise.reject('试穿效果id不能为空'); - return request({ - url: `/api/try-on-effects/cancel-favorite/${tryOnId}`, - method: 'post', - }) + if (!tryOnId) return Promise.reject('试穿效果id不能为空') + return request({ + url: `/api/try-on-effects/cancel-favorite/${tryOnId}`, + method: 'post' + }) } /** 查询进店记录-library * @param customerId 客户id */ export function getCustomerPhotos(customerId: string | number) { - if (!customerId) return Promise.reject('客户id不能为空'); - return request({ - url: `/api/visit-records/customer/${customerId}`, - method: 'get', - }) + if (!customerId) return Promise.reject('客户id不能为空') + return request({ + url: `/api/visit-records/customer/${customerId}`, + method: 'get' + }) } /** 删除进店记录-library * @param visitRecordId 进店记录id */ export function deleteCustomerPhoto(visitRecordId: string | number) { - if (!visitRecordId) return Promise.reject('进店记录id不能为空'); + if (!visitRecordId) return Promise.reject('进店记录id不能为空') + return request({ + url: `/api/visit-records/${visitRecordId}`, + method: 'delete' + // loading: true, + }) +} +/** 查询收藏列表 + * @param visitRecordId 进店记录id + */ +export function getTryOnEffectFavoriteList(visitRecordId: string | number) { + if (!visitRecordId) return Promise.reject('进店记录id不能为空') + return request({ + url: `/api/try-on-effects/favorites/${visitRecordId}`, + method: 'get' + }) +} +/** 查询某套试穿效果列表 + * @param styleId 服装id + */ +export function getTryOnEffectStyleList(styleId: string | number) { + if (!styleId) return Promise.reject('服装id不能为空') + return request({ + url: `/api/try-on-effects/style/${styleId}`, + method: 'get' + }) +} + +// 获取当前Sales名下的customers列表 +export interface CustomerListParams { + current: number + size: number + desc: boolean + sortField?: 'createTime' + sortOrder?: 'DESC' | 'ASC' + keyword?: string + startTime?: string + endTime?: string + status?: number + offset?: number + limit?: number +} +export const getCustomerList = (data: CustomerListParams) => { + return request({ + url: '/api/customers/getAllCustomer', + method: 'post', + data + }) +} + +// 创建顾客 +export interface CreateCustomerParams { + nickname: string + vipId: string +} +export const createCustomer = (data: CreateCustomerParams) => { return request({ - url: `/api/visit-records/${visitRecordId}`, - method: 'delete', - // loading: true, - }) + url: '/api/customers/createCustomer', + method: 'get', + params: data + }) } // /** 查询收藏列表 @@ -162,19 +217,19 @@ export function getGenerateHistoricals(params: Object) { interface CustomerInfo { vipId: string } -export const customerCheckin = (data: CustomerInfo) => { - return request({ - url: '/api/customers/checkIn', - method: 'get', - params: data, - }) +export const customerCheckin = (data: CustomerInfo) => { + return request({ + url: '/api/customers/checkIn', + method: 'get', + params: data + }) } // AI对话 interface AIConversation { - message: string - sessionId: string | number //用户ID - gender: 'male' | 'female' //性别 + message: string + sessionId: string | number //用户ID + gender: 'male' | 'female' //性别 } export const streamChatAddress = '/api/llm/streamChat' @@ -185,11 +240,46 @@ export const streamChatAddress = '/api/llm/streamChat' * @param data.visitRecordId 进店记录id * @param data.customerId 顾客id * @param data.suggestion 意见和建议 -*/ + */ export function addTryOnEffectComment(data: Object) { return request({ url: '/api/try-on-effects/add-comment', method: 'post', data, }) -} \ No newline at end of file +} + +/** + * like outfit接口 + * @param styleId 设置like的styleid +*/ +export function setStyleFavorite(styleId: Object) { + return request({ + url: `/api/style/set-favorite/${styleId}`, + method: 'post', + }) +} + +/** + * 取消like outfit接口 + * @param styleId 取消like的styleid +*/ +export function cancelStyleFavorite(styleId: Object) { + return request({ + url: `/api/style/cancel-favorite/${styleId}`, + method: 'post', + }) +} + +/** + * try on 返推outfitId + * @param tryOnEffectsId tryOnId +*/ +export function retrieveAndRegenerate(data: Object) { + return request({ + url: `/api/style/retrieveAndRegenerate`, + method: 'get', + params: data, + }) +} + diff --git a/src/assets/icons/reTry.svg b/src/assets/icons/reTry.svg new file mode 100644 index 0000000..230cd29 --- /dev/null +++ b/src/assets/icons/reTry.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/src/components/FooterNavigation.vue b/src/components/FooterNavigation.vue index f9621a4..b807a97 100644 --- a/src/components/FooterNavigation.vue +++ b/src/components/FooterNavigation.vue @@ -25,13 +25,13 @@ }) .then(() => { MyEvent.emit('clear-generate-state') - MyEvent.emit('clearAllCache') + // MyEvent.emit('clearAllCache') nav.path && router.push(nav.path) }) .catch(() => {}) } const navs = [ - { label: 'Home', icon: 'home', size: 73, path: '/workshop/home' }, + { label: 'Home', icon: 'home', size: 73, path: '/workshop/home', on: onHome }, { label: 'Library', icon: 'library', size: 53, path: '/workshop/library' }, // { label: 'Profile', icon: 'profile', size: 55, path: '/workshop/profile' } ] diff --git a/src/components/gradientButton.vue b/src/components/gradientButton.vue new file mode 100644 index 0000000..3acfb3a --- /dev/null +++ b/src/components/gradientButton.vue @@ -0,0 +1,58 @@ + + + \ No newline at end of file diff --git a/src/router/index.ts b/src/router/index.ts index 04c585e..f5ecdf9 100644 --- a/src/router/index.ts +++ b/src/router/index.ts @@ -121,7 +121,7 @@ const router = createRouter({ }, { path: '/workshop/selectStyle', - name: 'SelectStyle', + name: 'selectStyle', component: () => import('../views/Workshop/selectStyle.vue'), meta: { verify: ()=> VerifyIDs(2) } }, @@ -133,7 +133,7 @@ const router = createRouter({ }, { path: '/workshop/product', - name: 'Product', + name: 'product', component: () => import('../views/Workshop/product.vue'), meta: { verify: ()=> VerifyIDs(4) } }, diff --git a/src/stores/modules/generate.ts b/src/stores/modules/generate.ts index 6b50236..72bf0f4 100644 --- a/src/stores/modules/generate.ts +++ b/src/stores/modules/generate.ts @@ -9,7 +9,10 @@ export const useGenerateStore = defineStore({ return { style: { id: '', - oldId: '' //表示从生成页面返回回来,需要调整的样式id + path: '', + taskId:'', + isLike: false, //是否喜欢 + status: '' }, styleList: [{}, {}, {}, {}], model: { @@ -68,7 +71,7 @@ export const useGenerateStore = defineStore({ /** 进店记录id */ visitRecordId: (state) => state.customerInfo.visitRecordId, /** 服装id */ - styleId: (state) => state.style.id || state.style.oldId, + styleId: (state) => state.style.id, /** 模特照片id */ modelPhotoId: (state) => state.model.id, /** 原始试穿id不包含魔改id */ @@ -82,23 +85,19 @@ export const useGenerateStore = defineStore({ }, actions: { selectStyle(data: any) { - this.style.id = data.id - }, - //生成后去掉id 设置oldId来修改样式 - useStyleGenerate() { - if (!this.style.id) return - this.style.oldId = this.style.id - // this.style.id = '' - }, - updateStyle(data) { - if (data.id == this.style.oldId) { - this.style.oldId = '' - } - if(data.id == this.style.id) { - this.style.id = '' + this.style = { + ...data, } - console.log(this.style) }, + clearStyle() { + this.style = { + id: '', + path: '', + isLike: false, + taskId:'', + status: '' + } + }, //模特相关 selectModel(data: any) { this.model.id = data.id @@ -110,7 +109,10 @@ export const useGenerateStore = defineStore({ this.styleList = [{}, {}, {}, {}] this.style = { id: '', - oldId: '' + path: '', + isLike: false, + taskId:'', + status: '' } this.model = { id: '' diff --git a/src/utils/myEvent.js b/src/utils/myEvent.js index e3c4e1b..78bf9cc 100644 --- a/src/utils/myEvent.js +++ b/src/utils/myEvent.js @@ -7,6 +7,7 @@ class MyEvent { MyEvent.list = MyEvent.list.filter(item => item.name != name && item.call != call) } emit(name, data) { + console.log('Myevent触发--',name) MyEvent.list.forEach(item => { if (item.name == name) item.call(data) }) diff --git a/src/utils/request.ts b/src/utils/request.ts index e047ce9..9a6e98c 100644 --- a/src/utils/request.ts +++ b/src/utils/request.ts @@ -80,7 +80,7 @@ service.interceptors.response.use( } const res = response.data // 处理异常的情况 - console.log(res) + // console.log(res) if (res.code != 0) { showToast({ message: res.errMsg || res.message, diff --git a/src/utils/tools.ts b/src/utils/tools.ts index 65a05ec..eac100e 100644 --- a/src/utils/tools.ts +++ b/src/utils/tools.ts @@ -156,4 +156,31 @@ export async function DownloadImages(list: Array<{ url: string, name?: string }> */ export function encryptPassword(password: string): string { return CryptoJS.MD5(password).toString() +} + +/** + * 图片分享到WhatsApp + * @param url 图片URL + * @returns 无 + */ +export async function shareImageToWhatsapp (url: string){ + // 把图片 URL 转为 Blob + const blob = await fetch(url).then((res) => res.blob()) + + // 创建文件对象 + const file = new File([blob], 'image.jpg', { type: 'image/jpeg' }) + + // 判断浏览器是否支持文件分享 + if (navigator.canShare && navigator.canShare({ files: [file] })) { + await navigator.share({ + files: [file] + }) + } else { + // 你可以附加一些自定义文本 + const message = 'share image ' + url + + // 构造WhatsApp链接 + const whatsappLink = `https://api.whatsapp.com/send/?text=${encodeURIComponent(message)}` + window.open(whatsappLink, '_blank') + } } \ No newline at end of file diff --git a/src/views/Workshop/home.vue b/src/views/Workshop/home.vue index 783c6c2..29dc2b2 100644 --- a/src/views/Workshop/home.vue +++ b/src/views/Workshop/home.vue @@ -8,7 +8,7 @@ import { FlowType } from '@/types/enum' //const props = defineProps({ //}) const emit = defineEmits([ - 'view-type' + 'viewType' ]) // const data = reactive({ @@ -23,7 +23,7 @@ const historicalReview = ()=>{ } onMounted(()=>{ - emit('view-type', 1) + emit('viewType', 1) }) onUnmounted(()=>{ }) diff --git a/src/views/Workshop/homeNav.vue b/src/views/Workshop/homeNav.vue index be86596..e78924b 100644 --- a/src/views/Workshop/homeNav.vue +++ b/src/views/Workshop/homeNav.vue @@ -58,7 +58,7 @@ onMounted(()=>{ flowTypeList: [FlowType.H_TRYON,FlowType.H_AI], }, { - path: 'recommended', + path: 'product', imgPath: new URL('@/assets/images/nav2.png',import.meta.url).href, flowTypeList: [FlowType.H_OUTFIT], }, diff --git a/src/views/Workshop/product.vue b/src/views/Workshop/product.vue index 1eb25dc..7b867ce 100644 --- a/src/views/Workshop/product.vue +++ b/src/views/Workshop/product.vue @@ -1,12 +1,10 @@ @@ -185,16 +271,16 @@ defineExpose({ open, close, openSwitchCustomerPopup })
Saved Customer ID
-
+
-
{{ item.nickname }}
-
{{ item.id }}
+
{{ item.name }}
+
{{ item.vipId }}
@@ -204,6 +290,10 @@ defineExpose({ open, close, openSwitchCustomerPopup })
+
Confirm
@@ -375,6 +465,12 @@ defineExpose({ open, close, openSwitchCustomerPopup }) } } } + .list-footer { + text-align: center; + padding: 2rem 0; + font-size: 3rem; + color: #9b9b9b; + } .confirm-btn { margin: 4.9rem 12.7rem 0 13.3rem; border: 0.25rem solid #3b3b3b; diff --git a/src/views/Workshop/selectStyle.vue b/src/views/Workshop/selectStyle.vue index 5445e3e..69a5efa 100644 --- a/src/views/Workshop/selectStyle.vue +++ b/src/views/Workshop/selectStyle.vue @@ -1,16 +1,17 @@ \ No newline at end of file diff --git a/src/views/asistant/components/GenerateLoading.vue b/src/views/asistant/components/GenerateLoading.vue index 05c7914..f5871b1 100644 --- a/src/views/asistant/components/GenerateLoading.vue +++ b/src/views/asistant/components/GenerateLoading.vue @@ -4,12 +4,19 @@ Loading
-
{{ title }}
+
+ {{ text }} +
+
@@ -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 { diff --git a/src/views/asistant/index.vue b/src/views/asistant/index.vue index 91dbaa2..b7610af 100644 --- a/src/views/asistant/index.vue +++ b/src/views/asistant/index.vue @@ -3,32 +3,26 @@
-
- +
+
- +
diff --git a/src/views/login/customer.vue b/src/views/login/customer.vue index ada4ffd..4df7116 100644 --- a/src/views/login/customer.vue +++ b/src/views/login/customer.vue @@ -58,7 +58,7 @@ - +