Files
jx-print/services/print_server/user.go
邹宗楠 f4f6bbd80b 1
2022-07-26 17:37:13 +08:00

120 lines
3.0 KiB
Go

package print_server
import (
"crypto/md5"
"encoding/json"
"fmt"
"git.rosy.net.cn/baseapi/utils"
"git.rosy.net.cn/jx-print/dao"
"git.rosy.net.cn/jx-print/globals"
"git.rosy.net.cn/jx-print/model"
putils "git.rosy.net.cn/jx-print/putils"
"github.com/gin-gonic/gin"
"github.com/jmoiron/sqlx"
"time"
)
type UserService struct {
C *gin.Context
DB *sqlx.DB
}
type UserServiceInterface interface {
Login(name, password string) (loginResult *LoginResult, err error)
RegisterUser(c *gin.Context, name, password string) (err error)
}
var (
UserServiceHandler UserServiceInterface
)
func InitHandler(handler UserServiceInterface) {
UserServiceHandler = handler
}
func (c *UserService) GetUsers(name, mobile, userID string) (users []*model.User, err error) {
return dao.GetUsers(globals.GetDB(), userID, name, mobile, "")
}
func RegisterUser(c *gin.Context, name, password string) (err error) {
var (
db = globals.GetDB()
user = &model.User{}
now = time.Now()
)
if users, _ := dao.GetUsers(db, "", name, "", ""); len(users) > 0 {
return fmt.Errorf("用户名重复!")
}
user.UserID = utils.GetUUID()
user.Name = name
user.Password = fmt.Sprintf("%x", md5.Sum([]byte(model.RegisterKey+password)))
user.CreatedAt = &now
user.UpdatedAt = &now
user.DeletedAt = &utils.DefaultTimeValue
err = dao.Insert(db, user)
return err
}
type LoginResult struct {
model.User
Token string `json:"token"` //token
}
func Login(c *gin.Context, name, password string) (loginResult *LoginResult, err error) {
var (
db = globals.GetDB()
now = time.Now()
user = &model.User{}
)
loginResult = &LoginResult{}
if users, _ := dao.GetUsers(db, "", name, "", ""); len(users) == 0 {
return loginResult, fmt.Errorf("用户名不存在!")
}
if users, err := dao.GetUserForLogin(db, name, fmt.Sprintf("%x", md5.Sum([]byte(model.RegisterKey+password)))); err != nil {
return loginResult, err
} else if len(users) == 0 {
return loginResult, fmt.Errorf("密码错误或用户不存在!")
} else {
user = users[0]
}
loginResult.User = *user
//更新登录时间和ip
user.LastLoginAt = &now
user.LastLoginIP = c.ClientIP()
err = dao.Update(db, user, "last_login_at", "last_login_ip")
return loginResult, err
}
func Logout(c *gin.Context, token string) (err error) {
return putils.DelKey(token)
}
func UpdateUser(c *gin.Context, payload string) (err error) {
var (
db = globals.GetDB()
userp = &model.User{}
user = &model.User{}
)
if err = json.Unmarshal([]byte(payload), &userp); err != nil {
return err
}
if userp.ID == 0 || userp.UserID == "" {
return fmt.Errorf("id 和 user_id 必传!")
}
if users, err := dao.GetUsers(db, userp.UserID, "", "", ""); err != nil {
return err
} else {
user = users[0]
}
err = dao.UpdateDiff(db, userp, user)
return err
}
func GetMenus(c *gin.Context) (menus []*model.Menu, err error) {
return dao.GetMenus(globals.GetDB())
}
func GetMenuDetail(c *gin.Context, id int) (menu *model.MenuDetail, err error) {
return dao.GetMenuDetail(globals.GetDB(), id)
}