oak-general-business/es/components/changePassword/byMobile/index.js

148 lines
4.6 KiB
JavaScript

import { LOCAL_STORAGE_KEYS } from '../../../config/constants';
import { encryptPasswordSha1 } from '../../../utils/password';
const SEND_KEY = LOCAL_STORAGE_KEYS.captchaSendAt;
const SEND_CAPTCHA_LATENCY = process.env.NODE_ENV === 'development' ? 10 : 60;
export default OakComponent({
isList: false,
entity: 'user',
projection: {
id: 1,
name: 1,
nickname: 1,
mobile$user: {
$entity: 'mobile',
data: {
id: 1,
mobile: 1,
},
filter: {
ableState: 'enabled'
}
}
},
formData: function ({ data: user, features, props }) {
let counter = 0;
const { lastSendAt } = this.state;
if (typeof lastSendAt === 'number') {
counter = Math.max(SEND_CAPTCHA_LATENCY - Math.ceil((Date.now() - lastSendAt) / 1000), 0);
if (counter > 0) {
this.counterHandler = setTimeout(() => this.reRender(), 1000);
}
else if (this.counterHandler) {
clearTimeout(this.counterHandler);
this.counterHandler = undefined;
}
}
return {
user,
counter,
mobile: user?.mobile$user?.[0]?.mobile
};
},
data: {
channels: [],
failTimes: 0,
captcha: '',
lastSendAt: undefined,
mode: 'all',
pwdMin: 8,
pwdMax: 24,
needVerify: false,
regexs: [],
tip: '',
},
lifetimes: {
async ready() {
const lastSendAt = await this.load(SEND_KEY);
const system = this.features.application.getApplication().system;
const passwordConfig = system?.config.Password;
const mode = passwordConfig?.mode ?? 'all';
const pwdMin = passwordConfig?.min ?? 8;
const pwdMax = passwordConfig?.max ?? 24;
const needVerify = !!passwordConfig?.verify;
const regexs = (passwordConfig?.regexs && passwordConfig?.regexs.length > 0) ? passwordConfig?.regexs : [];
const tip = passwordConfig?.tip ?? '';
this.setState({
mode,
pwdMin,
pwdMax,
needVerify,
regexs,
tip,
});
if (lastSendAt) {
this.setState({
lastSendAt,
}, () => this.reRender());
}
}
},
methods: {
async sendCaptcha(mobile) {
try {
const result = await this.features.token.sendCaptcha('mobile', mobile, 'changePassword');
// 显示返回消息
this.setMessage({
type: 'success',
content: result,
});
const lastSendAt = Date.now();
this.save(SEND_KEY, lastSendAt);
this.setState({
lastSendAt,
}, () => this.reRender());
}
catch (err) {
this.setMessage({
type: 'error',
content: err.message,
});
}
},
setCaptcha(value) {
this.setState({
captcha: value,
});
},
setMobile(value) {
this.setState({
mobile: value,
});
},
async onConfirmByMobile(mobile, captcha, newPassword) {
const { mode } = this.state;
const userId = this.props.oakId;
const { user } = this.state;
let newPwd = newPassword;
if (mode === 'sha1') {
newPwd = encryptPasswordSha1(newPassword);
}
const { result } = await this.features.cache.exec('updateUserPassword', {
userId,
mobile,
captcha,
newPassword: newPwd,
});
const { result: resultMessage, times } = result;
if (resultMessage === 'success') {
this.setMessage({
type: 'success',
content: '修改密码成功'
});
this.navigateBack();
}
else {
if (times) {
this.setState({
failTimes: times,
});
}
this.setMessage({
type: 'error',
content: resultMessage
});
}
}
},
});