全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

如何用Golang实现基础的收藏夹功能_Golang 收藏夹功能开发实践

答案:使用Gin+GORM+MySQL实现收藏夹功能,包含用户收藏的增删查及防重机制。定义User和Favorite模型,通过API接口实现添加、获取和删除收藏;利用唯一索引防止重复收藏;支持联表查询返回文章标题等详情,并建议添加分页与权限校验。

实现一个基础的收藏夹功能,核心是用户可以将感兴趣的内容(如文章、商品等)添加到个人收藏中,并能查看、删除或管理这些收藏项。使用 Golang 开发时,我们通常结合 Gin 或 Echo 这类 Web 框架,搭配数据库(如 MySQL 或 PostgreSQL)来完成数据持久化。下面以 Gin + GORM + MySQL 为例,展示如何一步步实现这个功能。

1. 数据模型设计

收藏夹功能涉及两个主要实体:用户和收藏项。一个用户可以有多个收藏,每个收藏对应一个目标内容(比如文章)。我们可以设计如下结构:

  • User:包含用户 ID、用户名等信息
  • Favorite:包含收藏 ID、用户 ID、目标类型(如 article)、目标 ID、创建时间

使用 GORM 定义模型:

type User struct {
    ID   uint   `gorm:"primarykey"`
    Name string `json:"name"`
}

type Favorite struct { ID uint gorm:"primarykey" json:"id" UserID uint json:"user_id" ItemID uint json:"item_id" // 被收藏的内容ID,如文章ID ItemType string json:"item_type" // 类型标识,如 "article" CreatedAt time.Time json:"created_at" }

2. API 接口设计

我们需要提供几个基本接口:

  • POST /favorites:添加收藏
  • GET /favorites:获取当前用户的收藏列表
  • DELETE /favorites/:id:取消收藏

假设我们通过 JWT 获取当前登录用户 ID,以下是 Gin 实现示例:

func AddFavorite(c *gin.Context) {
    var fav Favorite
    if err := c.ShouldBindJSON(&fav); err != nil {
        c.JSON(400, gin.H{"error": err.Error()})
        return
    }
// 假设中间件已把用户ID存入上下文
userID, _ := c.Get("userID")
fav.UserID = userID.(uint)

if err := db.Create(&fav).Error; err != nil {
    c.JSON(500, gin.H{"error": "收藏失败"})
    return
}

c.JSON(200, gin.H{"message": "收藏成功", "data": fav})

}

func GetFavorites(c *gin.Context) { userID, _ := c.Get("userID") var favorites []Favorite db.Where("user_id = ?", userID).Find(&favorites) c.JSON(200, gin.H{"data": favorites}) }

func RemoveFavorite(c *gin.Context) { id := c.Param("id") userID, _ := c.Get("userID")

if err := db.Where("id = ? AND user_id = ?", id, userID).Delete(&Favorite{}).Error; err != nil {
    c.JSON(500, gin.H{"error": "取消收藏失败"})
    return
}
c.JSON(200, gin.H{"message": "已取消收藏"})

}

3. 防止重复收藏

用户不应重复收藏同一内容。可以在插入前检查是否已存在相同记录:

var count int64
db.Model(&Favorite{}).
    Where("user_id = ? AND item_id = ? AND item_type = ?", fav.UserID, fav.ItemID, fav.ItemType).
    Count(&count)

if count > 0 { c.JSON(400, gin.H{"error": "已收藏过该内容"}) return }

也可以在数据库层面建立唯一索引提升效率:

-- 创建唯一索引
ALTER TABLE favorites ADD UNIQUE unique_user_item (user_id, item_id, item_type);

4. 查询优化与扩展建议

实际使用中,用户希望看到收藏内容的详细信息(如文章标题),而不仅仅是 ID。这时可以联表查询:

// 示例:关联文章表获取标题
type FavoriteWithArticle struct {
    ID        uint      `json:"id"`
    Title     string    `json:"title"`
    ItemID    uint      `json:"item_id"`
    CreatedAt time.Time `json:"created_at"`
}

func GetFavoritesWithArticles(c *gin.Context) { userID, _ := c.Get("userID") var result []FavoriteWithArticle db.Table("favorites"). Select("favorites.id, articles.title, favorites.item_id, favorites.created_at"). Joins("left join articles on favorites.item_id = articles.id"). Where("favorites.user_id = ? AND favorites.item_type = ?", userID, "article"). Scan(&result) c.JSON(200, gin.H{"data": result}) }

注意:若支持多种类型(商品、视频等),可考虑用接口或分表处理。

基本上就这些。一个轻量级收藏夹功能可以通过简单的 CRUD 和合理建模快速实现。关键点在于防止重复、保证用户隔离、并为前端提供可用的数据结构。后续可加入分页、分类、同步到客户端等功能。不复杂但容易忽略细节,比如权限校验和索引优化。


# mysql  # js  # 前端  # json  # go  # golang  # gin  # echo  # 数据结构  # 接口  # var  # delete  # postgresql  # 数据库  # 收藏夹  # 分页  # 用户可以  # 几个  # 多个  # 感兴趣  # 我们可以  # 而不  # 可以通过 


相关文章: 制作网站哪家好,cc、.co、.cm哪个域名更适合做网站?  C++中的Pimpl idiom是什么,有什么好处?(隐藏实现)  建站主机核心功能解析:服务器选择与网站搭建流程指南  攀枝花网站建设,攀枝花营业执照网上怎么年审?  头像制作网站在线观看,除了站酷,还有哪些比较好的设计网站?  如何快速搭建安全的FTP站点?  如何解决ASP生成WAP建站中文乱码问题?  专业的网站制作设计是什么,如何制作一个企业网站,建设网站的基本步骤有哪些?  建站之星免费模板:自助建站系统与智能响应式一键生成  学校免费自助建站系统:智能生成+拖拽设计+多端适配  如何确保FTP站点访问权限与数据传输安全?  制作表格网站有哪些,线上表格怎么弄?  表情包在线制作网站免费,表情包怎么弄?  如何在Windows 2008云服务器安全搭建网站?  盐城做公司网站,江苏电子版退休证办理流程?  网页设计与网站制作内容,怎样注册网站?  新网站制作渠道有哪些,跪求一个无线渠道比较强的小说网站,我要发表小说?  详解免费开源的DotNet二维码操作组件ThoughtWorks.QRCode(.NET组件介绍之四)  建站之星后台管理:高效配置与模板优化提升用户体验  北京制作网站的公司排名,北京三快科技有限公司是做什么?北京三快科技?  详解jQuery中基本的动画方法  专业企业网站设计制作公司,如何理解商贸企业的统一配送和分销网络建设?  高防服务器租用指南:配置选择与快速部署攻略  PHP正则匹配日期和时间(时间戳转换)的实例代码  建站之星上传入口如何快速找到?  如何选择PHP开源工具快速搭建网站?  C#怎么创建控制台应用 C# Console App项目创建方法  实现点击下箭头变上箭头来回切换的两种方法【推荐】  如何在云主机上快速搭建网站?  ui设计制作网站有哪些,手机UI设计网址吗?  小型网站制作HTML,*游戏网站怎么搭建?  如何配置FTP站点权限与安全设置?  制作门户网站的参考文献在哪,小说网站怎么建立?  制作网站的软件免费下载,免费制作app哪个平台好?  如何通过宝塔面板实现本地网站访问?  济南专业网站制作公司,济南信息工程学校怎么样?  建站主机如何选?性能与价格怎样平衡?  北京网站制作的公司有哪些,北京白云观官方网站?  利用JavaScript实现拖拽改变元素大小  如何在IIS管理器中快速创建并配置网站?  兔展官网 在线制作,怎样制作微信请帖?  如何通过西部数码建站助手快速创建专业网站?  郑州企业网站制作公司,郑州招聘网站有哪些?  Python文件管理规范_工程实践说明【指导】  设计网站制作公司有哪些,制作网页教程?  魔毅自助建站系统:模板定制与SEO优化一键生成指南  弹幕视频网站制作教程下载,弹幕视频网站是什么意思?  广州网站设计制作一条龙,广州巨网网络科技有限公司是干什么的?  上海制作企业网站有哪些,上海有哪些网站可以让企业免费发布招聘信息?  如何通过.red域名打造高辨识度品牌网站? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。