- 管理后台帖子与用户审核操作中添加失败错误重定向处理 - 管理后台帖子、用户、评论删除操作中添加错误检查及提示 - 用户角色更新操作失败时添加错误重定向 - 用户封禁通知失败时添加相应错误提示 - 登录登出时session保存加入错误处理 - 讨论区上传目录创建失败时显示错误提示 - 移除admin_dashboard.html多余样式及修正侧边栏当前页高亮 - admin_posts.html和admin_users.html添加状态样式动态使用的隐藏span元素 - admin_users.html为角色选择添加label以提升无障碍性 - 升级项目依赖版本,包含gin、gorm、validator等核心库版本更新
125 lines
3.3 KiB
Go
125 lines
3.3 KiB
Go
package repositories
|
|
|
|
import (
|
|
"time"
|
|
|
|
"lv8girl/internal/models"
|
|
|
|
"golang.org/x/crypto/bcrypt"
|
|
)
|
|
|
|
type UserRepository struct{}
|
|
|
|
func NewUserRepository() *UserRepository {
|
|
return &UserRepository{}
|
|
}
|
|
|
|
func (r *UserRepository) FindByID(id uint) (*models.User, error) {
|
|
var user models.User
|
|
err := DB.First(&user, id).Error
|
|
return &user, err
|
|
}
|
|
|
|
func (r *UserRepository) FindByUsernameOrEmail(login string) (*models.User, error) {
|
|
var user models.User
|
|
err := DB.Where("username = ? OR email = ?", login, login).First(&user).Error
|
|
return &user, err
|
|
}
|
|
|
|
func (r *UserRepository) FindByUsername(username string) (*models.User, error) {
|
|
var user models.User
|
|
err := DB.Where("username = ?", username).First(&user).Error
|
|
return &user, err
|
|
}
|
|
|
|
func (r *UserRepository) FindByEmail(email string) (*models.User, error) {
|
|
var user models.User
|
|
err := DB.Where("email = ?", email).First(&user).Error
|
|
return &user, err
|
|
}
|
|
|
|
func (r *UserRepository) ExistsByUsernameOrEmail(username, email string) bool {
|
|
var count int64
|
|
DB.Model(&models.User{}).Where("username = ? OR email = ?", username, email).Count(&count)
|
|
return count > 0
|
|
}
|
|
|
|
func (r *UserRepository) Create(user *models.User) error {
|
|
return DB.Create(user).Error
|
|
}
|
|
|
|
func (r *UserRepository) Update(user *models.User) error {
|
|
return DB.Save(user).Error
|
|
}
|
|
|
|
func (r *UserRepository) UpdateField(id uint, field string, value interface{}) error {
|
|
return DB.Model(&models.User{}).Where("id = ?", id).Update(field, value).Error
|
|
}
|
|
|
|
func (r *UserRepository) UpdateLastActive(id uint) error {
|
|
now := time.Now()
|
|
return r.UpdateField(id, "last_active", now)
|
|
}
|
|
|
|
func (r *UserRepository) Delete(id uint) error {
|
|
return DB.Delete(&models.User{}, id).Error
|
|
}
|
|
|
|
func (r *UserRepository) Count() (int64, error) {
|
|
var count int64
|
|
err := DB.Model(&models.User{}).Count(&count).Error
|
|
return count, err
|
|
}
|
|
|
|
func (r *UserRepository) CountOnline() (int64, error) {
|
|
var count int64
|
|
fiveMinutesAgo := time.Now().Add(-5 * time.Minute)
|
|
err := DB.Model(&models.User{}).Where("last_active > ?", fiveMinutesAgo).Count(&count).Error
|
|
return count, err
|
|
}
|
|
|
|
func (r *UserRepository) CountByRole(role string) (int64, error) {
|
|
var count int64
|
|
err := DB.Model(&models.User{}).Where("role = ?", role).Count(&count).Error
|
|
return count, err
|
|
}
|
|
|
|
func (r *UserRepository) FindPending() ([]models.User, error) {
|
|
var users []models.User
|
|
err := DB.Where("status = ?", "pending").Order("created_at ASC").Find(&users).Error
|
|
return users, err
|
|
}
|
|
|
|
func (r *UserRepository) FindAll() ([]models.User, error) {
|
|
var users []models.User
|
|
err := DB.Order("id").Find(&users).Error
|
|
return users, err
|
|
}
|
|
|
|
func (r *UserRepository) HashPassword(password string) (string, error) {
|
|
bytes, err := bcrypt.GenerateFromPassword([]byte(password), bcrypt.DefaultCost)
|
|
return string(bytes), err
|
|
}
|
|
|
|
func (r *UserRepository) CheckPassword(password, hash string) bool {
|
|
err := bcrypt.CompareHashAndPassword([]byte(hash), []byte(password))
|
|
return err == nil
|
|
}
|
|
|
|
func (r *UserRepository) CreateAdminIfNotExists() error {
|
|
var count int64
|
|
DB.Model(&models.User{}).Where("role = ?", "admin").Count(&count)
|
|
if count == 0 {
|
|
passwordHash, _ := r.HashPassword("admin123")
|
|
admin := models.User{
|
|
Username: "admin",
|
|
Email: "admin@lv8girl.local",
|
|
PasswordHash: passwordHash,
|
|
Role: "admin",
|
|
Status: "approved",
|
|
}
|
|
return DB.Create(&admin).Error
|
|
}
|
|
return nil
|
|
}
|