Files
jx-print/services/user.go
2021-07-23 14:11:59 +08:00

148 lines
3.5 KiB
Go

package services
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"
"strings"
"time"
)
const (
TokenHeader = "TOKEN"
TokenVer = "V2"
TokenTypeSep = "."
)
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{}
token string
)
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
//创建token
token, err = setToken(user)
loginResult.Token = token
//更新登录时间和ip
user.LastLoginAt = &now
user.LastLoginIP = c.ClientIP()
err = dao.Update(db, user, "last_login_at", "last_login_ip")
return loginResult, err
}
func setToken(user *model.User) (token string, err error) {
token = createToken(user)
err = putils.SetKey(token, user, putils.DefTokenDuration)
return token, err
}
func createToken(user *model.User) (token string) {
return strings.Join([]string{
TokenHeader,
TokenVer,
user.UserID,
time.Now().Format("20060102-150405"),
utils.GetUUID(),
user.Name,
}, TokenTypeSep)
}
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) (menus []*model.Menu, err error) {
return
}