GinAdmin 管理基礎平臺

GPER發表於2021-09-11

這個專案是以Gin框架為基礎搭建的後臺管理平臺,雖然很多人都認為go是用來開發高效能服務端專案的,但是也難免有要做web管理端的需求,總不能再使用別的語言來開發吧。所以整合出了GinAdmin專案,請大家多提意見指正!歡迎 star ⭐⭐

演示地址

依賴

功能清單

許可權控制

日誌管理

模板頁面

自動分頁

Docker部署

靜態資源打包

效能監控

使用文件

開始使用

  1. git 克隆地址

    git clone https://github.com/gphper/ginadmin.git
  2. 下載依賴包

    go mod download
  3. 配置 configs/config.ini檔案

    [mysql]
    username=root
    password=123456
    database=db_beego
    host=127.0.0.1
    port=3306
    max_open_conn=50
    max_idle_conn=20
    [redis]
    addr=localhost:6379
    db=0
    password=""
    [session]
    session_name=gosession_id
    [base]
    port=:8091
  4. 執行 go run main.go訪問地址 http://localhost:埠地址/admin/login。預設賬戶:admin 密碼:111111

docker-compose構建環境

  1. 替換conf目錄下的配置項

    [mysql]
    username=docker
    password=123456
    database=docker_mysql
    host=localmysql
    port=3306
    max_open_conn=50
    max_idle_conn=20
    [session]
    session_name=gosession_id
    [base]
    host=0.0.0.0
    port=20010
    fill_data=true
  2. 執行命令 docker-compose up

專案目錄

|--api  // Api介面控制器
|--build // 封裝的公共方法
|--cmd  // 命令列工具
|--configs // 配置檔案
|--deployments // docker-compose 部署檔案
|--internal //核心程式碼
|--logs // 日誌存放目錄
|--pkg // 公共呼叫部分
|--web //檢視靜態檔案

分頁

  1. 使用 pkg/comment/util.go 裡面的 PageOperation 進行分頁
    adminDb := models.Db.Table("admin_users").Select("nickname","username").Where("uid != ?", 1)
    adminUserData := comment.PageOperation(c, adminDb, 1, &adminUserList)
  2. 在html中使用
    {{ .adminUserData.PageHtml }}

日誌

  1. 系統日誌

    設定路由中介軟體來收集系統日誌和錯誤日誌,設定 internal/router/default.go 檔案

  2. 自定義日誌

    使用 loggers.LogInfo()方法記錄日誌github/gphper/ginadmin/pkg/loggers`

    loggers.LogInfo("admin", "this is a info message", map[string]string{
            "user_info": "this is a user info",
    })
  3. 切換儲存介質

    • 系統日誌在 internal/router/default.go 檔案更換中介軟體切換日誌儲存介質

    • 自定義日誌在loggers.LogInfo 方法使用facade.NewZaplogfacade.NewRedislog 切換

資料庫

  1. models下定義的檔案均需要實現 TableName() string 方法,並將實現該結構體的指標寫入到 GetModels 方法中

    func GetModels() []interface{} {
        return []interface{}{
            &AdminUsers{},
            &AdminGroup{},
        }
    }
  2. model需要繼承 BaseModle 並且實現 TableName 方法,如果需要初始化填充資料的話,需要實現 FillData() 方法,並將資料填充需要執行的程式碼寫到函式體裡。詳情參照 AdminUsers

  3. 資料庫遷移,先使用go install cmd\ginadmin-cli安裝ginadmin-cli 命令,執行命令列工具

    ginadmin-cli db migrate
  4. 資料填充,需在相應目錄下實現 FillData() 方法執行如下命令

    ginadmin-cli db seed
  5. 可以通過設定 ini 配置檔案中的 fill_datamigrate_table 分別控制程式重啟時自動遷移資料表和填充資料

定時任務

  • pkg/cron/cron.go 新增定時執行任務

配置檔案

  1. 現在 configs/config.go 新增配置項的 struct 型別,例如

    type AppConf struct {
        BaseConf `ini:"base"`
    }
    type BaseConf struct {
        Port string `ini:"port"`
    }
  2. configs/config.ini 新增配置資訊

    [base]
    port=:8091
  3. 在程式碼中呼叫配置檔案的資訊

    configs.App.BaseConf.Port

模板頁面

  • 所有的後臺模板都寫到 web/views/template 目錄下面,並且分目錄儲存,呼叫時按照 目錄/模板名稱 的方式呼叫

使用者許可權

  • 選單許可權定義到 internal/menu/menu.go 檔案下,定義完之後在使用者組管理裡面編輯許可權

  • casbin版整合了casbin許可權管理框架,官方地址:casbin

  • 框架中的常用方法定義在 comment/auth/casbinauth/asbin.go 檔案中

  • 在控制器中可用從 gin.context 獲取登入使用者資訊

    info,_ := c.Get("userInfo")
  • template 中判斷許可權的函式 judgeContainPriv 定義在 pkg/template/default.go 檔案下

    "judgeContainPriv": func(username string, obj string, act string) bool {
            if username == "admin" {
                return true
            }
            ok, err := casbinauth.Check(username, obj, act)
            if !ok || err != nil {
                return false
            }
            return true
    },

API文件

  • 使用 swagg 生成api文件,生成檔案再docs目錄下

    swag init -g cmd/ginadmin/main.go

  • 在根目錄執行 go build .\cmd\ginadmin\ 然後啊訪問 localhost:20010/swagger/index.html

線上部署

  • 使用 go build -tags=release .\cmd\ginadmin 生成二進位制檔案
  • 打包靜態資源部署 go build -tags=embed .\cmd\ginadmin

效能監控

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章