154 lines
3.5 KiB
Go
154 lines
3.5 KiB
Go
package models
|
|
|
|
import (
|
|
"sync"
|
|
"time"
|
|
|
|
_ "github.com/jinzhu/gorm/dialects/mysql"
|
|
)
|
|
|
|
type User struct {
|
|
Model
|
|
Name string `json:"name"`
|
|
Password string `json:"password"`
|
|
Nickname string `json:"nickname"`
|
|
Avator string `json:"avator"`
|
|
Role int32 `json:"role"`
|
|
RoleName string `json:"role_name" sql:"-"`
|
|
RoleId string `json:"role_id" sql:"-"`
|
|
Status int32 `json:"status" gorm:"default:1"` // 1: active, 0: inactive
|
|
IsOnline int32 `json:"is_online" gorm:"default:0"` // 1: online, 0: offline
|
|
}
|
|
|
|
func CreateUser(name string, password string, avator string, nickname string) uint {
|
|
user := &User{
|
|
Name: name,
|
|
Password: password,
|
|
Avator: avator,
|
|
Nickname: nickname,
|
|
}
|
|
user.UpdatedAt = time.Now()
|
|
DB.Create(user)
|
|
return user.ID
|
|
}
|
|
|
|
func UpdateUserIsOnline(name string, isOnline int32) {
|
|
user := &User{
|
|
IsOnline: isOnline,
|
|
}
|
|
user.UpdatedAt = time.Now()
|
|
DB.Model(user).Where("name = ?", name).Update("IsOnline", isOnline)
|
|
}
|
|
|
|
func UpdateUser(name string, password string, avator string, nickname string) {
|
|
user := &User{
|
|
Avator: avator,
|
|
Nickname: nickname,
|
|
}
|
|
user.UpdatedAt = time.Now()
|
|
if password != "" {
|
|
user.Password = password
|
|
}
|
|
DB.Model(&User{}).Where("name = ?", name).Update(user)
|
|
}
|
|
func UpdateUserPass(name string, pass string) {
|
|
user := &User{
|
|
Password: pass,
|
|
}
|
|
user.UpdatedAt = time.Now()
|
|
DB.Model(user).Where("name = ?", name).Update("Password", pass)
|
|
}
|
|
func UpdateUserStatus(name string, status int32) {
|
|
user := &User{
|
|
Status: status,
|
|
}
|
|
user.UpdatedAt = time.Now()
|
|
DB.Model(user).Where("name = ?", name).Update("Status", status)
|
|
}
|
|
func UpdateUserAvator(name string, avator string) {
|
|
user := &User{
|
|
Avator: avator,
|
|
}
|
|
user.UpdatedAt = time.Now()
|
|
DB.Model(user).Where("name = ?", name).Update("Avator", avator)
|
|
}
|
|
func FindUser(username string) User {
|
|
var user User
|
|
DB.Where("name = ?", username).First(&user)
|
|
return user
|
|
}
|
|
|
|
var (
|
|
lastAssignedId uint
|
|
assignMutex sync.Mutex
|
|
)
|
|
|
|
func FindIdleUser() User {
|
|
assignMutex.Lock()
|
|
defer assignMutex.Unlock()
|
|
|
|
users := FindOnlineUser()
|
|
if len(users) == 0 {
|
|
users = GetAllUsers()
|
|
}
|
|
|
|
if len(users) == 0 {
|
|
return User{}
|
|
}
|
|
|
|
targetIndex := 0
|
|
if lastAssignedId > 0 {
|
|
for i, user := range users {
|
|
if user.ID == lastAssignedId {
|
|
targetIndex = i + 1
|
|
break
|
|
}
|
|
}
|
|
}
|
|
|
|
if targetIndex >= len(users) {
|
|
targetIndex = 0
|
|
}
|
|
|
|
targetUser := users[targetIndex]
|
|
lastAssignedId = targetUser.ID
|
|
|
|
return targetUser
|
|
}
|
|
|
|
func GetAllUsers() []User {
|
|
var users []User
|
|
DB.Where("name != ? and `status` = 1", "admin").Order("is_online desc").Find(&users)
|
|
return users
|
|
}
|
|
|
|
func FindOnlineUser() []User {
|
|
var users []User
|
|
DB.Where("name != ? and `status` = 1 and is_online = 1", "admin").Order("id desc").Find(&users)
|
|
|
|
return users
|
|
}
|
|
|
|
func FindUserById(id interface{}) User {
|
|
var user User
|
|
DB.Select("user.*,role.name role_name,role.id role_id").Joins("join user_role on user.id=user_role.user_id").Joins("join role on user_role.role_id=role.id").Where("user.id = ?", id).First(&user)
|
|
return user
|
|
}
|
|
func DeleteUserById(id string) {
|
|
DB.Where("id = ?", id).Delete(User{})
|
|
}
|
|
func FindUsers(withoutUsername string) []User {
|
|
var users []User
|
|
if withoutUsername == "" {
|
|
DB.Find(&users)
|
|
} else {
|
|
DB.Where("name != ?", withoutUsername).Find(&users)
|
|
}
|
|
return users
|
|
}
|
|
func FindUserRole(query interface{}, id interface{}) User {
|
|
var user User
|
|
DB.Select(query).Where("user.id = ?", id).Joins("join user_role on user.id=user_role.user_id").Joins("join role on user_role.role_id=role.id").First(&user)
|
|
return user
|
|
}
|