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
}