18879852299-202226701057 3 månader sedan
förälder
incheckning
b2f1589e26

+ 53 - 10
TFPower-app/src/app/tab3/tab3.page.html

@@ -1,17 +1,60 @@
 <ion-header [translucent]="true">
   <ion-toolbar>
-    <ion-title>
-      Tab 3
-    </ion-title>
+    <ion-title>动态</ion-title>
   </ion-toolbar>
 </ion-header>
 
 <ion-content [fullscreen]="true">
-  <ion-header collapse="condense">
-    <ion-toolbar>
-      <ion-title size="large">Tab 3</ion-title>
-    </ion-toolbar>
-  </ion-header>
+  <div class="post-input">
+    <ion-card>
+      <ion-card-header>
+        <ion-card-title>发布动态</ion-card-title>
+      </ion-card-header>
+      <ion-card-content>
+        <ion-item>
+          <ion-input [(ngModel)]="newPostContent" placeholder="写下你的动态..." clearInput></ion-input>
+        </ion-item>
+        <ion-item>
+          <input type="file" (change)="handleFileInput($event)" accept="image/*" />
+        </ion-item>
+        <ion-button expand="full" (click)="publishPost()">发布动态</ion-button>
+      </ion-card-content>
+    </ion-card>
+  </div>
 
-  <app-explore-container name="Tab 3 page"></app-explore-container>
-</ion-content>
+  <ion-list class="post-list">
+    <ion-item *ngFor="let post of posts">
+      <ion-avatar slot="start">
+        <img [src]="post.get('avatar')" alt="Avatar">
+      </ion-avatar>
+      <ion-label>
+        <h2>{{ post.get('username') }}</h2>
+t.get('image_url')" alt="Post Image" style="max-width: 100%;">        <p>{{ post.get('content') }}</p>
+        <img *ngIf="post.get('image_url')" [src]="pos
+        <div>
+          <ion-button (click)="likePost(post.get('objectId'))">
+            <ion-icon [name]="post.liked ? 'thumbs-up' : 'thumbs-up-outline'"></ion-icon> 
+            {{ post.liked ? '取消点赞' : '点赞' }}
+            <!-- <ion-icon slot="start" name="thumbs-up"></ion-icon>
+            {{ post.likes.length }} 点赞 -->
+          </ion-button>
+        </div>
+        <ion-item>
+          <ion-input [(ngModel)]="commentInputs[post.get('objectId')]" name="comment-{{post.get('objectId')}}" placeholder="写评论..."></ion-input>
+          <ion-button (click)="commentOnPost(post.get('objectId'), commentInputs[post.get('objectId')])">发送</ion-button>
+        </ion-item>
+        <ion-list>
+          <ion-item *ngFor="let comment of post.comments">
+            <ion-avatar slot="start">
+              <img [src]="comment.get('avatar')" alt="Avatar">
+            </ion-avatar>
+            <ion-label>
+              <h2>{{ comment.get('username') }}</h2>
+              <p>{{ comment.get('content') }}</p>
+            </ion-label>
+          </ion-item>
+        </ion-list>
+      </ion-label>
+    </ion-item>
+  </ion-list>
+</ion-content>

+ 38 - 0
TFPower-app/src/app/tab3/tab3.page.scss

@@ -0,0 +1,38 @@
+ion-item {
+  margin-bottom: 10px;
+  display: flex;
+  align-items: flex-start; /* 确保头像和内容顶部对齐 */
+}
+
+ion-avatar {
+  width: 50px;
+  height: 50px;
+}
+
+h2 {
+  margin: 0;
+  font-size: 1.2em;
+}
+
+ion-content {
+  display: flex;
+  flex-direction: column;
+  height: 100%;
+}
+ion-header {
+  z-index: 10;
+}
+.post-input {
+  padding: 10px;
+  background-color: #fff; /* 输入框背景 */
+  position: fixed;
+  bottom: 0;
+  left: 0;
+  right: 0;
+  z-index: 100;
+}
+.post-list {
+  margin-bottom: 350px; // 留出空间给输入框
+  padding-bottom: 10px; // 确保内容不会被遮挡
+}
+

+ 217 - 6
TFPower-app/src/app/tab3/tab3.page.ts

@@ -1,14 +1,225 @@
-import { Component } from '@angular/core';
-import { IonHeader, IonToolbar, IonTitle, IonContent } from '@ionic/angular/standalone';
-import { ExploreContainerComponent } from '../explore-container/explore-container.component';
-
+import { Component, OnInit } from '@angular/core';
+import { IonAvatar, IonButton, IonCard, IonCardContent, IonCardHeader, IonCardSubtitle, IonCardTitle, IonContent, IonHeader, IonIcon, IonItem, IonLabel, IonList, IonTitle, IonToolbar } from '@ionic/angular/standalone';
+import { CloudQuery } from 'src/lib/ncloud';
+import { CloudUser } from 'src/lib/ncloud';
+import { CloudObject } from 'src/lib/ncloud';
+import { CommonModule } from '@angular/common';
+import { FormsModule } from '@angular/forms';
 @Component({
   selector: 'app-tab3',
   templateUrl: 'tab3.page.html',
   styleUrls: ['tab3.page.scss'],
   standalone: true,
-  imports: [IonHeader, IonToolbar, IonTitle, IonContent, ExploreContainerComponent],
+  imports:[IonHeader,IonToolbar,IonTitle,IonContent,IonCard,IonCardSubtitle
+    ,IonCardHeader,IonCardTitle,IonCardContent,CommonModule,FormsModule,
+    IonList,IonItem,IonAvatar,IonLabel,IonButton
+    ,IonIcon
+  ]
 })
 export class Tab3Page {
-  constructor() {}
+  posts: any[] = [];
+  currentUser: CloudUser | undefined;
+  newPostContent: string = ''; // 用于存储新动态的内容
+  newPostImageUrl: string = ''; // 用于存储新动态的图片 URL(可选)
+  commentInputs: { [key: string]: string } = {}; // 用于存储每个帖子的评论内容
+  // commentsMap: { [key: string]: any[] } = {}; // 用于存储每个帖子的评论列表
+  
+  constructor() {
+    this.currentUser = new CloudUser();
+  }
+
+  async ngOnInit() {
+    await this.loadPosts();
+  }
+
+  async loadPosts() {
+    const postQuery = new CloudQuery('Post');
+    this.posts = await postQuery.find();
+    
+    console.log("获取的帖子:", this.posts); // 调试信息
+    
+
+    // 获取用户信息并添加到帖子中
+    for (let post of this.posts) {
+      // console.log("post",post);
+      
+      // let userQuery = new CloudQuery('User');
+      // console.log("post.get('user_id'):::",post.get('user_id'));
+      
+      // userQuery.equalTo("objectId",post.get('user_id'));
+      // let user:any = await userQuery.find()
+      // console.log("user::",user);
+      // post.username = user.get('username'); // 添加用户名
+      // post.avatar = user.get('avatar'); // 用户表中有头像字段
+      // post.liked = post.likes.includes(this.currentUser?.id); // 检查当前用户是否已点赞
+      // // 初始化评论输入
+      // this.commentInputs[post.objectId] = ''; // 以帖子的 objectId 为键
+    
+      let fituserQuery = new CloudQuery('fitUser');
+      let fituser = await fituserQuery.get(post.get('user_id').objectId); // 使用 get 方法
+      post.username = fituser.get('name'); // 使用 get 方法
+      post.avatar = fituser.get('avater'); // 使用 get 方法
+
+      // 获取该帖子的点赞用户信息
+     let a = await this.getLikesForPost(post.get('objectId')) || []; 
+      console.log("获取的点赞信息:", a); // 调试信息
+      // 获取该帖子的评论信息
+      post.comments = await this.getCommentsForPost(post.get('objectId'))|| []; // 直接将评论存储到 post 对象中
+      console.log("获取的评论信息:", post.comments); // 调试信息
+     
+      
+     // 获取所有评论
+    //  this.commentsMap = {};
+    //  for (let post of this.posts) {
+      //  this.commentsMap[post.objectId] = await this.getCommentsForPost(post.objectId);
+    //  }
+    
+    }
+  }
+
+
+
+// 获取某个帖子的评论
+async getCommentsForPost(postId: string) {
+  const commentsQuery = new CloudQuery('Comments');
+  commentsQuery.equalTo('post_id', postId );
+  const comments = await commentsQuery.find();
+
+  console.log("获取的评论:", comments); // 查看获取的评论
+
+  const commentDetails = await Promise.all(
+    comments.map(async (comment: any) => {
+
+      console.log("当前评论:", comment); // 查看每个评论的内容
+      
+      const fituserQuery = new CloudQuery('fitUser');
+      const user = await fituserQuery.get(comment.get('user_id').objectId);
+     
+      console.log("获取的用户信息:", user); // 调试信息,查看获取的用户信息
+
+
+    //   if (!userId) {
+    //      console.error("user_id 为 undefined,无法获取用户信息");
+    //     return { content: comment.content, username: null, avatar: null }; // 返回默认值
+    // }
+
+    // const user = await userQuery.get(userId); // 使用 user_id
+    // console.log("获取的用户信息:", user); // 查看获取的用户信息
+
+      return { 
+        content: comment.get('content'), 
+        username: user.get('name'), // 直接添加 username
+        avatar: user.get('avatar') // 直接添加 avatar
+      }; // 返回评论内容和用户信息
+    })
+  );
+
+  // console.log("处理后的评论:", commentDetails); // 调试信息,查看处理后的评论
+
+
+  return commentDetails; // 返回评论的详细信息
+}
+
+ // 获取某个帖子的点赞用户信息
+async getLikesForPost(postId: string) {
+  const likesQuery = new CloudQuery('Likes');
+  likesQuery.equalTo('post_id', postId );
+  const likes = await likesQuery.find();
+
+  const likeUsers = await Promise.all(
+    likes.map(async (like: any) => {
+      const fituserQuery = new CloudQuery('fitUser');
+      const user = await fituserQuery.get(like.get('user_id').objectId);
+      return { id: user.get('objectId'),
+         username: user.get('name'), 
+         avatar: user.get('avatar') 
+        }; // 返回用户的 ID、姓名和头像
+    })
+  );
+
+  return likeUsers; // 返回点赞人的详细信息
 }
+
+async publishPost() {
+
+    // console.log(this.newPostContent);
+    
+    if (!this.newPostContent) {
+      console.error("动态内容不能为空");
+      return;
+    }
+
+    // 创建新的帖子对象
+    const post = new CloudObject('Post');
+    post.set({
+      content: this.newPostContent,
+      image_url: this.newPostImageUrl || '', // 如果有图片 URL,则使用
+      user_id:   this.currentUser?.id,
+    });
+
+    await post.save(); // 保存动态
+
+    // 清空输入框
+    this.newPostContent = '';
+    this.newPostImageUrl = '';
+
+    // 重新加载动态列表
+    await this.loadPosts();
+  }
+
+async likePost(postId: string) {
+    if (!postId) {
+      console.error(postId);
+      return;
+      } 
+    
+       // 创建新的点赞记录
+    const like = new CloudObject('Likes');
+    like.set({
+      post_id:  postId ,
+      user_id: this.currentUser?.id ,
+    });
+
+    await like.save(); // 保存点赞记录
+
+
+    // 更新本地状态
+    await this.loadPosts(); // 重新加载帖子以更新点赞状态
+  }
+
+async commentOnPost(postId: string, comment: string) {
+
+    if (!postId || !comment) {
+      console.error("postId or comment is undefined");
+      return;
+  }
+    
+// 创建新的评论对象
+const commentObj = new CloudObject('Comments');
+commentObj.set({
+  post_id: postId ,
+  user_id:  this.currentUser?.id ,
+  content: comment,
+});
+
+await commentObj.save(); // 保存评论记录
+
+
+    // 更新本地状态
+   await this.loadPosts(); // 重新加载帖子以更新评论
+  }
+
+  // 处理文件选择
+handleFileInput(event: any) {
+    const file = event.target.files[0];
+    if (file) {
+      const reader = new FileReader();
+      reader.onload = (e: any) => {
+        this.newPostImageUrl = e.target.result; // 将图像数据设置为 Base64 格式
+      };
+      reader.readAsDataURL(file); // 读取文件为 Base64
+    }
+  }
+
+
+}

+ 55 - 1
TFPower-app/src/lib/ncloud.ts

@@ -250,6 +250,42 @@ export class CloudUser extends CloudObject {
         // return result;
     }
 
+     /** 获取特定用户信息 */
+     async getUserByUsername(objectId: string) {
+        const url = `http://dev.fmode.cn:1337/parse/classes/_User?where=${JSON.stringify({ objectId })}`;
+
+        const response = await fetch(url, {
+            headers: {
+                "accept": "*/*",
+                "x-parse-application-id": "dev",
+                "x-parse-master-key": "devmk", // 使用您的 Master Key
+                "Content-Type": "application/json"
+            },
+            method: "GET",
+            mode: "cors",
+            credentials: "omit"
+        });
+
+        const result = await response?.json();
+        if (result?.error) {
+            console.error(result?.error);
+            return null; // 返回 null 表示未找到用户或发生错误
+        }
+
+        // 处理查询结果
+        if (result.results && result.results.length > 0) {
+            const userData = result.results[0]; // 获取第一个匹配的用户
+            const user = new CloudUser();
+            user.set(userData);
+            user.id = userData.objectId;
+            user.createdAt = userData.createdAt;
+            user.updatedAt = userData.updatedAt;
+            return user; // 返回找到的用户对象
+        }
+
+        return null; // 如果没有找到用户,返回 null
+    }
+
     /** 登录 */
     async login(username: string, password: string): Promise<CloudUser | null> {
         const response = await fetch(`http://dev.fmode.cn:1337/parse/login`, {
@@ -378,4 +414,22 @@ export class CloudUser extends CloudObject {
         localStorage.setItem("NCloud/dev/User", JSON.stringify(this.data))
         return this;
     }
-}
+}
+
+
+
+// fetch("http://dev.fmode.cn:1337/parse/classes/_User?where={%22username%22:%22chengnan%22}", {
+//     "headers": {
+//       "accept": "*/*",
+//       "accept-language": "zh-CN,zh;q=0.9",
+//       "if-none-match": "W/\"fe-JIlchyuW4LZub+2xCTNV/QiJ0wc\"",
+//       "x-parse-application-id": "dev",
+//       "x-parse-master-key": "devmk"
+//     },
+//     "referrer": "http://localhost:4040/",
+//     "referrerPolicy": "strict-origin-when-cross-origin",
+//     "body": null,
+//     "method": "GET",
+//     "mode": "cors",
+//     "credentials": "omit"
+//   });

+ 231 - 138
TFPower-server/lib/migration/data.js

@@ -190,163 +190,256 @@
 //         "desc": "专注于神经系统疾病的诊断和治疗"
 //       }
 //     ]
-module.exports.UserList = [
-  {
-    "objectId": "user001",
-    "name": "张伟",
-    "gender": "男",
-    "age": 30,
-    "height": 175, // 身高(厘米)  
-    "weight": 70,  // 体重(千克)  
-    "bmi": 22.86,  // 体重指数  
-    "fitnessGoals": ["增肌", "提高耐力"], // 健身目标  
-    "phone": "13800000001",
-    "email": "zhangwei@example.com",
-    "depart": {
-      "objectId": "plan001"
-    }
-  },
-  {
-    "objectId": "user002",
-    "name": "李娜",
-    "gender": "女",
-    "age": 28,
-    "height": 160,
-    "weight": 55,
-    "bmi": 21.48,
-    "fitnessGoals": ["减脂", "塑形"],
-    "phone": "13800000002",
-    "email": "lina@example.com",
-    "depart": {
-      "objectId": "plan002"
-    }
-  },
+// module.exports.UserList = [
+//   {
+//     "objectId": "user001",
+//     "name": "张伟",
+//     "gender": "男",
+//     "age": 30,
+//     "height": 175, // 身高(厘米)  
+//     "weight": 70,  // 体重(千克)  
+//     "bmi": 22.86,  // 体重指数  
+//     "fitnessGoals": ["增肌", "提高耐力"], // 健身目标  
+//     "phone": "13800000001",
+//     "email": "zhangwei@example.com",
+//     "depart": {
+//       "objectId": "plan001"
+//     }
+//   },
+//   {
+//     "objectId": "user002",
+//     "name": "李娜",
+//     "gender": "女",
+//     "age": 28,
+//     "height": 160,
+//     "weight": 55,
+//     "bmi": 21.48,
+//     "fitnessGoals": ["减脂", "塑形"],
+//     "phone": "13800000002",
+//     "email": "lina@example.com",
+//     "depart": {
+//       "objectId": "plan002"
+//     }
+//   },
+//   {
+//     "objectId": "user003",
+//     "name": "王芳",
+//     "gender": "女",
+//     "age": 35,
+//     "height": 165,
+//     "weight": 60,
+//     "bmi": 22.04,
+//     "fitnessGoals": ["增强力量"],
+//     "phone": "13800000003",
+//     "email": "wangfang@example.com",
+//     "depart": {
+//       "objectId": "plan003"
+//     }
+//   },
+//   {
+//     "objectId": "user004",
+//     "name": "刘强",
+//     "gender": "男",
+//     "age": 40,
+//     "height": 180,
+//     "weight": 80,
+//     "bmi": 24.69,
+//     "fitnessGoals": ["提高灵活性", "增强耐力"],
+//     "phone": "13800000004",
+//     "email": "liuqiang@example.com",
+//     "depart": {
+//       "objectId": "plan004"
+//     }
+//   },
+//   {
+//     "objectId": "user005",
+//     "name": "陈静",
+//     "gender": "女",
+//     "age": 25,
+//     "height": 158,
+//     "weight": 50,
+//     "bmi": 20.03,
+//     "fitnessGoals": ["保持健康"],
+//     "phone": "13800000005",
+//     "email": "chenjing@example.com",
+//     "depart": {
+//       "objectId": "plan005"
+//     }
+//   }
+// ];
+// module.exports.PlanList = [
+//   {
+//     "objectId": "plan001",
+//     "date": "2024-12-20", // 计划日期  
+//     "trainingPart": "胸部", // 训练部位  
+//     "trainingItems": [
+//       { "item": "卧推", "sets": 4, "reps": 10 }, // 训练项目1  
+//       { "item": "哑铃飞鸟", "sets": 3, "reps": 12 }, // 训练项目2  
+//       { "item": "俯卧撑", "sets": 3, "reps": 15 }, // 训练项目3  
+//       { "item": "拉力器扩胸", "sets": 3, "reps": 12 } // 训练项目4  
+//     ]
+//   },
+//   {
+//     "objectId": "plan002",
+//     "date": "2024-12-22",
+//     "trainingPart": "下肢",
+//     "trainingItems": [
+//       { "item": "深蹲", "sets": 4, "reps": 10 },
+//       { "item": "腿举", "sets": 3, "reps": 12 },
+//       { "item": "弓步", "sets": 3, "reps": 10 },
+//       { "item": "小腿提踵", "sets": 3, "reps": 15 }
+//     ]
+//   },
+//   {
+//     "objectId": "plan003",
+//     "date": "2024-12-25",
+//     "trainingPart": "背部",
+//     "trainingItems": [
+//       { "item": "引体向上", "sets": 4, "reps": 8 },
+//       { "item": "划船", "sets": 3, "reps": 10 },
+//       { "item": "背部伸展", "sets": 3, "reps": 12 },
+//       { "item": "拉力器划船", "sets": 3, "reps": 12 }
+//     ]
+//   },
+//   {
+//     "objectId": "plan004",
+//     "date": "2024-12-28",
+//     "trainingPart": "全身",
+//     "trainingItems": [
+//       { "item": "HIIT训练", "sets": 4, "reps": 30 }, // 30秒高强度  
+//       { "item": "核心训练", "sets": 3, "reps": 15 },
+//       { "item": "有氧运动", "sets": 1, "reps": 20 }, // 20分钟  
+//       { "item": "拉伸", "sets": 1, "reps": 10 } // 10分钟  
+//     ]
+//   },
+//   {
+//     "objectId": "plan005",
+//     "date": "2024-12-30",
+//     "trainingPart": "上肢",
+//     "trainingItems": [
+//       { "item": "哑铃弯举", "sets": 4, "reps": 10 },
+//       { "item": "三头肌下压", "sets": 3, "reps": 12 },
+//       { "item": "肩推", "sets": 3, "reps": 10 },
+//       { "item": "侧平举", "sets": 3, "reps": 12 }
+//     ]
+//   }
+// ];
+// module.exports.CoachList = [
+//   {
+//     "objectId": "coach001",
+//     "qualification": "国家认证健身教练",
+//     "gender": "男",
+//     "name": "李明",
+//     "specialize": "力量训练",
+//     "age": 32
+//   },
+//   {
+//     "objectId": "coach002",
+//     "qualification": "国际健身教练认证",
+//     "gender": "女",
+//     "name": "张婷",
+//     "specialize": "灵活性训练",
+//     "age": 29
+//   },
+//   {
+//     "objectId": "coach003",
+//     "qualification": "高级私人教练",
+//     "gender": "男",
+//     "name": "王强",
+//     "specialize": "综合训练",
+//     "age": 38
+//   }
+// ];
+
+
+module.exports.User=
+[
   {
-    "objectId": "user003",
-    "name": "王芳",
-    "gender": "女",
-    "age": 35,
-    "height": 165,
-    "weight": 60,
-    "bmi": 22.04,
-    "fitnessGoals": ["增强力量"],
-    "phone": "13800000003",
-    "email": "wangfang@example.com",
-    "depart": {
-      "objectId": "plan003"
-    }
+      "objectId": "user1",
+      "username": "alice",
+      "password": "123",
+      "awatar":"https://www.duitang.com/blog/?id=1532320654"
   },
   {
-    "objectId": "user004",
-    "name": "刘强",
-    "gender": "男",
-    "age": 40,
-    "height": 180,
-    "weight": 80,
-    "bmi": 24.69,
-    "fitnessGoals": ["提高灵活性", "增强耐力"],
-    "phone": "13800000004",
-    "email": "liuqiang@example.com",
-    "depart": {
-      "objectId": "plan004"
-    }
+      "objectId": "user2",
+      "username": "bob",
+      "password": "456",
+      "awatar":"https://www.duitang.com/blog/?id=1464472227"
   },
   {
-    "objectId": "user005",
-    "name": "陈静",
-    "gender": "女",
-    "age": 25,
-    "height": 158,
-    "weight": 50,
-    "bmi": 20.03,
-    "fitnessGoals": ["保持健康"],
-    "phone": "13800000005",
-    "email": "chenjing@example.com",
-    "depart": {
-      "objectId": "plan005"
-    }
+      "objectId": "user3",
+      "username": "charlie",
+      "password": "789",
+      "awatar":"https://www.duitang.com/blog/?id=1522161374"
   }
-];
-module.exports.PlanList = [
+]
+
+module.exports.Post=
+[
   {
-    "objectId": "plan001",
-    "date": "2024-12-20", // 计划日期  
-    "trainingPart": "胸部", // 训练部位  
-    "trainingItems": [
-      { "item": "卧推", "sets": 4, "reps": 10 }, // 训练项目1  
-      { "item": "哑铃飞鸟", "sets": 3, "reps": 12 }, // 训练项目2  
-      { "item": "俯卧撑", "sets": 3, "reps": 15 }, // 训练项目3  
-      { "item": "拉力器扩胸", "sets": 3, "reps": 12 } // 训练项目4  
-    ]
+      "objectId": "post1",
+      "user_id": {"__type": "Pointer", "className": "User", "objectId": "user1"},
+      "content": "Hello, world!",
+      "image_url": "https://www.vcg.com/creative/1354027513.html"
   },
   {
-    "objectId": "plan002",
-    "date": "2024-12-22",
-    "trainingPart": "下肢",
-    "trainingItems": [
-      { "item": "深蹲", "sets": 4, "reps": 10 },
-      { "item": "腿举", "sets": 3, "reps": 12 },
-      { "item": "弓步", "sets": 3, "reps": 10 },
-      { "item": "小腿提踵", "sets": 3, "reps": 15 }
-    ]
+      "objectId": "post2",
+      "user_id": {"__type": "Pointer", "className": "User", "objectId": "user2"},
+      "content": "This is my first post!",
+      "image_url": "https://www.vcg.com/creative/1361496162.html"
   },
   {
-    "objectId": "plan003",
-    "date": "2024-12-25",
-    "trainingPart": "背部",
-    "trainingItems": [
-      { "item": "引体向上", "sets": 4, "reps": 8 },
-      { "item": "划船", "sets": 3, "reps": 10 },
-      { "item": "背部伸展", "sets": 3, "reps": 12 },
-      { "item": "拉力器划船", "sets": 3, "reps": 12 }
-    ]
+      "objectId": "post3",
+      "user_id": {"__type": "Pointer", "className": "User", "objectId": "user3"},
+      "content": "Loving this new feature!",
+      "image_url": "https://www.vcg.com/creative/1361496300.html"
+  }
+]
+
+module.exports.Comments=
+[
+  {
+      "objectId": "comment1",
+      "post_id": {"__type": "Pointer", "className": "Post", "objectId": "post1"},
+      "user_id": {"__type": "Pointer", "className": "User_exer", "objectId": "user2"},
+      "content": "Nice post!",
+
   },
   {
-    "objectId": "plan004",
-    "date": "2024-12-28",
-    "trainingPart": "全身",
-    "trainingItems": [
-      { "item": "HIIT训练", "sets": 4, "reps": 30 }, // 30秒高强度  
-      { "item": "核心训练", "sets": 3, "reps": 15 },
-      { "item": "有氧运动", "sets": 1, "reps": 20 }, // 20分钟  
-      { "item": "拉伸", "sets": 1, "reps": 10 } // 10分钟  
-    ]
+      "objectId": "comment2",
+      "post_id": {"__type": "Pointer", "className": "Post", "objectId": "post2"},
+      "user_id": {"__type": "Pointer", "className": "User_exer", "objectId": "user1"},
+      "content": "Welcome to the platform!",
+
   },
   {
-    "objectId": "plan005",
-    "date": "2024-12-30",
-    "trainingPart": "上肢",
-    "trainingItems": [
-      { "item": "哑铃弯举", "sets": 4, "reps": 10 },
-      { "item": "三头肌下压", "sets": 3, "reps": 12 },
-      { "item": "肩推", "sets": 3, "reps": 10 },
-      { "item": "侧平举", "sets": 3, "reps": 12 }
-    ]
+      "objectId": "comment3",
+      "post_id": {"__type": "Pointer", "className": "Post", "objectId": "post3"},
+      "user_id": {"__type": "Pointer", "className": "User_exer", "objectId": "user1"},
+      "content": "Great to see you here!",
+
   }
-];
-module.exports.CoachList = [
+]
+
+module.exports.Likes=
+[
   {
-    "objectId": "coach001",
-    "qualification": "国家认证健身教练",
-    "gender": "男",
-    "name": "李明",
-    "specialize": "力量训练",
-    "age": 32
+      "objectId": "like1",
+      "post_id": {"__type": "Pointer", "className": "Post", "objectId": "post1"},
+      "user_id": {"__type": "Pointer", "className": "User", "objectId": "user3"},
+  
   },
   {
-    "objectId": "coach002",
-    "qualification": "国际健身教练认证",
-    "gender": "女",
-    "name": "张婷",
-    "specialize": "灵活性训练",
-    "age": 29
+      "objectId": "like2",
+      "post_id": {"__type": "Pointer", "className": "Post", "objectId": "post2"},
+      "user_id": {"__type": "Pointer", "className": "User", "objectId": "user3"},
+ 
   },
   {
-    "objectId": "coach003",
-    "qualification": "高级私人教练",
-    "gender": "男",
-    "name": "王强",
-    "specialize": "综合训练",
-    "age": 38
+      "objectId": "like3",
+      "post_id": {"__type": "Pointer", "className": "Post", "objectId": "post3"},
+      "user_id": {"__type": "Pointer", "className": "User", "objectId": "user2"},
+
   }
-];
+]
+

+ 227 - 49
TFPower-server/lib/migration/import-data.js

@@ -1,60 +1,238 @@
+// const { CloudQuery, CloudObject } = require("../ncloud");
+// const { UserList, PlanList, CoachList } = require("./data");
+// inportDapartAndDoctor()
+
+
+
+// DataMap = {
+//     fitUser: {},
+//     fitPlan: {},
+//     Coach: {}
+// }
+
+// async function inportDapartAndDoctor() {
+//     // 导入科室数据
+//     let departList = CoachList
+//     for (let index = 0; index < departList.length; index++) {
+//         let depart = departList[index];
+//         depart = await importObject("Coach", depart)
+//     }
+
+//     // 导入医生数据
+//     // let doctorList = PlanList
+//     // for (let index = 0; index < doctorList.length; index++) {
+//     //     let doctor = doctorList[index];
+//     //     doctor = await importObject("fitPlan", doctor)
+//     // }
+//     // console.log(DataMap["Doctor"])
+// }
+
+// async function importObject(className, data) {
+
+//     // 查重 srcId 数据源列表中的objectId并非数据库生成的唯一ID,因此需要有一个srcId字段进行记录,并查重
+//     let query = new CloudQuery(className)
+//     let srcId = data.objectId
+//     query.equalTo("srcId", srcId)
+//     let importObj = await query.first()
+//     console.log(importObj)
+
+//     // 导入
+//     // 导入前批量处理Pointer类型数据,进行重定向
+//     Object.keys(data)?.forEach(key => {
+//         let field = data[key]
+//         let srcId = field?.objectId
+//         if (srcId) { // 是数组字段
+//             if (key == "depart") {
+//                 data[key] = DataMap?.["Department"]?.[srcId]?.toPointer();
+//             }
+//         }
+//     })
+
+//     // 若未添加,则创建新对象并保存
+//     if (!importObj?.id) {
+//         importObj = new CloudObject(className)
+//     }
+
+//     // 保存或更新数据
+//     data.srcId = srcId;
+//     importObj.set(data);
+//     importObj = await importObj.save();
+
+//     DataMap[className][srcId] = importObj
+// }
+
+// const { CloudQuery, CloudObject } = require("../ncloud");
+
+
+// testCRUD()
+// testQuery()
+// async function testQuery(){
+
+// let query= new CloudQuery("Post")
+// // 把用户填写的内容传入对象
+// query.equalTo("content","ccc")
+// // 对象和数据库内容对比
+// let list=await query.find()
+// console.log(list);
+// }
+
+
+// async function testCRUD(){
+
+//   // 增删查改测试
+//   let query=new CloudQuery("Post")
+//    let UserList=await query.find();
+// console.log(UserList?.length);
+
+
+// let newUser=new CloudObject("Post")
+// // 把数据传入对象的data
+//   newUser.set({"content":"8888"});
+//   // 数据保存到数据库
+//  newUser= await newUser.save()
+//  console.log(newUser);
+
+//  // 数据库删除操作
+//   await newUser.destroy()
+// console.log("shanchu",newUser);
+
+// }
+
+
+
+
+// // 得到数据
+// async function getUser(){
+//    let response=await fetch("http://dev.fmode.cn:1337/parse/classes/Post?", {
+//         "headers": {
+//           "if-none-match": "W/\"ab-2gNtNZqRYX93fdbIaSj6z5h571k\"",
+//           "x-parse-application-id": "dev"
+//         },
+
+//         "body": null,
+//         "method": "GET",
+//         "mode": "cors",
+//         "credentials": "omit"
+//       });
+// let json=await response?.json();
+// // console.log(json);
+// return json?.results || []
+// }
+
+
+// async function createUser(userInfo){
+
+//   let body=JSON.stringify(userInfo)
+//  let response=await fetch("http://dev.fmode.cn:1337/parse/classes/Post", {
+//     "headers": {
+//       "content-type": "application/json;charset=UTF-8",
+//       "x-parse-application-id": "dev"
+//     },
+//     "body": body,
+//     "method": "POST",
+//     "mode": "cors",
+//     "credentials": "omit"
+//   });
+// let json= await response?.json();
+
+// return json?.objectId
+// }
+
+// async function updateUser(id,userInfo) {
+
+//   let body=JSON.stringify(userInfo)
+//   let response=await fetch("http://dev.fmode.cn:1337/parse/classes/Post/"+id, {
+//     "headers": {
+//      "content-type": "application/json;charset=UTF-8",
+//       "x-parse-application-id": "dev"
+//     },
+//     "body": body,
+//     "method": "PUT",
+//     "mode": "cors",
+//     "credentials": "omit"
+//   });
+//   return await response?.json();
+// }
+
+// async function deleteUser(id){
+//  let response=await fetch("http://dev.fmode.cn:1337/parse/classes/Post/"+id, {
+//     "headers": {
+//       "x-parse-application-id": "dev"
+//     },
+//     "body": null,
+//     "method": "DELETE",
+//     "mode": "cors",
+//     "credentials": "omit"
+//   });
+//   return await response?.json();
+// }
 const { CloudQuery, CloudObject } = require("../ncloud");
-const { UserList, PlanList, CoachList } = require("./data");
-inportDapartAndDoctor()
+const { User_exer, Post, Like, Comment } = require("./data");
+
+importFourList()
 
-DataMap = {
-    fitUser: {},
-    fitPlan: {},
-    Coach: {}
+async function importFourList(){
+
+  // 导入用户数据
+let user=User_exer
+for (let index = 0; index < user.length; index++) {
+  let u = user[index];
+  u=await importObject("User_exer",u)
+  
+}
+  // 导入动态数据
+let post= Post
+for (let index = 0; index < post.length; index++) {
+  let p = post[index];
+  p=await importObject("Post",p)
 }
 
-async function inportDapartAndDoctor() {
-    // 导入科室数据
-    let departList = CoachList
-    for (let index = 0; index < departList.length; index++) {
-        let depart = departList[index];
-        depart = await importObject("Coach", depart)
-    }
+console.log(map);
+  // 导入点赞数据
+// let like=new Like
+//   // 导入评论数据
+
+//   let comment=new Comment
+}
 
-    // 导入医生数据
-    // let doctorList = PlanList
-    // for (let index = 0; index < doctorList.length; index++) {
-    //     let doctor = doctorList[index];
-    //     doctor = await importObject("fitPlan", doctor)
-    // }
-    // console.log(DataMap["Doctor"])
+map={
+  User_exer:{},
+  Post:{},
+  Like:{},
+  Comment:{}
 }
+async function importObject(ClassName,data)
+{
+  let query=new CloudQuery(ClassName)
+  // 对象添加了一个属性srcId
+  let srcId=data.objectId
+  query.equalTo("srcId",srcId)
 
-async function importObject(className, data) {
-
-    // 查重 srcId 数据源列表中的objectId并非数据库生成的唯一ID,因此需要有一个srcId字段进行记录,并查重
-    let query = new CloudQuery(className)
-    let srcId = data.objectId
-    query.equalTo("srcId", srcId)
-    let importObj = await query.first()
-    console.log(importObj)
-
-    // 导入
-    // 导入前批量处理Pointer类型数据,进行重定向
-    Object.keys(data)?.forEach(key => {
-        let field = data[key]
-        let srcId = field?.objectId
-        if (srcId) { // 是数组字段
-            if (key == "depart") {
-                data[key] = DataMap?.["Department"]?.[srcId]?.toPointer();
-            }
-        }
-    })
-
-    // 若未添加,则创建新对象并保存
-    if (!importObj?.id) {
-        importObj = new CloudObject(className)
+  let importObj=await query.first()
+
+  // 导入
+  // 若未添加,创建新对象并保存
+Object.keys(data)?.forEach(key=>{
+  let field=data[key]
+  let srcId=field?.objectId
+  if(srcId)
+  {
+    if(key=="user_id")
+    {
+      data[key]=map["User_exer"]?.[srcId]?.toPointer();
     }
+  }
+})
+
 
-    // 保存或更新数据
-    data.srcId = srcId;
-    importObj.set(data);
-    importObj = await importObj.save();
+  if(!importObj?.id)
+  {
+    importObj=new CloudObject(ClassName)
+  }
 
-    DataMap[className][srcId] = importObj
+  // 保存或更新数据
+    data.srcId=srcId;
+    importObj.set(data)
+    importObj=await importObj.save()
+    map[ClassName][srcId]=importObj
 }

+ 295 - 97
TFPower-server/lib/ncloud.js

@@ -1,55 +1,228 @@
 
 
+// class CloudObject{
+//     id
+//     className
+//     data = {}
+//     constructor(className){
+//         this.className = className
+//     }
+//     toPointer(){
+//         return {"__type":"Pointer","className":this.className,"objectId":this.id}
+//     }
+//     set(json){
+//         Object.keys(json).forEach(key=>{
+//             if(["objectId","id","createdAt","updatedAt","ACL"].indexOf(key)>-1){
+//                 return
+//             }
+//             this.data[key] = json[key]
+//         })
+//     }
+//     get(key){
+//         return this.data[key] || null
+//     }
+//     async save(){
+//         let method = "POST"
+//         let url = "http://dev.fmode.cn:1337/parse/classes/" + this.className
+//         // 更新
+//         if(this.id){
+//             url += "/"+this.id
+//             method = "PUT"
+//         } 
+//         let body = JSON.stringify(this.data)
+//         let 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"
+//           });
+//           let result = await response?.json();
+//           if(result?.error){
+//             console.error(result?.error)
+//           }
+//           if(result?.objectId){this.id = result?.objectId}
+//           return this
+//     }
+//     async destory(){
+//         if(!this.id) return
+//         let response = await fetch("http://dev.fmode.cn:1337/parse/classes/Doctor/"+this.id, {
+//             "headers": {
+//               "x-parse-application-id": "dev"
+//             },
+//             "body": null,
+//             "method": "DELETE",
+//             "mode": "cors",
+//             "credentials": "omit"
+//           });
+//           let result = await response?.json();
+//           if(result){
+//             this.id = null
+//         }
+//         return true
+//     }
+// }
+
+// class CloudQuery{
+//     className
+//     constructor(className){
+//         this.className = className
+//     }
+
+//     whereOptions = {}
+//     greaterThan(key,value){
+//         if(!this.whereOptions[key]) this.whereOptions[key] = {}
+//         this.whereOptions[key]["$gt"] = value
+//     }
+//     greaterThanAndEqualTo(key,value){
+//         if(!this.whereOptions[key]) this.whereOptions[key] = {}
+//         this.whereOptions[key]["$gte"] = value
+//     }
+//     lessThan(key,value){
+//         if(!this.whereOptions[key]) this.whereOptions[key] = {}
+//         this.whereOptions[key]["$lt"] = value
+//     }
+//     lessThanAndEqualTo(key,value){
+//         if(!this.whereOptions[key]) this.whereOptions[key] = {}
+//         this.whereOptions[key]["$lte"] = value
+//     }
+//     equalTo(key,value){
+//         this.whereOptions[key] = value
+//     }
+
+//     async get(id){
+//         let url = "http://dev.fmode.cn:1337/parse/classes/"+this.className+"/"+id+"?"
+
+//         let response = await fetch(url, {
+//             "headers": {
+//             "if-none-match": "W/\"1f0-ghxH2EwTk6Blz0g89ivf2adBDKY\"",
+//             "x-parse-application-id": "dev"
+//             },
+//             "body": null,
+//             "method": "GET",
+//             "mode": "cors",
+//             "credentials": "omit"
+//         });
+//         let json = await response?.json();
+//         return json || {}
+//     }
+//     async find(){
+//         let url = "http://dev.fmode.cn:1337/parse/classes/"+this.className+"?"
+        
+//         if(Object.keys(this.whereOptions)?.length){
+//             let whereStr = JSON.stringify(this.whereOptions)
+//             url += `where=${whereStr}`
+//         }
+
+//         let response = await fetch(url, {
+//             "headers": {
+//             "if-none-match": "W/\"1f0-ghxH2EwTk6Blz0g89ivf2adBDKY\"",
+//             "x-parse-application-id": "dev"
+//             },
+//             "body": null,
+//             "method": "GET",
+//             "mode": "cors",
+//             "credentials": "omit"
+//         });
+//         let json = await response?.json();
+//         return json?.results || []
+//     }
+//     async first(){
+//         let url = "http://dev.fmode.cn:1337/parse/classes/"+this.className+"?"
+        
+//         if(Object.keys(this.whereOptions)?.length){
+//             let whereStr = JSON.stringify(this.whereOptions)
+//             url += `where=${whereStr}`
+//         }
+
+//         let response = await fetch(url, {
+//             "headers": {
+//             "if-none-match": "W/\"1f0-ghxH2EwTk6Blz0g89ivf2adBDKY\"",
+//             "x-parse-application-id": "dev"
+//             },
+//             "body": null,
+//             "method": "GET",
+//             "mode": "cors",
+//             "credentials": "omit"
+//         });
+//         let json = await response?.json();
+//         let exists = json?.results?.[0] || null
+//         if(exists){
+//             let existsObject = new CloudObject(this.className)
+//             existsObject.set(exists)
+//             existsObject.id = exists.objectId
+//             existsObject.createdAt = exists.createdAt
+//             existsObject.updatedAt = exists.updatedAt
+//             return existsObject
+//         }
+//     }
+// }
+
+// module.exports.CloudObject = CloudObject
+// module.exports.CloudQuery = CloudQuery
+
 class CloudObject{
     id
-    className
-    data = {}
-    constructor(className){
-        this.className = className
+    ClassName
+    data={}
+    constructor(ClassName)
+    {
+        this.ClassName=ClassName
     }
+
     toPointer(){
-        return {"__type":"Pointer","className":this.className,"objectId":this.id}
+        return {"_type":"Pointer","ClassName":this.ClassName,"objectId":this.id}
     }
+    // 界面给data传数据
     set(json){
         Object.keys(json).forEach(key=>{
-            if(["objectId","id","createdAt","updatedAt","ACL"].indexOf(key)>-1){
-                return
+            if(["objectId","id","createdAt","updateAt","ACL"].indexOf(key)>-1)
+            {
+                return 
             }
-            this.data[key] = json[key]
+            this.data[key]=json[key]
         })
     }
-    get(key){
+    // data返回数据给界面
+    get(){
         return this.data[key] || null
     }
+
+    // data数据传给数据库,
+    // 增数据 数据库生成id,给id赋值,返回整个对象
+    // 改数据 修改非id数据,返回整个对象
     async save(){
-        let method = "POST"
-        let url = "http://dev.fmode.cn:1337/parse/classes/" + this.className
-        // 更新
-        if(this.id){
-            url += "/"+this.id
-            method = "PUT"
-        } 
-        let body = JSON.stringify(this.data)
-        let 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"
-          });
-          let result = await response?.json();
-          if(result?.error){
-            console.error(result?.error)
-          }
-          if(result?.objectId){this.id = result?.objectId}
-          return this
+        let url="http://dev.fmode.cn:1337/parse/classes/" +this.ClassName
+        let method="POST"
+        if(this.id)
+        {
+            method="PUT"
+            url+="/"+this.id
+        }
+
+        let body=JSON.stringify(this.data)
+        let 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"
+         });
+       let json= await response?.json();
+       if(json?.objectId){this.id=json?.objectId}
+       return this
     }
-    async destory(){
-        if(!this.id) return
-        let response = await fetch("http://dev.fmode.cn:1337/parse/classes/Doctor/"+this.id, {
+
+    // 通过数据库删除,再删除id里可能存在的数据
+    async destroy() {
+        if(!this.id)return 
+        let response=await fetch("http://dev.fmode.cn:1337/parse/classes/Post/"+this.id, {
             "headers": {
               "x-parse-application-id": "dev"
             },
@@ -58,108 +231,133 @@ class CloudObject{
             "mode": "cors",
             "credentials": "omit"
           });
-          let result = await response?.json();
-          if(result){
-            this.id = null
-        }
-        return true
+          let json=await response?.json()
+          if(json)this.id=null
+          return true;
     }
+
 }
+class CloudQuery
+{
+    ClassName
 
-class CloudQuery{
-    className
-    constructor(className){
-        this.className = className
+    constructor(ClassName)
+    {
+        this.ClassName=ClassName
     }
-
-    whereOptions = {}
-    greaterThan(key,value){
-        if(!this.whereOptions[key]) this.whereOptions[key] = {}
-        this.whereOptions[key]["$gt"] = value
+    
+    whereOptions={}
+    equalTo(key,value)
+    {
+        this.whereOptions[key]=value
     }
-    greaterThanAndEqualTo(key,value){
-        if(!this.whereOptions[key]) this.whereOptions[key] = {}
-        this.whereOptions[key]["$gte"] = value
+
+    greaterThan(key,value)
+    {
+        if(!this.whereOptions[key])this.whereOptions[key]={}
+        this.whereOptions[key]["$gt"]=value
     }
-    lessThan(key,value){
-        if(!this.whereOptions[key]) this.whereOptions[key] = {}
-        this.whereOptions[key]["$lt"] = value
+    greaterThanAndEqualTo(key,value)
+    {
+        if(!this.whereOptions[key])this.whereOptions[key]={}
+        this.whereOptions[key]["$gte"]=value
     }
-    lessThanAndEqualTo(key,value){
-        if(!this.whereOptions[key]) this.whereOptions[key] = {}
-        this.whereOptions[key]["$lte"] = value
+    lessThan(key,value)
+    {
+        if(!this.whereOptions[key])this.whereOptions[key]={}
+        this.whereOptions[key]["$lt"]=value
     }
-    equalTo(key,value){
-        this.whereOptions[key] = value
+    lessThanAndEqualTo(key,value)
+    {
+        if(!this.whereOptions[key])this.whereOptions[key]={}
+        this.whereOptions[key]["$lte"]=value
     }
 
-    async get(id){
-        let url = "http://dev.fmode.cn:1337/parse/classes/"+this.className+"/"+id+"?"
-
-        let response = await fetch(url, {
+    // 查询一个表中的特定id数据
+    async get(id)
+    {
+        let response=await fetch("http://dev.fmode.cn:1337/parse/classes/"+this.ClassName+"/"+id+"?", {
             "headers": {
-            "if-none-match": "W/\"1f0-ghxH2EwTk6Blz0g89ivf2adBDKY\"",
-            "x-parse-application-id": "dev"
+              "if-none-match": "W/\"ab-2gNtNZqRYX93fdbIaSj6z5h571k\"",
+              "x-parse-application-id": "dev"
             },
+    
             "body": null,
             "method": "GET",
             "mode": "cors",
             "credentials": "omit"
-        });
-        let json = await response?.json();
+          });
+        let json=await response?.json();
+        // console.log(json);
         return json || {}
     }
+ 
+    // 查询一个表中的所有数据,高级查询
     async find(){
-        let url = "http://dev.fmode.cn:1337/parse/classes/"+this.className+"?"
-        
-        if(Object.keys(this.whereOptions)?.length){
-            let whereStr = JSON.stringify(this.whereOptions)
-            url += `where=${whereStr}`
+        let url="http://dev.fmode.cn:1337/parse/classes/"+this.ClassName+"?"
+
+
+        if(Object.keys(this.whereOptions).length)
+        {
+            let whereStr=JSON.stringify(this.whereOptions)
+            url+=`where=${whereStr}`
         }
 
-        let response = await fetch(url, {
+        let response=await fetch(url, {
             "headers": {
-            "if-none-match": "W/\"1f0-ghxH2EwTk6Blz0g89ivf2adBDKY\"",
-            "x-parse-application-id": "dev"
+              "if-none-match": "W/\"ab-2gNtNZqRYX93fdbIaSj6z5h571k\"",
+              "x-parse-application-id": "dev"
             },
+
             "body": null,
             "method": "GET",
             "mode": "cors",
             "credentials": "omit"
-        });
-        let json = await response?.json();
+          });
+        let json=await response?.json();
+        // console.log(json);
         return json?.results || []
     }
     async first(){
-        let url = "http://dev.fmode.cn:1337/parse/classes/"+this.className+"?"
-        
-        if(Object.keys(this.whereOptions)?.length){
-            let whereStr = JSON.stringify(this.whereOptions)
-            url += `where=${whereStr}`
+        let url="http://dev.fmode.cn:1337/parse/classes/"+this.ClassName+"?"
+
+
+        if(Object.keys(this.whereOptions).length)
+        {
+            let whereStr=JSON.stringify(this.whereOptions)
+            url+=`where=${whereStr}`
         }
 
-        let response = await fetch(url, {
+        let response=await fetch(url, {
             "headers": {
-            "if-none-match": "W/\"1f0-ghxH2EwTk6Blz0g89ivf2adBDKY\"",
-            "x-parse-application-id": "dev"
+              "if-none-match": "W/\"ab-2gNtNZqRYX93fdbIaSj6z5h571k\"",
+              "x-parse-application-id": "dev"
             },
+
             "body": null,
             "method": "GET",
             "mode": "cors",
             "credentials": "omit"
-        });
-        let json = await response?.json();
-        let exists = json?.results?.[0] || null
-        if(exists){
-            let existsObject = new CloudObject(this.className)
+          });
+        let json=await response?.json();
+        // console.log(json);
+        let exists=json?.results?.[0] || null
+        if(exists)
+        {
+            let existsObject=new CloudObject(this.ClassName)
+
             existsObject.set(exists)
-            existsObject.id = exists.objectId
-            existsObject.createdAt = exists.createdAt
-            existsObject.updatedAt = exists.updatedAt
+            existsObject.id=exists.objectId
+            existsObject.createdAt=exists.createdAt
+            existsObject.updatedAt=exists.updatedAt
             return existsObject
         }
+       
     }
+
 }
 
-module.exports.CloudObject = CloudObject
-module.exports.CloudQuery = CloudQuery
+
+
+module.exports.CloudObject=CloudObject
+module.exports.CloudQuery=CloudQuery