148 lines
4.6 KiB
JavaScript
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
|
|
});
|
|
}
|
|
}
|
|
},
|
|
});
|