刘嘉轩 7 mesi fa
parent
commit
24dbbc265b
2 ha cambiato i file con 450 aggiunte e 46 eliminazioni
  1. 52 46
      smarteat-app/src/app/page-edit/page-edit.component.ts
  2. 398 0
      smarteat-prod/schema.md

+ 52 - 46
smarteat-app/src/app/page-edit/page-edit.component.ts

@@ -11,77 +11,88 @@ import { FormsModule } from '@angular/forms';
   standalone: true,
 })
 export class PageEditComponent implements OnInit {
-
-  // 基本信息字段
+  
+  // 初始化表单字段
   name: string = '';
   email: string = '';
   phone: string = '';
   address: string = '';
-
-  // 饮食规划相关字段
   age: number | null = null;
   gender: string = '';
   height: number | null = null;
   weight: number | null = null;
   activityLevel: string = '';
   dietPreference: string = '';
-
-  // 新增饮食群体字段
-  dietGroup: string = '';  // 新添加的字段
-
-  // 头像字段
+  dietGroup: string = '';
   avatar: string | null = null;
 
   // 正则表达式
   emailPattern = /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}$/;
-  phonePattern = /^[0-9]{10,15}$/; // 允许10到15位数字
-  heightPattern = /^[1-9][0-9]{1,2}$/; // 身高通常是两位或三位数字
-  weightPattern = /^[1-9][0-9]{1,2}$/; // 体重大致是两位或三位数字
+  phonePattern = /^[0-9]{10,15}$/;
+  heightPattern = /^[1-9][0-9]{1,2}$/;
+  weightPattern = /^[1-9][0-9]{1,2}$/;
 
   constructor(private modalCtrl: ModalController) {}
 
   ngOnInit(): void {
-    // 可以在这里进行初始化,或者加载初始值
+    this.loadSavedData();  // 加载上次保存的数据
+  }
+
+  // 加载上次保存的数据
+  loadSavedData() {
+    const savedData = JSON.parse(localStorage.getItem('userData') || '{}');
+
+    if (savedData) {
+      // 使用本地存储的数据填充表单
+      this.name = savedData.name || '';
+      this.email = savedData.email || '';
+      this.phone = savedData.phone || '';
+      this.address = savedData.address || '';
+      this.age = savedData.age || null;
+      this.gender = savedData.gender || '';
+      this.height = savedData.height || null;
+      this.weight = savedData.weight || null;
+      this.activityLevel = savedData.activityLevel || '';
+      this.dietPreference = savedData.dietPreference || '';
+      this.dietGroup = savedData.dietGroup || '';
+      this.avatar = savedData.avatar || null;
+    }
+  }
+
+  // 保存数据至本地存储
+  saveData() {
+    const userData = {
+      name: this.name,
+      email: this.email,
+      phone: this.phone,
+      address: this.address,
+      age: this.age,
+      gender: this.gender,
+      height: this.height,
+      weight: this.weight,
+      activityLevel: this.activityLevel,
+      dietPreference: this.dietPreference,
+      dietGroup: this.dietGroup,
+      avatar: this.avatar
+    };
+    localStorage.setItem('userData', JSON.stringify(userData)); // 将数据保存至本地
   }
 
-  // 取消操作,关闭模态框
   cancel() {
     return this.modalCtrl.dismiss(null, 'cancel');
   }
 
-  // 确认操作,关闭模态框并返回数据
   confirm() {
-    // 验证表单输入
+    // 验证表单内容是否完整
     if (!this.name || !this.email || !this.phone || !this.age || !this.gender || !this.height || !this.weight || !this.dietPreference || !this.dietGroup) {
       alert("请确保所有必填项已填写!");
       return;
     }
 
-    // 验证邮箱格式
-    if (!this.emailPattern.test(this.email)) {
-      alert("请输入有效的邮箱地址!");
-      return;
-    }
-
-    // 验证电话格式
-    if (!this.phonePattern.test(this.phone)) {
-      alert("请输入有效的电话号码!");
-      return;
-    }
-
-    // 验证身高
-    if (!this.heightPattern.test(String(this.height))) {
-      alert("请输入有效的身高!");
-      return;
-    }
-
-    // 验证体重
-    if (!this.weightPattern.test(String(this.weight))) {
-      alert("请输入有效的体重!");
-      return;
-    }
+    // 保存用户输入的数据
+    this.saveData();
 
-    // 打包所有的用户输入数据
+    // 返回数据给父组件
     const userData = {
       name: this.name,
       email: this.email,
@@ -93,34 +104,29 @@ export class PageEditComponent implements OnInit {
       weight: this.weight,
       activityLevel: this.activityLevel,
       dietPreference: this.dietPreference,
-      dietGroup: this.dietGroup,  // 包含饮食群体
+      dietGroup: this.dietGroup,
       avatar: this.avatar
     };
 
-    // 通过 modalCtrl 传递数据
     return this.modalCtrl.dismiss(userData, 'confirm');
   }
 
-  // 头像上传逻辑
   uploadAvatar() {
     const input = document.createElement('input');
     input.type = 'file';
     input.accept = 'image/*';
 
-    // 监听文件选择
     input.onchange = (event: any) => {
       const file = event.target.files[0];
       if (file) {
         const reader = new FileReader();
         reader.onload = (e: any) => {
-          // 设置头像
           this.avatar = e.target.result;
         };
         reader.readAsDataURL(file);
       }
     };
 
-    // 触发文件选择
     input.click();
   }
 }

+ 398 - 0
smarteat-prod/schema.md

@@ -0,0 +1,398 @@
+# 慧吃应用UML编写
+
+## 饮食规划模块及规划执行模块
+- 这是一个饮食规划模块和规划执行模块的数据库结构。以下是符合设计范式的Parse Schema,包括饮食规划表和执行记录表。
+- 模块描述
+    - 根据用户的饮食需求和饮食目标,生成的整个饮食规划,饮食规划中包含一周中每日具体的饮食内容。
+- 模块描述
+    - 记录一周中每日饮食内容、每日真实饮食情况、和每日饮食感受。
+    - 每日饮食内容包括每餐的饮食时间、食物种类、食物分量。
+    - 执行状态 
+        - 完美完成每日规划饮食内容,饮食感受
+        - 每日真实的饮食情况,饮食感受
+
+### 1. 表设计
+
+#### 用户表 (_User)
+- **objectId**: String (唯一标识符)
+- **createdAt**: Date (创建时间)
+- **username**: String (用户名)
+- **email**: String (用户邮箱)
+- **password**: String (用户密码,需加密存储)
+- **profilePicture**: String (用户头像,可选)
+
+#### 饮食规划表 (MealPlan)
+- **objectId**: String (唯一标识符)
+- **createdAt**: Date (创建时间)
+- **user**: Pointer<_User> (外键关联用户表)
+- **startDate**: Date (规划开始日期)
+- **endDate**: Date (规划结束日期)
+- **Plan**: Array<DailyPlan> (包含一周的每日饮食计划)
+- **planDetails**: String (饮食规划的营养目标、饮食建议、注意事项等相关内容)
+
+##### DailyPlan (嵌套类型)
+- **date**: Date (日期)
+- **meals**: Array<Meal> (包含当天的所有餐食)
+
+###### Meal (嵌套类型)
+- **mealTime**: String (餐食时间)
+- **foodItems**: Array<FoodItem> (包含多种食物)
+
+###### FoodItem (嵌套类型)
+- **foodType**: String (食物种类)
+- **portion**: String (食物分量)
+
+#### 规划执行表 (MealExecution)
+- **objectId**: String (唯一标识符)
+- **createdAt**: Date (创建时间)
+- **mealPlan**: Pointer<MealPlan> (外键关联饮食规划表)
+- **executionDate**: Date (执行日期)
+- **dailyIntake**: Array<DailyIntake> (包含每天的真实饮食情况)
+- **executionStatus**: String (执行状态,例如“完美完成”、“未完成”等)
+- **dailyFeedback**: String (每日饮食感受)
+
+##### DailyIntake (嵌套类型)
+- **date**: Date (日期)
+- **meals**: Array<MealIntake> (包含当天的所有餐食)
+
+###### MealIntake (嵌套类型)
+- **mealTime**: String (餐食时间)
+- **foodItems**: Array<FoodItemIntake> (包含多种食物)
+
+###### FoodItemIntake (嵌套类型)
+- **foodType**: String (食物种类)
+- **portion**: String (食物分量)
+
+### 2. PlantUML 类图
+
+- 以下是完整的 PlantUML 类图,表示上述表结构:
+
+```plantuml
+@startuml
+
+class _User {
+    +objectId: String
+    +createdAt: Date
+    +username: String
+    +email: String
+    +password: String
+    +profilePicture: String
+}
+
+class MealPlan {
+    +objectId: String
+    +createdAt: Date
+    +user: Pointer<_User>
+    +startDate: Date
+    +endDate: Date
+    +Plan: Array<DailyPlan>
+    +planDetails: String
+}
+
+class DailyPlan {
+    +date: Date
+    +meals: Array<Meal>
+}
+
+class Meal {
+    +mealTime: String
+    +foodItems: Array<FoodItem>
+}
+
+class FoodItem {
+    +foodType: String
+    +portion: String
+}
+
+class MealExecution {
+    +objectId: String
+    +createdAt: Date
+    +mealPlan: Pointer<MealPlan>
+    +executionDate: Date
+    +dailyIntake: Array<DailyIntake>
+    +executionStatus: String
+    +dailyFeedback: String
+}
+
+class DailyIntake {
+    +date: Date
+    +meals: Array<MealIntake>
+}
+
+class MealIntake {
+    +mealTime: String
+    +foodItems: Array<FoodItemIntake>
+}
+
+class FoodItemIntake {
+    +foodType: String
+    +portion: String
+}
+
+_User "1" -- "0..*" MealPlan : creates >
+MealPlan "1" -- "0..*" MealExecution : linked to >
+MealExecution "1" -- "0..*" DailyIntake : records >
+DailyIntake "1" -- "0..*" MealIntake : includes >
+
+@enduml
+```
+
+### 3. 设计说明
+
+- **用户表 (_User)**:存储用户的基本信息,包括用户名、邮箱和密码等。
+- **饮食规划表 (MealPlan)**:存储饮食规划,包括用户、规划的开始和结束日期,以及一周的每日饮食计划和详细信息。
+  - **Plan** 字段包含多个 **DailyPlan**,每个 **DailyPlan** 包含当天的饮食安排。
+- **规划执行表 (MealExecution)**:记录用户的实际饮食情况,包括与饮食规划的关联、执行日期、每日真实饮食情况和饮食感受。
+  - **dailyIntake** 字段包含多个 **DailyIntake**,每个 **DailyIntake** 包含当天的实际饮食情况。
+
+### 4. 约束与索引
+
+- 在 **MealPlan** 表的 `startDate` 和 `endDate` 字段上可以添加索引,以便于查询特定时间段的饮食规划。
+- 在 **MealExecution** 表的 `executionDate` 字段上可以添加索引,以便于查询特定日期的执行记录。
+- 在 **_User** 表的 `username` 和 `email` 字段上可以添加唯一性约束,以防止重复注册。
+
+- 通过这样的设计,饮食规划模块能够有效地支持用户的饮食管理需求,同时确保数据结构的灵活性和可扩展性。
+
+## 打卡签到模块
+- 模块描述
+    - 这是一个用于记录用户打卡签到及饮食感受的数据库结构。以下是一个符合设计范式的Parse Schema,包括用户表和打卡记录表。用户表是_User表,用户每日登录后,可以打卡签到,记录用户的登录时间,且每日只能打卡一次,打卡可以反馈当天的饮食感受。
+
+### 1. 表设计
+
+#### 用户表 (_User)
+- **objectId**: 唯一标识符
+- **createdAt**: 创建时间
+- **username**: 用户名
+- **email**: 用户邮箱
+- **password**: 用户密码(加密存储)
+- **profilePicture**: 用户头像(可选)
+
+#### 打卡记录表 (CheckIn)
+- **objectId**: 唯一标识符
+- **createdAt**: 创建时间
+- **user**: Pointer<_User> (外键关联用户表)
+- **checkInDate**: 打卡日期(唯一性约束)
+- **foodFeedback**: 饮食感受
+
+### 2. PlantUML 类图表示
+
+以下是使用PlantUML表示的类图:
+
+```plantuml
+@startuml
+
+class _User {
+    +objectId: String
+    +createdAt: Date
+    +username: String
+    +email: String
+    +password: String
+    +profilePicture: String
+}
+
+class CheckIn {
+    +objectId: String
+    +createdAt: Date
+    +user: Pointer<_User>
+    +checkInDate: Date
+    +foodFeedback: String
+}
+
+_User "1" -- "0..*" CheckIn : has >
+
+@enduml
+```
+
+### 3. 设计说明
+
+- **_User 表**:存储用户的基本信息,包括用户名、邮箱和密码等。
+- **CheckIn 表**:记录用户的打卡信息,每个用户可以有多个打卡记录,但每个用户在同一天只能有一条打卡记录。通过 `user` 字段与 `_User` 表建立外键关联。
+- **checkInDate** 字段用于记录打卡日期,可以设定为唯一,以确保用户在同一天只能打卡一次。
+
+### 4. 约束与索引
+
+- 在 `CheckIn` 表的 `checkInDate` 字段上可以添加唯一性约束,以确保同一用户在同一天只能打卡一次。
+- 可以为 `username` 和 `email` 字段添加唯一性约束,以防止重复注册。
+
+这样设计的数据库结构可以有效支持用户的打卡功能及饮食感受的记录,同时遵循了数据库设计的基本范式。
+
+# 二、业务逻辑描述
+## 饮食规划生成逻辑
+- 用户在app中,通过文本生成整个饮食规划
+    - 数据采集
+        - 用户输入:饮食的饮食需求
+        - 用户体征:性别、年龄、体重、身高、饮食偏好、饮食群体等
+    - 文本生成
+    - 结果存储
+        - MealPlan
+            - 规划描述 planDetails 该字段用于存储饮食规划的详细内容,可以是一个字符串,包含关于饮食计划的更多信息,比如营养目标、饮食建议、注意事项等。
+- 根据饮食需求和目标,排期生成每日饮食规划
+    - 数据来源
+        - 规划描述 planDetails
+    - 文本生成
+        - 以json格式输出,附带规划开始日期(该日期为当日日期)。
+    - 生成结果:mealList
+        - 遍历数组,向Meal表逐个插入数据。
+以下是针对减肥目标的饮食计划的 JSON 格式的 Array 数组测试数据,包含多种食物以确保营养均衡。
+``` json
+[
+    {
+        "mealTime": "早餐",
+        "foodItems": [
+            {
+                "foodType": "燕麦粥",
+                "portion": "50克"
+            },
+            {
+                "foodType": "鸡蛋白",
+                "portion": "2个"
+            },
+            {
+                "foodType": "蓝莓",
+                "portion": "30克"
+            }
+        ]
+    },
+    {
+        "mealTime": "午餐",
+        "foodItems": [
+            {
+                "foodType": "蒸鸡胸肉",
+                "portion": "150克"
+            },
+            {
+                "foodType": "西兰花",
+                "portion": "100克"
+            },
+            {
+                "foodType": "糙米饭",
+                "portion": "100克"
+            },
+            {
+                "foodType": "胡萝卜",
+                "portion": "50克"
+            }
+        ]
+    },
+    {
+        "mealTime": "晚餐",
+        "foodItems": [
+            {
+                "foodType": "清蒸鱼",
+                "portion": "150克"
+            },
+            {
+                "foodType": "黄瓜沙拉",
+                "portion": "200克"
+            },
+            {
+                "foodType": "番茄",
+                "portion": "100克"
+            }
+        ]
+    },
+    {
+        "mealTime": "加餐",
+        "foodItems": [
+            {
+                "foodType": "坚果",
+                "portion": "一小把"
+            },
+            {
+                "foodType": "低脂酸奶",
+                "portion": "150毫升"
+            },
+            {
+                "foodType": "苹果",
+                "portion": "1个"
+            }
+        ]
+    }
+]
+
+Language:json
+数据说明
+早餐:包含燕麦粥、鸡蛋白和蓝莓,提供复合碳水化合物、蛋白质和抗氧化剂。
+午餐:蒸鸡胸肉、西兰花、糙米饭和胡萝卜,提供高蛋白、纤维和维生素。
+晚餐:清蒸鱼、黄瓜沙拉和番茄,低脂肪且富含维生素和水分。
+加餐:坚果、低脂酸奶和苹果,提供健康脂肪、蛋白质和纤维。
+```
+
+# 规划执行的逻辑
+- 用户在TodoList页面,加载所有计划和子任务
+    - 用户主动填写执行情况并提交
+        - 数据存储
+            -  MealExecution记录每次用户执行情况提交的数据。
+# 计划的完成和统计分析
+- 连表查询,分析用户计划完成的总体情况和进度
+
+# 饮食规划业务逻辑图例
+
+### 1. 饮食规划生成逻辑时序图
+
+```plantuml
+@startuml
+
+actor User
+participant App
+participant "MealPlan" as MealPlanDB
+participant "DailyPlan" as DailyPlanDB
+participant "Meal" as MealDB
+
+User -> App : 输入饮食需求
+User -> App : 输入个人体征(性别、年龄、体重、身高、饮食偏好等)
+App -> App : 数据采集
+App -> App : 生成饮食规划文本
+App -> MealPlanDB : 存储饮食规划(planDetails)
+App -> App : 生成每日饮食规划
+App -> MealDB : 遍历数组,插入每个Meal
+
+@enduml
+```
+
+### 2. 规划执行逻辑时序图
+
+```plantuml
+@startuml
+
+actor User
+participant App
+participant "MealExecution" as MealExecutionDB
+participant "DailyIntake" as DailyIntakeDB
+
+User -> App : 加载TodoList页面
+App -> MealExecutionDB : 查询所有计划和子任务
+App -> User : 显示计划和子任务
+User -> App : 填写执行情况并提交
+App -> MealExecutionDB : 存储执行情况
+App -> DailyIntakeDB : 更新每日饮食情况
+
+@enduml
+```
+
+### 3. 计划的完成和统计分析时序图
+
+```plantuml
+@startuml
+
+actor User
+participant App
+participant "MealExecution" as MealExecutionDB
+participant "统计分析" as Analytics
+
+User -> App : 请求计划完成情况
+App -> MealExecutionDB : 连表查询用户计划完成情况
+App -> Analytics : 统计分析用户进度
+Analytics -> App : 返回统计结果
+App -> User : 显示计划完成情况和进度
+
+@enduml
+```
+
+### 4. 饮食规划业务逻辑图例
+
+将以上时序图组合在一起,可以形成完整的饮食规划业务逻辑图例。每个时序图展示了用户与应用程序之间的交互,以及后端数据库的操作。
+
+### 总结
+
+这些时序图清晰地展示了用户在饮食规划生成、规划执行和计划完成统计分析过程中的交互逻辑。可以帮助团队更好地理解系统的工作流程,从而在开发和优化过程中提供指导。