import { SettingsService } from '@delon/theme';
|
import { Component, OnDestroy, Inject, Optional } from '@angular/core';
|
import { Router } from '@angular/router';
|
import { FormGroup, FormBuilder, Validators } from '@angular/forms';
|
import { NzMessageService, NzModalService } from 'ng-zorro-antd';
|
import {
|
SocialService,
|
SocialOpenType,
|
TokenService,
|
DA_SERVICE_TOKEN,
|
} from '@delon/auth';
|
import { ReuseTabService } from '@delon/abc';
|
import { environment } from '@env/environment';
|
import { StartupService } from '@core/startup/startup.service';
|
|
@Component({
|
selector: 'passport-login',
|
templateUrl: './login.component.html',
|
styleUrls: ['./login.component.less'],
|
providers: [SocialService],
|
})
|
export class UserLoginComponent implements OnDestroy {
|
form: FormGroup;
|
error = '';
|
type = 0;
|
loading = false;
|
|
constructor(
|
fb: FormBuilder,
|
private router: Router,
|
public msg: NzMessageService,
|
private modalSrv: NzModalService,
|
private settingsService: SettingsService,
|
private socialService: SocialService,
|
@Optional()
|
@Inject(ReuseTabService)
|
private reuseTabService: ReuseTabService,
|
@Inject(DA_SERVICE_TOKEN) private tokenService: TokenService,
|
private startupSrv: StartupService,
|
) {
|
this.form = fb.group({
|
userName: [null, [Validators.required, Validators.minLength(5)]],
|
password: [null, Validators.required],
|
mobile: [null, [Validators.required, Validators.pattern(/^1\d{10}$/)]],
|
captcha: [null, [Validators.required]],
|
remember: [true],
|
});
|
modalSrv.closeAll();
|
}
|
|
// region: fields
|
|
get userName() {
|
return this.form.controls.userName;
|
}
|
get password() {
|
return this.form.controls.password;
|
}
|
get mobile() {
|
return this.form.controls.mobile;
|
}
|
get captcha() {
|
return this.form.controls.captcha;
|
}
|
|
// endregion
|
|
switch(ret: any) {
|
this.type = ret.index;
|
}
|
|
// region: get captcha
|
|
count = 0;
|
interval$: any;
|
|
getCaptcha() {
|
this.count = 59;
|
this.interval$ = setInterval(() => {
|
this.count -= 1;
|
if (this.count <= 0) clearInterval(this.interval$);
|
}, 1000);
|
}
|
|
// endregion
|
|
submit() {
|
this.error = '';
|
if (this.type === 0) {
|
this.userName.markAsDirty();
|
this.userName.updateValueAndValidity();
|
this.password.markAsDirty();
|
this.password.updateValueAndValidity();
|
if (this.userName.invalid || this.password.invalid) return;
|
} else {
|
this.mobile.markAsDirty();
|
this.mobile.updateValueAndValidity();
|
this.captcha.markAsDirty();
|
this.captcha.updateValueAndValidity();
|
if (this.mobile.invalid || this.captcha.invalid) return;
|
}
|
// mock http
|
this.loading = true;
|
setTimeout(() => {
|
this.loading = false;
|
if (this.type === 0) {
|
if (
|
this.userName.value !== 'admin' ||
|
this.password.value !== '888888'
|
) {
|
this.error = `账户或密码错误`;
|
return;
|
}
|
}
|
|
// 清空路由复用信息
|
this.reuseTabService.clear();
|
// 设置Token信息
|
this.tokenService.set({
|
token: '123456789',
|
name: this.userName.value,
|
email: `cipchk@qq.com`,
|
id: 10000,
|
time: +new Date(),
|
});
|
// 重新获取 StartupService 内容,若其包括 User 有关的信息的话
|
// this.startupSrv.load().then(() => this.router.navigate(['/']));
|
// 否则直接跳转
|
this.router.navigate(['/']);
|
}, 1000);
|
}
|
|
// region: social
|
|
open(type: string, openType: SocialOpenType = 'href') {
|
let url = ``;
|
let callback = ``;
|
if (environment.production)
|
callback = 'https://cipchk.github.io/ng-alain/callback/' + type;
|
else callback = 'http://localhost:4200/callback/' + type;
|
switch (type) {
|
case 'auth0':
|
url = `//cipchk.auth0.com/login?client=8gcNydIDzGBYxzqV0Vm1CX_RXH-wsWo5&redirect_uri=${decodeURIComponent(
|
callback,
|
)}`;
|
break;
|
case 'github':
|
url = `//github.com/login/oauth/authorize?client_id=9d6baae4b04a23fcafa2&response_type=code&redirect_uri=${decodeURIComponent(
|
callback,
|
)}`;
|
break;
|
case 'weibo':
|
url = `https://api.weibo.com/oauth2/authorize?client_id=1239507802&response_type=code&redirect_uri=${decodeURIComponent(
|
callback,
|
)}`;
|
break;
|
}
|
if (openType === 'window') {
|
this.socialService
|
.login(url, '/', {
|
type: 'window',
|
})
|
.subscribe(res => {
|
if (res) {
|
this.settingsService.setUser(res);
|
this.router.navigateByUrl('/');
|
}
|
});
|
} else {
|
this.socialService.login(url, '/', {
|
type: 'href',
|
});
|
}
|
}
|
|
// endregion
|
|
ngOnDestroy(): void {
|
if (this.interval$) clearInterval(this.interval$);
|
}
|
}
|