刘嘉轩 7 сар өмнө
parent
commit
c7b5d25817
27 өөрчлөгдсөн 608 нэмэгдсэн , 6 устгасан
  1. 11 0
      smarteat-app/src/app/app.module.ts
  2. 4 0
      smarteat-app/src/app/asf/asf.component.html
  3. 0 0
      smarteat-app/src/app/asf/asf.component.scss
  4. 22 0
      smarteat-app/src/app/asf/asf.component.spec.ts
  5. 15 0
      smarteat-app/src/app/asf/asf.component.ts
  6. 3 0
      smarteat-app/src/app/asx/asx.component.html
  7. 0 0
      smarteat-app/src/app/asx/asx.component.scss
  8. 22 0
      smarteat-app/src/app/asx/asx.component.spec.ts
  9. 15 0
      smarteat-app/src/app/asx/asx.component.ts
  10. 32 0
      smarteat-app/src/app/asy/asy.component.html
  11. 0 0
      smarteat-app/src/app/asy/asy.component.scss
  12. 26 0
      smarteat-app/src/app/asy/asy.component.spec.ts
  13. 54 0
      smarteat-app/src/app/asy/asy.component.ts
  14. 2 1
      smarteat-app/src/app/image-popup/image1-popup/image1-popup.component.ts
  15. 30 0
      smarteat-app/src/app/meal-search/meal-search/meal-search.component.html
  16. 5 0
      smarteat-app/src/app/meal-search/meal-search/meal-search.component.scss
  17. 24 0
      smarteat-app/src/app/meal-search/meal-search/meal-search.component.spec.ts
  18. 48 0
      smarteat-app/src/app/meal-search/meal-search/meal-search.component.ts
  19. 16 0
      smarteat-app/src/app/meal/meal.service.spec.ts
  20. 20 0
      smarteat-app/src/app/meal/meal.service.ts
  21. 8 0
      smarteat-app/src/app/newline-to-br.pipe.spec.ts
  22. 13 0
      smarteat-app/src/app/newline-to-br.pipe.ts
  23. 27 5
      smarteat-app/src/app/tab1/tab1.page.html
  24. 15 0
      smarteat-app/src/app/tabs/tabs.routes.ts
  25. 0 0
      smarteat-app/src/app/translate.service.ts
  26. 133 0
      smarteat-app/src/lib/cloudshipu.ts
  27. 63 0
      smarteat-app/src/lib/import-data.js

+ 11 - 0
smarteat-app/src/app/app.module.ts

@@ -0,0 +1,11 @@
+import { NgModule } from '@angular/core';
+import { BrowserModule } from '@angular/platform-browser';
+import { AppComponent } from './app.component';
+import { NewlineToBrPipe } from './newline-to-br.pipe';  // 导入管道
+
+@NgModule({
+  declarations: [AppComponent, NewlineToBrPipe],  // 声明管道
+  imports: [BrowserModule],
+  bootstrap: [AppComponent],
+})
+export class AppModule {}

+ 4 - 0
smarteat-app/src/app/asf/asf.component.html

@@ -0,0 +1,4 @@
+<p>
+  asf works!
+  <img src="https://app.fmode.cn/dev/jxnu/202226701038/boluogulaorou.jpeg" alt="">
+</p>

+ 0 - 0
smarteat-app/src/app/asf/asf.component.scss


+ 22 - 0
smarteat-app/src/app/asf/asf.component.spec.ts

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

+ 15 - 0
smarteat-app/src/app/asf/asf.component.ts

@@ -0,0 +1,15 @@
+import { Component, OnInit } from '@angular/core';
+
+@Component({
+  selector: 'app-asf',
+  templateUrl: './asf.component.html',
+  styleUrls: ['./asf.component.scss'],
+  standalone: true,
+})
+export class AsfComponent  implements OnInit {
+
+  constructor() { }
+
+  ngOnInit() {}
+
+}

+ 3 - 0
smarteat-app/src/app/asx/asx.component.html

@@ -0,0 +1,3 @@
+<p>
+  asx works!
+</p>

+ 0 - 0
smarteat-app/src/app/asx/asx.component.scss


+ 22 - 0
smarteat-app/src/app/asx/asx.component.spec.ts

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

+ 15 - 0
smarteat-app/src/app/asx/asx.component.ts

@@ -0,0 +1,15 @@
+import { Component, OnInit } from '@angular/core';
+
+@Component({
+  selector: 'app-asx',
+  templateUrl: './asx.component.html',
+  styleUrls: ['./asx.component.scss'],
+  standalone: true,
+})
+export class AsxComponent  implements OnInit {
+
+  constructor() { }
+
+  ngOnInit() {}
+
+}

+ 32 - 0
smarteat-app/src/app/asy/asy.component.html

@@ -0,0 +1,32 @@
+<ion-header>
+  <ion-toolbar>
+    <ion-title>{{ dishDetails.title }}</ion-title>
+  </ion-toolbar>
+</ion-header>
+
+<ion-content>
+  <ion-card>
+    <ion-card-header>
+      <ion-card-title>{{ dishDetails.title }}</ion-card-title>
+    </ion-card-header>
+    <ion-card-content>
+      <!-- 食谱图片 -->
+      <ion-img [src]="dishDetails.image_url">
+        <!-- 使用备用的 <img> 元素来处理 alt 属性 -->
+        <img [src]="dishDetails.image_url" [alt]="dishDetails.title">
+      </ion-img>
+      
+      <!-- 食材 -->
+      <h3>食材:</h3>
+      <p [innerHTML]="dishDetails.ingredient"></p> <!-- 使用 [innerHTML] 渲染带 <br> 的 HTML -->
+
+      <!-- 制作方法 -->
+      <h3>制作方法:</h3>
+      <p [innerHTML]="dishDetails.instructions"></p> <!-- 使用 [innerHTML] 渲染带 <br> 的 HTML -->
+
+      <!-- 小贴士 -->
+      <h3>小贴士:</h3>
+      <p [innerHTML]="dishDetails.tips"></p> <!-- 使用 [innerHTML] 渲染带 <br> 的 HTML -->
+    </ion-card-content>
+  </ion-card>
+</ion-content>

+ 0 - 0
smarteat-app/src/app/asy/asy.component.scss


+ 26 - 0
smarteat-app/src/app/asy/asy.component.spec.ts

@@ -0,0 +1,26 @@
+import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing';
+
+import { AsyComponent } from './asy.component';
+import { NewlineToBrPipe } from '.././newline-to-br.pipe';  // 导入管道
+
+
+describe('AsyComponent', () => {
+  let component: AsyComponent;
+  let fixture: ComponentFixture<AsyComponent>;
+
+  beforeEach(waitForAsync(() => {
+    TestBed.configureTestingModule({
+      imports: [AsyComponent],
+    }).compileComponents();
+
+    fixture = TestBed.createComponent(AsyComponent);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+  }));
+
+  it('should create', () => {
+    expect(component).toBeTruthy();
+  });
+});
+
+

+ 54 - 0
smarteat-app/src/app/asy/asy.component.ts

@@ -0,0 +1,54 @@
+import { Component, OnInit } from '@angular/core';
+import { CloudShipu } from '../../lib/cloudshipu';  // 引入 CloudShipu 类
+import { IonButton } from '@ionic/angular/standalone';
+import { CloudQuery } from 'src/lib/ncloud';
+import { NewlineToBrPipe } from '.././newline-to-br.pipe';  // 导入管道
+import { IonicModule } from '@ionic/angular';  // 确保导入 IonicModule
+import { sanitizeIdentifier } from '@angular/compiler';
+
+@Component({
+  selector: 'app-asy',
+  templateUrl: './asy.component.html',
+  styleUrls: ['./asy.component.scss'],
+  standalone: true,
+  imports: [
+    IonButton,
+    IonicModule
+  ],
+})
+export class AsyComponent  implements OnInit {
+
+  private CloudShipu: CloudShipu =new CloudShipu(); // 引入 CloudShipu 实例
+  private shipuData: any = null; // 信息
+
+    // 定义存储食谱详细信息的变量
+    dishDetails: any = {
+      title: '',
+      image_url: '',
+      ingredient: '',
+      instructions: '',
+      tips: '',
+    };
+
+  async ngOnInit(): Promise<void> {
+    await this.loadUserData(); // 页面初始化时加载用户数据
+    console.log(this.shipuData)
+    const randomIndex = Math.floor(Math.random() * this.shipuData.length);
+
+    // 访问这个随机索引的元素
+    this.dishDetails = this.shipuData[randomIndex].data;
+    // this.dishDetails = this.shipuData[1].data
+  }
+  
+  async loadUserData() {
+    try {
+        this.shipuData = await this.CloudShipu.getAllShipu();
+        
+    } catch (error) {
+        console.error('加载用户数据失败', error);
+    }
+  }
+
+  
+}
+

+ 2 - 1
smarteat-app/src/app/image-popup/image1-popup/image1-popup.component.ts

@@ -1,7 +1,8 @@
 import { HttpClient } from '@angular/common/http';
 import { Component, Input } from '@angular/core';
 import { IonButton, IonButtons, IonContent, IonHeader, IonIcon, IonTitle, IonToolbar, ModalController } from '@ionic/angular/standalone';
-import mammoth from 'mammoth';  // 引入 mammoth 库
+import * as mammoth from 'mammoth';
+
 @Component({
   selector: 'app-image1-popup',
   templateUrl: './image1-popup.component.html',

+ 30 - 0
smarteat-app/src/app/meal-search/meal-search/meal-search.component.html

@@ -0,0 +1,30 @@
+<!-- meal-search.component.html -->
+<ion-header>
+  <ion-toolbar>
+    <ion-title>搜索结果</ion-title>
+    <ion-buttons slot="end">
+      <ion-button (click)="closeModal()">关闭</ion-button>
+    </ion-buttons>
+  </ion-toolbar>
+</ion-header>
+
+<ion-content>
+  <!-- 搜索结果展示区域 -->
+  <div *ngIf="meals.length > 0">
+    <ion-card *ngFor="let meal of meals">
+      <img [src]="meal.strMealThumb" alt="{{ meal.strMeal }}" />
+      <ion-card-header>
+        <ion-card-title>{{ meal.strMeal }}</ion-card-title>
+        <ion-card-subtitle>{{ meal.strCategory }} - {{ meal.strArea }}</ion-card-subtitle>
+      </ion-card-header>
+      <ion-card-content>
+        <p>{{ meal.strInstructions}}...</p>
+      </ion-card-content>
+    </ion-card>
+  </div>
+
+  <!-- 如果没有结果,则显示提示 -->
+  <div *ngIf="meals.length === 0">
+    <p>没有找到相关菜谱</p>
+  </div>
+</ion-content>

+ 5 - 0
smarteat-app/src/app/meal-search/meal-search/meal-search.component.scss

@@ -0,0 +1,5 @@
+ion-card-content {
+    max-height: 200px;  /* 设置卡片内容的最大高度 */
+    overflow-y: auto;   /* 允许垂直滚动 */
+  }
+  

+ 24 - 0
smarteat-app/src/app/meal-search/meal-search/meal-search.component.spec.ts

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

+ 48 - 0
smarteat-app/src/app/meal-search/meal-search/meal-search.component.ts

@@ -0,0 +1,48 @@
+import { CommonModule } from '@angular/common';
+import { Component, Input, OnInit } from '@angular/core';
+import { IonButton, IonButtons, IonCard, IonCardContent, IonCardHeader, IonCardSubtitle, IonCardTitle, IonContent, IonHeader, IonTitle, IonToolbar } from '@ionic/angular/standalone';
+import { ModalController } from '@ionic/angular/standalone';
+import { MealService } from 'src/app/meal/meal.service';
+@Component({
+  selector: 'app-meal-search',
+  templateUrl: './meal-search.component.html',
+  styleUrls: ['./meal-search.component.scss'],
+  standalone:true,
+  imports: [IonHeader,IonToolbar,IonContent,IonTitle,IonButton,IonButtons,IonCard,IonCardTitle,IonCardHeader,IonCardContent,CommonModule,IonCardSubtitle]
+})
+export class MealSearchComponent implements OnInit {
+  @Input() searchQuery: string = '';  // 从父组件接收搜索词
+  meals: any[] = [];  // 存储查询到的菜谱
+
+  constructor(
+    private mealService: MealService,
+    private modalController: ModalController
+  ) {}
+
+  ngOnInit() {
+    // 初始化时调用 searchMeals() 进行查询
+    if (this.searchQuery.trim()) {
+      this.searchMeals();
+    }
+  }
+
+  // 根据搜索查询获取菜品
+  searchMeals() {
+    this.mealService.searchMealsByName(this.searchQuery).subscribe(
+      (response) => {
+        this.meals = response.meals || [];  // 将查询结果赋值给 meals
+      },
+      (error) => {
+        console.error('查询失败', error);
+        this.meals = [];  // 如果查询失败,则将 meals 置为空
+      }
+    );
+  }
+
+  // 关闭弹窗
+  closeModal() {
+    this.modalController.dismiss();
+  }
+
+  // 点击菜品查看详细信息
+}

+ 16 - 0
smarteat-app/src/app/meal/meal.service.spec.ts

@@ -0,0 +1,16 @@
+import { TestBed } from '@angular/core/testing';
+
+import { MealService } from './meal.service';
+
+describe('MealService', () => {
+  let service: MealService;
+
+  beforeEach(() => {
+    TestBed.configureTestingModule({});
+    service = TestBed.inject(MealService);
+  });
+
+  it('should be created', () => {
+    expect(service).toBeTruthy();
+  });
+});

+ 20 - 0
smarteat-app/src/app/meal/meal.service.ts

@@ -0,0 +1,20 @@
+// meal.service.ts
+import { Injectable } from '@angular/core';
+import { HttpClient } from '@angular/common/http';
+import { Observable } from 'rxjs';
+
+const API_URL = 'https://www.themealdb.com/api/json/v1/1';
+
+@Injectable({
+  providedIn: 'root',
+})
+export class MealService {
+
+  constructor(private http: HttpClient) {}
+
+  // 根据食物名称查询菜谱和食物详细信息
+  searchMealsByName(mealName: string): Observable<any> {
+    const url = `${API_URL}/search.php?s=${mealName}`;
+    return this.http.get<any>(url);
+  }
+}

+ 8 - 0
smarteat-app/src/app/newline-to-br.pipe.spec.ts

@@ -0,0 +1,8 @@
+import { NewlineToBrPipe } from './newline-to-br.pipe';
+
+describe('NewlineToBrPipe', () => {
+  it('create an instance', () => {
+    const pipe = new NewlineToBrPipe();
+    expect(pipe).toBeTruthy();
+  });
+});

+ 13 - 0
smarteat-app/src/app/newline-to-br.pipe.ts

@@ -0,0 +1,13 @@
+import { Pipe, PipeTransform } from '@angular/core';
+
+@Pipe({
+  name: 'newlineToBr',
+  standalone: true
+})
+export class NewlineToBrPipe implements PipeTransform {
+
+  transform(value: unknown, ...args: unknown[]): unknown {
+    return null;
+  }
+
+}

+ 27 - 5
smarteat-app/src/app/tab1/tab1.page.html

@@ -1,5 +1,18 @@
 <ion-toolbar>
-  <ion-searchbar class="custom-searchbar" placeholder="搜索食物、食谱、餐厅" show-clear-button="focus"></ion-searchbar>
+      <ion-searchbar 
+        class="custom-searchbar" 
+        placeholder="搜索食物、食谱、餐厅" 
+        show-clear-button="focus" 
+        (ionInput)="setSearchQuery($event.target.value || '')" 
+        (ionClear)="searchQuery = ''" 
+        (ionCancel)="searchQuery = ''" 
+        (ionSearch)="search()">
+      </ion-searchbar>
+      <ion-buttons slot="end">
+        <ion-button (click)="search()">搜索
+          <ion-icon slot="icon-only" name="search"></ion-icon>
+        </ion-button>
+      </ion-buttons>
 </ion-toolbar>
 
 <ion-content [fullscreen]="true">
@@ -84,7 +97,15 @@
   <ion-grid>
     <ion-row>
       <ion-col size="12">
-        <ion-button>
+        <ion-button (click)="goToasf()">
+          <ion-icon slot="start" name="document-outline"></ion-icon>
+          健康目标管理
+        </ion-button>
+      </ion-col>
+    </ion-row>
+    <ion-row>
+      <ion-col size="12">
+        <ion-button (click)="goToasx()">
           <ion-icon slot="start" name="storefront-outline"></ion-icon>
           外卖推荐
         </ion-button>
@@ -96,12 +117,13 @@
   <ion-card>
     <ion-card-header>
       <ion-card-title>
-        <ion-icon  name="albums-outline"></ion-icon>
-        今日推荐食谱
+        <ion-icon slot="start" name="albums-outline"></ion-icon>
+        今日推荐食谱:
+        <div [innerHTML]="dishName"></div>
       </ion-card-title>
     </ion-card-header>
     <ion-card-content>
-      <ion-button >
+      <ion-button (click)="goToasy()">
         查看推荐食谱
       </ion-button>
     </ion-card-content>

+ 15 - 0
smarteat-app/src/app/tabs/tabs.routes.ts

@@ -31,6 +31,21 @@ export const routes: Routes = [
         loadComponent: () =>
           import('../health-tips/health-tips.component').then((m) => m.HealthTipsComponent),
       },
+      {
+        path: 'asy',
+        loadComponent: () =>
+          import('../asy/asy.component').then((m) => m.AsyComponent),
+      },
+      {
+        path: 'asf',
+        loadComponent: () =>
+          import('../asf/asf.component').then((m) => m.AsfComponent),
+      },
+      {
+        path: 'asx',
+        loadComponent: () =>
+          import('../asx/asx.component').then((m) => m.AsxComponent),
+      },
       {
         path: '',
         redirectTo: '/tabs/tab1',

+ 0 - 0
smarteat-app/src/app/translate.service.ts


+ 133 - 0
smarteat-app/src/lib/cloudshipu.ts

@@ -0,0 +1,133 @@
+import { CloudObject } from "./ncloud";
+
+export class CloudShipu extends CloudObject {
+    constructor() {
+        super("seshipu"); // 假设 seshipu 类在 Parse 中是 "seshipu"
+    }
+
+    /** 获取所有 `seshipu` 信息 */
+    async getAllShipu() {
+        const url = "http://dev.fmode.cn:1337/parse/classes/seshipu";
+
+        const response = await fetch(url, {
+            headers: {
+                "accept": "*/*",
+                "accept-language": "zh-CN,zh;q=0.9",
+                "x-parse-application-id": "dev"
+            },
+            method: "GET",
+            mode: "cors",
+            credentials: "omit"
+        });
+
+        const result = await response?.json();
+        if (result?.error) {
+            console.error(result?.error);
+            return null;
+        }
+
+        return result.results.map((item: any) => this.dataToObj(item)); // 假设返回的数据在 `results` 字段中
+    }
+
+    /** 获取单个 `seshipu` 信息 */
+    async getShipu(id: string) {
+        const url = `http://dev.fmode.cn:1337/parse/classes/seshipu/${id}?`;
+
+        const response = await fetch(url, {
+            headers: {
+                "x-parse-application-id": "dev"
+            },
+            method: "GET",
+            mode: "cors",
+            credentials: "omit"
+        });
+
+        const result = await response?.json();
+        if (result?.error) {
+            console.error(result?.error);
+            return null;
+        }
+
+        return this.dataToObj(result);
+    }
+
+    /** 创建 `seshipu` 信息 */
+    async saveShipuInfo(shipuData: Record<string, any>) {
+        const url = `http://dev.fmode.cn:1337/parse/classes/seshipu`;
+
+        const response = await fetch(url, {
+            headers: {
+                "Content-Type": "application/json",
+                "x-parse-application-id": "dev"
+            },
+            method: "POST",
+            body: JSON.stringify(shipuData),
+            mode: "cors",
+            credentials: "omit"
+        });
+
+        const result = await response?.json();
+        if (result?.error) {
+            console.error(result?.error);
+            return null;
+        }
+
+        return this.dataToObj(result);
+    }
+
+    /** 更新 `seshipu` 信息 */
+    async updateShipuInfo(id: string, updatedData: Record<string, any>) {
+        const url = `http://dev.fmode.cn:1337/parse/classes/seshipu/${id}`;
+
+        const response = await fetch(url, {
+            headers: {
+                "Content-Type": "application/json",
+                "x-parse-application-id": "dev"
+            },
+            method: "PUT",
+            body: JSON.stringify(updatedData),
+            mode: "cors",
+            credentials: "omit"
+        });
+
+        const result = await response?.json();
+        if (result?.error) {
+            console.error(result?.error);
+            return null;
+        }
+
+        return this.dataToObj(result);
+    }
+
+    /** 删除 `seshipu` 信息 */
+    async deleteShipuInfo(id: string) {
+        const url = `http://dev.fmode.cn:1337/parse/classes/seshipu/${id}`;
+
+        const response = await fetch(url, {
+            headers: {
+                "x-parse-application-id": "dev"
+            },
+            method: "DELETE",
+            mode: "cors",
+            credentials: "omit"
+        });
+
+        const result = await response?.json();
+        if (result?.error) {
+            console.error(result?.error);
+            return false;
+        }
+
+        return true;
+    }
+
+    /** 将查询结果转换为 CloudObject */
+    private dataToObj(result: any): CloudObject {
+        let shipuObject = new CloudObject(this.className);
+        shipuObject.set(result);
+        shipuObject.id = result.objectId;
+        shipuObject.createdAt = result.createdAt;
+        shipuObject.updatedAt = result.updatedAt;
+        return shipuObject;
+    }
+}

+ 63 - 0
smarteat-app/src/lib/import-data.js

@@ -72,4 +72,67 @@ fetch("http://dev.fmode.cn:1337/parse/classes/seUser?", {
     "method": "DELETE",
     "mode": "cors",
     "credentials": "omit"
+  });
+
+
+
+
+  fetch("http://dev.fmode.cn:1337/parse/classes/seshipu?", {
+    "headers": {
+      "accept": "*/*",
+      "accept-language": "zh-CN,zh;q=0.9",
+      "x-parse-application-id": "dev"
+    },
+    "referrer": "http://127.0.0.1:4040/",
+    "referrerPolicy": "strict-origin-when-cross-origin",
+    "body": null,
+    "method": "GET",
+    "mode": "cors",
+    "credentials": "omit"
+  });
+
+  fetch("http://dev.fmode.cn:1337/parse/classes/seshipu", {
+    "headers": {
+      "accept": "*/*",
+      "accept-language": "zh-CN,zh;q=0.9",
+      "content-type": "text/plain;charset=UTF-8",
+      "x-parse-application-id": "dev"
+    },
+    "referrer": "http://127.0.0.1:4040/",
+    "referrerPolicy": "strict-origin-when-cross-origin",
+    "body": "",
+    "method": "POST",
+    "mode": "cors",
+    "credentials": "omit"
+  });
+
+
+  fetch("http://dev.fmode.cn:1337/parse/classes/seshipu", {
+    "headers": {
+      "accept": "*/*",
+      "accept-language": "zh-CN,zh;q=0.9",
+      "content-type": "text/plain;charset=UTF-8",
+      "x-parse-application-id": "dev"
+    },
+    "referrer": "http://127.0.0.1:4040/",
+    "referrerPolicy": "strict-origin-when-cross-origin",
+    "body": "",
+    "method": "PUT",
+    "mode": "cors",
+    "credentials": "omit"
+  });
+
+
+  fetch("http://dev.fmode.cn:1337/parse/classes/seshipu", {
+    "headers": {
+      "accept": "*/*",
+      "accept-language": "zh-CN,zh;q=0.9",
+      "x-parse-application-id": "dev"
+    },
+    "referrer": "http://127.0.0.1:4040/",
+    "referrerPolicy": "strict-origin-when-cross-origin",
+    "body": null,
+    "method": "DELETE",
+    "mode": "cors",
+    "credentials": "omit"
   });