Files
nl-im-service/internal/service/user_service.go
2025-12-03 11:00:47 +08:00

166 lines
3.5 KiB
Go
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/**
* 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
}