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"` IsSuper bool `json:"is_super"` // 总后台 } // 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, userTenantID, 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", userTenantID)), ) if !first { if err = model2.DeleteWhere(mSysUserDepartment.SysUserDepartment, []*model2.ModelWhere{ model2.NewWhere("user_tenant_id", userTenantID)}, tx); err != nil { return err } if err = model2.DeleteWhere(mSysUserRole.SysUserRole, []*model2.ModelWhere{ model2.NewWhere("user_tenant_id", userTenantID)}, tx); err != nil { return err } go utils.TryCatch(func() { if _, err = permission.DeleteRolesForUser(false); err != nil { logger.ErrorF("Casbin 删除用户【%d】权限错误:%v", userTenantID, err) } }) } if c.DepartmentID > 0 { mSysUserDepartment.UserTenantID = userTenantID 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{ UserTenantID: userTenantID, 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() { service.WithAuthRoles(rolesIDs)(permission) if _, err = permission.AddRoleForUser(); err != nil { logger.ErrorF("Casbin 给予用户【%d】权限错误:%v", userTenantID, 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, IsSuper: c.TenantID <= 0, }, nil } // Index 列表信息 func (c *Instance) Index(name, mobile string, departmentIDs []uint64, status, page, pageSize int) (*controller.ReturnPages, error) { where := []*model2.ModelWhere{model2.NewWhere("u_t.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)) } var count int64 mSysUserTenant := model.NewSysUserTenant() out, err := mSysUserTenant.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, 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()) } data.RoleIDs = roleIDs } list = append(list, data) } return &controller.ReturnPages{Data: list, Count: count}, nil } // Basic 基本信息 func (c *Instance) Basic(mobile string, tenantID uint64) (*model2.SysUser, error) { mSysUser := model.NewSysUser() _, err := mSysUser.GetByAccountOrMobile(mobile, tenantID) if err != nil { return nil, err } if mSysUser.ID <= 0 { return nil, nil } return mSysUser.SysUser, nil } // Add 添加用户 func (c *Instance) Add(params *InstanceForm) error { if !utils.ValidateMobile(params.Mobile) { return errors.New("操作错误,手机号码格式错误") } mSysUser := model.NewSysUser() mSysUserTenant := model.NewSysUserTenant() // 查询登录账户或手机号码是否注册 isExist, err := model2.FirstField(mSysUser.SysUser, []string{"id", "uuid", "name"}, model2.NewWhere("mobile", params.Mobile)) if err != nil { return err } else if isExist { // 判断当前人员是否已经注册了租户身份 var count int64 if err = model2.Count(mSysUserTenant.SysUserTenant, &count, model2.NewWhere("uid", mSysUser.UUID)); err != nil { return err } else if count > 0 { return errors.New("操作错误,当前手机号码已注册") } mSysUserTenant.TenantID = c.TenantID mSysUserTenant.UID = mSysUser.UUID return model2.Create(mSysUserTenant.SysUserTenant) } return orm.GetDB().Transaction(func(tx *gorm.DB) error { 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 } mSysUserTenant.TenantID = c.TenantID mSysUserTenant.UID = mSysUser.UUID if err = model2.Create(mSysUserTenant.SysUserTenant, tx); err != nil { return err } if err = params.sync(tx, true, mSysUserTenant.ID, c.TenantID); err != nil { return err } return nil }) } // Edit 修改用户信息 func (c *Instance) Edit(params *InstanceForm) error { mSysUserTenant := model.NewSysUserTenant() mSysUserTenant.ID = params.ID isExist, err := model2.First(mSysUserTenant.SysUserTenant) if err != nil { return nil } else if !isExist { return errors.New("操作错误,用户信息不存在或已被删除") } else if c.TenantID > 0 && mSysUserTenant.TenantID != c.TenantID { return errors.New("操作错误,无权限操作") } mSysUser := model.NewSysUser() if _, err = model2.FirstWhere(mSysUser.SysUser, model2.NewWhere("uuid", mSysUserTenant.UID)); err != nil { return err } 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)); 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, mSysUserTenant.ID, c.TenantID); err != nil { return err } return nil }) } func (c *Instance) Password(id uint64, password, repeatPwd string) error { mSysUserTenant := model.NewSysUserTenant() mSysUserTenant.ID = id isExist, err := model2.First(mSysUserTenant.SysUserTenant) if err != nil { return nil } else if !isExist { return errors.New("操作错误,用户信息不存在或已被删除") } else if c.TenantID > 0 && mSysUserTenant.TenantID != c.TenantID { return errors.New("操作错误,无权限操作") } mSysUser := model.NewSysUser() if _, err = model2.FirstField(mSysUser.SysUser, []string{"id", "uuid", "is_admin"}, model2.NewWhere("uuid", mSysUserTenant.UID)); err != nil { return err } 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 { mSysUserTenant := model.NewSysUserTenant() mSysUserTenant.ID = id isExist, err := model2.First(mSysUserTenant.SysUserTenant) if err != nil { return nil } else if !isExist { return errors.New("操作错误,用户信息不存在或已被删除") } else if c.TenantID > 0 && mSysUserTenant.TenantID != c.TenantID { return errors.New("操作错误,无权限操作") } mSysUser := model.NewSysUser() if _, err = model2.FirstField(mSysUser.SysUser, []string{"id", "uuid", "is_admin"}, model2.NewWhere("uuid", mSysUserTenant.UID)); err != nil { return err } err = orm.GetDB().Transaction(func(tx *gorm.DB) error { //if err = model2.Delete(mSysUser.SysUser, tx); err != nil { // return err //} if err = model2.Delete(mSysUserTenant.SysUserTenant, tx); err != nil { return err } return nil }) if 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} } }