Ver Fonte

update: new pro

17870762608 há 2 meses atrás
pai
commit
bfebc842aa

+ 4 - 1
mcbridge-app/angular.json

@@ -126,7 +126,10 @@
     }
   },
   "cli": {
-    "schematicCollections": ["@ionic/angular-toolkit"]
+    "schematicCollections": [
+      "@ionic/angular-toolkit"
+    ],
+    "analytics": false
   },
   "schematics": {
     "@ionic/angular-toolkit:component": {

Diff do ficheiro suprimidas por serem muito extensas
+ 641 - 14
mcbridge-app/package-lock.json


+ 1 - 0
mcbridge-app/package.json

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

+ 8 - 0
mcbridge-app/src/app/edit-rating-star/edit-rating-star.component.html

@@ -0,0 +1,8 @@
+<div class="star-rating">
+  <ng-container *ngFor="let star of starList; let i = index">
+    <ion-icon 
+      [name]="star ? 'star' : 'star-outline'" 
+      (click)="rate(i)">
+    </ion-icon>
+  </ng-container>
+</div>

+ 10 - 0
mcbridge-app/src/app/edit-rating-star/edit-rating-star.component.scss

@@ -0,0 +1,10 @@
+.star-rating {
+    display: flex;
+    cursor: pointer;
+  
+    ion-icon {
+      font-size: 30px; // 调整星星大小
+      color: gold; // 星星颜色
+      margin-right: 5px; // 星星间距
+    }
+  }

+ 22 - 0
mcbridge-app/src/app/edit-rating-star/edit-rating-star.component.spec.ts

@@ -0,0 +1,22 @@
+import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing';
+
+import { EditRatingStarComponent } from './edit-rating-star.component';
+
+describe('EditRatingStarComponent', () => {
+  let component: EditRatingStarComponent;
+  let fixture: ComponentFixture<EditRatingStarComponent>;
+
+  beforeEach(waitForAsync(() => {
+    TestBed.configureTestingModule({
+      imports: [EditRatingStarComponent],
+    }).compileComponents();
+
+    fixture = TestBed.createComponent(EditRatingStarComponent);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+  }));
+
+  it('should create', () => {
+    expect(component).toBeTruthy();
+  });
+});

+ 57 - 0
mcbridge-app/src/app/edit-rating-star/edit-rating-star.component.ts

@@ -0,0 +1,57 @@
+import { CommonModule } from '@angular/common';
+import { Component, OnInit } from '@angular/core';
+import { Input, Output, EventEmitter } from '@angular/core';
+import { IonIcon } from '@ionic/angular/standalone';
+import { addIcons } from 'ionicons';
+import { star } from 'ionicons/icons';
+import { starOutline } from 'ionicons/icons';
+
+addIcons({star,starOutline})
+@Component({
+  selector: 'edit-rating-star',
+  templateUrl: './edit-rating-star.component.html',
+  styleUrls: ['./edit-rating-star.component.scss'],
+  imports:[IonIcon, CommonModule],
+  standalone: true,
+})
+export class EditRatingStarComponent  implements OnInit {
+
+  @Input() score: number = 0; // 默认分值为0
+  @Input() scoreMax: number = 5; // 最大分值
+  starList: boolean[] = []; // 星星状态数组
+
+  @Output() onScoreChange: EventEmitter<number> = new EventEmitter<number>();
+
+  constructor() {
+    this.updateStarList();
+  }
+
+  ngOnInit(){
+    this.updateStarList();
+  }
+
+  ngOnChanges() {
+    this.updateStarList();
+  }
+
+  // 更新星星数组
+  private updateStarList() {
+    this.starList = Array(this.scoreMax).fill(false);
+    for (let i = 0; i < this.score; i++) {
+      this.starList[i] = true;
+    }
+  }
+
+  // 打分方法
+  rate(index: number) {
+    if (this.score === index + 1) {
+      // 如果点击的是当前分值,清零
+      this.score = 0;
+    } else {
+      // 否则更新分值
+      this.score = index + 1;
+    }
+    this.updateStarList();
+    this.onScoreChange.emit(this.score); // 触发分值变化事件
+  }
+}

+ 23 - 0
mcbridge-app/src/app/picture/picture.component.html

@@ -0,0 +1,23 @@
+<ion-content>
+
+  <h1>科室</h1>
+  <ion-input  [value]="keshi" (ionInput)="keshiInput($event)"></ion-input>
+
+  <!-- 文本域:生成提示词 -->
+  <h1>症状的描述</h1>
+  <ion-textarea [value]="userPrompt" (ionInput)="promptInput($event)" placeholder="文本提示词" autoGrow="true"></ion-textarea>
+  
+  <!-- 按钮:执行消息生成函数 -->
+  <ion-button (click)="sendMessage()" expand="block">初步诊断</ion-button>
+  
+  <!-- 展示:返回消息内容 -->
+  <!-- 消息传输过程中,实时预览 -->
+  @if(!isComplete){
+    <div>{{responseMsg}}</div>
+  }
+  <!-- 消息传输完成后,实时预览Markdown格式 -->
+  @if(isComplete){
+    <fm-markdown-preview class="content-style" [content]="responseMsg"></fm-markdown-preview>
+  }
+  
+</ion-content>

+ 0 - 0
mcbridge-app/src/app/picture/picture.component.scss


+ 22 - 0
mcbridge-app/src/app/picture/picture.component.spec.ts

@@ -0,0 +1,22 @@
+import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing';
+
+import { PictureComponent } from './picture.component';
+
+describe('PictureComponent', () => {
+  let component: PictureComponent;
+  let fixture: ComponentFixture<PictureComponent>;
+
+  beforeEach(waitForAsync(() => {
+    TestBed.configureTestingModule({
+      imports: [PictureComponent],
+    }).compileComponents();
+
+    fixture = TestBed.createComponent(PictureComponent);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+  }));
+
+  it('should create', () => {
+    expect(component).toBeTruthy();
+  });
+});

+ 55 - 0
mcbridge-app/src/app/picture/picture.component.ts

@@ -0,0 +1,55 @@
+import { Component, OnInit } from '@angular/core';
+import { IonHeader, IonToolbar, IonTitle, IonContent, IonButton, IonTextarea, IonInput } from '@ionic/angular/standalone';
+/** 引用:从fmode-ng库引用FmodeChatCompletion类 */
+import { FmodeChatCompletion,MarkdownPreviewModule } from 'fmode-ng';
+
+@Component({
+  selector: 'app-picture',
+  templateUrl: './picture.component.html',
+  styleUrls: ['./picture.component.scss'],
+  standalone: true,
+  imports: [IonHeader, IonToolbar, IonTitle, IonContent, IonButton,IonTextarea,IonInput,
+    // 引入fm-markdown-preview组件模块
+    MarkdownPreviewModule
+  ],
+})
+export class PictureComponent  implements OnInit {
+  constructor() {}
+  ngOnInit(){}
+  // 用户输入提示词
+  keshi:string = "门诊"
+  keshiInput(ev:any){
+    this.keshi = ev.detail.value;
+  }
+  // 用户输入提示词
+  userPrompt:string = "请描述您的症状"
+  promptInput(ev:any){
+    this.userPrompt = ev.detail.value;
+  }
+  // 属性:组件内用于展示消息内容的变量
+  responseMsg:any = ""
+  // 方法:实例化completion对象,传入消息数组,并订阅生成的可观察对象。
+  isComplete:boolean = false; // 定义完成状态属性,用来标记是否补全完成
+  sendMessage(){
+    console.log("create")
+
+    let PromptTemplate = `
+    您作为一名专业的${this.keshi}医生,请您根据用户描述的症状,给出初步的诊断,并给出一些建议。
+    以下是用户的口述:${this.userPrompt}
+    `
+
+    let completion = new FmodeChatCompletion([
+      {role:"system",content:""},
+      {role:"user",content:PromptTemplate}
+    ])
+    completion.sendCompletion().subscribe((message:any)=>{
+      // 打印消息体
+      console.log(message.content)
+      // 赋值消息内容给组件内属性
+      this.responseMsg = message.content
+      if(message?.complete){ // 判断message为完成状态,则设置isComplete为完成
+        this.isComplete = true
+      }
+    })
+  }
+}

+ 14 - 0
mcbridge-app/src/app/tab1/tab1.page.html

@@ -16,6 +16,14 @@
   <!-- 添加搜索框 -->  
   <ion-searchbar placeholder="搜索..." (ionInput)="search($event)"></ion-searchbar>  
 
+  <div class="inquery" style="margin-top: 10px">
+    <div class="inquery-ai">
+      <ion-button color="primary" size="large" (click)="goToPage1()">
+        AI问诊
+      </ion-button>
+    </div>
+  </div>
+
   <!-- 页面内容 -->  
   <ion-card *ngFor="let item of items">  
     <img [src]="item.image" alt="{{ item.title }}" />  
@@ -25,6 +33,12 @@
     <ion-card-content>  
       {{ item.description }}  
     </ion-card-content>  
+    <edit-rating-star 
+    [score]="currentScore" 
+    [scoreMax]="5" 
+    (onScoreChange)="handleScoreChange($event)">
+  </edit-rating-star>
+  
   </ion-card>  
 
   <ion-list>  

+ 24 - 3
mcbridge-app/src/app/tab1/tab1.page.ts

@@ -2,6 +2,9 @@ import { Component } from '@angular/core';
 import { CommonModule } from '@angular/common'; // 导入 CommonModule  
 import { IonHeader, IonToolbar, IonTitle, IonContent, IonSearchbar, IonCard, IonCardHeader, IonCardTitle, IonCardSubtitle, IonCardContent, IonItem, IonLabel, IonList, IonFooter } from '@ionic/angular/standalone';  
 import { ExploreContainerComponent } from '../explore-container/explore-container.component';  
+import { EditRatingStarComponent } from '../edit-rating-star/edit-rating-star.component';
+import { Router } from '@angular/router';
+import { IonButton } from '@ionic/angular/standalone';
 
 @Component({  
   selector: 'app-tab1',  
@@ -12,10 +15,28 @@ import { ExploreContainerComponent } from '../explore-container/explore-containe
     CommonModule, // 在 imports 中加入 CommonModule  
     IonHeader, IonToolbar, IonTitle, IonContent, IonSearchbar,   
     IonCard, IonCardHeader, IonCardTitle, IonCardSubtitle, IonCardContent,   
-    IonItem, IonLabel, IonList, IonFooter, ExploreContainerComponent  
+    IonItem, IonLabel, IonList, IonFooter, ExploreContainerComponent ,
+    EditRatingStarComponent, IonButton
   ],  
 })  
-export class Tab1Page {  
+export class Tab1Page {
+   constructor(private router: Router) {} 
+
+  goToPage1(){
+    this.router.navigate(['/tabs/picture'])
+  }
+
+  goToPage2(){
+
+  }
+
+  currentScore: number = 0; // 初始分值
+
+  handleScoreChange(newScore: number) {
+    this.currentScore = newScore;
+    console.log('新分值:', newScore); // 处理分值变化
+  }
+
   items = [  
     {  
       title: '医疗技术',  
@@ -34,7 +55,7 @@ export class Tab1Page {
     }  
   ];  
 
-  constructor() {}  
+
 
   search(event: CustomEvent) {  
     const searchTerm = event.detail.value;  

+ 5 - 0
mcbridge-app/src/app/tabs/tabs.routes.ts

@@ -21,6 +21,11 @@ export const routes: Routes = [
         loadComponent: () =>
           import('../tab3/tab3.page').then((m) => m.Tab3Page),
       },
+      {
+        path: 'picture',
+        loadComponent: () =>
+          import('../picture/picture.component').then((m) => m.PictureComponent),
+      },
       {
         path: '',
         redirectTo: '/tabs/tab1',

+ 19 - 0
mcbridge-app/src/main.ts

@@ -5,10 +5,29 @@ import { IonicRouteStrategy, provideIonicAngular } from '@ionic/angular/standalo
 import { routes } from './app/app.routes';
 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:71c794e9a9c2b65412930a30f5a208cc")
+
 bootstrapApplication(AppComponent, {
   providers: [
+    
     { provide: RouteReuseStrategy, useClass: IonicRouteStrategy },
     provideIonicAngular(),
     provideRouter(routes, withPreloading(PreloadAllModules)),
+    // 添加HttpClient供应器
+    provideHttpClient(),
+    // 添加Diagnostic
+    Diagnostic,
+    // ...
   ],
 });

+ 1 - 0
mcbridge-app/tsconfig.json

@@ -25,6 +25,7 @@
     "enableI18nLegacyMessageIdFormat": false,
     "strictInjectionParameters": true,
     "strictInputAccessModifiers": true,
+    "allowSyntheticDefaultImports":true,
     "strictTemplates": true
   }
 }

+ 47 - 1
mcbridge-prod/README.md

@@ -18,4 +18,50 @@
 - 专家咨询与问答服务:提供按次收费的专家答疑服务。例如,用户可以通过平台提问,系统推荐相关专家回答,专家回答之后,用户根据需要支付咨询费用
 # 二、项目背景
 ## 1.政策背景
-国务院办公厅关于印发《深化医药卫生体制改革2024年重点工作任务》的通知
+近年来,国家高度重视国民健康,出台多项政策鼓励医疗行业的发展。例如,国务院办公厅关于印发《深化医药卫生体制改革2024年重点工作任务》的通知
+![alt text](image.png)
+## 2.行业背景
+一方面,随着医学研究的深入和医疗技术的不断创新,新的诊疗方法、药物和医疗器械不断涌现,为行业发展提供了源源不断的动力;另一方面,随着人口老龄化、慢性病发病率上升等问题的加剧,人们对医疗健康服务的需求也在不断增加,市场潜力巨大。 近年来,中国医疗健康行业呈现出快速发展的态势。 随着经济的持续增长和居民收入水平的提高,人们对医疗健康服务的需求日益旺盛。
+
+![alt text](image-1.png)
+## 3.市场痛点
+- 医疗资源不均衡:在许多国家和地区,医疗资源的分布极不均衡,城市与乡村、发达地区与欠发达地区之间的医疗服务差距显著。这导致了部分人群无法获得及时和高质量的医疗服务
+- 医疗费用高昂:医疗费用的不断上涨使得患者负担加重,尤其是在一些国家,缺乏足够的医疗保险覆盖,导致很多人因经济原因而延误治疗。
+- 信息孤岛:医疗数据的分散和缺乏标准化使得不同医疗机构之间的信息共享困难,影响了患者的连续性护理和医生的决策效率
+![alt text](image-2.png)
+
+# 产品定位
+## 用户分析
+- 医护人员:包括医生、护士、药剂师等,主要需求是提升专业知识、技能和跨学科的协作能力。
+- 医学生:在校医学生需要获取最新的医学知识和临床技能,帮助他们更好地准备实习和未来的职业生涯。
+- 大众:帮助大家在家一些病状分析,即时处理,以及专家咨询
+## 主要功能
+- 自然语言处理与互动:实现语音识别和文本理解,允许用户通过自然语言提问和获取建议。
+- 专家咨询与答疑服务:用户可以通过平台提问,系统推荐相关专家进行解答,并提供按次收费的咨询服务。
+- 实时数据收集与分析:记录用户的学习进度和反馈,进行大数据分析,评估学习效果并调整推荐内容。
+
+# 可行性测试
+## 技术可行性
+- 自然语言处理:目前已有成熟的自然语言处理技术,能够实现语音识别、文本理解和生成。
+- 数据分析:大数据分析工具和技术日益成熟,能够支持实时数据收集和分析。
+## 市场可行性
+- 医疗行业对持续教育和技能提升的需求日益增加,市场潜力巨大。
+- 与医疗机构、设备商和药品公司合作,能够拓宽市场渠道,增加产品的市场认可度。
+## 财务可行性
+- 通过与医疗机构的合作、专家咨询服务等多种盈利模式,能够实现稳定的收入来源。
+## 法律可行性
+- 符合国家对医疗行业的相关法律法规,确保用户数据的安全和隐私保护。
+
+# 产品结构
+## 用户端
+- 用户注册与登录:支持医护人员、医学生等用户注册和登录。
+- 个性化学习首页:展示用户的学习进度、推荐内容和待完成任务。
+- 知识模块:提供各学科的知识模块,用户可以选择学习。
+- 互动问答:用户可以通过自然语言提问,系统提供回答或推荐专家。
+## 管理端
+- 数据监控与分析:实时监控用户学习数据,进行效果分析。
+- 内容管理:管理知识模块的更新与维护,确保内容的时效性与准确性。
+- 用户反馈管理:收集用户反馈,进行数据分析与优化产品。
+## 专家端
+- 专家注册与认证:专家可以注册并通过审核后提供咨询服务。
+- 问题管理:接收用户提问,提供解答并管理咨询记录。

BIN
mcbridge-prod/image-1.png


BIN
mcbridge-prod/image-2.png


BIN
mcbridge-prod/image.png


Alguns ficheiros não foram mostrados porque muitos ficheiros mudaram neste diff