schema.md 5.3 KB

一、Schema范式设计

发布帖子模块

  • 1. 模块功能 发布帖子模块允许用户分享他们的旅游经历、照片和建议。主要功能包括:

文本输入:用户可以输入帖子标题和内容,描述他们的旅行经历。 图片上传:用户可以上传多张旅行照片,增强帖子内容的吸引力。 位置标记:用户可以选择旅行目的地的地理位置,提供更具体的信息。 标签添加:用户可以为帖子添加相关标签(如“海滩”、“山脉”、“城市游”等),方便其他用户搜索。 隐私设置:用户可以选择帖子是公开可见,还是仅限好友可见。 预览功能:用户在发布前可以预览帖子效果,确保内容和格式符合期望。 发布和保存草稿:用户可以选择立即发布帖子或保存为草稿,以便后续编辑。

  1. 用户界面设计 发布帖子按钮:在首页或个人页面有一个明显的“发布帖子”按钮。
  • 发布帖子页面:

标题输入框:输入帖子标题。 内容输入框:富文本编辑器,支持文本格式化(如加粗、斜体、列表等)。 图片上传区域:拖放区域或“选择文件”按钮,支持多张图片上传。 位置选择:地图组件或下拉菜单,用户可以选择或搜索目的地。 标签输入框:可输入多个标签,使用逗号分隔。 隐私设置:选择框,用户可以选择公开或私密。 预览按钮:查看帖子发布后的效果。 发布和保存按钮:用户可以选择发布或保存为草稿。

表设计

为了设计一个符合规范的Parse Schema,我们需要创建几个表(Class),每个表将包含具体的字段。根据您描述的旅游App发布帖子模块,以下是所需的表及其字段的设计。

1. Parse Schema 设计

我们将创建以下几个表:

  • User:用户表,用于存储用户信息。
  • Post:帖子表,用于存储用户发布的帖子信息。
  • Image:图片表,用于存储与帖子相关的图片信息。
  • Tag:标签表,用于存储标签信息。

2. 表结构及字段设计

User 表

  • 表名:User
  • 字段
    • objectId (默认字段)
    • createdAt (默认字段)
    • username (String) - 用户名
    • email (String) - 用户邮箱
    • profilePicture (File) - 用户头像

Post 表

  • 表名:Post
  • 字段
    • objectId (默认字段)
    • createdAt (默认字段)
    • title (String) - 帖子标题
    • content (String) - 帖子内容
    • location (GeoPoint) - 帖子位置
    • privacy (String) - 帖子隐私设置(公开/私密)
    • user (Pointer) - 发布用户(外键关联到User表)
    • tags (Array>) - 帖子标签(外键关联到Tag表)
    • images (Array>) - 帖子图片(外键关联到Image表)
    • Image 表

      • 表名:Image
      • 字段
        • objectId (默认字段)
        • createdAt (默认字段)
        • url (String) - 图片URL
        • post (Pointer) - 关联的帖子(外键关联到Post表)
      • Tag 表

        • 表名:Tag
        • 字段
          • objectId (默认字段)
          • createdAt (默认字段)
          • name (String) - 标签名称

        3. PlantUML 类图表示

        以下是使用PlantUML表示的类图,展示了各个表及其字段和关系:

        @startuml
        
        class User {
            +objectId: String //唯一标识符
            +createdAt: Date
            +username: String
            +email: String
            +profilePicture: File
        }
        
        class Post {
            +objectId: String
            +createdAt: Date
            +title: String
            +content: String
            +location: GeoPoint
            +privacy: String
            +user: Pointer<User>
            +tags: Array<Pointer<Tag>>
            +images: Array<Pointer<Image>>
        }
        
        class Image {
            +objectId: String
            +createdAt: Date
            +url: String
            +post: Pointer<Post>
        }
        
        class Tag {
            +objectId: String
            +createdAt: Date
            +name: String
        }
        
        User "1" -- "0..*" Post : has
        Post "1" -- "0..*" Image : contains
        Post "0..*" -- "0..*" Tag : tagged with
        
        @enduml
        

        4. 设计范式说明

        • 第一范式:所有字段都是原子性的,表中没有重复的列。
        • 第二范式:所有非主键字段都完全依赖于主键,确保没有部分依赖。
        • 第三范式:没有传递依赖,所有非主键字段都直接依赖于主键。

          @startuml
          class User {
          - userId: int
          - username: String
          - password: String
          + postComment(ScenicSpot spot, String content)
          + giveFeedback(Feedback feedback)
          + subscribe(ScenicSpot spot)
          }
          
          class ScenicSpot {
          - spotId: int
          - spotName: String
          - location: String
          + addPost(Post post)
          }
          
          class Post {
          - postId: int
          - content: String
          - postTime: Date
          + publishAnnouncement(ScenicSpot spot, String content)
          }
          
          class Feedback {
          - feedbackId: int
          - feedbackContent: String
          - feedbackTime: Date
          }
          
          class Subscription {
          - subscriptionId: int
          - user: User
          - scenicSpot: ScenicSpot
          }
          
          class WeatherService {
          + getWeather(ScenicSpot spot)
          }
          
          class AGIPlanner {
          + generateItinerary(User user, ScenicSpot[] spots)
          }
          
          User "1" *-- "0..*" Post
          User "1" *-- "0..*" Feedback
          User "1" *-- "0..*" Subscription
          ScenicSpot "1" *-- "0..*" Post
          Subscription "1" *-- "1" User
          Subscription "1" *-- "1" ScenicSpot
          WeatherService -- ScenicSpot
          AGIPlanner -- User
          AGIPlanner -- ScenicSpot
          @enduml