珊瑚单词新增功能-为单词添加笔记-GoLang

修复 word_note 更新失败 & 完善笔记功能的完整记录

最近在完善我的单词本项目 coral_word 时,围绕 word_note 模块做了一轮集中调整。最初的目标是"支持用户对单词写笔记并更新",但在实际使用中发现更新逻辑没有生效,于是展开排查并顺带补全了笔记的核心闭环能力(新增、更新、读取、精选、追加等)。下面是完整记录。


背景:word_note 应该如何工作

设计目标是:

  • 用户可以对某个单词写笔记
  • 之后可以更新/追加
  • 还能标记"精选笔记",并从其他用户中抽取精选内容用于展示

这意味着数据库层必须保证:

  • 同一个用户 + 单词能唯一定位一条笔记
  • 更新时能准确命中对应记录

问题:更新无效但不报错

我最初调用了 UpdateWordNote,SQL 执行成功但更新 0 行。

从代码上看,UPDATE 使用条件:

WHERE word_id = ? AND user_id = ?

而插入时却没有写入 user_id,导致 user_id 字段为空,更新条件永远匹配不到。


解决:补写 user_id + 增加更新行数检查

核心修复:

  1. 创建时补写 user_id

    user.goLines 20-33

    wordNote := WordNote{

    WordID: word_desc.WordID,

    UserID: user.Id,

    UserName: user.Name,

    Note: note,

    Selected: false,

    }

  1. 更新时检查 RowsAffected

    word_note.goLines 33-57

    result, err = tx.Exec("update word_note set note = ? where word_id = ? and user_id = ?", ...)

    affected, _ := result.RowsAffected()

    if affected == 0 {

    return errors.New("no rows updated for word_note")

    }

这样一方面修复了更新无法命中的根因,另一方面避免"静默失败"。


功能完善:补齐笔记读写闭环

为了便于后续接入 Web 接口,我顺手补齐了几个核心能力:

1. 获取笔记word_note.goLines 75-80func (wn *WordNote) GetWordNote() error { row := db.QueryRow("select note, selected from word_note where word_id = ? and user_id = ?", wn.WordID, wn.UserID) return row.Scan(&wn.Note, &wn.Selected)}
2. 追加笔记

追加前先读取当前笔记,再拼接:

word_note.goLines 60-67

err := wn.GetWordNote()

wn.Note += "\n" + note

return wn.UpdateWordNote()

3. 标记精选word_note.goLines 82-99func (wn *WordNote) SetSelectedWordNote(selected bool) error { wn.Selected = selected _, err = tx.Exec("update word_note set selected = ? where word_id = ? and user_id = ?", ...)}
4. 获取某单词的精选笔记

通过 word_id 查询全部 selected = true 的记录,并回填用户名:

word_note.goLines 101-129

rows, err := db.Query("select user_id, note from word_note where word_id = ? and selected = true", wordID)


额外清理:让 user 层 API 更完整

为了让业务层更完整,我把 User 上围绕笔记的一组操作补全了:

  • CreateWordNote
  • UpdateWordNote
  • DeleteWordNote
  • AppendWordNote
  • GetWordNote
  • SetSelectedWordNote
  • GetSelectedWordNotes

这样后续迁移到 Gin 时,每个接口都能直接调用对应业务方法。


结果

  • 更新失败问题彻底修复
  • 笔记模块具备完整 CRUD + 精选能力
  • 后续接口化(Gin)会更顺畅

验证方式(手动)

  • 可以在 main 中做简单验证:

  • CreateWordNote("cooperate", "note_1")

  • UpdateWordNote("cooperate", "note_2")

  • GetWordNote("cooperate") 查看结果

  • AppendWordNote("cooperate", "note_3")

  • SetSelectedWordNote("cooperate", true)

  • GetSelectedWordNotes("cooperate") 查看精选列表


下一步计划

  • 接入 Gin,把笔记功能以 REST API 形式开放
  • 做权限控制(只有本人可编辑,管理员可精选)
  • 补单测或最少的接口测试
  • 接前端页面展示"精选笔记"
相关推荐
牛奔9 小时前
Go 如何避免频繁抢占?
开发语言·后端·golang
不老刘13 小时前
LiveKit 本地部署全流程指南(含 HTTPS/WSS)
golang·实时音视频·livekit
wdfk_prog15 小时前
[Linux]学习笔记系列 -- [drivers][input]input
linux·笔记·学习
ouliten16 小时前
cuda编程笔记(36)-- 应用Tensor Core加速矩阵乘法
笔记·cuda
懒人咖16 小时前
缺料分析时携带用料清单的二开字段
c#·金蝶云星空
孞㐑¥16 小时前
算法——BFS
开发语言·c++·经验分享·笔记·算法
bugcome_com16 小时前
深入了解 C# 编程环境及其开发工具
c#
mango_mangojuice18 小时前
Linux学习笔记(make/Makefile)1.23
java·linux·前端·笔记·学习
工程师老罗18 小时前
YOLOv1 核心知识点笔记
笔记·yolo
wfserial18 小时前
c#使用微软自带speech选择男声仍然是女声的一种原因
microsoft·c#·speech