faq_controller.go 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186
  1. package controller
  2. import (
  3. "log"
  4. "net/http"
  5. "strconv"
  6. "strings"
  7. "github.com/2930134478/AI-CS/backend/service"
  8. "github.com/gin-gonic/gin"
  9. )
  10. // FAQController 负责处理 FAQ(常见问题)相关的 HTTP 请求。
  11. type FAQController struct {
  12. faqService *service.FAQService
  13. users *service.UserService
  14. }
  15. // NewFAQController 创建 FAQController 实例。
  16. func NewFAQController(faqService *service.FAQService, users *service.UserService) *FAQController {
  17. return &FAQController{faqService: faqService, users: users}
  18. }
  19. // ListFAQs 获取 FAQ 列表,支持关键词搜索。
  20. // GET /faqs?query=openai%api%调用
  21. func (f *FAQController) ListFAQs(c *gin.Context) {
  22. if !requirePermission(c, f.users, string(service.PermFAQs)) {
  23. return
  24. }
  25. // 获取查询参数
  26. query := c.Query("query")
  27. // 查询 FAQ 列表
  28. faqs, err := f.faqService.ListFAQs(query)
  29. if err != nil {
  30. log.Printf("查询 FAQ 列表失败: %v", err)
  31. c.JSON(http.StatusInternalServerError, gin.H{"error": "查询 FAQ 列表失败"})
  32. return
  33. }
  34. c.JSON(http.StatusOK, gin.H{
  35. "faqs": faqs,
  36. })
  37. }
  38. // GetFAQ 获取 FAQ 详情。
  39. // GET /faqs/:id
  40. func (f *FAQController) GetFAQ(c *gin.Context) {
  41. if !requirePermission(c, f.users, string(service.PermFAQs)) {
  42. return
  43. }
  44. // 获取 ID
  45. idStr := c.Param("id")
  46. id, err := strconv.ParseUint(idStr, 10, 64)
  47. if err != nil || id == 0 {
  48. c.JSON(http.StatusBadRequest, gin.H{"error": "FAQ ID 不合法"})
  49. return
  50. }
  51. // 查询 FAQ
  52. faq, err := f.faqService.GetFAQ(uint(id))
  53. if err != nil {
  54. log.Printf("查询 FAQ 失败: %v", err)
  55. c.JSON(http.StatusNotFound, gin.H{"error": err.Error()})
  56. return
  57. }
  58. c.JSON(http.StatusOK, faq)
  59. }
  60. // CreateFAQ 创建新的 FAQ 记录。
  61. // POST /faqs
  62. func (f *FAQController) CreateFAQ(c *gin.Context) {
  63. if !requirePermission(c, f.users, string(service.PermFAQs)) {
  64. return
  65. }
  66. var req struct {
  67. Question string `json:"question" binding:"required"`
  68. Answer string `json:"answer" binding:"required"`
  69. Keywords string `json:"keywords"`
  70. }
  71. if err := c.ShouldBindJSON(&req); err != nil {
  72. c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
  73. return
  74. }
  75. // 创建 FAQ
  76. faq, err := f.faqService.CreateFAQ(service.CreateFAQInput{
  77. Question: req.Question,
  78. Answer: req.Answer,
  79. Keywords: req.Keywords,
  80. })
  81. if err != nil {
  82. log.Printf("创建 FAQ 失败: %v", err)
  83. c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
  84. return
  85. }
  86. c.JSON(http.StatusOK, faq)
  87. }
  88. // UpdateFAQ 更新 FAQ 记录。
  89. // PUT /faqs/:id
  90. func (f *FAQController) UpdateFAQ(c *gin.Context) {
  91. if !requirePermission(c, f.users, string(service.PermFAQs)) {
  92. return
  93. }
  94. // 获取 ID
  95. idStr := c.Param("id")
  96. id, err := strconv.ParseUint(idStr, 10, 64)
  97. if err != nil || id == 0 {
  98. c.JSON(http.StatusBadRequest, gin.H{"error": "FAQ ID 不合法"})
  99. return
  100. }
  101. var req struct {
  102. Question *string `json:"question"`
  103. Answer *string `json:"answer"`
  104. Keywords *string `json:"keywords"`
  105. }
  106. if err := c.ShouldBindJSON(&req); err != nil {
  107. c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
  108. return
  109. }
  110. // 更新 FAQ
  111. faq, err := f.faqService.UpdateFAQ(uint(id), service.UpdateFAQInput{
  112. Question: req.Question,
  113. Answer: req.Answer,
  114. Keywords: req.Keywords,
  115. })
  116. if err != nil {
  117. log.Printf("更新 FAQ 失败: %v", err)
  118. c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
  119. return
  120. }
  121. c.JSON(http.StatusOK, faq)
  122. }
  123. // QuickSearch 快速搜索 FAQ(客服聊天输入框 `/` 触发)。
  124. // GET /faqs-search?q=关键词&limit=10
  125. func (f *FAQController) QuickSearch(c *gin.Context) {
  126. if !requirePermission(c, f.users, string(service.PermChat)) {
  127. return
  128. }
  129. q := strings.TrimSpace(c.Query("q"))
  130. limit := 10
  131. if l, err := strconv.Atoi(c.DefaultQuery("limit", "10")); err == nil && l > 0 && l <= 50 {
  132. limit = l
  133. }
  134. faqs, err := f.faqService.QuickSearch(q, limit)
  135. if err != nil {
  136. log.Printf("FAQ 快速搜索失败: %v", err)
  137. c.JSON(http.StatusInternalServerError, gin.H{"error": "FAQ 搜索失败"})
  138. return
  139. }
  140. c.JSON(http.StatusOK, gin.H{"faqs": faqs})
  141. }
  142. // DeleteFAQ 删除 FAQ 记录。
  143. // DELETE /faqs/:id
  144. func (f *FAQController) DeleteFAQ(c *gin.Context) {
  145. if !requirePermission(c, f.users, string(service.PermFAQs)) {
  146. return
  147. }
  148. // 获取 ID
  149. idStr := c.Param("id")
  150. id, err := strconv.ParseUint(idStr, 10, 64)
  151. if err != nil || id == 0 {
  152. c.JSON(http.StatusBadRequest, gin.H{"error": "FAQ ID 不合法"})
  153. return
  154. }
  155. // 删除 FAQ
  156. if err := f.faqService.DeleteFAQ(uint(id)); err != nil {
  157. log.Printf("删除 FAQ 失败: %v", err)
  158. c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
  159. return
  160. }
  161. c.JSON(http.StatusOK, gin.H{"message": "删除成功"})
  162. }