2021-09-28 11:47:19 +08:00
|
|
|
|
package user
|
|
|
|
|
|
|
|
|
|
import (
|
2022-01-05 18:40:08 +08:00
|
|
|
|
"SciencesServer/app/api/admin/model"
|
2022-01-06 22:02:09 +08:00
|
|
|
|
"SciencesServer/app/basic/controller"
|
2021-09-28 11:47:19 +08:00
|
|
|
|
model2 "SciencesServer/app/common/model"
|
|
|
|
|
"SciencesServer/app/service"
|
2022-01-06 10:43:27 +08:00
|
|
|
|
"SciencesServer/app/session"
|
2022-01-05 18:40:08 +08:00
|
|
|
|
"SciencesServer/config"
|
2022-01-06 17:11:57 +08:00
|
|
|
|
"SciencesServer/serve/logger"
|
|
|
|
|
"SciencesServer/serve/orm"
|
2021-09-28 11:47:19 +08:00
|
|
|
|
"SciencesServer/utils"
|
|
|
|
|
"errors"
|
2022-01-06 17:11:57 +08:00
|
|
|
|
"fmt"
|
|
|
|
|
"gorm.io/gorm"
|
|
|
|
|
"strings"
|
2021-09-28 11:47:19 +08:00
|
|
|
|
"time"
|
|
|
|
|
)
|
|
|
|
|
|
2022-01-06 10:43:27 +08:00
|
|
|
|
type Instance struct{ *session.Admin }
|
2021-09-28 11:47:19 +08:00
|
|
|
|
|
2022-01-06 10:43:27 +08:00
|
|
|
|
type InstanceHandle func(session *session.Admin) *Instance
|
2021-09-28 11:47:19 +08:00
|
|
|
|
|
|
|
|
|
type (
|
|
|
|
|
// InstanceInfo 基本信息
|
|
|
|
|
InstanceInfo struct {
|
2022-01-05 18:40:08 +08:00
|
|
|
|
ID string `json:"id"`
|
|
|
|
|
InstanceUserInfo
|
2022-01-06 17:11:57 +08:00
|
|
|
|
Gender model2.GenderKind `json:"gender"`
|
|
|
|
|
IsAdmin model2.SysUserAdministrator `json:"is_admin"`
|
|
|
|
|
Status model2.SysUserStatus `json:"status"`
|
|
|
|
|
Department *InstanceDepartmentInfo `json:"department"`
|
|
|
|
|
Role *InstanceRoleInfo `json:"role"`
|
|
|
|
|
CreatedAt time.Time `json:"created_at"`
|
2022-01-05 18:40:08 +08:00
|
|
|
|
}
|
|
|
|
|
// InstanceUserInfo 用户信息
|
|
|
|
|
InstanceUserInfo struct {
|
2021-09-28 11:47:19 +08:00
|
|
|
|
UID string `json:"uid"`
|
2022-01-06 10:43:27 +08:00
|
|
|
|
Avatar string `json:"avatar"`
|
2021-09-28 11:47:19 +08:00
|
|
|
|
Name string `json:"name"`
|
|
|
|
|
Email string `json:"email"`
|
|
|
|
|
Mobile string `json:"mobile"`
|
|
|
|
|
}
|
2022-01-06 17:11:57 +08:00
|
|
|
|
// InstanceDepartmentInfo 部门信息
|
|
|
|
|
InstanceDepartmentInfo struct {
|
|
|
|
|
ID string `json:"id"`
|
|
|
|
|
Name string `json:"name"`
|
|
|
|
|
}
|
|
|
|
|
// InstanceRoleInfo 角色信息
|
|
|
|
|
InstanceRoleInfo struct {
|
|
|
|
|
IDs []string `json:"ids"`
|
|
|
|
|
Names []string `json:"names"`
|
|
|
|
|
}
|
2021-09-28 11:47:19 +08:00
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
// InstanceForm 表单信息
|
|
|
|
|
type InstanceForm struct {
|
2022-01-06 17:11:57 +08:00
|
|
|
|
ID uint64
|
2021-09-28 11:47:19 +08:00
|
|
|
|
Account, Name, Mobile, Password, Remark string
|
|
|
|
|
Gender int
|
2022-01-06 17:11:57 +08:00
|
|
|
|
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
|
2021-09-28 11:47:19 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Info 用户信息
|
2022-01-05 18:40:08 +08:00
|
|
|
|
func (c *Instance) Info() (*InstanceUserInfo, error) {
|
|
|
|
|
mSysUser := model.NewSysUser()
|
2021-09-28 11:47:19 +08:00
|
|
|
|
|
|
|
|
|
_, err := model2.FirstWhere(mSysUser.SysUser, model2.NewWhere("uuid", c.UID))
|
|
|
|
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
return nil, err
|
|
|
|
|
}
|
2022-01-05 18:40:08 +08:00
|
|
|
|
return &InstanceUserInfo{
|
2022-01-06 10:43:27 +08:00
|
|
|
|
UID: mSysUser.UUIDString(), Avatar: mSysUser.Avatar, Name: mSysUser.Name,
|
|
|
|
|
Email: mSysUser.Email, Mobile: mSysUser.Mobile,
|
2021-09-28 11:47:19 +08:00
|
|
|
|
}, nil
|
|
|
|
|
}
|
|
|
|
|
|
2022-01-05 18:40:08 +08:00
|
|
|
|
// Index 列表信息
|
2022-01-06 22:02:09 +08:00
|
|
|
|
func (c *Instance) Index(name, mobile string, departmentIDs []uint64, status, page, pageSize int) (*controller.ReturnPages, error) {
|
2022-01-06 17:11:57 +08:00
|
|
|
|
where := []*model2.ModelWhere{model2.NewWhere("u.tenant_id", c.TenantID)}
|
|
|
|
|
|
2021-09-28 11:47:19 +08:00
|
|
|
|
if name != "" {
|
2022-01-06 17:11:57 +08:00
|
|
|
|
where = append(where, model2.NewWhereLike("u.name", name))
|
2021-09-28 11:47:19 +08:00
|
|
|
|
}
|
|
|
|
|
if mobile != "" {
|
2022-01-06 17:11:57 +08:00
|
|
|
|
where = append(where, model2.NewWhereLike("u.mobile", mobile))
|
2021-09-28 11:47:19 +08:00
|
|
|
|
}
|
2022-01-06 22:02:09 +08:00
|
|
|
|
if len(departmentIDs) > 0 {
|
|
|
|
|
where = append(where, model2.NewWhereIn("d.id", departmentIDs))
|
|
|
|
|
}
|
2021-09-28 11:47:19 +08:00
|
|
|
|
if status > 0 {
|
2022-01-06 17:11:57 +08:00
|
|
|
|
where = append(where, model2.NewWhere("u.status", status))
|
2021-09-28 11:47:19 +08:00
|
|
|
|
}
|
2022-01-05 18:40:08 +08:00
|
|
|
|
mSysUser := model.NewSysUser()
|
2021-09-28 11:47:19 +08:00
|
|
|
|
|
2022-01-05 18:40:08 +08:00
|
|
|
|
var count int64
|
|
|
|
|
|
2022-01-06 17:11:57 +08:00
|
|
|
|
out, err := mSysUser.Users(page, pageSize, &count, where...)
|
|
|
|
|
|
|
|
|
|
if err != nil {
|
2021-09-28 11:47:19 +08:00
|
|
|
|
return nil, err
|
|
|
|
|
}
|
2022-01-05 18:40:08 +08:00
|
|
|
|
list := make([]*InstanceInfo, 0)
|
2021-09-28 11:47:19 +08:00
|
|
|
|
|
2022-01-06 17:11:57 +08:00
|
|
|
|
obj := new(model2.Model)
|
|
|
|
|
|
2021-09-28 11:47:19 +08:00
|
|
|
|
for _, v := range out {
|
2022-01-06 17:11:57 +08:00
|
|
|
|
data := &InstanceInfo{ID: v.GetEncodeID(),
|
2022-01-05 18:40:08 +08:00
|
|
|
|
InstanceUserInfo: InstanceUserInfo{
|
2022-01-06 17:11:57 +08:00
|
|
|
|
UID: v.UUIDString(), Avatar: v.Avatar, Name: v.Name, Email: v.Email, Mobile: v.Mobile,
|
2022-01-05 18:40:08 +08:00
|
|
|
|
},
|
2022-01-06 17:11:57 +08:00
|
|
|
|
Gender: v.Gender.Gender, IsAdmin: v.IsAdmin, Status: v.Status, CreatedAt: v.CreatedAt,
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
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.Role = roles
|
|
|
|
|
}
|
|
|
|
|
list = append(list, data)
|
2021-09-28 11:47:19 +08:00
|
|
|
|
}
|
2021-10-12 13:54:05 +08:00
|
|
|
|
return &controller.ReturnPages{Data: list, Count: count}, nil
|
2021-09-28 11:47:19 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Add 添加用户
|
|
|
|
|
func (c *Instance) Add(params *InstanceForm) error {
|
|
|
|
|
if utils.ValidateMobile(params.Mobile) {
|
2022-01-05 18:40:08 +08:00
|
|
|
|
return errors.New("操作错误,手机号码格式错误")
|
2021-09-28 11:47:19 +08:00
|
|
|
|
}
|
2022-01-05 18:40:08 +08:00
|
|
|
|
mSysUser := model.NewSysUser()
|
2021-09-28 11:47:19 +08:00
|
|
|
|
// 查询登录账户或手机号码是否注册
|
|
|
|
|
var count int64
|
|
|
|
|
|
2022-01-05 18:40:08 +08:00
|
|
|
|
err := model2.Count(mSysUser.SysUser, &count, model2.NewWhere("mobile", params.Mobile),
|
|
|
|
|
model2.NewWhere("tenant_id", c.TenantID))
|
2021-09-28 11:47:19 +08:00
|
|
|
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
|
2022-01-06 17:11:57 +08:00
|
|
|
|
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.Gender.Gender = model2.GenderKind(params.Gender)
|
|
|
|
|
mSysUser.Password = params.Password
|
|
|
|
|
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
|
|
|
|
|
})
|
2021-09-28 11:47:19 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Edit 修改用户信息
|
|
|
|
|
func (c *Instance) Edit(params *InstanceForm) error {
|
2022-01-05 18:40:08 +08:00
|
|
|
|
mSysUser := model.NewSysUser()
|
|
|
|
|
mSysUser.ID = params.ID
|
2021-09-28 11:47:19 +08:00
|
|
|
|
|
2022-01-05 18:40:08 +08:00
|
|
|
|
isExist, err := model2.First(mSysUser.SysUser)
|
2021-09-28 11:47:19 +08:00
|
|
|
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
return nil
|
|
|
|
|
} else if !isExist {
|
2022-01-05 18:40:08 +08:00
|
|
|
|
return errors.New("操作错误,用户信息不存在或已被删除")
|
|
|
|
|
} else if c.TenantID > 0 && mSysUser.TenantID != c.TenantID {
|
|
|
|
|
return errors.New("操作错误,无权限操作")
|
2021-09-28 11:47:19 +08:00
|
|
|
|
}
|
2022-01-05 18:40:08 +08:00
|
|
|
|
if mSysUser.Mobile != params.Mobile {
|
|
|
|
|
if utils.ValidateMobile(params.Mobile) {
|
|
|
|
|
return errors.New("操作错误,手机号码格式错误")
|
|
|
|
|
}
|
2021-09-28 11:47:19 +08:00
|
|
|
|
var count int64
|
|
|
|
|
|
2022-01-05 18:40:08 +08:00
|
|
|
|
if err = model2.Count(mSysUser.SysUser, &count, model2.NewWhere("mobile", params.Mobile),
|
|
|
|
|
model2.NewWhere("tenant_id", c.TenantID)); err != nil {
|
|
|
|
|
return nil
|
2021-09-28 11:47:19 +08:00
|
|
|
|
} else if count > 0 {
|
2022-01-05 18:40:08 +08:00
|
|
|
|
return errors.New("操作错误,当前手机号码已注册")
|
2021-09-28 11:47:19 +08:00
|
|
|
|
}
|
2022-01-05 18:40:08 +08:00
|
|
|
|
mSysUser.Mobile = params.Mobile
|
2021-09-28 11:47:19 +08:00
|
|
|
|
}
|
2022-01-05 18:40:08 +08:00
|
|
|
|
mSysUser.Account = params.Account
|
|
|
|
|
mSysUser.Name = params.Name
|
|
|
|
|
mSysUser.Gender.Gender = model2.GenderKind(params.Gender)
|
|
|
|
|
mSysUser.Remark = params.Remark
|
|
|
|
|
|
2022-01-06 17:11:57 +08:00
|
|
|
|
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
|
|
|
|
|
})
|
2021-09-28 11:47:19 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (c *Instance) Password(id uint64, password, repeatPwd string) error {
|
|
|
|
|
if password != repeatPwd {
|
2022-01-05 18:40:08 +08:00
|
|
|
|
return errors.New("操作错误,两次密码输入不一致")
|
2021-09-28 11:47:19 +08:00
|
|
|
|
}
|
2022-01-05 18:40:08 +08:00
|
|
|
|
mSysUser := model.NewSysUser()
|
2021-09-28 11:47:19 +08:00
|
|
|
|
|
2022-01-05 18:40:08 +08:00
|
|
|
|
isExist, err := model2.FirstField(mSysUser.SysUser, []string{"id", "uuid", "is_admin"})
|
2021-09-28 11:47:19 +08:00
|
|
|
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
return nil
|
|
|
|
|
} else if !isExist {
|
2022-01-05 18:40:08 +08:00
|
|
|
|
return errors.New("操作错误,用户信息不存在或已被删除")
|
|
|
|
|
} else if c.TenantID > 0 && mSysUser.TenantID != c.TenantID {
|
|
|
|
|
return errors.New("操作错误,无权限操作")
|
2021-09-28 11:47:19 +08:00
|
|
|
|
}
|
|
|
|
|
mSysUser.Password = password
|
|
|
|
|
mSysUser.Pass()
|
|
|
|
|
|
2022-01-05 18:40:08 +08:00
|
|
|
|
return model2.Updates(mSysUser.SysUser, map[string]interface{}{
|
2021-09-28 11:47:19 +08:00
|
|
|
|
"password": mSysUser.Password, "salt": mSysUser.Salt, "updated_at": time.Now(),
|
2022-01-05 18:40:08 +08:00
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 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 {
|
2021-09-28 11:47:19 +08:00
|
|
|
|
return err
|
|
|
|
|
}
|
2022-01-05 18:40:08 +08:00
|
|
|
|
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(),
|
|
|
|
|
})
|
2021-09-28 11:47:19 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (c *Instance) Delete(id uint64) error {
|
2022-01-05 18:40:08 +08:00
|
|
|
|
mSysUser := model.NewSysUser()
|
|
|
|
|
mSysUser.ID = id
|
2021-09-28 11:47:19 +08:00
|
|
|
|
|
2022-01-05 18:40:08 +08:00
|
|
|
|
isExist, err := model2.FirstField(mSysUser.SysUser, []string{"id", "uuid", "is_admin"})
|
2021-09-28 11:47:19 +08:00
|
|
|
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
return nil
|
|
|
|
|
} else if !isExist {
|
2022-01-05 18:40:08 +08:00
|
|
|
|
return errors.New("操作错误,用户信息不存在或已被删除")
|
|
|
|
|
} else if c.TenantID > 0 && mSysUser.TenantID != c.TenantID {
|
|
|
|
|
return errors.New("操作错误,无权限操作")
|
|
|
|
|
} else if mSysUser.IsAdminUser() {
|
|
|
|
|
return errors.New("操作错误,超管用户不允许删除")
|
2021-09-28 11:47:19 +08:00
|
|
|
|
}
|
2022-01-05 18:40:08 +08:00
|
|
|
|
if err = model2.Delete(mSysUser.SysUser); err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
service.Publish(config.EventForRedisHashDestroy, config.RedisKeyForAccountAdmin, utils.UintToString(mSysUser.UUID))
|
|
|
|
|
return nil
|
2021-09-28 11:47:19 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func NewInstance() InstanceHandle {
|
2022-01-06 10:43:27 +08:00
|
|
|
|
return func(session *session.Admin) *Instance {
|
|
|
|
|
return &Instance{Admin: session}
|
2021-09-28 11:47:19 +08:00
|
|
|
|
}
|
|
|
|
|
}
|