package services import ( "platform/pkg/u" "platform/web/core" m "platform/web/models" q "platform/web/queries" "time" "golang.org/x/crypto/bcrypt" "gorm.io/gen/field" ) var Admin = &adminService{} type adminService struct{} func (s *adminService) Page(req core.PageReq) (result []*m.Admin, count int64, err error) { return q.Admin. Preload(q.Admin.Roles). Omit(q.Admin.Password). Order(q.Admin.CreatedAt.Desc()). FindByPage(req.GetOffset(), req.GetLimit()) } func (s *adminService) All() (result []*m.Admin, err error) { return q.Admin. Omit(q.Admin.Password). Order(q.Admin.CreatedAt.Desc()). Find() } func (s *adminService) Create(create *CreateAdmin) error { // 哈希密码 hash, err := bcrypt.GenerateFromPassword([]byte(create.Password), bcrypt.DefaultCost) if err != nil { return core.NewServErr("密码加密失败", err) } return q.Q.Transaction(func(q *q.Query) error { // 创建管理员 admin := &m.Admin{ Username: create.Username, Password: string(hash), Name: create.Name, Avatar: create.Avatar, Phone: create.Phone, Email: create.Email, Status: u.Else(create.Status, m.AdminStatusEnabled), } if err := q.Admin.Create(admin); err != nil { return err } // 关联角色 if len(create.Roles) > 0 { links := make([]*m.LinkAdminRole, len(create.Roles)) for i, roleID := range create.Roles { links[i] = &m.LinkAdminRole{ AdminID: admin.ID, RoleID: roleID, } } if err := q.LinkAdminRole.CreateInBatches(links, 1000); err != nil { return err } } return nil }) } type CreateAdmin struct { Username string `json:"username" validate:"required,min=3,max=50"` Password string `json:"password" validate:"required,min=6,max=50"` Name *string `json:"name"` Avatar *string `json:"avatar"` Phone *string `json:"phone"` Email *string `json:"email"` Status *m.AdminStatus `json:"status"` Roles []int32 `json:"roles"` } func (s *adminService) Update(update *UpdateAdmin) error { simples := make([]field.AssignExpr, 0) if update.Password != nil { hash, err := bcrypt.GenerateFromPassword([]byte(*update.Password), bcrypt.DefaultCost) if err != nil { return core.NewServErr("密码加密失败", err) } simples = append(simples, q.Admin.Password.Value(string(hash))) } if update.Name != nil { simples = append(simples, q.Admin.Name.Value(*update.Name)) } if update.Avatar != nil { simples = append(simples, q.Admin.Avatar.Value(*update.Avatar)) } if update.Phone != nil { simples = append(simples, q.Admin.Phone.Value(*update.Phone)) } if update.Email != nil { simples = append(simples, q.Admin.Email.Value(*update.Email)) } if update.Status != nil { simples = append(simples, q.Admin.Status.Value(int(*update.Status))) } return q.Q.Transaction(func(q *q.Query) error { // 更新管理员基本信息 if len(simples) > 0 { _, err := q.Admin. Where( q.Admin.ID.Eq(update.Id), q.Admin.Lock.Is(false), ). UpdateSimple(simples...) if err != nil { return err } } // 更新角色关联 if update.Roles != nil { roles := *update.Roles if _, err := q.LinkAdminRole.Where(q.LinkAdminRole.AdminID.Eq(update.Id)).Delete(); err != nil { return err } if len(roles) > 0 { links := make([]*m.LinkAdminRole, len(roles)) for i, roleID := range roles { links[i] = &m.LinkAdminRole{ AdminID: update.Id, RoleID: roleID, } } if err := q.LinkAdminRole.CreateInBatches(links, 1000); err != nil { return err } } } return nil }) } type UpdateAdmin struct { Id int32 `json:"id" validate:"required"` Password *string `json:"password"` Name *string `json:"name"` Avatar *string `json:"avatar"` Phone *string `json:"phone"` Email *string `json:"email"` Status *m.AdminStatus `json:"status"` Roles *[]int32 `json:"roles"` } func (s *adminService) Remove(id int32) error { _, err := q.Admin. Where( q.Admin.ID.Eq(id), q.Admin.Lock.Is(false), ). UpdateColumn(q.Admin.DeletedAt, time.Now()) return err }