【Sapphire开发日志 十】讨论区数据优化

需求

讨论区的内容涉及回复和发布日期等,在此处进行了封装。我们需要实现一个讨论区功能,允许用户在数据集下创建讨论、查看讨论列表,并显示讨论的相关信息如标题、内容、用户名、用户头像和创建时间。

具体实现

数据结构

首先,我们需要定义一些基本的数据结构来表示讨论和用户信息:

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
}

代码分析

  1. 时间格式化工具函数FormatTimeStr函数根据时间差返回友好的时间字符串,如“刚刚”、“几分钟前”、“几小时前”、“几天前”或具体日期。
  2. 构建讨论结果buildResult函数将讨论和用户信息组合成一个DiscussionResult对象,并格式化创建时间。
  3. 列出数据集下的所有讨论ListDiscussionsByDatasetID函数根据数据集ID查询所有讨论,并获取每个讨论的用户信息,然后构建并返回讨论结果列表。

总结

通过这篇博客,我们详细介绍了如何在Sapphire系统中实现讨论区功能。我们从需求分析入手,逐步讲解了时间格式化工具函数、构建讨论结果函数以及列出数据集下所有讨论的具体代码实现。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值