|
|
@@ -1,14 +1,15 @@
|
|
|
-import {Component, inject, signal} from '@angular/core';
|
|
|
+import {Component, computed, inject, signal} from '@angular/core';
|
|
|
import {FormsModule} from '@angular/forms';
|
|
|
import {Router} from '@angular/router';
|
|
|
import {finalize} from 'rxjs';
|
|
|
import {ApiService} from '../../core/api.service';
|
|
|
import {SessionService} from '../../core/session.service';
|
|
|
@Component({selector:'app-password-page',standalone:true,imports:[FormsModule],template:`
|
|
|
- <main><h1>修改登录密码</h1><p>{{sessions.user()?.['passwordResetRequired'] ? '请先将临时密码改为自己的密码,再继续使用。' : '修改成功后,需要重新登录。'}}</p>
|
|
|
- <form (ngSubmit)="save()"><fieldset [disabled]="saving()"><label>当前密码<input name="old" type="password" autocomplete="current-password" [(ngModel)]="oldPassword" required></label><label>新密码<input name="new" type="password" autocomplete="new-password" [(ngModel)]="newPassword" minlength="8" maxlength="72" required></label><label>确认新密码<input name="confirm" type="password" autocomplete="new-password" [(ngModel)]="confirmation" required></label><p>新密码为 8 至 72 位。</p>@if(error()){<p role="alert">{{error()}}</p>}<button class="primary-button" type="submit">{{saving()?'正在保存…':'保存并重新登录'}}</button></fieldset></form></main>`,styles:[`main{max-width:520px;margin:24px auto;padding:20px}fieldset{border:0;padding:0;display:grid;gap:16px}label{display:grid;gap:8px}input,button{min-height:44px}input{border:1px solid #cadbd6;border-radius:10px;padding:10px}p[role=alert]{color:#b42318}`]})
|
|
|
+ <main><h1>修改登录密码</h1>@if(isMember()){<p>学生登录密码由管理员统一管理。如需重置,请联系管理员。</p>}@else{<p>{{sessions.user()?.['passwordResetRequired'] ? '请先将临时密码改为自己的密码,再继续使用。' : '修改成功后,需要重新登录。'}}</p>
|
|
|
+ <form (ngSubmit)="save()"><fieldset [disabled]="saving()"><label>当前密码<input name="old" type="password" autocomplete="current-password" [(ngModel)]="oldPassword" required></label><label>新密码<input name="new" type="password" autocomplete="new-password" [(ngModel)]="newPassword" minlength="8" maxlength="72" required></label><label>确认新密码<input name="confirm" type="password" autocomplete="new-password" [(ngModel)]="confirmation" required></label><p>新密码为 8 至 72 位。</p>@if(error()){<p role="alert">{{error()}}</p>}<button class="primary-button" type="submit">{{saving()?'正在保存…':'保存并重新登录'}}</button></fieldset></form>}</main>`,styles:[`main{max-width:520px;margin:24px auto;padding:20px}fieldset{border:0;padding:0;display:grid;gap:16px}label{display:grid;gap:8px}input,button{min-height:44px}input{border:1px solid #cadbd6;border-radius:10px;padding:10px}p[role=alert]{color:#b42318}`]})
|
|
|
export class PasswordPageComponent {
|
|
|
readonly sessions=inject(SessionService);private readonly api=inject(ApiService);private readonly router=inject(Router);
|
|
|
+ readonly isMember=computed(()=>Number(this.sessions.user()?.groupId)===1||this.sessions.user()?.['identityType']==='member');
|
|
|
oldPassword='';newPassword='';confirmation='';readonly saving=signal(false);readonly error=signal('');
|
|
|
- save(){if(this.saving())return;this.error.set('');if(!this.oldPassword||this.newPassword.length<8||this.newPassword.length>72||this.newPassword!==this.confirmation){this.error.set('请填写当前密码及一致的 8 至 72 位新密码');return;}this.saving.set(true);this.api.post('app_password_change',{currentPassword:this.oldPassword,newPassword:this.newPassword}).pipe(finalize(()=>this.saving.set(false))).subscribe({next:()=>{this.oldPassword=this.newPassword=this.confirmation='';this.sessions.logout(false);void this.router.navigate(['/pages/member/wxauth'],{queryParams:{passwordChanged:1}});},error:e=>this.error.set(e.message)});}
|
|
|
+ save(){if(this.saving())return;this.error.set('');if(this.isMember()){this.error.set('学生密码由管理员统一管理');return;}if(!this.oldPassword||this.newPassword.length<8||this.newPassword.length>72||this.newPassword!==this.confirmation){this.error.set('请填写当前密码及一致的 8 至 72 位新密码');return;}this.saving.set(true);this.api.post('app_password_change',{currentPassword:this.oldPassword,newPassword:this.newPassword}).pipe(finalize(()=>this.saving.set(false))).subscribe({next:()=>{this.oldPassword=this.newPassword=this.confirmation='';this.sessions.logout(false);void this.router.navigate(['/pages/member/wxauth'],{queryParams:{passwordChanged:1}});},error:e=>this.error.set(e.message)});}
|
|
|
}
|