Files
2022-01-07 16:12:43 +08:00

365 lines
10 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package user
import (
"SciencesServer/app/api/admin/model"
"SciencesServer/app/basic/controller"
model2 "SciencesServer/app/common/model"
"SciencesServer/app/service"
"SciencesServer/app/session"
"SciencesServer/config"
"SciencesServer/serve/logger"
"SciencesServer/serve/orm"
"SciencesServer/utils"
"errors"
"fmt"
"gorm.io/gorm"
"strings"
"time"
)
type Instance struct{ *session.Admin }
type InstanceHandle func(session *session.Admin) *Instance
type (
// InstanceInfo 基本信息
InstanceInfo struct {
ID string `json:"id"`
InstanceUserInfo
Account string `json:"account"`
Gender model2.GenderKind `json:"gender"`
IsAdmin model2.SysUserAdministrator `json:"is_admin"`
Status model2.SysUserStatus `json:"status"`
Department *InstanceDepartmentInfo `json:"department"`
//Role *InstanceRoleInfo `json:"role"`
RoleIDs []string `json:"role_ids"`
Remark string `json:"remark"`
CreatedAt time.Time `json:"created_at"`
}
// InstanceUserInfo 用户信息
InstanceUserInfo struct {
UID string `json:"uid"`
Avatar string `json:"avatar"`
Name string `json:"name"`
Email string `json:"email"`
Mobile string `json:"mobile"`
}
// InstanceDepartmentInfo 部门信息
InstanceDepartmentInfo struct {
ID string `json:"id"`
Name string `json:"name"`
}
// InstanceRoleInfo 角色信息
InstanceRoleInfo struct {
IDs []string `json:"ids"`
Names []string `json:"names"`
}
)
// InstanceForm 表单信息
type InstanceForm struct {
ID uint64
Account, Name, Mobile, Password, Email, Remark string
Gender, Status int
DepartmentID uint64
RoleIDs []uint64
}
func (c *InstanceForm) sync(tx *gorm.DB, first bool, uid, tenantID uint64) error {
var err error
mSysUserDepartment := model.NewSysUserDepartment()
mSysUserRole := model.NewSysUserRole()
permission := service.NewPermission(
service.WithAuthTenant(fmt.Sprintf("%d", tenantID)),
service.WithAuthUser(fmt.Sprintf("%d", uid)),
)
if !first {
if err = model2.DeleteWhere(mSysUserDepartment.SysUserDepartment, []*model2.ModelWhere{
model2.NewWhere("uid", uid)}, tx); err != nil {
return err
}
if err = model2.DeleteWhere(mSysUserRole.SysUserRole, []*model2.ModelWhere{
model2.NewWhere("uid", uid)}, tx); err != nil {
return err
}
go utils.TryCatch(func() {
if _, err = permission.DeleteRolesForUser(false); err != nil {
logger.ErrorF("Casbin 删除用户【%d】权限错误%v", uid, err)
}
})
}
if c.DepartmentID > 0 {
mSysUserDepartment.UID = uid
mSysUserDepartment.DepartmentID = c.DepartmentID
if err = model2.Create(mSysUserDepartment.SysUserDepartment, tx); err != nil {
return err
}
}
if len(c.RoleIDs) > 0 {
roles := make([]*model2.SysUserRole, 0)
rolesIDs := make([]string, 0)
for _, v := range c.RoleIDs {
roles = append(roles, &model2.SysUserRole{
UID: uid,
RoleID: v,
})
rolesIDs = append(rolesIDs, fmt.Sprintf("%d", v))
}
if err := model2.Creates(mSysUserRole.SysUserRole, roles, tx); err != nil {
return err
}
go utils.TryCatch(func() {
permission.AddRole(rolesIDs)
if _, err = permission.AddRoleForUser(); err != nil {
logger.ErrorF("Casbin 给予用户【%d】权限错误%v", uid, err)
}
})
}
return nil
}
// Info 用户信息
func (c *Instance) Info() (*InstanceUserInfo, error) {
mSysUser := model.NewSysUser()
_, err := model2.FirstWhere(mSysUser.SysUser, model2.NewWhere("uuid", c.UID))
if err != nil {
return nil, err
}
return &InstanceUserInfo{
UID: mSysUser.UUIDString(), Avatar: mSysUser.Avatar, Name: mSysUser.Name,
Email: mSysUser.Email, Mobile: mSysUser.Mobile,
}, nil
}
// Index 列表信息
func (c *Instance) Index(name, mobile string, departmentIDs []uint64, status, page, pageSize int) (*controller.ReturnPages, error) {
where := []*model2.ModelWhere{model2.NewWhere("u.tenant_id", c.TenantID)}
if name != "" {
where = append(where, model2.NewWhereLike("u.name", name))
}
if mobile != "" {
where = append(where, model2.NewWhereLike("u.mobile", mobile))
}
if len(departmentIDs) > 0 {
where = append(where, model2.NewWhereIn("d.id", departmentIDs))
}
if status > 0 {
where = append(where, model2.NewWhere("u.status", status))
}
mSysUser := model.NewSysUser()
var count int64
out, err := mSysUser.Users(page, pageSize, &count, where...)
if err != nil {
return nil, err
}
list := make([]*InstanceInfo, 0)
obj := new(model2.Model)
for _, v := range out {
data := &InstanceInfo{ID: v.GetEncodeID(),
InstanceUserInfo: InstanceUserInfo{
UID: v.UUIDString(), Avatar: v.Avatar, Name: v.Name, Email: v.Email, Mobile: v.Mobile,
},
Account: v.Account, Gender: v.Gender.Gender, IsAdmin: v.IsAdmin, Status: v.Status, CreatedAt: v.CreatedAt,
//Role: make([]*InstanceRoleInfo, 0),
RoleIDs: make([]string, 0),
Remark: v.Remark,
}
if v.DepartmentID > 0 {
obj.ID = v.DepartmentID
data.Department = &InstanceDepartmentInfo{
ID: obj.GetEncodeID(),
Name: v.DepartmentName,
}
}
if v.RoleIDs != "" {
roleIDs := make([]string, 0)
for _, v := range strings.Split(v.RoleIDs, "&&") {
obj.ID = utils.StringToUnit64(v)
roleIDs = append(roleIDs, obj.GetEncodeID())
}
//roles := &InstanceRoleInfo{
// IDs: roleIDs,
//Names: strings.Split(v.RoleNames, "&&"),
//}
data.RoleIDs = roleIDs
}
list = append(list, data)
}
return &controller.ReturnPages{Data: list, Count: count}, nil
}
// Add 添加用户
func (c *Instance) Add(params *InstanceForm) error {
if !utils.ValidateMobile(params.Mobile) {
return errors.New("操作错误,手机号码格式错误")
}
mSysUser := model.NewSysUser()
// 查询登录账户或手机号码是否注册
var count int64
err := model2.Count(mSysUser.SysUser, &count, model2.NewWhere("mobile", params.Mobile),
model2.NewWhere("tenant_id", c.TenantID))
if err != nil {
return err
} else if count > 0 {
return errors.New("操作错误,当前手机号码已注册")
}
return orm.GetDB().Transaction(func(tx *gorm.DB) error {
mSysUser.TenantID = c.TenantID
mSysUser.Account = params.Account
mSysUser.Name = params.Name
mSysUser.Mobile = params.Mobile
mSysUser.Email = params.Email
mSysUser.Gender.Gender = model2.GenderKind(params.Gender)
mSysUser.Password = params.Password
mSysUser.Status = model2.SysUserStatus(params.Status)
mSysUser.Remark = params.Remark
if err = model2.Create(mSysUser.SysUser, tx); err != nil {
return err
}
if err = params.sync(tx, true, mSysUser.UUID, c.TenantID); err != nil {
return err
}
return nil
})
}
// Edit 修改用户信息
func (c *Instance) Edit(params *InstanceForm) error {
mSysUser := model.NewSysUser()
mSysUser.ID = params.ID
isExist, err := model2.First(mSysUser.SysUser)
if err != nil {
return nil
} else if !isExist {
return errors.New("操作错误,用户信息不存在或已被删除")
} else if c.TenantID > 0 && mSysUser.TenantID != c.TenantID {
return errors.New("操作错误,无权限操作")
}
if mSysUser.Mobile != params.Mobile {
if !utils.ValidateMobile(params.Mobile) {
return errors.New("操作错误,手机号码格式错误")
}
var count int64
if err = model2.Count(mSysUser.SysUser, &count, model2.NewWhere("mobile", params.Mobile),
model2.NewWhere("tenant_id", c.TenantID)); err != nil {
return nil
} else if count > 0 {
return errors.New("操作错误,当前手机号码已注册")
}
mSysUser.Mobile = params.Mobile
}
mSysUser.Name = params.Name
mSysUser.Email = params.Email
mSysUser.Gender.Gender = model2.GenderKind(params.Gender)
mSysUser.Remark = params.Remark
return orm.GetDB().Transaction(func(tx *gorm.DB) error {
if err = model2.Updates(mSysUser.SysUser, mSysUser.SysUser, tx); err != nil {
return err
}
if err = params.sync(tx, false, mSysUser.UUID, mSysUser.TenantID); err != nil {
return err
}
return nil
})
}
func (c *Instance) Password(id uint64, password, repeatPwd string) error {
//if password != repeatPwd {
// return errors.New("操作错误,两次密码输入不一致")
//}
mSysUser := model.NewSysUser()
mSysUser.ID = id
isExist, err := model2.FirstField(mSysUser.SysUser, []string{"id", "uuid", "is_admin"})
if err != nil {
return nil
} else if !isExist {
return errors.New("操作错误,用户信息不存在或已被删除")
} else if c.TenantID > 0 && mSysUser.TenantID != c.TenantID {
return errors.New("操作错误,无权限操作")
}
mSysUser.Password = password
mSysUser.Pass()
return model2.Updates(mSysUser.SysUser, map[string]interface{}{
"password": mSysUser.Password, "salt": mSysUser.Salt, "updated_at": time.Now(),
})
}
// PasswordEdit 主动修改密码
func (c *Person) PasswordEdit(oldPassword, password, repeatPwd string) error {
if password != repeatPwd {
return errors.New("操作错误,两次密码输入不一致")
}
mSysUser := model.NewSysUser()
_, err := model2.FirstField(mSysUser.SysUser, []string{"id", "uuid", "is_admin"}, model2.NewWhere("uuid", c.UID))
if err != nil {
return err
}
if !mSysUser.ValidatePassword(oldPassword) {
return errors.New("操作错误,旧密码输入错误")
}
mSysUser.Password = password
mSysUser.Pass()
return model2.Updates(mSysUser.SysUser, map[string]interface{}{
"password": mSysUser.Password, "salt": mSysUser.Salt, "updated_at": time.Now(),
})
}
func (c *Instance) Delete(id uint64) error {
mSysUser := model.NewSysUser()
mSysUser.ID = id
isExist, err := model2.FirstField(mSysUser.SysUser, []string{"id", "uuid", "is_admin"})
if err != nil {
return nil
} else if !isExist {
return errors.New("操作错误,用户信息不存在或已被删除")
} else if c.TenantID > 0 && mSysUser.TenantID != c.TenantID {
return errors.New("操作错误,无权限操作")
} else if mSysUser.IsAdminUser() {
return errors.New("操作错误,超管用户不允许删除")
}
if err = model2.Delete(mSysUser.SysUser); err != nil {
return err
}
service.Publish(config.EventForRedisHashDestroy, config.RedisKeyForAccountAdmin, utils.UintToString(mSysUser.UUID))
return nil
}
func NewInstance() InstanceHandle {
return func(session *session.Admin) *Instance {
return &Instance{Admin: session}
}
}