Răsfoiți Sursa

fix:myhealth

yf 4 luni în urmă
părinte
comite
523d242b34

BIN
MY-WEB/.DS_Store


+ 49 - 17
wisdom-app/src/app/page/page-my-health/page-my-health.component.html

@@ -1,7 +1,20 @@
 <ion-header [translucent]="true">
   <ion-toolbar class="searchbar">
-      <ion-button slot="start" (click)="backHome()" color="primary">{{back}}</ion-button>
-      <ion-title slot="end">我的每次问询记录</ion-title>
+    <ion-button slot="start" (click)="backHome()" color="primary">
+      <ion-icon slot="icon-only" name="arrow-back-outline"></ion-icon>
+    </ion-button>
+    <ion-title>
+      <div class="user-info">
+        <ion-avatar class="user-avatar">
+          <img [src]="avatar" (error)="handleImageError()" alt="用户头像" class="avatar" />
+        </ion-avatar>
+        <span class="user-name">欢迎,{{ userName }}!</span>
+      </div>
+      我的每次问询记录
+    </ion-title>
+    <ion-buttons slot="end">
+      <ion-icon name="menu-outline"></ion-icon>
+    </ion-buttons>
   </ion-toolbar>
 </ion-header>
 
@@ -9,19 +22,38 @@
   <ion-refresher slot="fixed" (ionRefresh)="handleRefresh($event)">
     <ion-refresher-content></ion-refresher-content>
   </ion-refresher>
-  <div>
-    <!-- <p>尊敬的用户:{{currentUser?.data[realname]}},您好!</p> -->
-     <ion-card *ngFor="let message of allMessage">
-       <ion-card-header>
-         <ion-card-title>就诊时间:{{message?.updatedAt}}</ion-card-title>
-       </ion-card-header>
-       <ion-card-content>
-        <p>就诊医生{{message.data["doctor"]?.name}}</p>
-        <p>就诊部门{{message.data["depart"]?.name}}</p>
-        <p>门诊名称{{message.data["title"]}}</p>
-        <p>就诊内容{{message.data["content"]}}</p>
-        <!-- <fm-markdown-preview class="content-style" [content]="responseMsg"></fm-markdown-preview> -->
-       </ion-card-content>
-     </ion-card>
+
+  <!-- 数据加载指示器 -->
+  <ion-spinner *ngIf="isLoading" name="crescent" class="loading-spinner"></ion-spinner>
+
+  <!-- 数据展示区域 -->
+  <ion-list *ngIf="!isLoading && allMessage.length > 0">
+    <ion-item *ngFor="let message of allMessage" lines="none">
+      <ion-card class="message-card">
+        <ion-card-header>
+          <ion-card-title>就诊时间: {{ message?.updatedAt | date:'short' }}</ion-card-title>
+        </ion-card-header>
+        <ion-card-content>
+          <ion-icon name="person-outline" slot="start"></ion-icon>
+          <p><strong>就诊医生:</strong> {{ message.data["doctor"]?.name }}</p>
+          <ion-icon name="business-outline" slot="start"></ion-icon>
+          <p><strong>就诊部门:</strong> {{ message.data["depart"]?.name }}</p>
+          <ion-icon name="medical-outline" slot="start"></ion-icon>
+          <p><strong>门诊名称:</strong> {{ message.data["title"] }}</p>
+          <ion-icon name="document-text-outline" slot="start"></ion-icon>
+          <p><strong>就诊内容:</strong> {{ message.data["content"] }}</p>
+        </ion-card-content>
+      </ion-card>
+    </ion-item>
+  </ion-list>
+
+  <!-- 无数据提示 -->
+  <div *ngIf="!isLoading && allMessage.length === 0" class="no-data">
+    <p>暂无问询记录。</p>
+  </div>
+
+  <!-- 错误提示 -->
+  <div *ngIf="!isLoading && errorMessage" class="error-message">
+    <p>{{ errorMessage }}</p>
   </div>
-</ion-content>
+</ion-content>

+ 93 - 0
wisdom-app/src/app/page/page-my-health/page-my-health.component.scss

@@ -0,0 +1,93 @@
+.searchbar {
+    --background: #ffffff;
+    --ion-color-primary: #3880ff;
+  }
+  
+  .user-info {
+    display: flex;
+    align-items: center;
+  }
+  
+  .user-avatar {
+    width: 50px;
+    height: 50px;
+    margin-right: 10px;
+  }
+  
+  .user-avatar img.avatar {
+    width: 100%;
+    height: 100%;
+    border-radius: 50%;
+  }
+  
+  .user-name {
+    font-size: 18px;
+    font-weight: bold;
+  }
+  
+  .user-details {
+    text-align: center;
+    margin: 10px 0;
+  }
+  
+  .loading-spinner {
+    display: block;
+    margin: 50px auto;
+  }
+  
+  .message-card {
+    margin: 10px 15px;
+    border-radius: 15px;
+    box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
+    transition: transform 0.3s;
+  }
+  
+  .message-card:hover {
+    transform: scale(1.02);
+  }
+  
+  .message-card ion-card-header {
+    background-color: #f0f0f0;
+    border-top-left-radius: 15px;
+    border-top-right-radius: 15px;
+  }
+  
+  .message-card ion-card-title {
+    font-size: 16px;
+    font-weight: bold;
+  }
+  
+  .message-card ion-card-content p {
+    margin: 5px 0;
+    font-size: 14px;
+  }
+  
+  .no-data {
+    text-align: center;
+    margin-top: 50px;
+    color: gray;
+    font-size: 16px;
+  }
+  
+  .error-message {
+    text-align: center;
+    margin-top: 50px;
+    color: red;
+    font-size: 16px;
+  }
+
+  .ion-icon {
+    margin-right: 8px;
+    color: #3880ff;
+  }
+
+  .loading-spinner {
+    display: block;
+    margin: 50px auto;
+    animation: spin 2s linear infinite;
+  }
+  
+  @keyframes spin {
+    0% { transform: rotate(0deg); }
+    100% { transform: rotate(360deg); }
+  }

+ 128 - 40
wisdom-app/src/app/page/page-my-health/page-my-health.component.ts

@@ -1,5 +1,36 @@
-import { Component, NgModule, OnInit } from '@angular/core';
-import { ModalController, IonModal, IonHeader, IonToolbar, IonTitle, IonContent, IonList, IonItem, IonLabel, IonAvatar, IonButton, IonSegment, IonSegmentButton, IonSegmentContent, IonSegmentView, IonCardContent, IonCardTitle, IonCardHeader, IonCard, IonIcon, IonButtons, IonInput, IonRefresherContent, IonRefresher } from '@ionic/angular/standalone';
+import { Component, OnInit } from '@angular/core';
+import {
+  ModalController,
+  IonModal,
+  IonHeader,
+  IonToolbar,
+  IonTitle,
+  IonContent,
+  IonList,
+  IonItem,
+  IonLabel,
+  IonAvatar,
+  IonButton,
+  IonSegment,
+  IonSegmentButton,
+  IonSegmentContent,
+  IonSegmentView,
+  IonCardContent,
+  IonCardTitle,
+  IonCardHeader,
+  IonCard,
+  IonIcon,
+  IonButtons,
+  IonInput,
+  IonRefresherContent,
+  IonRefresher,
+  LoadingController,
+  IonSpinner,
+  IonGrid,        // 导入 IonGrid
+  IonRow,         // 导入 IonRow
+  IonCol          // 导入 IonCol
+} from '@ionic/angular/standalone'; // 确保导入自 '@ionic/angular/standalone'
+
 import { addIcons } from 'ionicons';
 import { airplane, bluetooth, call, wifi } from 'ionicons/icons';
 import { CommonModule } from '@angular/common';
@@ -7,62 +38,119 @@ import { CloudObject, CloudQuery, CloudUser } from 'src/lib/ncloud';
 // import { FmMarkdownPreview } from 'fmode-ng';
 import { Router } from '@angular/router';
 addIcons({ airplane, bluetooth, call, wifi });
+
 @Component({
   selector: 'page-my-health',
   templateUrl: './page-my-health.component.html',
   styleUrls: ['./page-my-health.component.scss'],
   standalone: true,
-    imports: [
-      IonHeader, IonToolbar, IonTitle, IonContent,
-      IonLabel,IonItem,IonList,IonAvatar,CommonModule,IonButton,
-      IonSegment, IonSegmentButton,
-      IonSegmentContent,IonSegmentView,IonCardContent, IonCardTitle, IonCardHeader,IonCard,
-      IonModal,IonIcon, IonButtons,IonInput,IonRefresher,IonRefresherContent
-      // FmMarkdownPreview,
-    ]
+  imports: [
+    IonHeader,
+    IonToolbar,
+    IonTitle,
+    IonContent,
+    IonLabel,
+    IonItem,
+    IonList,
+    IonAvatar,
+    CommonModule,
+    IonButton,
+    IonSegment,
+    IonSegmentButton,
+    IonSegmentContent,
+    IonSegmentView,
+    IonCardContent,
+    IonCardTitle,
+    IonCardHeader,
+    IonCard,
+    IonModal,
+    IonIcon,
+    IonButtons,
+    IonInput,
+    IonRefresher,
+    IonRefresherContent,
+    IonSpinner,
+    IonGrid,        // 添加 IonGrid 到 imports
+    IonRow,         // 添加 IonRow 到 imports
+    IonCol          // 添加 IonCol 到 imports
+    // FmMarkdownPreview,
+  ]
 })
-export class PageMyHealthComponent  implements OnInit {
-  handleRefresh(event:any) {
-    setTimeout(() => {
-      // Any calls to load data go here
-      this.loadData();
-      event.target.complete();
-    }, 2000);
-  }
+export class PageMyHealthComponent implements OnInit {
+  allMessage: Array<CloudObject> = [];
+  isLoading: boolean = false;
+  errorMessage: string = "";
 
-  avatar : string = "../assets/imgs/avatar.png";
-  currentUser : CloudUser | undefined ;
-  objectId : string = "";
+  avatar: string = "../assets/imgs/avatar.png"; // 默认头像
+  currentUser: CloudUser | undefined;
+  objectId: string = "";
+  userName: string = "";
+
+  back: string = "back";
+
+  // 备用头像 URL
+  fallbackAvatarUrl: string = 'https://app.fmode.cn/dev/jxnu/202226701019/头像示例.png';
 
   constructor(
-    private router: Router
+    private router: Router,
+    private loadingController: LoadingController
   ) {
     this.currentUser = new CloudUser();
-    this.avatar = this.currentUser.data["avatar"];
+    this.avatar = this.currentUser.data["avatar"] || this.fallbackAvatarUrl;
     this.objectId = this.currentUser.data['objectId'];
+    this.userName = this.currentUser.data["realname"] || "用户";
   }
-  allMessage : Array<CloudObject> = [];
 
-  async loadData(){
-    let user = new CloudUser();
-    console.log("objectId",this.objectId);
-    let query = new CloudQuery('Consultation');
-    query.include("doctor","depart");
-    query.equalTo("user",user?.id);
-    // 根据用户id查询, 其中用户id字段是指针,指向User表中的objectId
-    // query.equalTo("user",{ "__type": "Pointer", "className": "_User", "objectId": this.objectId });
-    this.allMessage = await query.find();
-    console.log("allMessage",this.allMessage);
-  }
-   
   ngOnInit() {
     this.loadData();
   }
-  back:string = "back"
-  backHome(){
+
+  async loadData() {
+    this.isLoading = true;
+    const loading = await this.loadingController.create({
+      message: '加载中...',
+    });
+    await loading.present();
+
+    try {
+      let user = new CloudUser();
+      console.log("objectId", this.objectId);
+      let query = new CloudQuery('Consultation');
+      query.include("doctor", "depart");
+      query.equalTo("user", { "__type": "Pointer", "className": "_User", "objectId": this.objectId });
+
+      const messages = await query.find();
+      console.log("allMessage", messages);
+
+      this.allMessage = messages;
+    } catch (error) {
+      console.error("加载数据失败:", error);
+      this.errorMessage = "数据加载失败,请稍后再试。";
+    } finally {
+      this.isLoading = false;
+      await loading.dismiss();
+    }
+  }
+
+  handleRefresh(event: any) {
+    setTimeout(() => {
+      this.allMessage = [];
+      this.loadData().then(() => {
+        event.target.complete();
+      });
+    }, 2000);
+  }
+
+  backHome() {
     this.router.navigate(['/tabs/tab1']);
   }
-  gotouser(){
 
+  gotouser() {
+    // 用户相关逻辑
+  }
+
+  // 处理图片加载错误,设置备用图片
+  handleImageError() {
+    this.avatar = this.fallbackAvatarUrl;
   }
-}
+}