package service import ( "Gwen/global" adResp "Gwen/http/response/admin" "Gwen/model" "Gwen/utils" "github.com/gin-gonic/gin" "gorm.io/gorm" "math/rand" "strconv" "time" ) type UserService struct { } // InfoById 根据用户id取用户信息 func (us *UserService) InfoById(id uint) *model.User { u := &model.User{} global.DB.Where("id = ?", id).First(u) return u } // InfoByUsername 根据用户名取用户信息 func (us *UserService) InfoByUsername(un string) *model.User { u := &model.User{} global.DB.Where("username = ?", un).First(u) return u } // InfoByEmail 根据邮箱取用户信息 func (us *UserService) InfoByEmail(email string) *model.User { u := &model.User{} global.DB.Where("email = ?", email).First(u) return u } // InfoByOpenid 根据openid取用户信息 func (us *UserService) InfoByOpenid(openid string) *model.User { u := &model.User{} global.DB.Where("openid = ?", openid).First(u) return u } // InfoByUsernamePassword 根据用户名密码取用户信息 func (us *UserService) InfoByUsernamePassword(username, password string) *model.User { u := &model.User{} global.DB.Where("username = ? and password = ?", username, us.EncryptPassword(password)).First(u) return u } // InfoByAccesstoken 根据accesstoken取用户信息 func (us *UserService) InfoByAccessToken(token string) *model.User { u := &model.User{} ut := &model.UserToken{} global.DB.Where("token = ?", token).First(ut) if ut.Id == 0 { return u } if ut.ExpiredAt < time.Now().Unix() { return u } global.DB.Where("id = ?", ut.UserId).First(u) return u } // GenerateToken 生成token func (us *UserService) GenerateToken(u *model.User) string { return utils.Md5(u.Username + time.Now().String()) } // Login 登录 func (us *UserService) Login(u *model.User, llog *model.LoginLog) *model.UserToken { token := us.GenerateToken(u) ut := &model.UserToken{ UserId: u.Id, Token: token, DeviceUuid: llog.Uuid, DeviceId: llog.DeviceId, ExpiredAt: time.Now().Add(time.Hour * 24 * 7).Unix(), } global.DB.Create(ut) llog.UserTokenId = ut.UserId global.DB.Create(llog) if llog.Uuid != "" { AllService.PeerService.UuidBindUserId(llog.DeviceId, llog.Uuid, u.Id) } return ut } // CurUser 获取当前用户 func (us *UserService) CurUser(c *gin.Context) *model.User { user, _ := c.Get("curUser") u, ok := user.(*model.User) if !ok { return nil } return u } func (us *UserService) List(page, pageSize uint, where func(tx *gorm.DB)) (res *model.UserList) { res = &model.UserList{} res.Page = int64(page) res.PageSize = int64(pageSize) tx := global.DB.Model(&model.User{}) if where != nil { where(tx) } tx.Count(&res.Total) tx.Scopes(Paginate(page, pageSize)) tx.Find(&res.Users) return } func (us *UserService) ListByIds(ids []uint) (res []*model.User) { global.DB.Where("id in ?", ids).Find(&res) return res } // ListByGroupId 根据组id取用户列表 func (us *UserService) ListByGroupId(groupId, page, pageSize uint) (res *model.UserList) { res = us.List(page, pageSize, func(tx *gorm.DB) { tx.Where("group_id = ?", groupId) }) return } // ListIdsByGroupId 根据组id取用户id列表 func (us *UserService) ListIdsByGroupId(groupId uint) (ids []uint) { global.DB.Model(&model.User{}).Where("group_id = ?", groupId).Pluck("id", &ids) return ids } // ListIdAndNameByGroupId 根据组id取用户id和用户名列表 func (us *UserService) ListIdAndNameByGroupId(groupId uint) (res []*model.User) { global.DB.Model(&model.User{}).Where("group_id = ?", groupId).Select("id, username").Find(&res) return res } // EncryptPassword 加密密码 func (us *UserService) EncryptPassword(password string) string { return utils.Md5(password + "rustdesk-api") } // CheckUserEnable 判断用户是否禁用 func (us *UserService) CheckUserEnable(u *model.User) bool { return u.Status == model.COMMON_STATUS_ENABLE } // Create 创建 func (us *UserService) Create(u *model.User) error { u.Password = us.EncryptPassword(u.Password) res := global.DB.Create(u).Error return res } // GetUuidByToken 根据token和user取uuid func (us *UserService) GetUuidByToken(u *model.User, token string) string { ut := &model.UserToken{} err :=global.DB.Where("user_id = ? and token = ?", u.Id, token).First(ut).Error if err != nil { return "" } return ut.DeviceUuid } // Logout 退出登录 -> 删除token, 解绑uuid func (us *UserService) Logout(u *model.User, token string) error { uuid := us.GetUuidByToken(u, token) err := global.DB.Where("user_id = ? and token = ?", u.Id, token).Delete(&model.UserToken{}).Error if err != nil { return err } if uuid != "" { AllService.PeerService.UuidUnbindUserId(uuid, u.Id) } return nil } // Delete 删除用户和oauth信息 func (us *UserService) Delete(u *model.User) error { tx := global.DB.Begin() // 删除用户 if err := tx.Delete(u).Error; err != nil { tx.Rollback() return err } // 删除关联的 OAuth 信息 if err := tx.Where("user_id = ?", u.Id).Delete(&model.UserThird{}).Error; err != nil { tx.Rollback() return err } // 删除关联的ab if err := tx.Where("user_id = ?", u.Id).Delete(&model.AddressBook{}).Error; err != nil { tx.Rollback() return err } // 删除关联的abc if err := tx.Where("user_id = ?", u.Id).Delete(&model.AddressBookCollection{}).Error; err != nil { tx.Rollback() return err } // 删除关联的abcr if err := tx.Where("user_id = ?", u.Id).Delete(&model.AddressBookCollectionRule{}).Error; err != nil { tx.Rollback() return err } tx.Commit() // 删除关联的peer if err := AllService.PeerService.EraseUserId(u.Id); err != nil { tx.Rollback() return err } return nil } // Update 更新 func (us *UserService) Update(u *model.User) error { return global.DB.Model(u).Updates(u).Error } // FlushToken 清空token func (us *UserService) FlushToken(u *model.User) error { return global.DB.Where("user_id = ?", u.Id).Delete(&model.UserToken{}).Error } // FlushTokenByUuid 清空token func (us *UserService) FlushTokenByUuid(uuid string) error { return global.DB.Where("device_uuid = ?", uuid).Delete(&model.UserToken{}).Error } // FlushTokenByUuids 清空token func (us *UserService) FlushTokenByUuids(uuids []string) error { return global.DB.Where("device_uuid in (?)", uuids).Delete(&model.UserToken{}).Error } // UpdatePassword 更新密码 func (us *UserService) UpdatePassword(u *model.User, password string) error { u.Password = us.EncryptPassword(password) err := global.DB.Model(u).Update("password", u.Password).Error if err != nil { return err } err = us.FlushToken(u) return err } // IsAdmin 是否管理员 func (us *UserService) IsAdmin(u *model.User) bool { return *u.IsAdmin } // RouteNames func (us *UserService) RouteNames(u *model.User) []string { if us.IsAdmin(u) { return adResp.AdminRouteNames } return adResp.UserRouteNames } // InfoByOauthId 根据oauth的name和openId取用户信息 func (us *UserService) InfoByOauthId(op string, openId string) *model.User { ut := AllService.OauthService.UserThirdInfo(op, openId) if ut.Id == 0 { return nil } u := us.InfoById(ut.UserId) if u.Id == 0 { return nil } return u } // RegisterByOauth 注册 func (us *UserService) RegisterByOauth(oauthUser *model.OauthUser , op string) *model.User { global.Lock.Lock("registerByOauth") defer global.Lock.UnLock("registerByOauth") ut := AllService.OauthService.UserThirdInfo(op, oauthUser.OpenId) if ut.Id != 0 { return us.InfoById(ut.UserId) } //check if this email has been registered email := oauthUser.Email oauthType := AllService.OauthService.GetTypeByOp(op) user := us.InfoByEmail(email) tx := global.DB.Begin() if user.Id != 0 { ut.FromOauthUser(user.Id, oauthUser, oauthType, op) } else { ut = &model.UserThird{} ut.FromOauthUser(0, oauthUser, oauthType, op) usernameUnique := us.GenerateUsernameByOauth(oauthUser.Username) user := &model.User{ Username: usernameUnique, GroupId: 1, } oauthUser.ToUser(user, false) tx.Create(user) if user.Id == 0 { tx.Rollback() return user } ut.UserId = user.Id } tx.Create(ut) tx.Commit() return user } // GenerateUsernameByOauth 生成用户名 func (us *UserService) GenerateUsernameByOauth(name string) string { u := &model.User{} global.DB.Where("username = ?", name).First(u) if u.Id == 0 { return name } name = name + strconv.FormatInt(rand.Int63n(10), 10) return us.GenerateUsernameByOauth(name) } // UserThirdsByUserId func (us *UserService) UserThirdsByUserId(userId uint) (res []*model.UserThird) { global.DB.Where("user_id = ?", userId).Find(&res) return res } func (us *UserService) UserThirdInfo(userId uint, op string) *model.UserThird { ut := &model.UserThird{} global.DB.Where("user_id = ? and op = ?", userId, op).First(ut) return ut } // FindLatestUserIdFromLoginLogByUuid 根据uuid查找最后登录的用户id func (us *UserService) FindLatestUserIdFromLoginLogByUuid(uuid string) uint { llog := &model.LoginLog{} global.DB.Where("uuid = ?", uuid).Order("id desc").First(llog) return llog.UserId } // IsPasswordEmptyById 根据用户id判断密码是否为空,主要用于第三方登录的自动注册 func (us *UserService) IsPasswordEmptyById(id uint) bool { u := &model.User{} if global.DB.Where("id = ?", id).First(u).Error != nil { return false } return u.Password == "" } // IsPasswordEmptyByUsername 根据用户id判断密码是否为空,主要用于第三方登录的自动注册 func (us *UserService) IsPasswordEmptyByUsername(username string) bool { u := &model.User{} if global.DB.Where("username = ?", username).First(u).Error != nil { return false } return u.Password == "" } // IsPasswordEmptyByUser 判断密码是否为空,主要用于第三方登录的自动注册 func (us *UserService) IsPasswordEmptyByUser(u *model.User) bool { return us.IsPasswordEmptyById(u.Id) } func (us *UserService) Register(username string, password string) *model.User { u := &model.User{ Username: username, Password: us.EncryptPassword(password), GroupId: 1, } global.DB.Create(u) return u } func (us *UserService) TokenList(page uint, size uint, f func(tx *gorm.DB)) *model.UserTokenList { res := &model.UserTokenList{} res.Page = int64(page) res.PageSize = int64(size) tx := global.DB.Model(&model.UserToken{}) if f != nil { f(tx) } tx.Count(&res.Total) tx.Scopes(Paginate(page, size)) tx.Find(&res.UserTokens) return res } func (us *UserService) TokenInfoById(id uint) *model.UserToken { ut := &model.UserToken{} global.DB.Where("id = ?", id).First(ut) return ut } func (us *UserService) DeleteToken(l *model.UserToken) error { return global.DB.Delete(l).Error }