需求
讨论区的内容涉及回复和发布日期等,在此处进行了封装。我们需要实现一个讨论区功能,允许用户在数据集下创建讨论、查看讨论列表,并显示讨论的相关信息如标题、内容、用户名、用户头像和创建时间。
具体实现
数据结构
首先,我们需要定义一些基本的数据结构来表示讨论和用户信息:
type Discussion struct {
ID uint `json:"id"`
Title string `json:"title"`
Content string `json:"content"`
UserID uint `json:"user_id"`
DatasetID uint `json:"dataset_id"`
CreatedAt time.Time `json:"created_at"`
}
type User struct {
ID uint `json:"id"`
Name string `json:"name"`
Avatar string `json:"avatar"`
}
type DiscussionResult struct {
ID uint `json:"id"`
Title string `json:"title"`
Content string `json:"content"`
UserName string `json:"user_name"`
Avatar string `json:"avatar"`
Time string `json:"time"`
}
时间格式化工具函数
为了在讨论区中显示友好的时间格式,我们需要一个工具函数来格式化时间:
package util
import (
"strconv"
"time"
)
func FormatTimeStr(t time.Time) string {
sub := time.Since(t)
// 超过一周,返回 "x月x日"
if sub.Hours() > 24*7 {
return t.Format("01-02")
}
// 超过一天,返回 "几天前"
if sub.Hours() > 24 {
days := int(sub.Hours() / 24)
return strconv.Itoa(days) + "天前"
}
// 超过一小时,返回 "几小时前"
if sub.Hours() > 1 {
hours := int(sub.Hours())
return strconv.Itoa(hours) + "小时前"
}
// 超过一分钟,返回 "几分钟前"
if sub.Minutes() > 1 {
minutes := int(sub.Minutes())
return strconv.Itoa(minutes) + "分钟前"
}
// 返回 "刚刚"
return "刚刚"
}
构建讨论结果
我们需要一个函数来将讨论和用户信息组合成一个结果对象:
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) 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
}
代码分析
- 时间格式化工具函数:
FormatTimeStr
函数根据时间差返回友好的时间字符串,如“刚刚”、“几分钟前”、“几小时前”、“几天前”或具体日期。 - 构建讨论结果:
buildResult
函数将讨论和用户信息组合成一个DiscussionResult
对象,并格式化创建时间。 - 列出数据集下的所有讨论:
ListDiscussionsByDatasetID
函数根据数据集ID查询所有讨论,并获取每个讨论的用户信息,然后构建并返回讨论结果列表。
总结
通过这篇博客,我们详细介绍了如何在Sapphire系统中实现讨论区功能。我们从需求分析入手,逐步讲解了时间格式化工具函数、构建讨论结果函数以及列出数据集下所有讨论的具体代码实现。