如何在Angular MEAN栈项目中实现登录后在Admin页面头部显示当前管理员的所属中心名称?
实现登录后在Admin页面显示所属中心名称
我来帮你一步步搞定这个需求,核心思路是登录时获取管理员的cname并妥善存储,然后在目标组件中读取并展示,具体步骤如下:
1. 确保后端登录接口返回包含cname的管理员信息
首先得修改你的后端登录接口(假设是/api/auth/login这类路由),当管理员登录验证通过后,返回包含cname的用户数据(注意别把密码返回出去)。
示例后端登录路由代码(补充你未提供的部分):
// 假设在auth.js路由文件中 const Admin = require('./models/admin'); const jwt = require('jsonwebtoken'); const bcrypt = require('bcryptjs'); router.post('/login', async (req, res) => { try { const { username, password } = req.body; // 查找对应管理员 const admin = await Admin.findOne({ username }); if (!admin) { return res.status(401).json({ message: '账号或密码错误' }); } // 验证密码(假设你注册时用bcrypt加密了密码) const isPasswordValid = await bcrypt.compare(password, admin.password); if (!isPasswordValid) { return res.status(401).json({ message: '账号或密码错误' }); } // 生成JWT,把cname存入payload const token = jwt.sign( { adminId: admin._id, username: admin.username, cname: admin.cname }, process.env.JWT_SECRET, { expiresIn: '1h' } ); // 返回token和管理员核心信息(包含cname) res.status(200).json({ token, admin: { username: admin.username, fullname: admin.fullname, cname: admin.cname // 重点:返回中心名称 } }); } catch (err) { res.status(500).json({ message: '服务器内部错误' }); } });
2. 前端AuthService处理登录并存储cname
修改你的AuthService,用RxJS的BehaviorSubject来管理当前管理员信息(比直接用localStorage更符合Angular响应式风格),同时在登录成功后把信息持久化到localStorage,避免页面刷新丢失。
示例auth.service.ts修改:
import { Injectable } from '@angular/core'; import { HttpClient } from '@angular/common/http'; import { BehaviorSubject, Observable } from 'rxjs'; import { tap } from 'rxjs/operators'; @Injectable({ providedIn: 'root' }) export class AuthService { // 创建BehaviorSubject保存当前管理员信息,初始值为null private currentAdminSubject = new BehaviorSubject<any>(null); // 对外暴露可观察对象,避免外部直接修改Subject public currentAdmin$ = this.currentAdminSubject.asObservable(); constructor(private http: HttpClient) { // 页面刷新时从localStorage恢复数据 const savedAdmin = localStorage.getItem('currentAdmin'); if (savedAdmin) { this.currentAdminSubject.next(JSON.parse(savedAdmin)); } } // 登录方法 login(username: string, password: string): Observable<any> { return this.http.post('/api/auth/login', { username, password }) .pipe( tap(response => { const { admin, token } = response; // 存储token(如果之前有做的话) localStorage.setItem('token', token); // 存储管理员信息到localStorage和BehaviorSubject localStorage.setItem('currentAdmin', JSON.stringify(admin)); this.currentAdminSubject.next(admin); }) ); } // 保留你原有的注册方法 createAdmin(username: string, password: string, fullname: string, email: string, staffid: string, cname: string) { return this.http.post('/api/auth/signup', { username, password, fullname, email, staffid, cname }); } // 新增登出方法,清理存储 logout() { localStorage.removeItem('token'); localStorage.removeItem('currentAdmin'); this.currentAdminSubject.next(null); } }
3. 在VaccinePage组件中获取并展示cname
现在修改vaccinePage.component.ts,订阅AuthService的currentAdmin$来获取中心名称,再在模板中展示。
修改vaccinePage.component.ts:
import { Component, OnInit } from '@angular/core'; import { AuthService } from 'src/app/auth.service'; @Component({ selector: 'app-vaccine-page', templateUrl: './vaccinePage.component.html', styleUrls: ['./vaccinePage.component.css'] }) export class VaccinePageComponent implements OnInit { currentAdminCname: string | undefined; constructor(private authService: AuthService) {} ngOnInit(): void { // 订阅管理员信息变化,自动更新中心名称 this.authService.currentAdmin$.subscribe(admin => { if (admin) { this.currentAdminCname = admin.cname; } }); } }
修改vaccinePage.component.html,在头部添加中心名称:
把原有的mat-toolbar部分修改,加入中心名称展示(可以放在左侧或右侧,这里示例放在右侧):
<mat-toolbar color="primary"> <mat-toolbar-row> <button mat-icon-button> <mat-icon (click)="sidenav.toggle()">menu</mat-icon> </button> <!-- 添加占位符把名称推到右侧 --> <span class="spacer"></span> <!-- 展示中心名称 --> <span style="margin-right: 1rem;">当前中心:{{ currentAdminCname }}</span> </mat-toolbar-row> </mat-toolbar> <!-- 其余代码保持不变 -->
同时在组件CSS中添加占位符样式:
.spacer { flex: 1 1 auto; }
关键注意点
- 后端登录接口一定要确保返回
cname字段,否则前端拿不到数据。 - 使用
BehaviorSubject的好处是,当管理员登出或信息变化时,组件会自动更新视图,无需手动刷新。 - 页面刷新时通过
AuthService构造函数恢复数据,避免信息丢失。
这样修改后,管理员登录成功进入VaccinePage时,页面头部就会显示他注册时填写的所属中心名称了。
内容的提问来源于stack exchange,提问作者Zee
相关产品推荐
相关产品推荐

