刘嘉轩 7 сар өмнө
parent
commit
162ed7e7a3

+ 2 - 3
smarteat-prod/schema.md

@@ -172,7 +172,6 @@ DailyIntake "1" -- "0..*" MealIntake : includes >
 - **createdAt**: 创建时间
 - **user**: Pointer<_User> (外键关联用户表)
 - **checkInDate**: 打卡日期(唯一性约束)
-- **foodFeedback**: 饮食感受
 
 ### 2. PlantUML 类图表示
 
@@ -195,7 +194,6 @@ class CheckIn {
     +createdAt: Date
     +user: Pointer<_User>
     +checkInDate: Date
-    +foodFeedback: String
 }
 
 _User "1" -- "0..*" CheckIn : has >
@@ -395,4 +393,5 @@ App -> User : 显示计划完成情况和进度
 
 ### 总结
 
-这些时序图清晰地展示了用户在饮食规划生成、规划执行和计划完成统计分析过程中的交互逻辑。可以帮助团队更好地理解系统的工作流程,从而在开发和优化过程中提供指导。
+这些时序图清晰地展示了用户在饮食规划生成、规划执行和计划完成统计分析过程中的交互逻辑。可以帮助团队更好地理解系统的工作流程,从而在开发和优化过程中提供指导。
+

+ 103 - 0
smarteat-server/lib/ncloud.js

@@ -0,0 +1,103 @@
+class CloudObject{//创建
+    id
+    className
+    data
+    constructor(className){
+        this.className=className
+        this.data={}
+    }
+    set(json){
+        object.keys(json).forEach(key=>{
+            if(["objectId","id","createAt","updatedAt","ACL"].indexOf(key)>-1){
+                return
+            }
+            this.data[key]=json[key]
+        })
+    }
+    get(key){
+        return this.data[key] || null
+    }
+    async save(){
+        let method = this.id ? "PUT" : "POST";  // 如果有id则为PUT,否则为POST
+        let url="http://dev.fmode.cn:1337/parse/classes/"+this.className
+        if(this.id){
+            url=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": "POST",
+        "mode": "cors",
+        "credentials": "omit"
+      });
+      let result = await response?.json();
+      if(result?.objectId){
+        this.id=result?.objectId
+      }
+      return this
+    }
+    async destory(){
+        let url = "http://dev.fmode.cn:1337/parse/classes/" + this.className + "/";
+        if(!this.id) return
+        let response = await fetch(url+this.id, {
+            "headers": {
+              "x-parse-application-id": "dev"
+            },
+            "body": null,
+            "method": "DELETE",
+            "mode": "cors",
+            "credentials": "omit"
+          });
+          let result=response?.json();
+          if(result){
+            this.id=null
+          }
+          return true
+    }
+}
+
+
+class CloudQuery{//查询
+    className
+    constructor(className){
+        this.className=className
+    }
+    
+    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"
+            },
+            "body": null,
+            "method": "GET",
+            "mode": "cors",
+            "credentials": "omit"
+        });
+        let json = await response?.json();
+        return json || {}
+    }
+    async find(){
+        let response = await fetch("http://dev.fmode.cn:1337/parse/classes/"+this.className+"?", {
+            "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 results = await this.find();
+        return results.length > 0 ? results[0] : null;
+    }
+}

+ 0 - 0
smarteat-server/migration/import-data.js