sqj пре 4 месеци
родитељ
комит
69bd8f8ed9

Разлика између датотеке није приказан због своје велике величине
+ 641 - 14
FitMind-app/package-lock.json


+ 1 - 0
FitMind-app/package.json

@@ -27,6 +27,7 @@
     "@capacitor/keyboard": "6.0.3",
     "@capacitor/keyboard": "6.0.3",
     "@capacitor/status-bar": "6.0.2",
     "@capacitor/status-bar": "6.0.2",
     "@ionic/angular": "^8.0.0",
     "@ionic/angular": "^8.0.0",
+    "fmode-ng": "^0.0.62",
     "ionicons": "^7.2.1",
     "ionicons": "^7.2.1",
     "rxjs": "~7.8.0",
     "rxjs": "~7.8.0",
     "tslib": "^2.3.0",
     "tslib": "^2.3.0",

+ 54 - 13
FitMind-app/src/app/tab2/tab2.page.html

@@ -1,17 +1,58 @@
-<ion-header [translucent]="true">
-  <ion-toolbar>
-    <ion-title>
-      Tab 2
-    </ion-title>
-  </ion-toolbar>
-</ion-header>
-
-<ion-content [fullscreen]="true">
-  <ion-header collapse="condense">
+<ion-header>
     <ion-toolbar>
     <ion-toolbar>
-      <ion-title size="large">Tab 2</ion-title>
+      <ion-title>运动计划生成</ion-title>
     </ion-toolbar>
     </ion-toolbar>
   </ion-header>
   </ion-header>
-
-  <app-explore-container name="Tab 2 page"></app-explore-container>
+  
+  <ion-content>
+    <!-- 输入字段 -->
+    <ion-item>
+      <ion-label position="floating">体重</ion-label>
+      <ion-input [(ngModel)]="userWeight" type="number" placeholder="请输入您的体重"></ion-input>
+    </ion-item>
+    
+    <ion-item>
+      <ion-label position="floating">身高</ion-label>
+      <ion-input [(ngModel)]="userHeight" type="number" placeholder="请输入您的身高"></ion-input>
+    </ion-item>
+  
+    <ion-item>
+      <ion-label position="floating">运动偏好</ion-label>
+      <ion-select [(ngModel)]="userPreference" placeholder="选择您的运动偏好">
+        <ion-select-option value="跑步">跑步</ion-select-option>
+        <ion-select-option value="游泳">游泳</ion-select-option>
+        <ion-select-option value="健身">健身</ion-select-option>
+      </ion-select>
+    </ion-item>
+  
+    <ion-item>
+      <ion-label position="floating">运动目标</ion-label>
+      <ion-select [(ngModel)]="userGoal" placeholder="选择您的目标">
+        <ion-select-option value="减脂">减脂</ion-select-option>
+        <ion-select-option value="增肌">增肌</ion-select-option>
+        <ion-select-option value="维持">维持</ion-select-option>
+      </ion-select>
+    </ion-item>
+  
+    <!-- 生成计划按钮 -->
+    <ion-button expand="full" (click)="generatePlan()">生成运动计划</ion-button>
+  
+    <!-- 显示生成的运动计划 -->
+    <div *ngIf="responsePlan">
+      <ion-card>
+        <ion-card-header>
+          <ion-card-title>生成的运动计划</ion-card-title>
+        </ion-card-header>
+        <ion-card-content>
+            @if(!isComplete){
+                <p>{{ responsePlan }}</p>
+            }
+          
+        </ion-card-content>
+      </ion-card>
+    </div>
+    @if(isComplete){
+    <fm-markdown-preview class="content-style" [content]="responsePlan"></fm-markdown-preview>
+    }
 </ion-content>
 </ion-content>
+  

+ 53 - 3
FitMind-app/src/app/tab2/tab2.page.ts

@@ -1,16 +1,66 @@
 import { Component } from '@angular/core';
 import { Component } from '@angular/core';
-import { IonHeader, IonToolbar, IonTitle, IonContent } from '@ionic/angular/standalone';
-import { ExploreContainerComponent } from '../explore-container/explore-container.component';
+import { IonicModule } from '@ionic/angular';
+import { FormsModule } from '@angular/forms'; // 导入 FormsModule
+import { CommonModule } from '@angular/common'; // 导入 CommonModule
+import { FmodeChatCompletion,MarkdownPreviewModule } from 'fmode-ng'; // 你的外部 API 相关导入
 
 
 @Component({
 @Component({
   selector: 'app-tab2',
   selector: 'app-tab2',
   templateUrl: 'tab2.page.html',
   templateUrl: 'tab2.page.html',
   styleUrls: ['tab2.page.scss'],
   styleUrls: ['tab2.page.scss'],
   standalone: true,
   standalone: true,
-  imports: [IonHeader, IonToolbar, IonTitle, IonContent, ExploreContainerComponent]
+  imports: [
+    IonicModule,
+    FormsModule,
+    CommonModule,
+    MarkdownPreviewModule  
+  ]
 })
 })
 export class Tab2Page {
 export class Tab2Page {
+  // 用户输入的变量
+  userWeight: number = 70;   // 默认体重
+  userHeight: number = 175;  // 默认身高
+  userPreference: string = "跑步"; // 默认运动偏好
+  userGoal: string = "减脂"; // 默认目标
 
 
+  // 用于显示生成的运动计划
+  responsePlan: string = "";
+isComplete:boolean = false;
   constructor() {}
   constructor() {}
 
 
+  ngOnInit() {}
+
+  // 当用户输入信息后,点击按钮生成运动计划
+  generatePlan() {
+    // 打印输入的信息,便于调试
+    console.log("用户体重:", this.userWeight);
+    console.log("用户身高:", this.userHeight);
+    console.log("用户运动偏好:", this.userPreference);
+    console.log("用户目标:", this.userGoal);
+
+    // 创建一个包含用户输入的消息数组
+    let promptMessage = `根据以下信息,生成一个适合的运动计划:
+      体重: ${this.userWeight}kg
+      身高: ${this.userHeight}cm
+      运动偏好: ${this.userPreference}
+      目标: ${this.userGoal}`;
+
+    // 调用 AI 接口生成运动计划
+    let completion = new FmodeChatCompletion([
+      { role: "system", content: "你是一个运动专家,能够根据用户的体重、身高、运动偏好和目标,生成个性化的运动计划。" },
+      { role: "user", content: promptMessage }
+    ]);
+    
+    // 发送请求并订阅生成的计划
+    completion.sendCompletion().subscribe((message: any) => {
+      // 打印生成的计划内容,便于调试
+      console.log("生成的运动计划:", message.content);
+      
+      // 将生成的计划赋值给组件变量,用于展示
+      this.responsePlan = message.content;
+      if(message?.complete){
+        this.isComplete = true
+      }
+    });
+  }
 }
 }

+ 2 - 2
FitMind-app/src/app/tabs/tabs.page.html

@@ -6,8 +6,8 @@
     </ion-tab-button>
     </ion-tab-button>
 
 
     <ion-tab-button tab="tab2" href="/tabs/tab2">
     <ion-tab-button tab="tab2" href="/tabs/tab2">
-      <ion-icon aria-hidden="true" name="storefront"></ion-icon>
-      <ion-label>商城</ion-label>
+      <ion-icon aria-hidden="true" name="bicycle"></ion-icon>
+      <ion-label>运动中心</ion-label>
     </ion-tab-button>
     </ion-tab-button>
 
 
     <ion-tab-button tab="tab3" href="/tabs/tab3">
     <ion-tab-button tab="tab3" href="/tabs/tab3">

+ 2 - 2
FitMind-app/src/app/tabs/tabs.page.ts

@@ -1,7 +1,7 @@
 import { Component, EnvironmentInjector, inject } from '@angular/core';
 import { Component, EnvironmentInjector, inject } from '@angular/core';
 import { IonTabs, IonTabBar, IonTabButton, IonIcon, IonLabel } from '@ionic/angular/standalone';
 import { IonTabs, IonTabBar, IonTabButton, IonIcon, IonLabel } from '@ionic/angular/standalone';
 import { addIcons } from 'ionicons';
 import { addIcons } from 'ionicons';
-import { home, storefront, person } from 'ionicons/icons';
+import { home, storefront, person, bicycle } from 'ionicons/icons';
 
 
 @Component({
 @Component({
   selector: 'app-tabs',
   selector: 'app-tabs',
@@ -14,6 +14,6 @@ export class TabsPage {
   public environmentInjector = inject(EnvironmentInjector);
   public environmentInjector = inject(EnvironmentInjector);
 
 
   constructor() {
   constructor() {
-    addIcons({ home, storefront, person });
+    addIcons({ home, bicycle , person });
   }
   }
 }
 }

+ 17 - 0
FitMind-app/src/main.ts

@@ -5,10 +5,27 @@ import { IonicRouteStrategy, provideIonicAngular } from '@ionic/angular/standalo
 import { routes } from './app/app.routes';
 import { routes } from './app/app.routes';
 import { AppComponent } from './app/app.component';
 import { AppComponent } from './app/app.component';
 
 
+
+// 引用HttpClient方法
+import { provideHttpClient } from '@angular/common/http';
+// 引用移动端授权检测供应器
+import { Diagnostic } from '@awesome-cordova-plugins/diagnostic/ngx';
+// 设置Parse服务属性
+import Parse from "parse";
+Parse.initialize("ncloudmaster");
+Parse.serverURL = "https://server.fmode.cn/parse";
+localStorage.setItem("NOVA_APIG_SERVER", 'aHR0cHMlM0ElMkYlMkZzZXJ2ZXIuZm1vZGUuY24lMkZhcGklMkZhcGlnJTJG')
+
+// 注意:替换Token 根据Token设置Parse服务帐套权限
+Parse.User.become("r:E4KpGvTEto-135762888551732186124" )
 bootstrapApplication(AppComponent, {
 bootstrapApplication(AppComponent, {
   providers: [
   providers: [
     { provide: RouteReuseStrategy, useClass: IonicRouteStrategy },
     { provide: RouteReuseStrategy, useClass: IonicRouteStrategy },
     provideIonicAngular(),
     provideIonicAngular(),
     provideRouter(routes, withPreloading(PreloadAllModules)),
     provideRouter(routes, withPreloading(PreloadAllModules)),
+    // 添加HttpClient供应器
+    provideHttpClient(),
+    // 添加Diagnostic
+    Diagnostic,
   ],
   ],
 });
 });

+ 1 - 0
FitMind-app/tsconfig.json

@@ -2,6 +2,7 @@
 {
 {
   "compileOnSave": false,
   "compileOnSave": false,
   "compilerOptions": {
   "compilerOptions": {
+    "allowSyntheticDefaultImports":true,
     "baseUrl": "./",
     "baseUrl": "./",
     "outDir": "./dist/out-tsc",
     "outDir": "./dist/out-tsc",
     "forceConsistentCasingInFileNames": true,
     "forceConsistentCasingInFileNames": true,

Неке датотеке нису приказане због велике количине промена