175 lines
7.0 KiB
JavaScript
175 lines
7.0 KiB
JavaScript
import { LOCAL_STORAGE_KEYS } from '../../../config/constants';
|
||
const LOGIN_MODE = LOCAL_STORAGE_KEYS.loginMode;
|
||
export default OakComponent({
|
||
isList: false,
|
||
data: {
|
||
appId: '',
|
||
loginAgreed: false,
|
||
loginMode: 'sms',
|
||
loading: false,
|
||
isSupportWechatGrant: false,
|
||
domain: undefined,
|
||
passportTypes: [],
|
||
inputOptions: [],
|
||
scanOptions: [],
|
||
allowSms: false,
|
||
allowEmail: false,
|
||
allowPassword: false,
|
||
allowWechatMp: false,
|
||
setLoginModeMp(value) { this.setLoginMode(value); },
|
||
smsDigit: 4, //短信验证码位数
|
||
emailDigit: 4, //邮箱验证码位数
|
||
},
|
||
properties: {
|
||
onlyCaptcha: false,
|
||
onlyPassword: false,
|
||
disabled: '',
|
||
redirectUri: '', // 微信登录后的redirectUri,要指向wechatUser/login去处理
|
||
url: '', // 登录系统之后要返回的页面
|
||
callback: undefined, // 登录成功回调,排除微信登录方式
|
||
},
|
||
formData({ features, props }) {
|
||
return {};
|
||
},
|
||
listeners: {
|
||
// 'onlyPassword,onlyCaptcha'(prev, next) {
|
||
// let loginMode = this.state.loginMode, inputOptions = this.state.inputOptions, scanOptions = this.state.scanOptions;
|
||
// if (next.onlyPassword) {
|
||
// loginMode = 'password';
|
||
// inputOptions = [{
|
||
// label: this.t('passport:v.type.password'),
|
||
// value: 'password',
|
||
// }];
|
||
// } else if (next.onlyCaptcha) {
|
||
// loginMode = 'sms';
|
||
// inputOptions = [{
|
||
// label: this.t('passport:v.type.sms'),
|
||
// value: 'sms',
|
||
// }];
|
||
// } else {
|
||
// const { passportTypes } = this.state;
|
||
// if (passportTypes && passportTypes.length > 0) {
|
||
// passportTypes.forEach((ele: EntityDict['passport']['Schema']['type']) => {
|
||
// if (ele === 'sms' || ele === 'email' || ele === 'password') {
|
||
// inputOptions.push({
|
||
// label: this.t(`passport:v.type.${ele}`),
|
||
// value: ele
|
||
// })
|
||
// } else if (ele === 'wechatMpForWeb' || ele === 'wechatPublicForWeb') {
|
||
// scanOptions.push({
|
||
// label: this.t(`passport:v.type.${ele}`),
|
||
// value: ele
|
||
// })
|
||
// }
|
||
// });
|
||
// }
|
||
// }
|
||
// this.setState({
|
||
// loginMode,
|
||
// inputOptions,
|
||
// scanOptions,
|
||
// })
|
||
// }
|
||
},
|
||
lifetimes: {
|
||
async ready() {
|
||
const application = this.features.application.getApplication();
|
||
const { result: applicationPassports } = await this.features.cache.exec('getApplicationPassports', { applicationId: application.id });
|
||
const defaultPassport = applicationPassports.find((ele) => ele.isDefault);
|
||
const passportTypes = applicationPassports.map((ele) => ele.passport.type);
|
||
const smsDigit = applicationPassports.find((ele) => ele.passport.type === 'sms')?.passport.config.digit || 4;
|
||
const emailDigit = applicationPassports.find((ele) => ele.passport.type === 'email')?.passport.config.digit || 4;
|
||
const { onlyCaptcha, onlyPassword } = this.props;
|
||
let loginMode = (await this.load(LOGIN_MODE)) || defaultPassport?.passport?.type || 'sms';
|
||
let inputOptions = [], scanOptions = [];
|
||
if (onlyPassword) {
|
||
loginMode = 'password';
|
||
inputOptions = [{
|
||
label: this.t('passport:v.type.password') + this.t('Login'),
|
||
value: 'password',
|
||
}];
|
||
}
|
||
else if (onlyCaptcha) {
|
||
loginMode = 'sms';
|
||
inputOptions = [{
|
||
label: this.t('passport:v.type.sms') + this.t('Login'),
|
||
value: 'sms',
|
||
}];
|
||
}
|
||
else {
|
||
passportTypes.forEach((ele) => {
|
||
if (ele === 'sms' || ele === 'email' || ele === 'password') {
|
||
inputOptions.push({
|
||
label: this.t(`passport:v.type.${ele}`) + this.t('Login'),
|
||
value: ele
|
||
});
|
||
}
|
||
else if (ele === 'wechatWeb' || ele === 'wechatMpForWeb' || ele === 'wechatPublicForWeb') {
|
||
scanOptions.push({
|
||
label: this.t(`passport:v.type.${ele}`) + this.t('Login'),
|
||
value: ele
|
||
});
|
||
}
|
||
});
|
||
}
|
||
if (!passportTypes.includes(loginMode)) {
|
||
loginMode = defaultPassport.passport.type;
|
||
}
|
||
const appType = application?.type;
|
||
const config = application?.config;
|
||
let appId;
|
||
let domain; //网站扫码授权回调域
|
||
let isSupportWechatGrant = false; // 微信公众号授权登录
|
||
if (appType === 'wechatPublic') {
|
||
const config2 = config;
|
||
const isService = config2?.isService; //是否服务号 服务号才能授权登录
|
||
appId = config2?.appId;
|
||
isSupportWechatGrant = !!(isService && appId && passportTypes.includes('wechatPublic'));
|
||
}
|
||
else if (appType === 'web') {
|
||
const config2 = config;
|
||
appId = config2?.wechat?.appId;
|
||
domain = config2?.wechat?.domain;
|
||
}
|
||
const allowSms = passportTypes.includes('sms') && !onlyPassword;
|
||
const allowEmail = passportTypes.includes('email') && !onlyCaptcha && !onlyPassword;
|
||
const allowPassword = passportTypes.includes('password') && !onlyCaptcha;
|
||
const allowWechatMp = passportTypes.includes('wechatMp') && !onlyCaptcha && !onlyPassword;
|
||
this.setState({
|
||
loginMode,
|
||
appId,
|
||
isSupportWechatGrant,
|
||
domain,
|
||
passportTypes,
|
||
inputOptions,
|
||
scanOptions,
|
||
allowSms,
|
||
allowEmail,
|
||
allowPassword,
|
||
allowWechatMp,
|
||
smsDigit,
|
||
emailDigit,
|
||
}, () => this.reRender());
|
||
},
|
||
},
|
||
methods: {
|
||
setLoginMode(value) {
|
||
this.features.localStorage.save(LOGIN_MODE, value);
|
||
this.setState({
|
||
loginMode: value,
|
||
});
|
||
},
|
||
changeLoginMp() {
|
||
const { allowSms, allowPassword } = this.state;
|
||
let loginMode = 'wechatMp';
|
||
if (allowSms) {
|
||
loginMode = 'sms';
|
||
}
|
||
else if (allowPassword) {
|
||
loginMode = 'password';
|
||
}
|
||
this.setLoginMode(loginMode);
|
||
}
|
||
},
|
||
});
|