busniess-user-center/internal/repo/user.go

133 lines
4.5 KiB
Go

package repo
import (
userModel "busniess-user-center/internal/models/user"
"context"
"fmt"
"time"
"github.com/samber/do"
"gorm.io/gorm"
)
func init() {
do.Provide[UserRepo](nil, NewUserRepoS)
}
// 用户表
type User struct {
ID uint `gorm:"column:id;primary_key;AUTO_INCREMENT"` // 用户id
Account string `gorm:"column:account;NOT NULL"` // 用户账号
Name string `gorm:"column:name"` // 姓名
Mobile string `gorm:"column:mobile"` // 手机
Email string `gorm:"column:email"` // 邮箱
Pwd string `gorm:"column:pwd"` // 密码
Salt string `gorm:"column:salt;NOT NULL"` // 盐
Sex int `gorm:"column:sex;default:0"` // 性别:0-女,1-男
CreatedBy string `gorm:"column:created_by"` // 创建人
CreatedOn time.Time `gorm:"column:created_on;default:CURRENT_TIMESTAMP;NOT NULL"` // 记录创建时间
ModifiedBy string `gorm:"column:modified_by"` // 修改人
ModifiedOn time.Time `gorm:"column:modified_on;default:CURRENT_TIMESTAMP"` // 记录修改时间
}
func (m *User) TableName() string {
return "user"
}
type UserRepo interface {
GetUserByAccount(ctx context.Context, account string) (user User, err error)
GetUserByMobile(ctx context.Context, mobile string) (user User, err error)
GetUserByEmail(ctx context.Context, mobile string) (user User, err error)
SaveUser(ctx context.Context, user User) error
CreateUser(ctx context.Context, user *User) error
SetUserStatus(ctx context.Context, id uint, status userModel.UserStatus) error
Search(ctx context.Context, query *userModel.Query) ([]User, error)
SearchCount(ctx context.Context, query *userModel.Query) (int64, error)
ResetPwd(ctx context.Context, user User) error
GetUserById(ctx context.Context, id uint) (user User, err error)
BatchGetUserByIDs(ctx context.Context, ids []uint) (users []User, err error)
}
type userRepoS struct {
db *gorm.DB
}
func NewUserRepoS(i *do.Injector) (UserRepo, error) {
return &userRepoS{
db: do.MustInvoke[*gorm.DB](i),
}, nil
}
func (u *userRepoS) GetUserByAccount(ctx context.Context, account string) (user User, err error) {
err = u.db.Where("account = ?", account).Take(&user).Error
return
}
func (u *userRepoS) GetUserByMobile(ctx context.Context, mobile string) (user User, err error) {
err = u.db.Where("mobile = ?", mobile).Take(&user).Error
return
}
func (u *userRepoS) SaveUser(ctx context.Context, user User) error {
if user.ID <= 0 {
return fmt.Errorf("错误用户id:%d", user.ID)
}
return u.db.Save(user).Error
}
func (u *userRepoS) CreateUser(ctx context.Context, user *User) error {
return u.db.Create(user).Error
}
func (u *userRepoS) GetUserByEmail(ctx context.Context, email string) (user User, err error) {
err = u.db.Where("email = ?", email).Take(&user).Error
return
}
func (u *userRepoS) SetUserStatus(ctx context.Context, id uint, status userModel.UserStatus) error {
err := u.db.Model(&User{}).Where("id = ?", id).Update("status", status).Error
return err
}
func (u *userRepoS) Search(ctx context.Context, query *userModel.Query) ([]User, error) {
users := make([]User, 0)
keyword := fmt.Sprintf("%%%s%%", query.Keyword)
db := u.db.Model(&User{})
if query.Keyword != "" {
db = db.Where("account like ? or name like ?", keyword, keyword)
}
err := db.Order(query.Sort).Limit(query.PageSize).Offset(query.Page * query.PageSize).Find(&users).Error
return users, err
}
func (u *userRepoS) ResetPwd(ctx context.Context, user User) error {
err := u.db.Model(&User{}).Where("id = ?", user.ID).Updates(map[string]any{"pwd": user.Pwd, "salt": user.Salt}).Error
return err
}
func (u *userRepoS) SearchCount(ctx context.Context, query *userModel.Query) (int64, error) {
keyword := fmt.Sprintf("%%%s%%", query.Keyword)
db := u.db.Model(&User{})
if query.Keyword != "" {
db = db.Where("account like ? or name like ?", keyword, keyword)
}
var total int64
err := db.Count(&total).Error
return total, err
}
func (u *userRepoS) GetUserById(ctx context.Context, id uint) (user User, err error) {
err = u.db.Where("id = ?", id).Take(&user).Error
return
}
func (u *userRepoS) BatchGetUserByIDs(ctx context.Context, ids []uint) (users []User, err error) {
err = u.db.Where("id in ?", ids).Find(&users).Error
return
}