faq_repository.go 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. package repository
  2. import (
  3. "github.com/2930134478/AI-CS/backend/models"
  4. "gorm.io/gorm"
  5. )
  6. // FAQRepository 封装与 FAQ(常见问题)相关的数据库操作。
  7. type FAQRepository struct {
  8. db *gorm.DB
  9. }
  10. // NewFAQRepository 创建 FAQ 仓库实例。
  11. func NewFAQRepository(db *gorm.DB) *FAQRepository {
  12. return &FAQRepository{db: db}
  13. }
  14. // Create 创建新的 FAQ 记录。
  15. func (r *FAQRepository) Create(faq *models.FAQ) error {
  16. return r.db.Create(faq).Error
  17. }
  18. // GetByID 根据ID查询 FAQ 记录。
  19. func (r *FAQRepository) GetByID(id uint) (*models.FAQ, error) {
  20. var faq models.FAQ
  21. if err := r.db.Where("id = ?", id).First(&faq).Error; err != nil {
  22. return nil, err
  23. }
  24. return &faq, nil
  25. }
  26. // List 获取所有 FAQ 列表,支持关键词搜索。
  27. // 如果 keywords 不为空,会按关键词搜索(AND 查询,所有关键词都要包含)。
  28. // 搜索范围:问题、答案、关键词字段。
  29. func (r *FAQRepository) List(keywords []string) ([]models.FAQ, error) {
  30. var faqs []models.FAQ
  31. query := r.db.Model(&models.FAQ{})
  32. // 如果有关键词,进行 AND 查询
  33. // 每个关键词都必须在 question、answer、keywords 字段中至少有一个匹配
  34. // 但所有关键词都必须被满足(AND 逻辑)
  35. if len(keywords) > 0 {
  36. for _, keyword := range keywords {
  37. if keyword != "" {
  38. // 对于每个关键词,要求在问题、答案、关键词字段中至少有一个包含该关键词(OR)
  39. // 但所有关键词都必须满足(通过链式 Where 实现 AND)
  40. query = query.Where(
  41. "(question LIKE ? OR answer LIKE ? OR keywords LIKE ?)",
  42. "%"+keyword+"%",
  43. "%"+keyword+"%",
  44. "%"+keyword+"%",
  45. )
  46. }
  47. }
  48. }
  49. // 按创建时间倒序排列
  50. if err := query.Order("created_at DESC").Find(&faqs).Error; err != nil {
  51. return nil, err
  52. }
  53. return faqs, nil
  54. }
  55. // Update 更新 FAQ 记录。
  56. func (r *FAQRepository) Update(faq *models.FAQ) error {
  57. return r.db.Save(faq).Error
  58. }
  59. // Delete 删除 FAQ 记录。
  60. func (r *FAQRepository) Delete(id uint) error {
  61. return r.db.Delete(&models.FAQ{}, id).Error
  62. }
  63. // QuickSearch 快速搜索 FAQ(OR 匹配),用于聊天输入框 / 触发。
  64. func (r *FAQRepository) QuickSearch(q string, limit int) ([]models.FAQ, error) {
  65. var faqs []models.FAQ
  66. query := r.db.Model(&models.FAQ{}).
  67. Where("question LIKE ? OR answer LIKE ? OR keywords LIKE ?",
  68. "%"+q+"%", "%"+q+"%", "%"+q+"%").
  69. Order("created_at DESC")
  70. if limit > 0 {
  71. query = query.Limit(limit)
  72. }
  73. if err := query.Find(&faqs).Error; err != nil {
  74. return nil, err
  75. }
  76. return faqs, nil
  77. }