珊瑚单词新增功能-为单词添加笔记-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 形式开放
  • 做权限控制(只有本人可编辑,管理员可精选)
  • 补单测或最少的接口测试
  • 接前端页面展示"精选笔记"
相关推荐
程序员zgh3 小时前
C++ 纯虚函数 — 抽象接口
c语言·开发语言·c++·经验分享·笔记·接口隔离原则
秦奈3 小时前
Unity复习学习笔记(九):UGUI
笔记·学习·unity
停走的风3 小时前
anaconda与pycharm卸载重安装笔记
笔记·pycharm·conda
深蓝海拓3 小时前
PyQt5/PySide6的moveToThread:移动到线程
笔记·python·qt·学习·pyqt
Xudde.3 小时前
在网络空间安全专业大二上学期个人经历
笔记·学习·安全
wdfk_prog4 小时前
[Linux]学习笔记系列 -- [drivers][base]dd
linux·笔记·学习
ydp157554231764 小时前
换热器笔记整理
笔记
缺点内向4 小时前
C# 高效统计 Word 文档字数:告别手动,拥抱自动化
c#·自动化·word
宵时待雨4 小时前
数据结构(初阶)笔记归纳6:双向链表的实现
c语言·开发语言·数据结构·笔记·算法·链表
不会代码的小猴4 小时前
Linux环境编程第二天笔记
linux·笔记