useLogin.js
3.75 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
/*
* @Date: 2022-06-22 00:07:42
* @LastEditors: hookehuyr hookehuyr@gmail.com
* @LastEditTime: 2023-06-21 15:58:52
* @FilePath: /huizhu/src/composables/useLogin.js
* @Description: 登录流程封装(验证码发送、表单校验、提交登录)
*/
import { bLoginAPI } from '@/api/B/login'
import { useRouter } from 'vue-router'
import { wxInfo } from '@/utils/tools';
import { ref } from 'vue'
import { useCountDown } from '@vant/use';
import { smsAPI } from '@/api/common'
import { showSuccessToast, showFailToast } from 'vant';
/**
* 登录逻辑组合式函数
* - 主要用于 B 端登录(历史代码)
* @returns {Object} 页面所需的响应式状态与方法集合
*/
export const useLogin = () => {
const phone = ref('');
const code = ref('')
const refForm = ref(null);
/**
* 校验表单并触发提交
* @returns {void}
*/
const validateForm = () => {
const valid = refForm.value.validate();
valid
.then(() => {
refForm.value.submit();
})
.catch(error => {
console.error(error);
showFailToast('请检查后再次提交');
})
}
/**
* 判断微信环境看是否弹出控件框
* 桌面微信直接输入
* 其他环境弹出输入框
*/
let use_widget = ref(true);
use_widget.value = !!(wxInfo().isiOS || wxInfo().isAndroid);
/**
* 手机号码校验
* 函数返回 true 表示校验通过,false 表示不通过
* @param {string} val 输入值
* @returns {boolean} 是否校验通过
*/
const sms_disabled = ref(false);
const phoneValidator = (val) => {
let flag = false;
// 简单判断手机号位数
if (/1\d{10}/.test(val) && phone.value.length === 11) {
sms_disabled.value = false;
flag = true;
} else {
sms_disabled.value = true;
flag = false;
}
return flag
};
/**
* 手机号数字弹框
*/
const keyboard_show = ref(false);
const refPhone = ref(null)
/**
* 弹出数字键盘
* @returns {void}
*/
const showKeyboard = () => { // 弹出数字弹框
keyboard_show.value = true;
};
/**
* 数字键盘失焦回调
* - 关闭键盘并触发手机号校验
* @returns {void}
*/
const keyboardBlur = () => { // 数字键盘失焦回调
keyboard_show.value = false;
refPhone.value.validate();
};
// 设置发送短信倒计时
// TAG: vant 自带倒计时函数
const limitSeconds = ref(60000); // 配置倒计时秒数
const countDown = useCountDown({ // 配置倒计时
time: limitSeconds.value,
onFinish: () => {
countDown.reset();
}
});
/**
* 发送验证码
* - 启动倒计时,避免频繁触发
* @returns {Promise<void>}
*/
const sendCode = async () => { // 发送验证码
countDown.start();
// 验证码接口
const { code } = await smsAPI({ phone: phone.value });
if (code) {
showSuccessToast('发送成功');
}
};
// 过滤输入的数字 只能四位
/**
* 限制验证码输入长度(最多 4 位)
* @param {string} value 输入值
* @returns {string} 截断后的值
*/
const smsFormatter = (value) => value.substring(0, 4);
/**
* 用户登录
* @param {{ phone: string, code: string }} values 表单值
* @returns {Promise<void>}
*/
const $router = useRouter();
const onSubmit = async (values) => {
const { code } = await bLoginAPI({ phone: values.phone, pin: values.code })
if (code) {
$router.push({
path: '/business/index'
});
}
};
return {
phone,
code,
onSubmit,
use_widget,
sms_disabled,
phoneValidator,
keyboardBlur,
keyboard_show,
showKeyboard,
refPhone,
refForm,
validateForm,
smsFormatter,
limitSeconds,
countDown,
sendCode,
}
}