usermodel.go 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. package model
  2. import (
  3. "database/sql"
  4. "fmt"
  5. "strings"
  6. "git.i2edu.net/i2/go-zero/core/stores/cache"
  7. "git.i2edu.net/i2/go-zero/core/stores/sqlc"
  8. "git.i2edu.net/i2/go-zero/core/stores/sqlx"
  9. "git.i2edu.net/i2/go-zero/core/stringx"
  10. "git.i2edu.net/i2/go-zero/tools/goctl/model/sql/builderx"
  11. )
  12. var (
  13. userFieldNames = builderx.RawFieldNames(&User{})
  14. userRows = strings.Join(userFieldNames, ",")
  15. userRowsExpectAutoSet = strings.Join(stringx.Remove(userFieldNames, "`id`", "`create_time`", "`update_time`"), ",")
  16. userRowsWithPlaceHolder = strings.Join(stringx.Remove(userFieldNames, "`id`", "`create_time`", "`update_time`"), "=?,") + "=?"
  17. cacheUserIdPrefix = "cache:user:id:"
  18. cacheUserUsernamePrefix = "cache:user:username:"
  19. cacheUserWeiXinOpenIdPrefix = "cache:user:weixin_openid:"
  20. )
  21. type (
  22. UserModel interface {
  23. Insert(data User) (sql.Result, error)
  24. FindOne(id int64) (*User, error)
  25. FindOneByUsername(username string) (*User, error)
  26. FindOneByWeiXinOpenId(openid string) (*User, error)
  27. Update(data User) error
  28. Delete(id int64) error
  29. }
  30. defaultUserModel struct {
  31. sqlc.CachedConn
  32. table string
  33. }
  34. User struct {
  35. Mobile string `db:"mobile"`
  36. Avatar string `db:"avatar"`
  37. WeixinOpenid string `db:"weixin_openid"`
  38. Password string `db:"password"`
  39. Birthday int64 `db:"birthday"`
  40. RegisterTime int64 `db:"register_time"`
  41. LastLoginTime int64 `db:"last_login_time"`
  42. Nickname string `db:"nickname"`
  43. Id int64 `db:"id"`
  44. Username string `db:"username"`
  45. Gender int64 `db:"gender"`
  46. UserLevelId int64 `db:"user_level_id"`
  47. RegisterIp string `db:"register_ip"`
  48. LastLoginIp string `db:"last_login_ip"`
  49. }
  50. )
  51. func NewUserModel(conn sqlx.SqlConn, c cache.CacheConf) UserModel {
  52. return &defaultUserModel{
  53. CachedConn: sqlc.NewConn(conn, c),
  54. table: "`user`",
  55. }
  56. }
  57. func (m *defaultUserModel) Insert(data User) (sql.Result, error) {
  58. userUsernameKey := fmt.Sprintf("%s%v", cacheUserUsernamePrefix, data.Username)
  59. ret, err := m.Exec(func(conn sqlx.SqlConn) (result sql.Result, err error) {
  60. query := fmt.Sprintf("insert into %s (%s) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", m.table, userRowsExpectAutoSet)
  61. return conn.Exec(query, data.Mobile, data.Avatar, data.WeixinOpenid, data.Password, data.Birthday, data.RegisterTime, data.LastLoginTime, data.Nickname, data.Username, data.Gender, data.UserLevelId, data.RegisterIp, data.LastLoginIp)
  62. }, userUsernameKey)
  63. return ret, err
  64. }
  65. func (m *defaultUserModel) FindOne(id int64) (*User, error) {
  66. userIdKey := fmt.Sprintf("%s%v", cacheUserIdPrefix, id)
  67. var resp User
  68. err := m.QueryRow(&resp, userIdKey, func(conn sqlx.SqlConn, v interface{}) error {
  69. query := fmt.Sprintf("select %s from %s where `id` = ? limit 1", userRows, m.table)
  70. return conn.QueryRow(v, query, id)
  71. })
  72. switch err {
  73. case nil:
  74. return &resp, nil
  75. case sqlc.ErrNotFound:
  76. return nil, ErrNotFound
  77. default:
  78. return nil, err
  79. }
  80. }
  81. func (m *defaultUserModel) FindOneByWeiXinOpenId(id string) (*User, error) {
  82. userIdKey := fmt.Sprintf("%s%v", cacheUserWeiXinOpenIdPrefix, id)
  83. var resp User
  84. err := m.QueryRow(&resp, userIdKey, func(conn sqlx.SqlConn, v interface{}) error {
  85. query := fmt.Sprintf("select %s from %s where `weixin_openid` = ? limit 1", userRows, m.table)
  86. return conn.QueryRow(v, query, id)
  87. })
  88. switch err {
  89. case nil:
  90. return &resp, nil
  91. case sqlc.ErrNotFound:
  92. return nil, ErrNotFound
  93. default:
  94. return nil, err
  95. }
  96. }
  97. func (m *defaultUserModel) FindOneByUsername(username string) (*User, error) {
  98. userUsernameKey := fmt.Sprintf("%s%v", cacheUserUsernamePrefix, username)
  99. var resp User
  100. err := m.QueryRowIndex(&resp, userUsernameKey, m.formatPrimary, func(conn sqlx.SqlConn, v interface{}) (i interface{}, e error) {
  101. query := fmt.Sprintf("select %s from %s where `username` = ? limit 1", userRows, m.table)
  102. if err := conn.QueryRow(&resp, query, username); err != nil {
  103. return nil, err
  104. }
  105. return resp.Id, nil
  106. }, m.queryPrimary)
  107. switch err {
  108. case nil:
  109. return &resp, nil
  110. case sqlc.ErrNotFound:
  111. return nil, ErrNotFound
  112. default:
  113. return nil, err
  114. }
  115. }
  116. func (m *defaultUserModel) Update(data User) error {
  117. userIdKey := fmt.Sprintf("%s%v", cacheUserIdPrefix, data.Id)
  118. userUsernameKey := fmt.Sprintf("%s%v", cacheUserUsernamePrefix, data.Username)
  119. _, err := m.Exec(func(conn sqlx.SqlConn) (result sql.Result, err error) {
  120. query := fmt.Sprintf("update %s set %s where `id` = ?", m.table, userRowsWithPlaceHolder)
  121. return conn.Exec(query, data.Mobile, data.Avatar, data.WeixinOpenid, data.Password, data.Birthday, data.RegisterTime, data.LastLoginTime, data.Nickname, data.Username, data.Gender, data.UserLevelId, data.RegisterIp, data.LastLoginIp, data.Id)
  122. }, userIdKey, userUsernameKey)
  123. return err
  124. }
  125. func (m *defaultUserModel) Delete(id int64) error {
  126. data, err := m.FindOne(id)
  127. if err != nil {
  128. return err
  129. }
  130. userIdKey := fmt.Sprintf("%s%v", cacheUserIdPrefix, id)
  131. userUsernameKey := fmt.Sprintf("%s%v", cacheUserUsernamePrefix, data.Username)
  132. _, err = m.Exec(func(conn sqlx.SqlConn) (result sql.Result, err error) {
  133. query := fmt.Sprintf("delete from %s where `id` = ?", m.table)
  134. return conn.Exec(query, id)
  135. }, userUsernameKey, userIdKey)
  136. return err
  137. }
  138. func (m *defaultUserModel) formatPrimary(primary interface{}) string {
  139. return fmt.Sprintf("%s%v", cacheUserIdPrefix, primary)
  140. }
  141. func (m *defaultUserModel) queryPrimary(conn sqlx.SqlConn, v, primary interface{}) error {
  142. query := fmt.Sprintf("select %s from %s where `id` = ? limit 1", userRows, m.table)
  143. return conn.QueryRow(v, query, primary)
  144. }