珊瑚单词新增功能-为单词添加笔记-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 形式开放
  • 做权限控制(只有本人可编辑,管理员可精选)
  • 补单测或最少的接口测试
  • 接前端页面展示"精选笔记"
相关推荐
唐青枫1 小时前
别把 ImmutableArray 当成只读 List:C#.NET 不可变数组深入详解
c#·.net
DeviceHub2 小时前
硬件工程师选型笔记:ALPS SKPMAPE010 与 Tonevee TS-3025 贴片轻触开关 PIN TO PIN 评估指南
笔记
疯狂打码的少年3 小时前
【数据结构】二叉树的性质(五大性质+计算)
数据结构·笔记·算法
zlinear数据采集卡4 小时前
D223 ADC数据处理流水线:从原始采样值到工程单位的完整转换链
开发语言·arm开发·嵌入式硬件·fpga开发·开源·c#
Capricorn19884 小时前
知芽研究问题看板无法推进?从孵化区到笔记的机制排查指南
大数据·论文阅读·人工智能·笔记·学习方法·论文笔记
闪闪发亮的小星星4 小时前
相机脱靶量VS精跟踪精度
笔记
皖山文武5 小时前
逻辑代数基础学习笔记--概述
笔记·学习·机器学习
花落人散处7 小时前
CDiskClean 开发历程 —— 文件清理_目录树解析实现方案参考
c#
圣殿骑士-Khtangc8 小时前
Go错误处理最佳实践进阶从error到panic的完整指南
golang