251 lines
5.7 KiB
Go
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)
|
|
} |