automated_uniapp/pages/user/captcha.vue

133 lines
2.3 KiB
Vue
Raw Normal View History

2025-01-09 16:16:11 +08:00
<template>
<cl-page background-color="#fff">
<view class="page-captcha">
<cl-topbar :border="false"> </cl-topbar>
<view class="container">
<text class="label">输入验证码</text>
<text class="tips">已发送至 +86 {{ form.phone }}</text>
<view class="code">
<cl-captcha
focus
v-model="form.smsCode"
:length="len"
:gutter="26"
@done="next"
/>
</view>
<cl-button
type="primary"
:disabled="form.smsCode.length !== len"
:loading="saving"
fill
:height="90"
:font-size="30"
@tap="next"
>
确定
</cl-button>
<view class="send">
<sms-btn
size="small"
:border="false"
:phone="form.phone"
:ref="setRefs('smsBtn')"
/>
</view>
</view>
</view>
</cl-page>
</template>
<script lang="ts" setup>
import { onReady } from "@dcloudio/uni-app";
import { reactive, ref } from "vue";
import { useCool, useStore } from "/@/cool";
import { useUi } from "/$/cool-ui";
import SmsBtn from "/@/components/sms-btn.vue";
const { service, router, refs, setRefs } = useCool();
const { user } = useStore();
const ui = useUi();
// 验证码长度
const len = 4;
// 保存状态
const saving = ref(false);
// 表单
const form = reactive({
smsCode: "",
phone: "",
});
// 下一步
function next() {
saving.value = true;
service.user.login
.phone(form)
.then(async (res) => {
// 设置token
user.setToken(res);
// 设置用户信息
await user.get();
// 登录跳转
router.nextLogin();
})
.catch((err) => {
ui.showTips(err.message || "登录失效,请重试~");
saving.value = false;
form.smsCode = "";
});
}
onReady(() => {
form.phone = router.query.phone || "";
refs.smsBtn.startCountdown();
});
</script>
<style lang="scss" scoped>
.page-captcha {
.container {
display: flex;
flex-direction: column;
width: 80%;
margin: 0 auto;
padding-top: 140rpx;
}
.label {
font-size: 52rpx;
font-weight: 500;
margin-bottom: 44rpx;
font-weight: bold;
color: #151515;
}
.tips {
font-size: 28rpx;
color: #151515;
font-weight: 500;
}
.code {
margin: 34rpx -26rpx 62rpx -26rpx;
}
.send {
display: flex;
justify-content: center;
font-size: 24rpx;
margin-top: 30rpx;
}
}
</style>