first commit

This commit is contained in:
ytc1012
2025-11-18 18:08:48 +08:00
commit de90ad79ea
162 changed files with 28098 additions and 0 deletions

View 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
}

View 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)
}

View 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"
}

View 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"
}

View 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
}