190 lines
4.7 KiB
Go
190 lines
4.7 KiB
Go
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
|
|
}
|