介绍
为了实现数据集下用户的讨论交流,Sapphire设计了讨论区的功能。讨论区功能允许用户在特定的数据集下发布讨论、回复他人的讨论,并查看所有相关的讨论和回复。本文将详细记录讨论区功能的具体实现,包括数据结构、表结构、讨论的创建、以及讨论的查询。
具体实现
数据结构和表结构
讨论区的功能主要围绕Discussion
结构体展开,该结构体包含讨论的基本信息,如标题、内容、关联的数据集ID、用户ID等。以下是相关的数据结构和表结构:
type Discussion struct {
gorm.Model
Title string `gorm:"column:title"`
Content string `gorm:"column:content"`
DatasetID uint `gorm:"column:dataset_id"`
UserID uint `gorm:"column:user_id"`
ReplyID uint `gorm:"column:reply_id"`
}
type DiscussionResult struct {
ID uint `json:"id"`
Title string `json:"title"`
Content string `json:"content"`
UserName string `json:"userName"`
Avatar string `json:"avatar"`
IsReply bool `json:"isReply"`
Replies []DiscussionResult `json:"replies"`
Time string `json:"time"`
}
func NewDiscussionDomain() *Discussion {
return &Discussion{}
}
var userDomain = NewUserDomain()
func buildResult(discussion Discussion, user User) *DiscussionResult {
timeStr := util.FormatTimeStr(discussion.CreatedAt)
result := DiscussionResult{
ID: discussion.ID,
Title: discussion.Title,
Content: discussion.Content,
UserName: user.Name,
Avatar: user.Avatar,
Time: timeStr,
}
return &result
}
发表讨论
用户可以在指定的数据集下发表讨论。以下是创建讨论的具体实现:
func (d *Discussion) CreateDiscussion(userID uint, dto dto.NewDiscussion) *DiscussionResult {
var err error
slog.Info("create discussion, userID: %d, dto: %+v", userID, dto)
discussion := Discussion{
Title: dto.Title,
Content: dto.Content,
DatasetID: dto.DatasetID,
UserID: userID,
ReplyID: dto.ReplyID,
}
slog.Info("create discussion: %+v", discussion)
err = dao.Save(&discussion)
if (err != nil) {
slog.Error("create discussion failed: %s", err.Error())
return nil
}
user, err := userDomain.GetUserInfo(discussion.UserID)
if (err != nil) {
slog.Error("get user info failed: %s", err.Error())
return nil
}
res := buildResult(discussion, *user)
return res
}
代码分析:
- 创建讨论记录:从输入的
dto
中提取讨论的标题、内容、数据集ID、用户ID、回复ID等信息,并创建一个新的Discussion
对象。 - 保存讨论:将讨论信息保存到数据库中。
- 获取用户信息:根据用户ID获取用户信息。
- 构建返回结果:将讨论和用户信息构建成
DiscussionResult
对象并返回。
获取某个数据集下的所有讨论
用户可以查看某个数据集下的所有讨论。以下是获取讨论的具体实现:
func (d *Discussion) GetDiscussion(id uint) *DiscussionResult {
var err error
slog.Info("get discussion, id: %d", id)
discussion, err := dao.FindOne[Discussion]("id = ?", id)
if (err != nil) {
slog.Error("get discussion failed: %s", err.Error())
return nil
}
user, err := userDomain.GetUserInfo(discussion.UserID)
if (err != nil) {
slog.Error("get user info failed: %s", err.Error())
return nil
}
res := buildResult(*discussion, *user)
return res
}
func (d *Discussion) ListDiscussionsByDatasetID(userID uint, datasetID uint) []DiscussionResult {
var err error
slog.Info("list discussions by datasetID: %d", datasetID)
discussions, err := dao.FindAll[Discussion]("dataset_id = ?", datasetID)
if (err != nil) {
slog.Error("list discussions failed: %s", err.Error())
return nil
}
var results []DiscussionResult
for _, discussion := range discussions {
user, err := userDomain.GetUserInfo(discussion.UserID)
if (err != nil) {
slog.Error("get user info failed: %s", err.Error())
return nil
}
result := buildResult(discussion, *user)
results = append(results, *result)
}
return results
}
代码分析:
- 获取单个讨论:通过ID获取单个讨论的详细信息,包括讨论内容和用户信息。
- 获取数据集下的所有讨论:根据数据集ID查询所有相关的讨论,并获取每个讨论的用户信息。
- 构建返回结果:将讨论和用户信息构建成
DiscussionResult
对象列表并返回。
总结
本文详细介绍了Sapphire系统中讨论区功能的实现细节,从数据结构和表结构入手,逐步讲解了讨论的创建、获取单个讨论以及获取某个数据集下所有讨论的具体代码实现。