【Sapphire开发日志 六】数据集讨论功能实现

介绍

为了实现数据集下用户的讨论交流,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
}
代码分析:
  1. 创建讨论记录:从输入的dto中提取讨论的标题、内容、数据集ID、用户ID、回复ID等信息,并创建一个新的Discussion对象。
  2. 保存讨论:将讨论信息保存到数据库中。
  3. 获取用户信息:根据用户ID获取用户信息。
  4. 构建返回结果:将讨论和用户信息构建成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
}
代码分析:
  1. 获取单个讨论:通过ID获取单个讨论的详细信息,包括讨论内容和用户信息。
  2. 获取数据集下的所有讨论:根据数据集ID查询所有相关的讨论,并获取每个讨论的用户信息。
  3. 构建返回结果:将讨论和用户信息构建成DiscussionResult对象列表并返回。

总结

本文详细介绍了Sapphire系统中讨论区功能的实现细节,从数据结构和表结构入手,逐步讲解了讨论的创建、获取单个讨论以及获取某个数据集下所有讨论的具体代码实现。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值