Files
ai_dianshang/server/internal/service/admin.go
2025-11-17 14:11:46 +08:00

226 lines
5.5 KiB
Go

package service
import (
"dianshang/internal/model"
"dianshang/internal/repository"
"dianshang/pkg/jwt"
"errors"
"time"
"golang.org/x/crypto/bcrypt"
"gorm.io/gorm"
)
// AdminService 管理员服务
type AdminService struct {
adminRepo *repository.AdminRepository
db *gorm.DB
}
// NewAdminService 创建管理员服务
func NewAdminService(db *gorm.DB) *AdminService {
return &AdminService{
adminRepo: repository.NewAdminRepository(db),
db: db,
}
}
// LoginRequest 管理员登录请求
type LoginRequest struct {
Username string `json:"username" binding:"required"`
Password string `json:"password" binding:"required"`
}
// CreateAdminRequest 创建管理员请求
type CreateAdminRequest struct {
Username string `json:"username" binding:"required"`
Password string `json:"password" binding:"required,min=6"`
Nickname string `json:"nickname"`
Email string `json:"email"`
Phone string `json:"phone"`
RoleID uint `json:"role_id" binding:"required"`
}
// UpdateAdminRequest 更新管理员请求
type UpdateAdminRequest struct {
Nickname string `json:"nickname"`
Email string `json:"email"`
Phone string `json:"phone"`
RoleID uint `json:"role_id"`
Status *uint8 `json:"status"`
}
// AdminLoginResponse 管理员登录响应
type AdminLoginResponse struct {
Token string `json:"token"`
AdminUser *model.AdminUser `json:"admin_user"`
}
// Login 管理员登录
func (s *AdminService) Login(req *LoginRequest) (*AdminLoginResponse, error) {
// 查找管理员
admin, err := s.adminRepo.GetByUsername(req.Username)
if err != nil {
if errors.Is(err, gorm.ErrRecordNotFound) {
return nil, errors.New("用户名或密码错误")
}
return nil, err
}
// 检查管理员状态
if admin.Status == 0 {
return nil, errors.New("账户已被禁用")
}
// 验证密码
if err := bcrypt.CompareHashAndPassword([]byte(admin.Password), []byte(req.Password)); err != nil {
return nil, errors.New("用户名或密码错误")
}
// 生成JWT token
tokenExpiry := 8 * 3600 // 8小时有效期
token, err := jwt.GenerateToken(admin.ID, "admin", tokenExpiry)
if err != nil {
return nil, errors.New("生成token失败")
}
// 更新最后登录时间
now := time.Now()
admin.LastLogin = &now
s.adminRepo.Update(admin.ID, map[string]interface{}{
"last_login": now,
})
// 加载角色信息
admin, _ = s.adminRepo.GetByIDWithRole(admin.ID)
return &AdminLoginResponse{
Token: token,
AdminUser: admin,
}, nil
}
// CreateAdmin 创建管理员
func (s *AdminService) CreateAdmin(req *CreateAdminRequest) (*model.AdminUser, error) {
// 检查用户名是否已存在
if _, err := s.adminRepo.GetByUsername(req.Username); err == nil {
return nil, errors.New("用户名已存在")
}
// 加密密码
hashedPassword, err := bcrypt.GenerateFromPassword([]byte(req.Password), bcrypt.DefaultCost)
if err != nil {
return nil, errors.New("密码加密失败")
}
// 创建管理员
admin := &model.AdminUser{
Username: req.Username,
Password: string(hashedPassword),
Nickname: req.Nickname,
Email: req.Email,
Phone: req.Phone,
RoleID: req.RoleID,
Status: 1, // 默认启用
}
if err := s.adminRepo.Create(admin); err != nil {
return nil, err
}
// 返回时不包含密码
admin.Password = ""
return admin, nil
}
// GetAdminList 获取管理员列表
func (s *AdminService) GetAdminList(page, pageSize int, keyword string) ([]model.AdminUser, int64, error) {
return s.adminRepo.GetList(page, pageSize, keyword)
}
// GetAdminByID 根据ID获取管理员
func (s *AdminService) GetAdminByID(id uint) (*model.AdminUser, error) {
return s.adminRepo.GetByIDWithRole(id)
}
// UpdateAdmin 更新管理员
func (s *AdminService) UpdateAdmin(id uint, req *UpdateAdminRequest) error {
updates := make(map[string]interface{})
if req.Nickname != "" {
updates["nickname"] = req.Nickname
}
if req.Email != "" {
updates["email"] = req.Email
}
if req.Phone != "" {
updates["phone"] = req.Phone
}
if req.RoleID != 0 {
updates["role_id"] = req.RoleID
}
if req.Status != nil {
updates["status"] = *req.Status
}
return s.adminRepo.Update(id, updates)
}
// DeleteAdmin 删除管理员
func (s *AdminService) DeleteAdmin(id uint) error {
return s.adminRepo.Delete(id)
}
// ChangePassword 修改密码
func (s *AdminService) ChangePassword(id uint, oldPassword, newPassword string) error {
// 获取管理员信息
admin, err := s.adminRepo.GetByID(id)
if err != nil {
return err
}
// 验证旧密码
if err := bcrypt.CompareHashAndPassword([]byte(admin.Password), []byte(oldPassword)); err != nil {
return errors.New("原密码错误")
}
// 加密新密码
hashedPassword, err := bcrypt.GenerateFromPassword([]byte(newPassword), bcrypt.DefaultCost)
if err != nil {
return errors.New("密码加密失败")
}
// 更新密码
return s.adminRepo.Update(id, map[string]interface{}{
"password": string(hashedPassword),
})
}
// GetProfile 获取管理员个人信息
func (s *AdminService) GetProfile(id uint) (*model.AdminUser, error) {
admin, err := s.adminRepo.GetByIDWithRole(id)
if err != nil {
return nil, err
}
// 不返回密码
admin.Password = ""
return admin, nil
}
// UpdateProfile 更新管理员个人信息
func (s *AdminService) UpdateProfile(id uint, nickname, email, phone string) error {
updates := make(map[string]interface{})
if nickname != "" {
updates["nickname"] = nickname
}
if email != "" {
updates["email"] = email
}
if phone != "" {
updates["phone"] = phone
}
return s.adminRepo.Update(id, updates)
}