From b266340ef1306f61ea357382e09f8268978f165a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=8F=E6=B5=B7?= Date: Fri, 15 May 2020 20:46:02 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E5=96=84=E8=B7=AF=E7=94=B1=E5=AE=88?= =?UTF-8?q?=E5=8D=AB=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- index/src/app/services/global-user.service.ts | 6 +++-- .../src/app/services/local-storage.service.ts | 4 ++-- .../app/view/admin/admin-routing.module.ts | 1 + index/src/app/view/admin/auth.guard.ts | 22 ++++++++++++++----- 4 files changed, 23 insertions(+), 10 deletions(-) diff --git a/index/src/app/services/global-user.service.ts b/index/src/app/services/global-user.service.ts index 904fa2b..2955f25 100644 --- a/index/src/app/services/global-user.service.ts +++ b/index/src/app/services/global-user.service.ts @@ -33,7 +33,8 @@ export class GlobalUserService { } if (this.lastRequestTime && Date.now() - this.lastRequestTime < 1000) { return { - unsubscribe() { + unsubscribe: () => { + this.userObserverArray.splice(this.userObserverArray.indexOf(observer), 1); observer.complete(); } } @@ -44,7 +45,8 @@ export class GlobalUserService { // 获取数据 const subscription = this.getUserInfoFromServer(); return { - unsubscribe() { + unsubscribe:()=>{ + this.userObserverArray.splice(this.userObserverArray.indexOf(observer), 1); observer.complete(); subscription.unsubscribe() } diff --git a/index/src/app/services/local-storage.service.ts b/index/src/app/services/local-storage.service.ts index ed2dcb9..8aba216 100644 --- a/index/src/app/services/local-storage.service.ts +++ b/index/src/app/services/local-storage.service.ts @@ -9,8 +9,8 @@ export class LocalStorageService { constructor() { } - // 1分钟 - readonly place = 60 * 1000; + // 30s + readonly place = 30 * 1000; getToken(): string { return localStorage.getItem('token'); diff --git a/index/src/app/view/admin/admin-routing.module.ts b/index/src/app/view/admin/admin-routing.module.ts index ec277be..8ad3ba4 100644 --- a/index/src/app/view/admin/admin-routing.module.ts +++ b/index/src/app/view/admin/admin-routing.module.ts @@ -8,6 +8,7 @@ const routes: Routes = [ { path: '', component: AdminComponent, + canActivate: [AuthGuard], children: [ { path: 'article', diff --git a/index/src/app/view/admin/auth.guard.ts b/index/src/app/view/admin/auth.guard.ts index 7010457..3c12748 100644 --- a/index/src/app/view/admin/auth.guard.ts +++ b/index/src/app/view/admin/auth.guard.ts @@ -1,5 +1,5 @@ import {Injectable} from '@angular/core'; -import {CanActivate, ActivatedRouteSnapshot, RouterStateSnapshot, UrlTree} from '@angular/router'; +import {CanActivate, ActivatedRouteSnapshot, RouterStateSnapshot, UrlTree, Router} from '@angular/router'; import {Observable} from 'rxjs'; import {User} from '../../class/User'; import {GlobalUserService} from '../../services/global-user.service'; @@ -9,28 +9,36 @@ import {GlobalUserService} from '../../services/global-user.service'; }) export class AuthGuard implements CanActivate { - constructor(private userService: GlobalUserService) { + constructor(private userService: GlobalUserService, private router: Router) { userService.watchUserInfo({ complete: () => null, error: (err) => { - // 未登录 重定向 + // 请求重复 + console.log(err); + if (err.code !== -1) { + this.userInfo = null; + this.router.navigateByUrl(this.loginPath); + } }, next: data => { this.userInfo = data.result - console.log(this.path); - // todo :用户信息更新时 重新判断下path } }) } userInfo: User; private path: string; + private readonly loginPath: string = '/user/login'; canActivate( next: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable | Promise | boolean | UrlTree { const path = state.url.indexOf('?') > 0 ? state.url.substr(0, state.url.indexOf('?')) : state.url; this.path = path + if (path.split('/')[1] === 'admin' && !this.userInfo) { + this.router.navigateByUrl(this.loginPath); + return false; + } switch (path) { case '/admin/article': case '/admin/category': @@ -39,7 +47,9 @@ export class AuthGuard implements CanActivate { case '/admin/update': case '/admin/user': case '/admin/visitor': - if (!this.userInfo || this.userInfo.role !== 'admin') return false; + if (this.userInfo.role !== 'admin') { + return false; + } } return true; }