166 lines
3.5 KiB
Go
166 lines
3.5 KiB
Go
/**
|
||
* package service
|
||
* 作用:用户管理服务
|
||
*/
|
||
package service
|
||
|
||
import (
|
||
"errors"
|
||
"xk-websocket-v2/internal/model"
|
||
"xk-websocket-v2/internal/utils"
|
||
|
||
"gorm.io/gorm"
|
||
)
|
||
|
||
// UserService 用户服务结构体
|
||
type UserService struct {
|
||
DB *gorm.DB
|
||
}
|
||
|
||
// UserSvc 全局单例
|
||
var UserSvc *UserService
|
||
|
||
/**
|
||
* InitUserService
|
||
* 功能:初始化用户服务
|
||
*/
|
||
func InitUserService(db *gorm.DB) {
|
||
UserSvc = &UserService{DB: db}
|
||
}
|
||
|
||
/**
|
||
* GetUserByID
|
||
* 功能:根据ID获取用户
|
||
*/
|
||
func (s *UserService) GetUserByID(userID string) (*model.User, error) {
|
||
var user model.User
|
||
result := s.DB.Where("id = ?", userID).First(&user)
|
||
if result.Error != nil {
|
||
return nil, result.Error
|
||
}
|
||
user.Password = "" // 清除密码
|
||
return &user, nil
|
||
}
|
||
|
||
/**
|
||
* GetUserByEmail
|
||
* 功能:根据邮箱获取用户
|
||
*/
|
||
func (s *UserService) GetUserByEmail(email string) (*model.User, error) {
|
||
var user model.User
|
||
result := s.DB.Where("email = ?", email).First(&user)
|
||
if result.Error != nil {
|
||
return nil, result.Error
|
||
}
|
||
user.Password = "" // 清除密码
|
||
return &user, nil
|
||
}
|
||
|
||
/**
|
||
* GetUserByPhone
|
||
* 功能:根据手机号获取用户
|
||
*/
|
||
func (s *UserService) GetUserByPhone(phone string) (*model.User, error) {
|
||
var user model.User
|
||
result := s.DB.Where("phone = ?", phone).First(&user)
|
||
if result.Error != nil {
|
||
return nil, result.Error
|
||
}
|
||
user.Password = "" // 清除密码
|
||
return &user, nil
|
||
}
|
||
|
||
/**
|
||
* CreateUser
|
||
* 功能:创建用户
|
||
*/
|
||
func (s *UserService) CreateUser(user *model.User) error {
|
||
// 如果提供了密码,加密密码
|
||
if user.Password != "" {
|
||
hashedPassword, err := utils.HashPassword(user.Password)
|
||
if err != nil {
|
||
return err
|
||
}
|
||
user.Password = hashedPassword
|
||
}
|
||
return s.DB.Create(user).Error
|
||
}
|
||
|
||
/**
|
||
* UpdateUser
|
||
* 功能:更新用户信息
|
||
*/
|
||
func (s *UserService) UpdateUser(userID string, updates map[string]interface{}) error {
|
||
// 如果更新密码,需要加密
|
||
if password, ok := updates["password"].(string); ok && password != "" {
|
||
hashedPassword, err := utils.HashPassword(password)
|
||
if err != nil {
|
||
return err
|
||
}
|
||
updates["password"] = hashedPassword
|
||
}
|
||
return s.DB.Model(&model.User{}).Where("id = ?", userID).Updates(updates).Error
|
||
}
|
||
|
||
/**
|
||
* DeleteUser
|
||
* 功能:删除用户
|
||
*/
|
||
func (s *UserService) DeleteUser(userID string) error {
|
||
return s.DB.Where("id = ?", userID).Delete(&model.User{}).Error
|
||
}
|
||
|
||
/**
|
||
* GetUserList
|
||
* 功能:获取用户列表(分页)
|
||
*/
|
||
func (s *UserService) GetUserList(page, pageSize int) ([]model.User, int64, error) {
|
||
var users []model.User
|
||
var total int64
|
||
|
||
// 获取总数
|
||
s.DB.Model(&model.User{}).Count(&total)
|
||
|
||
// 分页查询
|
||
offset := (page - 1) * pageSize
|
||
result := s.DB.Offset(offset).Limit(pageSize).Find(&users)
|
||
if result.Error != nil {
|
||
return nil, 0, result.Error
|
||
}
|
||
|
||
// 清除所有用户的密码
|
||
for i := range users {
|
||
users[i].Password = ""
|
||
}
|
||
|
||
return users, total, nil
|
||
}
|
||
|
||
/**
|
||
* SearchUsers
|
||
* 功能:搜索用户(按用户名、ID、邮箱、手机号)
|
||
*/
|
||
func (s *UserService) SearchUsers(keyword string, limit int) ([]model.User, error) {
|
||
var users []model.User
|
||
|
||
query := s.DB.Where("name LIKE ? OR id LIKE ? OR email LIKE ? OR phone LIKE ?",
|
||
"%"+keyword+"%", "%"+keyword+"%", "%"+keyword+"%", "%"+keyword+"%")
|
||
|
||
if limit > 0 {
|
||
query = query.Limit(limit)
|
||
}
|
||
|
||
result := query.Find(&users)
|
||
if result.Error != nil && !errors.Is(result.Error, gorm.ErrRecordNotFound) {
|
||
return nil, result.Error
|
||
}
|
||
|
||
// 清除所有用户的密码
|
||
for i := range users {
|
||
users[i].Password = ""
|
||
}
|
||
|
||
return users, nil
|
||
}
|
||
|