code.vue 4.29 KB
<template>
	<view class="code-page">
		<!-- 公共组件-每个页面必须引入 -->
		<public-module></public-module>
		<view class="login-body">
			<view class="login-phone">
				<view class="phone-main">
					<text class="text">{{ $t('login.phoneLogin') }}</text>
					<view class="circleStyle"></view>
				</view>
				<view class="form-row"><u-input v-model="loginForm.phoneNumber" type="number" :placeholder="$t('login.PleaseEnterPhone')"
						border="bottom"></u-input></view>
				<view class="form-row">
					<u-input type="number" v-model="loginForm.code" :placeholder="$t('login.PleaseEnterCode')" border="bottom">
						<template slot="suffix">
							<view @click="getVerifyCode" class="verify-code">{{ codeText }}</view>
						</template>
					</u-input>
				</view>
				<button class="submit" size="default" @click="onSubmit"><text class="text">{{ $t('login.login') }}</text></button>
				<view class="u-flex account-style">
					<view class="content" @click="openAccountFunc">{{ $t('login.accountPasswordLogin') }}</view>
				</view>
				<view class="circleStyleBottom"></view>
			</view>
		</view>
	</view>
</template>

<script>
	var clear;
	import {mapState,mapMutations,mapActions} from 'vuex';
	import {useShowToast,useNavigateTo,useReLaunch} from '@/plugins/utils.js'
	import api from '@/api'

	export default {
		data() {
			return {
				loginForm: {
					phoneNumber: '',
					code: ''
				},
				readonly: false,
				codeText:'',
			};
		},
		onShow(){
			this.$nextTick(()=>{
				uni.setNavigationBarTitle({
					title:this.$t('menu.phoneLogin')
				})
			})
		},
		onLoad(){
			this.codeText = this.$t('login.obtainCode')
		},
		methods: {
			...mapMutations(['setUserInfo']),
			...mapActions(['updateBadgeTotal']),
			//验证码按钮文字状态
			codeCountdownText() {
				const _this = this;
				this.readonly = true;
				this.codeText = this.$t('login.codeAfterSeconds',{number:60});
				var s = 60;
				clear = setInterval(() => {
					s--;
					_this.codeText = this.$t('login.codeAfterSeconds',{number:s});
					if (s <= 0) {
						clearInterval(clear);
						_this.codeText = this.$t('login.obtainCode');
						_this.readonly = false;
					}
				}, 1000);
			},
			//获取验证码
			async getVerifyCode() {
				const phoneRegular = /^1\d{10}$/;
				if (this.readonly) {
					// useShowToast('验证码已发送~')
					return
				}
				if (!this.loginForm.phoneNumber) {
					return useShowToast(this.$t('login.PleaseEnterPhone'))
				}
				if (!phoneRegular.test(this.loginForm.phoneNumber)) {
					return useShowToast(this.$t('login.phoneFormatFail'))
				}
				// 获取验证码接口
				await api.loginApi.postPhoneCodeApi(this.loginForm.phoneNumber)
				this.codeCountdownText(); //开始倒计时
			},
			async onSubmit() {
				const phoneRegular = /^1\d{10}$/;
				const verifyCodeReg = /^\d{6}$/;
				const validateValue = Object.values(this.loginForm)
				if (!validateValue[0]) return uni.$u.toast(this.$t('login.PleaseEnterPhone'));
				if (!validateValue[1]) return uni.$u.toast(this.$t('login.PleaseEnterCode'));
				if (!phoneRegular.test(validateValue[0])) return uni.$u.toast(this.$t('login.phoneFormatFail'));
				if (!verifyCodeReg.test(validateValue[1])) return uni.$u.toast(this.$t('login.codeFormatFail'));
				const res = await api.loginApi.postPhoneLoginApi(this.loginForm)
				if (res) {
					// 储存登录信息
					let tokenInfo = {
						refreshToken: res.refreshToken,
						isToken: res.token
					};
					let userInfo = {
						...tokenInfo,
						token: true, //token用于判断是否登录
						isThirdLogin: false
					};
					if (userInfo.token) {
						this.setUserInfo(userInfo);
					}
					useShowToast(this.$t('login.loginSuccess')).then(async (res) => {
						this.saveUserInfo();
						await this.getAlarmTotalData();
						useReLaunch("/pages/index/index")
					});
				}
			},
			async getAlarmTotalData() {
				const res = await await api.loginApi.getAlarmTotalApi()
				if (!res) return
				//异步实时更新告警徽标数
				this.updateBadgeTotal(res.totalAlarm?.activedAlarm);
			},
			async saveUserInfo() {
				//储存个人信息
				const res = await api.loginApi.setUserInfoApi()
				if (!res) return
				this.setUserInfo(res);
			},
			openAccountFunc() {
				useNavigateTo('../public/login')
			}
		}
	};
</script>

<style lang="scss" scoped>
	@import './static/code.scss';
</style>