usermodel.go 6.2 KB

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