yf 4 сар өмнө
parent
commit
415050af3d

+ 100 - 170
wisdom-app/src/app/tab2/tab2.page.html

@@ -1,173 +1,96 @@
 <ion-header [translucent]="true">
   <ion-toolbar class="custom-toolbar">
-    <div class="search-bar" >
-      <ion-searchbar 
-      placeholder="搜索" 
-      class="custom-searchbar" 
-      (ionInput)="searchProducts($event)">
+    <div class="search-bar">
+      <ion-searchbar
+        placeholder="搜索"
+        class="custom-searchbar"
+        (ionInput)="searchProducts($event)">
       </ion-searchbar>
     </div>
-    @if(!searchTerm){
-      
-    <div class="header">
-      <ion-card-header>
-        
-        <ion-card-title>
-          <ion-segment [(ngModel)]="selectedSegment" (ionChange)="segmentChanged($event)" scrollable>
-            <ion-segment-button *ngFor="let segment of segments" [value]="segment">
-              {{segment}}
-            </ion-segment-button>
-          </ion-segment>
-          <!-- <ion-segment [scrollable]="true" value="HotDot" [value]="type" (ionChange)="typeChange($event)">
-            <ion-segment-button value="HotDot" content-id="HotDot">
-              <ion-label>热点</ion-label>
-            </ion-segment-button>
-            <ion-segment-button value="export" content-id="export">
-              <ion-label>专家科普</ion-label>
-            </ion-segment-button>
-            <ion-segment-button value="sleep" content-id="sleep">
-              <ion-label>睡眠</ion-label>
-            </ion-segment-button>
-            <ion-segment-button value="life" content-id="life">
-              <ion-label>生活</ion-label>
-            </ion-segment-button>
-            <ion-segment-button value="男" content-id="male">
-              <ion-label>男性</ion-label>
-            </ion-segment-button>
-            <ion-segment-button value="女" content-id="female">
-              <ion-label>女性</ion-label>
-            </ion-segment-button>
-          </ion-segment> -->
-        </ion-card-title>
-      </ion-card-header>
-    </div>
-  }
+    <ng-container *ngIf="!searchTerm">
+      <div class="header">
+        <ion-card-header>
+          <ion-card-title>
+            <ion-segment
+              [(ngModel)]="selectedSegment"
+              (ionChange)="segmentChanged($event)"
+              scrollable>
+              <ion-segment-button
+                *ngFor="let segment of segments"
+                [value]="segment">
+                {{ segment }}
+              </ion-segment-button>
+            </ion-segment>
+          </ion-card-title>
+        </ion-card-header>
+      </div>
+    </ng-container>
   </ion-toolbar>
 </ion-header>
 
 <ion-content class="knowledge" [fullscreen]="true">
-  @if(!searchTerm){
+  <ion-loading
+    *ngIf="isLoading"
+    message="加载中...">
+  </ion-loading>
+
+<ion-content class="knowledge" [fullscreen]="true">
+  <ng-container *ngIf="!searchTerm; else searchResults">
     <div class="content">
       <ion-card>
-        <ion-card-header></ion-card-header>
         <ion-card-content>
-          <!-- <ion-segment-view>
-            <ion-segment-content id="HotDot"> -->
-              <!-- 轮播图区域 -->
-              <div class="carousel-container" style="border-radius: 0px; margin: 0px auto;">
-                <div class="carousel" [style.transform]="'translateX(-' + currentSlide * 100 + '%)'">
-                  <div class="slide" *ngFor="let image of images">
-                    <img [src]="image" alt="轮播图" height="100px" >
-                  </div>
-                </div>
-              
-                <button class="prev" (click)="prevSlide()">&#10094;</button>
-                <button class="next" (click)="nextSlide()">&#10095;</button>
-              
-                <div class="dots">
-                  <span class="dot" *ngFor="let image of images; let i = index" 
-                        [class.active]="i === currentSlide" 
-                        (click)="goToSlide(i)"></span>
-                </div>
-              </div>
-              <app-article-card (click)="openDetailModal(card)" *ngFor="let card of cards" [card]="card"></app-article-card>
-            <!-- </ion-segment-content> -->
-  
-            <!-- <ion-segment-content id="export">
-              <app-article-card (click)="openDetailModal(card)" *ngFor="let card of cards" [card]="card"></app-article-card>
-            </ion-segment-content>
-  
-            <ion-segment-content id="sleep"> -->
-              <!-- 轮播图区域 -->
-              <!-- <div class="carousel-container" style="border-radius: 0px; margin: 0px auto;">
-                <div class="carousel" [style.transform]="'translateX(-' + currentSlide * 100 + '%)'">
-                  <div class="slide" *ngFor="let image of images">
-                    <img [src]="image" alt="轮播图" height="100px" >
-                  </div>
-                </div>
-              
-                <button class="prev" (click)="prevSlide()">&#10094;</button>
-                <button class="next" (click)="nextSlide()">&#10095;</button>
-              
-                <div class="dots">
-                  <span class="dot" *ngFor="let image of images; let i = index" 
-                        [class.active]="i === currentSlide" 
-                        (click)="goToSlide(i)"></span>
-                </div>
-              </div>
-              <app-article-card (click)="openDetailModal(card)" *ngFor="let card of cards" [card]="card"></app-article-card>
-            </ion-segment-content>
-  
-            <ion-segment-content id="life">
-              <app-article-card (click)="openDetailModal(card)" *ngFor="let card of cards" [card]="card"></app-article-card>
-            </ion-segment-content>
-            <ion-segment-content id="male"> -->
-              <!-- 轮播图区域 -->
-              <!-- <div class="carousel-container" style="border-radius: 0px; margin: 0px auto;">
-                <div class="carousel" [style.transform]="'translateX(-' + currentSlide * 100 + '%)'">
-                  <div class="slide" *ngFor="let image of images">
-                    <img [src]="image" alt="轮播图" height="100px" >
-                  </div>
-                </div>
-              
-                <button class="prev" (click)="prevSlide()">&#10094;</button>
-                <button class="next" (click)="nextSlide()">&#10095;</button>
-              
-                <div class="dots">
-                  <span class="dot" *ngFor="let image of images; let i = index" 
-                        [class.active]="i === currentSlide" 
-                        (click)="goToSlide(i)"></span>
-                </div>
+          <!-- 轮播图区域 -->
+          <div class="carousel-container">
+            <div class="carousel" [style.transform]="'translateX(-' + currentSlide * 100 + '%)'">
+              <div class="slide" *ngFor="let image of images; trackBy: trackByIndex">
+                <img [src]="image" alt="轮播图" />
               </div>
-              <app-article-card (click)="openDetailModal(card)" *ngFor="let card of cards" [card]="card"></app-article-card>
-            </ion-segment-content>
-            <ion-segment-content id="female"> -->
-              <!-- 轮播图区域 -->
-              <!-- <div class="carousel-container" style="border-radius: 0px; margin: 0px auto;">
-                <div class="carousel" [style.transform]="'translateX(-' + currentSlide * 100 + '%)'">
-                  <div class="slide" *ngFor="let image of images">
-                    <img [src]="image" alt="轮播图" height="100px" >
-                  </div>
-                </div>
-              
-                <button class="prev" (click)="prevSlide()">&#10094;</button>
-                <button class="next" (click)="nextSlide()">&#10095;</button>
-              
-                <div class="dots">
-                  <span class="dot" *ngFor="let image of images; let i = index" 
-                        [class.active]="i === currentSlide" 
-                        (click)="goToSlide(i)"></span>
-                </div>
-              </div>
-              <app-article-card (click)="openDetailModal(card)" *ngFor="let card of cards" [card]="card"></app-article-card>
-            </ion-segment-content>
-          </ion-segment-view> -->
+            </div>
+            <button class="prev" (click)="prevSlide()">&#10094;</button>
+            <button class="next" (click)="nextSlide()">&#10095;</button>
+            <div class="dots">
+              <span
+                class="dot"
+                *ngFor="let image of images; let i = index"
+                [class.active]="i === currentSlide"
+                (click)="goToSlide(i)">
+              </span>
+            </div>
+          </div>
+          <!-- 文章卡片区域 -->
+          <app-article-card
+            *ngFor="let card of cards; trackBy: trackById"
+            [card]="card"
+            (click)="openDetailModal(card)">
+          </app-article-card>
         </ion-card-content>
       </ion-card>
     </div>
-  }
-  @if(searchTerm){
+  </ng-container>
+
+  <!-- 搜索结果 -->
+  <ng-template #searchResults>
     <div>
-      <app-article-card (click)="openDetailModal(product)" *ngFor="let product of products" [card]="product"></app-article-card>
-    </div>
-    @if (products.length == 0) {
-      <div class="no-results" style="margin: 50px auto;">
-        <h2>寻找中···   请耐性等待 ····</h2>
+      <app-article-card
+        *ngFor="let product of products; trackBy: trackById"
+        [card]="product"
+        (click)="openDetailModal(product)">
+      </app-article-card>
+      <div *ngIf="products.length === 0" class="no-results">
+        <h2>寻找中··· 请耐性等待 ····</h2>
       </div>
-    }
-  }
-
+    </div>
+  </ng-template>
 
-  <!-- 底部弹出模态 -->
+  <!-- 详细信息模态 -->
   <ion-modal [isOpen]="isModalOpen" cssClass="bottom-modal">
     <ng-template>
-
       <ion-header>
         <ion-toolbar>
           <ion-buttons slot="start">
             <ion-button (click)="closeDetailModal()">关闭</ion-button>
           </ion-buttons>
-          <ion-title>{{currentProduct.get('category')}}</ion-title>
+          <ion-title>{{ currentProduct?.get('category') }}</ion-title>
           <ion-buttons slot="end">
             <ion-button (click)="shareDetailModal()">分享</ion-button>
           </ion-buttons>
@@ -176,38 +99,43 @@
 
       <ion-content class="ion-padding">
         <div class="modal-content" *ngIf="currentProduct">
-          <h1 class="product-name">{{currentProduct.get('title')}}</h1>
-          <p><strong>作者:</strong>{{currentProduct.get('author')}}</p>
-          <p>{{currentProduct.get('content')[0]}}</p>
+          <h1 class="product-name">{{ currentProduct.get('title') }}</h1>
+          <p><strong>作者:</strong>{{ currentProduct.get('author') }}</p>
+          <p>{{ currentProduct.get('content')[0] }}</p>
           <div class="image-container">
-            <img style="width: 100%; height: auto;" [src]="currentProduct.get('image')[0]" alt="图片" class="medicine-image">
+            <img [src]="currentProduct.get('image')[0]" alt="图片" class="medicine-image" />
           </div>
-          <p>{{currentProduct.get('content')[0]}}</p>  
+          <p>{{ currentProduct.get('content')[1] }}</p>
           <div class="image-container">
-            <img style="width: 100%; height: auto;" [src]="currentProduct.get('image')[0]" alt="图片" class="medicine-image">
+            <img [src]="currentProduct.get('image')[1]" alt="图片" class="medicine-image" />
           </div>
-          <div style="display: flex; height: 30px; width: 100%; justify-content: space-between; align-items: center">
-            <p style="margin-left:30px"><strong>阅读量:</strong>{{currentProduct.get('views')}}</p>
-            <p style="margin-right:30px"><strong>点赞量:</strong>{{currentProduct.get('likes')}}</p>  
+          <div class="stats">
+            <p><strong>阅读量:</strong>{{ currentProduct.get('views') }}</p>
+            <p><strong>点赞量:</strong>{{ currentProduct.get('likes') }}</p>
           </div>
         </div>
       </ion-content>
+
       <ion-footer>
         <ion-item>
-          <!-- <ion-label position="stacked">评论</ion-label> -->
-          <ion-input [value]="comment" (ionInput)="onCommentInput($event)" placeholder="请输入评论"></ion-input>
+          <ion-input
+            [(ngModel)]="comment"
+            (ionInput)="onCommentInput($event)"
+            placeholder="请输入评论">
+          </ion-input>
           <ion-button (click)="postComment()">发布</ion-button>
         </ion-item>
-        
       </ion-footer>
     </ng-template>
   </ion-modal>
 
+  <!-- 分享模态 -->
   <ion-modal class="share-modal" [isOpen]="shareDetail">
+    <ng-template>
       <ion-header>
         <ion-toolbar>
           <ion-buttons slot="end">
-            <ion-button (click)="closeDetailModal()">X</ion-button>
+            <ion-button (click)="closeShareModal()">X</ion-button>
           </ion-buttons>
           <ion-title>分享</ion-title>
         </ion-toolbar>
@@ -215,18 +143,20 @@
       <ion-content>
         <ion-item>
           <ion-label position="stacked">分享链接</ion-label>
-          <!-- <ion-input [(ngModel)]="shareLink" readonly></ion-input> -->
+          <ion-input [value]="shareLink" readonly></ion-input>
         </ion-item>
         <ion-button expand="block" (click)="copyLink()">复制链接</ion-button>
-    </ion-content>
-    <!-- 评论 -->
-    <ion-footer>
-      <ion-item>
-        <!-- <ion-label position="stacked">评论</ion-label> -->
-        <ion-input [value]="comment" (ionInput)="onCommentInput($event)" placeholder="请输入评论"></ion-input>
-        <ion-button (click)="postComment()">发布</ion-button>
-      </ion-item>
-      
-    </ion-footer>
+      </ion-content>
+      <ion-footer>
+        <ion-item>
+          <ion-input
+            [(ngModel)]="comment"
+            (ionInput)="onCommentInput($event)"
+            placeholder="请输入评论">
+          </ion-input>
+          <ion-button (click)="postComment()">发布</ion-button>
+        </ion-item>
+      </ion-footer>
+    </ng-template>
   </ion-modal>
-</ion-content>
+</ion-content>

+ 76 - 129
wisdom-app/src/app/tab2/tab2.page.scss

@@ -1,27 +1,27 @@
 .custom-toolbar {
-  --background: rgba(255, 255, 255, 0.8); /* 使工具栏背景透明 */
-  display: flex; /* 使用 Flexbox 布局 */
-  justify-content: center; /* 水平居中 */
-  align-items: center; /* 垂直居中 */
-  padding: 0; /* 去掉默认内边距 */
+  --background: rgba(255, 255, 255, 0.8);
+  display: flex;
+  justify-content: center;
+  align-items: center;
+  padding: 0;
 }
 
-
 .search-bar {
-    padding: 10px;
-    text-align: center;
-  }
-  
+  padding: 10px;
+  width: 100%;
+}
+
 .custom-searchbar {
   --background: #ffffff;
   --border-radius: 20px;
-  box-shadow: 0 2px 6px rgba(0,0,0,0.1);
+  box-shadow: 0 2px 6px rgba(0, 0, 0, 0.1);
 }
 
 .header {
   height: 80px;
-  margin-top:-10px
+  margin-top: -10px;
 }
+
 .knowledge {
   height: 100%;
   width: 100%;
@@ -29,13 +29,8 @@
 
 .content {
   margin-top: -5px;
-  -height: 100%;
   width: 100%;
 }
-ion-card-header {
-  font-size: 1.5em;
-  height: auto;
-}
 
 ion-card {
   width: 100%;
@@ -46,117 +41,18 @@ ion-card {
   box-shadow: none;
 }
 
-
 ion-card-content {
   font-size: 1.2em;
   width: 100%;
   height: auto;
 }
 
-ion-segment-view {
-  height: auto;
-  width: 100%;
-}
-
-ion-segment-content {
-  // display: flex;
-  align-items: center;
-  justify-content: center;
-}
-
-// ion-segment-content:nth-of-type(5) {
-//   background: lightpink;
-// }
-// ion-segment-content:nth-of-type(2) {
-//   background: lightblue;
-// }
-// ion-segment-content:nth-of-type(3) {
-//   background: lightgreen;
-// }
-
-.share-modal{
-  --height: 30vh;
-  --width: 100%;
-  --offset-y: 0; /* 确保模态窗口从底部弹出 */
-}
-// 底部弹窗(modal)样式
-.bottom-modal {
-  --height: 100vh;
-  --width: 100%;
-  --offset-y: 0; /* 确保模态窗口从底部弹出 */
-  
-  .modal-content {
-    padding-left: 20px;
-    padding-right: 20px;
-  }
-  
-  .image-container {
-    display: flex;
-    justify-content: center;
-    margin-bottom: 16px;
-  }
-  
-  .medicine-image {
-    object-fit: cover;
-    border-radius: 8px;
-  }
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-// .tabs {
-//   display: flex;
-//   justify-content: space-around;
-//   padding: 0px 0;
-//   background-color: #f8f8f8;
-// }
-
-// .tabs ion-button {
-//   flex: 1;
-//   text-align: center;
-//   // border: none;
-//   --background: transparent;
-//   --color-checked: #4caf50;
-//   --indicator-color: #4caf50;
-//   --color: #666;
-//   --color-focused: #4caf50;
-//   --color-hover: #4caf50;
-//   --color-activated: #4caf50;
-//   --color-selected: #4caf50;
-// }
-
-// .tab {
-//   cursor: pointer;
-//   padding: 0px 0px;
-// }
-// .tab.active {
-//   color: rgb(81, 255, 0);
-//   background-color: rgb(255, 255, 255);
-// }
-
-//
-
-// 轮播图区域
 .carousel-container {
   position: relative;
   max-width: 800px;
   margin: 0 auto;
   overflow: hidden;
+  border-radius: 8px;
 }
 
 .carousel {
@@ -171,40 +67,42 @@ ion-segment-content {
 .slide img {
   width: 100%;
   height: auto;
+  border-radius: 8px;
 }
 
-.prev, .next {
+.prev,
+.next {
   position: absolute;
   top: 50%;
   transform: translateY(-50%);
   background: rgba(0, 0, 0, 0.5);
   color: white;
-  padding: 16px;
+  padding: 12px;
   border: none;
   cursor: pointer;
+  border-radius: 50%;
 }
 
 .prev {
-  left: 0;
+  left: 10px;
 }
 
 .next {
-  right: 0;
+  right: 10px;
 }
 
 .dots {
   position: absolute;
-  bottom: 20px;
+  bottom: 15px;
   left: 50%;
   transform: translateX(-50%);
-  text-align: center;
+  display: flex;
+  gap: 8px;
 }
 
 .dot {
-  display: inline-block;
-  width: 10px;
-  height: 10px;
-  margin: 0 5px;
+  width: 12px;
+  height: 12px;
   background: #bbb;
   border-radius: 50%;
   cursor: pointer;
@@ -212,5 +110,54 @@ ion-segment-content {
 
 .dot.active {
   background: #717171;
-} 
-//
+}
+
+.no-results {
+  text-align: center;
+  margin: 50px auto;
+}
+
+.bottom-modal {
+  --height: 100vh;
+  --width: 100%;
+  --offset-y: 0;
+}
+
+.share-modal {
+  --height: 30vh;
+  --width: 100%;
+  --offset-y: 0;
+}
+
+.modal-content {
+  padding: 20px;
+}
+
+.image-container {
+  display: flex;
+  justify-content: center;
+  margin-bottom: 16px;
+}
+
+.medicine-image {
+  width: 100%;
+  height: auto;
+  object-fit: cover;
+  border-radius: 8px;
+}
+
+.stats {
+  display: flex;
+  justify-content: space-between;
+  margin: 20px 30px;
+}
+
+ion-footer ion-item {
+  display: flex;
+  align-items: center;
+}
+
+ion-footer ion-input {
+  flex: 1;
+  margin-right: 10px;
+}

+ 163 - 123
wisdom-app/src/app/tab2/tab2.page.ts

@@ -1,88 +1,119 @@
-import { Component } 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, IonSearchbar, IonFab, IonFabButton, IonFabList, IonFooter, IonInput } from '@ionic/angular/standalone';
-import { ExploreContainerComponent } from '../explore-container/explore-container.component';
-import { addIcons } from 'ionicons';
-import { airplane, bluetooth, call, wifi } from 'ionicons/icons';
+import { Component, OnInit, OnDestroy } from '@angular/core';
+import { Router } from '@angular/router';
+import { ModalController } from '@ionic/angular'; // 确保导入 ModalController
 import { ArticleCardComponent } from '../component/article-card/article-card.component';
 import { CommonModule } from '@angular/common';
 import { CloudObject, CloudQuery, CloudUser } from 'src/lib/ncloud';
 import { NavigationLanComponent } from '../component/navigation-lan/navigation-lan.component';
-import { Router } from '@angular/router';
+import { FormsModule } from '@angular/forms';
 import {
+  airplane,
+  bluetooth,
+  call,
+  wifi,
   chevronDownCircle,
   chevronForwardCircle,
   chevronUpCircle,
   colorPalette,
   document,
-  globe,
+  globe
 } from 'ionicons/icons';
-import { FormsModule } from '@angular/forms';
-addIcons({ airplane, bluetooth, call, wifi });
-addIcons({ chevronDownCircle, chevronForwardCircle, chevronUpCircle, colorPalette, document, globe });
+import { addIcons } from 'ionicons';
+import { IonicModule } from '@ionic/angular'; // 导入 IonicModule
+
+addIcons({
+  airplane,
+  bluetooth,
+  call,
+  wifi,
+  chevronDownCircle,
+  chevronForwardCircle,
+  chevronUpCircle,
+  colorPalette,
+  document,
+  globe
+});
+
 @Component({
   selector: 'app-tab2',
   templateUrl: 'tab2.page.html',
   styleUrls: ['tab2.page.scss'],
   standalone: true,
   imports: [
-    IonHeader, IonToolbar, IonTitle, IonContent, ExploreContainerComponent,
-    IonLabel,IonItem,IonList,IonAvatar,ArticleCardComponent,CommonModule,IonButton,
-    IonSegment, IonSegmentButton,NavigationLanComponent,
-    IonSegmentContent,IonSegmentView,IonCardContent, IonCardTitle, IonCardHeader,IonCard,
-    IonModal,IonIcon, IonButtons, IonSearchbar, IonFab, IonFabButton,IonFabList,IonFooter,
-    IonInput,IonSegment,IonSegmentButton,FormsModule
+    IonicModule, // 添加 IonicModule
+    CommonModule,
+    FormsModule,
+    ArticleCardComponent,
+    NavigationLanComponent
+    // 其他自定义组件或模块
   ]
 })
+export class Tab2Page implements OnInit, OnDestroy {
+  selectedSegment: string = '热点';
+  segments: string[] = ['热点', '专家科普', '睡眠', '生活', '男性', '女性', '两性', '辟谣', '母婴', '美容'];
+
+  images: string[] = [
+    'https://picsum.photos/800/400?random=7',
+    'https://picsum.photos/800/400?random=8',
+    'https://picsum.photos/800/400?random=9',
+    'https://picsum.photos/800/400?random=10',
+    'https://picsum.photos/800/400?random=11',
+    'https://picsum.photos/800/400?random=12',
+  ];
+
+  currentSlide: number = 0;
+  intervalId: any;
+
+  products: CloudObject[] = [];
+  allCards: CloudObject[] = [];
+  cards: CloudObject[] = [];
 
-export class Tab2Page {
-  selectedSegment:string = '热点';
-  segments = [ '热点', '专家科普', '睡眠', '生活', '男性', '女性', '两性', '辟谣', '母婴', '美容'];
-  segmentChanged(event: any) {
-    this.selectedSegment = event.detail.value;
-    console.log(this.selectedSegment);
-    this.loadCards(); // 重新加载卡片
-  }
- /**
-  * 轮播图
-  */
- images = [
-  'https://picsum.photos/800/400?random=7',
-  'https://picsum.photos/800/400?random=8',
-  'https://picsum.photos/800/400?random=9',
-  'https://picsum.photos/800/400?random10',
-  'https://picsum.photos/800/400?random=11',
-  'https://picsum.photos/800/400?random=12',
-];
-
-currentSlide = 0;
-intervalId: any;
-setSlidePosition() {
-  // 这里不需要额外的逻辑,因为在 HTML 中已经通过绑定实现
-}
-
-nextSlide() {
-  this.currentSlide = (this.currentSlide + 1) % this.images.length;
-}
-
-prevSlide() {
-  this.currentSlide = (this.currentSlide - 1 + this.images.length) % this.images.length;
-}
-
-goToSlide(index: number) {
-  this.currentSlide = index;
-}
-
-startAutoSlide() {
-  this.intervalId = setInterval(() => this.nextSlide(), 3000);
-}
-
-
-  products: Array<CloudObject> = []; // 当前显示的科普信息
-  allCards: Array<CloudObject> = []; // 所有科普信息
-
-  //搜索功能
   searchTerm: string = '';
+  comment: string = '';
+  shareLink: string = '';
+
+  isModalOpen: boolean = false;
+  currentProduct: CloudObject | null = null;
+
+  shareDetail: boolean = false;
+
+  isLoading: boolean = false;
+
+  constructor(
+    private modalCtrl: ModalController,
+    private router: Router
+  ) { }
+
+  ngOnInit() {
+    this.loadAllCards();
+    this.loadCards();
+    this.startAutoSlide();
+  }
+
+  ngOnDestroy() {
+    if (this.intervalId) {
+      clearInterval(this.intervalId);
+    }
+  }
+
+  // 轮播图功能
+  nextSlide() {
+    this.currentSlide = (this.currentSlide + 1) % this.images.length;
+  }
+
+  prevSlide() {
+    this.currentSlide = (this.currentSlide - 1 + this.images.length) % this.images.length;
+  }
+
+  goToSlide(index: number) {
+    this.currentSlide = index;
+  }
+
+  startAutoSlide() {
+    this.intervalId = setInterval(() => this.nextSlide(), 3000);
+  }
 
+  // 搜索功能
   async searchProducts(event: any) {
     this.searchTerm = event.detail.value.toLowerCase();
     if (this.searchTerm) {
@@ -93,89 +124,98 @@ startAutoSlide() {
         product.get('content')[0].toLowerCase().includes(this.searchTerm)
       );
     } else {
-      this.products = [...this.allCards]; // 如果搜索词为空,则显示所有科普信息
+      this.products = [...this.allCards];
     }
   }
 
-  isModalOpen = false;
-  currentProduct: any;      // 当前选择的科普信息
+  // 分段控制
+  segmentChanged(event: any) {
+    this.selectedSegment = event.detail.value;
+    this.loadCards();
+  }
 
-  openDetailModal(product?: any) {
-    let user = new CloudUser;
-    if (!user.id){
-      this.router.navigate(['/tabs/tab4'])
-      return
+  // 加载所有卡片
+  async loadAllCards() {
+    this.isLoading = true;
+    const query = new CloudQuery('HotDot');
+    try {
+      this.allCards = await query.find();
+      this.products = [...this.allCards];
+    } catch (error) {
+      console.error('加载所有卡片失败:', error);
+    } finally {
+      this.isLoading = false;
+    }
+  }
+
+  async loadCards() {
+    this.isLoading = true;
+    const query = new CloudQuery('HotDot');
+    query.equalTo('category', this.selectedSegment);
+    try {
+      this.cards = await query.find();
+    } catch (error) {
+      console.error('加载分类卡片失败:', error);
+    } finally {
+      this.isLoading = false;
+    }
+  }
+
+  // 打开详细信息模态
+  openDetailModal(product: CloudObject) {
+    const user = new CloudUser();
+    if (!user.id) {
+      this.router.navigate(['/tabs/tab4']);
+      return;
     }
     this.isModalOpen = true;
     this.currentProduct = product;
   }
+
   closeDetailModal() {
     this.isModalOpen = false;
     this.currentProduct = null;
   }
-  shareDetail = false;
+
+  // 分享功能
   shareDetailModal() {
     this.shareDetail = true;
-    // 在这里确保模态框的aria-hidden属性被正确处理
-    // setTimeout(() => {
-    //   const modalElement = document.querySelector('ion-modal');
-    //   if (modalElement) {
-    //     modalElement.setAttribute('aria-hidden', 'false');
-    //   }
-    // }, 0);
-  }
-  closeShareModal(){
-    this.shareDetail = false;
+    this.shareLink = window.location.href; // 示例分享链接,可以根据需求调整
+  }
 
+  closeShareModal() {
+    this.shareDetail = false;
   }
+
   copyLink() {
-    console.log('复制链接');
+    navigator.clipboard.writeText(this.shareLink).then(() => {
+      console.log('链接已复制');
+      // 可以添加提示用户复制成功的反馈
+    }).catch(err => {
+      console.error('复制失败:', err);
+    });
   }
-  // type:"HotDot"|"export"|"sleep"|"life"|"男"|"女" = "HotDot"
 
-  constructor(
-    private modalCtrl:ModalController,
-    private router:Router,
-  ) { 
-    
-  }
-
-  cards: Array<CloudObject> = []; // 当前显示的分类卡片
-  // async typeChange(ev: any) {
-  //   this.type = ev?.detail?.value || ev?.value || 'HotDot';
-  //   console.log(this.type);
-  //   await this.loadCards(); // 重新加载卡片
-  // }
-  async loadAllCards() {
-    const query = new CloudQuery('HotDot');
-    this.allCards = await query.find();
+  // 评论功能
+  onCommentInput(event: any) {
+    this.comment = event.detail.value;
   }
 
-  async loadCards() {
-    const query = new CloudQuery('HotDot');
-    query.equalTo('category', this.selectedSegment);
-    this.cards = await query.find();
+  postComment() {
+    if (this.comment.trim()) {
+      // 实现发布评论的逻辑,例如调用 API
+      console.log('发布评论:', this.comment);
+      this.comment = '';
+    }
   }
 
-
-  publishHealthInfo() {
-    // 这里可以添加发布求医信息的逻辑
-    console.log('发布求医信息');
+  // 跟踪函数以优化 ngFor
+  trackByIndex(index: number, item: any): number {
+    return index;
   }
 
-  openAiKnowledge(){
-    this.router.navigate(['tabs/ai-knowledge']);
-  }
-  ngOnInit() {
-    this.loadAllCards();
-    this.loadCards(); // 初始化时加载所有科普信息
-  }
-  comment:string = ''
-  onCommentInput(e:any){
-    this.comment = e.detail.value
-    console.log(this.comment);
+  trackById(index: number, item: CloudObject): string {
+    return item.id ?? `no-id-${index}`; // 确保返回 string 类型,避免 null
   }
-  postComment(){
-    console.log('发布评论');
-  }
-}
+
+}