|  | @@ -0,0 +1,314 @@
 | 
	
		
			
				|  |  | +import { Component, ElementRef, OnInit, ViewChild } from '@angular/core';
 | 
	
		
			
				|  |  | +import { CommonModule } from '@angular/common';
 | 
	
		
			
				|  |  | +import { FormsModule,ReactiveFormsModule } from '@angular/forms';
 | 
	
		
			
				|  |  | +import{Router} from '@angular/router';
 | 
	
		
			
				|  |  | +import { IonAvatar, IonBackButton, IonButton, IonButtons, IonContent, IonHeader, IonIcon, 
 | 
	
		
			
				|  |  | +  IonItem, IonLabel, IonList, IonTitle, IonToolbar,ToastController, AlertController,IonCard, IonCardHeader, IonCardTitle} from '@ionic/angular/standalone';
 | 
	
		
			
				|  |  | +import { UserService } from '../services/user.service';
 | 
	
		
			
				|  |  | +import { ActionSheetController } from '@ionic/angular';
 | 
	
		
			
				|  |  | +import { Camera, CameraResultType, CameraSource } from '@capacitor/camera';
 | 
	
		
			
				|  |  | + 
 | 
	
		
			
				|  |  | +interface User {
 | 
	
		
			
				|  |  | +  username: string;
 | 
	
		
			
				|  |  | +  avatar: string;
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +@Component({
 | 
	
		
			
				|  |  | +  selector: 'app-tab4',
 | 
	
		
			
				|  |  | +  templateUrl: './tab4.page.html',
 | 
	
		
			
				|  |  | +  styleUrls: ['./tab4.page.scss'],
 | 
	
		
			
				|  |  | +  standalone: true,
 | 
	
		
			
				|  |  | +  imports: [IonContent, IonHeader,  IonToolbar, CommonModule, FormsModule,
 | 
	
		
			
				|  |  | +    IonAvatar,IonList,IonItem,IonLabel,IonButtons,IonCard,IonIcon,IonTitle,IonButton,IonCardHeader,IonCardTitle]
 | 
	
		
			
				|  |  | +})
 | 
	
		
			
				|  |  | +export class Tab4Page implements OnInit {
 | 
	
		
			
				|  |  | +  isLoggedIn: boolean = false;
 | 
	
		
			
				|  |  | +  user: User = {
 | 
	
		
			
				|  |  | +    username: 'User_123456',
 | 
	
		
			
				|  |  | +    avatar: 'assets/default-avatar.png'
 | 
	
		
			
				|  |  | +  };
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  @ViewChild('fileInput') fileInput!: ElementRef;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  constructor(
 | 
	
		
			
				|  |  | +    private router: Router,
 | 
	
		
			
				|  |  | +    private alertController: AlertController,
 | 
	
		
			
				|  |  | +    private actionSheetController: ActionSheetController,
 | 
	
		
			
				|  |  | +    private userService: UserService
 | 
	
		
			
				|  |  | +  ) {}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  ngOnInit() {
 | 
	
		
			
				|  |  | +    this.checkLoginStatus();
 | 
	
		
			
				|  |  | +    this.subscribeToUserChanges();
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  subscribeToUserChanges() {
 | 
	
		
			
				|  |  | +    this.userService.currentUser$.subscribe(user => {
 | 
	
		
			
				|  |  | +      if (user) {
 | 
	
		
			
				|  |  | +        this.user = user;
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +    });
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  checkLoginStatus() {
 | 
	
		
			
				|  |  | +    this.userService.isLoggedIn$.subscribe(
 | 
	
		
			
				|  |  | +      isLoggedIn => {
 | 
	
		
			
				|  |  | +        this.isLoggedIn = isLoggedIn;
 | 
	
		
			
				|  |  | +        if (isLoggedIn) {
 | 
	
		
			
				|  |  | +          // 获取用户信息
 | 
	
		
			
				|  |  | +          this.userService.getCurrentUser().subscribe(user => {
 | 
	
		
			
				|  |  | +            if (user) {
 | 
	
		
			
				|  |  | +              this.user = user;
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +          });
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +    );
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  async changeAvatar() {
 | 
	
		
			
				|  |  | +    try {
 | 
	
		
			
				|  |  | +      const actionSheet = await this.actionSheetController.create({
 | 
	
		
			
				|  |  | +        header: '选择头像',
 | 
	
		
			
				|  |  | +        buttons: [
 | 
	
		
			
				|  |  | +          {
 | 
	
		
			
				|  |  | +            text: '拍照',
 | 
	
		
			
				|  |  | +            icon: 'camera',
 | 
	
		
			
				|  |  | +            handler: () => {
 | 
	
		
			
				|  |  | +              this.takePicture('camera');
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +          },
 | 
	
		
			
				|  |  | +          {
 | 
	
		
			
				|  |  | +            text: '从相册选择',
 | 
	
		
			
				|  |  | +            icon: 'image',
 | 
	
		
			
				|  |  | +            handler: () => {
 | 
	
		
			
				|  |  | +              this.takePicture('photos');
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +          },
 | 
	
		
			
				|  |  | +          {
 | 
	
		
			
				|  |  | +            text: '从电脑选择',
 | 
	
		
			
				|  |  | +            icon: 'desktop',
 | 
	
		
			
				|  |  | +            handler: () => {
 | 
	
		
			
				|  |  | +              this.fileInput.nativeElement.click();
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +          },
 | 
	
		
			
				|  |  | +          {
 | 
	
		
			
				|  |  | +            text: '取消',
 | 
	
		
			
				|  |  | +            icon: 'close',
 | 
	
		
			
				|  |  | +            role: 'cancel'
 | 
	
		
			
				|  |  | +          }
 | 
	
		
			
				|  |  | +        ]
 | 
	
		
			
				|  |  | +      });
 | 
	
		
			
				|  |  | +      await actionSheet.present();
 | 
	
		
			
				|  |  | +    } catch (error) {
 | 
	
		
			
				|  |  | +      console.error('Error showing action sheet:', error);
 | 
	
		
			
				|  |  | +      this.showAlert('错误', '无法打开选择菜单');
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  private async takePicture(sourceType: 'camera' | 'photos') {
 | 
	
		
			
				|  |  | +    try {
 | 
	
		
			
				|  |  | +      const image = await Camera.getPhoto({
 | 
	
		
			
				|  |  | +        quality: 90,
 | 
	
		
			
				|  |  | +        allowEditing: true,
 | 
	
		
			
				|  |  | +        resultType: CameraResultType.DataUrl,
 | 
	
		
			
				|  |  | +        source: sourceType === 'camera' ? CameraSource.Camera : CameraSource.Photos
 | 
	
		
			
				|  |  | +      });
 | 
	
		
			
				|  |  | +      
 | 
	
		
			
				|  |  | +      if (image && image.dataUrl) {
 | 
	
		
			
				|  |  | +        // 先更新本地显示
 | 
	
		
			
				|  |  | +        this.user.avatar = image.dataUrl;
 | 
	
		
			
				|  |  | +        
 | 
	
		
			
				|  |  | +        // 然后保存到服务
 | 
	
		
			
				|  |  | +        this.userService.updateAvatar(image.dataUrl).subscribe(
 | 
	
		
			
				|  |  | +          response => {
 | 
	
		
			
				|  |  | +            if (response.success) {
 | 
	
		
			
				|  |  | +              this.showAlert('成功', '头像更新成功');
 | 
	
		
			
				|  |  | +            } else {
 | 
	
		
			
				|  |  | +              // 如果更新失败,恢复原来的头像
 | 
	
		
			
				|  |  | +              this.userService.getCurrentUser().subscribe(user => {
 | 
	
		
			
				|  |  | +                if (user) {
 | 
	
		
			
				|  |  | +                  this.user.avatar = user.avatar;
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +              });
 | 
	
		
			
				|  |  | +              this.showAlert('错误', '头像更新失败');
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +          },
 | 
	
		
			
				|  |  | +          error => {
 | 
	
		
			
				|  |  | +            console.error('Error updating avatar:', error);
 | 
	
		
			
				|  |  | +            this.showAlert('错误', '头像更新失败');
 | 
	
		
			
				|  |  | +          }
 | 
	
		
			
				|  |  | +        );
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +    } catch (error) {
 | 
	
		
			
				|  |  | +      console.error('Error taking photo:', error);
 | 
	
		
			
				|  |  | +      this.showAlert('错误', '获取图片失败');
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  async changePassword() {
 | 
	
		
			
				|  |  | +    const alert = await this.alertController.create({
 | 
	
		
			
				|  |  | +      header: '修改密码',
 | 
	
		
			
				|  |  | +      inputs: [
 | 
	
		
			
				|  |  | +        {
 | 
	
		
			
				|  |  | +          name: 'oldPassword',
 | 
	
		
			
				|  |  | +          type: 'password',
 | 
	
		
			
				|  |  | +          placeholder: '请输入原密码'
 | 
	
		
			
				|  |  | +        },
 | 
	
		
			
				|  |  | +        {
 | 
	
		
			
				|  |  | +          name: 'newPassword',
 | 
	
		
			
				|  |  | +          type: 'password',
 | 
	
		
			
				|  |  | +          placeholder: '请输入新密码'
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +      ],
 | 
	
		
			
				|  |  | +      buttons: [
 | 
	
		
			
				|  |  | +        {
 | 
	
		
			
				|  |  | +          text: '取消',
 | 
	
		
			
				|  |  | +          role: 'cancel'
 | 
	
		
			
				|  |  | +        },
 | 
	
		
			
				|  |  | +        {
 | 
	
		
			
				|  |  | +          text: '确定',
 | 
	
		
			
				|  |  | +          handler: (data) => {
 | 
	
		
			
				|  |  | +            this.userService.changePassword(data.oldPassword, data.newPassword).subscribe(
 | 
	
		
			
				|  |  | +              response => {
 | 
	
		
			
				|  |  | +                if (response.success) {
 | 
	
		
			
				|  |  | +                  this.showAlert('成功', '密码修改成功');
 | 
	
		
			
				|  |  | +                } else {
 | 
	
		
			
				|  |  | +                  this.showAlert('错误', response.message || '密码修改失败');
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +              }
 | 
	
		
			
				|  |  | +            );
 | 
	
		
			
				|  |  | +          }
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +      ]
 | 
	
		
			
				|  |  | +    });
 | 
	
		
			
				|  |  | +    await alert.present();
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  async switchAccount() {
 | 
	
		
			
				|  |  | +    const alert = await this.alertController.create({
 | 
	
		
			
				|  |  | +      header: '切换账号',
 | 
	
		
			
				|  |  | +      inputs: [
 | 
	
		
			
				|  |  | +        {
 | 
	
		
			
				|  |  | +          name: 'phone',
 | 
	
		
			
				|  |  | +          type: 'tel',
 | 
	
		
			
				|  |  | +          placeholder: '请输入手机号'
 | 
	
		
			
				|  |  | +        },
 | 
	
		
			
				|  |  | +        {
 | 
	
		
			
				|  |  | +          name: 'password',
 | 
	
		
			
				|  |  | +          type: 'password',
 | 
	
		
			
				|  |  | +          placeholder: '请输入密码'
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +      ],
 | 
	
		
			
				|  |  | +      buttons: [
 | 
	
		
			
				|  |  | +        {
 | 
	
		
			
				|  |  | +          text: '取消',
 | 
	
		
			
				|  |  | +          role: 'cancel'
 | 
	
		
			
				|  |  | +        },
 | 
	
		
			
				|  |  | +        {
 | 
	
		
			
				|  |  | +          text: '确定',
 | 
	
		
			
				|  |  | +          handler: (data) => {
 | 
	
		
			
				|  |  | +            this.userService.switchAccount(data).subscribe(
 | 
	
		
			
				|  |  | +              response => {
 | 
	
		
			
				|  |  | +                if (response.success) {
 | 
	
		
			
				|  |  | +                  this.showAlert('成功', '账号切换成功');
 | 
	
		
			
				|  |  | +                  this.checkLoginStatus();
 | 
	
		
			
				|  |  | +                } else {
 | 
	
		
			
				|  |  | +                  this.showAlert('错误', '账号或密码错误');
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +              }
 | 
	
		
			
				|  |  | +            );
 | 
	
		
			
				|  |  | +          }
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +      ]
 | 
	
		
			
				|  |  | +    });
 | 
	
		
			
				|  |  | +    await alert.present();
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  async showLogoutConfirm() {
 | 
	
		
			
				|  |  | +    const alert = await this.alertController.create({
 | 
	
		
			
				|  |  | +      header: '确认注销账号',
 | 
	
		
			
				|  |  | +      message: '您确定要注销账号吗?此操作不可逆',
 | 
	
		
			
				|  |  | +      buttons: [
 | 
	
		
			
				|  |  | +        {
 | 
	
		
			
				|  |  | +          text: '取消',
 | 
	
		
			
				|  |  | +          role: 'cancel'
 | 
	
		
			
				|  |  | +        },
 | 
	
		
			
				|  |  | +        {
 | 
	
		
			
				|  |  | +          text: '确定',
 | 
	
		
			
				|  |  | +          handler: () => {
 | 
	
		
			
				|  |  | +            this.userService.deleteAccount().subscribe(
 | 
	
		
			
				|  |  | +              response => {
 | 
	
		
			
				|  |  | +                if (response.success) {
 | 
	
		
			
				|  |  | +                  this.userService.logout();
 | 
	
		
			
				|  |  | +                  this.router.navigate(['/login']);
 | 
	
		
			
				|  |  | +                }
 | 
	
		
			
				|  |  | +              }
 | 
	
		
			
				|  |  | +            );
 | 
	
		
			
				|  |  | +          }
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +      ]
 | 
	
		
			
				|  |  | +    });
 | 
	
		
			
				|  |  | +    await alert.present();
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  private async showAlert(header: string, message: string) {
 | 
	
		
			
				|  |  | +    const alert = await this.alertController.create({
 | 
	
		
			
				|  |  | +      header,
 | 
	
		
			
				|  |  | +      message,
 | 
	
		
			
				|  |  | +      buttons: ['确定']
 | 
	
		
			
				|  |  | +    });
 | 
	
		
			
				|  |  | +    await alert.present();
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  goToCreativeCenter() {
 | 
	
		
			
				|  |  | +    this.router.navigate(['/tabs/tab1']);
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  goToLogin() {
 | 
	
		
			
				|  |  | +    this.router.navigate(['/login']);
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  goToRegister() {
 | 
	
		
			
				|  |  | +    this.router.navigate(['/register']);
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  async uploadAvatarFromFile(event: any) {
 | 
	
		
			
				|  |  | +    const file = event.target.files[0];
 | 
	
		
			
				|  |  | +    if (file) {
 | 
	
		
			
				|  |  | +      try {
 | 
	
		
			
				|  |  | +        const reader = new FileReader();
 | 
	
		
			
				|  |  | +        reader.onload = (e: any) => {
 | 
	
		
			
				|  |  | +          const imageData = e.target.result;
 | 
	
		
			
				|  |  | +          // 先更新本地显示
 | 
	
		
			
				|  |  | +          this.user.avatar = imageData;
 | 
	
		
			
				|  |  | +          
 | 
	
		
			
				|  |  | +          // 然后保存到服务
 | 
	
		
			
				|  |  | +          this.userService.updateAvatar(imageData).subscribe(
 | 
	
		
			
				|  |  | +            response => {
 | 
	
		
			
				|  |  | +              if (response.success) {
 | 
	
		
			
				|  |  | +                this.showAlert('成功', '头像更新成功');
 | 
	
		
			
				|  |  | +              } else {
 | 
	
		
			
				|  |  | +                // 如果更新失败,恢复原来的头像
 | 
	
		
			
				|  |  | +                this.userService.getCurrentUser().subscribe(user => {
 | 
	
		
			
				|  |  | +                  if (user) {
 | 
	
		
			
				|  |  | +                    this.user.avatar = user.avatar;
 | 
	
		
			
				|  |  | +                  }
 | 
	
		
			
				|  |  | +                });
 | 
	
		
			
				|  |  | +                this.showAlert('错误', '头像更新失败');
 | 
	
		
			
				|  |  | +              }
 | 
	
		
			
				|  |  | +            },
 | 
	
		
			
				|  |  | +            error => {
 | 
	
		
			
				|  |  | +              console.error('Error updating avatar:', error);
 | 
	
		
			
				|  |  | +              this.showAlert('错误', '头像更新失败');
 | 
	
		
			
				|  |  | +            }
 | 
	
		
			
				|  |  | +          );
 | 
	
		
			
				|  |  | +        };
 | 
	
		
			
				|  |  | +        reader.readAsDataURL(file);
 | 
	
		
			
				|  |  | +      } catch (error) {
 | 
	
		
			
				|  |  | +        console.error('Error reading file:', error);
 | 
	
		
			
				|  |  | +        this.showAlert('错误', '文件读取失败');
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +} 
 |