#AI智能食谱推荐助手

#数据范式设计

您是一名专业的数据库工程师，熟悉PostgreSQL数据库和ParseServer，请注意表名用大驼峰，字段小驼峰，有预留字段：objectId，updatedAt，createdAt。
关于ParseServer中断 数据类的描述，字段主要类型有
String => String
Number => Number
Bool => bool
Array => JSON Array
Object => JSON Object
Date => Date
File => Parse.File
Pointer => other Parse.Object
Relation => Parse.Relation
Null => null
GeoPoint => {latitude: 40.0, longitude: -30.0}

#项目需求
我需要一个食谱推荐系统，需要有食谱表，食谱分类表（中式菜系，西式料理，减脂轻食，甜点烘培，汤羹粥品，素食主义），每日推荐（每日推荐3个）

#输出结果（UML类图）
请您帮我用plantuml的类图描述设计好的几张表及其关系
#输出结果(信息结构图)
请您帮我用markmap格式表示上卖弄的信息结构图
#输出结果(SQL语句)
请您帮我用sql格式给我建表语句和测试数据插入语句
我需要一个食谱推荐系统，需要有用户，食谱表，食谱分类表（中式菜系，西式料理，减脂轻食，甜点烘培，汤羹粥品，素食主义），每日推荐（每日推荐3个），AI对话，收藏，浏览记录，用户信息等功能。请您帮我设计好这些表的字段，表之间的关系，以及表之间的关系描述。




#UML类图
```plantuml
@startuml AI智能食谱推荐助手数据库结构

class User {
  + objectId: String
  + username: String
  + password: String
  + email: String
  + avatar: Parse.File
  + createdAt: Date
  + updatedAt: Date
}

class DishCategory {
  + objectId: String
  + categoryName: String
  + description: String
  + coverImage: Parse.File
  + createdAt: Date
  + updatedAt: Date
}

class Recipe {
  + objectId: String
  + recipeName: String
  + ingredients: [String]
  + steps: [String]
  + cookingTime: Number
  + calorie: Number
  + coverImage: Parse.File
  + tags: [String]
  + createdAt: Date
  + updatedAt: Date
}

class UserFavorite {
  + objectId: String
  + createdAt: Date
  + updatedAt: Date
}

class UserHistory {
  + objectId: String
  + viewTime: Date
  + createdAt: Date
  + updatedAt: Date
}

class DailyRecommendation {
  + objectId: String
  + recommendDate: Date
  + recommendType: String
  + createdAt: Date
  + updatedAt: Date
}

class NutritionExpert {
  + objectId: String
  + expertName: String
  + specialty: String
  + description: String
  + avatar: Parse.File
  + createdAt: Date
  + updatedAt: Date
}

class AIConversation {
  + objectId: String
  + chatHistory: [Object]
  + lastActive: Date
  + createdAt: Date
  + updatedAt: Date
}

' 关系定义
User "1" *-- "many" UserFavorite : has
Recipe "1" *-- "many" UserFavorite : isFavoritedBy

User "1" *-- "many" UserHistory : has
Recipe "1" *-- "many" UserHistory : isViewedBy

DishCategory "1" *-- "many" Recipe : contains

DailyRecommendation "1" *-- "3" Recipe : recommends

User "1" *-- "many" AIConversation : has
NutritionExpert "1" *-- "many" AIConversation : participatesIn

@enduml

```

#UML时序图
#登录时序图
```plantuml
@startuml 用户登录登出时序图（简化版）

actor 用户
participant "登录界面" as UI
participant "认证控制器" as AuthCtrl
participant "用户服务" as UserService

== 登录流程 ==
用户 -> UI : 点击"一键登录"
UI -> AuthCtrl : requestQuickLogin()
AuthCtrl -> UserService : verifyDeviceToken()
alt 验证成功
    UserService --> AuthCtrl : 返回用户数据\n(objectId,username,avatar)
    AuthCtrl -> UI : redirectToHome()
    UI -> 用户 : 显示主界面
else 验证失败
    UserService --> AuthCtrl : 返回错误码\n(401)
    AuthCtrl -> UI : showToast("登录失效")
    UI -> 用户 : 停留登录页
end

== 登出流程 ==
用户 -> UI : 点击"退出"按钮
UI -> AuthCtrl : triggerLogout()
AuthCtrl -> UserService : clearAuthToken()
UserService --> AuthCtrl : 操作成功(200)
AuthCtrl -> UI : resetLoginState()
UI -> 用户 : 跳转至登录页

@enduml
```

#食谱浏览时序图
```plantuml
@startuml 食谱浏览时序图

actor 用户
participant "浏览界面" as UI
participant "食谱控制器" as RecipeCtrl
participant "食谱服务" as RecipeService
database "分类数据库" as CategoryDB

== 分类浏览 ==
用户 -> UI : 选择分类标签
UI -> RecipeCtrl : loadByCategory(categoryId)
RecipeCtrl -> CategoryDB : getRecipes(categoryId)
CategoryDB --> RecipeCtrl : List<Recipe>
RecipeCtrl -> UI : renderRecipeCards()
UI -> 用户 : 显示分类食谱

== 模糊搜索 ==
用户 -> UI : 输入关键词
UI -> RecipeCtrl : search(keyword)
RecipeCtrl -> RecipeService : fuzzySearch(keyword)
RecipeService --> RecipeCtrl : List<Recipe>
RecipeCtrl -> UI : renderSearchResults()
UI -> 用户 : 显示搜索结果

@enduml
```
#每日推荐时序图
```plantuml
@startuml 每日推荐时序图

actor 用户
participant "推荐界面" as UI
participant "推荐控制器" as RecCtrl
participant "推荐引擎" as RecEngine
database "用户画像" as UserProfile

用户 -> UI : 点击"今日推荐"
UI -> RecCtrl : getDailyRecommendations()
RecCtrl -> UserProfile : getUserPreferences()
UserProfile --> RecCtrl : 用户偏好数据
RecCtrl -> RecEngine : generateRecommendations()
RecEngine --> RecCtrl : [Recipe1, Recipe2, Recipe3]
RecCtrl -> UI : displayRecipes()
UI -> 用户 : 展示3个推荐菜谱

@enduml
```

#AI营养咨询时序图
```plantuml
@startuml AI营养咨询时序图

actor 用户
participant "咨询界面" as UI
participant "咨询控制器" as AICtrl
participant "AI服务" as AIService
database "专家数据库" as ExpertDB

== 选择营养师 ==
用户 -> UI : 进入咨询页
UI -> AICtrl : loadAvailableExperts()
AICtrl -> ExpertDB : getAllExperts()
ExpertDB --> AICtrl : List<NutritionExpert>
AICtrl -> UI : showExpertSelection()
UI -> 用户 : 显示专家列表

== 咨询对话 ==
用户 -> UI : 选择专家并提问
UI -> AICtrl : sendQuestion(question, expertId)
AICtrl -> AIService : processQuestion(question, expertId)
AIService -> AIService : 生成营养建议
AIService --> AICtrl : AIResponse
AICtrl -> UI : updateChatHistory()
UI -> 用户 : 显示AI回复

@enduml
```

#用户收藏时序图
```plantuml
@startuml 用户历史记录查看时序图

actor 用户
participant "我的页面" as MyPage
participant "历史记录页面" as HistoryPage
participant "食谱详情页" as DetailPage
participant "历史记录控制器" as HistoryCtrl
participant "食谱服务" as RecipeService

== 历史记录浏览 ==
用户 -> MyPage : 点击"历史记录"
MyPage -> HistoryCtrl : 请求历史记录列表
HistoryCtrl -> RecipeService : 获取用户浏览历史(userId)
RecipeService --> HistoryCtrl : 返回[Recipe1,Recipe2,...]
HistoryCtrl -> HistoryPage : 渲染历史列表
HistoryPage -> 用户 : 显示带封面的食谱卡片

== 查看详情 ==
用户 -> HistoryPage : 点击某个食谱卡片
HistoryPage -> HistoryCtrl : 请求食谱详情(recipeId)
HistoryCtrl -> RecipeService : 获取完整食谱数据(recipeId)
RecipeService --> HistoryCtrl : 返回食谱详情+步骤+营养数据
HistoryCtrl -> DetailPage : 渲染详情页
DetailPage -> 用户 : 展示:\n- 封面图\n- 食材表\n- 烹饪步骤\n- 营养信息

@enduml
```

#个人中心时序图
```plantuml
@startuml 个人中心时序图

actor 用户
participant "个人中心界面" as UI
participant "用户控制器" as UserCtrl
participant "数据服务" as DataService
database "用户数据" as UserDB

用户 -> UI : 访问个人中心
UI -> UserCtrl : loadUserDashboard()
UserCtrl -> DataService : getUserData(userId)
DataService -> UserDB : 查询[资料+收藏+历史]
UserDB --> DataService : 组合数据
DataService --> UserCtrl : UserDashboardDTO
UserCtrl -> UI : renderDashboard()
UI -> 用户 : 展示:\n1. 个人信息\n2. 收藏列表\n3. 浏览历史

== 编辑资料 ==
用户 -> UI : 点击"编辑资料"
UI -> UserCtrl : requestEditForm()
UserCtrl -> DataService : getEditableFields(userId)
DataService --> UserCtrl : 可编辑字段
UserCtrl -> UI : showEditForm()
UI -> 用户 : 显示编辑表单

@enduml
```

#信息结构图
```markdown