package repositories import ( "log" "time" "github.com/niangaodev/art-code/config" "github.com/niangaodev/art-code/models" "gorm.io/gorm" ) // GetUserByUsername 根据用户名获取用户 func GetUserByUsername(username string) (*models.User, error) { var user models.User err := config.DB.Model(&models.User{}). Select("users.*, COALESCE(roles.name, users.role) as role"). Joins("LEFT JOIN roles ON users.role_id = roles.id"). Where("users.username = ? AND users.deleted_at = ?", username, 0). First(&user).Error if err != nil { if err == gorm.ErrRecordNotFound { return nil, nil } log.Printf("Error getting user by username: %v", err) return nil, err } return &user, nil } // GetUserByWxOpenID 根据微信 openid 获取用户 func GetUserByWxOpenID(openid string) (*models.User, error) { if openid == "" { return nil, nil } var user models.User err := config.DB.Model(&models.User{}). Select("users.*, COALESCE(roles.name, users.role) as role"). Joins("LEFT JOIN roles ON users.role_id = roles.id"). Where("users.wx_openid = ? AND users.deleted_at = ?", openid, 0). First(&user).Error if err != nil { if err == gorm.ErrRecordNotFound { return nil, nil } log.Printf("Error getting user by wx_openid: %v", err) return nil, err } return &user, nil } // GetUserByID 根据ID获取用户 func GetUserByID(id uint) (*models.User, error) { var user models.User err := config.DB.Model(&models.User{}). Select("users.*, COALESCE(roles.name, users.role) as role"). Joins("LEFT JOIN roles ON users.role_id = roles.id"). Where("users.id = ? AND users.deleted_at = ?", id, 0). First(&user).Error if err != nil { if err == gorm.ErrRecordNotFound { return nil, nil } log.Printf("Error getting user by ID: %v", err) return nil, err } return &user, nil } // GetUsers 获取所有用户 (分页,支持 keyword / role / isActive 搜索) func GetUsers(page, pageSize int, keyword, role string, isActive int) ([]models.User, int, error) { offset := (page - 1) * pageSize query := config.DB.Model(&models.User{}). Where("users.deleted_at = ?", 0). Joins("LEFT JOIN roles ON users.role_id = roles.id AND roles.deleted_at = 0") if keyword != "" { like := "%" + keyword + "%" query = query.Where("users.username LIKE ? OR users.email LIKE ?", like, like) } if role != "" { query = query.Where("COALESCE(roles.name, users.role) = ?", role) } if isActive >= 0 { query = query.Where("users.is_active = ?", isActive) } var total int64 if err := query.Count(&total).Error; err != nil { log.Printf("Error getting user count: %v", err) return nil, 0, err } listQuery := config.DB.Model(&models.User{}). Where("users.deleted_at = ?", 0). Joins("LEFT JOIN roles ON users.role_id = roles.id AND roles.deleted_at = 0") if keyword != "" { like := "%" + keyword + "%" listQuery = listQuery.Where("users.username LIKE ? OR users.email LIKE ?", like, like) } if role != "" { listQuery = listQuery.Where("COALESCE(roles.name, users.role) = ?", role) } if isActive >= 0 { listQuery = listQuery.Where("users.is_active = ?", isActive) } var users []models.User err := listQuery. Select("users.*, COALESCE(roles.name, users.role) as role"). Order("users.created_at DESC"). Limit(pageSize). Offset(offset). Find(&users).Error if err != nil { log.Printf("Error querying users: %v", err) return nil, 0, err } return users, int(total), nil } // CreateUser 创建用户 func CreateUser(user *models.User) error { // 如果提供了RoleID,确保它有效。如果没有RoleID但有Role name,尝试查找RoleID if user.RoleID == 0 && user.Role != "" { role, err := GetRoleByName(user.Role) if err == nil && role != nil { user.RoleID = role.ID } } err := config.DB.Create(user).Error if err != nil { log.Printf("Error creating user: %v", err) return err } return nil } // UpdateUser 更新用户 func UpdateUser(user *models.User) error { // 同样尝试解析RoleID if user.RoleID == 0 && user.Role != "" { role, err := GetRoleByName(user.Role) if err == nil && role != nil { user.RoleID = role.ID } } updates := map[string]interface{}{ "username": user.Username, "email": user.Email, "avatar": user.Avatar, "bio": user.Bio, "phone": user.Phone, "wechat": user.Wechat, "wechat_qrcode": user.WechatQrcode, "role": user.Role, "is_active": user.IsActive, "updated_at": time.Now().Unix(), } if user.RoleID != 0 { updates["role_id"] = user.RoleID } else { updates["role_id"] = nil } err := config.DB.Model(&models.User{}). Where("id = ? AND deleted_at = ?", user.ID, 0). Updates(updates).Error if err != nil { log.Printf("Error updating user: %v", err) return err } return nil } // UpdateUserPassword 更新用户密码 func UpdateUserPassword(id uint, passwordHash string) error { err := config.DB.Model(&models.User{}). Where("id = ? AND deleted_at = ?", id, 0). Updates(map[string]interface{}{ "password_hash": passwordHash, "updated_at": time.Now().Unix(), }).Error if err != nil { log.Printf("Error updating user password: %v", err) return err } return nil } // ClearUserWxOpenID 清空用户微信 openid(写 NULL,避免 unique 索引与空串冲突) func ClearUserWxOpenID(id uint) error { err := config.DB.Model(&models.User{}). Where("id = ?", id). Updates(map[string]interface{}{ "wx_openid": nil, "updated_at": time.Now().Unix(), }).Error if err != nil { log.Printf("Error clearing user wx_openid: %v", err) return err } return nil } // SetUserWxOpenID 将微信 openid 绑定到指定用户 func SetUserWxOpenID(id uint, openid string) error { err := config.DB.Model(&models.User{}). Where("id = ? AND deleted_at = ?", id, 0). Updates(map[string]interface{}{ "wx_openid": openid, "updated_at": time.Now().Unix(), }).Error if err != nil { log.Printf("Error setting user wx_openid: %v", err) return err } return nil } // DeleteUser 删除用户 (Soft Delete) func DeleteUser(id uint) error { err := config.DB.Model(&models.User{}). Where("id = ?", id). Update("deleted_at", time.Now().Unix()).Error if err != nil { log.Printf("Error deleting user: %v", err) return err } return nil } // GetUserCount 获取用户总数 func GetUserCount() (int, error) { var count int64 err := config.DB.Model(&models.User{}). Where("deleted_at = ?", 0). Count(&count).Error if err != nil { log.Printf("Error getting user count: %v", err) return 0, err } return int(count), nil } // BuildUserResponse 构建用户响应 func BuildUserResponse(user *models.User) *models.UserResponse { return &models.UserResponse{ ID: user.ID, Username: user.Username, Email: user.Email, Avatar: user.Avatar, Bio: user.Bio, Phone: user.Phone, Wechat: user.Wechat, WechatQrcode: user.WechatQrcode, RoleID: user.RoleID, Role: user.Role, IsActive: user.IsActive, CreatedAt: time.Unix(user.CreatedAt, 0).Format("2006-01-02 15:04:05"), UpdatedAt: time.Unix(user.UpdatedAt, 0).Format("2006-01-02 15:04:05"), } } // BuildUserPublicProfile 构建公开用户资料 func BuildUserPublicProfile(user *models.User) *models.UserPublicProfile { return &models.UserPublicProfile{ ID: user.ID, Username: user.Username, Email: user.Email, Avatar: user.Avatar, Bio: user.Bio, Phone: user.Phone, Wechat: user.Wechat, WechatQrcode: user.WechatQrcode, } } // UpdateCurrentUserProfile 更新当前用户资料(不含角色/状态) func UpdateCurrentUserProfile(id uint, req *models.UpdateProfileRequest) error { err := config.DB.Model(&models.User{}). Where("id = ? AND deleted_at = ?", id, 0). Updates(map[string]interface{}{ "email": req.Email, "avatar": req.Avatar, "bio": req.Bio, "phone": req.Phone, "wechat": req.Wechat, "wechat_qrcode": req.WechatQrcode, "updated_at": time.Now().Unix(), }).Error if err != nil { log.Printf("Error updating user profile: %v", err) return err } return nil } // BuildUsersResponse 构建用户列表响应 func BuildUsersResponse(users []models.User) []models.UserResponse { var responses []models.UserResponse for _, user := range users { responses = append(responses, *BuildUserResponse(&user)) } return responses }