首次提交

This commit is contained in:
zeronline
2026-06-25 08:39:47 +08:00
parent 20a93c703a
commit c5cccd346b
169 changed files with 24720 additions and 0 deletions
+133
View File
@@ -0,0 +1,133 @@
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
}