讲师中心 微信公众号
AI工具推荐 视频效率加速

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

千枫同学_4387

千枫同学_4387

发布时间:2025-11-22 14:52:02

|

905人浏览过

|

来源于php中文网

原创

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

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

实现一个基础的收藏夹功能,核心是用户可以将感兴趣的内容(如文章、商品等)添加到个人收藏中,并能查看、删除或管理这些收藏项。使用 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"`
}
<p>type Favorite struct {
ID        uint      <code>gorm:"primarykey" json:"id"</code>
UserID    uint      <code>json:"user_id"</code>
ItemID    uint      <code>json:"item_id"</code>     // 被收藏的内容ID,如文章ID
ItemType  string    <code>json:"item_type"</code>   // 类型标识,如 "article"
CreatedAt time.Time <code>json:"created_at"</code>
}

2. API 接口设计

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

立即学习“go语言免费学习笔记(深入)”;

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

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

前端开发
前端开发

ys-agent 前端(frontend/)功能迭代的工程规范守门 skill。当任何 agent 接到 ys-agent 前端相关任务时——新增页面、新增组件、加 API、加 Pinia store、改路由、写 mock、调整布局、修改样式、对接后端接口、迁移 demo 代码、做主题、加权限、写公共组件、做数据可视化、做表单、做弹窗、做表格、做搜索过滤、调 Element Plus 用法、做响应式、做性能优化,或仅仅是在 frontend/ 目录下编辑任何 .vue / .ts / .scss / .c

下载
func AddFavorite(c *gin.Context) {
    var fav Favorite
    if err := c.ShouldBindJSON(&fav); err != nil {
        c.JSON(400, gin.H{"error": err.Error()})
        return
    }
<pre class="brush:php;toolbar:false;">// 假设中间件已把用户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)
<p>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"`
}
<p>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 和合理建模快速实现。关键点在于防止重复、保证用户隔离、并为前端提供可用的数据结构。后续可加入分页、分类、同步到客户端等功能。不复杂但容易忽略细节,比如权限校验和索引优化。

热门AI工具

更多
DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

音述AI
音述AI Hot

一款AI音频处理工具,主要用于音述AI是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区,适合需要提升相关任务效率的用户。

立刻MV
立刻MV Hot

立刻MV是一款AI文本写作工具,AI 音乐视频(MV)创作工具。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

蛙蛙写作

一款AI论文写作工具,主要用于超级AI智能写作助手,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

Lovart
Lovart Hot

一款面向视觉设计创作的AI设计平台,可通过智能体和画布工作流辅助制作海报、Logo、网页、PPT及其他视觉内容。

PixTV
PixTV Hot

PixTV是一款面向AIGC内容创作的AI视频生成工具。

相关专题

更多
golang如何定义变量
golang如何定义变量

golang定义变量的方法:1、声明变量并赋予初始值“var age int =值”;2、声明变量但不赋初始值“var age int”;3、使用短变量声明“age :=值”等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

519

2024.02.23

golang有哪些数据转换方法
golang有哪些数据转换方法

golang数据转换方法:1、类型转换操作符;2、类型断言;3、字符串和数字之间的转换;4、JSON序列化和反序列化;5、使用标准库进行数据转换;6、使用第三方库进行数据转换;7、自定义数据转换函数。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

616

2024.02.23

golang常用库有哪些
golang常用库有哪些

golang常用库有:1、标准库;2、字符串处理库;3、网络库;4、加密库;5、压缩库;6、xml和json解析库;7、日期和时间库;8、数据库操作库;9、文件操作库;10、图像处理库。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

1216

2024.02.23

golang和python的区别是什么
golang和python的区别是什么

golang和python的区别是:1、golang是一种编译型语言,而python是一种解释型语言;2、golang天生支持并发编程,而python对并发与并行的支持相对较弱等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

791

2024.03.05

golang是免费的吗
golang是免费的吗

golang是免费的。golang是google开发的一种静态强类型、编译型、并发型,并具有垃圾回收功能的开源编程语言,采用bsd开源协议。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

1786

2024.05.21

golang结构体相关大全
golang结构体相关大全

本专题整合了golang结构体相关大全,想了解更多内容,请阅读专题下面的文章。

5094

2025.06.09

golang相关判断方法
golang相关判断方法

本专题整合了golang相关判断方法,想了解更详细的相关内容,请阅读下面的文章。

2354

2025.06.10

golang数组使用方法
golang数组使用方法

本专题整合了golang数组用法,想了解更多的相关内容,请阅读专题下面的文章。

4226

2025.06.17

Uvicorn使用教程
Uvicorn使用教程

本专题汇总了Uvicorn使用教程与启动运行指南,涵盖其作为Python ASGI服务器的定位与特点,以及命令行启动(uvicorn main:app --reload)、参数配置(host/port/workers)、程序内嵌运行与Gunicorn结合部署等核心用法。同时整理了热重载调试、日志配置与生产环境部署优化等技巧,助你快速掌握Uvicorn的运行与配置。

0

2026.11.02

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL vs MySQL
PostgreSQL vs MySQL

共1课时 | 193人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn