Forráskód Böngészése

Merge branch 'master' of http://git.fmode.cn:3000/yuebuzu/s202226701018

yuebuzu-creater 4 hónapja
szülő
commit
d01f9d06fa

+ 1 - 1
wisdom-app/src/app/component/edit-tag/edit-tag.component.html

@@ -1,5 +1,5 @@
 
-<ion-input [value]="userInput" (ionInput)="onInput($event)" type="text" placeholder="请输入标签名称"></ion-input>
+<ion-input [value]="userInput" (ionInput)="onInput($event)" type="text" placeholder="请输入标签名称(点击生成的标签即可删除)"></ion-input>
 <!-- <p>当前输入: {{userInput}}</p>  -->
 <ion-button (click)="addTag()" expand="block" color="success">添加标签</ion-button>
 <div>

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

@@ -16,8 +16,8 @@
          <ion-card-title>就诊时间:{{message?.updatedAt}}</ion-card-title>
        </ion-card-header>
        <ion-card-content>
-        <p>就诊医生{{message.data["doctor"]}}</p>
-        <p>就诊部门{{message.data["depart"]}}</p>
+        <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> -->

+ 3 - 1
wisdom-app/src/app/page/page-my-health/page-my-health.component.ts

@@ -44,9 +44,11 @@ export class PageMyHealthComponent  implements OnInit {
   allMessage : Array<CloudObject> = [];
 
   async loadData(){
+    let user = new CloudUser();
     console.log("objectId",this.objectId);
     let query = new CloudQuery('Consultation');
-    console.log(query.include("user"))
+    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();

+ 2 - 1
wisdom-app/src/app/poem-picture/poem-picture.component.html

@@ -1,5 +1,6 @@
 <ion-header [translucent]="true">
   <ion-toolbar class="custom-toolbar">
+    <ion-button slot="start" size="small" (click)="backHome()" color="primary">back</ion-button>
     <ion-title class="custom-title">
       个性化头像生成
     </ion-title>
@@ -9,7 +10,7 @@
 <ion-content [fullscreen]="true">
   <!-- 生成提示词 -->
   <ion-textarea [value]="userPrompt" (ionInput)="promptInput($event)" placeholder="请输入头像要求(示例:画风采用动漫风,一位长发飘飘的女孩抬头仰望着天空微笑。)" autoGrow="true"></ion-textarea>
-  <ion-button (click)="createImage()" expand="block" color="success">头像生成</ion-button>
+  <ion-button (click)="createImage()" expand="block" color="success" class="anniu">头像生成</ion-button>
   <!-- 意境画面提示词 -->
   <div class="desc">
     {{PictureDescResult}}

+ 2 - 2
wisdom-app/src/app/poem-picture/poem-picture.component.scss

@@ -36,8 +36,8 @@ ion-content {
   }
   
   /* 按钮样式 */
-  ion-button {
-    background-color: #6be4ea; /* 按钮背景颜色 */
+  .anniu {
+    background-color: #6be2ea; /* 按钮背景颜色 */
     color: white; /* 按钮文字颜色 */
     border-radius: 8px; /* 圆角 */
     font-size: 18px; /* 字体大小 */

+ 7 - 0
wisdom-app/src/app/poem-picture/poem-picture.component.ts

@@ -1,4 +1,5 @@
 import { Component, OnInit } from '@angular/core';
+import { Router } from '@angular/router';
 import { IonHeader, IonToolbar, IonTitle, IonContent } from '@ionic/angular/standalone';
 import { IonTextarea, IonButton,IonInput } from "@ionic/angular/standalone";
 import { DalleOptions, ImagineWork, FmodeChatCompletion } from 'fmode-ng';
@@ -31,6 +32,7 @@ export class PoemPictureComponent  implements OnInit {
   imagineWork:ImagineWork
   images:Array<string> = []
   constructor(
+    private router: Router
   ){
     // 示例任务,自己生成图片后请存储新的ID 
     this.imagineWork = new ImagineWork("");
@@ -79,6 +81,11 @@ export class PoemPictureComponent  implements OnInit {
   }
     
   }
+  back:string = "back"
+  backHome(){
+    this.router.navigate(['/tabs/tab4']);
+  }
+
   ngOnInit() {}
 
 }

+ 22 - 17
wisdom-app/src/app/tab3/tab3.page.html

@@ -16,23 +16,30 @@
   (ionInput)="searchProducts($event)">
 </ion-searchbar>
 
-  <!-- 分类区域(可横向滑动) -->
-  <div class="category-scroll">
-    <div class="category-scroll-inner">
-      <ion-grid>
-        <ion-row class="category-row">
-          <ion-col size="3" *ngFor="let category of categories" class="category-col">
-            <div class="category-item" (click)="onCategoryClick(category)">
-              <div class="category-image-wrapper">
-                <img [src]="category.image" alt="{{category.name}}" class="category-image">
-              </div>
-              <div class="category-text">{{ category.name }}</div>
+ <!-- 分类区域(可横向滑动) -->
+<div class="category-scroll">
+  <div class="category-scroll-inner">
+    <ion-grid>
+      <ion-row class="category-row">
+        <ion-col 
+          size="3" 
+          size-sm="3" 
+          size-md="3" 
+          size-lg="3" 
+          size-xl="3" 
+          *ngFor="let category of categories" 
+          class="category-col">
+          <div class="category-item" (click)="onCategoryClick(category)">
+            <div class="category-image-wrapper">
+              <img [src]="category.image" alt="{{category.name}}" class="category-image">
             </div>
-          </ion-col>
-        </ion-row>
-      </ion-grid>
-    </div>
+            <div class="category-text">{{ category.name }}</div>
+          </div>
+        </ion-col>
+      </ion-row>
+    </ion-grid>
   </div>
+</div>
 
 <!-- 热销模块 -->
 <div class="marketing-section">
@@ -81,9 +88,7 @@
     <ion-button fill="clear" (click)="viewMore('special')">查看更多</ion-button>
   </div>
 </div>
-<div>
 
-</div>
 <!-- 商品卡片列表区域 -->
 <div class="product-container">
   <ng-container *ngFor="let product of products">

+ 26 - 9
wisdom-app/src/app/tab3/tab3.page.scss

@@ -1,10 +1,10 @@
-// 整体背景渐变,可以根据需要调整或移除
+/* 整体背景渐变,可以根据需要调整或移除 */
 .content-background {
   background: linear-gradient(to bottom, #e0f7fa, #ffffff);
   --padding-bottom: 0;
 }
 
-// 标题栏相关样式
+/* 标题栏相关样式 */
 .custom-toolbar {
   --background: transparent;
   display: flex;
@@ -23,7 +23,7 @@
   font-family: "微软雅黑", sans-serif;
 }
 
-// 搜索栏区域样式
+/* 搜索栏区域样式 */
 .search-container {
   padding: 0 16px;
   margin-top: 8px;
@@ -35,7 +35,16 @@
   box-shadow: 0 2px 6px rgba(0,0,0,0.1);
 }
 
-// 分类区域(可横向滚动)
+/* 分类区域(可横向滚动) */
+.category-scroll {
+  overflow-x: auto; /* 如果需要横向滚动 */
+  width: 100%;
+}
+
+.category-scroll-inner {
+  width: 100%;
+}
+
 .category-row {
   margin: 0;
 }
@@ -46,6 +55,8 @@
   align-items: center;
   text-align: center;
   margin-bottom: 16px; 
+  max-width: 25%; /* 确保每个列最大宽度为25%,即四个一行 */
+  flex: 0 0 25%; /* 防止列自动扩展 */
 }
 
 .category-item {
@@ -55,11 +66,17 @@
   justify-content: center;
   text-align: center;
   cursor: pointer; /* 可选:让鼠标移上去有点击手势 */
+  width: 100%; /* 占满整个列 */
+}
+
+.category-image-wrapper {
+  width: 80px; /* 设定一个固定的宽度和高度 */
+  height: 80px;
 }
 
 .category-image {
-  max-width: 90%;
-  max-height: 90%;
+  width: 100%;
+  height: 100%;
   object-fit: contain; 
 }
 
@@ -72,7 +89,7 @@
   max-width: 100%;
 }
 
-// 商品列表区域样式
+/* 商品列表区域样式 */
 .product-container {
   padding: 0 16px;
   margin-top: 16px;
@@ -116,7 +133,7 @@
 .product-image {
   width: 100%;
   height: 100%;
-  // object-fit: cover;
+  /* object-fit: cover; */
 }
 
 .product-info {
@@ -141,7 +158,7 @@
   font-weight: bold;
 }
 
-// 底部弹窗(modal)样式
+/* 底部弹窗(modal)样式 */
 .bottom-modal {
   --height: 75vh;
   --width: 100%;

+ 119 - 46
wisdom-app/src/app/tab4/tab4.page.html

@@ -10,10 +10,11 @@
     <ion-refresher-content></ion-refresher-content>
   </ion-refresher>
   <!-- 用户登录状态 -->
-  <ion-card>
+  
     <!-- 未登录 -->
      @if(!currentUser?.id){
-        <ion-content>
+      <ion-card >
+        <ion-content class="login">
           <ion-card class="login-card">
               <ion-card-header>
                   <ion-card-title>请登录</ion-card-title>
@@ -25,56 +26,128 @@
             </div>
           </ion-card>
       </ion-content>
-      }
-        <!-- 已登录 -->
-     @if(currentUser?.id){
-      <ion-card-header class="card-header">
-        <img [src]="currentUser?.get('avatar')" onerror="this.src='https://app.fmode.cn/dev/jxnu/202226701019/头像示例.png';" alt="图片加载失败" class="avatar" />
-        <div class="user-info">
-            <ion-card-title>账号:{{currentUser?.get("username")}}</ion-card-title>
-            <ion-card-subtitle>
-                姓名: {{currentUser?.get("realname") || "-"}} 
-                性别: {{currentUser?.get("gender") || "-"}} 
-                年龄: {{currentUser?.get("age") || "-"}}
-            </ion-card-subtitle>
-        </div>
-    </ion-card-header>
-      }
       <ion-card-content>
-      @if(!currentUser?.id){
         <ion-button expand="block" (click)="signup()" color="success">注册</ion-button>
         <ion-button expand="block" (click)="login()" color="success">登录</ion-button>
-      }
-     @if(currentUser?.id){
-      <ion-button expand="block" (click)="editUser()" color="success">编辑资料</ion-button>
-      <ion-button expand="block" (click)="logout()" color="medium">登出</ion-button>
-    }
-    </ion-card-content>
-  </ion-card>
-  @if(currentUser?.id){
-    <ion-card>
-      <ion-card-header>
-        <ion-card-title>个性头像生成器</ion-card-title>
-        <ion-card-subtitle>点击创建个性化头像</ion-card-subtitle>
-      </ion-card-header>
-      <ion-card-content>
-        <ion-button expand="block" (click)="goToAvatar()" color="success">前往生成</ion-button>
       </ion-card-content>
-    </ion-card>
+  </ion-card>
   }
+        <!-- 已登录 -->
   @if(currentUser?.id){
-  <ion-card class="memo-card">
-    <h2 class="memo-title">健康备忘录</h2>
-    <p class="memo-description">写下您问诊的医生名或者心动的科普知识,便于您下次查找(点击标签可删除)</p>
-    <app-edit-tag (onTagChange)="setTagsValue($event)"></app-edit-tag>
+    @if(pageNum==0){
+        <div class="container">
+          <div class="top-section">
+            <ion-button expand="block" fill="outline" (click)="changeNum1()" color="dark">简约朴素-模块型</ion-button>
+            <ion-label class="zi1">点击进入此主题页面</ion-label>
+          </div>
+          <div class="bottom-section">
+            <ion-button expand="block" fill="outline" (click)="changeNum2()" color="light">优雅精致-层次型</ion-button>
+            <ion-label class="zi2">点击进入此主题页面</ion-label>
+          </div>
+        </div>
+      
+    }
+    @if(pageNum==1){
+      <ion-card >
+          <ion-card-header class="card-header">
+            <img [src]="currentUser?.get('avatar')" onerror="this.src='https://app.fmode.cn/dev/jxnu/202226701019/头像示例.png';" alt="图片加载失败" class="avatar" />
+            <div class="user-info">
+                <ion-card-title>账号:{{currentUser?.get("username")}}</ion-card-title>
+                <ion-card-subtitle>
+                    姓名: {{currentUser?.get("realname") || "-"}} 
+                    性别: {{currentUser?.get("gender") || "-"}} 
+                    年龄: {{currentUser?.get("age") || "-"}}
+                </ion-card-subtitle>
+            </div>
+        </ion-card-header>
+        <ion-card-content>
+          <ion-button expand="block" (click)="editUser()" color="success">编辑资料</ion-button>
+          <ion-button expand="block" (click)="changeNum2()">切换主题</ion-button>
+          <ion-button expand="block" (click)="logout()" color="medium">登出</ion-button>
+        </ion-card-content>
+      </ion-card>
 
-    <h2 class="memo-title">收藏夹</h2>
-    <ul class="tag-list">
-        @for(tag of editTags; track tag;){
-            <li class="tag-item">{{tag}}</li>
-        }
-    </ul>
-  </ion-card>
-  }
+      <ion-card >
+        <ion-card-header>
+          <ion-card-title>个性头像生成器</ion-card-title>
+          <ion-card-subtitle>点击创建个性化头像</ion-card-subtitle>
+        </ion-card-header>
+        <ion-card-content>
+          <ion-button expand="block" (click)="goToAvatar()" color="success">前往生成</ion-button>
+        </ion-card-content>
+      </ion-card>
 
+      <ion-card class="memo-card" >
+        <h2 class="memo-title">健康备忘录</h2>
+        <p class="memo-description">写下您问诊的医生名或者心动的科普知识,便于您下次查找</p>
+        <app-edit-tag (onTagChange)="setTagsValue($event)"></app-edit-tag>
+        <h2 class="memo-title">收藏夹</h2>
+        <ul class="tag-list">
+            @for(tag of editTags; track tag;){
+                <li class="tag-item">{{tag}}</li>
+            }
+        </ul>
+      </ion-card>
+    }
+    @if(pageNum==2){
+      <ion-content class="ye2">
+      <ion-card class="custom-card">
+        <ion-avatar (click)="editUser()">
+          <img [src]="currentUser?.get('avatar')" onerror="this.src='https://app.fmode.cn/dev/jxnu/202226701019/头像示例.png';" alt="图片加载失败" class="avatar" />
+        </ion-avatar>
+        <ion-label>{{currentUser?.get("realname") || "-"}}</ion-label>
+      </ion-card>
+
+        <ion-list>
+          <ion-item>
+            <ion-icon name="person-circle" slot="start" ></ion-icon>
+            <ion-label (click)="editUser()">我的信息</ion-label>
+          </ion-item>
+          <ion-item>
+            <ion-icon name="image" slot="start"></ion-icon>
+            <ion-label>头像生成</ion-label>
+            <ion-button slot="end" fill="outline" size="small" color="success" (click)="goToAvatar()">前往生成</ion-button>
+          </ion-item>
+          <ion-item>
+            <ion-icon name="document" slot="start"></ion-icon>
+            <ion-label (click)="goToHealth()">健康档案</ion-label>
+          </ion-item>
+          <ion-item>
+            <ion-icon name="location" slot="start"></ion-icon>
+            <ion-label>我的地址</ion-label>
+          </ion-item>
+          <ion-item>
+            <ion-icon name="card" slot="start"></ion-icon>
+            <ion-label>我的优惠券</ion-label>
+          </ion-item>
+          <ion-item>
+            <ion-icon name="bag" slot="start"></ion-icon>
+            <ion-label>我的套餐包</ion-label>
+          </ion-item>
+          <ion-item>
+            <ion-icon name="chatbox" slot="start"></ion-icon>
+            <ion-label>联系客服</ion-label>
+          </ion-item>
+          <ion-item>
+            <ion-icon name="call" slot="start"></ion-icon>
+            <ion-label>绑定手机</ion-label>
+          </ion-item>
+          <ion-item>
+            <ion-icon name="folder" slot="start"></ion-icon>
+            <ion-label>我的收藏<app-edit-tag (onTagChange)="setTagsValue($event)"></app-edit-tag></ion-label>
+          </ion-item>
+        </ion-list>
+      
+        <ion-item>
+          <ion-label>关注公众号</ion-label>
+          <ion-label>每日医生直播义诊早知道~</ion-label>
+          <ion-button slot="end" fill="solid" size="small" color="success">立即前往</ion-button>
+        </ion-item>
+          <ion-button expand="block" fill="outline" (click)="changeNum1()" color="default">切换主题</ion-button>
+          <ion-button expand="block" fill="outline" (click)="logout()" color="medium">登出</ion-button>
+        
+        
+      </ion-content>
+    }
+}
 </ion-content>

+ 72 - 1
wisdom-app/src/app/tab4/tab4.page.scss

@@ -97,13 +97,20 @@ ion-card:hover {
     flex: 1; /* 使用户信息部分占据剩余空间 */
 }
 
-ion-content {
+.login {
     display: flex;
     justify-content: center;
     align-items: center;
     height: 68vh; /* 使内容区域高度为视口高度 */
 }
 
+.ye2{
+    display: flex;
+    justify-content: center;
+    align-items: center;
+    height: 100vh; /* 使内容区域高度为视口高度 */
+}
+
 .login-card {
     width: 94%; /* 可以根据需要调整宽度 */
     max-width: 400px; /* 设置最大宽度以避免过宽 */
@@ -123,3 +130,67 @@ ion-content {
     height: auto; /* 高度自动 */
     border-radius: 8px; /* 可选:添加圆角效果 */
 }
+
+//卡片背景
+.custom-card {
+    background-image: url('https://app.fmode.cn/dev/jxnu/202226701019/background.png'); /* 替换为你的图片链接 */
+    background-size: cover; /* 使背景图像覆盖整个卡片 */
+    background-position: center; /* 背景图像居中 */
+    height: 115px; /* 设置卡片高度,可以根据需求调整 */
+    color: white; /* 根据需要设置字体颜色 */
+    display: flex;
+    flex-direction: column; /* 使内容垂直排列 */
+    justify-content: center; /* 垂直居中 */
+    align-items: center; /* 水平居中 */
+    text-align: center; /* 文字居中 */
+    padding: 10px; /* 内边距 */
+  }
+
+  ion-avatar {
+    cursor: pointer; /* 鼠标悬停时显示为可点击 */
+    margin-bottom: 10px; /* 图片和文字之间的间距 */
+  }
+  
+  ion-label {
+    font-family: "微软雅黑";
+    font-size: 20px; /* 根据需要调整字体大小 */
+    color: #333; /* 根据需要调整字体颜色 */
+    
+  }
+
+  //选界面
+  .container {
+    display: flex;
+    flex-direction: column; /* 垂直排列 */
+    height: 100%; /* 使容器填满整个页面 */
+  }
+  
+  .top-section, .bottom-section {
+    flex: 1; /* 平均分配空间 */
+    display: flex;
+    justify-content: center; /* 水平居中 */
+    flex-direction: column; /* 使内容垂直排列 */
+    justify-content: center; /* 垂直居中 */
+    align-items: center; /* 垂直居中 */
+  }
+  
+  .top-section {
+    background-image: url('https://app.fmode.cn/dev/jxnu/202226701019/zhuti1.jpg'); /* 替换为你的图片链接 */
+    background-size: cover; /* 使背景图像覆盖整个卡片 */
+    background-position: center; /* 背景图像居中 */
+  }
+  
+  .bottom-section {
+    background-image: url('https://app.fmode.cn/dev/jxnu/202226701019/zhuti2.jpg'); /* 替换为你的图片链接 */
+    background-size: cover; /* 使背景图像覆盖整个卡片 */
+    background-position: center; /* 背景图像居中 */
+  }
+
+  .zi1{
+    font-size: smaller;
+    color: #000000;
+  }
+  .zi2{
+    font-size: smaller;
+    color: #e0f7fa;
+  }

+ 15 - 2
wisdom-app/src/app/tab4/tab4.page.ts

@@ -1,5 +1,5 @@
 import { Component } from '@angular/core';
-import { IonHeader, IonToolbar, IonTitle, IonContent, IonCard, IonCardContent, IonButton, IonCardHeader, IonCardTitle, IonCardSubtitle, ModalController, IonRefresher, IonRefresherContent } from '@ionic/angular/standalone';
+import { IonHeader, IonToolbar, IonTitle, IonContent, IonCard, IonCardContent, IonButton, IonCardHeader, IonCardTitle, IonCardSubtitle, ModalController, IonRefresher, IonRefresherContent, IonLabel, IonItem, IonIcon, IonList, IonAvatar } from '@ionic/angular/standalone';
 import { CloudUser } from 'src/lib/ncloud';
 import { openUserEditModal } from 'src/lib/user/modal-user-edit/modal-user-edit.component';
 import { openUserLoginModal } from 'src/lib/user/modal-user-login/modal-user-login.component';
@@ -11,12 +11,20 @@ import { Router } from '@angular/router';
   templateUrl: 'tab4.page.html',
   styleUrls: ['tab4.page.scss'],
   standalone: true,
-  imports: [IonHeader, IonToolbar, IonTitle, IonContent, 
+  imports: [IonHeader, IonToolbar, IonTitle, IonContent, IonLabel,IonItem,IonIcon,IonList,IonAvatar,
     IonCard,IonCardContent,IonButton,IonCardHeader,IonCardTitle,IonCardSubtitle,
     EditTagComponent,IonRefresher,IonRefresherContent
   ],
 })
 export class Tab4Page {
+  pageNum:Number=0
+  changeNum1(){
+    this.pageNum=1;
+  }
+  changeNum2(){
+    this.pageNum=2;
+  }
+
   handleRefresh(event:any) {
     setTimeout(() => {
       // Any calls to load data go here
@@ -34,6 +42,10 @@ export class Tab4Page {
     this.router.navigate(['/tabs/picture'])
   }
 
+  goToHealth(){
+    this.router.navigate(['/tabs/my-health'])
+  }
+
   currentUser:CloudUser|undefined
   constructor(
     private router: Router,
@@ -55,6 +67,7 @@ export class Tab4Page {
     }
   }
   logout(){
+    this.pageNum=0;
     this.currentUser?.logout();
   }
 

BIN
wisdom-app/src/assets/image/background.png


BIN
wisdom-app/src/assets/image/zhuti1.jpg


BIN
wisdom-app/src/assets/image/zhuti2.jpg


+ 55 - 32
wisdom-app/src/lib/ncloud.ts

@@ -16,7 +16,7 @@ export class CloudObject {
 
     set(json: Record<string, any>) {
         Object.keys(json).forEach(key => {
-            if (["objectId", "id", "createdAt", "updatedAt", "ACL"].indexOf(key) > -1) {
+            if (["objectId", "id", "createdAt", "updatedAt"].indexOf(key) > -1) {
                 return;
             }
             this.data[key] = json[key];
@@ -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"
             },
@@ -87,7 +87,7 @@ export class CloudQuery {
     constructor(className: string) {
         this.className = className;
     }
-    // 作用是将查询参数转换为对象
+
     include(...fileds:string[]) {
         this.queryParams["include"] = fileds;
     }
@@ -112,11 +112,12 @@ export class CloudQuery {
     }
 
     equalTo(key: string, value: any) {
+        if (!this.queryParams["where"]) this.queryParams["where"] = {};
         this.queryParams["where"][key] = value;
     }
 
     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: {
@@ -130,35 +131,31 @@ export class CloudQuery {
         });
 
         const json = await response?.json();
-        // return json || {};
-        const exists = json?.results?.[0] || null;
-        if (exists) {
-            let existsObject = this.dataToObj(exists)
+        if (json) {
+            let existsObject = this.dataToObj(json)
             return existsObject;
         }
         return null
-
     }
 
-    async find() {
-        let url = `http://dev.fmode.cn:1337/parse/classes/${this.className}?`;
+    async find():Promise<Array<CloudObject>> {
+        let url = `https://dev.fmode.cn/parse/classes/${this.className}?`;
 
         let queryStr = ``
         Object.keys(this.queryParams).forEach(key=>{
-            let paramStr = JSON.stringify(this.queryParams[key]); // 作用是将对象转换为JSON字符串
+            let paramStr = JSON.stringify(this.queryParams[key]);
             if(key=="include"){
                 paramStr = this.queryParams[key]?.join(",")
             }
-            if(key=="where"){
-                paramStr = JSON.stringify(this.queryParams[key]);
-
-            }
             if(queryStr) {
                 url += `${key}=${paramStr}`;
             }else{
                 url += `&${key}=${paramStr}`;
             }
         })
+        // if (Object.keys(this.queryParams["where"]).length) {
+            
+        // }
 
         const response = await fetch(url, {
             headers: {
@@ -179,7 +176,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.queryParams["where"]).length) {
             const whereStr = JSON.stringify(this.queryParams["where"]);
@@ -198,15 +195,12 @@ export class CloudQuery {
         });
 
         const json = await response?.json();
-        // const exists = json?.results?.[0] || null;
-        // if (exists) {
-        //     let existsObject = this.dataToObj(exists)
-        //     return existsObject;
-        // }
-        // return null
-        let list = json?.results || []
-        let objList = list.map((item:any)=>this.dataToObj(item))
-        return objList || [];
+        const exists = json?.results?.[0] || null;
+        if (exists) {
+            let existsObject = this.dataToObj(exists)
+            return existsObject;
+        }
+        return null
     }
 
     dataToObj(exists:any):CloudObject{
@@ -242,7 +236,7 @@ export class CloudUser extends CloudObject {
             return null;
         }
         return this;
-        // 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进行身份验证
@@ -260,7 +254,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"
@@ -292,7 +286,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
@@ -322,7 +316,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"
@@ -349,7 +343,7 @@ export class CloudUser extends CloudObject {
 
     override async save() {
         let method = "POST";
-        let url = `http://dev.fmode.cn:1337/parse/users`;
+        let url = `https://dev.fmode.cn/parse/users`;
     
         // 更新用户信息
         if (this.id) {
@@ -386,4 +380,33 @@ export class CloudUser extends CloudObject {
         localStorage.setItem("NCloud/dev/User",JSON.stringify(this.data))
         return this;
     }
+}
+
+export class CloudApi{
+    async fetch(path:string,body:any,options?:{
+        method:string
+        body:any
+    }){
+
+        let reqOpts:any =  {
+            headers: {
+                "x-parse-application-id": "dev",
+                "Content-Type": "application/json"
+            },
+            method: options?.method || "POST",
+            mode: "cors",
+            credentials: "omit"
+        }
+        if(body||options?.body){
+            reqOpts.body = JSON.stringify(body || options?.body);
+            reqOpts.json = true;
+        }
+        let host = `https://dev.fmode.cn`
+        // host = `http://127.0.0.1:1337`
+        let url = `${host}/api/`+path
+        console.log(url,reqOpts)
+        const response = await fetch(url,reqOpts);
+        let json = await response.json();
+        return json
+    }
 }

+ 97 - 3
wisdom-server/migration/data.js

@@ -1159,7 +1159,7 @@ module.exports.DrugList = [
       "function": "抗菌消炎,用于敏感菌引起的感染",
       "spec": "0.25g*10片/盒",
       "composition": "头孢克肟",
-      "taboo": "对头孢菌素过敏者禁用"
+      "taboo": "对头孢菌素过敏者禁用",
   },
   {
       "objectId": "002",
@@ -1171,7 +1171,8 @@ module.exports.DrugList = [
       "function": "解热镇痛,用于轻至中度疼痛",
       "spec": "200mg*10粒/盒",
       "composition": "布洛芬",
-      "taboo": "孕妇、哺乳期妇女慎用"
+      "taboo": "孕妇、哺乳期妇女慎用",
+      "marketing": "special" 
   },
   {
       "objectId": "003",
@@ -1183,8 +1184,101 @@ module.exports.DrugList = [
       "function": "抗过敏,用于缓解鼻炎症状",
       "spec": "10mg*10片/盒",
       "composition": "氯雷他定",
-      "taboo": "对本品成分过敏者禁用"
+      "taboo": "对本品成分过敏者禁用",
+      "marketing": "special" 
   },
+  {
+    "objectId": "004",
+    "name": "阿莫西林胶囊",
+    "price": "¥40",
+    "image": "https://img1.baidu.com/it/u=285032516,1257588176&fm=253&fmt=auto&app=120&f=JPEG?w=800&h=800",
+    "prescription": true,
+    "usage": "口服,每次1粒,每日3次",
+    "function": "抗菌消炎,用于敏感菌引起的感染",
+    "spec": "500mg*10粒/瓶",
+    "composition": "阿莫西林",
+    "taboo": "对青霉素类药物过敏者禁用",
+    "marketing": "hot"
+  },
+  {
+    "objectId": "005",
+    "name": "感冒灵颗粒",
+    "price": "¥25",
+    "image": "https://img0.baidu.com/it/u=1196302112,3635932670&fm=253&fmt=auto&app=138&f=JPEG?w=500&h=500",
+    "prescription": false,
+    "usage": "口服,每次1袋,每日3次",
+    "function": "缓解感冒症状,减轻头痛、咳嗽、流感症状",
+    "spec": "10g*12袋/盒",
+    "composition": "氯苯那敏、对乙酰氨基酚",
+    "taboo": "孕妇、哺乳期妇女慎用",
+    "marketing": "hot",
+
+  },
+  {
+    "objectId": "006",
+    "name": "硝呋太尔片",
+    "price": "¥60",
+    "image": "http://t14.baidu.com/it/u=804604368,3931341753&fm=224&app=112&f=JPEG?w=500&h=500",
+    "prescription": true,
+    "usage": "口服,每次1片,每日2次",
+    "function": "抗菌消炎,用于泌尿系统感染",
+    "spec": "0.2g*20片/盒",
+    "composition": "硝呋太尔",
+    "taboo": "孕妇、哺乳期妇女慎用"
+  },
+  {
+    "objectId": "007",
+    "name": "复方氯雷他定片",
+    "price": "¥35",
+    "image": "https://drug-platform.cdn.bcebos.com/drug-platform/online/drug/d1708155468458393265.jpg?x-bce-process=image/auto-orient,o_1/resize,w_1242,limit_1/quality,Q_85/format,f_auto",
+    "prescription": false,
+    "usage": "口服,每次1片,每日1次",
+    "function": "缓解过敏症状,如鼻炎、皮肤过敏",
+    "spec": "5mg+5mg*10片/盒",
+    "composition": "氯雷他定、伪麻黄碱",
+    "taboo": "对本品成分过敏者禁用"
+  },
+  {
+    "objectId": "008",
+    "name": "泮托拉唑钠肠溶片",
+    "price": "¥45",
+    "image": "http://t14.baidu.com/it/u=872318615,816279038&fm=224&app=112&f=JPEG?w=500&h=500",
+    "prescription": true,
+    "usage": "口服,每次1片,每日1次",
+    "function": "抗酸药,用于治疗胃酸过多、胃溃疡等",
+    "spec": "20mg*14片/盒",
+    "composition": "泮托拉唑钠",
+    "taboo": "孕妇、哺乳期妇女慎用"
+  },
+  {
+    "objectId": "009",
+    "name": "马来酸氯苯那敏片",
+    "price": "¥15",
+    "image": "https://img20.360buyimg.com/imgzone/jfs/t1/188854/34/12309/122345/60e6c435Ea107d0be/b065122f38867a10.jpg",
+    "prescription": false,
+    "usage": "口服,每次1片,每日2次",
+    "function": "用于缓解过敏引起的鼻塞、流鼻涕、喷嚏等症状",
+    "spec": "4mg*10片/盒",
+    "composition": "马来酸氯苯那敏",
+    "taboo": "对本品成分过敏者禁用",
+    "marketing": "hot"
+  },
+  {
+    "objectId": "010",
+    "name": "复方甘草片",
+    "price": "¥18",
+    "image": "https://img0.baidu.com/it/u=691273625,453632032&fm=253&fmt=auto&app=138&f=JPEG?w=500&h=500",
+    "prescription": false,
+    "usage": "口服,每次2片,每日3次",
+    "function": "用于缓解咳嗽、喉咙痛等症状",
+    "spec": "10g*20片/盒",
+    "composition": "甘草、薄荷、桔梗",
+    "taboo": "孕妇、哺乳期妇女慎用",
+    "marketing": "hot"
+  },
+
+  // parse-dashboard --appId dev --masterKey devmk --serverURL http://dev.fmode.cn:1337/parse --appName DevServer
+  // http://127.0.0.1:4040/
 ];
 
 // module.exports.AgentList = [

+ 1 - 1
wisdom-server/migration/import-data.js

@@ -12,7 +12,7 @@ DataMap = {
 };
 
 async function inportDapartAndDoctor() {
-    导入药品数据
+    // 导入药品数据
     let drugList = DrugList;
     for (let index = 0; index < drugList.length; index++) {
         let drug = drugList[index];