users.go 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  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. // 用户
  11. type User struct {
  12. gorm.Model
  13. // 用户名
  14. Name string `gorm:"unique"`
  15. // 用户密码,保存为 HS256 散列值
  16. Password string
  17. // 用户所有词库
  18. Dicts []Dict
  19. }
  20. var (
  21. ErrUserNameAlreadyExists = fmt.Errorf("用户名已存在")
  22. ErrWrongUserNameOrPassword = fmt.Errorf("用户名或密码错误")
  23. ErrUserNotFound = fmt.Errorf("用户不存在")
  24. )
  25. // 计算密码的 HS256 散列值
  26. func hashPassword(password string) string {
  27. mac := hmac.New(sha256.New, global.SecretKey)
  28. mac.Write([]byte(password))
  29. return fmt.Sprintf("%x", mac.Sum(nil))
  30. }
  31. // 创建用户
  32. func CreateUser(user *User) error {
  33. if global.DB.Take(user, user, "name").Error == nil {
  34. return ErrUserNameAlreadyExists
  35. }
  36. user.Password = hashPassword(user.Password)
  37. return global.DB.Select("name", "password").Create(user).Error
  38. }
  39. // 认证用户
  40. func AuthenticateUser(user *User) error {
  41. user.Password = hashPassword(user.Password)
  42. if err := global.DB.Take(user, user, "name", "password").Error; errors.Is(err, gorm.ErrRecordNotFound) {
  43. return ErrWrongUserNameOrPassword
  44. } else {
  45. return err
  46. }
  47. }
  48. // 获取用户
  49. func GetUser(user *User) error {
  50. if err := global.DB.Take(user, user, "id").Error; errors.Is(err, gorm.ErrRecordNotFound) {
  51. return ErrUserNotFound
  52. } else {
  53. return err
  54. }
  55. }