diff --git a/src/assets/images/female_thumb.png b/src/assets/images/female_thumb.png new file mode 100644 index 0000000..7e8f324 Binary files /dev/null and b/src/assets/images/female_thumb.png differ diff --git a/src/assets/images/male_thumb.png b/src/assets/images/male_thumb.png new file mode 100644 index 0000000..7c6092a Binary files /dev/null and b/src/assets/images/male_thumb.png differ diff --git a/src/router/index.ts b/src/router/index.ts index f5ecdf9..307d257 100644 --- a/src/router/index.ts +++ b/src/router/index.ts @@ -1,16 +1,16 @@ import { createRouter, createWebHistory } from 'vue-router' import { useGenerateStore } from '@/stores/modules/generate' const VerifyIDs = (num: number) => { - return true + return true const ids = [ - !!useGenerateStore().customerId, - !!useGenerateStore().visitRecordId, - !!useGenerateStore().styleId, - // !!useGenerateStore().modelPhotoId, - true, - !!useGenerateStore().originalTryOnId, - ]; - return ids.splice(0, num).every(id => id) ? true : "/stylist/customer"; + !!useGenerateStore().customerId, + !!useGenerateStore().visitRecordId, + !!useGenerateStore().styleId, + // !!useGenerateStore().modelPhotoId, + true, + !!useGenerateStore().originalTryOnId + ] + return ids.splice(0, num).every((id) => id) ? true : '/stylist/customer' } /** @@ -18,7 +18,7 @@ const VerifyIDs = (num: number) => { * 1. 设置路由的meta属性为{ cache: true },表示需要缓存 * 2. App.vue中使用RouteCache组件,通过路由的name来进行匹配 * 3. 路由的name默认是文件名,如果文件名与name不一致,通过defineOptions({ name: 'componentName' })来设置 - * + * * 自定义验证规则: * meta:{ verify: ()=> boolean || string } * 1. boolean true 跳转 false 不跳转 @@ -48,8 +48,8 @@ const router = createRouter({ component: () => import('@/views/login/LoginPage.vue') }, { - path:'/reset', - name:'ResetPage', + path: '/reset', + name: 'ResetPage', component: () => import('@/views/login/ResetPage.vue') }, { @@ -62,16 +62,16 @@ const router = createRouter({ name: 'WelcomePage', component: () => import('@/views/login/WelcomePage.vue') }, - { - path: '/customer', - name: 'customer', - component: () => import('@/views/login/customer.vue'), - }, + { + path: '/customer', + name: 'customer', + component: () => import('@/views/login/customer.vue') + }, { path: '/asistant', name: 'asistant', component: () => import('../views/asistant/index.vue'), - meta: { cache: true, verify: ()=> VerifyIDs(2) } + meta: { cache: true, verify: () => VerifyIDs(2) } }, { path: '/workshop', @@ -82,115 +82,114 @@ const router = createRouter({ // path: '/workshop', // redirect: '/workshop/selectStyle' // }, - { - path: '/workshop/home', - name: 'Home', - component: () => import('@/views/Workshop/home.vue') - }, - { - path: '/workshop/homeNav', - name: 'HomeNav', - component: () => import('@/views/Workshop/homeNav.vue') - }, - { - path: '/workshop/stylist', - name: 'StylistPage', - redirect: '/workshop/stylist/index', - component: () => import('@/views/stylist/container.vue'), - children: [ - { - path: 'index', - name: 'index', - component: () => import('@/views/stylist/index.vue'), - meta: { verify: ()=> VerifyIDs(2) } - }, - { - path: 'sex', - name: 'sex', - component: () => import('@/views/stylist/sex.vue'), - meta: { verify: ()=> VerifyIDs(2) } - }, - { - path: 'dressfor', - name: 'dressfor', - component: () => import('@/views/stylist/dressfor.vue'), - meta: { verify: ()=> VerifyIDs(2) } - }, - - ] - }, + { + path: '/workshop/home', + name: 'Home', + component: () => import('@/views/Workshop/home.vue') + }, + { + path: '/workshop/homeNav', + name: 'HomeNav', + component: () => import('@/views/Workshop/homeNav.vue') + }, + { + path: '/workshop/stylist', + name: 'StylistPage', + redirect: '/workshop/stylist/index', + component: () => import('@/views/stylist/container.vue'), + children: [ + { + path: 'index', + name: 'index', + component: () => import('@/views/stylist/index.vue'), + meta: { verify: () => VerifyIDs(2) } + }, + { + path: 'sex', + name: 'sex', + component: () => import('@/views/stylist/sex.vue'), + meta: { verify: () => VerifyIDs(2) } + }, + { + path: 'dressfor', + name: 'dressfor', + component: () => import('@/views/stylist/dressfor.vue'), + meta: { verify: () => VerifyIDs(2) } + } + ] + }, { path: '/workshop/selectStyle', name: 'selectStyle', component: () => import('../views/Workshop/selectStyle.vue'), - meta: { verify: ()=> VerifyIDs(2) } + meta: { verify: () => VerifyIDs(2) } }, { path: '/workshop/selectModel', name: 'SelectModel', component: () => import('../views/Workshop/selectModel.vue'), - meta: { verify: ()=> VerifyIDs(3) } + meta: { verify: () => VerifyIDs(3) } }, { path: '/workshop/product', name: 'product', component: () => import('../views/Workshop/product.vue'), - meta: { verify: ()=> VerifyIDs(4) } + meta: { verify: () => VerifyIDs(4) } }, { // 推荐try on path: '/workshop/recommended', name: 'recommended', component: () => import('../views/Workshop/recommended.vue'), - meta: { verify: ()=> VerifyIDs(5) } + meta: { verify: () => VerifyIDs(5) } }, { // 上传照片1 path: '/workshop/uploadFace', name: 'uploadFace', component: () => import('../views/Workshop/uploadFace1.vue'), - meta: { verify: ()=> VerifyIDs(5) } + meta: { verify: () => VerifyIDs(5) } }, { // 上传照片2 path: '/workshop/uploadFace2', name: 'uploadFace2', component: () => import('../views/Workshop/uploadFace2.vue'), - meta: { verify: ()=> VerifyIDs(5) } + meta: { verify: () => VerifyIDs(5) } }, { // 自定义创作 path: '/workshop/customize', name: 'customize', component: () => import('../views/Workshop/customize.vue'), - meta: { verify: ()=> VerifyIDs(5) } + meta: { verify: () => VerifyIDs(5) } }, { // library path: '/workshop/library', name: 'library', component: () => import('../views/Workshop/library.vue'), - meta: { verify: ()=> VerifyIDs(2) } + meta: { verify: () => VerifyIDs(2) } }, { path: '/workshop/profile', name: 'profile', component: () => import('../views/Workshop/profile.vue'), - meta: { verify: ()=> VerifyIDs(1) } + meta: { verify: () => VerifyIDs(1) } }, { // creation path: '/workshop/creation', name: 'creation', component: () => import('../views/Workshop/creation/index.vue'), - meta: { verify: ()=> VerifyIDs(2) } + meta: { verify: () => VerifyIDs(2) } }, { // 完成创建 path: '/workshop/end', name: 'end', component: () => import('../views/Workshop/end.vue'), - meta: { verify: ()=> VerifyIDs(2) } + meta: { verify: () => VerifyIDs(2) } } ] } diff --git a/src/stores/modules/userInfo.ts b/src/stores/modules/userInfo.ts index 6e2d8bf..3ce85a0 100644 --- a/src/stores/modules/userInfo.ts +++ b/src/stores/modules/userInfo.ts @@ -9,7 +9,8 @@ export const useUserInfoStore = defineStore('userInfo', () => { token: '', generateParams: { stylist: '', - sex: '' + sex: '', + stylistImage: '' } }) @@ -37,7 +38,8 @@ export const useUserInfoStore = defineStore('userInfo', () => { const resetGenerateParams = () => { state.value.generateParams = { stylist: '', - sex: '' + sex: '', + stylistImage: '' } } diff --git a/src/views/Workshop/creation/creation-list.vue b/src/views/Workshop/creation/creation-list.vue index 0292fec..b5cc31d 100644 --- a/src/views/Workshop/creation/creation-list.vue +++ b/src/views/Workshop/creation/creation-list.vue @@ -26,6 +26,8 @@ emit('view-type', 1) }) const list = reactive([]) + const size = ref(10) + const page = computed(() => Math.ceil(list.length / size.value) + 1) const loading = ref(false) const finish = ref(false) const selectCount = computed(() => list.filter((v) => v.selected).length) @@ -44,20 +46,25 @@ 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 - onLoad() + onBackChooseSave() + onLoad('reload') } - const onLoad = () => { + const onLoad = (type?: 'reload') => { + if (type === 'reload') { + finish.value = false + list.splice(0, list.length) + } loading.value = true - finish.value = false - list.splice(0, list.length) const params = { customerId: generateStore.customerId, type: navActive.value, - isLibrary: false + isLibrary: false, + pageNum: page.value, + pageSize: size.value } if (props.isChooseOne) { params['visitRecordId'] = '' @@ -68,8 +75,8 @@ params['visitRecordId'] = generateStore.visitRecordId } getGenerateHistoricals(params) - .then((data) => { - data?.forEach((v) => { + .then((data: any) => { + data.records?.forEach((v) => { const obj = { // tryOnId: v.tryOnId, tryOnUrl: v.tryOnUrl, @@ -86,7 +93,7 @@ list.push(obj) }) loading.value = false - finish.value = true + finish.value = !data.hasNext }) .catch((err) => { console.error(err) @@ -229,11 +236,11 @@ hGenerateStore.originalTryOn.id = selectedItem.id hGenerateStore.originalTryOn.tryOnUrl = selectedItem.tryOnUrl hGenerateStore.originalTryOn.isLike = selectedItem.isFavorite - hGenerateStore.style.id = ''; + hGenerateStore.style.id = '' hGenerateStore.style.url = selectedItem.styleUrl } else { // style - hGenerateStore.style.id = selectedItem.id; + hGenerateStore.style.id = selectedItem.id hGenerateStore.style.url = selectedItem.url // selectedItem.isFavorite } @@ -262,7 +269,14 @@
-
+
- AI Avatar + AI Avatar
@@ -27,9 +27,15 @@ diff --git a/src/views/login/LoginPage.vue b/src/views/login/LoginPage.vue index 2bfe9b4..bba1870 100644 --- a/src/views/login/LoginPage.vue +++ b/src/views/login/LoginPage.vue @@ -2,13 +2,16 @@ @@ -183,7 +190,7 @@ const handleSignup = () => { cursor: pointer; z-index: 3; font-size: 3.4rem; - .c-svg{ + .c-svg { width: initial; height: initial; } @@ -191,12 +198,14 @@ const handleSignup = () => { .header { margin-top: 1.42rem; - padding-left: 15.5rem; + padding-left: 14.5rem; + padding-right: 14.3rem; color: white; font-family: 'satoshiRegular'; .title { font-size: 11rem; font-weight: bold; + font-weight: 700; margin-bottom: 0.8rem; color: white; font-family: 'satoshiBold'; @@ -226,11 +235,7 @@ const handleSignup = () => { position: relative; width: calc(100% - 28.4rem); height: 107.8rem; - background: radial-gradient( - 100% 100% at 0% 0%, - rgba(0, 0, 0, 0.4) 0%, - rgba(0, 0, 0, 0.2) 100% - ); + background: radial-gradient(100% 100% at 0% 0%, rgba(0, 0, 0, 0.4) 0%, rgba(0, 0, 0, 0.2) 100%); backdrop-filter: blur(35px); -webkit-backdrop-filter: blur(35px); -moz-backdrop-filter: blur(35px); diff --git a/src/views/login/ResetPage.vue b/src/views/login/ResetPage.vue index 3c7d964..5419c94 100644 --- a/src/views/login/ResetPage.vue +++ b/src/views/login/ResetPage.vue @@ -9,9 +9,12 @@
-
Log in.
-

Redefine the styling experience with AI.

-

Use Styling Angel to speed up your fashion journey.

+
Staff Login.
+

+ Experience our personalised styling journey with +
+ Lane Crawford. +

-
Sign up.
-

Redefine the styling experience with AI.

-

Use Styling Angel to speed up your fashion journey.

+
Staff Sign up.
+

Start my personalised styling journey with Lane Crawford.

@@ -191,7 +195,8 @@ const handleGoogleSignup = async (accessToken: string) => { .header { margin-top: 1.42rem; - padding-left: 15.5rem; + padding-left: 14.5rem; + padding-right: 14.3rem; color: white; font-family: 'satoshiRegular'; .title { @@ -281,7 +286,6 @@ const handleGoogleSignup = async (accessToken: string) => { } } - .footer { position: relative; text-align: center; diff --git a/src/views/login/WelcomePage.vue b/src/views/login/WelcomePage.vue index d4a7ba9..75c2c50 100644 --- a/src/views/login/WelcomePage.vue +++ b/src/views/login/WelcomePage.vue @@ -2,10 +2,14 @@
- AI STYLING
- ASSISTANT + Styling
+ Assistant
-

Redefine the styling experience with AI.

+

+ Experience our personalised styling journey with +
+ Lane Crawford. +

Log in
Sign up
@@ -49,15 +53,16 @@ const goToLogin = () => { font-weight: 400; margin-bottom: 31.5rem; .title { - font-family: 'boskaRegular'; - line-height: 93%; - letter-spacing: -0.02em; + font-family: 'satoshiMedium'; + line-height: 120%; + // letter-spacing: -0.02em; } .subtitle { font-size: 3.2rem; font-family: 'satoshiRegular'; margin: 3.2rem 0 6rem; - list-style: 124%; + font-weight: 400; + line-height: 124%; letter-spacing: 0.08em; } .btn-container { diff --git a/src/views/login/customer.vue b/src/views/login/customer.vue index 0e49d5d..16497ed 100644 --- a/src/views/login/customer.vue +++ b/src/views/login/customer.vue @@ -25,8 +25,8 @@
{{ formTitle }}
-

Redefine the styling experience with AI.

-

Use Styling Angel to speed up your fashion journey.

+

Unlock personalized styling insights.

+

Enter a client profile to begin curating their next look with Styling Angel.

@@ -58,7 +58,7 @@
- +