redis, updatediff
This commit is contained in:
@@ -2,15 +2,24 @@ 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/utils"
|
||||
"github.com/gin-gonic/gin"
|
||||
"strings"
|
||||
"time"
|
||||
)
|
||||
|
||||
const (
|
||||
TokenHeader = "TOKEN"
|
||||
TokenVer = "V2"
|
||||
TokenTypeSep = "."
|
||||
)
|
||||
|
||||
func GetUsers(c *gin.Context, name, mobile, userID string) (users []*model.User, err error) {
|
||||
return dao.GetUsers(globals.GetDB(), userID, name, mobile)
|
||||
}
|
||||
@@ -18,7 +27,7 @@ func GetUsers(c *gin.Context, name, mobile, userID string) (users []*model.User,
|
||||
func RegisterUser(c *gin.Context, name, password string) (err error) {
|
||||
var (
|
||||
db = globals.GetDB()
|
||||
user = model.User{}
|
||||
user = &model.User{}
|
||||
now = time.Now()
|
||||
)
|
||||
if users, _ := dao.GetUsers(db, "", name, ""); len(users) > 0 {
|
||||
@@ -34,10 +43,84 @@ func RegisterUser(c *gin.Context, name, password string) (err error) {
|
||||
return err
|
||||
}
|
||||
|
||||
func Login(c *gin.Context, name, password, code string) (user *model.User, err error) {
|
||||
//var (
|
||||
// db = globals.GetDB()
|
||||
//)
|
||||
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 user, err = dao.GetUserForLogin(db, name, fmt.Sprintf("%x", md5.Sum([]byte(model.RegisterKey+password)))); err != nil {
|
||||
return loginResult, err
|
||||
} else if user == nil {
|
||||
return loginResult, fmt.Errorf("密码错误!")
|
||||
}
|
||||
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 GetTokenInfo(c *gin.Context, token string) (user *model.User, err error) {
|
||||
result := putils.GetKet(token)
|
||||
if user, ok := result.(*model.User); !ok {
|
||||
return user, err
|
||||
}
|
||||
return user, 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
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user