134 lines
4.1 KiB
Go
134 lines
4.1 KiB
Go
package services
|
|
|
|
import (
|
|
"errors"
|
|
"time"
|
|
|
|
"github.com/inchstep/server/internal/models"
|
|
"golang.org/x/crypto/bcrypt"
|
|
"gorm.io/gorm"
|
|
)
|
|
|
|
type AdminService struct {
|
|
db *gorm.DB
|
|
userSvc *UserService
|
|
}
|
|
|
|
func NewAdminService(db *gorm.DB, userSvc *UserService) *AdminService {
|
|
return &AdminService{db: db, userSvc: userSvc}
|
|
}
|
|
|
|
// SeedAdmin 初始化超级管理员账号
|
|
func (s *AdminService) SeedAdmin() error {
|
|
var count int64
|
|
s.db.Model(&models.Admin{}).Count(&count)
|
|
if count > 0 {
|
|
return nil // 已有管理员,跳过
|
|
}
|
|
hash, err := bcrypt.GenerateFromPassword([]byte("admin123456"), 12)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
nick := "超级管理员"
|
|
admin := &models.Admin{
|
|
ID: generateID(),
|
|
Username: "admin",
|
|
PasswordHash: string(hash),
|
|
Nickname: &nick,
|
|
Role: models.RoleSuperAdmin,
|
|
Status: models.AdminStatusActive,
|
|
CreatedAt: time.Now(),
|
|
UpdatedAt: time.Now(),
|
|
}
|
|
return s.db.Create(admin).Error
|
|
}
|
|
|
|
// Login 管理员登录
|
|
func (s *AdminService) Login(username, password string) (*models.Admin, error) {
|
|
var admin models.Admin
|
|
if err := s.db.Where("username = ?", username).First(&admin).Error; err != nil {
|
|
return nil, errors.New("用户名或密码错误")
|
|
}
|
|
if admin.Status != models.AdminStatusActive {
|
|
return nil, errors.New("账号已被禁用")
|
|
}
|
|
if err := bcrypt.CompareHashAndPassword([]byte(admin.PasswordHash), []byte(password)); err != nil {
|
|
return nil, errors.New("用户名或密码错误")
|
|
}
|
|
return &admin, nil
|
|
}
|
|
|
|
// GetDashboardStats 获取管理后台统计数据
|
|
func (s *AdminService) GetDashboardStats() (map[string]interface{}, error) {
|
|
var totalUsers, todayUsers int64
|
|
s.db.Model(&models.User{}).Count(&totalUsers)
|
|
todayStart := time.Now().Truncate(24 * time.Hour)
|
|
s.db.Model(&models.User{}).Where("created_at >= ?", todayStart).Count(&todayUsers)
|
|
|
|
var totalPosts, totalItems, totalRecords int64
|
|
s.db.Model(&models.Post{}).Where("privacy = ?", 1).Count(&totalPosts)
|
|
s.db.Model(&models.CheckInItem{}).Count(&totalItems)
|
|
s.db.Model(&models.CheckInRecord{}).Count(&totalRecords)
|
|
|
|
return map[string]interface{}{
|
|
"totalUsers": totalUsers,
|
|
"totalPosts": totalPosts,
|
|
"totalItems": totalItems,
|
|
"totalRecords": totalRecords,
|
|
"newUsersToday": todayUsers,
|
|
}, nil
|
|
}
|
|
|
|
// ListUsers 获取用户列表(分页)
|
|
func (s *AdminService) ListUsers(page, pageSize int) ([]models.User, int64, error) {
|
|
var total int64
|
|
s.db.Model(&models.User{}).Count(&total)
|
|
var users []models.User
|
|
err := s.db.Order("created_at desc").Offset((page - 1) * pageSize).Limit(pageSize).Find(&users).Error
|
|
return users, total, err
|
|
}
|
|
|
|
// ListPosts 获取动态列表
|
|
func (s *AdminService) ListPosts(page, pageSize int) ([]models.Post, int64, error) {
|
|
var total int64
|
|
s.db.Model(&models.Post{}).Count(&total)
|
|
var posts []models.Post
|
|
err := s.db.Preload("User").Order("created_at desc").Offset((page - 1) * pageSize).Limit(pageSize).Find(&posts).Error
|
|
return posts, total, err
|
|
}
|
|
|
|
// ListAdmins 获取管理员列表
|
|
func (s *AdminService) ListAdmins() ([]models.Admin, error) {
|
|
var admins []models.Admin
|
|
err := s.db.Find(&admins).Error
|
|
return admins, err
|
|
}
|
|
|
|
// CreateAdmin 创建管理员
|
|
func (s *AdminService) CreateAdmin(username, password, role string, nickname *string) (*models.Admin, error) {
|
|
var existing models.Admin
|
|
if err := s.db.Where("username = ?", username).First(&existing).Error; err == nil {
|
|
return nil, errors.New("用户名已存在")
|
|
}
|
|
hash, err := bcrypt.GenerateFromPassword([]byte(password), 12)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
admin := &models.Admin{
|
|
ID: generateID(),
|
|
Username: username,
|
|
PasswordHash: string(hash),
|
|
Nickname: nickname,
|
|
Role: models.AdminRole(role),
|
|
Status: models.AdminStatusActive,
|
|
CreatedAt: time.Now(),
|
|
UpdatedAt: time.Now(),
|
|
}
|
|
return admin, s.db.Create(admin).Error
|
|
}
|
|
|
|
// DisableAdmin 禁用管理员
|
|
func (s *AdminService) DisableAdmin(id string) error {
|
|
return s.db.Model(&models.Admin{}).Where("id = ?", id).Update("status", models.AdminStatusDisabled).Error
|
|
}
|