1 Star 0 Fork 0

没有昵称 / fm

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
贡献代码
同步代码
取消
提示: 由于 Git 不支持空文件夾,创建文件夹后会生成空的 .keep 文件
Loading...
README
MIT

FM

初始化

  • 实例化app并设置需要初始化的能力
  • 调用RunServer即可启动服务
    func main() {
        _ = os.Setenv("FM_SERVER_RUN_PORT", "7781")
        _ = os.Setenv("FM_SERVER_RUN_MODE", gin.DebugMode)
    
        app := fm.App{
            AppConfig: fm.AppConfig{
                RegisterRoute:      boot.RegisterGatewayRoute,
                RouterResponseFunc: nil,
                CustomConfig:       "config/config.yaml",
                RegisterConfig:     boot.SetConfig,
                RegisterBoot:       nil,
                DatabaseConnConfig: config.DatabaseConfig,
                DatabasePoolConfig: nil,
            },
            LoggerConfig: fm.LoggerConfig{
                LoggerName:      "logger.db",
                LoggerDir:       "log",
                LoggerWriteType: "sqlite",
                UseDayLogger:    true,
                PrintConsole:    false,
            },
            Middleware: Middleware{
                UseLogger:         true,
                UseTrace:          false,
                UseLoggerResponse: false,
            },
        }
    
        app.RunServer()
    }

项目目录

|-config
  |-config.yaml
  |-config-debug.yaml
  |-config-test.yaml
  |-config-release.yaml
|-log
  20240226.log
  20240225.log
main.go

请求日志

  • 日志分为文件日志和数据库日志
    • 通过初始化时传入App.LoggerConfig.LoggerWriteType 来决定
    • "file","sqlite","console"
  • App.LoggerConfig.LoggerDir 用来设置存放日志的目录
  • App.LoggerConfig.LoggerName 用来设置日志文件的名字
    • 当使用App.LoggerConfig.UseDayLogger 设置的时候, 文件名设置失效
    • 日志文件会按照日期(年-月-日)的方式来命名存储
  • APp.LoggerConfig.PrintConsole 用来标识是否同时把日志打印在控制台
    • 只在file和sqlite类型生效
  • 日志目录的文件均不会自动删除

配置加载

  • 根据初始化传入的配置文件地址加载配置
  • 配置文件为yaml格式的
  • 允许空配置文件
    • 这个场景会打印一次警告信息
  • 优先读取传入的文件配置 (config/config.yaml)
    • 传入文件地址不存在时, 会进行一次环境配置的获取
      • config/config-debug.yaml
      • config/config-test.yaml
      • config/config-release.yaml
      •   config.yaml
          --------------
        
          app:
              name: fm
              port: 6678
              mode: debug
        
          database:
              username: 123
              password: 456
              port: 3306
              dbname: test
              databaseName: test2
              servicename: test3
  • 结构体字段为驼峰时的映射写法
    • 结构体字段添加tag, 对应yaml中可以使用驼峰字段名 (例: DatabaseName)
    • yaml中不使用驼峰可以直接映射到驼峰结构体中 (例: ServiceName)
  • 对App.AppConfig.RegisterConfig传入的函数在启动时调用并传入绑定函数
    • func BindConfig(name string, config interface{}) error
    • 通过传入的 BindConfig("name", obj) 来绑定文件中的配置到结构体中
    • name是yaml中的分组名称, config则是需要绑定数据的结构体
    •   type App struct {
            Mode string
            Port string
            Name string
        }
      
        type Database struct {
            Username string
            Password string
            Port int
            Dbname string
            DatabaseName string `yaml:"databaseName"`
            ServiceName string
        }
        var DatabaseConfig = new(Database)
        var AppConfig = new(App)
      
        func RegisterConfig(handle *fm.SetConfig) error {
            if err := handle("database", &DatabaseConfig); err != nil {
                return err
            }
      
            if err := handle("app", &AppConfig); err != nil {
                return err
            }
        }

路由注册

  • 初始化传入实现App.AppConfig.RegisterRoute接口方法注册路由
  • 接口入参会提供一个路由实体
    • 实体提供了以下注册方法
    • Group(path, middleware)
      • 创建一个路由分组
    • Use(middleware)
      • 对分组下路由使用中间件
    • GET/POST/PUT/DELETE/OPTIONS/PATCH/HEAD/Any
    •   import "gitee.com/xluomo945/fm/route"
      
        // 路由注册
        func RegisterRouter(router route.RouterHandler) {
            u := router.Group("/user", middleware.Auth)
            u.Use(middleware.JWT)
            route.GET(u, "info", userService.Info)
      
            v := router.Group("/vip", middleware.ActionLogger)
            route.GET(v, "list", vipService.List)
        }
  • 默认的情况下, 使用以上方法注册的路由, 响应值按照JSON返回
    • 正常响应为 http code 200
      • {"code": 1, "msg":"ok", "data": obj}
    • 异常响应为 http code 500
      • {"code": -1, "msg": err}
  • 当简易JSON不足以满足响应值需求的时候通过初始化时, 传入App.AppConfig.RouterResponseFunc可以接管响应信息进行包装
    • 当使用RouterResponseFunc进行响应封装时, 则是按照gin的响应格式来进行,
      • 如 ctx.JSON(200, data),
      • 如 ctx.HTML(401, "login.html")
      •   // 响应接管
          func ResponseFormat(ctx *gin.Context, resp interface{}, err error) {
              if err != nil {
                  ctx.JSON(500, failJsonFormat(err))
                  return
              }
        
              if _, ok := resp.(DownloadResponse); ok {
                  ctx.File(200, resp.GetFile())
                  return
              }
          
              if ctx.Request.Response.Header.Get("Context-Type") == vars.JSON {
                  ctx.JSON(200, defaultJsonFormat(resp))
                  return
              }
          }

连接数据库

  • 初始化传入实现App.AppConfig.DatabaseConnConfig接口的结构体
    • 实现这个接口的结构体传入以后可以自动连接mysql
    • 调用数据库则直接使用 fm.DB() 获取实例
  • 默认最大等待时间是10, 默认最大连接数是50
    • 可以通过传入实现App.AppConfig.DatabasePoolConfig接口的配置来修改

辅助函数

方法名 备注
helper.StringEmpty 字符串是否为空
helper.PathIsExists 路径文件/目录是否存在
helper.RandomString 获取指定长度的随机字母字符串
helper.RandomNumber 获取指定长度的随机数字字符串
helper.RandomStringAndNumber 获取指定长度的字母和数字字符串
MIT License Copyright (c) 2024 没有昵称 Permission is hereby granted, free of charge, to any person obtaining app copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

简介

Gin二开, 对gin多封装一层web框架常用操作 展开 收起
Go
MIT
取消

发行版

暂无发行版

贡献者

全部

近期动态

加载更多
不能加载更多了
Go
1
https://gitee.com/xluomo945/fm.git
git@gitee.com:xluomo945/fm.git
xluomo945
fm
fm
master

搜索帮助