i2bill_user_model.go 6.3 KB

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