Explorar o código

input testdata

7 hai 1 semana
pai
achega
e8ea7e3852

+ 5 - 1
myapp/src/app/tab1/tab1.module.ts

@@ -6,6 +6,7 @@ import { Tab1Page } from './tab1.page';
 import { ExploreContainerComponentModule } from '../explore-container/explore-container.module';
 
 import { Tab1PageRoutingModule } from './tab1-routing.module';
+import { ToolsModalPage } from './tools-modal.page';
 
 @NgModule({
   imports: [
@@ -15,6 +16,9 @@ import { Tab1PageRoutingModule } from './tab1-routing.module';
     ExploreContainerComponentModule,
     Tab1PageRoutingModule
   ],
-  declarations: [Tab1Page]
+  declarations: [
+    Tab1Page,
+    
+  ],
 })
 export class Tab1PageModule {}

+ 2 - 7
myapp/src/app/tab1/tab1.page.html

@@ -10,13 +10,7 @@
     </ion-buttons>
   </ion-toolbar>
   
-  <!-- 紧急状态条 -->
-  <div *ngIf="emergencyAlert" class="emergency-bar" (click)="openEmergencyModal()">
-    <ion-icon name="warning"></ion-icon>
-    <ion-label>{{ emergencyAlert.message }}</ion-label>
-    <ion-icon name="chevron-forward"></ion-icon>
-  </div>
-</ion-header>
+ 
 
 <ion-content [fullscreen]="true">
   <!-- 子女消息区域 -->
@@ -62,6 +56,7 @@
     <ion-list lines="none">
       <ion-list-header>
         <ion-label>社区互助动态</ion-label>
+        <ion-chip (click)="importMessage()">导入测试数据</ion-chip>
       </ion-list-header>
       
       <ion-item *ngFor="let item of communityFeed" 

+ 3 - 24
myapp/src/app/tab1/tab1.page.scss

@@ -133,16 +133,7 @@ ion-content {
           ion-icon { color: #ffffff; }
           ion-label { color: #ffffff; }
         }
-        // 新增积分商城之后的颜色
-        &[data-service-id="shop"] {
-          background: linear-gradient(135deg, #ffb74d, #ffcc80); /* 橙色渐变 */
-          ion-icon { color: #ffffff; }
-          ion-label { 
-            color: #ffffff;
-            white-space: normal; /* 保持原有换行效果 */
-            line-height: 1.3;
-          }
-        }
+      
         // 新增工具借用、老人陪聊、AI管家颜色
 &[data-service-id="tools"] {
   background: linear-gradient(135deg, #458cee, #2951d2); /* 蓝色渐变 */
@@ -153,15 +144,7 @@ ion-content {
     line-height: 1.3;
   }
 }
-&[data-service-id="chat"] {
-  background: linear-gradient(135deg, #ff69b4, #ff80ab); /* 粉色渐变 */
-  ion-icon { color: #ffffff; }
-  ion-label { 
-    color: #ffffff;
-    white-space: normal; 
-    line-height: 1.3;
-  }
-}
+
 &[data-service-id="ai"] {
   background: linear-gradient(135deg, #4dd0e1, #80deea); /* 青色渐变 */
   ion-icon { color: #ffffff; }
@@ -176,11 +159,7 @@ ion-content {
           ion-icon { color: #ffffff; }
           ion-label { color: #ffffff; }
         }
-        &[data-service-id="skills"] {
-          background: linear-gradient(135deg, #ba68c8, #ce93d8); /* 紫色渐变 */
-          ion-icon { color: #ffffff; }
-          ion-label { color: #ffffff; }
-        }
+        
         &[data-service-id="my"] {
           background: linear-gradient(135deg, #90a4ae, #b0bec5); /* 灰色渐变 */
           ion-icon { color: #ffffff; }

+ 76 - 63
myapp/src/app/tab1/tab1.page.ts

@@ -2,42 +2,9 @@ import { Component, OnInit, Renderer2, ElementRef, Input } from '@angular/core';
 import { ModalController, AnimationController, NavController } from '@ionic/angular';
 import { IonicModule } from '@ionic/angular';
 import { Router } from '@angular/router'; // 新增Router导入
-
-// 独立的紧急模态组件
-@Component({
-  selector: 'app-emergency-modal',
-  template: `
-    <ion-header>
-      <ion-toolbar color="danger">
-        <ion-title>紧急通知</ion-title>
-        <ion-buttons slot="end">
-          <ion-button (click)="dismiss()">关闭</ion-button>
-        </ion-buttons>
-      </ion-toolbar>
-    </ion-header>
-    <ion-content class="ion-padding">
-      <p>{{ alert?.message }}</p>
-      <ion-button expand="block" (click)="dismiss()">我知道了</ion-button>
-    </ion-content>
-  `,
-  styles: [`
-    ion-content {
-      --background: #fff1f0;
-    }
-  `],
-  imports: [IonicModule],
-  standalone: true
-})
-export class EmergencyModal {
-  @Input() alert: any;
-
-  constructor(private modalCtrl: ModalController) {}
-
-  dismiss() {
-    this.modalCtrl.dismiss();
-  }
-}
-
+import { ToolsModalPage } from './tools-modal.page';
+import { CloudObject, CloudQuery } from 'src/lib/ncloud';
+  
 // 独立的语音输入模态组件
 @Component({
   selector: 'app-voice-input-modal',
@@ -107,11 +74,9 @@ export class Tab1Page implements OnInit {
     { id: 'emergency', name: '紧急求助', icon: 'warning', badge: 1, priority: 5 },
     { id: 'medicine', name: '代买药品', icon: 'medical', badge: 0, priority: 3 },
     { id: 'tools', name: '工具借用', icon: 'construct', badge: 2, priority: 2 },
-    { id: 'chat', name: '老人陪聊', icon: 'chatbubbles', badge: 0, priority: 4 },
+    // 删除 chat(老人陪聊) 和 shop(积分商城) 和 skills(技能交换)
     { id: 'ai', name: 'AI管家', icon: 'headset', badge: 0, priority: 1 },
-    { id: 'shop', name: '积分商城', icon: 'gift', badge: 0, priority: 1 },
     { id: 'events', name: '社区活动', icon: 'calendar', badge: 0, priority: 3 },
-    { id: 'skills', name: '技能交换', icon: 'people', badge: 0, priority: 2 },
     { id: 'my', name: '我的服务', icon: 'list', badge: 0, priority: 1 }
   ];
 
@@ -149,6 +114,7 @@ export class Tab1Page implements OnInit {
 
   // 是否夜间模式
   isNightMode: boolean = false;
+  Message: { name: string; ages:number;matter: string; points: number}[] = [];
 
   constructor(
     private modalCtrl: ModalController,
@@ -157,7 +123,19 @@ export class Tab1Page implements OnInit {
     private animationCtrl: AnimationController,
     private navCtrl: NavController,
     private router: Router // 新增Router依赖注入
-  ) {}
+  ) {
+    this.loadMessage()
+  }
+  
+storeList: CloudObject[]=[]
+async loadMessage(){
+    let query = new CloudQuery("Message");
+    this.storeList = await query.find();
+  }
+
+  dismiss() {
+    this.modalCtrl.dismiss();
+  }
 
   ngOnInit() {
     this.setGreeting();
@@ -229,18 +207,7 @@ export class Tab1Page implements OnInit {
     }
   }
 
-  // 打开紧急模态框
-  async openEmergencyModal() {
-    const modal = await this.modalCtrl.create({
-      component: EmergencyModal,
-      componentProps: {
-        alert: this.emergencyAlert
-      },
-      cssClass: 'emergency-modal'
-    });
-    return await modal.present();
-  }
-
+  
   // 打开语音输入模态框
   async openVoiceInput() {
     const modal = await this.modalCtrl.create({
@@ -277,22 +244,68 @@ export class Tab1Page implements OnInit {
   }
 
   // 处理服务项点击
+  // 添加工具数据
+  tools = [
+    
+  ];
+
+  // 添加处理工具借用点击的函数
+  async openToolsModal() {
+// 由于找不到 ToolsModalPage,暂时注释掉 component 属性,后续需要导入对应的组件类
+    const modal = await this.modalCtrl.create({
+      component: ToolsModalPage,
+      componentProps: {
+        tools: this.tools
+      }
+    });
+    return await modal.present();
+  }
+
+  // 修改handleServiceClick函数
   handleServiceClick(serviceId: string) {
-    switch (serviceId) {
-      case 'ai':
-        this.navigateToAiAgent(); // AI管家导航
-        break;
-      case 'emergency':
-        this.openEmergencyModal(); // 紧急求助模态框
-        break;
-      // 其他服务可补充对应逻辑
+    if (serviceId === 'tools') {
+      this.openToolsModal();
+    } else {
+      switch (serviceId) {
+        case 'ai':
+          this.navigateToAiAgent(); // AI管家导航
+          break;
+        // 其他服务可补充对应逻辑
+      }
     }
   }
-
-  // 跳转到AI管家页面方法
+  
   navigateToAiAgent() {
-    this.router.navigate(['/ai-agent']); // 使用Router进行导航
+    this.router.navigate(['/ai-agent']); // 修改为实际导航到AI管家页面
   }
+  
+  async importMessage() {
+    const MessageData = [
+        {name: '张阿姨', ages: 50, matter: '修水龙头', points: 52},
+        {name: '李师傅', ages: 45, matter: '家电维修', points: 30},
+        {name: '王大爷', ages: 60, matter: '门窗修理', points: 25},
+        {name: '赵阿姨', ages: 55, matter: '家政清洁', points: 15},
+        {name: '刘师傅', ages: 48, matter: '管道疏通', points: 35},
+        {name: '陈阿姨', ages: 52, matter: '老人陪护', points: 40},
+        {name: '周师傅', ages: 43, matter: '电路检修', points: 30},
+        {name: '吴阿姨', ages: 47, matter: '代购跑腿', points: 10},
+    ];
+    try {
+        for (const Messages of MessageData) {
+            const message = new CloudObject('Message');
+            message.set(Messages);
+            await message.save();
+// 原代码中 MessageData 是数组,不能直接访问 name 属性,应使用当前遍历的 toolData
+// 原代码中 MessageData 是数组,应使用当前遍历的 message 对象来获取工具名称
+// 由于 Message 是普通对象,直接访问 name 属性
+console.log(`成功保存工具: ${Messages.name}`);
+        }
+        console.log('所有工具数据已成功保存到数据库');
+        this.Message = [...this.Message, ...MessageData]; // 更新本地工具列表
+    } catch (error) {
+        console.error('保存数据时出错:', error);
+    }
+}
 } // 此处为 Tab1Page 类的正确闭合
 
 // 原错误代码块已删除(错误的 @Component 装饰器及内部方法)

+ 75 - 0
myapp/src/app/tab1/tools-modal.page.ts

@@ -0,0 +1,75 @@
+import { Component, Input } from '@angular/core';
+import { ModalController } from '@ionic/angular';
+import { CommonModule } from '@angular/common';
+import { IonicModule } from '@ionic/angular';
+import { CloudObject, CloudQuery } from 'src/lib/ncloud';
+
+@Component({
+  selector: 'app-tools-modal',
+  standalone: true,
+  imports: [CommonModule, IonicModule],
+  template: `
+    <ion-header>
+      <ion-toolbar>
+        <ion-title>可借用工具</ion-title> <ion-chip (click)="importTools()">导入测试数据</ion-chip>
+        <ion-buttons slot="end">
+          <ion-button (click)="dismiss()">关闭</ion-button>
+        </ion-buttons>
+      </ion-toolbar>
+    </ion-header>
+    <ion-content>
+      <ion-list>
+        <ion-item *ngFor="let tool of tools">
+          <ion-label>
+            <h2>{{ tool.name }}</h2>
+            <p>所需积分: {{ tool.points }}</p>
+            <p>最晚归还时间: {{ tool.returnTime }}</p>
+          </ion-label>
+          <ion-button slot="end" fill="outline" color="primary">借用</ion-button>
+        </ion-item>
+      </ion-list>
+    </ion-content>
+  `
+})
+export class ToolsModalPage {
+  @Input() tools: any[] = [];
+
+  constructor(private modalCtrl: ModalController) {
+    this.loadTools()
+  }
+storeList: CloudObject[]=[]
+async loadTools(){
+    let query = new CloudQuery("Tools");
+    this.storeList = await query.find();
+  }
+
+  dismiss() {
+    this.modalCtrl.dismiss();
+  }
+  async importTools() {
+    const toolsData = [
+        {name: '轮椅', points: 50, returnTime: '2023-12-31'},
+        {name: '拐杖', points: 20, returnTime: '2023-11-15'},
+        {name: '血压计', points: 30, returnTime: '2023-10-20'},
+        {name: '血糖仪', points: 40, returnTime: '2024-01-10'},
+        {name: '助行器', points: 25, returnTime: '2023-12-01'},
+        {name: '制氧机', points: 80, returnTime: '2024-02-28'},
+        {name: '护理床', points: 100, returnTime: '2023-11-30'},
+        {name: '电动轮椅', points: 120, returnTime: '2024-03-15'},
+        {name: '便携式马桶', points: 35, returnTime: '2023-12-25'},
+        {name: '防褥疮垫', points: 45, returnTime: '2024-01-05'},
+    ];
+    try {
+        for (const toolData of toolsData) {
+            const tool = new CloudObject('Tools');
+            tool.set(toolData);
+            await tool.save();
+            console.log(`成功保存工具: ${toolData.name}`);
+        }
+        console.log('所有工具数据已成功保存到数据库');
+        this.tools = [...this.tools, ...toolsData]; // 更新本地工具列表
+    } catch (error) {
+        console.error('保存数据时出错:', error);
+    }
+}
+}

+ 431 - 0
myapp/src/lib/ncloud.ts

@@ -0,0 +1,431 @@
+// CloudObject.ts
+
+let serverURL = `http://dev.fmode.cn:1337/parse`;
+if (location.protocol == "http:") {
+    serverURL = `http://dev.fmode.cn:1337/parse`;
+}
+
+export class CloudObject {
+    className: string;
+    id: string | undefined = undefined;
+    createdAt: any;
+    updatedAt: any;
+    data: Record<string, any> = {};
+
+    constructor(className: string) {
+        this.className = className;
+    }
+
+    toPointer() {
+        return { "__type": "Pointer", "className": this.className, "objectId": this.id };
+    }
+
+    set(json: Record<string, any>) {
+        Object.keys(json).forEach(key => {
+            if (["objectId", "id", "createdAt", "updatedAt"].indexOf(key) > -1) {
+                return;
+            }
+            this.data[key] = json[key];
+        });
+    }
+
+    get(key: string) {
+        return this.data[key] || null;
+    }
+
+    async save() {
+        let method = "POST";
+        let url = serverURL + `/classes/${this.className}`;
+
+        // 更新
+        if (this.id) {
+            url += `/${this.id}`;
+            method = "PUT";
+        }
+
+        const body = JSON.stringify(this.data);
+        const response = await fetch(url, {
+            headers: {
+                "content-type": "application/json;charset=UTF-8",
+                "x-parse-application-id": "dev"
+            },
+            body: body,
+            method: method,
+            mode: "cors",
+            credentials: "omit"
+        });
+
+        const result = await response?.json();
+        if (result?.error) {
+            console.error(result?.error);
+        }
+        if (result?.objectId) {
+            this.id = result?.objectId;
+        }
+        return this;
+    }
+
+    async destroy() {
+        if (!this.id) return;
+        const response = await fetch(serverURL + `/classes/${this.className}/${this.id}`, {
+            headers: {
+                "x-parse-application-id": "dev"
+            },
+            body: null,
+            method: "DELETE",
+            mode: "cors",
+            credentials: "omit"
+        });
+
+        const result = await response?.json();
+        if (result) {
+            this.id = undefined;
+        }
+        return true;
+    }
+}
+
+// CloudQuery.ts
+export class CloudQuery {
+    className: string;
+    queryParams: Record<string, any> = { where: {} };
+
+    constructor(className: string) {
+        this.className = className;
+    }
+
+    include(...fileds: string[]) {
+        this.queryParams["include"] = fileds;
+    }
+    greaterThan(key: string, value: any) {
+        if (!this.queryParams["where"][key]) this.queryParams["where"][key] = {};
+        this.queryParams["where"][key]["$gt"] = value;
+    }
+
+    greaterThanAndEqualTo(key: string, value: any) {
+        if (!this.queryParams["where"][key]) this.queryParams["where"][key] = {};
+        this.queryParams["where"][key]["$gte"] = value;
+    }
+
+    lessThan(key: string, value: any) {
+        if (!this.queryParams["where"][key]) this.queryParams["where"][key] = {};
+        this.queryParams["where"][key]["$lt"] = value;
+    }
+
+    lessThanAndEqualTo(key: string, value: any) {
+        if (!this.queryParams["where"][key]) this.queryParams["where"][key] = {};
+        this.queryParams["where"][key]["$lte"] = value;
+    }
+
+    equalTo(key: string, value: any) {
+        if (!this.queryParams["where"]) this.queryParams["where"] = {};
+        this.queryParams["where"][key] = value;
+    }
+
+    async get(id: string) {
+        const url = serverURL + `/classes/${this.className}/${id}?`;
+
+        const response = await fetch(url, {
+            headers: {
+                "if-none-match": "W/\"1f0-ghxH2EwTk6Blz0g89ivf2adBDKY\"",
+                "x-parse-application-id": "dev"
+            },
+            body: null,
+            method: "GET",
+            mode: "cors",
+            credentials: "omit"
+        });
+
+        const json = await response?.json();
+        if (json) {
+            let existsObject = this.dataToObj(json)
+            return existsObject;
+        }
+        return null
+    }
+
+    async find(): Promise<Array<CloudObject>> {
+        let url = serverURL + `/classes/${this.className}?`;
+
+        let queryStr = ``
+        Object.keys(this.queryParams).forEach(key => {
+            let paramStr = JSON.stringify(this.queryParams[key]);
+            if (key == "include") {
+                paramStr = this.queryParams[key]?.join(",")
+            }
+            if (queryStr) {
+                url += `${key}=${paramStr}`;
+            } else {
+                url += `&${key}=${paramStr}`;
+            }
+        })
+        // if (Object.keys(this.queryParams["where"]).length) {
+
+        // }
+
+        const response = await fetch(url, {
+            headers: {
+                "if-none-match": "W/\"1f0-ghxH2EwTk6Blz0g89ivf2adBDKY\"",
+                "x-parse-application-id": "dev"
+            },
+            body: null,
+            method: "GET",
+            mode: "cors",
+            credentials: "omit"
+        });
+
+        const json = await response?.json();
+        let list = json?.results || []
+        let objList = list.map((item: any) => this.dataToObj(item))
+        return objList || [];
+    }
+
+
+    async first() {
+        let url = serverURL + `/classes/${this.className}?`;
+
+        if (Object.keys(this.queryParams["where"]).length) {
+            const whereStr = JSON.stringify(this.queryParams["where"]);
+            url += `where=${whereStr}&limit=1`;
+        }
+
+        const response = await fetch(url, {
+            headers: {
+                "if-none-match": "W/\"1f0-ghxH2EwTk6Blz0g89ivf2adBDKY\"",
+                "x-parse-application-id": "dev"
+            },
+            body: null,
+            method: "GET",
+            mode: "cors",
+            credentials: "omit"
+        });
+
+        const json = await response?.json();
+        const exists = json?.results?.[0] || null;
+        if (exists) {
+            let existsObject = this.dataToObj(exists)
+            return existsObject;
+        }
+        return null
+    }
+
+    dataToObj(exists: any): CloudObject {
+        let existsObject = new CloudObject(this.className);
+        Object.keys(exists).forEach(key => {
+            if (exists[key]?.__type == "Object") {
+                exists[key] = this.dataToObj(exists[key])
+            }
+        })
+        existsObject.set(exists);
+        existsObject.id = exists.objectId;
+        existsObject.createdAt = exists.createdAt;
+        existsObject.updatedAt = exists.updatedAt;
+        return existsObject;
+    }
+}
+
+// CloudUser.ts
+export class CloudUser extends CloudObject {
+    constructor() {
+        super("_User"); // 假设用户类在Parse中是"_User"
+        // 读取用户缓存信息
+        let userCacheStr = localStorage.getItem("NCloud/dev/User")
+        if (userCacheStr) {
+            let userData = JSON.parse(userCacheStr)
+            // 设置用户信息
+            this.id = userData?.objectId;
+            this.sessionToken = userData?.sessionToken;
+            this.data = userData; // 保存用户数据
+        }
+    }
+
+    sessionToken: string | null = ""
+    /** 获取当前用户信息 */
+    async current() {
+        if (!this.sessionToken) {
+            console.error("用户未登录");
+            return null;
+        }
+        return this;
+        // const response = await fetch(serverURL + `/users/me`, {
+        //     headers: {
+        //         "x-parse-application-id": "dev",
+        //         "x-parse-session-token": this.sessionToken // 使用sessionToken进行身份验证
+        //     },
+        //     method: "GET"
+        // });
+
+        // const result = await response?.json();
+        // if (result?.error) {
+        //     console.error(result?.error);
+        //     return null;
+        // }
+        // return result;
+    }
+
+    /** 登录 */
+    async login(username: string, password: string): Promise<CloudUser | null> {
+        const response = await fetch(serverURL + `/login`, {
+            headers: {
+                "x-parse-application-id": "dev",
+                "Content-Type": "application/json"
+            },
+            body: JSON.stringify({ username, password }),
+            method: "POST"
+        });
+
+        const result = await response?.json();
+        if (result?.error) {
+            console.error(result?.error);
+            return null;
+        }
+
+        // 设置用户信息
+        this.id = result?.objectId;
+        this.sessionToken = result?.sessionToken;
+        this.data = result; // 保存用户数据
+        // 缓存用户信息
+        console.log(result)
+        localStorage.setItem("NCloud/dev/User", JSON.stringify(result))
+        return this;
+    }
+
+    /** 登出 */
+    async logout() {
+        if (!this.sessionToken) {
+            console.error("用户未登录");
+            return;
+        }
+
+        const response = await fetch(serverURL + `/logout`, {
+            headers: {
+                "x-parse-application-id": "dev",
+                "x-parse-session-token": this.sessionToken
+            },
+            method: "POST"
+        });
+
+        let result = await response?.json();
+
+        if (result?.error) {
+            console.error(result?.error);
+            if (result?.error == "Invalid session token") {
+                this.clearUserCache()
+                return true;
+            }
+            return false;
+        }
+
+        this.clearUserCache()
+        return true;
+    }
+    clearUserCache() {
+        // 清除用户信息
+        localStorage.removeItem("NCloud/dev/User")
+        this.id = undefined;
+        this.sessionToken = null;
+        this.data = {};
+    }
+
+    /** 注册 */
+    async signUp(username: string, password: string, additionalData: Record<string, any> = {}) {
+        const userData = {
+            username,
+            password,
+            ...additionalData // 合并额外的用户数据
+        };
+
+        const response = await fetch(serverURL + `/users`, {
+            headers: {
+                "x-parse-application-id": "dev",
+                "Content-Type": "application/json"
+            },
+            body: JSON.stringify(userData),
+            method: "POST"
+        });
+
+        const result = await response?.json();
+        if (result?.error) {
+            console.error(result?.error);
+            return null;
+        }
+
+        // 设置用户信息
+        // 缓存用户信息
+        console.log(result)
+        localStorage.setItem("NCloud/dev/User", JSON.stringify(result))
+        this.id = result?.objectId;
+        this.sessionToken = result?.sessionToken;
+        this.data = result; // 保存用户数据
+        return this;
+    }
+
+    override async save() {
+        let method = "POST";
+        let url = serverURL + `/users`;
+
+        // 更新用户信息
+        if (this.id) {
+            url += `/${this.id}`;
+            method = "PUT";
+        }
+
+        let data: any = JSON.parse(JSON.stringify(this.data))
+        delete data.createdAt
+        delete data.updatedAt
+        delete data.ACL
+        delete data.objectId
+        const body = JSON.stringify(data);
+        let headersOptions: any = {
+            "content-type": "application/json;charset=UTF-8",
+            "x-parse-application-id": "dev",
+            "x-parse-session-token": this.sessionToken, // 添加sessionToken以进行身份验证
+        }
+        const response = await fetch(url, {
+            headers: headersOptions,
+            body: body,
+            method: method,
+            mode: "cors",
+            credentials: "omit"
+        });
+
+        const result = await response?.json();
+        if (result?.error) {
+            console.error(result?.error);
+        }
+        if (result?.objectId) {
+            this.id = result?.objectId;
+        }
+        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 = `http://dev.fmode.cn:1337`
+        // 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
+    }
+}