Files
2025-07-29 12:45:07 +08:00

251 lines
5.7 KiB
Go

package service
import (
"context"
"cms-api/internal/dao"
"cms-api/internal/model"
"github.com/gogf/gf/v2/crypto/gmd5"
"github.com/gogf/gf/v2/errors/gerror"
"github.com/gogf/gf/v2/frame/g"
"github.com/gogf/gf/v2/os/gtime"
"github.com/gogf/gf/v2/util/gconv"
)
type sAdmin struct{}
func Admin() *sAdmin {
return &sAdmin{}
}
// Login 管理员登录
func (s *sAdmin) Login(ctx context.Context, req *model.LoginRequest) (*model.LoginResponse, error) {
// 查询管理员
admin := &model.Admin{}
err := dao.Admin.Ctx(ctx).Where("username", req.Username).Where("deleted_at", 0).Scan(admin)
if err != nil {
return nil, err
}
if admin.Id == 0 {
return nil, gerror.New("用户名或密码错误")
}
// 验证密码
if !s.VerifyPassword(req.Password, admin.Password) {
return nil, gerror.New("用户名或密码错误")
}
// 检查状态
if admin.Status != 1 {
return nil, gerror.New("账号已被禁用")
}
// 更新登录信息
_, err = dao.Admin.Ctx(ctx).Where("id", admin.Id).Update(g.Map{
"last_login_at": gtime.Now().Unix(),
"last_login_ip": g.RequestFromCtx(ctx).GetClientIp(),
"updated_at": gtime.Now(),
})
if err != nil {
g.Log().Error(ctx, "更新登录信息失败:", err)
}
// 生成token
token, err := Auth.GenerateToken(ctx, uint64(admin.Id))
if err != nil {
return nil, err
}
// 清除密码字段
admin.Password = ""
return &model.LoginResponse{
Token: token,
Admin: admin,
}, nil
}
// GetById 根据ID获取管理员信息
func (s *sAdmin) GetById(ctx context.Context, id int) (*model.Admin, error) {
admin := &model.Admin{}
err := dao.Admin.Ctx(ctx).Where("id", id).Where("deleted_at", 0).Scan(admin)
if err != nil {
return nil, err
}
if admin.Id == 0 {
return nil, nil
}
// 清除密码字段
admin.Password = ""
return admin, nil
}
// List 获取管理员列表
func (s *sAdmin) List(ctx context.Context, req *model.ListRequest) (*model.PageResponse, error) {
var (
page = req.Page
pageSize = req.PageSize
keyword = req.Keyword
)
if page <= 0 {
page = 1
}
if pageSize <= 0 {
pageSize = 10
}
query := dao.Admin.Ctx(ctx).Where("deleted_at", 0)
// 关键词搜索
if keyword != "" {
query = query.WhereOr("username LIKE ?", "%"+keyword+"%").
WhereOr("real_name LIKE ?", "%"+keyword+"%").
WhereOr("email LIKE ?", "%"+keyword+"%")
}
// 状态筛选
if req.Status >= 0 {
query = query.Where("status", req.Status)
}
// 获取总数
total, err := query.Count()
if err != nil {
return nil, err
}
// 获取列表
var admins []*model.Admin
err = query.Page(page, pageSize).OrderDesc("id").Scan(&admins)
if err != nil {
return nil, err
}
// 清除密码字段
for _, admin := range admins {
admin.Password = ""
}
return &model.PageResponse{
List: admins,
Total: total,
Page: page,
PageSize: pageSize,
TotalPages: (total + pageSize - 1) / pageSize,
}, nil
}
// Create 创建管理员
func (s *sAdmin) Create(ctx context.Context, req *model.CreateAdminRequest) error {
// 检查用户名是否存在
count, err := dao.Admin.Ctx(ctx).Where("username", req.Username).Where("deleted_at", 0).Count()
if err != nil {
return err
}
if count > 0 {
return gerror.New("用户名已存在")
}
// 检查邮箱是否存在
count, err = dao.Admin.Ctx(ctx).Where("email", req.Email).Where("deleted_at", 0).Count()
if err != nil {
return err
}
if count > 0 {
return gerror.New("邮箱已存在")
}
// 加密密码
hashedPassword := s.HashPassword(req.Password)
// 创建管理员
_, err = dao.Admin.Ctx(ctx).Insert(g.Map{
"username": req.Username,
"password": hashedPassword,
"real_name": req.RealName,
"email": req.Email,
"phone": req.Phone,
"role_id": req.RoleId,
"status": 1,
"created_at": gtime.Now(),
"updated_at": gtime.Now(),
})
return err
}
// Update 更新管理员
func (s *sAdmin) Update(ctx context.Context, id int, req *model.UpdateAdminRequest) error {
// 检查管理员是否存在
admin, err := s.GetById(ctx, id)
if err != nil {
return err
}
if admin == nil {
return gerror.New("管理员不存在")
}
// 检查邮箱是否被其他管理员使用
count, err := dao.Admin.Ctx(ctx).Where("email", req.Email).Where("id !=", id).Where("deleted_at", 0).Count()
if err != nil {
return err
}
if count > 0 {
return gerror.New("邮箱已被使用")
}
// 更新管理员
_, err = dao.Admin.Ctx(ctx).Where("id", id).Update(g.Map{
"real_name": req.RealName,
"email": req.Email,
"phone": req.Phone,
"role_id": req.RoleId,
"status": req.Status,
"updated_at": gtime.Now(),
})
return err
}
// Delete 删除管理员
func (s *sAdmin) Delete(ctx context.Context, id int) error {
// 检查管理员是否存在
admin, err := s.GetById(ctx, id)
if err != nil {
return err
}
if admin == nil {
return gerror.New("管理员不存在")
}
// 软删除
_, err = dao.Admin.Ctx(ctx).Where("id", id).Update(g.Map{
"deleted_at": gtime.Now().Unix(),
"updated_at": gtime.Now(),
})
return err
}
// HashPassword 加密密码
func (s *sAdmin) HashPassword(password string) string {
return gmd5.MustEncrypt(password + "cms_salt_2024")
}
// VerifyPassword 验证密码
func (s *sAdmin) VerifyPassword(password, hashedPassword string) bool {
return gmd5.MustEncrypt(password+"cms_salt_2024") == hashedPassword
}
// Profile 获取当前管理员信息
func (s *sAdmin) Profile(ctx context.Context) (*model.Admin, error) {
adminId := gconv.Int(g.RequestFromCtx(ctx).GetCtxVar("admin_id"))
return s.GetById(ctx, adminId)
}
// UpdateProfile 更新当前管理员信息
func (s *sAdmin) UpdateProfile(ctx context.Context, req *model.UpdateAdminRequest) error {
adminId := gconv.Int(g.RequestFromCtx(ctx).GetCtxVar("admin_id"))
return s.Update(ctx, adminId, req)
}