将主页加载为存储在本地存储中的登陆页面用户 ID
Load home page as landing page user Id stored in local storage
在我的离子应用程序 (v-4) 中,在 登录 之后,我将 user_id
存储在 local storage
中,如下所示:
onLogin(){
localStorage.setItem('user_id', this.loginForm.user_id);
}
并且我已将 login page
设置为 landing page
,在 login page
之后,用户将被路由 home page
。此路由工作正常。
但是,如果用户再次打开 app
它应该显示 home page
作为着陆页,因为应用程序已经将 user_id
存储在其 local storage
.
代码
app.component.html
<ion-router-outlet main></ion-router-outlet>
app.component.ts
import { Component } from '@angular/core';
import { Platform } from '@ionic/angular';
import { SplashScreen } from '@ionic-native/splash-screen/ngx';
import { StatusBar } from '@ionic-native/status-bar/ngx';
@Component({
selector: 'app-root',
templateUrl: 'app.component.html'
})
export class AppComponent {
constructor(
private platform: Platform,
private splashScreen: SplashScreen,
private statusBar: StatusBar
) {
this.initializeApp();
}
initializeApp() {
this.platform.ready().then(() => {
this.statusBar.styleDefault();
});
}
}
app.module.ts
import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { RouteReuseStrategy } from '@angular/router';
import { IonicModule, IonicRouteStrategy } from '@ionic/angular';
import { SplashScreen } from '@ionic-native/splash-screen/ngx';
import { StatusBar } from '@ionic-native/status-bar/ngx';
import { AppComponent } from './app.component';
import { AppRoutingModule } from './app-routing.module';
import { HttpClientModule } from '@angular/common/http';
import { HttpModule } from '@angular/http';
import { FormsModule, ReactiveFormsModule } from '@angular/forms';
@NgModule({
declarations: [AppComponent],
entryComponents: [],
imports: [
BrowserModule,
IonicModule.forRoot(),
AppRoutingModule,
HttpModule,
HttpClientModule,
FormsModule,
ReactiveFormsModule ,
],
providers: [
StatusBar,
SplashScreen,
{ provide: RouteReuseStrategy, useClass: IonicRouteStrategy }
],
bootstrap: [AppComponent]
})
export class AppModule {}
app.routing.module.ts
import { NgModule } from '@angular/core';
import { PreloadAllModules, RouterModule, Routes } from '@angular/router';
const routes: Routes = [
{
path: '',
redirectTo: 'login',
pathMatch: 'full'
},
{
path: 'home',
loadChildren: './home/home.module#HomePageModule'
},
{ path: 'login', loadChildren: './login/login.module#LoginPageModule' },
{ path: 'my-profile', loadChildren: './my-profile/my-profile.module#MyProfilePageModule' },
{ path: 'appointments', loadChildren: './appointments/appointments.module#AppointmentsPageModule' },
{ path: 'request-acceptance', loadChildren: './request-acceptance/request-acceptance.module#RequestAcceptancePageModule' },
];
@NgModule({
imports: [
RouterModule.forRoot(routes, { preloadingStrategy: PreloadAllModules })
],
exports: [RouterModule]
})
export class AppRoutingModule { }
我发现这个类似 但我无法在我的应用程序中执行此操作。
实施一个守卫,如果用户登录则重定向到主页
试试这个:
在src/guard/auth.guard.ts
创建守卫
import { Injectable } from '@angular/core';
import { CanActivate, ActivatedRouteSnapshot, RouterStateSnapshot, Router } from '@angular/router';
import { Observable } from 'rxjs';
@Injectable({
providedIn: 'root'
})
export class AuthGuard implements CanActivate {
constructor(
private router:Router,
){}
canActivate(
next: ActivatedRouteSnapshot,
state: RouterStateSnapshot): Observable<boolean> | Promise<boolean> | boolean {
if(localStorage.getItem('user_id') != undefined || null){
return true;
}else{
this.router.navigate(['/login']);
return false;
}
}
}
app.component.ts
import { Component } from '@angular/core';
import { Platform } from '@ionic/angular';
import { SplashScreen } from '@ionic-native/splash-screen/ngx';
import { StatusBar } from '@ionic-native/status-bar/ngx';
@Component({
selector: 'app-root',
templateUrl: 'app.component.html'
})
export class AppComponent {
constructor(
private platform: Platform,
private splashScreen: SplashScreen,
private statusBar: StatusBar
) {
this.initializeApp();
}
initializeApp() {
this.platform.ready().then(() => {
this.statusBar.styleDefault();
});
if (localStorage.getItem("user_id") != undefined || null) {
this.router.navigate(['/home']);
} else {
this.router.navigate(['/login'])
}
}
}
app-routing.module.ts
import { NgModule } from '@angular/core';
import { PreloadAllModules, RouterModule, Routes } from '@angular/router';
import {AuthGuard} from './guard/auth.guard'; //add this
const routes: Routes = [
{
path: '',
redirectTo: 'login',
pathMatch: 'full'
},
{
path: 'home',
loadChildren: './home/home.module#HomePageModule',canActivate:[AuthGuard] //Use canActive:[AuthGuard] to protect routing if user is not logged in.
},
{ path: 'login', loadChildren: './login/login.module#LoginPageModule' },
{ path: 'my-profile', loadChildren: './my-profile/my-profile.module#MyProfilePageModule'},
{ path: 'appointments', loadChildren: './appointments/appointments.module#AppointmentsPageModule' },
{ path: 'request-acceptance', loadChildren: './request-acceptance/request-acceptance.module#RequestAcceptancePageModule' },
];
@NgModule({
imports: [
RouterModule.forRoot(routes, { preloadingStrategy: PreloadAllModules })
],
exports: [RouterModule]
})
export class AppRoutingModule { }
app.module.ts
import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { RouteReuseStrategy } from '@angular/router';
import { IonicModule, IonicRouteStrategy } from '@ionic/angular';
import { SplashScreen } from '@ionic-native/splash-screen/ngx';
import { StatusBar } from '@ionic-native/status-bar/ngx';
import { AppComponent } from './app.component';
import { AppRoutingModule } from './app-routing.module';
import { HttpClientModule } from '@angular/common/http';
import { HttpModule } from '@angular/http';
import {AuthGuard} from './guard/auth.guard'; //add this
import { FormsModule, ReactiveFormsModule } from '@angular/forms';
@NgModule({
declarations: [AppComponent],
entryComponents: [],
imports: [
BrowserModule,
IonicModule.forRoot(),
AppRoutingModule,
HttpModule,
HttpClientModule,
FormsModule,
ReactiveFormsModule ,
],
providers: [
StatusBar,
SplashScreen,
AuthGuard, //add this
{ provide: RouteReuseStrategy, useClass: IonicRouteStrategy }
],
bootstrap: [AppComponent]
})
export class AppModule {}
将您的登录组件设置为默认页面。在登录组件中
ngOninit(){
if(localStorage.getItem('user_id') != undefined || null){
//Redirect to Homepage
}
else{
//do nothing
}
}
当您加载第一个页面(即登录页面)时。它将检查您是否将登录 ID 存储在本地存储中,因为我们在登录页面的 Oninit 中写了条件。如果是,它会自动重定向到您的主页,如果不是,那么它将保留在同一页面。
在我的离子应用程序 (v-4) 中,在 登录 之后,我将 user_id
存储在 local storage
中,如下所示:
onLogin(){
localStorage.setItem('user_id', this.loginForm.user_id);
}
并且我已将
login page
设置为landing page
,在login page
之后,用户将被路由home page
。此路由工作正常。但是,如果用户再次打开
app
它应该显示home page
作为着陆页,因为应用程序已经将user_id
存储在其local storage
.
代码
app.component.html
<ion-router-outlet main></ion-router-outlet>
app.component.ts
import { Component } from '@angular/core';
import { Platform } from '@ionic/angular';
import { SplashScreen } from '@ionic-native/splash-screen/ngx';
import { StatusBar } from '@ionic-native/status-bar/ngx';
@Component({
selector: 'app-root',
templateUrl: 'app.component.html'
})
export class AppComponent {
constructor(
private platform: Platform,
private splashScreen: SplashScreen,
private statusBar: StatusBar
) {
this.initializeApp();
}
initializeApp() {
this.platform.ready().then(() => {
this.statusBar.styleDefault();
});
}
}
app.module.ts
import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { RouteReuseStrategy } from '@angular/router';
import { IonicModule, IonicRouteStrategy } from '@ionic/angular';
import { SplashScreen } from '@ionic-native/splash-screen/ngx';
import { StatusBar } from '@ionic-native/status-bar/ngx';
import { AppComponent } from './app.component';
import { AppRoutingModule } from './app-routing.module';
import { HttpClientModule } from '@angular/common/http';
import { HttpModule } from '@angular/http';
import { FormsModule, ReactiveFormsModule } from '@angular/forms';
@NgModule({
declarations: [AppComponent],
entryComponents: [],
imports: [
BrowserModule,
IonicModule.forRoot(),
AppRoutingModule,
HttpModule,
HttpClientModule,
FormsModule,
ReactiveFormsModule ,
],
providers: [
StatusBar,
SplashScreen,
{ provide: RouteReuseStrategy, useClass: IonicRouteStrategy }
],
bootstrap: [AppComponent]
})
export class AppModule {}
app.routing.module.ts
import { NgModule } from '@angular/core';
import { PreloadAllModules, RouterModule, Routes } from '@angular/router';
const routes: Routes = [
{
path: '',
redirectTo: 'login',
pathMatch: 'full'
},
{
path: 'home',
loadChildren: './home/home.module#HomePageModule'
},
{ path: 'login', loadChildren: './login/login.module#LoginPageModule' },
{ path: 'my-profile', loadChildren: './my-profile/my-profile.module#MyProfilePageModule' },
{ path: 'appointments', loadChildren: './appointments/appointments.module#AppointmentsPageModule' },
{ path: 'request-acceptance', loadChildren: './request-acceptance/request-acceptance.module#RequestAcceptancePageModule' },
];
@NgModule({
imports: [
RouterModule.forRoot(routes, { preloadingStrategy: PreloadAllModules })
],
exports: [RouterModule]
})
export class AppRoutingModule { }
我发现这个类似
实施一个守卫,如果用户登录则重定向到主页 试试这个:
在src/guard/auth.guard.ts
创建守卫import { Injectable } from '@angular/core';
import { CanActivate, ActivatedRouteSnapshot, RouterStateSnapshot, Router } from '@angular/router';
import { Observable } from 'rxjs';
@Injectable({
providedIn: 'root'
})
export class AuthGuard implements CanActivate {
constructor(
private router:Router,
){}
canActivate(
next: ActivatedRouteSnapshot,
state: RouterStateSnapshot): Observable<boolean> | Promise<boolean> | boolean {
if(localStorage.getItem('user_id') != undefined || null){
return true;
}else{
this.router.navigate(['/login']);
return false;
}
}
}
app.component.ts
import { Component } from '@angular/core';
import { Platform } from '@ionic/angular';
import { SplashScreen } from '@ionic-native/splash-screen/ngx';
import { StatusBar } from '@ionic-native/status-bar/ngx';
@Component({
selector: 'app-root',
templateUrl: 'app.component.html'
})
export class AppComponent {
constructor(
private platform: Platform,
private splashScreen: SplashScreen,
private statusBar: StatusBar
) {
this.initializeApp();
}
initializeApp() {
this.platform.ready().then(() => {
this.statusBar.styleDefault();
});
if (localStorage.getItem("user_id") != undefined || null) {
this.router.navigate(['/home']);
} else {
this.router.navigate(['/login'])
}
}
}
app-routing.module.ts
import { NgModule } from '@angular/core';
import { PreloadAllModules, RouterModule, Routes } from '@angular/router';
import {AuthGuard} from './guard/auth.guard'; //add this
const routes: Routes = [
{
path: '',
redirectTo: 'login',
pathMatch: 'full'
},
{
path: 'home',
loadChildren: './home/home.module#HomePageModule',canActivate:[AuthGuard] //Use canActive:[AuthGuard] to protect routing if user is not logged in.
},
{ path: 'login', loadChildren: './login/login.module#LoginPageModule' },
{ path: 'my-profile', loadChildren: './my-profile/my-profile.module#MyProfilePageModule'},
{ path: 'appointments', loadChildren: './appointments/appointments.module#AppointmentsPageModule' },
{ path: 'request-acceptance', loadChildren: './request-acceptance/request-acceptance.module#RequestAcceptancePageModule' },
];
@NgModule({
imports: [
RouterModule.forRoot(routes, { preloadingStrategy: PreloadAllModules })
],
exports: [RouterModule]
})
export class AppRoutingModule { }
app.module.ts
import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { RouteReuseStrategy } from '@angular/router';
import { IonicModule, IonicRouteStrategy } from '@ionic/angular';
import { SplashScreen } from '@ionic-native/splash-screen/ngx';
import { StatusBar } from '@ionic-native/status-bar/ngx';
import { AppComponent } from './app.component';
import { AppRoutingModule } from './app-routing.module';
import { HttpClientModule } from '@angular/common/http';
import { HttpModule } from '@angular/http';
import {AuthGuard} from './guard/auth.guard'; //add this
import { FormsModule, ReactiveFormsModule } from '@angular/forms';
@NgModule({
declarations: [AppComponent],
entryComponents: [],
imports: [
BrowserModule,
IonicModule.forRoot(),
AppRoutingModule,
HttpModule,
HttpClientModule,
FormsModule,
ReactiveFormsModule ,
],
providers: [
StatusBar,
SplashScreen,
AuthGuard, //add this
{ provide: RouteReuseStrategy, useClass: IonicRouteStrategy }
],
bootstrap: [AppComponent]
})
export class AppModule {}
将您的登录组件设置为默认页面。在登录组件中
ngOninit(){
if(localStorage.getItem('user_id') != undefined || null){
//Redirect to Homepage
}
else{
//do nothing
}
}
当您加载第一个页面(即登录页面)时。它将检查您是否将登录 ID 存储在本地存储中,因为我们在登录页面的 Oninit 中写了条件。如果是,它会自动重定向到您的主页,如果不是,那么它将保留在同一页面。