ionic-framework - 如何在 Ionic 4 的侧边菜单中管理 session ?

标签 ionic-framework ionic4

Ionic appside menu
这里我的应用程序概念是 博客应用
在此我需要登录、配置文件等Ionic appside menu如果用户想喜欢或评论任何博客文章,他必须先登录

所以我想管理 session ,如果已经登录的用户所以隐藏登录 ion-item从侧面菜单否则注销 ion-item反之亦然

这是代码

首页.html

   <ion-app>
  <ion-split-pane contentId="main-content" >

    <ion-menu  contentId="main-content" >
      <ion-header>
        <ion-toolbar  color="primary">

          <ion-title>Lady Help Lady</ion-title>
        </ion-toolbar>
      </ion-header>

      <ion-content color="primary">
        <ion-list >
          <ion-menu-toggle auto-hide="false" *ngFor="let p of appPages">
            <ion-item color="primary" [routerDirection]="'root'" [routerLink]="[p.url]">
              <ion-icon slot="start" [name]="p.icon" color="light"></ion-icon>
              <ion-label color="light">
                {{p.title}}
              </ion-label>
            </ion-item>

          </ion-menu-toggle>
          <ion-menu-toggle auto-hide="false" >
            <ion-item color="primary"  *ngIf="showBtnLogin"> 
                <ion-icon slot="start" name="log-in" color="light"></ion-icon>
                <ion-label color="light" (click)="login()">
                   Login
                </ion-label>
            </ion-item>

            <ion-item color="primary"  *ngIf="!showBtnLogin">
                <ion-icon slot="start" name="log-out" color="light"></ion-icon>
                <ion-label color="light" (click)="logout()" > Log Out</ion-label>
            </ion-item>

   </ion-menu-toggle>
        </ion-list>
      </ion-content>

    </ion-menu>
    <ion-router-outlet id="main-content"></ion-router-outlet>
  </ion-split-pane>


</ion-app>

首页.page.ts
import { Component, OnInit } from '@angular/core';
import { Router} from '@angular/router';
import { MenuController } from '@ionic/angular';
import { AuthService } from '../services/auth.service';
import { StorageService } from '../services/storage.service';

@Component({
  selector: 'app-home',
  templateUrl: './home.page.html',
  styleUrls: ['./home.page.scss'],
})
export class HomePage implements OnInit {

  public appPages = [
    {
      title: 'Blog',
      url: '/home/blog',
      icon: 'home'
    },
    {
      title: 'Profile',
      url: '/home/profile',
      icon: 'cog'
    },
    {
      title: 'Change Password',
      url: '/home/change-password',
      icon: 'lock'
    },

    {
      title: 'About Us',
      url: '/home/about-us',
      icon: 'cog'
    },
    {
      title: 'Privacy Policy',
      url: '/home/privacy-policy',
      icon: 'settings'
    }
    ,
    {
      title: 'Terms & Conditions',
      url: '/home/terms-conditions',
      icon: 'paper'
    },
    {
      title: 'Enable Location',
      url: '/home/enable-location',
      icon: 'pin'
    }
    ,
    {
      title: 'Donation',
      url: '/home/donation',
      icon: 'card'
    }


  ];
  public authUser: any;
  showBtnLogin = true;
  // showBtnLogout: boolean = true;
 currentUser: any;
  constructor(private router: Router,
              private authService: AuthService, 
              private menu: MenuController, 
              public storageService: StorageService) { }

  ngOnInit() { 
    this.authService.userData$.subscribe((res: any) => {
      this.authUser = res;
       if (res === null) {
         console.log(res);
         this.showBtnLogin = false;
       } else {
        this.showBtnLogin = true;
       }  
     });
  }
  logout() {
    this.authService.logout();
  }
  login() {
    this.router.navigate(['/home/login']);
  }


}

登录.page.ts
validateInputs() {
    const mobile = this.postData.mobile.trim();
    const password = this.postData.password.trim();
    return (
      this.postData.mobile &&
      this.postData.password &&
      mobile.length > 0 &&
      password.length > 0
    );
  }

  formLogin() {
    if (this.validateInputs()) {
      this.loader.loadingPresent();
      console.log(this.postData);
      this.authService.login(this.postData).subscribe(
        (res: any) => {
          if (res.status === true) {
            this.loader.loadingDismiss();
            // Storing the User data.
            this.storageService.store(AuthConstants.AUTH, res.logindata);
            this.router.navigate(['/home/blog']);
          } else {
            this.loader.loadingDismiss();
            this.toastService.presentToast(res.error);
          }
        },
        (error: any) => {
          this.loader.loadingDismiss();
          this.toastService.presentToast('Network Issue.');
        }
      );
    } else {
      this.loader.loadingDismiss();
      this.toastService.presentToast('Please enter mobile or password.');
    }
  }

存储服务.ts
import { Injectable } from '@angular/core';
import { Plugins } from '@capacitor/core';
const { Storage } = Plugins;
@Injectable({
  providedIn: 'root'
})
export class StorageService {

  constructor() { }
  // Store the value
async store(storageKey: string, value: any) {
  const encryptedValue = btoa(escape(JSON.stringify(value)));
  await Storage.set({
  key: storageKey,
  value: encryptedValue
  });
  }

  // Get the value
  async get(storageKey: string) {
  const ret = await Storage.get({ key: storageKey });
  return JSON.parse(unescape(atob(ret.value)));
  }

  async removeStorageItem(storageKey: string) {
  await Storage.remove({ key: storageKey });
  }

  // Clear storage
  async clear() {
  await Storage.clear();
  }
}

最佳答案

你也可以这样做
在你的 html

 <ion-menu-toggle auto-hide="false" >
          <ion-item color="primary"  *ngIf="showBtnLogin"> 
              <ion-icon slot="start" name="log-in" color="light"></ion-icon>
              <ion-label color="light" (click)="login()">
                 Login
              </ion-label>
          </ion-item>

          <ion-item color="primary"  *ngIf="!showBtnLogin">
              <ion-icon slot="start" name="log-out" color="light"></ion-icon>
              <ion-label color="light" (click)="logout()" > Log Out</ion-label>
          </ion-item>

 </ion-menu-toggle>

在你的 .ts
showBtnLogin: boolean = true;
currentUser: any;

ngOnInit() { 
    this.authService.userData$.subscribe((res: any) => {
      this.authUser = res;
      // this.postData.user_id = res.id;
      console.log(this.authUser.id);
      this.currentUser =  this.authUser;
       if (res === null) {
         this.showBtnLogin = true;
       } else {
        this.showBtnLogin = false;
       }  
     });
}

logout() {
    this.authService.logout();
}

login() {
    this.router.navigate(['/home/login']);
}

关于ionic-framework - 如何在 Ionic 4 的侧边菜单中管理 session ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59517654/

相关文章:

arrays - 访问对象数组中的特定对象属性时返回对象 promise ? ( Angular - ionic )

html - 如何在 ionic 4 中为 ion-item 的内容设置 block 样式?

ionic4 - 无法添加任务 'processDebugGoogleServices',因为具有该名称的任务已存在

ionic4 - 使用电容器的 Ionic4 中的 'base64Data' 类型上不存在属性 'CameraPhoto'

ionic-framework - 屏幕上垂直和水平的 ionic 中心文本

android - 如何在 ionic 框架中获取设备 UUID

android - ionic 页面转换不适用于具有推送功能的页面

cordova - 如何在 Ionic 移动应用程序中为 $cordova 本地通知设置本地镜像图标?

ionic-framework - 十进制 ionic 范围?

ionic-framework - Ionic 4 - 从模态传回数据