|
@@ -1,55 +1,87 @@
|
|
|
<ion-header [translucent]="true">
|
|
|
- <ion-toolbar>
|
|
|
+ <ion-toolbar color="primary">
|
|
|
<ion-title>我的资料</ion-title>
|
|
|
+ <ion-buttons slot="end">
|
|
|
+ @if (isLoggedIn) {
|
|
|
+ <ion-button (click)="logout()">
|
|
|
+ <ion-icon slot="icon-only" name="log-out-outline"></ion-icon>
|
|
|
+ </ion-button>
|
|
|
+ } @else {
|
|
|
+ <ion-button (click)="openLogin()">
|
|
|
+ <ion-icon slot="icon-only" name="log-in-outline"></ion-icon>
|
|
|
+ </ion-button>
|
|
|
+ }
|
|
|
+ </ion-buttons>
|
|
|
</ion-toolbar>
|
|
|
</ion-header>
|
|
|
|
|
|
-<ion-content class="ion-padding">
|
|
|
+<ion-content class="ion-padding" [fullscreen]="true">
|
|
|
<!-- 顶部个人信息区域 -->
|
|
|
<div class="profile-section">
|
|
|
<div class="avatar">
|
|
|
- <img src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0IiBmaWxsPSJub25lIiBzdHJva2U9ImN1cnJlbnRDb2xvciIgc3Ryb2tlLXdpZHRoPSIyIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIGNsYXNzPSJsdWNpZGUgbHVjaWRlLXVzZXIiPjxwYXRoIGQ9Ik0xOSAyMXYtMmE0IDQgMCAwIDAtNC00SDlhNCA0IDAgMCAwLTQgNHYyIi8+PGNpcmNsZSBjeD0iMTIiIGN5PSI3IiByPSI0Ii8+PC9zdmc+" alt="用户头像">
|
|
|
+ <ion-avatar>
|
|
|
+ <img src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0IiBmaWxsPSJub25lIiBzdHJva2U9ImN1cnJlbnRDb2xvciIgc3Ryb2tlLXdpZHRoPSIyIiBzdHJva2UtbGluZWNhcD0icm91bmQiIHN0cm9rZS1saW5lam9pbj0icm91bmQiIGNsYXNzPSJsdWNpZGUgbHVjaWRlLXVzZXIiPjxwYXRoIGQ9Ik0xOSAyMXYtMmE0IDQgMCAwIDAtNC00SDlhNCA0IDAgMCAwLTQgNHYyIi8+PGNpcmNsZSBjeD0iMTIiIGN5PSI3IiByPSI0Ii8+PC9zdmc+" alt="用户头像">
|
|
|
+ </ion-avatar>
|
|
|
</div>
|
|
|
- <div class="profile-info">
|
|
|
- <div class="profile-name">
|
|
|
- <span>运动达人</span>
|
|
|
- <span class="profile-more">></span>
|
|
|
- </div>
|
|
|
- <div class="profile-stats">
|
|
|
- <div class="stat-item">
|
|
|
- <span class="stat-number">128</span> 关注
|
|
|
+
|
|
|
+ @if (isLoggedIn) {
|
|
|
+ <div class="profile-info">
|
|
|
+ <div class="profile-name">
|
|
|
+ <span>{{ currentUser.name }}</span>
|
|
|
+ <span class="profile-more">></span>
|
|
|
</div>
|
|
|
- <div class="stat-item">
|
|
|
- <span class="stat-number">356</span> 粉丝
|
|
|
+ <div class="profile-email">{{ currentUser.email }}</div>
|
|
|
+ <div class="profile-stats">
|
|
|
+ <div class="stat-item">
|
|
|
+ <span class="stat-number">{{ currentUser.stats.following }}</span> 关注
|
|
|
+ </div>
|
|
|
+ <div class="stat-item">
|
|
|
+ <span class="stat-number">{{ currentUser.stats.followers }}</span> 粉丝
|
|
|
+ </div>
|
|
|
+ <div class="stat-item">
|
|
|
+ <span class="stat-number">{{ currentUser.stats.cheers }}</span> 加油
|
|
|
+ </div>
|
|
|
</div>
|
|
|
- <div class="stat-item">
|
|
|
- <span class="stat-number">1,024</span> 加油
|
|
|
+ <div class="badge-container">
|
|
|
+ <ion-chip color="primary">
|
|
|
+ <ion-icon name="time-outline"></ion-icon>
|
|
|
+ <ion-label>累计运动 {{ currentUser.stats.hours }}h</ion-label>
|
|
|
+ </ion-chip>
|
|
|
+ <ion-chip color="secondary">
|
|
|
+ <ion-icon name="calendar-outline"></ion-icon>
|
|
|
+ <ion-label>坚持运动 {{ currentUser.stats.days }}天</ion-label>
|
|
|
+ </ion-chip>
|
|
|
+ <ion-chip color="tertiary">
|
|
|
+ <ion-icon name="trophy-outline"></ion-icon>
|
|
|
+ <ion-label>{{ currentUser.stats.medals }}枚奖牌</ion-label>
|
|
|
+ </ion-chip>
|
|
|
</div>
|
|
|
</div>
|
|
|
- <div class="badge-container">
|
|
|
- <ion-chip>
|
|
|
- <ion-icon name="time-outline"></ion-icon>
|
|
|
- <ion-label>累计运动 90h</ion-label>
|
|
|
- </ion-chip>
|
|
|
- <ion-chip>
|
|
|
- <ion-icon name="calendar-outline"></ion-icon>
|
|
|
- <ion-label>坚持运动 120天</ion-label>
|
|
|
- </ion-chip>
|
|
|
- <ion-chip>
|
|
|
- <ion-icon name="trophy-outline"></ion-icon>
|
|
|
- <ion-label>5枚奖牌</ion-label>
|
|
|
- </ion-chip>
|
|
|
+ } @else {
|
|
|
+ <div class="welcome-section">
|
|
|
+ <h3>欢迎来到健身世界</h3>
|
|
|
+ <p>登录以查看个人资料和运动数据</p>
|
|
|
+ <div class="auth-buttons">
|
|
|
+ <ion-button expand="block" color="primary" (click)="openLogin()">
|
|
|
+ <ion-icon slot="start" name="log-in-outline"></ion-icon>
|
|
|
+ 登录
|
|
|
+ </ion-button>
|
|
|
+ <ion-button expand="block" fill="outline" color="medium" (click)="openRegister()">
|
|
|
+ <ion-icon slot="start" name="person-add-outline"></ion-icon>
|
|
|
+ 注册
|
|
|
+ </ion-button>
|
|
|
+ </div>
|
|
|
</div>
|
|
|
- </div>
|
|
|
+ }
|
|
|
</div>
|
|
|
|
|
|
- <!-- 卡片区域 -->
|
|
|
- <ion-card>
|
|
|
- <ion-card-header>
|
|
|
- <ion-card-title>我的数据</ion-card-title>
|
|
|
- </ion-card-header>
|
|
|
- <ion-card-content>
|
|
|
- <div class="data-card">
|
|
|
+ @if (isLoggedIn) {
|
|
|
+ <!-- 卡片区域 -->
|
|
|
+ <ion-card class="data-card">
|
|
|
+ <ion-card-header>
|
|
|
+ <ion-card-title>我的数据</ion-card-title>
|
|
|
+ </ion-card-header>
|
|
|
+ <ion-card-content>
|
|
|
<div class="data-content">
|
|
|
<div class="data-value">90分钟</div>
|
|
|
<div class="data-label">本周运动</div>
|
|
@@ -61,16 +93,14 @@
|
|
|
</ion-col>
|
|
|
</ion-row>
|
|
|
</div>
|
|
|
- </div>
|
|
|
- </ion-card-content>
|
|
|
- </ion-card>
|
|
|
+ </ion-card-content>
|
|
|
+ </ion-card>
|
|
|
|
|
|
- <ion-card>
|
|
|
- <ion-card-header>
|
|
|
- <ion-card-title>总运动数据</ion-card-title>
|
|
|
- </ion-card-header>
|
|
|
- <ion-card-content>
|
|
|
- <div class="data-card">
|
|
|
+ <ion-card class="data-card">
|
|
|
+ <ion-card-header>
|
|
|
+ <ion-card-title>总运动数据</ion-card-title>
|
|
|
+ </ion-card-header>
|
|
|
+ <ion-card-content>
|
|
|
<div class="data-content">
|
|
|
<div class="data-value">5,400分钟</div>
|
|
|
<div class="data-label">累计运动时长</div>
|
|
@@ -82,56 +112,171 @@
|
|
|
</ion-col>
|
|
|
</ion-row>
|
|
|
</div>
|
|
|
+ </ion-card-content>
|
|
|
+ </ion-card>
|
|
|
+
|
|
|
+ <!-- 功能按钮区域 -->
|
|
|
+ <ion-list class="function-list">
|
|
|
+ <ion-item>
|
|
|
+ <ion-icon slot="start" name="document-text-outline" color="primary"></ion-icon>
|
|
|
+ <ion-label>我的动态</ion-label>
|
|
|
+ <ion-icon slot="end" name="chevron-forward-outline"></ion-icon>
|
|
|
+ </ion-item>
|
|
|
+ <ion-item>
|
|
|
+ <ion-icon slot="start" name="heart-outline" color="danger"></ion-icon>
|
|
|
+ <ion-label>收藏与加油</ion-label>
|
|
|
+ <ion-icon slot="end" name="chevron-forward-outline"></ion-icon>
|
|
|
+ </ion-item>
|
|
|
+ <ion-item>
|
|
|
+ <ion-icon slot="start" name="school-outline" color="warning"></ion-icon>
|
|
|
+ <ion-label>我的课程</ion-label>
|
|
|
+ <ion-icon slot="end" name="chevron-forward-outline"></ion-icon>
|
|
|
+ </ion-item>
|
|
|
+ <ion-item>
|
|
|
+ <ion-icon slot="start" name="medal-outline" color="success"></ion-icon>
|
|
|
+ <ion-label>我的活动</ion-label>
|
|
|
+ <ion-icon slot="end" name="chevron-forward-outline"></ion-icon>
|
|
|
+ </ion-item>
|
|
|
+ <ion-item>
|
|
|
+ <ion-icon slot="start" name="nutrition-outline" color="tertiary"></ion-icon>
|
|
|
+ <ion-label>我的饮食</ion-label>
|
|
|
+ <ion-icon slot="end" name="chevron-forward-outline"></ion-icon>
|
|
|
+ </ion-item>
|
|
|
+ <ion-item>
|
|
|
+ <ion-icon slot="start" name="wallet-outline" color="medium"></ion-icon>
|
|
|
+ <ion-label>订单与钱包</ion-label>
|
|
|
+ <ion-icon slot="end" name="chevron-forward-outline"></ion-icon>
|
|
|
+ </ion-item>
|
|
|
+ <ion-item>
|
|
|
+ <ion-icon slot="start" name="gift-outline" color="secondary"></ion-icon>
|
|
|
+ <ion-label>领福利</ion-label>
|
|
|
+ <ion-icon slot="end" name="chevron-forward-outline"></ion-icon>
|
|
|
+ </ion-item>
|
|
|
+ <ion-item>
|
|
|
+ <ion-icon slot="start" name="people-outline" color="primary"></ion-icon>
|
|
|
+ <ion-label>我的团队</ion-label>
|
|
|
+ <ion-icon slot="end" name="chevron-forward-outline"></ion-icon>
|
|
|
+ </ion-item>
|
|
|
+ <ion-item>
|
|
|
+ <ion-icon slot="start" name="help-circle-outline" color="medium"></ion-icon>
|
|
|
+ <ion-label>帮助中心</ion-label>
|
|
|
+ <ion-icon slot="end" name="chevron-forward-outline"></ion-icon>
|
|
|
+ </ion-item>
|
|
|
+ </ion-list>
|
|
|
+ }
|
|
|
+
|
|
|
+ <!-- 登录模态框 -->
|
|
|
+ <!-- 登录模态框 -->
|
|
|
+<ion-modal [isOpen]="showLoginModal">
|
|
|
+ <ng-template>
|
|
|
+ <ion-header>
|
|
|
+ <ion-toolbar color="primary">
|
|
|
+ <ion-title>用户登录</ion-title>
|
|
|
+ <ion-buttons slot="end">
|
|
|
+ <ion-button (click)="closeModals()">
|
|
|
+ <ion-icon name="close-outline"></ion-icon>
|
|
|
+ </ion-button>
|
|
|
+ </ion-buttons>
|
|
|
+ </ion-toolbar>
|
|
|
+ </ion-header>
|
|
|
+ <ion-content class="auth-content">
|
|
|
+ <div class="auth-container">
|
|
|
+ <!-- 邮箱输入 -->
|
|
|
+ <div class="input-item">
|
|
|
+ <label class="input-label">邮箱</label>
|
|
|
+ <ion-input type="email" [(ngModel)]="loginForm.email" placeholder="请输入您的邮箱"></ion-input>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <!-- 密码输入 -->
|
|
|
+ <div class="input-item">
|
|
|
+ <label class="input-label">密码</label>
|
|
|
+ <ion-input type="password" [(ngModel)]="loginForm.password" placeholder="请输入密码"></ion-input>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <!-- 错误信息 -->
|
|
|
+ @if (authError) {
|
|
|
+ <div class="error-message">
|
|
|
+ <ion-icon name="warning-outline"></ion-icon>
|
|
|
+ {{ authError }}
|
|
|
+ </div>
|
|
|
+ }
|
|
|
+
|
|
|
+ <!-- 登录按钮 -->
|
|
|
+ <ion-button expand="block" color="primary" (click)="handleLogin()">
|
|
|
+ <ion-icon slot="start" name="log-in-outline"></ion-icon>
|
|
|
+ 登录
|
|
|
+ </ion-button>
|
|
|
+
|
|
|
+ <!-- 页脚链接 -->
|
|
|
+ <div class="auth-footer">
|
|
|
+ <p>还没有账号?<a (click)="openRegister()">立即注册</a></p>
|
|
|
+ </div>
|
|
|
</div>
|
|
|
- </ion-card-content>
|
|
|
- </ion-card>
|
|
|
+ </ion-content>
|
|
|
+ </ng-template>
|
|
|
+</ion-modal>
|
|
|
|
|
|
- <!-- 功能按钮区域 -->
|
|
|
- <ion-list>
|
|
|
- <ion-item>
|
|
|
- <ion-icon slot="start" name="document-text-outline"></ion-icon>
|
|
|
- <ion-label>我的动态</ion-label>
|
|
|
- <ion-icon slot="end" name="chevron-forward-outline"></ion-icon>
|
|
|
- </ion-item>
|
|
|
- <ion-item>
|
|
|
- <ion-icon slot="start" name="heart-outline"></ion-icon>
|
|
|
- <ion-label>收藏与加油</ion-label>
|
|
|
- <ion-icon slot="end" name="chevron-forward-outline"></ion-icon>
|
|
|
- </ion-item>
|
|
|
- <ion-item>
|
|
|
- <ion-icon slot="start" name="school-outline"></ion-icon>
|
|
|
- <ion-label>我的课程</ion-label>
|
|
|
- <ion-icon slot="end" name="chevron-forward-outline"></ion-icon>
|
|
|
- </ion-item>
|
|
|
- <ion-item>
|
|
|
- <ion-icon slot="start" name="medal-outline"></ion-icon>
|
|
|
- <ion-label>我的活动</ion-label>
|
|
|
- <ion-icon slot="end" name="chevron-forward-outline"></ion-icon>
|
|
|
- </ion-item>
|
|
|
- <ion-item>
|
|
|
- <ion-icon slot="start" name="nutrition-outline"></ion-icon>
|
|
|
- <ion-label>我的饮食</ion-label>
|
|
|
- <ion-icon slot="end" name="chevron-forward-outline"></ion-icon>
|
|
|
- </ion-item>
|
|
|
- <ion-item>
|
|
|
- <ion-icon slot="start" name="wallet-outline"></ion-icon>
|
|
|
- <ion-label>订单与钱包</ion-label>
|
|
|
- <ion-icon slot="end" name="chevron-forward-outline"></ion-icon>
|
|
|
- </ion-item>
|
|
|
- <ion-item>
|
|
|
- <ion-icon slot="start" name="gift-outline"></ion-icon>
|
|
|
- <ion-label>领福利</ion-label>
|
|
|
- <ion-icon slot="end" name="chevron-forward-outline"></ion-icon>
|
|
|
- </ion-item>
|
|
|
- <ion-item>
|
|
|
- <ion-icon slot="start" name="people-outline"></ion-icon>
|
|
|
- <ion-label>我的团队</ion-label>
|
|
|
- <ion-icon slot="end" name="chevron-forward-outline"></ion-icon>
|
|
|
- </ion-item>
|
|
|
- <ion-item>
|
|
|
- <ion-icon slot="start" name="help-circle-outline"></ion-icon>
|
|
|
- <ion-label>帮助中心</ion-label>
|
|
|
- <ion-icon slot="end" name="chevron-forward-outline"></ion-icon>
|
|
|
- </ion-item>
|
|
|
- </ion-list>
|
|
|
+<!-- 注册模态框 -->
|
|
|
+<ion-modal [isOpen]="showRegisterModal">
|
|
|
+ <ng-template>
|
|
|
+ <ion-header>
|
|
|
+ <ion-toolbar color="primary">
|
|
|
+ <ion-title>用户注册</ion-title>
|
|
|
+ <ion-buttons slot="end">
|
|
|
+ <ion-button (click)="closeModals()">
|
|
|
+ <ion-icon name="close-outline"></ion-icon>
|
|
|
+ </ion-button>
|
|
|
+ </ion-buttons>
|
|
|
+ </ion-toolbar>
|
|
|
+ </ion-header>
|
|
|
+ <ion-content class="auth-content">
|
|
|
+ <div class="auth-container">
|
|
|
+ <!-- 昵称输入 -->
|
|
|
+ <div class="input-item">
|
|
|
+ <label class="input-label">昵称</label>
|
|
|
+ <ion-input type="text" [(ngModel)]="registerForm.name" placeholder="设置您的昵称"></ion-input>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <!-- 邮箱输入 -->
|
|
|
+ <div class="input-item">
|
|
|
+ <label class="input-label">邮箱</label>
|
|
|
+ <ion-input type="email" [(ngModel)]="registerForm.email" placeholder="请输入您的邮箱"></ion-input>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <!-- 密码输入 -->
|
|
|
+ <div class="input-item">
|
|
|
+ <label class="input-label">密码</label>
|
|
|
+ <ion-input type="password" [(ngModel)]="registerForm.password" placeholder="设置密码(至少6位)"></ion-input>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <!-- 确认密码输入 -->
|
|
|
+ <div class="input-item">
|
|
|
+ <label class="input-label">确认密码</label>
|
|
|
+ <ion-input type="password" [(ngModel)]="registerForm.confirmPassword" placeholder="请再次输入密码"></ion-input>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <!-- 错误信息 -->
|
|
|
+ @if (authError) {
|
|
|
+ <div class="error-message">
|
|
|
+ <ion-icon name="warning-outline"></ion-icon>
|
|
|
+ {{ authError }}
|
|
|
+ </div>
|
|
|
+ }
|
|
|
+
|
|
|
+ <!-- 注册按钮 -->
|
|
|
+ <ion-button expand="block" color="primary" (click)="handleRegister()">
|
|
|
+ <ion-icon slot="start" name="person-add-outline"></ion-icon>
|
|
|
+ 注册
|
|
|
+ </ion-button>
|
|
|
+
|
|
|
+ <!-- 页脚链接 -->
|
|
|
+ <div class="auth-footer">
|
|
|
+ <p>已有账号?<a (click)="openLogin()">立即登录</a></p>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </ion-content>
|
|
|
+ </ng-template>
|
|
|
+</ion-modal>
|
|
|
+
|
|
|
+
|
|
|
</ion-content>
|