package model import ( "SciencesServer/app/common/model" "SciencesServer/serve/orm" "SciencesServer/utils" "errors" "fmt" "gorm.io/gorm" ) // SysUser 用户信息 type SysUser struct { *model.SysUser } type ( // SysUserInfo 用户信息 SysUserInfo struct { *model.SysUser DepartmentID uint64 `json:"-"` DepartmentName string `json:"-"` RoleIDs string `json:"-"` RoleNames string `json:"-"` } ) func (m *SysUser) ValidatePassword(password string) bool { return utils.HashCompare([]byte(m.Password), []byte(utils.Md5String(password, m.Salt))) } func (m *SysUser) IsAdminUser() bool { return m.IsAdmin == model.SysUserAdministratorForAdmin } func (m *SysUser) GetByAccountOrMobile(account string, tenantID uint64) (bool, error) { db := orm.GetDB().Table(m.TableName()). Select("id", "uuid", "tenant_id", "name", "mobile", "password", "salt", "is_admin", "status"). Where("tenant_id = ?", tenantID). //Where("(email = ? OR mobile = ?)", account, account). Where("mobile = ?", account). Where("is_deleted = ?", model.DeleteStatusForNot) if err := db.First(m.SysUser).Error; err != nil { if errors.Is(err, gorm.ErrRecordNotFound) { return false, nil } return false, err } return true, nil } func (m *SysUser) CheckByAccountOrMobile(account string, tenantID uint64) (bool, error) { db := orm.GetDB().Table(m.TableName()). Where("tenant_id = ?", tenantID). Where("(account = ? OR mobile = ?)", account, account). Where("is_deleted = ?", model.DeleteStatusForNot) var count int64 if err := db.Count(&count).Error; err != nil { if errors.Is(err, gorm.ErrRecordNotFound) { return false, nil } return false, err } return true, nil } // Users 用户信息 func (m *SysUser) Users(page, pageSize int, count *int64, where ...*model.ModelWhere) ([]*SysUserInfo, error) { db := orm.GetDB().Table(m.TableName()+" AS u"). Select("u.id", "u.uuid", "u.account", "u.avatar", "u.name", "u.mobile", "u.gender", "u.is_admin", "u.status", "u.created_at", "d.id AS department_id", "d.name AS department_name", "u_r.role_ids", "u_r.role_names"). Joins(fmt.Sprintf("LEFT JOIN %s AS u_d ON u.uuid = u_d.uid AND u_d.is_deleted = %d", model.NewSysUserDepartment().TableName(), model.DeleteStatusForNot)). Joins(fmt.Sprintf("LEFT JOIN %s AS d ON u_d.department_id = d.id", model.NewSysDepartment().TableName())). Joins(fmt.Sprintf("LEFT JOIN (SELECT uid, GROUP_CONCAT(r.id SEPARATOR '&&') AS role_ids, GROUP_CONCAT(r.name SEPARATOR '&&') AS role_names "+ "FROM %s AS u LEFT JOIN %s AS r ON u.role_id = r.id WHERE u.is_deleted = %d GROUP BY u.uid) u_r ON u.uuid = u_r.uid", model.NewSysUserRole().TableName(), model.NewSysRole().TableName(), model.DeleteStatusForNot)). Where("u.is_deleted = ?", model.DeleteStatusForNot) if len(where) > 0 { for _, wo := range where { db = db.Where(wo.Condition, wo.Value) } } out := make([]*SysUserInfo, 0) if err := db.Count(count).Error; err != nil { return nil, err } if err := db.Order("u.id " + model.OrderModeToDesc).Offset((page - 1) * pageSize).Limit(pageSize).Scan(&out).Error; err != nil { return nil, err } return out, nil } func NewSysUser() *SysUser { return &SysUser{SysUser: model.NewSysUser()} }