17870762608 hace 2 meses
padre
commit
7b10d32ebd

+ 18 - 0
mcbridge-app/deploy.ps1

@@ -0,0 +1,18 @@
+# 打包项目,携带应用前缀(index.html中相对路径将自动修复为/dev/jxnu/<学号>前缀)
+# /dev/ 项目测试版上传路径
+# /dev/jxnu/<学号> nova-crm项目预留路径
+set NODE_OPTIONS=–max_old_space_size=16000
+node ./node_modules/@angular/cli/bin/ng build --base-href="/dev/jxnu/202226701032/"
+
+# 清空旧文件目录
+obsutil rm obs://nova-cloud/dev/jxnu/202226701032 -r -f -i=XSUWJSVMZNHLWFAINRZ1 -k=P4TyfwfDovVNqz08tI1IXoLWXyEOSTKJRVlsGcV6 -e="obs.cn-south-1.myhuaweicloud.com"
+
+# 同步文件目录
+obsutil sync ./www obs://nova-cloud/dev/jxnu/202226701032  -i=XSUWJSVMZNHLWFAINRZ1 -k=P4TyfwfDovVNqz08tI1IXoLWXyEOSTKJRVlsGcV6 -e="obs.cn-south-1.myhuaweicloud.com" -acl=public-read
+
+
+# 授权公开可读
+obsutil chattri obs://nova-cloud/dev/jxnu/202226701032 -r -f -i=XSUWJSVMZNHLWFAINRZ1 -k=P4TyfwfDovVNqz08tI1IXoLWXyEOSTKJRVlsGcV6 -e="obs.cn-south-1.myhuaweicloud.com" -acl=public-read
+
+# 列举对象
+obsutil ls obs://nova-cloud/dev/jxnu/agent  -i=XSUWJSVMZNHLWFAINRZ1 -k=P4TyfwfDovVNqz08tI1IXoLWXyEOSTKJRVlsGcV6 -e="obs.cn-south-1.myhuaweicloud.com"

+ 66 - 0
mcbridge-app/src/app/knowledge/knowledge-total/knowledge-total.component.html

@@ -0,0 +1,66 @@
+<ion-header [translucent]="true">
+  <ion-toolbar>
+    <ion-title>
+      热点资讯
+    </ion-title>
+  </ion-toolbar>
+</ion-header>
+
+<ion-content [fullscreen]="true">
+  <ion-segment>
+    <ion-segment-button value="first" content-id="first">
+      <ion-label>医疗知识</ion-label>
+    </ion-segment-button>
+    <ion-segment-button value="second" content-id="second">
+      <ion-label>科普视频</ion-label>
+    </ion-segment-button>
+  </ion-segment>
+  <ion-segment-view>
+    <ion-segment-content id="first">
+      <div class="tradSearch">
+        <dl class="srhGroup clear">
+          <dt>类型</dt>
+          <dd class="horizontal-links">
+            <p>全部</p>&nbsp;&nbsp;&nbsp;
+            <p>油画</p>&nbsp;&nbsp;&nbsp;
+            <p>壁画</p>
+          </dd>
+        </dl>
+      </div>
+
+      <ion-card>
+        <ion-card-content>
+          <ion-list>
+            <ion-item *ngFor="let knowledge of knowledgeList" lines="none" class="doctor-item"
+              (click)="goToKnowledge(knowledge)">
+              <ion-thumbnail slot="start">
+                <img [src]="knowledge.get('img')" [alt]="knowledge.get('title')" />
+              </ion-thumbnail>
+              <div class="doctor-info">
+                <h3>{{ knowledge.get('title') }}</h3>
+                <p>{{ knowledge?.get('author') }}</p>
+              </div>
+            </ion-item>
+          </ion-list>
+        </ion-card-content>
+      </ion-card>
+
+    </ion-segment-content>
+    <ion-segment-content id="second">
+      <ion-card>
+        <ion-card-content>
+          <ion-list>
+            <ion-item *ngFor="let knowledge of knowledgeList" lines="none" class="doctor-item">
+              @if(knowledge.get('video')){
+                <video id="video" controls>
+                <source src="{{ knowledge?.get('video') }}" type="video/mp4">
+                您的浏览器不支持视频标签。
+              </video>
+            }
+            </ion-item>
+          </ion-list>
+        </ion-card-content>
+      </ion-card>
+    </ion-segment-content>
+  </ion-segment-view>
+</ion-content>

+ 67 - 0
mcbridge-app/src/app/knowledge/knowledge-total/knowledge-total.component.scss

@@ -0,0 +1,67 @@
+/* 容器样式 */
+/* 容器样式 */
+.tradSearch {
+    max-width: 800px; /* 设置最大宽度 */
+    margin: 20px auto; /* 居中显示 */
+    background-color: #f9f9f9; /* 背景颜色 */
+    border-radius: 8px; /* 圆角 */
+    box-shadow: 0 2px 5px rgba(0, 0, 0, 0.1); /* 阴影效果 */
+  }
+  
+  /* 搜索组样式 */
+  
+  /* 每个搜索组的标题样式 */
+  .srhGroup dt {
+    font-size: 1.2em; /* 字体大小 */
+    font-weight: bold; /* 加粗 */
+    margin-bottom: 10px; /* 下边距 */
+    color: #333; /* 颜色 */
+  }
+  
+  /* 每个搜索项的样式 */
+  .srhGroup dd {
+    margin: 5px 0; /* 上下边距 */
+  }
+  
+  /* 横向链接样式 */
+  .horizontal-links {
+    display: flex; /* 使用Flexbox布局 */
+    flex-wrap: wrap; /* 允许换行 */
+  }
+  
+  .horizontal-links a {
+    margin-right: 10px; /* 链接之间的间距 */
+  }
+  
+  /* 清除浮动 */
+  .clear::after {
+    content: "";
+    display: table;
+    clear: both;
+  }
+
+  // 知识区域
+.doctor-item {
+    display: flex;
+    align-items: center;
+    // padding: 15px; /* 增加内边距 */
+    margin-bottom: 0px; /* 增加每个医生项之间的间距 */
+    border: 1px solid #e0e0e0; /* 添加边框 */
+    border-radius: 0px; /* 圆角边框 */
+    background-color: #f9f9f9; /* 背景颜色 */
+  }
+  
+  .doctor-item ion-thumbnail {
+    margin-right: 15px; /* 增加缩略图和文本之间的间距 */
+  }
+  
+  .doctor-info h3 {
+    margin: 0; /* 去掉默认的外边距 */
+    font-size: 1.2em; /* 调整字体大小 */
+  }
+  
+  .doctor-info p {
+    margin: 5px 0; /* 增加段落之间的间距 */
+    color: #666; /* 调整字体颜色 */
+  }
+  

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

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

+ 42 - 0
mcbridge-app/src/app/knowledge/knowledge-total/knowledge-total.component.ts

@@ -0,0 +1,42 @@
+import { CommonModule } from '@angular/common';
+import { Component, OnInit } from '@angular/core';
+import { Router } from '@angular/router';
+import { IonCard, IonCardContent, IonItem, IonList, IonThumbnail } from '@ionic/angular/standalone';
+import { IonLabel, IonSegment, IonSegmentButton, IonSegmentContent, IonSegmentView } from '@ionic/angular/standalone';
+import { IonContent, IonHeader, IonTitle, IonToolbar } from '@ionic/angular/standalone';
+import { CloudObject, CloudQuery } from 'src/lib/ncloud';
+
+@Component({
+  selector: 'app-knowledge-total',
+  templateUrl: './knowledge-total.component.html',
+  styleUrls: ['./knowledge-total.component.scss'],
+  standalone: true,
+  imports: [
+    IonHeader, IonToolbar, IonTitle, IonContent, IonSegment, IonSegmentButton, IonLabel, IonSegmentView, IonSegmentContent,
+    IonThumbnail, CommonModule, IonCard, IonCardContent, IonList, IonItem
+  ]
+})
+export class KnowledgeTotalComponent  implements OnInit {
+
+   constructor(private router: Router) {} 
+
+     goToKnowledge(knowledge: CloudObject){
+       const objectId = knowledge.get('title'); // 假设你的主键字段为 'title'
+       this.router.navigate(['/tabs/knowledge-page', { id: objectId }]);
+     }
+
+    ngOnInit() {
+      // 生命周期:页面加载后,运行医生列表加载函数
+      this.loadKnowledgeList()
+    }
+  
+    // 创建用于数据列表存储的属性
+    knowledgeList:Array<CloudObject> = []
+    // 查询并加载医生列表的函数
+    async loadKnowledgeList(){
+      let query = new CloudQuery("Knowledge");
+      this.knowledgeList = await query.find()
+    }
+
+
+}

+ 10 - 3
mcbridge-app/src/app/tab1/tab1.page.html

@@ -22,7 +22,7 @@
 
   <div class="button-row1">
     <ion-button expand="full" fill="outline" color="light" (click)="goToPage1()">
-      <img src="../../assets/image/picture1.jpg" alt="报病查诊" class="button-icon" />
+      <img src="https://s2.loli.net/2024/12/22/zZGij36foMSFhkB.png" alt="报病查诊" class="button-icon" />
       <!-- <span style="color: black;">智能诊疗</span> -->
     </ion-button>
     <ion-button expand="full" fill="outline" color="light" (click)="goToPage2()">
@@ -35,7 +35,7 @@
 
   <div class="button-row2">
     <ion-button expand="full" fill="outline" color="light" routerLink="/tabs/inquiry">
-      <img src="../../assets/image/屏幕截图 2024-12-21 211316.png" alt="报病查诊" class="button-icon" />
+      <img src="https://sm.ms/image/zZGij36foMSFhkB" alt="报病查诊" class="button-icon" />
     </ion-button>
     <ion-button expand="full" fill="outline" color="light" routerLink="/appointments">
       <img src="../../assets/image/屏幕截图 2024-12-21 211345.png" alt="预约记录" class="button-icon" />
@@ -82,7 +82,14 @@
   <!-- 知识模块 -->
   <ion-card>
     <ion-card-header>
-      <ion-card-title>热点咨询</ion-card-title>
+      <ion-card-title>
+        <!-- <ion-label>热点咨询</ion-label>
+        <ion-icon slot="end" name="ellipsis-horizontal-outline"></ion-icon> -->
+        <ion-item >
+          <ion-label>热点资讯</ion-label>
+          <ion-icon slot="end" name="ellipsis-horizontal-outline" (click)="goToKnowledgeTotal()"></ion-icon>
+        </ion-item>
+      </ion-card-title>
     </ion-card-header>
     <ion-card-content>
       <ion-list>

+ 13 - 8
mcbridge-app/src/app/tab1/tab1.page.ts

@@ -7,11 +7,11 @@ import { Router } from '@angular/router';
 import { IonButton } from '@ionic/angular/standalone';
 import { IonIcon } from '@ionic/angular/standalone';
 import { addIcons } from 'ionicons';
-import { bagAddOutline, imagesOutline } from 'ionicons/icons';
+import { bagAddOutline, ellipsisHorizontalOutline, imagesOutline } from 'ionicons/icons';
 import { CloudObject, CloudQuery } from 'src/lib/ncloud';
 import { IonThumbnail } from '@ionic/angular/standalone';
 
-addIcons({ bagAddOutline, imagesOutline}) 
+addIcons({ bagAddOutline, imagesOutline, ellipsisHorizontalOutline}) 
 @Component({  
   selector: 'app-tab1',  
   templateUrl: 'tab1.page.html',  
@@ -78,13 +78,17 @@ export class Tab1Page {
     this.router.navigate(['/tabs/knowledge-page', { id: objectId }]);
   }
 
-  currentScore: number = 0; // 初始分值
-
-  handleScoreChange(newScore: number) {
-    this.currentScore = newScore;
-    console.log('新分值:', newScore); // 处理分值变化
+  goToKnowledgeTotal(){
+    this.router.navigate(['/tabs/knowledge-total'])
   }
 
+  // currentScore: number = 0; // 初始分值
+
+  // handleScoreChange(newScore: number) {
+  //   this.currentScore = newScore;
+  //   console.log('新分值:', newScore); // 处理分值变化
+  // }
+
   // items = [  
   //   {  
   //     title: '医疗技术',  
@@ -114,7 +118,8 @@ export class Tab1Page {
     // 查询并加载医生列表的函数
     async loadKnowledgeList(){
       let query = new CloudQuery("Knowledge");
-      this.knowledgeList = await query.find()
+      const allKnowledge = await query.find();
+      this.knowledgeList = allKnowledge.slice(0, 3);
     }
 
 

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

@@ -36,6 +36,11 @@ export const routes: Routes = [
         loadComponent: () =>
           import('../knowledge/knowledge-page/knowledge-page.component').then((m) => m.KnowledgePageComponent),
       },
+      {
+        path: 'knowledge-total',
+        loadComponent: () =>
+          import('../knowledge/knowledge-total/knowledge-total.component').then((m) => m.KnowledgeTotalComponent),
+      },
       {
         path: '',
         redirectTo: '/tabs/tab1',

+ 9 - 9
mcbridge-app/src/lib/ncloud.ts

@@ -29,7 +29,7 @@ export class CloudObject {
 
     async save() {
         let method = "POST";
-        let url = `http://dev.fmode.cn:1337/parse/classes/${this.className}`;
+        let url = `https://dev.fmode.cn/parse/classes/${this.className}`;
 
         // 更新
         if (this.id) {
@@ -61,7 +61,7 @@ export class CloudObject {
 
     async destroy() {
         if (!this.id) return;
-        const response = await fetch(`http://dev.fmode.cn:1337/parse/classes/${this.className}/${this.id}`, {
+        const response = await fetch(`https://dev.fmode.cn/parse/classes/${this.className}/${this.id}`, {
             headers: {
                 "x-parse-application-id": "dev"
             },
@@ -113,7 +113,7 @@ export class CloudQuery {
     }
 
     async get(id: string) {
-        const url = `http://dev.fmode.cn:1337/parse/classes/${this.className}/${id}?`;
+        const url = `https://dev.fmode.cn/parse/classes/${this.className}/${id}?`;
 
         const response = await fetch(url, {
             headers: {
@@ -131,7 +131,7 @@ export class CloudQuery {
     }
 
     async find() {
-        let url = `http://dev.fmode.cn:1337/parse/classes/${this.className}?`;
+        let url = `https://dev.fmode.cn/parse/classes/${this.className}?`;
 
         if (Object.keys(this.whereOptions).length) {
             const whereStr = JSON.stringify(this.whereOptions);
@@ -156,7 +156,7 @@ export class CloudQuery {
     }
 
     async first() {
-        let url = `http://dev.fmode.cn:1337/parse/classes/${this.className}?`;
+        let url = `https://dev.fmode.cn/parse/classes/${this.className}?`;
 
         if (Object.keys(this.whereOptions).length) {
             const whereStr = JSON.stringify(this.whereOptions);
@@ -215,7 +215,7 @@ export class CloudUser extends CloudObject {
             return null;
         }
         
-        const response = await fetch(`http://dev.fmode.cn:1337/parse/users/me`, {
+        const response = await fetch(`https://dev.fmode.cn/parse/users/me`, {
             headers: {
                 "x-parse-application-id": "dev",
                 "x-parse-session-token": this.sessionToken // 使用sessionToken进行身份验证
@@ -233,7 +233,7 @@ export class CloudUser extends CloudObject {
 
     /** 登录 */
     async login(username: string, password: string):Promise<CloudUser|null> {
-        const response = await fetch(`http://dev.fmode.cn:1337/parse/login`, {
+        const response = await fetch(`https://dev.fmode.cn/parse/login`, {
             headers: {
                 "x-parse-application-id": "dev",
                 "Content-Type": "application/json"
@@ -265,7 +265,7 @@ export class CloudUser extends CloudObject {
             return;
         }
 
-        const response = await fetch(`http://dev.fmode.cn:1337/parse/logout`, {
+        const response = await fetch(`https://dev.fmode.cn/parse/logout`, {
             headers: {
                 "x-parse-application-id": "dev",
                 "x-parse-session-token": this.sessionToken
@@ -295,7 +295,7 @@ export class CloudUser extends CloudObject {
             ...additionalData // 合并额外的用户数据
         };
 
-        const response = await fetch(`http://dev.fmode.cn:1337/parse/users`, {
+        const response = await fetch(`https://dev.fmode.cn/parse/users`, {
             headers: {
                 "x-parse-application-id": "dev",
                 "Content-Type": "application/json"

+ 5 - 5
mcbridge-server/lib/ncloud.js

@@ -21,7 +21,7 @@ class CloudObject{
     }
     async save(){
         let method = "POST"
-        let url = "http://dev.fmode.cn:1337/parse/classes/" + this.className
+        let url = "https://dev.fmode.cn/parse/classes/" + this.className
         // 更新
         if(this.id){
             url += "/"+this.id
@@ -47,7 +47,7 @@ class CloudObject{
     }
     async destory(){
         if(!this.id) return
-        let response = await fetch("http://dev.fmode.cn:1337/parse/classes/Doctor/"+this.id, {
+        let response = await fetch("https://dev.fmode.cn/parse/classes/Doctor/"+this.id, {
             "headers": {
               "x-parse-application-id": "dev"
             },
@@ -92,7 +92,7 @@ class CloudQuery{
     }
 
     async get(id){
-        let url = "http://dev.fmode.cn:1337/parse/classes/"+this.className+"/"+id+"?"
+        let url = "https://dev.fmode.cn/parse/classes/"+this.className+"/"+id+"?"
 
         let response = await fetch(url, {
             "headers": {
@@ -108,7 +108,7 @@ class CloudQuery{
         return json || {}
     }
     async find(){
-        let url = "http://dev.fmode.cn:1337/parse/classes/"+this.className+"?"
+        let url = "https://dev.fmode.cn/parse/classes/"+this.className+"?"
         
         if(Object.keys(this.whereOptions)?.length){
             let whereStr = JSON.stringify(this.whereOptions)
@@ -129,7 +129,7 @@ class CloudQuery{
         return json?.results || []
     }
     async first(){
-        let url = "http://dev.fmode.cn:1337/parse/classes/"+this.className+"?"
+        let url = "https://dev.fmode.cn/parse/classes/"+this.className+"?"
         
         if(Object.keys(this.whereOptions)?.length){
             let whereStr = JSON.stringify(this.whereOptions)