This commit is contained in:
X1627315083
2025-04-30 14:01:52 +08:00
parent ac06be639c
commit a4e040d0ff
42 changed files with 3673 additions and 715 deletions

View File

@@ -267,7 +267,7 @@ export default defineComponent({
height: 100%;
// overflow-y: auto;
padding: 0 30rem;
padding-top: 10rem;
padding-top: 7rem;
display: flex;
overflow: hidden;
.account_page_titleImg{

View File

@@ -119,6 +119,7 @@ export default defineComponent({
<style lang="less" scoped>
.account_followFans{
width: 100%;
height: 100%;
.account_followFans_title{
display: flex;
align-items: center;
@@ -131,6 +132,7 @@ export default defineComponent({
}
.account_followFans_body{
padding-bottom: 3rem;
height: 100%;
:deep(.ant-badge){
font-size: var(--aida-fsize2);
}
@@ -154,6 +156,10 @@ export default defineComponent({
background: #000;
}
}
:deep(.ant-tabs-content){
height: 100%;
overflow-y: auto;
}
}
}
</style>

View File

@@ -141,6 +141,7 @@ export default defineComponent({
}
:deep(.ant-tabs-nav){
padding: 0rem 5rem;
margin-bottom: 6rem;
&::before{
display: none;
}

View File

@@ -1,11 +1,10 @@
<template>
<div class="accountEdit_page">
<div class="accountEdit_page_body">
<div class="accountEdit_page_body_item">
<div class="accountEdit_page_body_item generalModel_state">
<div class="accountEdit_page_body_item_name">{{$t('account.Name')}}:</div>
<div class="accountEdit_page_body_item_inut" style="display: flex;justify-content: space-between;">
<div class="generalModel_state_item" style="display: flex;justify-content: space-between;">
<a-select
class="gallerySelect"
v-model:value="selectSex"
size="large"
optionFilterProp="label"
@@ -15,16 +14,17 @@
allowClear
show-search
></a-select>
<input class="login_form_input" style="width: 30%;" :class="{active:!!userDetail.occupation}" type="text" :placeholder="$t('account.plaseFirst')" v-model="surname">
<input class="login_form_input" style="width: 30%;" :class="{active:!!userDetail.occupation}" type="text" :placeholder="$t('account.plaseLast')" v-model="givenName">
<input class="" style="width: 30%;" :class="{active:!!userDetail.occupation}" type="text" :placeholder="$t('account.plaseFirst')" v-model="surname">
<input class="" style="width: 30%;" :class="{active:!!userDetail.occupation}" type="text" :placeholder="$t('account.plaseLast')" v-model="givenName">
</div>
</div>
<div class="accountEdit_page_body_item">
<div class="accountEdit_page_body_item generalModel_state">
<div class="accountEdit_page_body_item_name">{{$t('account.Country')}}:</div>
<div class="accountEdit_page_body_item_inut">
<div class="generalModel_state_item">
<a-select
v-model:value="Country"
size="large"
style="width: 100%;"
optionFilterProp="label"
:options="countryList"
placeholder="Please select"
@@ -33,10 +33,10 @@
></a-select>
</div>
</div>
<div class="accountEdit_page_body_item">
<div class="accountEdit_page_body_item generalModel_state">
<div class="accountEdit_page_body_item_name">{{$t('account.CompanyName')}}:</div>
<div class="accountEdit_page_body_item_inut">
<input type="text" v-model="CompanyName">
<div class="generalModel_state_item">
<input type="text" style="width: 100%;" v-model="CompanyName">
</div>
</div>
<div class="accountEdit_page_body_item">
@@ -165,56 +165,27 @@ export default defineComponent({
margin-bottom: 20px;
flex-direction: column;
width: 100%;
align-items: flex-start;
.generalModel_state_item{
width: 100%;
}
.gallery_btn{
margin-left: auto;
}
.gallerySelect{
box-sizing: border-box;
height: 40px;
:deep(.ant-select-selector){
height: 40px;
border: 2px solid #D0D0D0;
border-radius: 1.6rem;
align-items: center;
}
:deep(.ant-select-selector):hover{
border: 2px solid #000;
}
}
input,textarea{
textarea{
padding-left: 11px;
border-radius: 1.6rem;
border: 2px solid #D0D0D0;
width: 100%;
font-size: 2rem;
}
input{
height: 40px;
}
.accountEdit_page_body_item_name{
color: #000;
text-align: left;
font-size: 2rem;
}
.accountEdit_page_body_item_inut{
margin-top: 1.5rem;
flex: 1;
.ant-select-lg{
font-size: 2rem;
}
.ant-select{
width: 100%;
border-radius: 1.6rem;
border: 2px solid #D0D0D0;
overflow: hidden;
.ant-select-selector{
border-radius: 1.6rem;
}
:deep(.ant-select-selector ){
border: none !important;
}
}
font-weight: 600;
margin-bottom: 1.5rem;
}
}
.accountEdit_page_body_item:last-child{

View File

@@ -1,6 +1,6 @@
<template>
<div class="admin_page">
<div class="admin_table_search">
<div class="admin_table_search" :style="{height:isAwayOrUnfold?'7rem':''}">
<div class="admin_state">
<div class="admin_state_item">
<span>Create Time:</span>
@@ -98,7 +98,7 @@
</div>
</div>
<div class="admin_search">
<div class="admin_search_item" @click="searchHistoryList">
<div class="admin_search_item" @click="searchHistoryList" :style="{height:isAwayOrUnfold?'4rem':''}">
Search
</div>
<div class="admin_search_item" @click="downloadTransaction">
@@ -126,7 +126,9 @@
</div>
</div>
</div>
<div class="awayOrUnfold" :class="{active:isAwayOrUnfold}">
<span class="icon iconfont menu_icon icon-xiala" @click="()=>isAwayOrUnfold = !isAwayOrUnfold"></span>
</div>
<div class="admin_table_content" ref="historyTable">
<a-table
@resizeColumn="handleResizeColumn"
@@ -190,6 +192,7 @@ export default defineComponent({
countryList: computed(()=>{
return store.state.adminPage.country
}),
isAwayOrUnfold:false
});
let filterData: any = reactive({
rangePickerValue: [],

View File

@@ -1,6 +1,6 @@
<template>
<div class="admin_page">
<div class="admin_table_search">
<div class="admin_table_search" :style="{height:isAwayOrUnfold?'7rem':''}">
<div class="admin_state">
<div class="admin_state_item">
<span>Create Time:</span>
@@ -76,7 +76,7 @@
</div>
</div>
<div class="admin_search">
<div class="admin_search_item" @click="searchHistoryList">
<div class="admin_search_item" @click="searchHistoryList" :style="{height:isAwayOrUnfold?'4rem':''}">
Search
</div>
<div class="admin_search_item" @click="addhHistoryList">
@@ -104,7 +104,9 @@
</div>
</div>
</div>
<div class="awayOrUnfold" :class="{active:isAwayOrUnfold}">
<span class="icon iconfont menu_icon icon-xiala" @click="()=>isAwayOrUnfold = !isAwayOrUnfold"></span>
</div>
<div class="admin_table_content" ref="historyTable">
<a-table
@resizeColumn="handleResizeColumn"
@@ -168,7 +170,8 @@ export default defineComponent({
allUserList: computed(()=>{
return store.state.adminPage.allUserList
}),
allCountry:[]
allCountry:[],
isAwayOrUnfold:false
});
let filterData: any = reactive({
rangePickerValue: [],
@@ -523,5 +526,8 @@ export default defineComponent({
.admin_page .admin_table_search .admin_state {
display: flex;
flex-wrap: wrap;
}
.admin_page{
}
</style>

View File

@@ -29,7 +29,7 @@
</div>
<div class="allUserPoeration_center admin_page">
<div class="admin_state_item">
<span>Cooperator: <span>*</span></span>
<span>Cooperator:</span>
<input
v-model="cooperator"
placeholder="Please enter cooperator"
@@ -65,7 +65,7 @@
</a-space>
</div>
<div class="admin_state_item" >
<span>Maximum: <span>*</span></span>
<span>MaxRedemptions:</span>
<input
:class="{active:title != 'Add'}"
v-model="maxRedemptions"
@@ -75,7 +75,7 @@
/>
</div>
<div class="admin_state_item" >
<span>PaidCommission: <span>*</span></span>
<span>PaidCommission:</span>
<input
v-model="paidCommission"
placeholder="Please enter paidCommission"
@@ -84,7 +84,7 @@
/>
</div>
<div class="admin_state_item">
<span>Remark: <span>*</span></span>
<span>Remark:</span>
<input
v-model="remark"
placeholder="Please enter remark"
@@ -197,7 +197,7 @@ export default defineComponent({
let data
if(operations.title == 'Add'){
data = setAddData()
if(!data.commissionRate || !data.maxRedemptions || !data.timestamp || !data.percentOff)return message.warning('Please check the input box marked with *')
if(!data.commissionRate || !data.timestamp || !data.percentOff)return message.warning('Please check the input box marked with *')
Https.axiosPost(Https.httpUrls.createCoupon, data).then(
(rv) => {
if (rv) {
@@ -208,7 +208,6 @@ export default defineComponent({
);
}else{
data = setEditData()
if(!data.cooperator || !data.paidCommission || !data.remark )return message.warning('Please check the input box marked with *')
Https.axiosGet(Https.httpUrls.updatePromCodeInfo,{params:data}).then(
(rv) => {
if (rv) {

View File

@@ -90,6 +90,13 @@
style="margin-right: 2rem;"
>
Edit
</div>
<div
class="operate_item"
@click="deletePromCode(record)"
style="margin-right: 2rem;"
>
Delete
</div>
</div>
</template>
@@ -99,8 +106,10 @@
</div>
</template>
<script lang="ts">
import { defineComponent, ref, reactive, toRefs, computed, toRef } from "vue";
import { defineComponent, ref, reactive, toRefs, computed, toRef, createVNode } from "vue";
import { ExclamationCircleOutlined } from '@ant-design/icons-vue';
import { useStore } from "vuex";
import { Modal,message,Upload,CascaderProps } from 'ant-design-vue';
import { Https } from "@/tool/https";
import allUserPoerationsVue from "./addAllUser.vue";
export default defineComponent({
@@ -267,6 +276,7 @@ export default defineComponent({
let setAagree = (data:any) =>{
dataDom.allUserPoerationsVue.init('Edit',data)
}
return {
...toRefs(dataDom),
rangePickerValue,
@@ -320,7 +330,22 @@ export default defineComponent({
this.currentPage = 1;
this.gettrialList();
},
deletePromCode(value:any){
let this_ = this
Modal.confirm({
title: 'Are you sure you want to delete this discount record',
icon: createVNode(ExclamationCircleOutlined),
okText: 'Yes',
cancelText: 'No',
mask:false,
centered:true,
onOk() {
Https.axiosGet(Https.httpUrls.deletePromCode,{params:{id:value.id}}).then((res:any)=>{
this_.gettrialList()
})
}
});
},
//获取列表
gettrialList() {
// let startTime: any = this.rangeTimeValue[0]

View File

@@ -27,7 +27,7 @@
{{ item.name }}
</div>
<div @click.stop="canvasGeneral.layerDelete(index,item.id)" :class="{noDelete:canvasGeneral.layer.list.length == 1}">
<i class="fi fi-rr-trash icon_delete"></i>
<i class="fi fi-rr-trash icon_delete" style="height: 100%;padding: 0;"></i>
</div>
</div>
</div>

View File

@@ -18,6 +18,7 @@
<div style="display: flex; justify-content: center; margin-top: 2rem;">
<div class="gallery_btn" style="margin: 0 2rem;" @click="setShare">{{ $t('exportModel.Share') }}</div>
<div class="gallery_btn" style="margin: 0 2rem;" @click="setExport">{{ $t('exportModel.Export') }}</div>
<div class="gallery_btn" style="margin: 0 2rem;" @click="setExport">{{ $t('exportModel.Export') }}</div>
</div>
<liquefaction ref="liquefaction" @submitLiquefaction="submitLiquefaction"></liquefaction>
<publish ref="publish" @clearPublish="()=>{}"></publish>

View File

@@ -85,7 +85,7 @@
</template>
<script lang="ts">
import { defineComponent,computed,onBeforeUnmount,provide,nextTick,createVNode,toRefs, reactive} from 'vue'
import { defineComponent,computed,onBeforeUnmount,provide,nextTick,createVNode,toRefs, reactive, onMounted} from 'vue'
import detailLeft from './detailLeft/index.vue'
import model from './model/index.vue'
import detailRight from './detailRight/index.vue'
@@ -363,11 +363,24 @@ export default defineComponent({
const canvasReload = ()=>{
detailData.childKey += 1
}
let time = null as any
const handleResize = ()=>{
clearTimeout(time)
time = setTimeout(()=>{
store.commit('DesignDetailCopy/setDesignDetail',detailData.designDetail)
},1000)
}
onMounted(()=>{
window.addEventListener('resize', handleResize);
})
onBeforeUnmount(()=>{
sessionStorage.removeItem('oppositeRevocation')
sessionStorage.removeItem('revocation')
store.commit('DesignDetailCopy/clearDesignDetail')
window.removeEventListener('resize', handleResize);
})
return{
...toRefs(detailDom),
...toRefs(detailData),
@@ -434,8 +447,8 @@ export default defineComponent({
.designDetailModal{
position: absolute;
// top: -100%;
width: 100%;
height: 100%;
width: 100.5%;
height: 100.5%;
left: 50%;
top: 50%;
transform: translate(-50%,-50%);
@@ -445,6 +458,7 @@ export default defineComponent({
> .ant-modal-centered{
> .fullScreen{
> .ant-modal-content{
box-shadow: none;
> .ant-modal-body{
padding: 0;
}

View File

@@ -26,7 +26,7 @@
</div>
</template>
<script lang="ts">
import { defineComponent,computed,ref,inject,nextTick,createVNode,toRefs, reactive, onMounted} from 'vue'
import { defineComponent,computed,ref,inject,onBeforeUnmount,createVNode,toRefs, reactive, onMounted} from 'vue'
// import setDesignItem from '@/component/Detail/setDesignItem2.vue'
import { ExclamationCircleOutlined } from '@ant-design/icons-vue';
import { Https } from "@/tool/https";
@@ -102,6 +102,22 @@ export default defineComponent({
const mousedownDesignImg = ()=>{
getDetailListData.imgDesignImg = !getDetailListData.imgDesignImg
}
let time = null as any
const handleResize = ()=>{
clearTimeout(time)
time = setTimeout(()=>{
store.commit('DesignDetailCopy/setDesignDetail',getDetailListData.designDetail)
getDetailListDom.position.updataPosition()
},1000)
}
onMounted(()=>{
window.addEventListener('resize', handleResize);
})
onBeforeUnmount(()=>{
window.removeEventListener('resize', handleResize);
})
return{
...toRefs(detailData),
...toRefs(getDetailListData),
@@ -148,9 +164,11 @@ export default defineComponent({
border-radius: 1rem;
padding: .7rem ;
flex-shrink: 0;
flex: 1;
overflow: hidden;
max-height: 4rem;
> i{
font-size: 2rem;
line-height: 4rem;
cursor: pointer;
padding: 1.5rem;
display: flex;

View File

@@ -385,7 +385,6 @@ export default defineComponent({
.molepositon{
width: 30rem;
height: 66rem;
// height: 80rem;
display: flex;
flex-direction: column;
// margin: auto 0;
@@ -401,10 +400,9 @@ export default defineComponent({
height: auto;
position: relative;
height: 100%;
// overflow: hidden;
display: flex;
align-items: center;
justify-content: center;
// display: flex;
// align-items: center;
// justify-content: center;
>img{
z-index: 2;
position: relative;
@@ -420,12 +418,12 @@ export default defineComponent({
.detail_modal_item_front,.designOpenrtion_print{
z-index: 2;
height: 100%;
width: 100%;
img{
width: 100%;
height: 100%;
// width: 100%;
// height: auto;
// height: 100%;
width: 100%;
height: auto;
float: left;
user-select:none;
-webkit-user-drag: none;

View File

@@ -661,12 +661,11 @@ export default defineComponent({
});
},
setGenerate(dataList:any){
let data = dataList
let dataNum = dataList.length
let state = true
this.generateTime = setInterval(()=>{
if(!this.isGenerate || !this.remGenerate)return
if(!this.isGenerate)return
if(!state)return
state = false
Https.axiosPost(Https.httpUrls.generateResult, data).then(

View File

@@ -46,6 +46,9 @@
<div class="modelBox">
<div class="img">
<img :src="selectModel.threeDPatternLayoutUrl" alt="">
<div class="btn">
<i class="fi fi-bs-expand-arrows-alt" @click.stop="openScaleImage()"></i>
</div>
</div>
</div>
<div class="gallery_btn" @click="openDown()">Download</div>
@@ -53,6 +56,7 @@
<div class="download">
<download ref="download"></download>
</div>
<scaleImage ref="scaleImage"></scaleImage>
</div>
</template>
<script lang="ts">
@@ -63,9 +67,10 @@ import { useStore } from "vuex";
import { useI18n } from 'vue-i18n'
import threeBox from "./three.vue"
import download from "./download.vue"
import scaleImage from "@/component/HomePage/scaleImage.vue";
export default defineComponent({
components:{
threeBox,download
threeBox,download,scaleImage
},
props:{
},
@@ -101,7 +106,7 @@ export default defineComponent({
const setSelectModel = (item:any)=>{
data.isShowMark = true
const value = {
threeDSimpleId:item.id,
threeDSimpleId:item.threeDSimpleId,
}
Https.axiosPost(Https.httpUrls.getLayoutDetail,{},{params:value}).then((res:any)=>{
data.selectModel = res
@@ -122,11 +127,12 @@ export default defineComponent({
const dataDom = reactive({
threeBox:null as any,
download:null as any,
scaleImage:null as any,
})
const openSetData = ()=>{
nextTick(()=>{
let id = store.state.HomeStoreModule.patternMaking3D.threeDsimpleId
if(id && data.selectModel.id == -1)setSelectModel({id})
if(id && data.selectModel.id == -1)setSelectModel({threeDSimpleId:id})
})
setTimeout(()=>{
data.maskShow = true
@@ -177,6 +183,11 @@ export default defineComponent({
const setMaterial = (item:any)=>{
dataDom.threeBox.addMaterial(item)
}
const openScaleImage = ()=>{
let scaleImage:any = dataDom.scaleImage
scaleImage.isLike = false
scaleImage.init([{imgUrl:data.selectModel.threeDPatternLayoutUrl}],0)
}
return{
...toRefs(dataDom),
...toRefs(data),
@@ -187,6 +198,7 @@ export default defineComponent({
openDown,
setLibraryOrModel,
setMaterial,
openScaleImage
}
},
directives:{
@@ -322,6 +334,15 @@ export default defineComponent({
>.img{
width: 100%;
height: 100%;
position: relative;
> .btn{
position: absolute;
right: 2rem;
top: 2rem;
> i{
cursor: pointer;
}
}
img{
width: 100%;
height: 100%;

View File

@@ -2,28 +2,30 @@
<div class="three">
<div class="parameter">
<label>
<span>X:</span>
<span>scaleX:</span>
<a-slider class="system_silder"
v-model:value="repeat.x"
:tooltipVisible="false"
@change="changeRepeat"
:max="2"
:max="6"
:step="0.001"
:min="0.002"
>
</a-slider>
</label>
<label>
<span>Y:</span>
<span>scaleY:</span>
<a-slider class="system_silder"
v-model:value="repeat.y"
:tooltipVisible="false"
@change="changeRepeat"
:max="2"
:step="0.01"
:max="6"
:min="0.002"
:step="0.001"
>
</a-slider>
</label>
<i class="fi fi-br-link" :class="{'fi-br-link':isLock,'fi-bs-link-slash':!isLock}" @click="setLock"></i>
</div>
<div class="model" ref="threeDom">
@@ -81,6 +83,7 @@ export default defineComponent({
y:1,
},
animationId:null as any,
isLock:false,
})
const dataDom = reactive({
threeDom:null as any,
@@ -255,11 +258,14 @@ export default defineComponent({
// 3. 配置纹理参数
texture.wrapS = THREE.RepeatWrapping;
texture.wrapT = THREE.RepeatWrapping;
// texture.wrapS = THREE.ClampToEdgeWrapping; // 水平方向不重复
// texture.wrapT = THREE.ClampToEdgeWrapping; // 垂直方向不重复
// texture.repeat.set(1, 1); // 纹理重复次数
texture.anisotropy = 32; // 提高纹理清晰度
data.group?.traverse((child:any) => {
if (child.isMesh) {
console.log(child.name)
// 5. 创建新材质(根据需求选择材质类型)
const textureWidth = texture.image.width;
const textureHeight = texture.image.height;
@@ -281,13 +287,40 @@ export default defineComponent({
metalness: .2, // 金属质感 (0-1)
side: THREE.DoubleSide // 双面渲染
});
// 6. 替换原有材质
child.material = newMaterial;
// 7. 如果需要单独控制某些子模型的UV
if (child.geometry.attributes.uv) {
// 可以在这里修改UV坐标
const uvs = child.geometry.attributes.uv.array;
// ...UV操作逻辑...
// 计算UV边界
let minU = Infinity, maxU = -Infinity;
let minV = Infinity, maxV = -Infinity;
for (let i = 0; i < uvs.length; i += 2) {
minU = Math.min(minU, uvs[i]);
maxU = Math.max(maxU, uvs[i]);
minV = Math.min(minV, uvs[i+1]);
maxV = Math.max(maxV, uvs[i+1]);
}
const uvWidth = maxU - minU;
const uvHeight = maxV - minV;
// 仅对非小UV区域设置材质
if (!(uvWidth < 1.2 || uvHeight < 1.2)) {
const newMaterial = new THREE.MeshStandardMaterial({
map: texture,
roughness: 0.7,
metalness: 0.2,
side: THREE.DoubleSide
});
child.material = newMaterial;
}else{
// child.material = new THREE.MeshStandardMaterial({
// transparent: true,
// opacity: 0, // 完全透明
// side: THREE.DoubleSide
// });
}
child.geometry.attributes.uv.needsUpdate = true;
}
}
data.load.state = false
@@ -391,9 +424,14 @@ export default defineComponent({
data.load.state = false
}
const changeRepeat = (e:any)=>{
if(data.isLock)data.repeat.x = e
if(data.isLock)data.repeat.y = e
clearTimeout(dataTime.updataRepeat)
dataTime.updataRepeat = setTimeout(()=>{
data.textureLoader.repeat.set(2 - data.repeat.x,2 - data.repeat.y); // 纹理重复次数
data.repeat.x = data.repeat.x == 6 ? 5.999 : data.repeat.x
data.repeat.y = data.repeat.y == 6 ? 5.999 : data.repeat.y
data.textureLoader.repeat.set(6 - data.repeat.x,6 - data.repeat.y); // 纹理重复次数
let value = {
x:data.repeat.x,
y:data.repeat.y,
@@ -401,6 +439,9 @@ export default defineComponent({
store.commit('setPatternMaking3D',value)
},1000)
}
const setLock = ()=>{
data.isLock = !data.isLock
}
onMounted(()=>{
})
onBeforeUnmount(()=>{
@@ -432,6 +473,7 @@ export default defineComponent({
openSetData,
addMaterial,
changeRepeat,
setLock,
}
},
provide() {
@@ -449,6 +491,7 @@ export default defineComponent({
overflow: hidden;
> .parameter{
display: flex;
align-items: center;
> label{
display: flex;
align-items: center;
@@ -462,6 +505,17 @@ export default defineComponent({
margin-right: 1rem;
}
}
> i{
width: 3rem;
height: 3rem;
display: flex;
align-items: center;
justify-content: center;
cursor: pointer;
&.active{
opacity: .7;
}
}
}
> .model{
width: 100%;

View File

@@ -13,7 +13,7 @@
</div>
</div>
<div class="gender marginBottom" v-if="show.age">
<div class="text">Age</div>
<div class="text">Role</div>
<div class="radio">
<label>
<input type="radio" name="ageGroup" v-model="selectObject.ageGroup" value="Adult">

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,995 @@
<template>
<div class="login_page">
<div class="page_content">
<!-- 账号密码和邮箱登录 start-->
<div class="login_content" v-if="isLogin === 1">
<div class="login_content_left">
<!-- v-show="loginType == 'username'" -->
<div>
<div class="login_form_content" :state="emailStap">
<!-- <div class="login_form_title">Name</div>
<input
class="login_form_input"
placeholder="Enter your username"
v-model="username"
/> -->
<div v-show="emailStap === 1">
<div class="login_form_title marign_top30">
Email
</div>
<input
class="login_form_input"
placeholder="Enter your email address"
v-model="email"
@keydown.enter="submitPerLogin()"
/>
<div class="login_form_title marign_top30">
<div>Password</div>
</div>
<div class="password_input_block">
<input
class="login_form_input"
:type="passwordType"
placeholder="Enter your password"
v-model="password"
@keydown.enter="submitPerLogin()"
/>
<div
class="icon iconfont icon-yanjing_yincang_o password_show_icon"
@click="changePasswordType()"
></div>
</div>
</div>
<!-- 邮箱登录 start -->
<div
v-show="emailStap === 2"
class="login_form_email"
:class="{ active: emailStap === 2 }"
>
<div
v-show="emailStap === 2"
class="email_last_step"
>
<div class="email_last_step_block">
<span class="email_last_step_content"
>Verify with one-time verification
code</span
>
<i
class="fi fi-br-cross email_last_step_block_icon"
@click="emailLastStepFun()"
></i>
</div>
<div class="email_last_step_bottom">
<div class="email_last_step_des">
<div class="sent_email_content">
Sent to {{ email }}
</div>
<div class="tip_content">
<span v-show="time"
>{{ time }}s</span
>
<span
v-show="!time"
@click="emailNextStepFun()"
>Resend</span
>
</div>
</div>
<VerificationCodeInput
:ct="emailCode"
@sendCaptcha="
submitEmailLogin($event)
"
></VerificationCodeInput>
<div class="email_last_step_des">
<div
class="sent_email_content email_tip_content"
>
Please check the junk box if you
haven't received verification
code
</div>
</div>
</div>
</div>
</div>
</div>
<div class="login_form_title marign_top30">
<label :class="{ active: emailStap == 2 }">
<input
:state="emailStap"
type="checkbox"
v-model="checked"
/>
<span
>I agree to all Term, Privacy Policy and
Fees</span
>
</label>
</div>
<div class="thirdPartyLogin marign_top30">
<div class="label">
<div class="mask" v-show="!checked" @click="isCheckAgreement"></div>
<googleLogin @googelLogin="googelLogin"></googleLogin>
</div>
<div class="label">
<div class="mask" v-show="!checked" @click="isCheckAgreement"></div>
<weiXinLogin></weiXinLogin>
</div>
<!-- <phoneLogin></phoneLogin> -->
</div>
<div
class="login_submit_button marign_top40"
:state="emailStap"
@click="submitPerLogin()"
>
Sign in
</div>
<div class="login_text">
<div
class="forget_password_text"
@click="changeIsLogin(2)"
>
Forgot your password
</div>
</div>
</div>
<!-- 账号密码登录 end -->
</div>
<!-- 邮箱登录 end -->
</div>
<!-- 忘记密码 start -->
<div class="forget_password_content" v-else>
<div
class="forget_password_content_block"
@click="forgetPasswordLastStepFun()"
>
<!-- <span class="icon iconfont fi-br-arrow-left"></span
> -->
<i class="fi fi-br-arrow-left"></i>
<span class="forget_password_content_title"
>Retrieve password</span
>
</div>
<div v-show="frogetPasswordStep === 1">
<div class="forget_passored_form_content">
<div class="forget_passored_form_title">Email</div>
<input
class="forget_passored_form_input"
placeholder="Enter your email"
v-model="forgetPasswordEmail"
@keydown.enter="forgetPasswordNextStepFun()"
/>
</div>
<div
class="forget_submit_button marign_top40"
@click="forgetPasswordNextStepFun()"
>
Next step
</div>
</div>
<div v-show="frogetPasswordStep === 2">
<div class="forget_verif_code_des">Verification Code</div>
<div class="email_last_step_des">
<div class="sent_email_content">
Sent to {{ forgetPasswordEmail }}
</div>
<div class="tip_content">
<span v-show="time">{{ time }}s</span>
<span
v-show="!time"
@click="forgetPasswordNextStepFun()"
>Resend</span
>
</div>
</div>
<VerificationCodeInput
:ct="emailCode"
@sendCaptcha="submitPasswordCode($event)"
></VerificationCodeInput>
</div>
<div v-show="frogetPasswordStep === 3">
<div class="forget_passored_form_content">
<div class="forget_passored_form_title">Password</div>
<input
class="forget_passored_form_input"
placeholder="Enter a new password"
v-model="newPassword"
@keydown.enter="submitResetPassword()"
/>
</div>
<div
class="forget_submit_button marign_top40"
@click="submitResetPassword()"
>
Submit
</div>
</div>
</div>
<!-- 忘记密码 end -->
</div>
<!-- <div class="login_footer">
<div class="login_footer_item">
<div class="login_footer_item_text">
©2025 Code-Create Limited
</div>
</div>
<div class="login_footer_item">
<div
class="login_footer_item_text footer_item_text_pointer"
@click="
turnToWindow(
'https://code-create.com.hk/aida-terms-and-conditions/'
)
"
>
Terms&Conditions
</div>
<div class="login_footer_line"></div>
<div
class="login_footer_item_text footer_item_text_pointer"
@click="
turnToWindow(
'https://code-create.com.hk/aida-subscription-agreement/'
)
"
>
Privacy Policy
</div>
</div>
</div> -->
<div class="mark_loading" v-show="loadingShow">
<a-spin size="large" />
</div>
</div>
</template>
<script lang="ts">
import { defineComponent, ref, onMounted } from "vue";
import { Https } from "@/tool/https";
import { isEmail } from "@/tool/util";
import { setCookie, WriteCookie } from "@/tool/cookie";
import { message } from "ant-design-vue";
import VerificationCodeInput from "@/component/LoginPage/verificationCodeInput.vue";
import googleLogin from "@/component/LoginPage/googleLogin.vue";
import weiXinLogin from "@/component/LoginPage/weiXinLogin.vue";
import phoneLogin from "@/component/LoginPage/phoneLogin.vue";
import { useStore } from "vuex";
import { useI18n } from "vue-i18n";
import { setLang } from "@/tool/guide";
const md5 = require("md5");
export default defineComponent({
components: {
VerificationCodeInput,googleLogin,weiXinLogin,phoneLogin
},
setup() {
let timer: any = 0;
const { locale } = useI18n();
const store = useStore();
let loadingShow = ref(false)
return {
store,
timer,
locale,
loadingShow,
};
},
data() {
return {
checked: false,
isLogin: 1, //是否为登录 1-登录, 2-忘记密码
loginType: "username",
emailStap: 1, // 邮箱登录步骤
emailCode: ["", "", "", "", "", ""], //邮箱验证码
emailNextStep: true,
username: "",
password: localStorage.getItem("loginPassword") || '',
email: localStorage.getItem("loginEmail") || '', //邮箱登录邮箱
frogetPasswordStep: 1, //忘记密码的步骤
forgetPasswordEmail: "",
forgetEmailCode: ["", "", "", "", "", ""], //忘记密码的邮箱验证码
forgetEmailValue: "", //忘记密码的邮箱验证码保存值
newPassword: "", //新密码
isCheckRobot: false,
time: 60, //60秒倒计时
passwordType: "password",
userId: "",
loginTime: true,
};
},
methods: {
changeLoginType(type: string) {
this.loginType = type;
},
//是否忘记密码页面
changeIsLogin(isLogin: number) {
if (isLogin === 1) {
//登录
this.forgetPasswordEmail = "";
this.frogetPasswordStep = 1;
this.forgetEmailCode = ["", "", "", "", "", ""];
this.emailStap = 1;
this.clearTimer();
} else {
this.username = "";
this.password = "";
}
this.isLogin = isLogin;
},
//邮箱登录的下一步
emailNextStepFun() {
if (!isEmail(this.email)) {
message.info("The email format is incorrect");
return;
}
let data = {
email: this.email,
operationType: "LOGIN",
};
Https.axiosPost(Https.httpUrls.accountSendEmail, data).then(
(rv: any) => {
if (rv) {
this.emailStap = 2;
this.time = 60;
this.emailCode = ["", "", "", "", "", ""];
this.createTimer();
}
}
);
},
//邮箱登录的上一步
emailLastStepFun() {
this.emailStap = 1;
(this.username = ""), (this.password = ""), (this.email = "");
(this.checked = false),
(this.loginType = "username"),
(this.emailCode = ["", "", "", "", "", ""]),
this.clearTimer();
},
//忘记密码的下一步
forgetPasswordNextStepFun() {
if (!isEmail(this.forgetPasswordEmail)) {
message.info("The email format is incorrect");
return;
}
let data = {
email: this.forgetPasswordEmail,
operationType: "FORGET_PWD",
};
Https.axiosPost(Https.httpUrls.accountSendEmail, data).then(
(rv: any) => {
if (rv) {
this.frogetPasswordStep = 2;
(this.forgetEmailCode = ["", "", "", "", "", ""]),
this.createTimer();
}
}
);
},
//忘记密码的上一步
forgetPasswordLastStepFun() {
if (this.frogetPasswordStep === 1) {
this.changeIsLogin(1);
} else {
this.frogetPasswordStep = this.frogetPasswordStep - 1;
this.forgetPasswordEmail = "";
(this.forgetEmailCode = ["", "", "", "", "", ""]),
this.clearTimer();
}
},
//忘记密码填写完邮箱验证码进行下一步
submitPasswordCode(emailVerifyCode: any) {
// console.log(123123);
let data = {
email: this.forgetPasswordEmail,
emailVerifyCode: emailVerifyCode,
password: "",
verifyEmail: true,
};
Https.axiosPost(Https.httpUrls.accountResetPwd, data).then(
(rv: any) => {
if (rv) {
this.forgetEmailValue = emailVerifyCode;
this.frogetPasswordStep = 3;
this.clearTimer();
}
}
);
},
//改变勾选是否是机器人
checkRobot() {
this.isCheckRobot = !this.isCheckRobot;
},
//提交账号密码预先登录
submitPerLogin() {
//输入账号密码
if (this.emailStap >= 2) {
return;
} else {
if (!this.password) {
message.info(
"Please enter your account number or password"
);
return;
}
//输入邮箱
if (!this.email) {
message.info("Please enter your email address");
return;
}
//判断邮箱格式是否正确
if (!isEmail(this.email)) {
message.info("The email format is incorrect");
return;
}
//判断是否同意隐私政策
if (!this.checked) {
message.info(
"Agree to all terms, privacy fees and policies"
);
return;
}
let data = {
password: md5(this.password + "abc"),
userName: 'a',
// userName: this.username,
email: this.email,
operationType: "LOGIN",
ip: "",
};
// this.loginType = 'email'
this.clearTimer()
this.time = 60;
this.emailStap = 2;
this.emailCode = ["", "", "", "", "", ""];
this.createTimer();
if (this.loginTime) {
this.loginTime = false;
Https.axiosPost(Https.httpUrls.preLogin, data)
.then((rv: any) => {
// if (rv) {
// this.loginType = 'email'
// }
if (rv) {
this.userId = rv.userId;
this.loginType = "email";
localStorage.setItem("loginEmail", this.email);
localStorage.setItem("loginPassword", this.password);
}
})
.catch((res) => {
});
setTimeout(() => {
this.loginTime = true;
}, 2000);
}
}
},
changePasswordType() {
this.passwordType =
this.passwordType === "password" ? "text" : "password";
},
//邮箱登录提交
submitEmailLogin(emailVerifyCode: any) {
let data = {
email: this.email,
emailVerifyCode: emailVerifyCode,
loginType: "EMAIL",
userId: this.userId,
};
Https.axiosPost(Https.httpUrls.accountLogin, data)
.then((rv: any) => {
this.setSuccessLogin(rv)
})
.catch((res) => {});
},
isCheckAgreement(){
message.info(
"Agree to all terms, privacy fees and policies"
);
},
//微信登录
wechatLogin(value:any) {
let data = {
code : value.code,
type:2
}
this.loadingShow = true
Https.axiosGet(Https.httpUrls.parseWeChatCode, {params:data})
.then((rv: any) => {
this.loadingShow = false
this.setSuccessLogin(rv)
})
.catch((res) => {this.loadingShow = false});
},
//谷歌登录
googelLogin(value:any) {
let data = {credential : value,type:2}
Https.axiosGet(Https.httpUrls.parseGoogleCredential, {params:data})
.then((rv: any) => {
this.setSuccessLogin(rv)
})
.catch((res) => {});
},
//登陆成功设置参数
setSuccessLogin(rv:any){
if (rv) {
if (rv.systemUser == 4) {
rv.systemUser = 1;
}
this.createTimer();
let isTest = rv.systemUser == 3 ? true : false;
let isBeginner = rv.isBeginner == 1 ? true : false;
let token = rv.token;
setCookie("isMurmur", false);
setCookie("token", token);
setCookie("isTest", isTest);
setCookie("isBeginner", isBeginner);
setCookie("isBeginnerNum", 0); //从第一步开始,机器人开始的话就是从第二部开始
setCookie("userInfo", JSON.stringify(rv));
let userid:any = {
ueserId:rv.userId,
systemUser:rv.systemUser,
}
if(rv.email)userid.email = rv.email
this.store.commit("upUserDetail", userid);
if (window.innerWidth < 768) {
message.info(
"If you need to design, please log in using an iPad or computer."
);
this.turnToHomePage("/Square");
} else {
this.turnToHomePage("/home");
}
sessionStorage.setItem(
"isTimeOne",
JSON.stringify(false)
); //是否需要公告 提示 弹窗
let randomNum: any =
Math.floor(Math.random() * 9000000000000000) +
1000000000000000;
sessionStorage.setItem("sessionId", randomNum);
sessionStorage.setItem("record", JSON.stringify([]));
}
},
//修改密码提交
submitResetPassword() {
let data = {
email: this.forgetPasswordEmail,
emailVerifyCode: this.forgetEmailValue,
password: md5(this.newPassword + "abc"),
verifyEmail: false,
};
Https.axiosPost(Https.httpUrls.accountResetPwd, data).then(
(rv: any) => {
if (rv) {
message.success("Changing the password successfully");
this.changeIsLogin(1);
}
}
);
},
//创建定时器
createTimer() {
this.timer = setInterval(() => {
this.time--;
if (!this.time) {
clearInterval(this.timer);
}
}, 1000);
},
//清除定时器
clearTimer() {
this.time = 60;
if (this.timer) {
clearInterval(this.timer);
}
},
//跳转到首页
turnToHomePage(str: any) {
// this.getLang();
// this.$router.push("/home");
// console.log(window.location.search.substring(1));
this.store.commit("clearAllData");
this.store.commit("clearAllCollection");
this.store.commit("setAllBoardDataChoose", {});
this.store.commit("clearShowSketchboard", {});
this.$router.push(str);
},
//获取当前语言
// getLang() {
// let data = {};
// Https.axiosPost(Https.httpUrls.getUserLanguage, data).then(
// (rv: any) => {
// if (rv) {
// this.locale = rv;
// setLang(rv);
// }
// }
// );
// },
},
mounted() {
const data = this.$route.query
if(data?.state == 'weiXin'){
this.wechatLogin(data)
}
},
});
</script>
<style lang="less" scoped>
.login_page {
width: 100%;
height: 100%;
.page_content {
.login_content {
margin: 0 auto;
position: relative;
width: 100%;
// height: 100%;
// width: 80%;
display: flex;
justify-content: space-between;
align-items: center;
@media (max-width: 768px) {
width: 100%;
}
.login_content_left {
width: 100%;
@media (max-width: 768px) {
width: 100%;
}
.login_form_email {
margin-top: 3rem;
position: relative;
width: 100%;
height: 100%;
background: #fff;
transform: scale(0);
transition: 0.3s all;
border: 2px solid;
border-radius: 20px;
.email_last_step {
width: 100%;
height: 100%;
#app {
height: auto;
}
}
}
.active {
transform: scale(1);
}
}
.login_form_title {
font-size: 1.6rem;
// color: #666666;
font-weight: 900;
color: #000;
display: flex;
justify-content: space-between;
box-sizing: border-box;
label {
display: flex;
span {
font-size: 1.6rem;
margin-left: 10px;
font-weight: normal;
}
&.active {
pointer-events: none;
input {
pointer-events: none;
}
}
}
}
.login_form_content {
position: relative;
&[state="2"] {
> * {
opacity: 0;
}
.login_form_email {
opacity: 1;
}
}
.password_input_block {
position: relative;
.password_show_icon {
position: absolute;
font-size: 2.4rem;
right: 2rem;
top: 1.7rem;
cursor: pointer;
}
}
.login_form_input {
width: 100%;
height: 5rem;
margin-top: 1rem;
border: 0.1rem solid #dfdfdf;
border-radius: 2.5rem;
padding-left: 2.1rem;
line-height: 5rem;
font-size: 1.4rem;
box-sizing: border-box;
outline: none;
transition: all .3s;
&:hover{
border: 0.1rem solid #000;
}
&::placeholder {
color: #a5b0c2;
}
}
}
.email_last_step {
// margin-top: 4rem;
.email_last_step_bottom {
padding: 0 40px;
}
.email_last_step_block {
padding: 10px;
border-bottom: 2px solid;
box-sizing: border-box;
display: flex;
align-items: center;
justify-content: space-between;
.email_last_step_content {
margin-left: 1rem;
font-size: 2.2rem;
font-weight: bold;
color: #030303;
}
.email_last_step_block_icon {
cursor: pointer;
margin-right: 1rem;
height: 20px;
}
}
.fi-br-arrow-left {
font-size: 2.5rem;
font-weight: bold;
color: #030303;
transform: translateY(1rem);
display: inline-block;
}
}
.login_submit_button {
height: 5rem;
background: #000;
border-radius: 2.5rem;
line-height: 5rem;
text-align: center;
font-size: 1.8rem;
font-weight: 500;
color: #ffffff;
cursor: pointer;
transition: all .3s;
&:hover{
background: #3C3C3C;
}
&[state="2"] {
cursor: not-allowed;
}
}
.login_text {
font-size: 1.6rem;
margin-top: 4rem;
color: #151515;
display: flex;
justify-content: flex-end;
.forget_password_text {
cursor: pointer;
}
}
}
.forget_password_content {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
width: 60rem;
background: #ffffff;
box-shadow: -0.3rem 2rem 5.9rem 0px rgba(200, 200, 200, 0.3);
border-radius: 1rem;
padding: 3rem 6rem 6.5rem;
box-sizing: border-box;
.forget_password_content_block {
cursor: pointer;
}
.fi-br-arrow-left {
font-size: 3.8rem;
font-weight: bold;
color: #030303;
transform: translateY(1rem);
display: inline-block;
}
.forget_password_content_title {
font-size: 3.2rem;
font-weight: bold;
color: #030303;
margin-left: 2rem;
}
.forget_passored_form_content {
margin-top: 3.5rem;
.forget_passored_form_title {
font-size: 2.4rem;
font-weight: bold;
color: #030303;
display: flex;
justify-content: space-between;
box-sizing: border-box;
}
.forget_passored_form_input {
width: 100%;
height: 5rem;
margin-top: 1rem;
border: 0.1rem solid #dfdfdf;
border-radius: 2.5rem;
padding-left: 2.1rem;
line-height: 5rem;
font-size: 1.4rem;
box-sizing: border-box;
outline: none;
&::placeholder {
color: #a5b0c2;
}
}
}
.forget_verif_code_des {
font-size: 2.4rem;
font-weight: bold;
color: #030303;
margin-top: 3.5rem;
}
.forget_submit_button {
height: 5rem;
background: #000;
border-radius: 2.5rem;
line-height: 5rem;
text-align: center;
font-size: 1.8rem;
font-weight: 500;
color: #ffffff;
cursor: pointer;
}
}
}
.login_footer {
position: absolute;
display: flex;
align-items: center;
justify-content: space-between;
left: 0;
bottom: 3.5rem;
width: 100%;
padding: 0 4rem;
.login_footer_item {
display: flex;
align-items: center;
.login_footer_item_text {
font-size: 1.3rem;
color: #151515;
}
.footer_item_text_pointer {
cursor: pointer;
}
.login_footer_line {
width: 0.1rem;
height: 2rem;
margin: 0 2rem;
background: #b9b9b9;
}
}
}
.marign_top20 {
margin-top: 2rem;
}
.marign_top22 {
margin-top: 2.2rem;
}
.marign_top30 {
margin-top: 3rem;
}
.marign_top40 {
margin-top: 4rem;
}
.thirdPartyLogin{
display: flex;
// justify-content: flex-start;
> div{
position: relative;
margin-right: 1rem;
> .mask{
position: absolute;
width: 100%;
height: 100%;
top: 0;
left: 0;
z-index: 2;
cursor: pointer;
}
}
}
.tip_content {
font-size: 1.3rem;
font-weight: bold;
color: #343579;
cursor: pointer;
}
.email_last_step_des {
display: flex;
align-items: center;
justify-content: space-between;
margin-top: 4rem;
margin-bottom: 2rem;
.sent_email_content {
font-size: 1.8rem;
font-weight: bold;
color: #a5b0c2;
}
.email_tip_content {
font-size: 1.4rem;
color: #030303;
}
}
}
</style>

File diff suppressed because it is too large Load Diff

View File

@@ -83,7 +83,7 @@ export default defineComponent({
setup(){
let list = ref([])
let wait_list = ref([])
let width = ref(300)
let width = ref(250)
let num_x = ref(1)
let gap_x = ref(0)
let gap_y = ref(0)