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 }