{"id":17355110,"url":"https://github.com/gphper/actions","last_synced_at":"2025-07-06T03:06:23.166Z","repository":{"id":113091409,"uuid":"475852451","full_name":"gphper/actions","owner":"gphper","description":null,"archived":false,"fork":false,"pushed_at":"2022-04-02T16:30:08.000Z","size":2675,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-05-30T09:18:24.158Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/gphper.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2022-03-30T11:43:23.000Z","updated_at":"2022-03-30T13:58:33.000Z","dependencies_parsed_at":null,"dependency_job_id":"c2b27677-131d-49b0-ad9e-12498101296d","html_url":"https://github.com/gphper/actions","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/gphper/actions","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gphper%2Factions","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gphper%2Factions/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gphper%2Factions/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gphper%2Factions/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/gphper","download_url":"https://codeload.github.com/gphper/actions/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gphper%2Factions/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":263841614,"owners_count":23518487,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-10-15T17:42:19.793Z","updated_at":"2025-07-06T03:06:23.143Z","avatar_url":"https://github.com/gphper.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# GinAdmin\n这个项目是以Gin框架为基础搭建的后台管理平台，虽然很多人都认为go是用来开发高性能服务端项目的，但是也难免有要做web管理端的需求，总不能再使用别的语言来开发吧。所以整合出了GinAdmin项目，请大家多提意见指正！欢迎 star ⭐⭐\n\n![logo](README/logo.jpg)\n\n![logo](README/index.jpg)\n\n## 依赖\n* golang \u003e 1.8\n* Gin\n* BootStrap\n* LayUi\n* WebUpload\n* [Light Year Admin Using Iframe](#https://gitee.com/yinqi/Light-Year-Admin-Using-Iframe)\n\n## 功能清单\n\n:white_check_mark:权限控制\n\n:white_check_mark:日志管理\n\n:white_check_mark:模板页面\n\n:white_check_mark:自动分页\n\n:white_check_mark:Docker部署\n\n:white_check_mark:静态资源打包\n\n:white_check_mark:性能监控\n\n:white_check_mark:API JWT\n\n:white_check_mark:redis日志落盘保存\n\n:black_square_button:登录日志\n\n:black_square_button:Admin Api\n\n:black_square_button:Admin Vue\n\n:black_square_button:命令行操作\n\n## 使用文档\n- [演示地址](#演示地址)\n\n- [开始使用](#开始使用)\n- [构建环境](#docker-compose)\n- [项目目录](#结构)\n- [分页](#分页)\n- [日志](#日志)\n- [数据库](#数据库)\n- [定时任务](#定时任务)\n- [配置文件](#配置文件)\n- [模板页面](#模板页面)\n- [用户权限](#用户权限)\n- [API文档](#API文档)\n- [线上部署](#线上部署)\n- [性能监控](#性能监控)\n\n### :small_blue_diamond:\u003ca name=\"演示地址\"\u003e演示地址\u003c/a\u003e\n* http://122.152.196.83/admin/login  账号：admin 密码： 111111\n\n### :small_blue_diamond:\u003ca name=\"开始使用\"\u003e开始使用\u003c/a\u003e\n\n1. git 克隆地址 \n\n   ```\n   git clone https://github.com/gphper/ginadmin.git\n   ```\n\n2. 下载依赖包\n\n   ```go\n   go mod download\n   ```\n\n3. 配置 `configs/config.ini`文件\n\n   ```\n   [mysql]\n   username=root\n   password=123456\n   database=db_beego\n   host=127.0.0.1\n   port=3306\n   max_open_conn=50\n   max_idle_conn=20\n   [redis]\n   addr=localhost:6379\n   db=0\n   password=\"\"\n   [session]\n   session_name=gosession_id\n   [base]\n   host=0.0.0.0\n   port=20011\n   fill_data=true\n   migrate_table=true\n   log_media=redis\n   ```\n\n4. 运行 `go run .\\cmd\\ginadmin`访问地址 http://localhost:端口地址/admin/login。默认账户：admin  密码：111111\n\n5. vscode调试配置文件 `launch.json`\n\n```json\n{\n    \"version\": \"0.2.0\",\n    \"configurations\": [\n        {\n            \"name\": \"ginadmin\",\n            \"type\": \"go\",\n            \"request\": \"launch\",\n            \"mode\": \"debug\",\n            \"program\": \"${workspaceRoot}/cmd/ginadmin\",\n            \"trace\": true,\n            \"args\":[\n                \"--root_path=${workspaceRoot}\"\n            ],\n        }\n}\n```\n\n\n\n### :small_blue_diamond:\u003ca name=\"docker-compose\"\u003e构建开发环境\u003c/a\u003e\n\n1. 替换conf目录下的配置项\n\n   ```ini\n   [mysql]\n   username=docker\n   password=123456\n   database=docker_mysql\n   host=localmysql\n   port=3306\n   max_open_conn=50\n   max_idle_conn=20\n   [session]\n   session_name=gosession_id\n   [base]\n   host=0.0.0.0\n   port=20010\n   fill_data=true\n   [redis]\n   addr=localredis:6379\n   db=0\n   password=ginadmin\n   ```\n\n2. 执行命令 `docker-compose up -d`\n\n3. 进入到容器中 `docker exec -it ginadmin-web bash`\n\n4. 下载扩展 `go mod tidy`\n\n5. 运行项目 ` go run ./cmd/ginadmin/`  访问地址 `http://localhost:20010/admin/login`\n\n6. 桌面连接redis地址\n\n   ```\n   地址：127.0.0.1\n   端口：6380\n   密码：ginadmin\n   ```\n\n7. 桌面连接mysql地址\n\n   ```\n   地址：localhost\n   端口：3310\n   用户名：docker\n   密码：123456\n   ```\n\n### :small_blue_diamond:\u003ca name=\"结构\"\u003e项目目录\u003c/a\u003e\n\n```\n|--api  // Api接口控制器\n|--build // 封装的公共方法\n|--cmd  // 命令行工具\n|--configs // 配置文件\n|--deployments // docker-compose 部署文件\n|--internal //核心代码\n|--logs // 日志存放目录\n|--pkg // 公共调用部分\n|--web //视图静态文件\n```\n\n### :small_blue_diamond:\u003ca name=\"分页\"\u003e分页\u003c/a\u003e\n\n1.  使用 `pkg/paginater/paginater.go` 里面的 `PageOperation` 进行分页\n    ```go\n    adminDb := models.Db.Table(\"admin_users\").Select(\"nickname\",\"username\").Where(\"uid != ?\", 1)\n    adminUserData := paginater.PageOperation(c, adminDb, 1, \u0026adminUserList)\n    ```\n2.  在html中使用\n    ```go\n    {{ .adminUserData.PageHtml }}\n    ```\n\n### :small_blue_diamond:\u003ca name=\"日志\"\u003e日志\u003c/a\u003e\n1.  系统日志\n    \n    设置路由中间件来收集系统日志和错误日志，设置 `internal/router/default.go` 文件\n    \n2.  自定义日志\n    \n    使用 loggers.LogInfo()` 方法记录日志  `github.com/gphper/ginadmin/pkg/loggers`\n    \n    ```golang\n    loggers.LogInfo(\"admin\", \"this is a info message\", map[string]string{\n    \t\t\"user_info\": \"this is a user info\",\n    })\n    ```\n    \n3. 切换存储介质\n\n   在配置文件中修改 `log_media` 参数默认file文件存储可选redis存储\n\n### :small_blue_diamond:\u003ca name=\"数据库\"\u003e数据库\u003c/a\u003e\n\n1. models下定义的文件均需要实现 `TableName() string`  方法，并将实现该结构体的指针写入到 `GetModels` 方法中\n\n   ```go\n   func GetModels() []interface{} {\n   \treturn []interface{}{\n   \t\t\u0026AdminUsers{},\n   \t\t\u0026AdminGroup{},\n   \t}\n   }\n   ```\n\n2. model需要继承 BaseModle 并且实现 TableName 方法，如果需要初始化填充数据的话，需要实现 FillData() 方法，并将数据填充需要执行的代码写到函数体里。详情参照 AdminUsers\n\n5. 可以通过设置 ini 配置文件中的 `fill_data`和`migrate_table` 分别控制程序重启时自动迁移数据表和填充数据\n\n### :small_blue_diamond:\u003ca name=\"定时任务\"\u003e定时任务\u003c/a\u003e\n\n-    在 `pkg/cron/cron.go`  添加定时执行任务\n\n### :small_blue_diamond:\u003ca name=\"配置文件\"\u003e配置文件\u003c/a\u003e\n\n1. 现在 `configs/config.go` 添加配置项的 struct 类型，例如\n\n   ```go\n   type AppConf struct {\n   \tBaseConf `ini:\"base\"`\n   }\n   type BaseConf struct {\n   \tPort string `ini:\"port\"`\n   }\n   ```\n\n2. 在 `configs/config.ini` 添加配置信息\n\n   ```\n   [base]\n   port=:8091\n   ```\n\n3. 在代码中调用配置文件的信息\n\n   ```go\n   configs.App.BaseConf.Port\n   ```\n\n### :small_blue_diamond:\u003ca name=\"模板页面\"\u003e模板页面\u003c/a\u003e\n\n- 所有的后台模板都写到 `web/views/template` 目录下面，并且分目录存储，调用时按照 `目录/模板名称` 的方式调用\n\n\n### :small_blue_diamond:\u003ca name=\"用户权限\"\u003e用户权限\u003c/a\u003e\n\n- 菜单权限定义到 `internal/menu/menu.go` 文件下，定义完之后在用户组管理里面编辑权限\n\n- casbin版集成了casbin权限管理框架，官方地址：[casbin](#https://casbin.org/docs/zh-CN/get-started)\n\n- 框架中的常用方法定义在  `pkg/casbinauth/casbin.go` 文件中\n\n- 在控制器中可用从 `gin.context` 获取登录用户信息\n\n  ```go\n  info,_ := c.Get(\"userInfo\")\n  ```\n\n- template 中判断权限的函数 `judgeContainPriv` 定义在 `pkg/template/default.go` 文件下\n\n  ```go\n  \"judgeContainPriv\": func(username string, obj string, act string) bool {\n  \t\tif username == \"admin\" {\n  \t\t\treturn true\n  \t\t}\n  \t\tok, err := casbinauth.Check(username, obj, act)\n  \t\tif !ok || err != nil {\n  \t\t\treturn false\n  \t\t}\n  \t\treturn true\n  },\n  ```\n\n### :small_blue_diamond:\u003ca name=\"API文档\"\u003eAPI文档\u003c/a\u003e\n\n- 使用 swagg 生成api文档，生成文件再docs目录下\n\n  ```swag init -g cmd/ginadmin/main.go```\n  \n- 在根目录执行  `go build .\\cmd\\ginadmin\\` 然后啊访问 http://localhost:20010/swagger/index.html\n\n### :small_blue_diamond:\u003ca name=\"线上部署\"\u003e线上部署\u003c/a\u003e\n\n- 使用 `go build -tags=release .\\cmd\\ginadmin`  生成二进制文件\n- 打包静态资源部署 `go build -tags=embed .\\cmd\\ginadmin` \n\n### :small_blue_diamond:\u003ca name=\"性能监控\"\u003e性能监控\u003c/a\u003e\n\n* 推荐使用 prometheus + grafana 进行性能监控，参考示例  https://github.com/gphper/ginmonitor\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgphper%2Factions","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fgphper%2Factions","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgphper%2Factions/lists"}