说明:2020年2月11日下午,要写一个用户中心修改密码的功能,有点麻爪,先分析一下别人写好的账号密码登录的代码。
html代码
<form nz-form [formGroup]="form" (ngSubmit)="submit()" role="form"> <nz-alert *ngIf="error" [nzType]="'error'" [nzMessage]="error" [nzShowIcon]="true" class="mb-lg"></nz-alert> <nz-form-item> <nz-form-control [nzErrorTip]="'Please enter mobile number!'"> <nz-input-group nzSize="large" nzPrefixIcon="user"> <input nz-input formControlName="userName" placeholder="用户名" /> </nz-input-group> </nz-form-control> </nz-form-item> <nz-form-item> <nz-form-control nzErrorTip="'Please enter password!'"> <nz-input-group nzSize="large" nzPrefixIcon="lock"> <input nz-input type="password" formControlName="password" placeholder="密码" /> </nz-input-group> </nz-form-control> </nz-form-item> <nz-form-item> <nz-col [nzSpan]="12"> <label nz-checkbox formControlName="remember">自动登录</label> </nz-col> <nz-col [nzSpan]="12" class="text-right"> <a class="forgot" routerLink="/passport/forgot-password">忘记密码</a> </nz-col> </nz-form-item> <nz-form-item> <button nz-button type="submit" nzType="primary" nzSize="large" [nzLoading]="http.loading" nzBlock> 登录 </button> </nz-form-item> </form> <div class="other"> <!-- 其他登录方式 <i nz-tooltip="in fact Auth0 via window" (click)="open('auth0', 'window')" nz-icon nzType="alipay-circle" class="icon" ></i> <i nz-tooltip="in fact Github via redirect" (click)="open('github')" nz-icon nzType="taobao-circle" class="icon"></i> <i (click)="open('weibo', 'window')" nz-icon nzType="weibo-circle" class="icon"></i> --> <a class="register" routerLink="/passport/email-verify">注册账户</a> </div>
ts代码
import { SettingsService, _HttpClient } 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, ITokenService, DA_SERVICE_TOKEN, JWTTokenModel } from '@delon/auth'; import { ReuseTabService } from '@delon/abc'; import { environment } from '@env/environment'; import { StartupService } from '@core'; @Component({ selector: 'passport-login', templateUrl: './login.component.html', styleUrls: ['./login.component.less'], providers: [SocialService], }) export class UserLoginComponent implements OnDestroy { constructor( fb: FormBuilder, modalSrv: NzModalService, private router: Router, private settingsService: SettingsService, private socialService: SocialService, @Optional() @Inject(ReuseTabService) private reuseTabService: ReuseTabService, @Inject(DA_SERVICE_TOKEN) private tokenService: ITokenService, private startupSrv: StartupService, public http: _HttpClient, public msg: NzMessageService, ) { this.form = fb.group({ userName: [null, [Validators.required, Validators.minLength(4)]], 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; } form: FormGroup; error = ''; type = 0; // #region get captcha count = 0; interval$: any; // #endregion switch(ret: any) { this.type = ret.index; } getCaptcha() { if (this.mobile.invalid) { this.mobile.markAsDirty({ onlySelf: true }); this.mobile.updateValueAndValidity({ onlySelf: true }); return; } 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; } } // 默认配置中对所有HTTP请求都会强制 [校验](https://ng-alain.com/auth/getting-started) 用户 Token // 然一般来说登录请求不需要校验,因此可以在请求URL加上:`/login?_allow_anonymous=true` 表示不触发用户 Token 校验 this.http .post('login?_allow_anonymous=true', { uid: this.userName.value, pwd: this.password.value, }) .subscribe((res: any) => { if (res.code !== 0) { this.error = res.msg; return; } console.log(res); // 清空路由复用信息 this.reuseTabService.clear(); // 设置用户Token信息 {token: ''} this.tokenService.set({ token: res.data }); // 重新获取 StartupService 内容,我们始终认为应用信息一般都会受当前用户授权范围而影响 this.startupSrv.load().then(() => { let url = this.tokenService.referrer!.url || '/'; if (url.includes('/passport')) { url = '/'; } console.log(url); this.router.navigateByUrl(url); }); }); } // #region social open(type: string, openType: SocialOpenType = 'href') { let url = ``; let callback = ``; // tslint:disable-next-line: prefer-conditional-expression if (environment.production) { callback = 'https://ng-alain.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$); } } }
less代码
@import '~@delon/theme/styles/default'; :host { display: block; width: 368px; margin: 0 auto; ::ng-deep { .ant-tabs .ant-tabs-bar { margin-bottom: 24px; text-align: center; border-bottom: 0; } .ant-tabs-tab { font-size: 16px; line-height: 24px; } .ant-input-affix-wrapper .ant-input:not(:first-child) { padding-left: 34px; } .icon { margin-left: 16px; color: rgba(0, 0, 0, 0.2); font-size: 24px; vertical-align: middle; cursor: pointer; transition: color 0.3s; &:hover { color: @primary-color; } } .other { margin-top: 24px; line-height: 22px; text-align: left; nz-tooltip { vertical-align: middle; } .register { float: right; } } } }
浙公网安备 33010602011771号