Merge branches 'master' and 'master' of https://gitee.com/lvYeJu/lane-crawford-3

This commit is contained in:
zhangyh
2025-10-10 11:01:17 +08:00
55 changed files with 1042 additions and 49 deletions

2
components.d.ts vendored
View File

@@ -9,8 +9,10 @@ export {}
declare module '@vue/runtime-core' { declare module '@vue/runtime-core' {
export interface GlobalComponents { export interface GlobalComponents {
HeaderTitle: typeof import('./src/components/HeaderTitle.vue')['default']
RouterLink: typeof import('vue-router')['RouterLink'] RouterLink: typeof import('vue-router')['RouterLink']
RouterView: typeof import('vue-router')['RouterView'] RouterView: typeof import('vue-router')['RouterView']
SelectItem: typeof import('./src/components/selectStyle/selectItem.vue')['default']
SvgIcon: typeof import('./src/components/SvgIcon/index.vue')['default'] SvgIcon: typeof import('./src/components/SvgIcon/index.vue')['default']
VanSwipe: typeof import('vant/es')['Swipe'] VanSwipe: typeof import('vant/es')['Swipe']
VanSwipeItem: typeof import('vant/es')['SwipeItem'] VanSwipeItem: typeof import('vant/es')['SwipeItem']

View File

@@ -6,6 +6,7 @@
<!-- <meta name="viewport" content="width=device-width, initial-scale=1.0"> --> <!-- <meta name="viewport" content="width=device-width, initial-scale=1.0"> -->
<!-- <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0"> --> <!-- <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0"> -->
<meta name="viewport" content="width=device-width,initial-scale=1.0,maximum-scale=1.0,user-scalable=0" /> <meta name="viewport" content="width=device-width,initial-scale=1.0,maximum-scale=1.0,user-scalable=0" />
<link rel="stylesheet" href="/css/woff/fontFamily.css">
<title>Activities</title> <title>Activities</title>
</head> </head>
<body> <body>

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -0,0 +1,36 @@
/* cyrillic-ext */
@font-face {
font-family: 'satoshiRegular';
font-style: italic;
font-weight: 700;
src: url("./Satoshi/Satoshi-Regular.ttf") format('woff2'), url("./Satoshi/Satoshi-Regular.woff") format('woff2');
/* unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; */
}
@font-face {
font-family: 'satoshiBold';
font-style: italic;
font-weight: 700;
src: url("./Satoshi/Satoshi-Bold.ttf") format('woff2'), url("./Satoshi/Satoshi-Bold.woff") format('woff2');
/* unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; */
}
@font-face {
font-family: 'mazzardHRegular';
font-style: italic;
font-weight: 700;
src: url("./Mazzard/MazzardH-Regular.otf") format('opentype');
/* unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; */
}
@font-face {
font-family: 'robotoBold';
font-style: italic;
font-weight: 700;
src: url("./Roboto/Roboto-Bold.ttf") format('woff2');
/* unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; */
}
@font-face {
font-family: 'boskaRegular';
font-style: italic;
font-weight: 700;
src: url("./Boska/Boska-Regular.ttf") format('woff2'), url("./Boska/Boska-Regular.woff") format('woff2');
/* unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F; */
}

View File

@@ -1,29 +0,0 @@
/* cyrillic-ext */
@font-face {
font-family: 'poppinsRegular';
font-style: italic;
font-weight: 700;
src: url(./Poppins/Poppins-Regular.ttf) format('woff2');
unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;
}
@font-face {
font-family: 'poppinsSemiBold';
font-style: italic;
font-weight: 700;
src: url(./Poppins/Poppins-SemiBold.ttf) format('woff2');
unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;
}
@font-face {
font-family: 'poppinsBold';
font-style: italic;
font-weight: 700;
src: url(./Poppins/Poppins-Bold.ttf) format('woff2');
unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;
}
@font-face {
font-family: 'poppinsMedium';
font-style: italic;
font-weight: 700;
src: url(./Poppins/Poppins-Medium.ttf) format('woff2');
unicode-range: U+0460-052F, U+1C80-1C88, U+20B4, U+2DE0-2DFF, U+A640-A69F, U+FE2E-FE2F;
}

View File

@@ -0,0 +1,3 @@
<svg width="22" height="34" viewBox="0 0 22 34" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M22 31.2213L18.728 34L0.906497 18.856C0.619223 18.6133 0.391239 18.3248 0.235665 18.0069C0.0800915 17.6891 -2.93095e-08 17.3482 -2.87279e-08 17.0039C-2.81463e-08 16.6597 0.0800915 16.3188 0.235665 16.001C0.391239 15.6831 0.619223 15.3946 0.906497 15.1519L18.728 0L21.9969 2.77872L5.27014 17L22 31.2213Z" fill="black"/>
</svg>

After

Width:  |  Height:  |  Size: 431 B

4
src/assets/icons/add.svg Normal file
View File

@@ -0,0 +1,4 @@
<svg width="39" height="38" viewBox="0 0 39 38" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M8.125 19H30.875" stroke="#989898" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M19.5 7.91699V30.0837" stroke="#989898" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
</svg>

After

Width:  |  Height:  |  Size: 328 B

View File

@@ -0,0 +1,3 @@
<svg width="31" height="22" viewBox="0 0 31 22" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M2 11L11 20L29 2" stroke="#989898" stroke-width="4" stroke-linecap="round" stroke-linejoin="round"/>
</svg>

After

Width:  |  Height:  |  Size: 213 B

View File

@@ -0,0 +1,5 @@
<svg width="39" height="38" viewBox="0 0 39 38" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M30.875 9.5V31.6667C30.875 32.5065 30.5326 33.312 29.9231 33.9058C29.3136 34.4997 28.487 34.8333 27.625 34.8333H11.375C10.513 34.8333 9.6864 34.4997 9.0769 33.9058C8.46741 33.312 8.125 32.5065 8.125 31.6667V9.5" stroke="#989898" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M4.875 9.5H34.125" stroke="#989898" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M13 9.50033V6.33366C13 5.49381 13.3424 4.68835 13.9519 4.09449C14.5614 3.50062 15.388 3.16699 16.25 3.16699H22.75C23.612 3.16699 24.4386 3.50062 25.0481 4.09449C25.6576 4.68835 26 5.49381 26 6.33366V9.50033" stroke="#989898" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
</svg>

After

Width:  |  Height:  |  Size: 818 B

View File

@@ -0,0 +1,3 @@
<svg width="32" height="28" viewBox="0 0 32 28" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M0.166748 9.04153C0.16678 7.2796 0.701271 5.55912 1.69963 4.10733C2.69798 2.65554 4.11323 1.54074 5.75846 0.910159C7.40369 0.279582 9.2015 0.162897 10.9144 0.575513C12.6274 0.98813 14.1749 1.91064 15.3525 3.22119C15.4354 3.30988 15.5357 3.38059 15.6471 3.42893C15.7585 3.47727 15.8787 3.50221 16.0001 3.50221C16.1215 3.50221 16.2416 3.47727 16.353 3.42893C16.4644 3.38059 16.5647 3.30988 16.6477 3.22119C17.8216 1.90212 19.3694 0.971859 21.0852 0.554229C22.8009 0.1366 24.6031 0.251409 26.252 0.883376C27.9008 1.51534 29.3181 2.63449 30.3152 4.09187C31.3123 5.54925 31.8418 7.27573 31.8334 9.04153C31.8334 12.6674 29.4584 15.3749 27.0834 17.7499L18.3877 26.1621C18.0927 26.501 17.729 26.7731 17.3207 26.9606C16.9123 27.148 16.4688 27.2465 16.0195 27.2493C15.5703 27.2521 15.1255 27.1594 14.7149 26.9771C14.3042 26.7948 13.937 26.5273 13.6377 26.1922L4.91675 17.7499C2.54175 15.3749 0.166748 12.6832 0.166748 9.04153Z" fill="#FF4949"/>
</svg>

After

Width:  |  Height:  |  Size: 1.0 KiB

View File

@@ -0,0 +1,9 @@
<svg width="60" height="60" viewBox="0 0 60 60" fill="none" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<rect width="60" height="60" fill="url(#pattern0_1_2934)"/>
<defs>
<pattern id="pattern0_1_2934" patternContentUnits="objectBoundingBox" width="1" height="1">
<use xlink:href="#image0_1_2934" transform="scale(0.0111111)"/>
</pattern>
<image id="image0_1_2934" width="90" height="90" preserveAspectRatio="none" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFoAAABaCAYAAAA4qEECAAAACXBIWXMAAAsTAAALEwEAmpwYAAAETUlEQVR4nO2dS2jVRxSHv9a0SbGtm4JGhVpS10KtqypKSCsBS+3CFtIH9UnBglYRdSG4M2YlAbsSuuo2TZuFortuFGtJE+HSLrRdtBbNy66aQuKRgRMIITfexzzO/3/ng98m3DuZ+THMzDnzuJDJZDKZTCaTyWQymZpZBWwDDgIDwDAwDtwDpoH/VdP6t3H9zEX9zttaRmYZNgLHgRHgX0Ca1GPgR+AYsIEW5yXgM+AGMO/B3GqaA64DnwIdtBAva0/7O6C51fQIOA+socS8AJwCphIYvFSuDie1TqViB3DXgMFL9RvQQwlwY+Jl4IkBU6vJ1W0QaKegbAJuGTBSatQvwJsUjB5PyzSJLLcs7KYgfAj8Z8A0aVAuGPoY4xwJvCaWSHJtOIxR9mpwkNok8Wj2RxjDjWuzBsyRAMPIexhhc0EnPqljguxKbXK7Louk5LqTep192YAJEkkuqEkWVluO+MSzXFt3xja5DRgz0HiJrLuxE1GnDDRaEunrmPnkSQMNlkSaVA+Cc9pAYyWxXC47eNrzgYGGSmL9o1txwfjcQCPFiPpCGn3DQAPFiK6GPBJQhszcrM4z61SnNadRbzkugdYZwujjJTG5d5m2nWmwvK9CGD1iwChpQq7Xvl+lbWsbLHPIt8nuiNVMSU12rG+w3Bnfx8+2GTBLPA8XiznbRPlbfRp9sMQm9za5abHfp9EDBkwTz8OFY7eHjeQLPo3+wYBxYtBk7xNikVKisxGGi8Ua9Wn0nwYMFGM9eUH3fRpt4QSoGDTZacKn0Y2EqK1gsugQZNLon4AvNXz9uYBjclCjfe2ofAc8t2Tv8UqBTfY+dPzhqVKblin7+QbNtmCy98nQx/JuHnixSvn1mm3FZO/Lu2FPlepe4X/UarYlk70HLL5C8N+B15ow25rJTv1Wk0oV3dmohpssvzG2hFtJX1hOk47V2bMt9uQFvWU98V+psWdb7clBEv/o3WpJ0LO3GO3JQbay0GvFksBsqyY7HSUA6wPeUak8YxixNFwsaK6BOtfM9YAVr9RR8dQmBz1Agz77IInN3m3A5OBHwjoiPP9QWcFsKyYHP+QY6xD6mB5qWcweQ1fsThCBVyLtuDwEzmnk9a2hc38uLbqaSJw00GBJJLfMjYZL2P9qoNFS9stCju35+ls8Bg0YIJF0iYS06/VdKblur7A7FI0uvZguJdUM8AZG2GUkkBDPcinadzHGByV8GGUfRjlsKLCQJuQ6zCGMs7fgw8isxSd+qtFd0AlyRuebQvE6cNOAeVKj7lh40qeZdfag8QjyiQYjydfJvsL1MQOmLpWr0zuUjDZ9VGTCgMETmoVzdSotq7WRfyUw+KE+1P0qLUQH8AlwLXCgM6cbqX2t9vT8cnTqDYDv9dcomjV3Wss6GvJIQNFZpefZDuhJzSE9g3xPt9AWfh5kSv82qp/p11us7rv550EymUwmk8lkMplMhhp5CqaIor9P1Mi+AAAAAElFTkSuQmCC"/>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 2.0 KiB

View File

Before

Width:  |  Height:  |  Size: 1.1 KiB

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

@@ -0,0 +1,23 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- Generator: Adobe Illustrator 25.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" id="Capa_1" x="0px" y="0px" viewBox="0 0 512.016 512.016" style="enable-background:new 0 0 512.016 512.016;" xml:space="preserve" width="512" height="512">
<g>
<path d="M256.008,42.675c57.16,0.188,111.87,23.233,151.936,64h-66.603c-11.782,0-21.333,9.551-21.333,21.333 s9.551,21.333,21.333,21.333h88.384c21.874-0.012,39.604-17.742,39.616-39.616V21.341c0-11.782-9.551-21.333-21.333-21.333 s-21.333,9.551-21.333,21.333v44.331C321.782-28.795,160.169-20.343,65.702,84.55C28.733,125.6,6.058,177.523,1.075,232.541 c-1.096,11.814,7.593,22.279,19.407,23.375c0.64,0.059,1.283,0.09,1.927,0.092c10.813,0.138,19.954-7.977,21.099-18.731 C53.35,127.213,145.505,42.82,256.008,42.675z"/>
<path d="M489.629,256.008c-10.813-0.138-19.954,7.977-21.099,18.731C458.35,391.953,355.076,478.721,237.861,468.54 c-50.715-4.405-98.176-26.825-133.789-63.199h66.603c11.782,0,21.333-9.551,21.333-21.333c0-11.782-9.551-21.333-21.333-21.333 H82.291c-21.868-0.012-39.604,17.706-39.616,39.573c0,0.014,0,0.028,0,0.043v88.384c0,11.782,9.551,21.333,21.333,21.333 s21.333-9.551,21.333-21.333v-44.331c104.893,94.467,266.505,86.015,360.972-18.878c36.97-41.05,59.645-92.973,64.628-147.992 c1.096-11.814-7.593-22.279-19.407-23.375C490.901,256.041,490.265,256.01,489.629,256.008z"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 MiB

View File

@@ -0,0 +1,46 @@
<script setup lang="ts">
import BackIcon from '@/assets/icons/back.svg'
import { useRouter } from 'vue-router'
const router = useRouter()
defineProps({
title: { type: String, default: 'STYLING ANGEL' }
})
defineEmits(['clickReturn'])
const handleClickReturn = () => {
router.back()
// emit('clickReturn')
}
</script>
<template>
<div class="header-title">
<div class="return" @click="handleClickReturn"><SvgIcon name="Return" size="34" /></div>
<span class="title">{{ title }}</span>
</div>
</template>
<style scoped lang="less">
.header-title {
width: 100%;
height: var(--header-title-height, 9.9rem);
background-color: var(--header-title-background, #000000);
display: flex;
align-items: center;
justify-content: center;
position: relative;
> .return {
position: absolute;
left: 3.2rem;
display: inline-block;
--svg-icon-color: var(--header-title-color, #ffffff);
}
> .title {
font-size: 4.8rem;
color: var(--header-title-color, #ffffff);
font-family: 'boskaRegular';
}
}
</style>

View File

@@ -38,6 +38,7 @@ const svgClass = computed(() => {
width: 1em; width: 1em;
height: 1em; height: 1em;
fill: currentColor; fill: currentColor;
color: var(--svg-icon-color);
} }
.c-svg { .c-svg {
width: 100%; width: 100%;

View File

@@ -0,0 +1,121 @@
<script setup lang="ts">
import { onMounted, onUnmounted, reactive, toRefs } from "vue";
const props = defineProps({
selectList: {
type: Array,
default: () => [],
} as any,
})
//const emit = defineEmits([
//])
let data = reactive({
})
const setLike = (item,str)=>{
if(str === 'like'){
item.isLike = true
}else{
item.isLike = false
}
}
const addLibrary = (item,str)=>{
if(str === 'add'){
item.isAdd = true
}else{
item.isAdd = false
}
}
const deleteStyle = (index)=>{
props.selectList.splice(index,1)
}
const updateStyle = (item,index)=>{
props.selectList[index] = {
id:item.id,
imgList:[
'https://www.minio-api.aida.com.hk/aida-collection-element/83/Printboard/2cbd8c93-c759-4565-92ab-d066bc5f70a4.png?response-content-type=image%2Fpng&response-content-disposition=inline&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=admin%2F20251009%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20251009T025033Z&X-Amz-Expires=86400&X-Amz-SignedHeaders=host&X-Amz-Signature=806fef8c43183a528cd2033226523abc4f7b4f69040cd8952294534a98f67c6a',
'https://www.minio-api.aida.com.hk/aida-collection-element/83/Printboard/2cbd8c93-c759-4565-92ab-d066bc5f70a4.png?response-content-type=image%2Fpng&response-content-disposition=inline&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=admin%2F20251009%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20251009T025033Z&X-Amz-Expires=86400&X-Amz-SignedHeaders=host&X-Amz-Signature=806fef8c43183a528cd2033226523abc4f7b4f69040cd8952294534a98f67c6a',
'https://www.minio-api.aida.com.hk/aida-collection-element/83/Printboard/2cbd8c93-c759-4565-92ab-d066bc5f70a4.png?response-content-type=image%2Fpng&response-content-disposition=inline&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=admin%2F20251009%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20251009T025033Z&X-Amz-Expires=86400&X-Amz-SignedHeaders=host&X-Amz-Signature=806fef8c43183a528cd2033226523abc4f7b4f69040cd8952294534a98f67c6a',
'https://www.minio-api.aida.com.hk/aida-collection-element/83/Printboard/2cbd8c93-c759-4565-92ab-d066bc5f70a4.png?response-content-type=image%2Fpng&response-content-disposition=inline&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=admin%2F20251009%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20251009T025033Z&X-Amz-Expires=86400&X-Amz-SignedHeaders=host&X-Amz-Signature=806fef8c43183a528cd2033226523abc4f7b4f69040cd8952294534a98f67c6a',
],
isLike: false,
isAdd: false,
}
}
onMounted(()=>{
})
onUnmounted(()=>{
})
defineExpose({})
const {} = toRefs(data);
</script>
<template>
<div class="list">
<div class="item" v-for="(item,index) in selectList" :key="item.id">
<div class="imgBox">
<img v-for="(img,index) in item?.imgList" :key="index" :src="img" alt="">
</div>
<div class="btn">
<div>
<SvgIcon v-if="!item.isLike" @click.stop="setLike(item,'like')" name="noLike" size="40" />
<SvgIcon v-else name="like" @click.stop="setLike(item,'noLike')" color="#FF4949" size="40" />
</div>
<div>
<SvgIcon @click.stop="updateStyle(item,index)" name="update" size="40" />
</div>
<div>
<SvgIcon v-if="!item.isAdd" @click.stop="addLibrary(item,'add')" name="add" size="40" />
<SvgIcon v-else @click.stop="addLibrary(item,'delete')" name="confirmation" size="40" />
</div>
<div>
<SvgIcon @click.stop="deleteStyle(index)" name="delete" size="40" />
</div>
</div>
</div>
</div>
</template>
<style lang="less" scoped>
.list{
> .item{
width: 100%;
position: relative;
margin-bottom: 5.8rem;
height: 29rem;
display: flex;
align-items: center;
&:last-child{
margin-bottom: 0;
}
> .imgBox{
flex: 1;
display: flex;
height: 100%;
justify-content: space-between;
align-items: center;
> img{
height: 26rem;
object-fit: cover;
// object-fit: contain;
width: calc((100% - 1.4rem * 3) / 4);
}
}
> .btn{
margin-left: 7rem;
> div{
color: #989898;
margin-bottom: 2.6rem;
&:last-child{
margin-bottom: 0;
}
&:hover{
color: #000;
}
}
}
}
}
</style>

View File

@@ -7,6 +7,19 @@ const router = createRouter({
path: '/', path: '/',
redirect: '/workshop' redirect: '/workshop'
}, },
{
path: '/login',
component: () => import('@/views/login/LoginPage.vue')
},
{
path: '/signup',
component: () => import('@/views/login/SignupPage.vue')
},
{ path: '/welcome', component: () => import('@/views/login/WelcomePage.vue') },
{
path: '/stylist',
component: () => import('@/views/stylist/index.vue')
},
{ {
path: '/workshop', path: '/workshop',
name: 'Workshop', name: 'Workshop',
@@ -22,21 +35,29 @@ const router = createRouter({
path: '/workshop/selectStyle', path: '/workshop/selectStyle',
name: 'SelectStyle', name: 'SelectStyle',
component: () => import('../views/Workshop/selectStyle.vue') component: () => import('../views/Workshop/selectStyle.vue')
},
{
path: '/workshop/selectModel',
name: 'SelectModel',
component: () => import('../views/Workshop/selectModel.vue')
},
{
path: '/workshop/selectModelContinue',
name: 'SelectModelContinue',
component: () => import('../views/Workshop/selectModelContinue.vue')
},
{
path: '/workshop/uploadFace',
name: 'uploadFace',
component: () => import('../views/Workshop/uploadFace/index.vue')
},
{
path: '/workshop/customize',
name: 'customize',
component: () => import('../views/Workshop/customize/index.vue')
} }
] ]
},
{
path: '/login',
component: () => import('@/views/login/LoginPage.vue')
},
{
path: '/signup',
component: () => import('@/views/login/SignupPage.vue')
},
{ path: '/welcome', component: () => import('@/views/login/WelcomePage.vue') },
{
path:'/stylist',
component: () => import('@/views/stylist/index.vue')
} }
] ]
}) })

View File

@@ -1,6 +1,6 @@
import { getUniversalZoomLevel } from '@/utils/tools' import { getUniversalZoomLevel } from '@/utils/tools'
let flexible = (designWidth, maxWidth,minWidth) =>{ let flexible = (designWidth) =>{
var doc = document, win = window, docEl = doc.documentElement, remStyle = document.createElement("style"), tid; var doc = document, win = window, docEl = doc.documentElement, remStyle = document.createElement("style"), tid;
designWidth = designWidth || 1080; designWidth = designWidth || 1080;
// maxWidth = maxWidth || 1920; // maxWidth = maxWidth || 1920;
@@ -19,7 +19,7 @@ let flexible = (designWidth, maxWidth,minWidth) =>{
// }else{ // }else{
// designWidth = 375 // designWidth = 375
// } // }
var rem = Math.round(width * 10 / designWidth); var rem = (width * 10 / designWidth).toFixed(2);
docEl.style.fontSize = rem+'px' docEl.style.fontSize = rem+'px'
remStyle.innerHTML = 'html{font-size:' + rem + 'px;}'; remStyle.innerHTML = 'html{font-size:' + rem + 'px;}';
} }

View File

@@ -0,0 +1,117 @@
<script setup lang="ts">
import HeaderTitle from '@/components/HeaderTitle.vue'
import { ref } from 'vue'
const faceUrl = ref('')
</script>
<template>
<header-title />
<div class="session">
<div class="link">
<span>Home</span>
<span>Library</span>
</div>
<div class="title">Customize your Look!</div>
<p class="tip">Refine your Look</p>
<!-- 照片 -->
<div class="picture">
<img :src="faceUrl" />
</div>
<div class="btns">
<button @click="handleUploadFace">Re-try</button>
<button @click="handleGenerate">Generate</button>
</div>
</div>
<div class="footer">
<button>Continue</button>
</div>
</template>
<style scoped lang="less">
.header-title {
--header-title-color: #fff;
--header-title-background: #000;
}
.session {
width: 100%;
position: relative;
color: #000;
display: flex;
flex-direction: column;
align-items: center;
> .link {
padding: 2rem 5.4rem 0;
width: 100%;
> span {
font-family: satoshiRegular;
font-size: 3rem;
vertical-align: middle;
text-decoration: underline;
text-underline-offset: 0.8rem;
margin-right: 4.4rem;
}
}
> .title {
margin-top: 5.4rem;
font-family: satoshiBold;
font-size: 8.4rem;
text-align: center;
line-height: 124%;
}
> .tip {
margin-top: 0.56rem;
font-family: satoshiRegular;
font-size: 3.74rem;
line-height: 124%;
}
> .picture {
margin: 7.8rem 0;
width: 65.3rem;
height: 86.5rem;
border-radius: 1rem;
backdrop-filter: blur(5.27rem);
box-shadow: 1.9rem 2.3rem 1.66rem 0.23rem -0.3rem 0.23rem #36180c40;
border: 0.439rem solid #fff;
// border-image: linear-gradient(90deg,#BF926E94, #ffffff) 1;
display: flex;
align-items: center;
justify-content: center;
> img {
width: 58.9rem;
height: 79.2rem;
border-radius: 1rem;
border: 0.2rem solid #d9d9d9;
object-fit: contain;
}
}
> .btns {
}
}
.footer {
position: fixed;
width: 100%;
bottom: 0;
left: 0;
height: 11.2rem;
background-color: #000;
display: flex;
align-items: center;
justify-content: flex-end;
> button {
width: 24.6rem;
height: 5.9rem;
border-radius: 0.7rem;
box-sizing: content-box;
border: 0.3rem solid #fff;
background: transparent;
font-family: satoshiRegular;
font-weight: 400;
font-size: 4rem;
color: #fff;
margin-right: 5rem;
&:active {
opacity: 0.7;
}
}
}
</style>

View File

@@ -0,0 +1,108 @@
<script setup lang="ts">
import HeaderTitle from '@/components/HeaderTitle.vue'
import { ref } from 'vue'
const faceUrl = ref('')
</script>
<template>
<header-title />
<div class="session">
<div class="link">
<span>Home</span>
<span>Library</span>
</div>
</div>
<div class="footer">
<button>Continue</button>
</div>
</template>
<style scoped lang="less">
.header-title {
--header-title-color: #fff;
--header-title-background: #000;
}
.session {
width: 100%;
position: relative;
color: #000;
display: flex;
flex-direction: column;
align-items: center;
> .link {
padding: 2rem 5.4rem 0;
width: 100%;
> span {
font-family: satoshiRegular;
font-size: 3rem;
vertical-align: middle;
text-decoration: underline;
text-underline-offset: 0.8rem;
margin-right: 4.4rem;
}
}
> .title {
margin-top: 5.4rem;
font-family: satoshiBold;
font-size: 8.4rem;
text-align: center;
line-height: 124%;
}
> .tip {
margin-top: 0.56rem;
font-family: satoshiRegular;
font-size: 3.74rem;
line-height: 124%;
}
> .picture {
margin: 7.8rem 0;
width: 65.3rem;
height: 86.5rem;
border-radius: 1rem;
backdrop-filter: blur(5.27rem);
box-shadow: 1.9rem 2.3rem 1.66rem 0.23rem -0.3rem 0.23rem #36180c40;
border: 0.439rem solid #fff;
// border-image: linear-gradient(90deg,#BF926E94, #ffffff) 1;
display: flex;
align-items: center;
justify-content: center;
> img {
width: 58.9rem;
height: 79.2rem;
border-radius: 1rem;
border: 0.2rem solid #d9d9d9;
object-fit: contain;
}
}
> .btns {
}
}
.footer {
position: fixed;
width: 100%;
bottom: 0;
left: 0;
height: 11.2rem;
background-color: #000;
display: flex;
align-items: center;
justify-content: flex-end;
> button {
width: 24.6rem;
height: 5.9rem;
border-radius: 0.7rem;
box-sizing: content-box;
border: 0.3rem solid #fff;
background: transparent;
font-family: satoshiRegular;
font-weight: 400;
font-size: 4rem;
color: #fff;
margin-right: 5rem;
&:active {
opacity: 0.7;
}
}
}
</style>

View File

@@ -23,5 +23,6 @@ const {} = toRefs(data);
width: 100%; width: 100%;
height: 100%; height: 100%;
position: relative; position: relative;
font-family: 'satoshiRegular';
} }
</style> </style>

View File

@@ -0,0 +1,129 @@
<script setup lang="ts">
import { onMounted, onUnmounted, reactive, toRefs } from "vue";
//const props = defineProps({
//})
//const emit = defineEmits([
//])
let data = reactive({
modelList:
[
{
id:1,
imgUrl:'https://www.minio-api.aida.com.hk/aida-sys-image/models/female/2e4815b9-1191-419d-94ed-5771239ca4a5.png?response-content-type=image%2Fpng&response-content-disposition=inline&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=admin%2F20251009%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20251009T012922Z&X-Amz-Expires=86400&X-Amz-SignedHeaders=host&X-Amz-Signature=e5bfc4ad3a9dbad5ea3bbe82a4ba9e081bcc14520269e7a1534bca30871774a4',
},
{
id:2,
imgUrl:'https://www.minio-api.aida.com.hk/aida-sys-image/models/female/2e4815b9-1191-419d-94ed-5771239ca4a5.png?response-content-type=image%2Fpng&response-content-disposition=inline&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=admin%2F20251009%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20251009T012922Z&X-Amz-Expires=86400&X-Amz-SignedHeaders=host&X-Amz-Signature=e5bfc4ad3a9dbad5ea3bbe82a4ba9e081bcc14520269e7a1534bca30871774a4',
},
{
id:3,
imgUrl:'https://www.minio-api.aida.com.hk/aida-sys-image/models/female/2e4815b9-1191-419d-94ed-5771239ca4a5.png?response-content-type=image%2Fpng&response-content-disposition=inline&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=admin%2F20251009%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20251009T012922Z&X-Amz-Expires=86400&X-Amz-SignedHeaders=host&X-Amz-Signature=e5bfc4ad3a9dbad5ea3bbe82a4ba9e081bcc14520269e7a1534bca30871774a4',
},
{
id:4,
imgUrl:'https://www.minio-api.aida.com.hk/aida-sys-image/models/female/2e4815b9-1191-419d-94ed-5771239ca4a5.png?response-content-type=image%2Fpng&response-content-disposition=inline&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=admin%2F20251009%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20251009T012922Z&X-Amz-Expires=86400&X-Amz-SignedHeaders=host&X-Amz-Signature=e5bfc4ad3a9dbad5ea3bbe82a4ba9e081bcc14520269e7a1534bca30871774a4',
},
{
id:5,
imgUrl:'https://www.minio-api.aida.com.hk/aida-sys-image/models/female/2e4815b9-1191-419d-94ed-5771239ca4a5.png?response-content-type=image%2Fpng&response-content-disposition=inline&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=admin%2F20251009%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20251009T012922Z&X-Amz-Expires=86400&X-Amz-SignedHeaders=host&X-Amz-Signature=e5bfc4ad3a9dbad5ea3bbe82a4ba9e081bcc14520269e7a1534bca30871774a4',
},
{
id:6,
imgUrl:'https://www.minio-api.aida.com.hk/aida-sys-image/models/female/2e4815b9-1191-419d-94ed-5771239ca4a5.png?response-content-type=image%2Fpng&response-content-disposition=inline&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=admin%2F20251009%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20251009T012922Z&X-Amz-Expires=86400&X-Amz-SignedHeaders=host&X-Amz-Signature=e5bfc4ad3a9dbad5ea3bbe82a4ba9e081bcc14520269e7a1534bca30871774a4',
},
],
selectedModelId: null,
})
const setSelectedModelId = (item)=>{
data.selectedModelId = item.id;
}
onMounted(()=>{
})
onUnmounted(()=>{
})
defineExpose({})
const { modelList, selectedModelId } = toRefs(data);
</script>
<template>
<div class="selectModel">
<div class="text">
<div class="title">
Pick a Model Photo!
</div>
<div class="info">
Try one of our sample images
</div>
</div>
<div class="selectContent">
<div class="modelList">
<div v-for="item in modelList" :key="item.id" class="item" @click.stop="setSelectedModelId(item)">
<img :src="item.imgUrl" alt="">
<div class="icon" v-if="item.id == selectedModelId">
<SvgIcon name="modelSelected" size="60" />
</div>
</div>
</div>
</div>
</div>
</template>
<style lang="less" scoped>
.selectModel{
width: 100%;
height: 100%;
position: relative;
display: flex;
flex-direction: column;
> .text{
text-align: center;
width: 100%;
margin-top: 7rem;
margin-bottom: 4rem;
> .title{
font-family: satoshiBold;
font-weight: 700;
font-size: 9.6rem;
line-height: 124%;
}
> .info{
font-size: 4rem;
font-weight: 400;
line-height: 124%;
margin-top: 1.3rem;
}
}
> .selectContent{
flex: 1;
overflow-y: auto;
padding: 0 11.8rem;
> .modelList{
padding: .6rem 2rem;
display: flex;
flex-wrap: wrap;
justify-content: space-between;
align-items: center;
> .item{
width: calc((100% - 2.5rem * 2) / 3);
border: 2px solid #D9D9D9;
border-radius: 1rem;
margin-bottom: 5.4rem;
height: 75rem;
> img{
width: 100%;
height: 100%;
object-fit: cover;
}
> .icon{
position: absolute;
width: 6rem;
height: 6rem;
bottom: -1.8rem;
right: -2.1rem;
}
}
}
}
}
</style>

View File

@@ -0,0 +1,118 @@
<script setup lang="ts">
import { onMounted, onUnmounted, reactive, toRefs } from "vue";
//const props = defineProps({
//})
//const emit = defineEmits([
//])
// let data = reactive({
// modelList:
// [
// ],
// selectedModelId: null,
// })
// const setSelectedModelId = (item)=>{
// data.selectedModelId = item.id;
// }
onMounted(()=>{
})
onUnmounted(()=>{
})
defineExpose({})
// const { modelList, selectedModelId } = toRefs(data);
</script>
<template>
<div class="selectModelContinue">
<div class="router">
<div>Home</div>
<div>Liberay</div>
</div>
<div class="text">
<div class="title">
Go with this Look?
</div>
</div>
<div class="selectContent">
<div class="history"></div>
<div class="modelBox">
<div></div>
<div class="model">
<img src="" alt="">
</div>
</div>
<div class="again">
Re-try with a new model?
</div>
</div>
</div>
</template>
<style lang="less" scoped>
.selectModelContinue{
width: 100%;
height: 100%;
position: relative;
display: flex;
flex-direction: column;
> .router{
margin-top: 3rem;
margin-left: 5.4rem;
display: flex;
> div{
margin-right: 4.4rem;
font-size: 3rem;
font-family: satoshiRegular;
font-weight: 400;
&:last-child{
margin-right: 0;
}
}
}
> .text{
text-align: center;
width: 100%;
margin-top: 6rem;
> .title{
font-family: satoshiBold;
font-weight: 700;
font-size: 9.6rem;
line-height: 124%;
}
}
> .selectContent{
flex: 1;
overflow-y: auto;
padding: 0 14.1rem;
margin-top: 1.5rem;
> .history{
}
> .model{
margin-top: 2.5rem;
> .model{
border: 2px solid #D9D9D9;
height: 79.8rem;
position: relative;
> img{
width: 100%;
height: 100%;
object-fit: contain;
}
}
}
> .again{
margin-top: 5.6rem;
font-family: satoshiMedium;
padding: 0 10.5rem;
line-height: 10.4rem;
background-color: #000;
color: #fff;
border-radius: 10rem;
font-size: 4.8rem;
}
}
}
</style>

View File

@@ -1,23 +1,78 @@
<script setup lang="ts"> <script setup lang="ts">
import { ref, onMounted, onUnmounted, reactive, toRefs } from "vue"; import { onMounted, onUnmounted, reactive, toRefs } from "vue";
import SelectItem from "@/components/selectStyle/selectItem.vue";
//const props = defineProps({ //const props = defineProps({
//}) //})
//const emit = defineEmits([ //const emit = defineEmits([
//]) //])
let data = reactive({ let data = reactive({
selectList:
[
{
id:1,
imgList:[
'https://www.minio-api.aida.com.hk/aida-users/83/print/4690d6b7-5cc4-47da-bef6-f4585c9c2fdf-3-83.png?response-content-type=image%2Fpng&response-content-disposition=inline&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=admin%2F20251009%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20251009T024954Z&X-Amz-Expires=86400&X-Amz-SignedHeaders=host&X-Amz-Signature=b57237c2cd7f5b2eb4216de2a99d0bd8827a1289613b5f0813acf1e414a6c334',
'https://www.minio-api.aida.com.hk/aida-users/83/print/4690d6b7-5cc4-47da-bef6-f4585c9c2fdf-3-83.png?response-content-type=image%2Fpng&response-content-disposition=inline&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=admin%2F20251009%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20251009T024954Z&X-Amz-Expires=86400&X-Amz-SignedHeaders=host&X-Amz-Signature=b57237c2cd7f5b2eb4216de2a99d0bd8827a1289613b5f0813acf1e414a6c334',
'https://www.minio-api.aida.com.hk/aida-users/83/print/4690d6b7-5cc4-47da-bef6-f4585c9c2fdf-3-83.png?response-content-type=image%2Fpng&response-content-disposition=inline&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=admin%2F20251009%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20251009T024954Z&X-Amz-Expires=86400&X-Amz-SignedHeaders=host&X-Amz-Signature=b57237c2cd7f5b2eb4216de2a99d0bd8827a1289613b5f0813acf1e414a6c334',
'https://www.minio-api.aida.com.hk/aida-users/83/print/4690d6b7-5cc4-47da-bef6-f4585c9c2fdf-3-83.png?response-content-type=image%2Fpng&response-content-disposition=inline&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=admin%2F20251009%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20251009T024954Z&X-Amz-Expires=86400&X-Amz-SignedHeaders=host&X-Amz-Signature=b57237c2cd7f5b2eb4216de2a99d0bd8827a1289613b5f0813acf1e414a6c334',
],
isLike: false,
isAdd: false,
},
{
id:2,
imgList:[
'https://www.minio-api.aida.com.hk/aida-users/83/print/4690d6b7-5cc4-47da-bef6-f4585c9c2fdf-3-83.png?response-content-type=image%2Fpng&response-content-disposition=inline&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=admin%2F20251009%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20251009T024954Z&X-Amz-Expires=86400&X-Amz-SignedHeaders=host&X-Amz-Signature=b57237c2cd7f5b2eb4216de2a99d0bd8827a1289613b5f0813acf1e414a6c334',
'https://www.minio-api.aida.com.hk/aida-users/83/print/4690d6b7-5cc4-47da-bef6-f4585c9c2fdf-3-83.png?response-content-type=image%2Fpng&response-content-disposition=inline&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=admin%2F20251009%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20251009T024954Z&X-Amz-Expires=86400&X-Amz-SignedHeaders=host&X-Amz-Signature=b57237c2cd7f5b2eb4216de2a99d0bd8827a1289613b5f0813acf1e414a6c334',
'https://www.minio-api.aida.com.hk/aida-users/83/print/4690d6b7-5cc4-47da-bef6-f4585c9c2fdf-3-83.png?response-content-type=image%2Fpng&response-content-disposition=inline&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=admin%2F20251009%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20251009T024954Z&X-Amz-Expires=86400&X-Amz-SignedHeaders=host&X-Amz-Signature=b57237c2cd7f5b2eb4216de2a99d0bd8827a1289613b5f0813acf1e414a6c334',
'https://www.minio-api.aida.com.hk/aida-users/83/print/4690d6b7-5cc4-47da-bef6-f4585c9c2fdf-3-83.png?response-content-type=image%2Fpng&response-content-disposition=inline&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=admin%2F20251009%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20251009T024954Z&X-Amz-Expires=86400&X-Amz-SignedHeaders=host&X-Amz-Signature=b57237c2cd7f5b2eb4216de2a99d0bd8827a1289613b5f0813acf1e414a6c334',
],
isLike: false,
isAdd: false,
},
{
id:2,
imgList:[
'https://www.minio-api.aida.com.hk/aida-users/83/print/4690d6b7-5cc4-47da-bef6-f4585c9c2fdf-3-83.png?response-content-type=image%2Fpng&response-content-disposition=inline&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=admin%2F20251009%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20251009T024954Z&X-Amz-Expires=86400&X-Amz-SignedHeaders=host&X-Amz-Signature=b57237c2cd7f5b2eb4216de2a99d0bd8827a1289613b5f0813acf1e414a6c334',
'https://www.minio-api.aida.com.hk/aida-users/83/print/4690d6b7-5cc4-47da-bef6-f4585c9c2fdf-3-83.png?response-content-type=image%2Fpng&response-content-disposition=inline&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=admin%2F20251009%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20251009T024954Z&X-Amz-Expires=86400&X-Amz-SignedHeaders=host&X-Amz-Signature=b57237c2cd7f5b2eb4216de2a99d0bd8827a1289613b5f0813acf1e414a6c334',
'https://www.minio-api.aida.com.hk/aida-users/83/print/4690d6b7-5cc4-47da-bef6-f4585c9c2fdf-3-83.png?response-content-type=image%2Fpng&response-content-disposition=inline&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=admin%2F20251009%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20251009T024954Z&X-Amz-Expires=86400&X-Amz-SignedHeaders=host&X-Amz-Signature=b57237c2cd7f5b2eb4216de2a99d0bd8827a1289613b5f0813acf1e414a6c334',
'https://www.minio-api.aida.com.hk/aida-users/83/print/4690d6b7-5cc4-47da-bef6-f4585c9c2fdf-3-83.png?response-content-type=image%2Fpng&response-content-disposition=inline&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=admin%2F20251009%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20251009T024954Z&X-Amz-Expires=86400&X-Amz-SignedHeaders=host&X-Amz-Signature=b57237c2cd7f5b2eb4216de2a99d0bd8827a1289613b5f0813acf1e414a6c334',
],
isLike: false,
isAdd: false,
},
{
id:2,
imgList:[
'https://www.minio-api.aida.com.hk/aida-users/83/print/4690d6b7-5cc4-47da-bef6-f4585c9c2fdf-3-83.png?response-content-type=image%2Fpng&response-content-disposition=inline&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=admin%2F20251009%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20251009T024954Z&X-Amz-Expires=86400&X-Amz-SignedHeaders=host&X-Amz-Signature=b57237c2cd7f5b2eb4216de2a99d0bd8827a1289613b5f0813acf1e414a6c334',
'https://www.minio-api.aida.com.hk/aida-users/83/print/4690d6b7-5cc4-47da-bef6-f4585c9c2fdf-3-83.png?response-content-type=image%2Fpng&response-content-disposition=inline&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=admin%2F20251009%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20251009T024954Z&X-Amz-Expires=86400&X-Amz-SignedHeaders=host&X-Amz-Signature=b57237c2cd7f5b2eb4216de2a99d0bd8827a1289613b5f0813acf1e414a6c334',
'https://www.minio-api.aida.com.hk/aida-users/83/print/4690d6b7-5cc4-47da-bef6-f4585c9c2fdf-3-83.png?response-content-type=image%2Fpng&response-content-disposition=inline&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=admin%2F20251009%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20251009T024954Z&X-Amz-Expires=86400&X-Amz-SignedHeaders=host&X-Amz-Signature=b57237c2cd7f5b2eb4216de2a99d0bd8827a1289613b5f0813acf1e414a6c334',
'https://www.minio-api.aida.com.hk/aida-users/83/print/4690d6b7-5cc4-47da-bef6-f4585c9c2fdf-3-83.png?response-content-type=image%2Fpng&response-content-disposition=inline&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=admin%2F20251009%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Date=20251009T024954Z&X-Amz-Expires=86400&X-Amz-SignedHeaders=host&X-Amz-Signature=b57237c2cd7f5b2eb4216de2a99d0bd8827a1289613b5f0813acf1e414a6c334',
],
isLike: false,
isAdd: false,
},
]
}) })
onMounted(()=>{ onMounted(()=>{
}) })
onUnmounted(()=>{ onUnmounted(()=>{
}) })
defineExpose({}) defineExpose({})
const {} = toRefs(data); const { selectList } = toRefs(data);
</script> </script>
<template> <template>
<div class="selectStyle"> <div class="selectStyle">
<div class="title"> <div class="text">
<SvgIcon name="Vector" color="red" size="30" /> <div class="title">
12312 Whats your Style?
</div>
<div class="info">
Select the outfit that matches you the most.
</div>
</div>
<div class="selectContent">
<SelectItem :selectList="selectList" />
</div> </div>
</div> </div>
</template> </template>
@@ -26,5 +81,26 @@ const {} = toRefs(data);
width: 100%; width: 100%;
height: 100%; height: 100%;
position: relative; position: relative;
> .text{
text-align: center;
width: 100%;
margin-top: 7rem;
margin-bottom: 4.8rem;
> .title{
font-family: satoshiBold;
font-weight: 700;
font-size: 9.6rem;
line-height: 124%;
}
> .info{
font-size: 4rem;
font-weight: 400;
line-height: 124%;
margin-top: 1.3rem;
}
}
.selectContent{
padding: 0 4rem;
}
} }
</style> </style>

View File

@@ -0,0 +1,195 @@
<script setup lang="ts">
import HeaderTitle from '@/components/HeaderTitle.vue'
import { ref } from 'vue'
import {useRouter} from 'vue-router'
const router = useRouter()
const faceUrl = ref('')
// 上传照片
const handleUploadFace = () => {
const input = document.createElement('input')
input.type = 'file'
input.accept = 'image/*'
input.capture = 'camera'
input.click()
input.onchange = (e: any) => {
const file = e.target.files[0]
if (!file) return
const reader = new FileReader()
reader.readAsDataURL(file)
reader.onload = () => {
faceUrl.value = reader.result as string
}
}
}
// 完成上传
const handleFinish = () => {
console.log('完成上传')
router.push({name:'customize'})
}
// 生成照片
const handleGenerate = () => {
console.log('生成照片')
router.push({name:'customize'})
}
</script>
<template>
<header-title />
<!-- 上传照片 -->
<div class="session session_1" v-show="!faceUrl">
<img src="@/assets/images/workshop/bg/upload_bg.png" class="bg" />
<div class="texts">
<p class="title">Keep Styling with AI?</p>
<p class="desc">
Would you like to keep playing with<br />
our personalized AI tools?
</p>
</div>
<div class="btns">
<button @click="handleUploadFace">Upload Face</button>
<button @click="handleFinish">Finish</button>
</div>
</div>
<!-- 展示照片 -->
<div class="session session_2" v-show="faceUrl">
<img src="@/assets/images/workshop/bg/picture_bg.png" class="bg" />
<div class="link">
<span>Home</span>
<span>Library</span>
</div>
<div class="content">
<div class="title">
Upload your Face<br />
to Try-on
</div>
<!-- 照片 -->
<div class="picture">
<img :src="faceUrl" />
</div>
<div class="btns">
<button @click="handleUploadFace">Re-try</button>
<button @click="handleGenerate">Generate</button>
</div>
</div>
</div>
</template>
<style scoped lang="less">
.header-title {
--header-title-color: #000;
--header-title-background: #fff;
}
.session {
width: 100%;
position: relative;
color: #fff;
> * {
position: absolute;
}
> .bg {
position: relative;
width: 100%;
height: auto;
}
.btns {
width: 100%;
display: flex;
justify-content: center;
> button {
box-sizing: content-box;
width: 40rem;
height: 8.3rem;
border-radius: 0.7rem;
border: 0.4rem solid #fff;
background: transparent;
font-family: satoshiRegular;
font-weight: 500;
font-size: 5.5rem;
margin: 0 1.8rem;
color: #fff;
&:active {
opacity: 0.7;
}
}
}
}
.session.session_1 {
> .texts {
top: 0;
left: 0;
padding: 9.9rem 0 0 7.2rem;
font-family: 'robotoBold';
> .title {
font-weight: 700;
font-size: 8.6rem;
}
> .desc {
font-weight: 500;
font-size: 4rem;
margin-top: 3rem;
}
}
> .btns {
bottom: 23.3rem;
}
}
.session.session_2 {
> .link {
top: 2rem;
left: 5.4rem;
> span {
font-family: satoshiRegular;
font-size: 3rem;
vertical-align: middle;
text-decoration: underline;
text-underline-offset: 0.8rem;
margin-right: 4.4rem;
}
}
> .content {
top: 18.5rem;
left: 0;
width: 100%;
display: flex;
flex-direction: column;
align-items: center;
> .title {
font-family: satoshiBold;
font-size: 11rem;
text-align: center;
line-height: 124%;
}
> .picture {
margin: 7.8rem 0;
width: 65.3rem;
height: 86.5rem;
border-radius: 1rem;
backdrop-filter: blur(5.27rem);
box-shadow: 1.9rem 2.3rem 1.66rem 0.23rem -0.3rem 0.23rem #36180c40;
border: 0.439rem solid #fff;
// border-image: linear-gradient(90deg,#BF926E94, #ffffff) 1;
display: flex;
align-items: center;
justify-content: center;
> img {
width: 58.9rem;
height: 79.2rem;
border-radius: 1rem;
border: 0.2rem solid #d9d9d9;
object-fit: contain;
}
}
> .btns {
> button {
width: 34.5rem;
height: 8.6rem;
border-radius: 4.3rem;
margin: 0 5rem;
}
}
}
}
</style>