答案:使用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,如文章IDItemType string json:"item_type" // 类型标识,如 "article"CreatedAt time.Time json:"created_at"}
2. API 接口设计
我们需要提供几个基本接口:
立即学习“go语言免费学习笔记(深入)”;
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 []Favoritedb.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 int64db.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 []FavoriteWithArticledb.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 和合理建模快速实现。关键点在于防止重复、保证用户隔离、并为前端提供可用的数据结构。后续可加入分页、分类、同步到客户端等功能。不复杂但容易忽略细节,比如权限校验和索引优化。
以上就是如何用Golang实现基础的收藏夹功能_Golang 收藏夹功能开发实践的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1426297.html
微信扫一扫
支付宝扫一扫