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. ErpId string `db:"erp_id"`
  52. Username string `db:"username"`
  53. Gender int64 `db:"gender"`
  54. UserLevelId int64 `db:"user_level_id"`
  55. RegisterIp string `db:"register_ip"`
  56. LastLoginIp string `db:"last_login_ip"`
  57. }
  58. )
  59. func NewUserModel(conn sqlx.SqlConn, c cache.CacheConf) UserModel {
  60. return &defaultUserModel{
  61. CachedConn: sqlc.NewConn(conn, c),
  62. table: "`user`",
  63. }
  64. }
  65. func (m *defaultUserModel) Insert(data User) (sql.Result, error) {
  66. userUsernameKey := fmt.Sprintf("%s%v", cacheUserUsernamePrefix, data.Username)
  67. ret, err := m.Exec(func(conn sqlx.SqlConn) (result sql.Result, err error) {
  68. query := fmt.Sprintf("insert into %s (%s) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", m.table, UserRowsExpectAutoSet)
  69. 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)
  70. }, userUsernameKey)
  71. return ret, err
  72. }
  73. func (m *defaultUserModel) FindOne(id int64) (*User, error) {
  74. userIdKey := fmt.Sprintf("%s%v", cacheUserIdPrefix, id)
  75. var resp User
  76. err := m.QueryRow(&resp, userIdKey, func(conn sqlx.SqlConn, v interface{}) error {
  77. query := fmt.Sprintf("select %s from %s where `id` = ? limit 1", UserRows, m.table)
  78. return conn.QueryRow(v, query, id)
  79. })
  80. switch err {
  81. case nil:
  82. return &resp, nil
  83. case sqlc.ErrNotFound:
  84. return nil, ErrNotFound
  85. default:
  86. return nil, err
  87. }
  88. }
  89. func (m *defaultUserModel) FindOneByWeiXinOpenId(id string) (*User, error) {
  90. userIdKey := fmt.Sprintf("%s%v", cacheUserWeiXinOpenIdPrefix, id)
  91. var resp User
  92. err := m.QueryRow(&resp, userIdKey, func(conn sqlx.SqlConn, v interface{}) error {
  93. query := fmt.Sprintf("select %s from %s where `weixin_openid` = ? limit 1", UserRows, m.table)
  94. return conn.QueryRow(v, query, id)
  95. })
  96. switch err {
  97. case nil:
  98. return &resp, nil
  99. case sqlc.ErrNotFound:
  100. return nil, ErrNotFound
  101. default:
  102. return nil, err
  103. }
  104. }
  105. func (m *defaultUserModel) FindOneByUsername(username string) (*User, error) {
  106. userUsernameKey := fmt.Sprintf("%s%v", cacheUserUsernamePrefix, username)
  107. var resp User
  108. err := m.QueryRowIndex(&resp, userUsernameKey, m.formatPrimary, func(conn sqlx.SqlConn, v interface{}) (i interface{}, e error) {
  109. query := fmt.Sprintf("select %s from %s where `username` = ? limit 1", UserRows, m.table)
  110. if err := conn.QueryRow(&resp, query, username); err != nil {
  111. return nil, err
  112. }
  113. return resp.Id, nil
  114. }, m.queryPrimary)
  115. switch err {
  116. case nil:
  117. return &resp, nil
  118. case sqlc.ErrNotFound:
  119. return nil, ErrNotFound
  120. default:
  121. return nil, err
  122. }
  123. }
  124. func (m *defaultUserModel) Update(data User) error {
  125. userIdKey := fmt.Sprintf("%s%v", cacheUserIdPrefix, data.Id)
  126. userUsernameKey := fmt.Sprintf("%s%v", cacheUserUsernamePrefix, data.Username)
  127. _, err := m.Exec(func(conn sqlx.SqlConn) (result sql.Result, err error) {
  128. query := fmt.Sprintf("update %s set %s where `id` = ?", m.table, UserRowsWithPlaceHolder)
  129. 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)
  130. }, userIdKey, userUsernameKey)
  131. return err
  132. }
  133. func (m *defaultUserModel) Delete(id int64) error {
  134. data, err := m.FindOne(id)
  135. if err != nil {
  136. return err
  137. }
  138. userIdKey := fmt.Sprintf("%s%v", cacheUserIdPrefix, id)
  139. userUsernameKey := fmt.Sprintf("%s%v", cacheUserUsernamePrefix, data.Username)
  140. _, err = m.Exec(func(conn sqlx.SqlConn) (result sql.Result, err error) {
  141. query := fmt.Sprintf("delete from %s where `id` = ?", m.table)
  142. return conn.Exec(query, id)
  143. }, userUsernameKey, userIdKey)
  144. return err
  145. }
  146. func (m *defaultUserModel) formatPrimary(primary interface{}) string {
  147. return fmt.Sprintf("%s%v", cacheUserIdPrefix, primary)
  148. }
  149. func (m *defaultUserModel) queryPrimary(conn sqlx.SqlConn, v, primary interface{}) error {
  150. query := fmt.Sprintf("select %s from %s where `id` = ? limit 1", UserRows, m.table)
  151. return conn.QueryRow(v, query, primary)
  152. }
  153. func (m *defaultUserModel) SetCache(key string, v interface{}) error {
  154. return m.CachedConn.SetCache(key, v)
  155. }
  156. func (m *defaultUserModel) GetCache(key string, v interface{}) error {
  157. err := m.CachedConn.GetCache(key, v)
  158. if err == sql.ErrNoRows {
  159. err = ErrRdsNotFound
  160. }
  161. return err
  162. }
  163. func (m *defaultUserModel) SetWithExpire(key string, v interface{}, expire time.Duration) error {
  164. return m.CachedConn.SetWithExpire(key, v, expire)
  165. }
  166. func (m *defaultUserModel) CacheStorage() Cache {
  167. return m
  168. }