user_service.go 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257
  1. package service
  2. import (
  3. "errors"
  4. "strings"
  5. "github.com/2930134478/AI-CS/backend/models"
  6. "github.com/2930134478/AI-CS/backend/repository"
  7. "golang.org/x/crypto/bcrypt"
  8. "gorm.io/gorm"
  9. )
  10. // UserService 负责用户管理领域的业务编排。
  11. type UserService struct {
  12. users *repository.UserRepository
  13. }
  14. // NewUserService 创建 UserService 实例。
  15. func NewUserService(users *repository.UserRepository) *UserService {
  16. return &UserService{users: users}
  17. }
  18. // ListUsers 获取所有用户列表。
  19. func (s *UserService) ListUsers() ([]UserSummary, error) {
  20. users, err := s.users.ListUsers()
  21. if err != nil {
  22. return nil, err
  23. }
  24. summaries := make([]UserSummary, 0, len(users))
  25. for _, user := range users {
  26. summaries = append(summaries, UserSummary{
  27. ID: user.ID,
  28. Username: user.Username,
  29. Role: user.Role,
  30. Nickname: user.Nickname,
  31. Email: user.Email,
  32. AvatarURL: user.AvatarURL,
  33. ReceiveAIConversations: user.ReceiveAIConversations,
  34. CreatedAt: user.CreatedAt,
  35. UpdatedAt: user.UpdatedAt,
  36. })
  37. }
  38. return summaries, nil
  39. }
  40. // GetUser 获取用户详情。
  41. func (s *UserService) GetUser(id uint) (*UserSummary, error) {
  42. user, err := s.users.GetByID(id)
  43. if err != nil {
  44. if errors.Is(err, gorm.ErrRecordNotFound) {
  45. return nil, errors.New("用户不存在")
  46. }
  47. return nil, err
  48. }
  49. return &UserSummary{
  50. ID: user.ID,
  51. Username: user.Username,
  52. Role: user.Role,
  53. Nickname: user.Nickname,
  54. Email: user.Email,
  55. AvatarURL: user.AvatarURL,
  56. ReceiveAIConversations: user.ReceiveAIConversations,
  57. CreatedAt: user.CreatedAt,
  58. UpdatedAt: user.UpdatedAt,
  59. }, nil
  60. }
  61. // CreateUser 创建新用户。
  62. func (s *UserService) CreateUser(input CreateUserInput) (*UserSummary, error) {
  63. // 验证必填字段
  64. if input.Username == "" || input.Password == "" {
  65. return nil, errors.New("用户名和密码不能为空")
  66. }
  67. // 验证角色
  68. if input.Role != "admin" && input.Role != "agent" {
  69. return nil, errors.New("角色只能是 admin 或 agent")
  70. }
  71. // 检查用户名是否已存在
  72. if _, err := s.users.FindByUsername(input.Username); err == nil {
  73. return nil, ErrUsernameExists
  74. } else if !errors.Is(err, gorm.ErrRecordNotFound) {
  75. return nil, err
  76. }
  77. // 加密密码
  78. hash, err := bcrypt.GenerateFromPassword([]byte(input.Password), bcrypt.DefaultCost)
  79. if err != nil {
  80. return nil, errors.New("密码加密失败")
  81. }
  82. // 创建用户
  83. user := &models.User{
  84. Username: input.Username,
  85. Password: string(hash),
  86. Role: input.Role,
  87. ReceiveAIConversations: true, // 默认接收 AI 对话
  88. }
  89. // 设置可选字段
  90. if input.Nickname != nil {
  91. user.Nickname = strings.TrimSpace(*input.Nickname)
  92. }
  93. if input.Email != nil {
  94. user.Email = strings.TrimSpace(*input.Email)
  95. }
  96. if err := s.users.Create(user); err != nil {
  97. return nil, err
  98. }
  99. return &UserSummary{
  100. ID: user.ID,
  101. Username: user.Username,
  102. Role: user.Role,
  103. Nickname: user.Nickname,
  104. Email: user.Email,
  105. AvatarURL: user.AvatarURL,
  106. ReceiveAIConversations: user.ReceiveAIConversations,
  107. CreatedAt: user.CreatedAt,
  108. UpdatedAt: user.UpdatedAt,
  109. }, nil
  110. }
  111. // UpdateUser 更新用户信息。
  112. func (s *UserService) UpdateUser(input UpdateUserInput) (*UserSummary, error) {
  113. // 检查用户是否存在
  114. _, err := s.users.GetByID(input.UserID)
  115. if err != nil {
  116. if errors.Is(err, gorm.ErrRecordNotFound) {
  117. return nil, errors.New("用户不存在")
  118. }
  119. return nil, err
  120. }
  121. // 构建更新字段
  122. updates := make(map[string]interface{})
  123. // 更新角色
  124. if input.Role != nil {
  125. role := strings.TrimSpace(*input.Role)
  126. if role != "admin" && role != "agent" {
  127. return nil, errors.New("角色只能是 admin 或 agent")
  128. }
  129. updates["role"] = role
  130. }
  131. // 更新昵称
  132. if input.Nickname != nil {
  133. updates["nickname"] = strings.TrimSpace(*input.Nickname)
  134. }
  135. // 更新邮箱
  136. if input.Email != nil {
  137. updates["email"] = strings.TrimSpace(*input.Email)
  138. }
  139. // 更新 AI 对话接收设置
  140. if input.ReceiveAIConversations != nil {
  141. updates["receive_ai_conversations"] = *input.ReceiveAIConversations
  142. }
  143. // 如果没有需要更新的字段,直接返回
  144. if len(updates) == 0 {
  145. return s.GetUser(input.UserID)
  146. }
  147. // 执行更新
  148. if err := s.users.UpdateFields(input.UserID, updates); err != nil {
  149. return nil, err
  150. }
  151. // 返回更新后的用户信息
  152. return s.GetUser(input.UserID)
  153. }
  154. // DeleteUser 删除用户。
  155. func (s *UserService) DeleteUser(id uint, currentUserID uint) error {
  156. // 防止删除当前登录用户
  157. if id == currentUserID {
  158. return errors.New("不能删除当前登录用户")
  159. }
  160. // 检查用户是否存在并获取用户信息
  161. user, err := s.users.GetByID(id)
  162. if err != nil {
  163. if errors.Is(err, gorm.ErrRecordNotFound) {
  164. return errors.New("用户不存在")
  165. }
  166. return err
  167. }
  168. // 防止删除最后一个管理员
  169. if user.Role == "admin" {
  170. count, err := s.users.CountByRole("admin")
  171. if err != nil {
  172. return err
  173. }
  174. if count <= 1 {
  175. return errors.New("不能删除最后一个管理员")
  176. }
  177. }
  178. // 执行删除
  179. if err := s.users.Delete(id); err != nil {
  180. return err
  181. }
  182. return nil
  183. }
  184. // UpdateUserPassword 更新用户密码。
  185. func (s *UserService) UpdateUserPassword(input UpdatePasswordInput) error {
  186. // 检查用户是否存在
  187. user, err := s.users.GetByID(input.UserID)
  188. if err != nil {
  189. if errors.Is(err, gorm.ErrRecordNotFound) {
  190. return errors.New("用户不存在")
  191. }
  192. return err
  193. }
  194. // 验证新密码
  195. if input.NewPassword == "" {
  196. return errors.New("新密码不能为空")
  197. }
  198. // 如果不是管理员操作,需要验证旧密码
  199. if !input.IsAdmin {
  200. if input.OldPassword == nil || *input.OldPassword == "" {
  201. return errors.New("需要提供旧密码")
  202. }
  203. if err := bcrypt.CompareHashAndPassword([]byte(user.Password), []byte(*input.OldPassword)); err != nil {
  204. return errors.New("旧密码不正确")
  205. }
  206. }
  207. // 加密新密码
  208. hash, err := bcrypt.GenerateFromPassword([]byte(input.NewPassword), bcrypt.DefaultCost)
  209. if err != nil {
  210. return errors.New("密码加密失败")
  211. }
  212. // 更新密码
  213. if err := s.users.UpdateFields(input.UserID, map[string]interface{}{
  214. "password": string(hash),
  215. }); err != nil {
  216. return err
  217. }
  218. return nil
  219. }