Vue3 + Pinia + Vite5 仿抖音,完全度90% . Vue3 + Pinia + Vite5 imitate TikTok with 90% completeness
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

147 lines
3.7 KiB

<template>
<div class="RetrievePassword">
<BaseHeader mode="light" :isClose="true"></BaseHeader>
<div class="content">
<div class="desc">
<div class="title">找回密码</div>
<div class="sub-title">验证码已通过短信发送到+86 13800138000
密码为8 - 20至少包含字母数字符号2种组合
</div>
</div>
<LoginInput
autofocus
type="code"
v-model="code"
placeholder="请输入验证码"
v-model:isSendVerificationCode="isSendVerificationCode"
@send="sendCode"
/>
<LoginInput
class="mt1r"
autofocus
type="password"
v-model="password"
placeholder="请输入密码"
/>
<div class="protocol" :class="showAnim?'anim-bounce':''">
<Tooltip style="top: -150%;left: -1rem;" v-model="showTooltip"/>
<div class="left">
<Check v-model="isAgree"/>
</div>
<div class="right">
已阅读并同意
<span class="link" @click="$nav('/service-protocol',{type:'“抖音”用户服务协议'})">用户协议</span>
<span class="link" @click="$nav('/service-protocol',{type:'“抖音”隐私政策'})">隐私政策</span>
,同时登录并使用抖音火山版(原“火山小视频”)和抖音
</div>
</div>
<div class="notice" v-if="notice">
{{ notice }}
</div>
<b-button
:loading="loading"
:active="false"
:loadingWithText="true"
:disabled="disabled"
@click="login">
完成
</b-button>
<div class="options" v-if="showVoiceCode">
<span>
收不到短信?<span class="link" @click="getVoiceCode">获取语音验证码</span>
</span>
</div>
</div>
</div>
</template>
<script>
import Check from "../../components/Check";
import LoginInput from "./components/LoginInput";
import Tooltip from "./components/Tooltip";
import Base from "./Base";
export default {
name: "RetrievePassword",
extends: Base,
components: {
Check,
Tooltip,
LoginInput,
},
data() {
return {
phone: '',
password: '',
code: '',
notice: '',
isSendVerificationCode: true,
showVoiceCode: false
}
},
computed: {
disabled() {
return !(this.code && this.password);
}
},
created() {
setTimeout(() => {
this.showVoiceCode = true
}, 3000)
},
methods: {
getVoiceCode() {
return this.$showNoticeDialog('语音验证码',
'我们将以电话的方式告知你验证码,请注意接听',
'',
() => {
setTimeout(() => {
this.$showConfirmDialog('', '您的手机可能由于空号/欠费/停机无法收到验证码,请恢复手机号状态,如果' +
'您因为换号无法收到验证码,可以尝试找回账号', '', () => {
}, null, '找回账号', '返回', '')
}, 2000)
},
'知道了'
)
},
//TODO loading样式不对
async sendCode() {
this.$showLoading()
await this.$sleep(500)
this.$hideLoading()
this.isSendVerificationCode = true
},
async login() {
let res = await this.check()
if (res) {
this.loading = true
}
}
}
}
</script>
<style scoped lang="scss">
@import "../../assets/scss/index";
@import "Base.scss";
.RetrievePassword {
position: fixed;
left: 0;
right: 0;
bottom: 0;
top: 0;
overflow: auto;
color: black;
font-size: 1.4rem;
background: white;
}
</style>