# 社区分享模块描述
## 作品展示与交流模块
***功能描述***

该模块为用户提供一个平台，用于展示和交流在课程学习过程中完成的作品。用户可以上传各种类型的作品（如绘画、手工艺、编程代码、摄影等），并与其他用户进行互动。

***主要功能***

1、**作品上传**

- 用户可以通过简单的界面上传自己的作品。
- 支持多种文件格式和类型，确保多样性。

2、**作品分类**

- 作品根据类型进行分类（如绘画、手工艺、编程、摄影等），方便用户浏览。
- 每个分类下可以显示最新作品和热门作品。

3、**浏览与互动**

- 用户可以浏览其他用户的作品，并进行点赞、评论。
- 提供搜索功能，用户可以根据关键词快速找到感兴趣的作品。

4、**热门作品推荐**

- 系统根据点赞和评论数量，推荐热门作品给用户，提升作品曝光率。
## 学习经验分享模块
***功能描述***
- 该模块鼓励用户分享自己的学习经验和技巧，促进用户之间的知识交流和互助。

***主要功能***

1、**经验分享发布**

- 用户可以发布文字帖子、图片或视频，分享学习心得、技巧等。
- 提供编辑器，支持基本的文本格式化。

2、**经验浏览与互动**

- 用户可以浏览其他用户的分享内容，进行点赞和评论。
- 提供分类标签，用户可以根据主题快速找到相关经验分享。

3、**困难与解决方案分享**

- 用户可以分享在学习过程中遇到的困难以及解决方法，促进经验的传承和交流。

4、**学习成果展示**

- 用户可以分享学习成果，展示自己的进步和成就，激励其他用户。

# 具体范式设计
## Parse Schema 设计
1、**作品表 (Artwork)**

- objectId: 唯一标识符
- userId: 上传用户的ID
- title: 作品标题
- description: 作品描述
- category: 作品分类
- fileUrl: 作品文件链接
- likesCount: 点赞数量
- commentsCount: 评论数量
- createdAt: 创建时间
- updatedAt: 更新时间

2、**评论表 (Comment)**

- objectId: 唯一标识符
- artworkId: 关联的作品ID
- userId: 评论用户的ID
- content: 评论内容
- createdAt: 创建时间

3、**经验分享表 (ExperienceShare)**

- objectId: 唯一标识符
- userId: 发布用户的ID
- title: 分享标题
- content: 分享内容
- mediaUrl: 附加的图片或视频链接
- likesCount: 点赞数量
- commentsCount: 评论数量
- createdAt: 创建时间
- updatedAt: 更新时间

4、**经验评论表 (ExperienceComment)**

- objectId: 唯一标识符
- experienceId: 关联的经验分享ID
- userId: 评论用户的ID
- content: 评论内容
- createdAt: 创建时间

5、**用户表 (User)**
- objectId: 唯一标识符
- username: 用户名
- password: 密码
- email: 用户邮箱
- profilePictureUrl: 用户头像链接
- createdAt: 创建时间
- updatedAt: 更新时间

# PlantUML 类图表示
以下是使用PlantUML表示的类图：
```plantuml
@startuml
class User {
    +objectId: String
    +username: String
    +password: String
    +email: String
    +profilePictureUrl: String
    +createdAt: Date
    +updatedAt: Date
}

class Artwork {
    +objectId: String
    +userId: Pointer
    +title: String
    +description: String
    +category: String
    +fileUrl: String
    +likesCount: Number
    +commentsCount: Number
    +createdAt: Date
    +updatedAt: Date
}

class Comment {
    +objectId: String
    +artworkId: Pointer
    +userId: Pointer
    +content: String
    +createdAt: Date
}

class ExperienceShare {
    +objectId: String
    +userId: Pointer
    +title: String
    +content: String
    +mediaUrl: String
    +likesCount: Number
    +commentsCount: Number
    +createdAt: Date
    +updatedAt: Date
}

class ExperienceComment {
    +objectId: String
    +experienceId: Pointer
    +userId: Pointer
    +content: String
    +createdAt: Date
}

User "1" -- "*" Artwork : uploads
User "1" -- "*" Comment : writes
User "1" -- "*" ExperienceShare : shares
User "1" -- "*" ExperienceComment : comments
Artwork "1" -- "*" Comment : contains
ExperienceShare "1" -- "*" ExperienceComment : contains
@enduml
```
# 设计说明
- 用户表 (User)：用户表用于存储用户的基本信息，包括用户名、密码、邮箱和头像链接。字段的设计考虑了用户在平台上的基本需求。
- 外键关联：在 Artwork、Comment、ExperienceShare 和 ExperienceComment 表中，userId 字段指向 User 表，以确保用户与其作品和评论之间的关联。
- 安全性：密码字段应进行加密存储，以确保用户信息的安全性。
- 数据完整性：通过外键关联，确保用户在上传作品和分享经验时，其身份信息是完整且可追溯的。

通过增加用户表，整个社区分享模块的结构变得更加完善，能够支持用户的多样化需求，并确保数据的完整性和安全性。
# 业务逻辑描述
# 作品展示与交流和学习经验分享的完整逻辑
## 作品展示与交流生成逻辑

**生成逻辑**

1、**用户输入:**

- 用户上传的作品信息（包括标题、描述、分类、文件链接等）。

2、**作品上传:**

- 用户通过简单的界面上传自己的作品。
数据存储到 Artwork 表中。

3、**作品分类:**

- 作品根据类型进行分类（如绘画、手工艺、编程、摄影等）。

4、**浏览与互动:**

- 用户可以浏览其他用户的作品，进行点赞和评论。
- 提供搜索功能，用户可以根据关键词快速找到感兴趣的作品。

5、**热门作品推荐:**

- 系统根据点赞和评论数量，推荐热门作品给用户。

**结果存储:**

**Artwork 表**
- objectId: 唯一标识符
- userId: 上传用户的ID
- title: 作品标题
- description: 作品描述
- category: 作品分类
- fileUrl: 作品文件链接
- likesCount: 点赞数量
- commentsCount: 评论数量
- createdAt: 创建时间
- updatedAt: 更新时间
## 学习经验分享生成逻辑
**功能描述**
- 该模块鼓励用户分享自己的学习经验和技巧，促进用户之间的知识交流和互助。

**生成逻辑**

1、**用户输入:**

- 用户发布的学习经验信息（包括标题、内容、媒体链接等）。

2、**经验分享发布:**

- 用户可以发布文字帖子、图片或视频，分享学习心得、技巧等。
- 数据存储到 ExperienceShare 表中。

3、**经验浏览与互动:**

- 用户可以浏览其他用户的分享内容，进行点赞和评论。

4、**困难与解决方案分享:**

- 用户可以分享在学习过程中遇到的困难以及解决方法。

5、**学习成果展示:**

- 用户可以分享学习成果，展示自己的进步和成就。

**结果存储:**

**ExperienceShare 表**
- objectId: 唯一标识符
- userId: 发布用户的ID
- title: 分享标题
- content: 分享内容
- mediaUrl: 附加的图片或视频链接
- likesCount: 点赞数量
- commentsCount: 评论数量
- createdAt: 创建时间
- updatedAt: 更新时间

## JSON 格式的测试数据
```json
[
    {
        "Artwork": {
            "objectId": "artwork1",
            "userId": "user1",
            "title": "Abstract Painting",
            "description": "An abstract representation of emotions.",
            "category": "Painting",
            "fileUrl": "https://example.com/artwork/abstract_painting.jpg",
            "likesCount": 15,
            "commentsCount": 3,
            "createdAt": "2024-01-15T10:00:00Z",
            "updatedAt": "2024-01-15T10:00:00Z"
        }
    },
    {
        "Artwork": {
            "objectId": "artwork2",
            "userId": "user2",
            "title": "Handmade Pottery",
            "description": "A beautifully crafted pottery piece.",
            "category": "Craft",
            "fileUrl": "https://example.com/artwork/handmade_pottery.jpg",
            "likesCount": 10,
            "commentsCount": 1,
            "createdAt": "2024-01-16T11:00:00Z",
            "updatedAt": "2024-01-16T11:00:00Z"
        }
    },
    {
        "Artwork": {
            "objectId": "artwork3",
            "userId": "user3",
            "title": "Nature Photography",
            "description": "Capturing the beauty of nature during sunset.",
            "category": "Photography",
            "fileUrl": "https://example.com/artwork/nature_photography.jpg",
            "likesCount": 20,
            "commentsCount": 5,
            "createdAt": "2024-01-17T12:00:00Z",
            "updatedAt": "2024-01-17T12:00:00Z"
        }
    },
    {
        "ExperienceShare": {
            "objectId": "experience1",
            "userId": "user1",
            "title": "My Journey in Painting",
            "content": "I started painting last year and it has been an incredible journey. Here are some tips I learned along the way.",
            "mediaUrl": "https://example.com/experience/painting_journey.jpg",
            "likesCount": 12,
            "commentsCount": 4,
            "createdAt": "2024-02-01T10:00:00Z",
            "updatedAt": "2024-02-01T10:00:00Z"
        }
    },
    {
        "ExperienceShare": {
            "objectId": "experience2",
            "userId": "user2",
            "title": "Crafting Techniques",
            "content": "Sharing some techniques I learned while crafting pottery.",
            "mediaUrl": "https://example.com/experience/crafting_techniques.jpg",
            "likesCount": 8,
            "commentsCount": 2,
            "createdAt": "2024-02-02T11:00:00Z",
            "updatedAt": "2024-02-02T11:00:00Z"
        }
    },
    {
        "ExperienceShare": {
            "objectId": "experience3",
            "userId": "user3",
            "title": "Photography Basics",
            "content": "Here are some basic tips for taking great photos.",
            "mediaUrl": "https://example.com/experience/photography_basics.jpg",
            "likesCount": 15,
            "commentsCount": 6,
            "createdAt": "2024-02-03T12:00:00Z",
            "updatedAt": "2024-02-03T12:00:00Z"
        }
    }
]
```

# 作品展示与交流模块的业务执行逻辑
- 用户在作品展示页面加载所有作品
    - 用户浏览作品
        - 用户主动点赞或评论作品
            - 作品标记为热门
```plantuml
@startuml
actor 用户
participant "系统" as 系统
participant "作品表" as 作品数据库

用户 -> 系统: 上传作品（标题、描述、分类、文件链接）
系统 -> 作品数据库: 存储作品数据
系统 -> 作品数据库: 对作品进行分类
系统 -> 用户: 确认上传成功

用户 -> 系统: 浏览作品
系统 -> 作品数据库: 加载所有作品
系统 -> 用户: 显示作品（按分类、点赞、评论排序）

用户 -> 系统: 点赞作品
系统 -> 作品数据库: 更新点赞数量
系统 -> 作品数据库: 更新评论数量

用户 -> 系统: 评论作品
系统 -> 作品数据库: 存储评论数据
系统 -> 作品数据库: 更新评论数量

系统 -> 作品数据库: 评估作品的热门程度
系统 -> 用户: 推荐热门作品
@enduml
```

```plantuml
@startuml
@startuml
actor 用户
participant "系统" as 系统
participant "作品表" as 作品数据库
participant "评论表" as 评论数据库

用户 -> 系统: 加载所有作品
系统 -> 作品数据库: 获取作品
系统 -> 用户: 显示作品

用户 -> 系统: 浏览作品
系统 -> 用户: 显示作品详情

用户 -> 系统: 点赞作品
系统 -> 作品数据库: 更新点赞数量

用户 -> 系统: 评论作品
系统 -> 评论数据库: 存储评论数据
系统 -> 作品数据库: 更新评论数量

系统 -> 作品数据库: 评估热门作品
系统 -> 用户: 显示热门作品
@enduml
```
# 说明
1、**生成逻辑时序图:**

用户上传作品后，系统将作品信息存储到作品表中，并进行分类。
用户可以浏览作品，系统从数据库加载所有作品并按要求排序。
用户可以选择点赞或评论，系统相应地更新作品的点赞和评论数量，并定期评估热门作品。

2、**业务执行逻辑时序图:**

用户在作品展示页面加载所有作品，系统从数据库获取数据并展示。
用户可以浏览作品详情，进行点赞和评论操作。
系统在用户进行互动后，更新相应的数据，并评估哪些作品是热门作品。