// =========================================== // 多班级版班级管理系统 - Go 后端 // // 开发者: Canglan // 联系方式: admin@sea-studio.top // 版权归属: Sea Network Technology Studio // 许可证: Apache License 2.0 // // 版权所有 © Sea Network Technology Studio // =========================================== package repository import ( "time" "gorm.io/gorm" "hz-gitea.sea-studio.top/canglan/SharedClassManager/internal/model" ) // UserRepo 用户数据访问层 type UserRepo struct { db *gorm.DB } // NewUserRepo 创建用户 Repository func NewUserRepo(db *gorm.DB) *UserRepo { return &UserRepo{db: db} } // GetByUsername 根据用户名获取用户(含状态过滤) func (r *UserRepo) GetByUsername(username string) (*model.User, error) { var user model.User if err := r.db.Where("username = ? AND status = 1", username).First(&user).Error; err != nil { return nil, err } return &user, nil } // GetByUserID 根据用户ID获取用户 func (r *UserRepo) GetByUserID(userID int) (*model.User, error) { var user model.User if err := r.db.Where("user_id = ?", userID).First(&user).Error; err != nil { return nil, err } return &user, nil } // CreateStudent 创建学生账号 func (r *UserRepo) CreateStudent(username, passwordHash, realName string, studentID int) (int, error) { user := model.User{ Username: username, PasswordHash: passwordHash, RealName: realName, UserType: "student", StudentID: &studentID, Status: 1, NeedChangePassword: 1, } if err := r.db.Create(&user).Error; err != nil { return 0, err } return user.UserID, nil } // CreateParent 创建家长账号 func (r *UserRepo) CreateParent(username, passwordHash, realName string, studentID int) (int, error) { user := model.User{ Username: username, PasswordHash: passwordHash, RealName: realName, UserType: "parent", StudentID: &studentID, Status: 1, NeedChangePassword: 0, } if err := r.db.Create(&user).Error; err != nil { return 0, err } return user.UserID, nil } // CreateAdmin 创建管理员账号 func (r *UserRepo) CreateAdmin(username, passwordHash, realName string) (int, error) { user := model.User{ Username: username, PasswordHash: passwordHash, RealName: realName, UserType: "admin", Status: 1, NeedChangePassword: 1, } if err := r.db.Create(&user).Error; err != nil { return 0, err } return user.UserID, nil } // UpdatePassword 更新密码并清除强制改密标记 func (r *UserRepo) UpdatePassword(userID int, passwordHash string) error { return r.db.Model(&model.User{}). Where("user_id = ?", userID). Updates(map[string]interface{}{ "password_hash": passwordHash, "need_change_password": 0, }).Error } // UpdateLastLogin 更新最后登录信息 func (r *UserRepo) UpdateLastLogin(userID int, ip string) error { return r.db.Model(&model.User{}). Where("user_id = ?", userID). Updates(map[string]interface{}{ "last_login_time": time.Now(), "last_login_ip": ip, }).Error } // CheckUsernameExists 检查用户名是否存在 func (r *UserRepo) CheckUsernameExists(username string) (bool, error) { var count int64 if err := r.db.Model(&model.User{}).Where("username = ?", username).Count(&count).Error; err != nil { return false, err } return count > 0, nil } // UpdateStatus 更新用户状态 func (r *UserRepo) UpdateStatus(userID int, status int8) error { return r.db.Model(&model.User{}). Where("user_id = ?", userID). Update("status", status).Error } // UpdateRealName 更新用户真实姓名 func (r *UserRepo) UpdateRealName(userID int, realName string) error { return r.db.Model(&model.User{}). Where("user_id = ?", userID). Update("real_name", realName).Error } // GetByStudentID 根据学生ID获取关联的用户账号 func (r *UserRepo) GetByStudentID(studentID int) (*model.User, error) { var user model.User if err := r.db.Where("student_id = ? AND status = 1", studentID).First(&user).Error; err != nil { return nil, err } return &user, nil } // DeleteUser 硬删除用户记录 func (r *UserRepo) DeleteUser(userID int) error { return r.db.Unscoped().Where("user_id = ?", userID).Delete(&model.User{}).Error } // GetActiveUsernames 获取所有活跃用户的用户名列表(用于批量导入去重) func (r *UserRepo) GetActiveUsernames() ([]string, error) { var usernames []string if err := r.db.Model(&model.User{}). Where("status = 1"). Pluck("username", &usernames).Error; err != nil { return nil, err } return usernames, nil }