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

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;
height: 1em;
fill: currentColor;
color: var(--svg-icon-color);
}
.c-svg {
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: '/',
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',
name: 'Workshop',
@@ -22,21 +35,29 @@ const router = createRouter({
path: '/workshop/selectStyle',
name: 'SelectStyle',
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'
let flexible = (designWidth, maxWidth,minWidth) =>{
let flexible = (designWidth) =>{
var doc = document, win = window, docEl = doc.documentElement, remStyle = document.createElement("style"), tid;
designWidth = designWidth || 1080;
// maxWidth = maxWidth || 1920;
@@ -19,7 +19,7 @@ let flexible = (designWidth, maxWidth,minWidth) =>{
// }else{
// designWidth = 375
// }
var rem = Math.round(width * 10 / designWidth);
var rem = (width * 10 / designWidth).toFixed(2);
docEl.style.fontSize = 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%;
height: 100%;
position: relative;
font-family: 'satoshiRegular';
}
</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">
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 emit = defineEmits([
//])
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(()=>{
})
onUnmounted(()=>{
})
defineExpose({})
const {} = toRefs(data);
const { selectList } = toRefs(data);
</script>
<template>
<div class="selectStyle">
<div class="title">
<SvgIcon name="Vector" color="red" size="30" />
12312
<div class="text">
<div class="title">
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>
</template>
@@ -26,5 +81,26 @@ const {} = toRefs(data);
width: 100%;
height: 100%;
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>

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>