79 lines
2.5 KiB
Go
79 lines
2.5 KiB
Go
|
package model
|
||
|
|
||
|
import (
|
||
|
"context"
|
||
|
"database/sql"
|
||
|
"errors"
|
||
|
"fmt"
|
||
|
"github.com/zeromicro/go-zero/core/stores/cache"
|
||
|
"github.com/zeromicro/go-zero/core/stores/sqlx"
|
||
|
)
|
||
|
|
||
|
var _ UsersModel = (*customUsersModel)(nil)
|
||
|
|
||
|
type (
|
||
|
// UsersModel is an interface to be customized, add more methods here,
|
||
|
// and implement the added methods in customUsersModel.
|
||
|
UsersModel interface {
|
||
|
usersModel
|
||
|
UpdateUserTrans(ctx context.Context, user *Users, session sqlx.Session) (sql.Result, error)
|
||
|
FindOneTrans(ctx context.Context, userId int64, session sqlx.Session) (*Users, error)
|
||
|
}
|
||
|
|
||
|
customUsersModel struct {
|
||
|
*defaultUsersModel
|
||
|
}
|
||
|
)
|
||
|
|
||
|
// NewUsersModel returns a model for the database table.
|
||
|
func NewUsersModel(conn sqlx.SqlConn, c cache.CacheConf, opts ...cache.Option) UsersModel {
|
||
|
return &customUsersModel{
|
||
|
defaultUsersModel: newUsersModel(conn, c, opts...),
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func (m *defaultUsersModel) UpdateUserTrans(ctx context.Context, user *Users, session sqlx.Session) (sql.Result, error) {
|
||
|
userIdKey := fmt.Sprintf("%s%v", cacheUsersIdPrefix, user.Id)
|
||
|
usersPhoneKey := fmt.Sprintf("%s%v", cacheUsersPhonePrefix, user.Phone)
|
||
|
usersUsernameKey := fmt.Sprintf("%s%v", cacheUsersUsernamePrefix, user.Username)
|
||
|
query := fmt.Sprintf("UPDATE %s SET %s WHERE `id` = ?", m.table, usersRowsWithPlaceHolder)
|
||
|
ret, err := session.ExecCtx(ctx, query, user.Username, user.Password, user.Phone, user.AuthStatus, user.Id)
|
||
|
if err != nil {
|
||
|
return nil, err
|
||
|
}
|
||
|
|
||
|
// 2. 删除缓存,保证所有缓存操作成功
|
||
|
cacheKeys := []string{userIdKey, usersPhoneKey, usersUsernameKey}
|
||
|
cacheErrors := make([]error, len(cacheKeys))
|
||
|
|
||
|
cacheErrors[0] = m.DelCacheCtx(ctx, userIdKey)
|
||
|
cacheErrors[1] = m.DelCacheCtx(ctx, usersPhoneKey)
|
||
|
cacheErrors[2] = m.DelCacheCtx(ctx, usersUsernameKey)
|
||
|
|
||
|
// 3. 检查缓存操作是否全部成功
|
||
|
for _, cacheErr := range cacheErrors {
|
||
|
if cacheErr != nil {
|
||
|
return nil, cacheErr // 返回第一个缓存更新失败的错误
|
||
|
}
|
||
|
}
|
||
|
return ret, err
|
||
|
}
|
||
|
func (m *defaultUsersModel) FindOneTrans(ctx context.Context, userId int64, session sqlx.Session) (*Users, error) {
|
||
|
// 定义 SQL 查询语句
|
||
|
query := fmt.Sprintf("SELECT %s FROM %s WHERE `id` = ? LIMIT 1", usersRows, m.table)
|
||
|
|
||
|
var user Users
|
||
|
// 在事务上下文中执行查询
|
||
|
err := session.QueryRowCtx(ctx, &user, query, userId)
|
||
|
if err != nil {
|
||
|
if errors.Is(err, sql.ErrNoRows) {
|
||
|
// 如果没有找到记录,返回 nil 和 ErrNotFound 错误
|
||
|
return nil, ErrNotFound
|
||
|
}
|
||
|
return nil, err
|
||
|
}
|
||
|
|
||
|
// 返回查询结果
|
||
|
return &user, nil
|
||
|
}
|