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
|
||||
}
|
||||
21
server/loginserver/init.go
Normal file
21
server/loginserver/init.go
Normal file
@@ -0,0 +1,21 @@
|
||||
package loginserver
|
||||
|
||||
import (
|
||||
"slgserver/db"
|
||||
"slgserver/net"
|
||||
"slgserver/server/loginserver/controller"
|
||||
)
|
||||
|
||||
|
||||
var MyRouter = &net.Router{}
|
||||
|
||||
func Init() {
|
||||
db.TestDB()
|
||||
//全部初始化完才注册路由,防止服务器还没启动就绪收到请求
|
||||
initRouter()
|
||||
}
|
||||
|
||||
func initRouter() {
|
||||
controller.DefaultAccount.InitRouter(MyRouter)
|
||||
}
|
||||
|
||||
39
server/loginserver/model/login.go
Normal file
39
server/loginserver/model/login.go
Normal file
@@ -0,0 +1,39 @@
|
||||
package model
|
||||
|
||||
import (
|
||||
"time"
|
||||
)
|
||||
|
||||
const (
|
||||
Login = iota
|
||||
Logout
|
||||
)
|
||||
|
||||
type LoginHistory struct {
|
||||
Id int `xorm:"id pk autoincr"`
|
||||
UId int `xorm:"uid"`
|
||||
CTime time.Time `xorm:"ctime"`
|
||||
Ip string `xorm:"ip"`
|
||||
State int8 `xorm:"state"`
|
||||
Hardware string `xorm:"hardware"`
|
||||
}
|
||||
|
||||
func (this *LoginHistory) TableName() string {
|
||||
return "tb_login_history"
|
||||
}
|
||||
|
||||
|
||||
type LoginLast struct {
|
||||
Id int `xorm:"id pk autoincr"`
|
||||
UId int `xorm:"uid"`
|
||||
LoginTime time.Time `xorm:"login_time"`
|
||||
LogoutTime time.Time `xorm:"logout_time"`
|
||||
Ip string `xorm:"ip"`
|
||||
Session string `xorm:"session"`
|
||||
IsLogout int8 `xorm:"is_logout"`
|
||||
Hardware string `xorm:"hardware"`
|
||||
}
|
||||
|
||||
func (this *LoginLast) TableName() string {
|
||||
return "tb_login_last"
|
||||
}
|
||||
19
server/loginserver/model/user.go
Normal file
19
server/loginserver/model/user.go
Normal file
@@ -0,0 +1,19 @@
|
||||
package model
|
||||
|
||||
import "time"
|
||||
|
||||
type User struct {
|
||||
UId int `xorm:"uid pk autoincr"`
|
||||
Username string `xorm:"username" validate:"min=4,max=20,regexp=^[a-zA-Z0-9_]*$"`
|
||||
Passcode string `xorm:"passcode"`
|
||||
Passwd string `xorm:"passwd"`
|
||||
Hardware string `xorm:"hardware"`
|
||||
Status int `xorm:"status"`
|
||||
Ctime time.Time `xorm:"ctime"`
|
||||
Mtime time.Time `xorm:"mtime"`
|
||||
IsOnline bool `xorm:"-"`
|
||||
}
|
||||
|
||||
func (this *User) TableName() string {
|
||||
return "tb_user_info"
|
||||
}
|
||||
47
server/loginserver/proto/account.go
Normal file
47
server/loginserver/proto/account.go
Normal file
@@ -0,0 +1,47 @@
|
||||
package proto
|
||||
|
||||
type LoginReq struct {
|
||||
Username string `json:"username"`
|
||||
Password string `json:"password"`
|
||||
Ip string `json:"ip"`
|
||||
Hardware string `json:"hardware"`
|
||||
}
|
||||
|
||||
type LoginRsp struct {
|
||||
Username string `json:"username"`
|
||||
Password string `json:"password"`
|
||||
Session string `json:"session"`
|
||||
UId int `json:"uid"`
|
||||
}
|
||||
|
||||
type ReLoginReq struct {
|
||||
Session string `json:"session"`
|
||||
Ip string `json:"ip"`
|
||||
Hardware string `json:"hardware"`
|
||||
}
|
||||
|
||||
type ReLoginRsp struct {
|
||||
Session string `json:"session"`
|
||||
}
|
||||
|
||||
type LogoutReq struct {
|
||||
UId int `json:"uid"`
|
||||
}
|
||||
|
||||
type LogoutRsp struct {
|
||||
UId int `json:"uid"`
|
||||
}
|
||||
|
||||
type Server struct {
|
||||
Id int `json:"id"`
|
||||
Slg string `json:"slg"`
|
||||
Chat string `json:"chat"`
|
||||
}
|
||||
|
||||
type ServerListReq struct {
|
||||
|
||||
}
|
||||
|
||||
type ServerListRsp struct {
|
||||
Lists []Server
|
||||
}
|
||||
Reference in New Issue
Block a user