| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263 |
- import { CommonModule } from '@angular/common';
- import { ChangeDetectionStrategy, Component, inject, signal } from '@angular/core';
- import { FormsModule } from '@angular/forms';
- import { ActivatedRoute, Router } from '@angular/router';
- import { Eye, EyeOff, LoaderCircle, LockKeyhole, LucideAngularModule, UserRound } from 'lucide-angular';
- import { AdminSessionService } from '../admin-session.service';
- import { CloudFunctionError, CloudFunctionsService } from '../cloud-functions.service';
- import { AdminIdentity } from '../admin.models';
- import { OperationsService } from '../operations.service';
- @Component({
- selector: 'app-admin-login',
- standalone: true,
- imports: [CommonModule, FormsModule, LucideAngularModule],
- templateUrl: './admin-login.component.html',
- styleUrl: './admin-login.component.scss',
- changeDetection: ChangeDetectionStrategy.OnPush,
- })
- export class AdminLoginComponent {
- username = '';
- password = '';
- readonly showPassword = signal(false);
- readonly loading = signal(false);
- readonly error = signal('');
- readonly notice = signal('');
- readonly icons = { Eye, EyeOff, LoaderCircle, LockKeyhole, UserRound };
- private readonly sessions = inject(AdminSessionService);
- private readonly functions = inject(CloudFunctionsService);
- private readonly router = inject(Router);
- private readonly route = inject(ActivatedRoute);
- private readonly operations = inject(OperationsService);
- constructor() { this.username = this.route.snapshot.queryParamMap.get('account')?.trim().slice(0,100) || ''; document.title = '后台登录 · 小树陪练'; if (this.route.snapshot.queryParamMap.get('passwordChanged') === '1') this.notice.set('密码已修改,所有旧会话均已注销,请使用新密码登录。'); }
- async submit(): Promise<void> {
- if (!this.username.trim() || !this.password) {
- this.error.set('请输入管理员账号和密码');
- return;
- }
- this.loading.set(true);
- this.error.set('');
- let attemptToken = '';
- try {
- attemptToken = (await this.sessions.login(this.username, this.password)).sessionToken;
- const returnUrl = this.sessions.session()?.passwordResetRequired ? '/admin/change-password' : this.route.snapshot.queryParamMap.get('returnUrl') || '/admin/dashboard';
- if (this.sessions.session()?.isSuperAdmin && returnUrl.split('?')[0] === '/admin/dashboard') {
- void this.operations.dashboard().catch(() => undefined);
- void import('../layout/admin-shell.component');
- void import('./admin-dashboard.component');
- }
- const meta = await this.functions.admin<{ identity: AdminIdentity }>('meta');
- this.sessions.applyIdentity(meta.identity);
- await this.router.navigateByUrl(meta.identity.operationsRole==='store-admin'&&!this.sessions.session()?.passwordResetRequired?'/admin/store-home':returnUrl);
- } catch (error) {
- // Transient metadata/network failures must not revoke a successful login.
- if (error instanceof CloudFunctionError && error.status === 403 && attemptToken && this.sessions.session()?.sessionToken === attemptToken) this.sessions.logout(false);
- this.error.set(error instanceof Error ? error.message : '登录失败');
- } finally {
- this.loading.set(false);
- }
- }
- }
|