first commit
This commit is contained in:
189
server/loginserver/controller/account.go
Normal file
189
server/loginserver/controller/account.go
Normal file
@@ -0,0 +1,189 @@
|
||||
package controller
|
||||
|
||||
import (
|
||||
"github.com/mitchellh/mapstructure"
|
||||
"slgserver/constant"
|
||||
"slgserver/db"
|
||||
"log/slog"
|
||||
"slgserver/middleware"
|
||||
"slgserver/net"
|
||||
"slgserver/server/loginserver/model"
|
||||
"slgserver/server/loginserver/proto"
|
||||
"slgserver/util"
|
||||
"time"
|
||||
)
|
||||
|
||||
var DefaultAccount = Account{}
|
||||
|
||||
type Account struct {
|
||||
}
|
||||
|
||||
func (this*Account) InitRouter(r *net.Router) {
|
||||
g := r.Group("account").Use(middleware.ElapsedTime(), middleware.Log())
|
||||
|
||||
g.AddRouter("login", this.login)
|
||||
g.AddRouter("reLogin", this.reLogin)
|
||||
g.AddRouter("logout", this.logout, middleware.CheckLogin())
|
||||
g.AddRouter("serverList", this.serverList, middleware.CheckLogin())
|
||||
}
|
||||
|
||||
func (this*Account) login(req *net.WsMsgReq, rsp *net.WsMsgRsp) {
|
||||
|
||||
reqObj := &proto.LoginReq{}
|
||||
rspObj := &proto.LoginRsp{}
|
||||
mapstructure.Decode(req.Body.Msg, reqObj)
|
||||
rsp.Body.Msg = rspObj
|
||||
|
||||
user := &model.User{}
|
||||
ok, err := db.MasterDB.Table(user).Where("username=?", reqObj.Username).Get(user)
|
||||
if err!= nil {
|
||||
slog.Error("login db error",
|
||||
"username", reqObj.Username,
|
||||
"error", err)
|
||||
|
||||
rsp.Body.Code = constant.DBError
|
||||
}else{
|
||||
if ok {
|
||||
pwd := util.Password(reqObj.Password, user.Passcode)
|
||||
if pwd != user.Passwd{
|
||||
//密码不正确
|
||||
slog.Warn("login password not right",
|
||||
"username", user.Username)
|
||||
rsp.Body.Code = constant.PwdIncorrect
|
||||
}else{
|
||||
tt := time.Now()
|
||||
s := util.NewSession(user.UId, tt)
|
||||
|
||||
sessStr := s.String()
|
||||
|
||||
slog.Info("login",
|
||||
"username", user.Username,
|
||||
"session", sessStr)
|
||||
|
||||
//登录成功,写记录
|
||||
lh := &model.LoginHistory{UId: user.UId, CTime: tt, Ip: reqObj.Ip,
|
||||
Hardware: reqObj.Hardware, State: model.Login}
|
||||
db.MasterDB.Insert(lh)
|
||||
|
||||
ll := &model.LoginLast{}
|
||||
ok, _ := db.MasterDB.Table(ll).Where("uid=?", user.UId).Get(ll)
|
||||
if ok {
|
||||
ll.IsLogout = 0
|
||||
ll.Ip = reqObj.Ip
|
||||
ll.LoginTime = time.Now()
|
||||
ll.Session = sessStr
|
||||
ll.Hardware = reqObj.Hardware
|
||||
|
||||
_, err := db.MasterDB.ID(ll.Id).Cols(
|
||||
"is_logout", "ip", "login_time", "session", "hardware").Update(ll)
|
||||
if err != nil {
|
||||
slog.Error("update login_last table fail", "error", err)
|
||||
}
|
||||
|
||||
|
||||
}else{
|
||||
ll = &model.LoginLast{UId: user.UId, LoginTime: tt,
|
||||
Ip: reqObj.Ip, Session: sessStr,
|
||||
Hardware: reqObj.Hardware, IsLogout: 0}
|
||||
db.MasterDB.Insert(ll)
|
||||
}
|
||||
|
||||
rspObj.Session = sessStr
|
||||
rspObj.Password = reqObj.Password
|
||||
rspObj.Username = reqObj.Username
|
||||
rspObj.UId = user.UId
|
||||
|
||||
rsp.Body.Code = constant.OK
|
||||
|
||||
net.ConnMgr.UserLogin(req.Conn, sessStr, ll.UId)
|
||||
}
|
||||
}else{
|
||||
//数据库出错
|
||||
slog.Warn("login username not found", "username", reqObj.Username)
|
||||
rsp.Body.Code = constant.UserNotExist
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
func (this*Account) reLogin(req *net.WsMsgReq, rsp *net.WsMsgRsp) {
|
||||
reqObj := &proto.ReLoginReq{}
|
||||
rspObj := &proto.ReLoginRsp{}
|
||||
mapstructure.Decode(req.Body.Msg, reqObj)
|
||||
if reqObj.Session == ""{
|
||||
rsp.Body.Code = constant.SessionInvalid
|
||||
return
|
||||
}
|
||||
|
||||
rsp.Body.Msg = rspObj
|
||||
rspObj.Session = reqObj.Session
|
||||
|
||||
sess, err := util.ParseSession(reqObj.Session)
|
||||
if err != nil{
|
||||
rsp.Body.Code = constant.SessionInvalid
|
||||
}else{
|
||||
if sess.IsValid() {
|
||||
//数据库验证一下
|
||||
ll := &model.LoginLast{}
|
||||
db.MasterDB.Table(ll).Where("uid=?", sess.Id).Get(ll)
|
||||
|
||||
if ll.Session == reqObj.Session {
|
||||
if ll.Hardware == reqObj.Hardware {
|
||||
rsp.Body.Code = constant.OK
|
||||
net.ConnMgr.UserLogin(req.Conn, reqObj.Session, ll.UId)
|
||||
}else{
|
||||
rsp.Body.Code = constant.HardwareIncorrect
|
||||
}
|
||||
}else{
|
||||
rsp.Body.Code = constant.SessionInvalid
|
||||
}
|
||||
}else{
|
||||
rsp.Body.Code = constant.SessionInvalid
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func (this*Account) logout(req *net.WsMsgReq, rsp *net.WsMsgRsp) {
|
||||
|
||||
reqObj := &proto.LogoutReq{}
|
||||
rspObj := &proto.LogoutRsp{}
|
||||
mapstructure.Decode(req.Body.Msg, reqObj)
|
||||
rsp.Body.Msg = rspObj
|
||||
rspObj.UId = reqObj.UId
|
||||
rsp.Body.Code = constant.OK
|
||||
|
||||
slog.Info("logout", "uid", reqObj.UId)
|
||||
|
||||
tt := time.Now()
|
||||
//登出,写记录
|
||||
lh := &model.LoginHistory{UId: reqObj.UId, CTime: tt, State: model.Logout}
|
||||
db.MasterDB.Insert(lh)
|
||||
|
||||
ll := &model.LoginLast{}
|
||||
ok, _ := db.MasterDB.Table(ll).Where("uid=?", reqObj.UId).Get(ll)
|
||||
if ok {
|
||||
ll.IsLogout = 1
|
||||
ll.LogoutTime = time.Now()
|
||||
db.MasterDB.ID(ll.Id).Cols("is_logout", "logout_time").Update(ll)
|
||||
|
||||
}else{
|
||||
ll = &model.LoginLast{UId: reqObj.UId, LogoutTime: tt, IsLogout: 0}
|
||||
db.MasterDB.Insert(ll)
|
||||
}
|
||||
|
||||
net.ConnMgr.UserLogout(req.Conn)
|
||||
|
||||
}
|
||||
|
||||
func (this*Account) serverList(req *net.WsMsgReq, rsp *net.WsMsgRsp) {
|
||||
reqObj := &proto.ServerListReq{}
|
||||
rspObj := &proto.ServerListRsp{}
|
||||
mapstructure.Decode(req.Body.Msg, reqObj)
|
||||
rsp.Body.Code = constant.OK
|
||||
|
||||
s := proto.Server{Id: 1, Slg: "ws://127.0.0.1:8001", Chat: "ws://127.0.0.1:8002"}
|
||||
r := make([]proto.Server, 0)
|
||||
rspObj.Lists = append(r, s)
|
||||
|
||||
rsp.Body.Msg = rspObj
|
||||
}
|
||||
Reference in New Issue
Block a user