dicts.go 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. package model
  2. import (
  3. "errors"
  4. "fmt"
  5. "woord-core-service/global"
  6. "gorm.io/gorm"
  7. )
  8. var (
  9. ErrDictNotFound = fmt.Errorf("词库不存在")
  10. )
  11. // 词库
  12. type Dict struct {
  13. *gorm.Model
  14. // 词库名
  15. Name string
  16. // 单词标题
  17. ValueTitle string
  18. // 词义标题
  19. MeaningTitle string
  20. // 附加标题
  21. ExtraTitle string
  22. // 词库所有单词
  23. Words []Word
  24. // 所属用户 ID
  25. UserID uint
  26. }
  27. type DictResult struct {
  28. ID uint `json:"id"`
  29. Name string `json:"name"`
  30. ValueTitle string `json:"valueTitle"`
  31. MeaningTitle string `json:"meaningTitle"`
  32. ExtraTitle string `json:"extraTitle"`
  33. WordsCount uint `json:"wordsCount"`
  34. }
  35. // 列出所有词库
  36. func ListDicts(userID uint) ([]DictResult, error) {
  37. result := []DictResult{}
  38. if err := global.DB.Model(&Dict{}).Select("*, (?) AS words_count", global.DB.Model(&Word{}).Select("COUNT()").Where("dict_id = dicts.id")).Order("id desc").Find(&result, "user_id = ?", userID).Error; err != nil {
  39. return nil, err
  40. }
  41. return result, nil
  42. }
  43. // 获取词库
  44. func GetDict(id, userID uint) (*DictResult, error) {
  45. result := &DictResult{}
  46. if err := global.DB.Model(&Dict{}).Select("*, (?) AS words_count", global.DB.Model(&Word{}).Select("COUNT()").Where("dict_id = dicts.id")).Take(result, "id = ? AND user_id = ?", id, userID).Error; err != nil {
  47. if errors.Is(err, gorm.ErrRecordNotFound) {
  48. return nil, ErrDictNotFound
  49. }
  50. return nil, err
  51. }
  52. return result, nil
  53. }
  54. // 创建词库
  55. func CreateDict(name, valueTitle, meaningTitle, extraTitle string, userID uint) (*DictResult, error) {
  56. dict := &Dict{
  57. Name: name,
  58. ValueTitle: valueTitle,
  59. MeaningTitle: meaningTitle,
  60. ExtraTitle: extraTitle,
  61. UserID: userID,
  62. }
  63. if err := global.DB.Select("name", "value_title", "meaning_title", "extra_title", "user_id").Create(dict).Error; err != nil {
  64. return nil, err
  65. }
  66. return &DictResult{
  67. ID: dict.ID,
  68. Name: dict.Name,
  69. ValueTitle: dict.ValueTitle,
  70. MeaningTitle: dict.MeaningTitle,
  71. ExtraTitle: dict.ExtraTitle,
  72. }, nil
  73. }
  74. // 更新词库
  75. func UpdateDict(id uint, name, valueTitle, meaningTitle, extraTitle string) (*DictResult, error) {
  76. count := int64(0)
  77. if err := global.DB.Model(&Word{}).Where("dict_id = ?", id).Count(&count).Error; err != nil {
  78. return nil, err
  79. }
  80. dict := &Dict{
  81. Name: name,
  82. ValueTitle: valueTitle,
  83. MeaningTitle: meaningTitle,
  84. ExtraTitle: extraTitle,
  85. }
  86. if err := global.DB.Where("id = ?", id).Select("name", "value_title", "meaning_title", "extra_title").Updates(dict).Error; err != nil {
  87. return nil, err
  88. }
  89. return &DictResult{
  90. ID: dict.ID,
  91. Name: dict.Name,
  92. ValueTitle: dict.ValueTitle,
  93. MeaningTitle: dict.MeaningTitle,
  94. ExtraTitle: dict.ExtraTitle,
  95. WordsCount: uint(count),
  96. }, nil
  97. }
  98. // 删除词库
  99. func DeleteDict(id uint) error {
  100. return global.DB.Delete(&Dict{}, "id = ?", id).Error
  101. }