1. package main
  2. import (
  3. "errors"
  4. "fmt"
  5. "github.com/boltdb/bolt"
  6. "github.com/timshannon/bolthold"
  7. )
  8. const (
  9. boltUserKey = "User_ID:%d" //user 表 key
  10. boltUserIDIncrementKey = "User_ID_Increment" //user 表 ID 计数
  11. )
  12. // User 用户基础数据表
  13. type User struct {
  14. ID int64 `json:"id"`
  15. OpenID string `json:"-" boltholdIndex:"OpenID"` // 用户的唯一标识
  16. Nickname string `json:"nickName"` // 用户昵称
  17. }
  18. func init() {
  19. Registr2Bolt(&User{})
  20. }
  21. // GetUserByIDFromBolt GetUserByID returns the user object by given ID if exists.
  22. func GetUserByIDFromBolt(id int64) (*User, error) {
  23. if id <= 0 {
  24. return nil, errors.New("userID nil")
  25. }
  26. u := new(User)
  27. key := fmt.Sprintf(boltUserKey, id)
  28. err := BoltX.Get(key, u)
  29. if err != nil {
  30. if BoltX.IsNotFoundError(err) {
  31. return nil, &ErrDataNotExist{
  32. Data: &struct{ UserID int64 }{id},
  33. }
  34. }
  35. return nil, err
  36. }
  37. return u, nil
  38. }
  39. // GetUserByOpenIDFromBolt Get UserInfo By OpenID
  40. func GetUserByOpenIDFromBolt(openID string) (*User, error) {
  41. if len(openID) <= 0 {
  42. return nil, errors.New("openID nil")
  43. }
  44. var result []*User
  45. err := BoltX.Find(&result, bolthold.Where("OpenID").Eq(openID))
  46. if BoltX.IsNotFoundError(err) || len(result) <= 0 {
  47. return nil, &ErrDataNotExist{
  48. Data: &struct{ OpenID string }{openID},
  49. }
  50. }
  51. if err != nil {
  52. return nil, err
  53. }
  54. u := result[0]
  55. return u, nil
  56. }
  57. // AddOrUpdateBoltUserInfo 添加或者更新用户
  58. func AddOrUpdateBoltUserInfo(u *User) (*User, error) {
  59. if len(u.OpenID) <= 0 {
  60. return nil, NewParamsError("OpenID")
  61. }
  62. var err error
  63. var has bool
  64. user := new(User)
  65. user, err = GetUserByOpenIDFromBolt(u.OpenID)
  66. if err != nil && !IsErrDataNotExist(err) {
  67. return nil, err
  68. }
  69. if user != nil && user.ID > 0 {
  70. has = true
  71. }
  72. bx := BoltX
  73. var tx *bolt.Tx
  74. if tx, err = bx.Bolt().Begin(true); err != nil {
  75. return nil, err
  76. }
  77. if has { //更新用户资料
  78. key := fmt.Sprintf(boltUserKey, user.ID)
  79. user.Nickname = u.Nickname
  80. if err = bx.TxUpdate(tx, key, user); err != nil {
  81. tx.Rollback()
  82. return nil, err
  83. }
  84. } else { //添加新用户
  85. // 生成新的 UserID
  86. var nextID int64
  87. if nextID, err = bx.GeNextBoltID(tx, boltUserIDIncrementKey); err != nil {
  88. tx.Rollback()
  89. return nil, err
  90. }
  91. key := fmt.Sprintf(boltUserKey, nextID)
  92. user = &User{
  93. ID: nextID,
  94. OpenID: u.OpenID,
  95. Nickname: u.Nickname,
  96. }
  97. if err := bx.TxInsert(tx, key, user); err != nil {
  98. tx.Rollback()
  99. return nil, err
  100. }
  101. }
  102. if err = tx.Commit(); err != nil {
  103. return nil, err
  104. }
  105. return user, nil
  106. }
ft_authoradmin  ft_create_time2017-08-18 10:47
 ft_update_time2017-08-18 10:47