160 lines
4.1 KiB
Go
160 lines
4.1 KiB
Go
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) PageAdmins(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()
|
|
}
|
|
|
|
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) CreateAdmin(create *CreateAdmin) error {
|
|
// 哈希密码
|
|
hash, err := bcrypt.GenerateFromPassword([]byte(create.Password), bcrypt.DefaultCost)
|
|
if err != nil {
|
|
return core.NewServErr("密码加密失败", err)
|
|
}
|
|
|
|
return q.Q.Transaction(func(tx *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 := tx.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 := tx.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) UpdateAdmin(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(tx *q.Query) error {
|
|
// 更新管理员基本信息
|
|
if len(simples) > 0 {
|
|
_, err := tx.Admin.
|
|
Where(tx.Admin.ID.Eq(update.Id), tx.Admin.Username.Neq("admin")).
|
|
UpdateSimple(simples...)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
}
|
|
|
|
// 更新角色关联
|
|
if update.Roles != nil {
|
|
roles := *update.Roles
|
|
if _, err := tx.LinkAdminRole.Where(tx.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 := tx.LinkAdminRole.CreateInBatches(links, 1000); err != nil {
|
|
return err
|
|
}
|
|
}
|
|
}
|
|
|
|
return nil
|
|
})
|
|
}
|
|
|
|
func (s *adminService) RemoveAdmin(id int32) error {
|
|
_, err := q.Admin.Where(q.Admin.ID.Eq(id), q.Admin.Username.Neq("admin")).UpdateColumn(q.Admin.DeletedAt, time.Now())
|
|
return err
|
|
}
|