This commit is contained in:
makeyangcom
2024-03-06 10:47:22 +08:00
parent c7da010f01
commit 02dd25ec67
23 changed files with 252 additions and 238 deletions

View File

@@ -1,22 +1,26 @@
/** /**
****************************************************************************** #*****************************************************************************
* @file config.go # @file config.go
* @author MakerYang # @author MakerYang(https://www.makeryang.com)
****************************************************************************** # @statement 免费课程配套开源项目,任何形式收费均为盗版
*/ #*****************************************************************************
*/
package Config package Config
import "time" import "time"
// Get 定义系统配置模块的调用指针
var Get = &config{} var Get = &config{}
// 声明系统配置模块数据结构体
type config struct { type config struct {
Service service `json:"service"` Service service `json:"service"`
Database database `json:"database"` Database database `json:"database"`
Hash hash `json:"hash"` Hash hash `json:"hash"`
} }
// 声明系统配置模块的服务器配置数据结构体
type service struct { type service struct {
Mode string `json:"mode"` Mode string `json:"mode"`
HttpPort int `json:"http_port"` HttpPort int `json:"http_port"`
@@ -24,6 +28,7 @@ type service struct {
WriteTimeout time.Duration `json:"write_timeout"` WriteTimeout time.Duration `json:"write_timeout"`
} }
// 声明系统配置模块的数据库配置数据结构体
type database struct { type database struct {
Type string `json:"type"` Type string `json:"type"`
User string `json:"user"` User string `json:"user"`
@@ -32,11 +37,14 @@ type database struct {
Name string `json:"name"` Name string `json:"name"`
} }
// 声明系统配置模块的HASH加密配置数据结构体
type hash struct { type hash struct {
Salt string `json:"salt"` Salt string `json:"salt"`
} }
// Init 初始化系统配置
func Init() { func Init() {
Get.Service.Mode = "debug" Get.Service.Mode = "debug"
Get.Service.HttpPort = 7000 Get.Service.HttpPort = 7000
Get.Service.ReadTimeout = 60 * time.Second Get.Service.ReadTimeout = 60 * time.Second

View File

@@ -1,18 +0,0 @@
/**
******************************************************************************
* @file ping.go
* @author MakerYang
******************************************************************************
*/
package PingController
import (
"Game/framework/utils"
"github.com/gin-gonic/gin"
)
func Ping(c *gin.Context) {
Utils.Success(c, Utils.EmptyData{})
return
}

View File

@@ -1,9 +1,10 @@
/** /**
****************************************************************************** #*****************************************************************************
* @file database.go # @file database.go
* @author MakerYang # @author MakerYang(https://www.makeryang.com)
****************************************************************************** # @statement 免费课程配套开源项目,任何形式收费均为盗版
*/ #*****************************************************************************
*/
package Database package Database
@@ -17,14 +18,17 @@ import (
"time" "time"
) )
// Get 定义数据库模块的调用指针
var Get *gorm.DB var Get *gorm.DB
// DefaultField 声明数据库默认字段
type DefaultField struct { type DefaultField struct {
CreateAt int `gorm:"Column:create_at" json:"create_at"` CreateAt int `gorm:"Column:create_at" json:"create_at"`
UpdateAt int `gorm:"Column:update_at" json:"update_at"` UpdateAt int `gorm:"Column:update_at" json:"update_at"`
DeleteAt int `gorm:"Column:delete_at" json:"delete_at"` DeleteAt int `gorm:"Column:delete_at" json:"delete_at"`
} }
// Init 初始化数据库连接
func Init() { func Init() {
var err error var err error

View File

@@ -1,9 +1,10 @@
/** /**
****************************************************************************** #*****************************************************************************
* @file interface.go # @file function.go
* @author MakerYang # @author MakerYang(https://www.makeryang.com)
****************************************************************************** # @statement 免费课程配套开源项目任何形式收费均为盗版
*/ #*****************************************************************************
*/
package Database package Database
@@ -12,53 +13,63 @@ import (
"time" "time"
) )
// Base 声明数据库基础数据结构体
type Base struct { type Base struct {
TableName string TableName string
} }
// New 实例化数据表
func New(table string) *Base { func New(table string) *Base {
return &Base{ return &Base{
TableName: table, TableName: table,
} }
} }
// CreateData 创建数据
func (base *Base) CreateData(data interface{}) error { func (base *Base) CreateData(data interface{}) error {
err := Get.Table(base.TableName).Create(data).Error err := Get.Table(base.TableName).Create(data).Error
return err return err
} }
// UpdateData 更新数据
func (base *Base) UpdateData(query interface{}, data map[string]interface{}) error { func (base *Base) UpdateData(query interface{}, data map[string]interface{}) error {
data["update_at"] = time.Now().Unix() data["update_at"] = time.Now().Unix()
err := Get.Table(base.TableName).Where(query).Updates(data).Error err := Get.Table(base.TableName).Where(query).Updates(data).Error
return err return err
} }
// ExprData 更新数值类字段值
func (base *Base) ExprData(query interface{}, field string, operation string, data int) error { func (base *Base) ExprData(query interface{}, field string, operation string, data int) error {
err := Get.Table(base.TableName).Where(query).Update(field, gorm.Expr(field+" "+operation+" ?", data)).Error err := Get.Table(base.TableName).Where(query).Update(field, gorm.Expr(field+" "+operation+" ?", data)).Error
return err return err
} }
// GetData 读取一条数据
func (base *Base) GetData(dataStruct interface{}, query interface{}, order string) error { func (base *Base) GetData(dataStruct interface{}, query interface{}, order string) error {
err := Get.Table(base.TableName).Where(query).Order(order).First(dataStruct).Error err := Get.Table(base.TableName).Where(query).Order(order).First(dataStruct).Error
return err return err
} }
// ListData 读取多条数据
func (base *Base) ListData(dataStruct interface{}, query interface{}, order string, limit int) error { func (base *Base) ListData(dataStruct interface{}, query interface{}, order string, limit int) error {
err := Get.Table(base.TableName).Where(query).Order(order).Limit(limit).Find(dataStruct).Error err := Get.Table(base.TableName).Where(query).Order(order).Limit(limit).Find(dataStruct).Error
return err return err
} }
// PageData 读取分页数据
func (base *Base) PageData(dataStruct interface{}, query interface{}, order string, limit int, page int) error { func (base *Base) PageData(dataStruct interface{}, query interface{}, order string, limit int, page int) error {
err := Get.Table(base.TableName).Where(query).Order(order).Limit(limit).Offset(page * limit).Find(dataStruct).Error err := Get.Table(base.TableName).Where(query).Order(order).Limit(limit).Offset(page * limit).Find(dataStruct).Error
return err return err
} }
// CountData 获取数据总数
func (base *Base) CountData(query interface{}) (int, error) { func (base *Base) CountData(query interface{}) (int, error) {
count := 0 count := 0
err := Get.Table(base.TableName).Where(query).Count(&count).Error err := Get.Table(base.TableName).Where(query).Count(&count).Error
return count, err return count, err
} }
// DeleteData 删除数据
func (base *Base) DeleteData(dataStruct interface{}, query interface{}) error { func (base *Base) DeleteData(dataStruct interface{}, query interface{}) error {
err := Get.Table(base.TableName).Where(query).Delete(dataStruct).Error err := Get.Table(base.TableName).Where(query).Delete(dataStruct).Error
return err return err

View File

@@ -1,16 +1,17 @@
/** /**
****************************************************************************** #*****************************************************************************
* @file framework.go # @file framework.go
* @author MakerYang # @author MakerYang(https://www.makeryang.com)
****************************************************************************** # @statement 免费课程配套开源项目,任何形式收费均为盗版
*/ #*****************************************************************************
*/
package Framework package Framework
import ( import (
"Game/framework/config" "Game/framework/config"
"Game/framework/controller"
"Game/framework/database" "Game/framework/database"
"Game/framework/interface"
) )
func Init() { func Init() {
@@ -18,6 +19,6 @@ func Init() {
Config.Init() Config.Init()
// 初始化数据库 // 初始化数据库
Database.Init() Database.Init()
// 初始化控制器 // 初始化接口路由
Controller.Init() Interface.Init()
} }

View File

@@ -1,15 +1,16 @@
/** /**
****************************************************************************** #*****************************************************************************
* @file controller.go # @file interface.go
* @author MakerYang # @author MakerYang(https://www.makeryang.com)
****************************************************************************** # @statement 免费课程配套开源项目任何形式收费均为盗版
*/ #*****************************************************************************
*/
package Controller package Interface
import ( import (
"Game/framework/config" "Game/framework/config"
"Game/framework/controller/ping" "Game/framework/interface/ping"
"context" "context"
"fmt" "fmt"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
@@ -21,17 +22,22 @@ import (
"time" "time"
) )
// 接口路由
func router() *gin.Engine { func router() *gin.Engine {
router := gin.New() router := gin.New()
gin.SetMode(Config.Get.Service.Mode) gin.SetMode(Config.Get.Service.Mode)
router.GET("/ping", PingController.Ping) // 健康检查接口
router.GET("/ping", PingInterface.Ping)
return router return router
} }
// Init 接口初始化
func Init() { func Init() {
routers := router() routers := router()
var HttpServer = &http.Server{ var HttpServer = &http.Server{

View File

@@ -0,0 +1,21 @@
/**
#*****************************************************************************
# @file ping.go
# @author MakerYang(https://www.makeryang.com)
# @statement 免费课程配套开源项目,任何形式收费均为盗版
#*****************************************************************************
*/
package PingInterface
import (
"Game/framework/utils"
"github.com/gin-gonic/gin"
)
// Ping 健康检查接口
func Ping(c *gin.Context) {
Utils.Success(c, Utils.Empty{})
return
}

View File

@@ -0,0 +1,11 @@
/**
#*****************************************************************************
# @file empty.go
# @author MakerYang(https://www.makeryang.com)
# @statement 免费课程配套开源项目,任何形式收费均为盗版
#*****************************************************************************
*/
package Utils
type Empty struct{}

View File

@@ -1,3 +0,0 @@
package Utils
type EmptyData struct{}

View File

@@ -1,3 +1,11 @@
/**
#*****************************************************************************
# @file hash.go
# @author MakerYang(https://www.makeryang.com)
# @statement 免费课程配套开源项目任何形式收费均为盗版
#*****************************************************************************
*/
package Utils package Utils
import ( import (

View File

@@ -1,3 +1,11 @@
/**
#*****************************************************************************
# @file header.go
# @author MakerYang(https://www.makeryang.com)
# @statement 免费课程配套开源项目,任何形式收费均为盗版
#*****************************************************************************
*/
package Utils package Utils
import "strings" import "strings"
@@ -11,39 +19,3 @@ func CheckUserAgent(userAgent string) bool {
return Status return Status
} }
func CheckGame(token string) (int, int, bool) {
Status := false
GameId := 0
GameAccountId := 0
if token != "" {
tokenMap, _ := DecodeId(128, token)
if len(tokenMap) == 2 {
GameId = tokenMap[0]
GameAccountId = tokenMap[1]
Status = true
}
}
if GameId == 0 || GameAccountId == 0 {
Status = false
}
return GameId, GameAccountId, Status
}
func CheckUser(token string) (int, bool) {
Status := false
Uid := 0
if token != "" {
tokenMap, _ := DecodeId(32, token)
if len(tokenMap) == 3 {
Uid = tokenMap[0]
Status = true
}
}
return Uid, Status
}

View File

@@ -0,0 +1,25 @@
/**
#*****************************************************************************
# @file mail.go
# @author MakerYang(https://www.makeryang.com)
# @statement 免费课程配套开源项目,任何形式收费均为盗版
#*****************************************************************************
*/
package Utils
import "gopkg.in/gomail.v2"
func SendMail(to string, subject string, content string) bool {
status := true
mail := gomail.NewMessage()
mail.SetHeader("From", mail.FormatAddress("", ""))
mail.SetHeader("To", to)
mail.SetHeader("Subject", subject)
mail.SetBody("text/html", content)
send := gomail.NewDialer("smtp.qq.com", 587, "", "")
if err := send.DialAndSend(mail); err != nil {
status = false
}
return status
}

View File

@@ -1,17 +0,0 @@
package Utils
import "gopkg.in/gomail.v2"
func SendMail(to string, subject string, content string) bool {
status := true
mail := gomail.NewMessage()
mail.SetHeader("From", mail.FormatAddress("open@wileho.com", "GEEKROS"))
mail.SetHeader("To", to)
mail.SetHeader("Subject", subject)
mail.SetBody("text/html", content)
send := gomail.NewDialer("smtp.qq.com", 587, "open@wileho.com", "")
if err := send.DialAndSend(mail); err != nil {
status = false
}
return status
}

View File

@@ -1,27 +0,0 @@
package Utils
import (
"regexp"
"strings"
)
func FilterMarkdown(input string) string {
quoteBlockRegex := regexp.MustCompile(`^\s*>[ \t]*(.*)$`)
lines := strings.Split(input, "\n")
var quoteLines []string
for _, line := range lines {
if quoteBlockRegex.MatchString(line) {
match := quoteBlockRegex.FindStringSubmatch(line)
quoteLines = append(quoteLines, match[1])
}
}
return strings.Join(quoteLines, "")
}
func FilterSummary(input string, maxLength int) string {
text := strings.TrimSpace(input)
if len(text) <= maxLength {
return text
}
return text[:maxLength]
}

View File

@@ -1,9 +1,10 @@
/** /**
****************************************************************************** #*****************************************************************************
* @file md5.go # @file md5.go
* @author MakerYang # @author MakerYang(https://www.makeryang.com)
****************************************************************************** # @statement 免费课程配套开源项目,任何形式收费均为盗版
*/ #*****************************************************************************
*/
package Utils package Utils

View File

@@ -1,3 +1,11 @@
/**
#*****************************************************************************
# @file order.go
# @author MakerYang(https://www.makeryang.com)
# @statement 免费课程配套开源项目,任何形式收费均为盗版
#*****************************************************************************
*/
package Utils package Utils
import ( import (

View File

@@ -1,11 +1,14 @@
/**
#*****************************************************************************
# @file phone.go
# @author MakerYang(https://www.makeryang.com)
# @statement 免费课程配套开源项目,任何形式收费均为盗版
#*****************************************************************************
*/
package Utils package Utils
import ( import (
"bytes"
"encoding/json"
"io/ioutil"
"log"
"net/http"
"regexp" "regexp"
) )
@@ -13,57 +16,3 @@ func MobileFormat(str string) string {
re, _ := regexp.Compile("(\\d{3})(\\d{6})(\\d{2})") re, _ := regexp.Compile("(\\d{3})(\\d{6})(\\d{2})")
return re.ReplaceAllString(str, "$1******$3") return re.ReplaceAllString(str, "$1******$3")
} }
func SendMessage(form string, phone string, info string) bool {
status := true
if form == "" || phone == "" || info == "" {
status = false
return status
}
desc := ""
if form == "express" {
desc = "【GEEKROS】Hi" + info + " 你在GEEKROS的订单已经发货请留意快递信息及时查收。"
}
if form == "account" {
desc = "【GEEKROS】你的验证码为" + info + " 有效期10分钟工作人员绝不会索取此验证码切勿告知他人。"
}
apiUrl := "https://smssh1.253.com/msg/v1/send/json"
params := make(map[string]interface{})
params["account"] = ""
params["password"] = ""
params["phone"] = phone
params["msg"] = desc
params["report"] = "false"
bytesData, err := json.Marshal(params)
if err != nil {
status = false
return status
}
reader := bytes.NewReader(bytesData)
request, err := http.NewRequest("POST", apiUrl, reader)
if err != nil {
status = false
return status
}
request.Header.Set("Content-Type", "application/json;charset=UTF-8")
client := http.Client{}
resp, err := client.Do(request)
if err != nil {
status = false
return status
}
respBytes, err := ioutil.ReadAll(resp.Body)
if err != nil {
status = false
return status
}
log.Println("[PhoneMessage]", string(respBytes))
return true
}

View File

@@ -1,3 +1,11 @@
/**
#*****************************************************************************
# @file price.go
# @author MakerYang(https://www.makeryang.com)
# @statement 免费课程配套开源项目,任何形式收费均为盗版
#*****************************************************************************
*/
package Utils package Utils
import "fmt" import "fmt"

View File

@@ -1,3 +1,11 @@
/**
#*****************************************************************************
# @file rand.go
# @author MakerYang(https://www.makeryang.com)
# @statement 免费课程配套开源项目,任何形式收费均为盗版
#*****************************************************************************
*/
package Utils package Utils
import ( import (

View File

@@ -1,9 +1,19 @@
/**
#*****************************************************************************
# @file return.go
# @author MakerYang(https://www.makeryang.com)
# @statement 免费课程配套开源项目,任何形式收费均为盗版
#*****************************************************************************
*/
package Utils package Utils
import ( import (
"encoding/json" "encoding/json"
"fmt"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
"log" "log"
"math"
"net/http" "net/http"
"os" "os"
"strconv" "strconv"
@@ -11,95 +21,112 @@ import (
) )
type logData struct { type logData struct {
Timestamp int64 `json:"timestamp"` ClientIp string `json:"client_ip"`
TimestampFormat string `json:"timestamp_format"` ClientMethod string `json:"client_method"`
ClientMethod string `json:"client_method"` ClientUrl string `json:"client_url"`
ClientIp string `json:"client_ip"` ClientSign string `json:"client_sign"`
ClientParameter string `json:"client_parameter"` ClientToken string `json:"client_token"`
ServerParameter string `json:"server_parameter"` ClientReferer string `json:"client_referer"`
ServerUrl string `json:"server_url"` ClientParameter clientParameter `json:"client_parameter"`
ServerName string `json:"server_name"` ServerParameter string `json:"server_parameter"`
ServerYear string `json:"server_year"` Date string `json:"date"`
ServerMonth string `json:"server_month"` Time int64 `json:"time"`
ServerDay string `json:"server_day"` Server string `json:"server"`
ServerTime string `json:"server_time"` Length string `json:"length"`
TimeLength string `json:"time_length"`
} }
func recordLog(c *gin.Context, serverParameter string) { type clientParameter struct {
Get interface{} `json:"get"`
Post interface{} `json:"post"`
}
func requestLog(c *gin.Context, serverParameter string) {
data := &logData{} data := &logData{}
data.Timestamp = time.Now().Unix() data.Time = time.Now().Unix()
data.TimestampFormat = time.Now().Format("2006-01-02 15:04:05") data.Date = time.Now().Format("2006-01-02 15:04:05")
data.ClientMethod = c.Request.Method data.ClientMethod = c.Request.Method
data.ClientIp = c.ClientIP() data.ClientIp = c.ClientIP()
data.ClientSign = c.Request.Header.Get("Client-Sign")
data.ClientToken = c.Request.Header.Get("Client-Token")
data.ClientReferer = c.Request.Header.Get("Client-Referer")
if data.ClientMethod == "GET" { if data.ClientMethod == "GET" {
data.ClientParameter = c.Request.RequestURI data.ClientParameter.Get = c.Request.URL.Query()
} }
if data.ClientMethod == "POST" { if data.ClientMethod == "POST" {
clientParam, err := json.Marshal(c.Request.PostForm) data.ClientParameter.Post = c.Request.PostForm
if err != nil {
data.ClientParameter = ""
}
if err == nil {
data.ClientParameter = string(clientParam)
}
} }
scheme := "http://" scheme := "http://"
if c.Request.TLS != nil { if c.Request.TLS != nil {
scheme = "https://" scheme = "https://"
} }
serverUrl := scheme + c.Request.Host + c.Request.URL.Path serverUrl := scheme + c.Request.Host + c.Request.URL.Path
data.ClientUrl = serverUrl
serverName, _ := os.Hostname() serverName, _ := os.Hostname()
data.ServerUrl = serverUrl data.Server = serverName
data.ServerName = serverName
data.ClientParameter = c.GetString("client_parameter")
data.ServerParameter = serverParameter data.ServerParameter = serverParameter
data.ServerYear = time.Now().Format("2006")
data.ServerMonth = time.Now().Format("01") clientTimeStr := c.Request.Header.Get("Client-Time")
data.ServerDay = time.Now().Format("02") if clientTimeStr != "" {
data.ServerTime = time.Now().Format("15:04:05") clientTimeMs, _ := strconv.ParseInt(clientTimeStr, 10, 64)
data.TimeLength = strconv.FormatFloat(float64(time.Now().UnixNano())/1000000-c.GetFloat64("start_time"), 'f', 2, 64) serverTimeMs := time.Now().UnixNano() / 1e6
processingTimeMs := serverTimeMs - clientTimeMs
data.Length = fmt.Sprintf("%.3f", math.Abs(float64(processingTimeMs)/1000.0))
}
dataString, _ := json.Marshal(data) dataString, _ := json.Marshal(data)
log.Println("[Log]", string(dataString)) log.Println("[request]", string(dataString))
} }
func Success(c *gin.Context, data interface{}) { func Success(c *gin.Context, data interface{}) {
c.JSON(http.StatusOK, gin.H{ c.JSON(http.StatusOK, gin.H{
"code": 0, "code": 0,
"msg": "success", "msg": "success",
"data": data, "data": data,
}) })
logJson, _ := json.Marshal(gin.H{"code": 0, "msg": "success", "data": data}) logJson, _ := json.Marshal(gin.H{"code": 0, "msg": "success", "data": data})
recordLog(c, string(logJson))
requestLog(c, string(logJson))
} }
func Error(c *gin.Context, data interface{}) { func Error(c *gin.Context, data interface{}) {
c.JSON(http.StatusOK, gin.H{ c.JSON(http.StatusOK, gin.H{
"code": 10000, "code": 10000,
"msg": "error", "msg": "error",
"data": data, "data": data,
}) })
logJson, _ := json.Marshal(gin.H{"code": 10000, "msg": "error", "data": data}) logJson, _ := json.Marshal(gin.H{"code": 10000, "msg": "error", "data": data})
recordLog(c, string(logJson))
requestLog(c, string(logJson))
} }
func Warning(c *gin.Context, code int, msg string, data interface{}) { func Warning(c *gin.Context, code int, msg string, data interface{}) {
c.JSON(http.StatusOK, gin.H{ c.JSON(http.StatusOK, gin.H{
"code": code, "code": code,
"msg": msg, "msg": msg,
"data": data, "data": data,
}) })
logJson, _ := json.Marshal(gin.H{"code": code, "msg": msg, "data": data}) logJson, _ := json.Marshal(gin.H{"code": code, "msg": msg, "data": data})
recordLog(c, string(logJson))
requestLog(c, string(logJson))
} }
func AuthError(c *gin.Context, code int, msg string, data interface{}) { func AuthError(c *gin.Context, code int, msg string, data interface{}) {
c.JSON(http.StatusUnauthorized, gin.H{ c.JSON(http.StatusUnauthorized, gin.H{
"code": code, "code": code,
"msg": msg, "msg": msg,
"data": data, "data": data,
}) })
logJson, _ := json.Marshal(gin.H{"code": code, "msg": msg, "data": data}) logJson, _ := json.Marshal(gin.H{"code": code, "msg": msg, "data": data})
recordLog(c, string(logJson))
requestLog(c, string(logJson))
} }

View File

@@ -1,3 +1,11 @@
/**
#*****************************************************************************
# @file time.go
# @author MakerYang(https://www.makeryang.com)
# @statement 免费课程配套开源项目,任何形式收费均为盗版
#*****************************************************************************
*/
package Utils package Utils
import ( import (

View File

@@ -1,14 +1,16 @@
/** /**
****************************************************************************** #*****************************************************************************
* @file main.go # @file main.go
* @author MakerYang # @author MakerYang(https://www.makeryang.com)
****************************************************************************** # @statement 免费课程配套开源项目,任何形式收费均为盗版
*/ #*****************************************************************************
*/
package main package main
import "Game/framework" import "Game/framework"
// 程序启动口
func main() { func main() {
// 初始化核心框架 // 初始化核心框架
Framework.Init() Framework.Init()

View File

@@ -6,6 +6,7 @@ set -e
sudo cp -r ./tools/centos/* / sudo cp -r ./tools/centos/* /
# 复制后端服务到运行目录 # 复制后端服务到运行目录
sudo rm -rf /data/wwwroot/server
sudo cp -r ./server /data/wwwroot/ sudo cp -r ./server /data/wwwroot/
# 创建游戏引擎服务端运行目录 # 创建游戏引擎服务端运行目录