users.go 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. package model
  2. import (
  3. "crypto/hmac"
  4. "crypto/sha256"
  5. "errors"
  6. "fmt"
  7. "woord-core-service/global"
  8. "gorm.io/gorm"
  9. )
  10. var (
  11. ErrUserNotFound = fmt.Errorf("用户不存在")
  12. ErrUserNameAlreadyExists = fmt.Errorf("用户名已存在")
  13. ErrWrongUserNameOrPassword = fmt.Errorf("用户名或密码错误")
  14. )
  15. // 用户
  16. type User struct {
  17. *gorm.Model
  18. // 用户名
  19. Name string `gorm:"unique;index"`
  20. // 用户密码,保存为 HS256 散列值
  21. Password string
  22. // 用户所有词库
  23. Dicts []Dict
  24. }
  25. type UserResult struct {
  26. ID uint `json:"id"`
  27. Name string `json:"name"`
  28. }
  29. // 计算密码的 HS256 散列值
  30. func hashPassword(password string) string {
  31. mac := hmac.New(sha256.New, global.SecretKey)
  32. mac.Write([]byte(password))
  33. return fmt.Sprintf("%x", mac.Sum(nil))
  34. }
  35. // 获取用户
  36. func GetUser(user *User) (*UserResult, error) {
  37. result := &UserResult{}
  38. if err := global.DB.Model(&User{}).Take(result, user, "id").Error; err != nil {
  39. if errors.Is(err, gorm.ErrRecordNotFound) {
  40. return nil, ErrUserNotFound
  41. }
  42. return nil, err
  43. }
  44. return result, nil
  45. }
  46. // 创建用户
  47. func CreateUser(user *User) (*UserResult, error) {
  48. if err := global.DB.Model(&User{}).Take(&struct{ ID uint }{}, user, "name").Error; !errors.Is(err, gorm.ErrRecordNotFound) {
  49. if err != nil {
  50. return nil, err
  51. }
  52. return nil, ErrUserNameAlreadyExists
  53. }
  54. user.Password = hashPassword(user.Password)
  55. if err := global.DB.Select("name", "password").Create(user).Error; err != nil {
  56. return nil, err
  57. }
  58. return &UserResult{
  59. ID: user.ID,
  60. Name: user.Name,
  61. }, nil
  62. }
  63. // 认证用户
  64. func AuthenticateUser(user *User) (*UserResult, error) {
  65. user.Password = hashPassword(user.Password)
  66. result := &UserResult{}
  67. if err := global.DB.Model(&User{}).Take(result, user, "name", "password").Error; err != nil {
  68. if errors.Is(err, gorm.ErrRecordNotFound) {
  69. return nil, ErrWrongUserNameOrPassword
  70. }
  71. return nil, err
  72. }
  73. return result, nil
  74. }