Full Code of GoAdminGroup/go-admin for AI

main c47763c7bb63 cached
368 files
2.9 MB
778.1k tokens
4600 symbols
1 requests
Download .txt
Showing preview only (3,104K chars total). Download the full file or copy to clipboard to get everything.
Repository: GoAdminGroup/go-admin
Branch: main
Commit: c47763c7bb63
Files: 368
Total size: 2.9 MB

Directory structure:
gitextract_hu_9kfne/

├── .deepsource.toml
├── .drone.yml
├── .github/
│   ├── FUNDING.yml
│   └── ISSUE_TEMPLATE/
│       ├── bug_report.md
│       ├── bug_report_zh.md
│       ├── proposal.md
│       ├── proposal_zh.md
│       ├── questions.md
│       └── questions_zh.md
├── .gitignore
├── CODE_OF_CONDUCT.md
├── CONTRIBUTING.md
├── CONTRIBUTING_CN.md
├── DONATION.md
├── Dockerfile
├── LICENSE
├── Makefile
├── README.md
├── README_CN.md
├── SECURITY.md
├── adapter/
│   ├── adapter.go
│   ├── beego/
│   │   └── beego.go
│   ├── beego2/
│   │   └── beego2.go
│   ├── buffalo/
│   │   └── buffalo.go
│   ├── chi/
│   │   └── chi.go
│   ├── echo/
│   │   └── echo.go
│   ├── fasthttp/
│   │   └── fasthttp.go
│   ├── gear/
│   │   └── gear.go
│   ├── gf/
│   │   └── gf.go
│   ├── gf2/
│   │   └── gf2.go
│   ├── gin/
│   │   └── gin.go
│   ├── gofiber/
│   │   └── gofiber.go
│   ├── gorilla/
│   │   └── gorilla.go
│   ├── iris/
│   │   └── iris.go
│   └── nethttp/
│       └── nethttp.go
├── context/
│   ├── context.go
│   ├── context_test.go
│   └── trie.go
├── data/
│   ├── admin.mssql
│   ├── admin.pgsql
│   ├── admin.sql
│   └── migrations/
│       ├── admin_2020_04_14_100427_ms.sql
│       ├── admin_2020_04_14_100427_mysql.sql
│       ├── admin_2020_04_14_100427_postgres.sql
│       ├── admin_2020_04_14_100427_sqlite.sql
│       ├── admin_2020_08_04_092427_ms.sql
│       ├── admin_2020_08_04_092427_mysql.sql
│       ├── admin_2020_08_04_092427_postgres.sql
│       └── admin_2020_08_04_092427_sqlite.sql
├── docker-compose.yml
├── engine/
│   └── engine.go
├── examples/
│   ├── beego/
│   │   └── main.go
│   ├── beego2/
│   │   └── main.go
│   ├── buffalo/
│   │   └── main.go
│   ├── chi/
│   │   └── main.go
│   ├── datamodel/
│   │   ├── authors.go
│   │   ├── bootstrap.go
│   │   ├── config.json
│   │   ├── content.go
│   │   ├── goadmin_super_users.go
│   │   ├── mysql_types.go
│   │   ├── posts.go
│   │   ├── tables.go
│   │   └── user.go
│   ├── echo/
│   │   └── main.go
│   ├── fasthttp/
│   │   └── main.go
│   ├── gear/
│   │   └── main.go
│   ├── gf/
│   │   └── main.go
│   ├── gf2/
│   │   └── main.go
│   ├── gin/
│   │   └── main.go
│   ├── gofiber/
│   │   └── main.go
│   ├── gorilla/
│   │   └── main.go
│   ├── iris/
│   │   └── main.go
│   └── nethttp/
│       └── main.go
├── go.mod
├── go.sum
├── modules/
│   ├── auth/
│   │   ├── auth.go
│   │   ├── auth_test.go
│   │   ├── middleware.go
│   │   ├── middleware_test.go
│   │   └── session.go
│   ├── collection/
│   │   ├── collection.go
│   │   └── collection_test.go
│   ├── config/
│   │   ├── config.go
│   │   ├── config.ini
│   │   ├── config.yaml
│   │   └── config_test.go
│   ├── constant/
│   │   └── constant.go
│   ├── db/
│   │   ├── base.go
│   │   ├── connection.go
│   │   ├── converter.go
│   │   ├── dialect/
│   │   │   ├── common.go
│   │   │   ├── dialect.go
│   │   │   ├── mssql.go
│   │   │   ├── mysql.go
│   │   │   ├── oceanbase.go
│   │   │   ├── postgresql.go
│   │   │   └── sqlite.go
│   │   ├── drivers/
│   │   │   ├── mssql/
│   │   │   │   └── mssql.go
│   │   │   ├── mysql/
│   │   │   │   └── mysql.go
│   │   │   ├── oceanbase/
│   │   │   │   └── oceanbase.go
│   │   │   ├── postgres/
│   │   │   │   └── postgres.go
│   │   │   └── sqlite/
│   │   │       └── sqlite.go
│   │   ├── mssql.go
│   │   ├── mysql.go
│   │   ├── oceanbase.go
│   │   ├── performer.go
│   │   ├── postgresql.go
│   │   ├── sqlite.go
│   │   ├── statement.go
│   │   ├── statement_mssql_test.go
│   │   ├── statement_mysql_test.go
│   │   ├── statement_postgresql_test.go
│   │   ├── statement_sqlite_test.go
│   │   ├── statement_test.go
│   │   ├── types.go
│   │   └── types_test.go
│   ├── errors/
│   │   └── error.go
│   ├── file/
│   │   ├── file.go
│   │   └── local.go
│   ├── language/
│   │   ├── cn.go
│   │   ├── en.go
│   │   ├── jp.go
│   │   ├── language.go
│   │   ├── language_test.go
│   │   ├── pt-BR.go
│   │   ├── ru.go
│   │   └── tc.go
│   ├── logger/
│   │   ├── logger.go
│   │   └── logger_test.go
│   ├── menu/
│   │   ├── menu.go
│   │   └── menu_test.go
│   ├── page/
│   │   └── page.go
│   ├── remote_server/
│   │   └── remote_server.go
│   ├── service/
│   │   └── service.go
│   ├── system/
│   │   ├── application.go
│   │   └── version.go
│   ├── trace/
│   │   └── trace.go
│   ├── ui/
│   │   └── ui.go
│   └── utils/
│       ├── utils.go
│       └── utils_test.go
├── plugins/
│   ├── admin/
│   │   ├── admin.go
│   │   ├── controller/
│   │   │   ├── Update.go
│   │   │   ├── api_create.go
│   │   │   ├── api_detail.go
│   │   │   ├── api_list.go
│   │   │   ├── api_update.go
│   │   │   ├── auth.go
│   │   │   ├── common.go
│   │   │   ├── common_test.go
│   │   │   ├── delete.go
│   │   │   ├── detail.go
│   │   │   ├── edit.go
│   │   │   ├── handler.go
│   │   │   ├── install.go
│   │   │   ├── menu.go
│   │   │   ├── new.go
│   │   │   ├── operation.go
│   │   │   ├── plugins.go
│   │   │   ├── plugins_tmpl.go
│   │   │   ├── show.go
│   │   │   └── system.go
│   │   ├── data/
│   │   │   └── mysql/
│   │   │       └── admin.sql
│   │   ├── models/
│   │   │   ├── base.go
│   │   │   ├── menu.go
│   │   │   ├── operation_log.go
│   │   │   ├── permission.go
│   │   │   ├── role.go
│   │   │   ├── site.go
│   │   │   └── user.go
│   │   ├── modules/
│   │   │   ├── captcha/
│   │   │   │   └── captcha.go
│   │   │   ├── constant/
│   │   │   │   └── constant.go
│   │   │   ├── form/
│   │   │   │   └── form.go
│   │   │   ├── guard/
│   │   │   │   ├── delete.go
│   │   │   │   ├── edit.go
│   │   │   │   ├── export.go
│   │   │   │   ├── guard.go
│   │   │   │   ├── menu_delete.go
│   │   │   │   ├── menu_edit.go
│   │   │   │   ├── menu_new.go
│   │   │   │   ├── new.go
│   │   │   │   ├── server_login.go
│   │   │   │   └── update.go
│   │   │   ├── helper.go
│   │   │   ├── helper_test.go
│   │   │   ├── paginator/
│   │   │   │   ├── paginator.go
│   │   │   │   └── paginator_test.go
│   │   │   ├── parameter/
│   │   │   │   ├── parameter.go
│   │   │   │   └── parameter_test.go
│   │   │   ├── response/
│   │   │   │   └── response.go
│   │   │   ├── table/
│   │   │   │   ├── config.go
│   │   │   │   ├── default.go
│   │   │   │   ├── default_test.go
│   │   │   │   ├── generators.go
│   │   │   │   ├── table.go
│   │   │   │   ├── tmpl/
│   │   │   │   │   ├── choose_table_ajax.tmpl
│   │   │   │   │   └── generator.tmpl
│   │   │   │   └── tmpl.go
│   │   │   └── tools/
│   │   │       ├── generator.go
│   │   │       └── template.go
│   │   └── router.go
│   ├── example/
│   │   ├── controller.go
│   │   ├── example.go
│   │   ├── go_plugin/
│   │   │   ├── Makefile
│   │   │   └── main.go
│   │   └── router.go
│   ├── plugins.go
│   └── plugins_test.go
├── template/
│   ├── chartjs/
│   │   ├── assets.go
│   │   ├── assets_list.go
│   │   ├── bar.go
│   │   ├── chart.go
│   │   ├── chartjs.tmpl
│   │   ├── line.go
│   │   ├── pie.go
│   │   ├── radar.go
│   │   └── template.go
│   ├── color/
│   │   └── color.go
│   ├── components/
│   │   ├── alert.go
│   │   ├── base.go
│   │   ├── box.go
│   │   ├── button.go
│   │   ├── col.go
│   │   ├── composer.go
│   │   ├── form.go
│   │   ├── image.go
│   │   ├── label.go
│   │   ├── link.go
│   │   ├── paninator.go
│   │   ├── popup.go
│   │   ├── product.go
│   │   ├── row.go
│   │   ├── table.go
│   │   ├── tabs.go
│   │   ├── tree.go
│   │   └── treeview.go
│   ├── icon/
│   │   └── icon.go
│   ├── installation/
│   │   ├── Makefile
│   │   ├── assets/
│   │   │   └── src/
│   │   │       ├── css/
│   │   │       │   ├── main.css
│   │   │       │   └── noscript.css
│   │   │       ├── fonts/
│   │   │       │   └── FontAwesome.otf
│   │   │       └── js/
│   │   │           └── main.js
│   │   ├── assets.go
│   │   ├── assets_list.go
│   │   ├── installation.go
│   │   ├── installation.tmpl
│   │   └── template.go
│   ├── login/
│   │   ├── Makefile
│   │   ├── assets/
│   │   │   └── src/
│   │   │       ├── css/
│   │   │       │   ├── 0_font.css
│   │   │       │   ├── 2_animate.css
│   │   │       │   └── 3_style.css
│   │   │       └── js/
│   │   │           └── combine/
│   │   │               ├── 3_particles.js
│   │   │               └── 4_main.js
│   │   ├── assets.go
│   │   ├── assets_list.go
│   │   ├── login.go
│   │   ├── login.tmpl
│   │   └── template.go
│   ├── template.go
│   ├── template_test.go
│   └── types/
│       ├── action/
│       │   ├── ajax.go
│       │   ├── base.go
│       │   ├── event.go
│       │   ├── fieldfilter.go
│       │   ├── file_upload.go
│       │   ├── jump.go
│       │   ├── jump_selectbox.go
│       │   └── popup.go
│       ├── button.go
│       ├── components.go
│       ├── display/
│       │   ├── base.go
│       │   ├── bool.go
│       │   ├── carousel.go
│       │   ├── copy.go
│       │   ├── date.go
│       │   ├── dot.go
│       │   ├── downloadable.go
│       │   ├── filesize.go
│       │   ├── icon.go
│       │   ├── image.go
│       │   ├── label.go
│       │   ├── link.go
│       │   ├── loading.go
│       │   ├── progressbar.go
│       │   └── qrcode.go
│       ├── display.go
│       ├── display_test.go
│       ├── form/
│       │   ├── form.go
│       │   ├── form_test.go
│       │   └── select/
│       │       └── select.go
│       ├── form.go
│       ├── form_test.go
│       ├── info.go
│       ├── info_test.go
│       ├── operators.go
│       ├── operators_test.go
│       ├── page.go
│       ├── select.go
│       ├── size.go
│       ├── table/
│       │   └── table.go
│       ├── tmpl.go
│       └── tmpls/
│           ├── choose.tmpl
│           ├── choose_ajax.tmpl
│           ├── choose_custom.tmpl
│           ├── choose_disable.tmpl
│           ├── choose_hide.tmpl
│           ├── choose_map.tmpl
│           └── choose_show.tmpl
└── tests/
    ├── common/
    │   ├── api.go
    │   ├── auth.go
    │   ├── checklist.md
    │   ├── common.go
    │   ├── config.json
    │   ├── config_ms.json
    │   ├── config_pg.json
    │   ├── config_sqlite.json
    │   ├── external.go
    │   ├── manager.go
    │   ├── menu.go
    │   ├── normal.go
    │   ├── operation_log.go
    │   ├── permission.go
    │   └── role.go
    ├── data/
    │   ├── admin.sql
    │   ├── admin_ms.bak
    │   ├── admin_ms.sql
    │   └── admin_pg.sql
    ├── frameworks/
    │   ├── beego/
    │   │   ├── beego.go
    │   │   └── beego_test.go
    │   ├── beego2/
    │   │   ├── beego.go
    │   │   └── beego_test.go
    │   ├── buffalo/
    │   │   ├── buffalo.go
    │   │   └── buffalo_test.go
    │   ├── chi/
    │   │   ├── chi.go
    │   │   └── chi_test.go
    │   ├── echo/
    │   │   ├── echo.go
    │   │   └── echo_test.go
    │   ├── fasthttp/
    │   │   ├── fasthttp.go
    │   │   └── fasthttp_test.go
    │   ├── gear/
    │   │   ├── gear.go
    │   │   └── gear_test.go
    │   ├── gf/
    │   │   ├── gf.go
    │   │   └── gf_test.go
    │   ├── gf2/
    │   │   ├── gf.go
    │   │   └── gf_test.go
    │   ├── gin/
    │   │   ├── gin.go
    │   │   └── gin_test.go
    │   ├── gofiber/
    │   │   ├── gofiber.go
    │   │   └── gofiber_test.go
    │   ├── gorilla/
    │   │   ├── gorilla.go
    │   │   └── gorilla_test.go
    │   ├── iris/
    │   │   ├── iris.go
    │   │   └── iris_test.go
    │   └── nethttp/
    │       ├── nethttp.go
    │       └── nethttp_test.go
    ├── tables/
    │   ├── authors.go
    │   ├── content.go
    │   ├── external.go
    │   ├── posts.go
    │   ├── tables.go
    │   └── user.go
    ├── test.go
    ├── test_test.go
    └── web/
        ├── README_CN.md
        ├── config.json
        ├── page.go
        ├── test.go
        └── web_test.go

================================================
FILE CONTENTS
================================================

================================================
FILE: .deepsource.toml
================================================
version = 1

[[analyzers]]
name = "go"
enabled = true

  [analyzers.meta]
  import_paths = ["github.com/GoAdminGroup/go-admin"]


================================================
FILE: .drone.yml
================================================
---
kind: pipeline
type: docker
name: api_mysql

trigger:
  event:
  - pull_request

clone:
  disable: true

services:
- name: db_mysql
  image: mysql:5.7
  environment:
    MYSQL_ROOT_PASSWORD: root
    MYSQL_DATABASE: go-admin-test

steps:  
- name: api
  image: chg80333/goadmin-test:v9
  environment:
    GO111MODULE: on
    GOPROXY: https://goproxy.cn
  commands:
  - cd /go/src/github.com/GoAdminGroup/go-admin
  - git pull
  - git fetch origin pull/$DRONE_PULL_REQUEST/head:pr$DRONE_PULL_REQUEST
  - git checkout pr$DRONE_PULL_REQUEST
  - go version
  - sleep 80
  - GOPROXY=https://goproxy.cn make mysql-test

# ---
# kind: pipeline
# type: docker
# name: api_mssql

# trigger:
#   event:
#   - pull_request

# clone:
#   disable: true

# volumes:
# - name: data
#   temp: {}

# services:
# - name: db_mssql
#   image: mcr.microsoft.com/mssql/server:2017-latest
#   volumes:
#   - name: data
#     path: /home/data
#   environment:
#     ACCEPT_EULA: Y
#     SA_PASSWORD: Aa123456

# steps:
# - name: api
#   image: chg80333/goadmin-test:v9
#   volumes:
#   - name: data
#     path: /go/src/github.com/GoAdminGroup/go-admin/tests/data
#   environment:
#     GO111MODULE: on
#     GOPROXY: https://goproxy.cn
#   commands:
#   - cd /go/src/github.com/GoAdminGroup/go-admin
#   - git pull
#   - git fetch origin pull/$DRONE_PULL_REQUEST/head:pr$DRONE_PULL_REQUEST
#   - git checkout pr$DRONE_PULL_REQUEST
#   - go version
#   - sleep 80
#   - GOPROXY=https://goproxy.cn make ms-test

---
kind: pipeline
type: docker
name: api_postgres

trigger:
  event:
  - pull_request

clone:
  disable: true

services:
- name: db_pgsql
  image: postgres:10
  environment:
    POSTGRES_USER: postgres
    POSTGRES_DB: go-admin-test
    POSTGRES_PASSWORD: root 

steps:  
- name: api
  image: chg80333/goadmin-test:v9
  environment:
    GO111MODULE: on
    GOPROXY: https://goproxy.cn
  commands:
  - cd /go/src/github.com/GoAdminGroup/go-admin
  - git pull
  - git fetch origin pull/$DRONE_PULL_REQUEST/head:pr$DRONE_PULL_REQUEST
  - git checkout pr$DRONE_PULL_REQUEST
  - go version
  - sleep 80
  - GOPROXY=https://goproxy.cn make pg-test

---
kind: pipeline
type: docker
name: api_sqlite

trigger:
  event:
  - pull_request

clone:
  disable: true

steps:  
- name: api
  image: chg80333/goadmin-test:v9
  environment:
    GO111MODULE: on
    GOPROXY: https://goproxy.cn
  commands:
  - cd /go/src/github.com/GoAdminGroup/go-admin
  - git pull
  - git fetch origin pull/$DRONE_PULL_REQUEST/head:pr$DRONE_PULL_REQUEST
  - git checkout pr$DRONE_PULL_REQUEST
  - go version
  - sleep 80
  - GOPROXY=https://goproxy.cn make sqlite-test

---
kind: pipeline
type: docker
name: frontend

trigger:
  event:
  - pull_request

clone:
  disable: true

services:
- name: db_mysql
  image: mysql:5.7
  environment:
    MYSQL_ROOT_PASSWORD: root
    MYSQL_DATABASE: go-admin-test  

steps:
- name: chrome
  image: chg80333/goadmin-test:v9
  environment:
    GO111MODULE: on
    GOPROXY: https://goproxy.cn
  commands:
  - cd /go/src/github.com/GoAdminGroup/go-admin
  - git pull
  - git fetch origin pull/$DRONE_PULL_REQUEST/head:pr$DRONE_PULL_REQUEST
  - git checkout pr$DRONE_PULL_REQUEST
  - google-chrome-stable --headless --disable-gpu --remote-debugging-port=9222 http://localhost &
  - sleep 8
  - GOPROXY=https://goproxy.cn make web-test


================================================
FILE: .github/FUNDING.yml
================================================
# These are supported funding model platforms

github:
patreon:
open_collective: go-admin
ko_fi: 
tidelift:
community_bridge:
liberapay:
issuehunt:
otechie:
custom: ['https://www.paypal.me/cg80333']


================================================
FILE: .github/ISSUE_TEMPLATE/bug_report.md
================================================
---
name: Bug report
about: Create a report to help us improve
title: "[BUG]"
labels: "\U0001F41Bbug"
assignees: ''

---

### Bug Description [describe the bug in detail]

### How to reproduce [describe the steps how to reproduce the bug]

### Expect [describe your expect result]

### Reproduction code [here to show your codes or examples]

### Versions

- GoAdmin version: [e.g. 1.0.0]
- golang version
- Browser
- OS [e.g. mac OS]

### Others [screenshots or others info here]


================================================
FILE: .github/ISSUE_TEMPLATE/bug_report_zh.md
================================================
---
name: Bug 报告
about: 提交bug帮助我们修复
title: "[BUG]"
labels: "\U0001F41Bbug"
assignees: ''

---

### bug 描述 [详细地描述 bug,让大家都能理解]

### 复现步骤 [清晰描述复现步骤,让别人也能看到问题]

### 期望结果 [描述你原本期望看到的结果]

### 复现代码 [提供可复现的代码,仓库,或线上示例]

### 版本信息:

- GoAdmin 版本:
- golang 版本:
- 浏览器环境:
- 开发环境:

### 其他信息 [如截图等其他信息可以贴在这里]


================================================
FILE: .github/ISSUE_TEMPLATE/proposal.md
================================================
---
name: Proposal
about: Any advice for GoAdmin
title: "[Proposal]"
labels: ''
assignees: ''

---

### Description [describe your advice]

### Solution [if any solutions, describe here]

### Others [screenshots and other info]


================================================
FILE: .github/ISSUE_TEMPLATE/proposal_zh.md
================================================
---
name: 功能需求
about: 对 GoAdmin 的需求或建议
title: "[Proposal]"
labels: ''
assignees: ''

---

### 需求描述 [详细地描述需求,让大家都能理解]

### 解决方案 [如果你有解决方案,在这里清晰地阐述]

### 其他信息 [如截图等其他信息可以贴在这里]


================================================
FILE: .github/ISSUE_TEMPLATE/questions.md
================================================
---
name: Questions
about: Any questions when using GoAdmin
title: "[Question]"
labels: ''
assignees: ''

---

### Description [describe your questions]

### Example code [If you have any code info]

### Others [screenshots or other info]


================================================
FILE: .github/ISSUE_TEMPLATE/questions_zh.md
================================================
---
name: 疑问或需要帮助 ❓
about: 关于 GoAdmin 的问题
title: "[Question]"
labels: ''
assignees: ''

---

### 问题描述 [详细地描述问题,让大家都能理解]

### 示例代码 [如果有必要,展示代码,线上示例,或仓库]

### 其他信息 [如截图等其他信息可以贴在这里]


================================================
FILE: .gitignore
================================================
.idea
.vscode
.DS_Store
demo/config.json
demo/config
demo/deploy.yml
demo/hosts
demo/go-admin
demo/Makefile
demo/deploy.retry
vendor/**
!vendor/vendor.json
logs
adm/build
template/login/assets/login
uploads

================================================
FILE: CODE_OF_CONDUCT.md
================================================
# Contributor Covenant Code of Conduct

## Our Pledge

In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation.

## Our Standards

Examples of behavior that contributes to creating a positive environment include:

- Using welcoming and inclusive language
- Being respectful of differing viewpoints and experiences
- Gracefully accepting constructive criticism
- Focusing on what is best for the community
- Showing empathy towards other community members

Examples of unacceptable behavior by participants include:

- The use of sexualized language or imagery and unwelcome sexual attention or advances
- Trolling, insulting/derogatory comments, and personal or political attacks
- Public or private harassment
- Publishing others' private information, such as a physical or electronic address, without explicit permission
- Other conduct which could reasonably be considered inappropriate in a professional setting

## Our Responsibilities

Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior.

Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful.

## Scope

This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers.

## Enforcement

Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at chg80333@gmail.com. The project team will review and investigate all complaints, and will respond in a way that it deems appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately.

Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership.

## Attribution

This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [http://contributor-covenant.org/version/1/4][version]

[homepage]: http://contributor-covenant.org
[version]: http://contributor-covenant.org/version/1/4/

================================================
FILE: CONTRIBUTING.md
================================================
# Contributing

If you want to contribute, but not sure what to do, here's a list of things that I always need help with:

* Translations
    * README.md
    * [docs](https://github.com/GoAdminGroup/docs/issues/1)
* Bug-hunting
* Finding security problems
* Themes and Plugins

See [manual](https://github.com/GoAdminGroup/go-admin/projects/3) for more information.

You can view all open issues on github, which is usually a good starting point if you want to start contributing:

https://github.com/search?q=org%3AGoAdminGroup+is%3Aopen+is%3Aissue+archived%3Afalse&type=Issues

## how to

GoAdmin uses GitHub to manage reviews of pull requests:

- If you have a trivial fix or improvement, go ahead and create a pull request.
- If you plan to do something more involved, discuss your ideas on the relevant GitHub issue.

For now, you need to add your fork as a remote on the original **\$GOPATH**/src/github.com/GoAdminGroup/go-admin clone, so:

```bash

$ go get github.com/GoAdminGroup/go-admin
$ cd $GOPATH/src/github.com/GoAdminGroup/go-admin # GOPATH is $HOME/go by default.

$ git remote add <FORK_NAME> <FORK_URL>
```

And before you commit, remember to execute the command: 

```
make test
```

See the Makefile for more details.

Notice: `go get` return `package github.com/GoAdminGroup/go-admin: no Go files in /go/src/github.com/GoAdminGroup/go-admin` is normal.

### Dependency management

We uses [Go modules](https://golang.org/cmd/go/#hdr-Modules__module_versions__and_more) to manage dependencies on external packages.
This requires a working Go environment with version 1.13 or greater and git installed.

To add or update a new dependency, use the `go get` command:

```bash
# Pick the latest tagged release.
go get example.com/some/module/pkg

# Pick a specific version.
go get example.com/some/module/pkg@vX.Y.Z
```

Tidy up the `go.mod` and `go.sum` files:

```bash
go mod tidy
go mod vendor
git add go.mod go.sum vendor
git commit
```

You have to commit the changes to `go.mod` and `go.sum` before submitting the pull request.

# Support

You can also donate or become a patreon, which helps out covering server costs and potentially make it possible to put out bounties:

* **Support on [Open Collective](https://opencollective.com/go-admin)**
* Donate via [PayPal](https://paypal.me/cg80333)

# Members

If you are a member of the official GoAdmin developer Team:

* [Discussions](http://forum.go-admin.cn)
* [Tasks](https://github.com/GoAdminGroup/go-admin/projects)
* [Chat](https://t.me/joinchat/NlyH6Bch2QARZkArithKvg)

================================================
FILE: CONTRIBUTING_CN.md
================================================
# 贡献

如果你想要对项目作出贡献,却不知道怎么做,下面有一些帮助:

* 翻译
    * README.md
    * [docs](https://github.com/GoAdminGroup/docs/issues/1)
* 寻找BUG
* 寻找安全问题
* 主题和插件

在这里:[功能规划](https://github.com/GoAdminGroup/go-admin/projects/3) 可以获得更多信息。

你也可以看一下所有开放的issues,从这里去入手:

https://github.com/search?q=org%3AGoAdminGroup+is%3Aopen+is%3Aissue+archived%3Afalse&type=Issues

## 如何做贡献

GoAdmin 使用 GitHub 来管理项目代码:

- 如果你发现一些微不足道的fix或者功能增加,直接提pr即可;
- 如果你有一些提议,那么你可以先开一个issue进行讨论;

然后,你需要fork远程的master分支到你本地 **\$GOPATH**/src/github.com/GoAdminGroup/go-admin :

```bash

$ go get github.com/GoAdminGroup/go-admin
$ cd $GOPATH/src/github.com/GoAdminGroup/go-admin # GOPATH is $HOME/go by default.

$ git remote add <FORK_NAME> <FORK_URL>
```

在你提交代码之前,记得执行下面这个命令: 

```
make test
```

看根目录下的```Makefile```获得更多信息。

注意了: `go get` 返回 `package github.com/GoAdminGroup/go-admin: no Go files in /go/src/github.com/GoAdminGroup/go-admin` 是正常的。

### 依赖管理

我们使用 [Go modules](https://golang.org/cmd/go/#hdr-Modules__module_versions__and_more) 来管理依赖。
这需要 golang 版本大于1.11,以及安装了 git

要增加或更新依赖,就使用 `go get` 命令:

```bash
# Pick the latest tagged release.
go get example.com/some/module/pkg

# Pick a specific version.
go get example.com/some/module/pkg@vX.Y.Z
```

整理好 `go.mod` 和 `go.sum`:

```bash
go mod tidy
go mod vendor
git add go.mod go.sum vendor
git commit
```

直接提交 `go.mod` and `go.sum` 的修改。

# 赞助

你可以捐助或参与众筹来帮助我们维护服务器费用,以及提供一些奖金资助项目发展。

* **Support on [Open Collective](https://opencollective.com/go-admin)**
* Donate via [PayPal](https://paypal.me/cg80333)

# 成员

如果你已经是GoAdmin的官方开发组成员:

* [Discussions](http://forum.go-admin.cn)
* [Tasks](https://github.com/GoAdminGroup/go-admin/projects)
* [Chat](https://t.me/joinchat/NlyH6Bch2QARZkArithKvg)

================================================
FILE: DONATION.md
================================================
# Donation List 捐赠名单(排名不分先后)

================================================
FILE: Dockerfile
================================================
# This file describes the standard way to build GoAdmin develop env image, and using container
#
# Usage:
#
# # Assemble the code dev environment, get related database tools in docker-compose.yml, It is slow the first time.
# docker build -t goadmin:1.0 .
#
# # Mount your source code to container for quick developing:
# docker run -v `pwd`:/home/goadmin --name -d goadmin:1.0
# docker exec -it goadmin /bin/bash
# # if your local code has been changed ,you can restart the container to take effect
# docker restart goadmin
#  

FROM golang:latest
MAINTAINER josingcjx
COPY . /home/goadmin
ENV GOPATH=$GOPATH:/home/goadmin/ GOPROXY=https://mirrors.aliyun.com/goproxy,https://goproxy.cn,direct
RUN apt-get update --fix-missing && \
    apt-get install -y zip vim postgresql mysql-common default-mysql-server && \
    tar -C / -xvf /home/goadmin/tools/godependacy.tgz 
    #if install dependacy tools failed, you can copy local's to remote
    #mkdir -p /go/bin  && \
    #mv /home/goadmin/tools/{gotest,goimports,golint,golangci-lint,adm} /go/bin
    #go get golang.org/x/tools/cmd/goimports && \
    #go get github.com/rakyll/gotest && \
    #go get -u golang.org/x/lint/golint && \
    #go install github.com/GoAdminGroup/adm@latest && \
    #go get -u github.com/golangci/golangci-lint/cmd/golangci-lint
WORKDIR /home/goadmin

================================================
FILE: LICENSE
================================================
                                 Apache License
                           Version 2.0, January 2004
                        http://www.apache.org/licenses/

   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION

   1. Definitions.

      "License" shall mean the terms and conditions for use, reproduction,
      and distribution as defined by Sections 1 through 9 of this document.

      "Licensor" shall mean the copyright owner or entity authorized by
      the copyright owner that is granting the License.

      "Legal Entity" shall mean the union of the acting entity and all
      other entities that control, are controlled by, or are under common
      control with that entity. For the purposes of this definition,
      "control" means (i) the power, direct or indirect, to cause the
      direction or management of such entity, whether by contract or
      otherwise, or (ii) ownership of fifty percent (50%) or more of the
      outstanding shares, or (iii) beneficial ownership of such entity.

      "You" (or "Your") shall mean an individual or Legal Entity
      exercising permissions granted by this License.

      "Source" form shall mean the preferred form for making modifications,
      including but not limited to software source code, documentation
      source, and configuration files.

      "Object" form shall mean any form resulting from mechanical
      transformation or translation of a Source form, including but
      not limited to compiled object code, generated documentation,
      and conversions to other media types.

      "Work" shall mean the work of authorship, whether in Source or
      Object form, made available under the License, as indicated by a
      copyright notice that is included in or attached to the work
      (an example is provided in the Appendix below).

      "Derivative Works" shall mean any work, whether in Source or Object
      form, that is based on (or derived from) the Work and for which the
      editorial revisions, annotations, elaborations, or other modifications
      represent, as a whole, an original work of authorship. For the purposes
      of this License, Derivative Works shall not include works that remain
      separable from, or merely link (or bind by name) to the interfaces of,
      the Work and Derivative Works thereof.

      "Contribution" shall mean any work of authorship, including
      the original version of the Work and any modifications or additions
      to that Work or Derivative Works thereof, that is intentionally
      submitted to Licensor for inclusion in the Work by the copyright owner
      or by an individual or Legal Entity authorized to submit on behalf of
      the copyright owner. For the purposes of this definition, "submitted"
      means any form of electronic, verbal, or written communication sent
      to the Licensor or its representatives, including but not limited to
      communication on electronic mailing lists, source code control systems,
      and issue tracking systems that are managed by, or on behalf of, the
      Licensor for the purpose of discussing and improving the Work, but
      excluding communication that is conspicuously marked or otherwise
      designated in writing by the copyright owner as "Not a Contribution."

      "Contributor" shall mean Licensor and any individual or Legal Entity
      on behalf of whom a Contribution has been received by Licensor and
      subsequently incorporated within the Work.

   2. Grant of Copyright License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      copyright license to reproduce, prepare Derivative Works of,
      publicly display, publicly perform, sublicense, and distribute the
      Work and such Derivative Works in Source or Object form.

   3. Grant of Patent License. Subject to the terms and conditions of
      this License, each Contributor hereby grants to You a perpetual,
      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
      (except as stated in this section) patent license to make, have made,
      use, offer to sell, sell, import, and otherwise transfer the Work,
      where such license applies only to those patent claims licensable
      by such Contributor that are necessarily infringed by their
      Contribution(s) alone or by combination of their Contribution(s)
      with the Work to which such Contribution(s) was submitted. If You
      institute patent litigation against any entity (including a
      cross-claim or counterclaim in a lawsuit) alleging that the Work
      or a Contribution incorporated within the Work constitutes direct
      or contributory patent infringement, then any patent licenses
      granted to You under this License for that Work shall terminate
      as of the date such litigation is filed.

   4. Redistribution. You may reproduce and distribute copies of the
      Work or Derivative Works thereof in any medium, with or without
      modifications, and in Source or Object form, provided that You
      meet the following conditions:

      (a) You must give any other recipients of the Work or
          Derivative Works a copy of this License; and

      (b) You must cause any modified files to carry prominent notices
          stating that You changed the files; and

      (c) You must retain, in the Source form of any Derivative Works
          that You distribute, all copyright, patent, trademark, and
          attribution notices from the Source form of the Work,
          excluding those notices that do not pertain to any part of
          the Derivative Works; and

      (d) If the Work includes a "NOTICE" text file as part of its
          distribution, then any Derivative Works that You distribute must
          include a readable copy of the attribution notices contained
          within such NOTICE file, excluding those notices that do not
          pertain to any part of the Derivative Works, in at least one
          of the following places: within a NOTICE text file distributed
          as part of the Derivative Works; within the Source form or
          documentation, if provided along with the Derivative Works; or,
          within a display generated by the Derivative Works, if and
          wherever such third-party notices normally appear. The contents
          of the NOTICE file are for informational purposes only and
          do not modify the License. You may add Your own attribution
          notices within Derivative Works that You distribute, alongside
          or as an addendum to the NOTICE text from the Work, provided
          that such additional attribution notices cannot be construed
          as modifying the License.

      You may add Your own copyright statement to Your modifications and
      may provide additional or different license terms and conditions
      for use, reproduction, or distribution of Your modifications, or
      for any such Derivative Works as a whole, provided Your use,
      reproduction, and distribution of the Work otherwise complies with
      the conditions stated in this License.

   5. Submission of Contributions. Unless You explicitly state otherwise,
      any Contribution intentionally submitted for inclusion in the Work
      by You to the Licensor shall be under the terms and conditions of
      this License, without any additional terms or conditions.
      Notwithstanding the above, nothing herein shall supersede or modify
      the terms of any separate license agreement you may have executed
      with Licensor regarding such Contributions.

   6. Trademarks. This License does not grant permission to use the trade
      names, trademarks, service marks, or product names of the Licensor,
      except as required for reasonable and customary use in describing the
      origin of the Work and reproducing the content of the NOTICE file.

   7. Disclaimer of Warranty. Unless required by applicable law or
      agreed to in writing, Licensor provides the Work (and each
      Contributor provides its Contributions) on an "AS IS" BASIS,
      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
      implied, including, without limitation, any warranties or conditions
      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
      PARTICULAR PURPOSE. You are solely responsible for determining the
      appropriateness of using or redistributing the Work and assume any
      risks associated with Your exercise of permissions under this License.

   8. Limitation of Liability. In no event and under no legal theory,
      whether in tort (including negligence), contract, or otherwise,
      unless required by applicable law (such as deliberate and grossly
      negligent acts) or agreed to in writing, shall any Contributor be
      liable to You for damages, including any direct, indirect, special,
      incidental, or consequential damages of any character arising as a
      result of this License or out of the use or inability to use the
      Work (including but not limited to damages for loss of goodwill,
      work stoppage, computer failure or malfunction, or any and all
      other commercial damages or losses), even if such Contributor
      has been advised of the possibility of such damages.

   9. Accepting Warranty or Additional Liability. While redistributing
      the Work or Derivative Works thereof, You may choose to offer,
      and charge a fee for, acceptance of support, warranty, indemnity,
      or other liability obligations and/or rights consistent with this
      License. However, in accepting such obligations, You may act only
      on Your own behalf and on Your sole responsibility, not on behalf
      of any other Contributor, and only if You agree to indemnify,
      defend, and hold each Contributor harmless for any liability
      incurred by, or claims asserted against, such Contributor by reason
      of your accepting any such warranty or additional liability.

   END OF TERMS AND CONDITIONS

   APPENDIX: How to apply the Apache License to your work.

      To apply the Apache License to your work, attach the following
      boilerplate notice, with the fields enclosed by brackets "[]"
      replaced with your own identifying information. (Don't include
      the brackets!)  The text should be enclosed in the appropriate
      comment syntax for the file format. We also recommend that a
      file or class name and description of purpose be included on the
      same "printed page" as the copyright notice for easier
      identification within third-party archives.

   Copyright [yyyy] [name of copyright owner]

   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
   You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License.


================================================
FILE: Makefile
================================================
GOCMD = go
GOBUILD = $(GOCMD) build

TEST_CONFIG_PATH=./../../common/config.json
TEST_CONFIG_PQ_PATH=./../../common/config_pg.json
TEST_CONFIG_SQLITE_PATH=./../../common/config_sqlite.json
TEST_CONFIG_MS_PATH=./../../common/config_ms.json
TEST_FRAMEWORK_DIR=./tests/frameworks

## database configs
MYSQL_HOST = db_mysql
MYSQL_PORT = 3306
MYSQL_USER = root
MYSQL_PWD = root

POSTGRESSQL_HOST = db_pgsql
POSTGRESSQL_PORT = 5432
POSTGRESSQL_USER = postgres
POSTGRESSQL_PWD = root

TEST_DB = go-admin-test

all: test

## tests

test: cp-mod black-box-test web-test restore-mod

## tests: black box tests

black-box-test: mysql-test pg-test sqlite-test ms-test

mysql-test: $(TEST_FRAMEWORK_DIR)/*
	go get github.com/ugorji/go/codec@none
	for file in $^ ; do \
	make import-mysql ; \
	go test -mod=mod -gcflags=all=-l -v ./$${file}/... -args $(TEST_CONFIG_PATH) ; \
	done

sqlite-test: $(TEST_FRAMEWORK_DIR)/*
	for file in $^ ; do \
	make import-sqlite ; \
	go test -mod=mod -gcflags=all=-l ./$${file}/... -args $(TEST_CONFIG_SQLITE_PATH) ; \
	done

pg-test: $(TEST_FRAMEWORK_DIR)/*
	for file in $^ ; do \
	make import-postgresql ; \
	go test -mod=mod -gcflags=all=-l ./$${file}/... -args $(TEST_CONFIG_PQ_PATH) ; \
	done

ms-test: $(TEST_FRAMEWORK_DIR)/*
	for file in $^ ; do \
	make import-mssql ; \
	go test -mod=mod -gcflags=all=-l ./$${file}/... -args $(TEST_CONFIG_MS_PATH) ; \
	done

## tests: user acceptance tests

web-test: import-mysql
	go test -mod=mod ./tests/web/...
	rm -rf ./tests/web/User*

web-test-debug: import-mysql
	go test -mod=mod ./tests/web/... -args true

## tests: unit tests

unit-test:
	go test -mod=mod ./adm/...
	go test -mod=mod ./context/...
	go test -mod=mod ./modules/...
	go test -mod=mod ./plugins/admin/controller/...
	go test -mod=mod ./plugins/admin/modules/parameter/...
	go test -mod=mod ./plugins/admin/modules/table/...
	go test -mod=mod ./plugins/admin/modules/...

## tests: helpers

import-sqlite:
	rm -rf ./tests/common/admin.db
	cp ./tests/data/admin.db ./tests/common/admin.db

import-mysql:
	mysql -h$(MYSQL_HOST) -P${MYSQL_PORT} -u${MYSQL_USER} -p${MYSQL_PWD} -e "create database if not exists \`${TEST_DB}\`"
	mysql -h$(MYSQL_HOST) -P${MYSQL_PORT} -u${MYSQL_USER} -p${MYSQL_PWD} ${TEST_DB} < ./tests/data/admin.sql

import-postgresql:
	PGPASSWORD=${POSTGRESSQL_PWD} dropdb -h ${POSTGRESSQL_HOST} -p ${POSTGRESSQL_PORT} -U ${POSTGRESSQL_USER} ${TEST_DB}
	PGPASSWORD=${POSTGRESSQL_PWD} createdb -h ${POSTGRESSQL_HOST} -p ${POSTGRESSQL_PORT} -U ${POSTGRESSQL_USER} ${TEST_DB}
	PGPASSWORD=${POSTGRESSQL_PWD} psql -h ${POSTGRESSQL_HOST} -p ${POSTGRESSQL_PORT} -d ${TEST_DB} -U ${POSTGRESSQL_USER} -f ./tests/data/admin_pg.sql

import-mssql:
	/opt/mssql-tools/bin/sqlcmd -S db_mssql -U SA -P Aa123456 -Q "RESTORE DATABASE [goadmin] FROM DISK = N'/home/data/admin_ms.bak' WITH FILE = 1, NOUNLOAD, REPLACE, RECOVERY, STATS = 5"

backup-mssql:
	docker exec mssql /opt/mssql-tools/bin/sqlcmd -S localhost -U SA -P Aa123456 -Q "BACKUP DATABASE [goadmin] TO DISK = N'/home/data/admin_ms.bak' WITH NOFORMAT, NOINIT, NAME = 'goadmin-full', SKIP, NOREWIND, NOUNLOAD, STATS = 10"

cp-mod:
	cp go.mod go.mod.old
	cp go.sum go.sum.old

restore-mod:
	mv go.mod.old go.mod
	mv go.sum.old go.sum

## code style check

lint: fmt golint govet cilint

fmt:
	GO111MODULE=off go fmt ./...
	GO111MODULE=off goimports -l -w .

govet:
	GO111MODULE=off go vet ./...

cilint:
	GO111MODULE=off golangci-lint run

golint:
	GO111MODULE=off golint ./...

build-tmpl:
    ## form tmpl build
	adm compile tpl --src ./template/types/tmpls/ --dist ./template/types/tmpl.go --package types --var tmpls
    ## generator tmpl build
	adm compile tpl --src ./plugins/admin/modules/table/tmpl --dist ./plugins/admin/modules/table/tmpl.go --package table --var tmpls

.PHONY: all fmt golint govet cp-mod restore-mod test black-box-test mysql-test sqlite-test import-sqlite import-mysql import-postgresql pg-test lint cilint cli


================================================
FILE: README.md
================================================
<p align="center">
  <a href="https://github.com/GoAdminGroup/go-admin">
    <img width="48%" alt="go-admin" src="http://quick.go-admin.cn/official/assets/imgs/github_logo.png">
  </a>
</p>

<p align="center">
    the missing golang data admin panel builder tool.
</p>

<p align="center">
    <a href="https://book.go-admin.cn/en">Documentation</a> | 
	<a href="http://doc.go-admin.cn/zh/">中文文档</a> | 
    <a href="./README_CN.md">中文介绍</a> |
    <a href="https://demo.go-admin.com">DEMO</a> |
    <a href="https://demo.go-admin.cn">中文DEMO</a> |
    <a href="https://twitter.com/cg3365688034">Twitter</a> |
    <a href="http://discuss.go-admin.com">Forum</a>
</p>

<p align="center">
  <a href="http://drone.go-admin.com/GoAdminGroup/go-admin"><img alt="Build Status" src="http://drone.go-admin.com/api/badges/GoAdminGroup/go-admin/status.svg?ref=refs/heads/master"></a>
  <a href="https://goreportcard.com/report/github.com/GoAdminGroup/go-admin"><img alt="Go Report Card" src="https://goreportcard.com/badge/github.com/GoAdminGroup/go-admin"></a>
  <a href="https://goreportcard.com/report/github.com/GoAdminGroup/go-admin"><img alt="golang" src="https://img.shields.io/badge/awesome-golang-blue.svg"></a>
  <a href="https://discord.gg/usAaEpCP"><img alt="discord" src="https://img.shields.io/badge/chat%20on-Discord-blue.svg"></a>
  <a href="https://t.me/joinchat/NlyH6Bch2QARZkArithKvg" rel="nofollow"><img alt="telegram" src="https://img.shields.io/badge/chat%20on-telegram-blue" style="max-width:100%;"></a>  
  <a href="https://raw.githubusercontent.com/GoAdminGroup/go-admin/master/LICENSE" rel="nofollow"><img src="https://img.shields.io/badge/license-Apache2.0-blue.svg" alt="license" data-canonical-src="https://img.shields.io/badge/license-Apache2.0-blue.svg" style="max-width:100%;"></a>
</p> 

<p align="center">
    Inspired by <a href="https://github.com/z-song/laravel-admin" target="_blank">laravel-admin</a>
</p>

## Preface

GoAdmin is a toolkit to help you build a data visualization admin panel for your golang app.

Online demo: [https://demo.go-admin.com](https://demo.go-admin.com)

![interface](http://file.go-admin.cn/introduction/interface_en_3.png)

## Features

- 🚀 **Fast**: build a production admin panel app in **ten** minutes.
- 🎨 **Theming**: beautiful ui themes supported(default adminlte, more themes are coming.)
- 🔢 **Plugins**: many plugins to use(more useful and powerful plugins are coming.)
- ✅ **Rbac**: out of box rbac auth system.
- ⚙️ **Frameworks**: support most of the go web frameworks.

## Translation
We need your help: [https://github.com/GoAdminGroup/docs/issues/1](https://github.com/GoAdminGroup/docs/issues/1)

## Who is using

[Comment the issue to tell us](https://github.com/GoAdminGroup/go-admin/issues/71).

## How to

Following three steps to run it.

```shell
$ mkdir new_project && cd new_project
$ go install github.com/GoAdminGroup/adm@latest
$ adm init web
```

## Example

Quick follow up example: 

- [pure golang](https://github.com/GoAdminGroup/example), simple and less dependency
- [golang with frontend template](https://github.com/GoAdminGroup/example_with_frontend), change template by yourself
- [golang with vue](https://github.com/GoAdminGroup/example_with_vue), if you have vue experience

See the [docs](https://book.go-admin.cn) for more details.

## Backers

 Your support will help me do better! [[Become a backer](https://opencollective.com/go-admin#backer)]
 <a href="https://opencollective.com/go-admin#backers" target="_blank"><img src="https://opencollective.com/go-admin/backers.svg?width=890"></a>

## Contribution

[here for contribution guide](CONTRIBUTING.md)

<strong>here to join into the develop team</strong>

[join telegram](https://t.me/joinchat/NlyH6Bch2QARZkArithKvg)


================================================
FILE: README_CN.md
================================================
<p align="center">
  <a href="https://github.com/GoAdminGroup/go-admin">
    <img width="48%" alt="go-admin" src="http://quick.go-admin.cn/official/assets/imgs/github_logo.png">
  </a>
</p>
<p align="center">
    遗失的Golang编写的数据可视化与管理平台构建框架
</p>
<p align="center">
  <a href="http://drone.go-admin.com/GoAdminGroup/go-admin"><img alt="Build Status" src="http://drone.go-admin.com/api/badges/GoAdminGroup/go-admin/status.svg?ref=refs/heads/master"></a>
  <a href="https://goreportcard.com/report/github.com/GoAdminGroup/go-admin"><img alt="Go Report Card" src="https://goreportcard.com/badge/github.com/GoAdminGroup/go-admin"></a>
  <a href="https://goreportcard.com/report/github.com/GoAdminGroup/go-admin"><img alt="golang" src="https://img.shields.io/badge/awesome-golang-blue.svg"></a>
  <a href="https://discord.gg/usAaEpCP"><img alt="discord" src="https://img.shields.io/badge/chat%20on-Discord-blue.svg"></a>
  <a href="https://t.me/joinchat/NlyH6Bch2QARZkArithKvg" rel="nofollow"><img alt="telegram" src="https://img.shields.io/badge/chat%20on-telegram-blue" style="max-width:100%;"></a>  
  <a href="https://raw.githubusercontent.com/GoAdminGroup/go-admin/master/LICENSE" rel="nofollow"><img src="https://img.shields.io/badge/license-Apache2.0-blue.svg" alt="license" data-canonical-src="https://img.shields.io/badge/license-Apache2.0-blue.svg" style="max-width:100%;"></a>
</p>
<p align="center">
    由<a href="https://github.com/z-song/laravel-admin" target="_blank">laravel-admin</a>启发
</p>

## 前言

GoAdmin 可以帮助你的golang应用快速实现数据可视化,搭建一个数据管理平台。

[文档](http://doc.go-admin.cn/zh) | [论坛](http://discuss.go-admin.com) | [Demo](https://demo.go-admin.cn) | [上手例子](https://github.com/GoAdminGroup/example/blob/master/README_CN.md) | [GoAdmin+vue 例子](https://github.com/GoAdminGroup/goadmin-vue-example)


![](http://file.go-admin.cn/introduction/interface_3.png)

## 特征

- 🚀 **高生产效率**: 10分钟内做一个好看的管理后台
- 🎨 **主题**: 默认为adminlte,更多好看的主题正在制作中,欢迎给我们留言
- 🔢 **插件化**: 提供插件使用,真正实现一个插件解决不了问题,那就两个
- ✅ **认证**: 开箱即用的rbac认证系统
- ⚙️ **框架支持**: 支持大部分框架接入,让你更容易去上手和扩展

## 例子

- [纯golang](https://github.com/GoAdminGroup/example), 简单很少依赖
- [golang + 前端模版](https://github.com/GoAdminGroup/example_with_frontend), 你可以自己修改模版
- [golang + vue](https://github.com/GoAdminGroup/example_with_vue), 如果你会vue的话,不妨试试

## 翻译
我们需要您的帮忙: [https://github.com/GoAdminGroup/docs/issues/1](https://github.com/GoAdminGroup/docs/issues/1)

## 谁在使用GoAdmin

[评论这个issue告诉我们](https://github.com/GoAdminGroup/go-admin/issues/71).

## 使用

```shell
$ go install github.com/GoAdminGroup/adm@latest
$ mkdir new_project && cd new_project
$ adm init web -l cn
```

运行后将会启动一个网页安装程序,根据程序内容填写安装运行即可。

## 贡献

[这里有一份贡献指南](CONTRIBUTING_CN.md)

非常欢迎提pr,<strong>这里可以加入开发小组</strong>

<strong>QQ群</strong>:[694446792](https://qm.qq.com/q/bp3hsYyUzS),记得备注加群来意

这里是[开发计划](https://github.com/GoAdminGroup/go-admin/projects)

<strong>[点击这里申请加微信群(记得备注加群)](http://quick.go-admin.cn/resource/wechat_qrcode_02.jpg)</strong>

<strong>注:在社区中如有问题提问,请务必清晰描述,包括但不限于问题详叙/问题代码/复现方法/已经尝试过的方法。</strong>

## 十分感谢

inspired by [laravel-admin](https://github.com/z-song/laravel-admin)

## 打赏

留下您的github/gitee用户名,我们将会展示在[捐赠名单](DONATION.md)中。

<img src="http://quick.go-admin.cn/official/assets/imgs/shoukuan.jpg" width="650" />

================================================
FILE: SECURITY.md
================================================
# Security Policy

## Reporting a Vulnerability

Please report security issues to `chg80333@gmail.com`

================================================
FILE: adapter/adapter.go
================================================
// Copyright 2019 GoAdmin Core Team. All rights reserved.
// Use of this source code is governed by a Apache-2.0 style
// license that can be found in the LICENSE file.

package adapter

import (
	"bytes"
	"fmt"
	"net/http"
	"net/url"

	"github.com/GoAdminGroup/go-admin/context"
	"github.com/GoAdminGroup/go-admin/modules/auth"
	"github.com/GoAdminGroup/go-admin/modules/config"
	"github.com/GoAdminGroup/go-admin/modules/constant"
	"github.com/GoAdminGroup/go-admin/modules/db"
	"github.com/GoAdminGroup/go-admin/modules/errors"
	"github.com/GoAdminGroup/go-admin/modules/logger"
	"github.com/GoAdminGroup/go-admin/modules/menu"
	"github.com/GoAdminGroup/go-admin/plugins"
	"github.com/GoAdminGroup/go-admin/plugins/admin/models"
	"github.com/GoAdminGroup/go-admin/template"
	"github.com/GoAdminGroup/go-admin/template/types"
)

// WebFrameWork is an interface which is used as an adapter of
// framework and goAdmin. It must implement two methods. Use registers
// the routes and the corresponding handlers. Content writes the
// response to the corresponding context of framework.
type WebFrameWork interface {
	// Name return the web framework name.
	Name() string

	// Use method inject the plugins to the web framework engine which is the
	// first parameter.
	Use(app interface{}, plugins []plugins.Plugin) error

	// Content add the panel html response of the given callback function to
	// the web framework context which is the first parameter.
	Content(ctx interface{}, fn types.GetPanelFn, fn2 context.NodeProcessor, navButtons ...types.Button)

	// User get the auth user model from the given web framework context.
	User(ctx interface{}) (models.UserModel, bool)

	// AddHandler inject the route and handlers of GoAdmin to the web framework.
	AddHandler(method, path string, handlers context.Handlers)

	DisableLog()

	Static(prefix, path string)

	Run() error

	// Helper functions
	// ================================

	SetApp(app interface{}) error
	SetConnection(db.Connection)
	GetConnection() db.Connection
	SetContext(ctx interface{}) WebFrameWork
	GetCookie() (string, error)
	Lang() string
	Path() string
	Method() string
	Request() *http.Request
	FormParam() url.Values
	Query() url.Values
	IsPjax() bool
	Redirect()
	SetContentType()
	Write(body []byte)
	CookieKey() string
	HTMLContentType() string
}

// BaseAdapter is a base adapter contains some helper functions.
type BaseAdapter struct {
	db db.Connection
}

// SetConnection set the db connection.
func (base *BaseAdapter) SetConnection(conn db.Connection) {
	base.db = conn
}

// GetConnection get the db connection.
func (base *BaseAdapter) GetConnection() db.Connection {
	return base.db
}

// HTMLContentType return the default content type header.
func (*BaseAdapter) HTMLContentType() string {
	return "text/html; charset=utf-8"
}

// CookieKey return the cookie key.
func (*BaseAdapter) CookieKey() string {
	return auth.DefaultCookieKey
}

// GetUser is a helper function get the auth user model from the context.
func (*BaseAdapter) GetUser(ctx interface{}, wf WebFrameWork) (models.UserModel, bool) {
	cookie, err := wf.SetContext(ctx).GetCookie()

	if err != nil {
		return models.UserModel{}, false
	}

	user, exist := auth.GetCurUser(cookie, wf.GetConnection())
	return user.ReleaseConn(), exist
}

// GetUse is a helper function adds the plugins to the framework.
func (*BaseAdapter) GetUse(app interface{}, plugin []plugins.Plugin, wf WebFrameWork) error {
	if err := wf.SetApp(app); err != nil {
		return err
	}

	for _, plug := range plugin {
		for path, handlers := range plug.GetHandler() {
			if plug.Prefix() == "" {
				wf.AddHandler(path.Method, path.URL, handlers)
			} else {
				wf.AddHandler(path.Method, config.Url("/"+plug.Prefix()+path.URL), handlers)
			}
		}
	}

	return nil
}

func (*BaseAdapter) Run() error         { panic("not implement") }
func (*BaseAdapter) DisableLog()        { panic("not implement") }
func (*BaseAdapter) Static(_, _ string) { panic("not implement") }

// GetContent is a helper function of adapter.Content
func (base *BaseAdapter) GetContent(ctx interface{}, getPanelFn types.GetPanelFn, wf WebFrameWork,
	navButtons types.Buttons, fn context.NodeProcessor) {

	var (
		newBase          = wf.SetContext(ctx)
		cookie, hasError = newBase.GetCookie()
	)

	if hasError != nil || cookie == "" {
		newBase.Redirect()
		return
	}

	user, authSuccess := auth.GetCurUser(cookie, wf.GetConnection())

	if !authSuccess {
		newBase.Redirect()
		return
	}

	var (
		panel types.Panel
		err   error
	)

	gctx := context.NewContext(newBase.Request())

	if !auth.CheckPermissions(user, newBase.Path(), newBase.Method(), newBase.FormParam()) {
		panel = template.WarningPanel(gctx, errors.NoPermission, template.NoPermission403Page)
	} else {
		panel, err = getPanelFn(ctx)
		if err != nil {
			panel = template.WarningPanel(gctx, err.Error())
		}
	}

	fn(panel.Callbacks...)

	tmpl, tmplName := template.Default(gctx).GetTemplate(newBase.IsPjax())

	buf := new(bytes.Buffer)
	hasError = tmpl.ExecuteTemplate(buf, tmplName, types.NewPage(gctx, &types.NewPageParam{
		User:         user,
		Menu:         menu.GetGlobalMenu(user, wf.GetConnection(), newBase.Lang()).SetActiveClass(config.URLRemovePrefix(newBase.Path())),
		Panel:        panel.GetContent(config.IsProductionEnvironment()),
		Assets:       template.GetComponentAssetImportHTML(gctx),
		Buttons:      navButtons.CheckPermission(user),
		TmplHeadHTML: template.Default(gctx).GetHeadHTML(),
		TmplFootJS:   template.Default(gctx).GetFootJS(),
		Iframe:       newBase.Query().Get(constant.IframeKey) == "true",
	}))

	if hasError != nil {
		logger.Error(fmt.Sprintf("error: %s adapter content, ", newBase.Name()), hasError)
	}

	newBase.SetContentType()
	newBase.Write(buf.Bytes())
}


================================================
FILE: adapter/beego/beego.go
================================================
// Copyright 2019 GoAdmin Core Team. All rights reserved.
// Use of this source code is governed by a Apache-2.0 style
// license that can be found in the LICENSE file.

package beego

import (
	"bytes"
	"errors"
	"net/http"
	"net/url"
	"strings"

	"github.com/GoAdminGroup/go-admin/adapter"
	gctx "github.com/GoAdminGroup/go-admin/context"
	"github.com/GoAdminGroup/go-admin/engine"
	"github.com/GoAdminGroup/go-admin/modules/config"
	"github.com/GoAdminGroup/go-admin/plugins"
	"github.com/GoAdminGroup/go-admin/plugins/admin/models"
	"github.com/GoAdminGroup/go-admin/plugins/admin/modules/constant"
	"github.com/GoAdminGroup/go-admin/template/types"
	"github.com/astaxie/beego"
	"github.com/astaxie/beego/context"
)

// Beego structure value is a Beego GoAdmin adapter.
type Beego struct {
	adapter.BaseAdapter
	ctx *context.Context
	app *beego.App
}

func init() {
	engine.Register(new(Beego))
}

// User implements the method Adapter.User.
func (bee *Beego) User(ctx interface{}) (models.UserModel, bool) {
	return bee.GetUser(ctx, bee)
}

// Use implements the method Adapter.Use.
func (bee *Beego) Use(app interface{}, plugs []plugins.Plugin) error {
	return bee.GetUse(app, plugs, bee)
}

// Content implements the method Adapter.Content.
func (bee *Beego) Content(ctx interface{}, getPanelFn types.GetPanelFn, fn gctx.NodeProcessor, navButtons ...types.Button) {
	bee.GetContent(ctx, getPanelFn, bee, navButtons, fn)
}

type HandlerFunc func(ctx *context.Context) (types.Panel, error)

func Content(handler HandlerFunc) beego.FilterFunc {
	return func(ctx *context.Context) {
		engine.Content(ctx, func(ctx interface{}) (types.Panel, error) {
			return handler(ctx.(*context.Context))
		})
	}
}

// SetApp implements the method Adapter.SetApp.
func (bee *Beego) SetApp(app interface{}) error {
	var (
		eng *beego.App
		ok  bool
	)
	if eng, ok = app.(*beego.App); !ok {
		return errors.New("beego adapter SetApp: wrong parameter")
	}
	bee.app = eng
	return nil
}

// AddHandler implements the method Adapter.AddHandler.
func (bee *Beego) AddHandler(method, path string, handlers gctx.Handlers) {
	bee.app.Handlers.AddMethod(method, path, func(c *context.Context) {
		for key, value := range c.Input.Params() {
			if c.Request.URL.RawQuery == "" {
				c.Request.URL.RawQuery += strings.ReplaceAll(key, ":", "") + "=" + value
			} else {
				c.Request.URL.RawQuery += "&" + strings.ReplaceAll(key, ":", "") + "=" + value
			}
		}
		ctx := gctx.NewContext(c.Request)
		ctx.SetHandlers(handlers).Next()
		for key, head := range ctx.Response.Header {
			c.ResponseWriter.Header().Add(key, head[0])
		}
		c.ResponseWriter.WriteHeader(ctx.Response.StatusCode)
		if ctx.Response.Body != nil {
			buf := new(bytes.Buffer)
			_, _ = buf.ReadFrom(ctx.Response.Body)
			c.WriteString(buf.String())
		}
	})
}

// Name implements the method Adapter.Name.
func (*Beego) Name() string {
	return "beego"
}

// SetContext implements the method Adapter.SetContext.
func (*Beego) SetContext(contextInterface interface{}) adapter.WebFrameWork {
	var (
		ctx *context.Context
		ok  bool
	)
	if ctx, ok = contextInterface.(*context.Context); !ok {
		panic("beego adapter SetContext: wrong parameter")
	}
	return &Beego{ctx: ctx}
}

// Redirect implements the method Adapter.Redirect.
func (bee *Beego) Redirect() {
	bee.ctx.Redirect(http.StatusFound, config.Url(config.GetLoginUrl()))
}

// SetContentType implements the method Adapter.SetContentType.
func (bee *Beego) SetContentType() {
	bee.ctx.ResponseWriter.Header().Set("Content-Type", bee.HTMLContentType())
}

// Write implements the method Adapter.Write.
func (bee *Beego) Write(body []byte) {
	_, _ = bee.ctx.ResponseWriter.Write(body)
}

// GetCookie implements the method Adapter.GetCookie.
func (bee *Beego) GetCookie() (string, error) {
	return bee.ctx.GetCookie(bee.CookieKey()), nil
}

// Lang implements the method Adapter.Lang.
func (bee *Beego) Lang() string {
	return bee.ctx.Request.URL.Query().Get("__ga_lang")
}

// Path implements the method Adapter.Path.
func (bee *Beego) Path() string {
	return bee.ctx.Request.URL.Path
}

// Method implements the method Adapter.Method.
func (bee *Beego) Method() string {
	return bee.ctx.Request.Method
}

// FormParam implements the method Adapter.FormParam.
func (bee *Beego) FormParam() url.Values {
	_ = bee.ctx.Request.ParseMultipartForm(32 << 20)
	return bee.ctx.Request.PostForm
}

// IsPjax implements the method Adapter.IsPjax.
func (bee *Beego) IsPjax() bool {
	return bee.ctx.Request.Header.Get(constant.PjaxHeader) == "true"
}

// Query implements the method Adapter.Query.
func (bee *Beego) Query() url.Values {
	return bee.ctx.Request.URL.Query()
}

// Request implements the method Adapter.Request.
func (bee *Beego) Request() *http.Request {
	return bee.ctx.Request
}

================================================
FILE: adapter/beego2/beego2.go
================================================
package beego2

import (
	"bytes"
	"errors"
	"net/http"
	"net/url"
	"strings"

	"github.com/GoAdminGroup/go-admin/adapter"
	gctx "github.com/GoAdminGroup/go-admin/context"
	"github.com/GoAdminGroup/go-admin/engine"
	"github.com/GoAdminGroup/go-admin/modules/config"
	"github.com/GoAdminGroup/go-admin/modules/constant"
	"github.com/GoAdminGroup/go-admin/plugins"
	"github.com/GoAdminGroup/go-admin/plugins/admin/models"
	"github.com/GoAdminGroup/go-admin/template/types"
	"github.com/beego/beego/v2/server/web"
	"github.com/beego/beego/v2/server/web/context"
)

type Beego2 struct {
	adapter.BaseAdapter
	ctx *context.Context
	app *web.HttpServer
}

func init() {
	engine.Register(new(Beego2))
}

func (*Beego2) Name() string {
	return "beego2"
}

func (bee2 *Beego2) Use(app interface{}, plugins []plugins.Plugin) error {
	return bee2.GetUse(app, plugins, bee2)
}

func (bee2 *Beego2) Content(ctx interface{}, getPanelFn types.GetPanelFn, fn gctx.NodeProcessor, navButtons ...types.Button) {
	bee2.GetContent(ctx, getPanelFn, bee2, navButtons, fn)
}

func (bee2 *Beego2) User(ctx interface{}) (models.UserModel, bool) {
	return bee2.GetUser(ctx, bee2)
}

func (bee2 *Beego2) AddHandler(method, path string, handlers gctx.Handlers) {
	bee2.app.Handlers.AddMethod(method, path, func(c *context.Context) {
		for key, value := range c.Input.Params() {
			if c.Request.URL.RawQuery == "" {
				c.Request.URL.RawQuery += strings.ReplaceAll(key, ":", "") + "=" + value
			} else {
				c.Request.URL.RawQuery += "&" + strings.ReplaceAll(key, ":", "") + "=" + value
			}
		}
		ctx := gctx.NewContext(c.Request)
		ctx.SetHandlers(handlers).Next()
		for key, head := range ctx.Response.Header {
			c.ResponseWriter.Header().Add(key, head[0])
		}
		c.ResponseWriter.WriteHeader(ctx.Response.StatusCode)
		if ctx.Response.Body != nil {
			buf := new(bytes.Buffer)
			_, _ = buf.ReadFrom(ctx.Response.Body)
			c.WriteString(buf.String())
		}
	})
}

func (bee2 *Beego2) SetApp(app interface{}) error {
	var (
		eng *web.HttpServer
		ok  bool
	)
	if eng, ok = app.(*web.HttpServer); !ok {
		return errors.New("beego2 adapter SetApp: wrong parameter")
	}
	bee2.app = eng
	return nil
}

func (*Beego2) SetContext(contextInterface interface{}) adapter.WebFrameWork {
	var (
		ctx *context.Context
		ok  bool
	)
	if ctx, ok = contextInterface.(*context.Context); !ok {
		panic("beego2 adapter SetContext: wrong parameter")
	}
	return &Beego2{ctx: ctx}
}

func (bee2 *Beego2) GetCookie() (string, error) {
	return bee2.ctx.GetCookie(bee2.CookieKey()), nil
}

func (bee2 *Beego2) Lang() string {
	return bee2.ctx.Request.URL.Query().Get("__ga_lang")
}

func (bee2 *Beego2) Path() string {
	return bee2.ctx.Request.URL.Path
}

func (bee2 *Beego2) Method() string {
	return bee2.ctx.Request.Method
}

func (bee2 *Beego2) FormParam() url.Values {
	_ = bee2.ctx.Request.ParseMultipartForm(32 << 20)
	return bee2.ctx.Request.PostForm
}

func (bee2 *Beego2) Query() url.Values {
	return bee2.ctx.Request.URL.Query()
}

func (bee2 *Beego2) IsPjax() bool {
	return bee2.ctx.Request.Header.Get(constant.PjaxHeader) == "true"
}

func (bee2 *Beego2) Redirect() {
	bee2.ctx.Redirect(http.StatusFound, config.Url(config.GetLoginUrl()))
}

func (bee2 *Beego2) SetContentType() {
	bee2.ctx.ResponseWriter.Header().Set("Content-Type", bee2.HTMLContentType())
}

func (bee2 *Beego2) Write(body []byte) {
	_, _ = bee2.ctx.ResponseWriter.Write(body)
}

// Request implements the method Adapter.Request.
func (bee2 *Beego2) Request() *http.Request {
	return bee2.ctx.Request
}

================================================
FILE: adapter/buffalo/buffalo.go
================================================
// Copyright 2019 GoAdmin Core Team. All rights reserved.
// Use of this source code is governed by a Apache-2.0 style
// license that can be found in the LICENSE file.

package buffalo

import (
	"bytes"
	"errors"
	"net/http"
	neturl "net/url"
	"regexp"
	"strings"

	"github.com/GoAdminGroup/go-admin/adapter"
	"github.com/GoAdminGroup/go-admin/context"
	"github.com/GoAdminGroup/go-admin/engine"
	"github.com/GoAdminGroup/go-admin/modules/config"
	"github.com/GoAdminGroup/go-admin/plugins"
	"github.com/GoAdminGroup/go-admin/plugins/admin/models"
	"github.com/GoAdminGroup/go-admin/plugins/admin/modules/constant"
	"github.com/GoAdminGroup/go-admin/template/types"
	"github.com/gobuffalo/buffalo"
)

// Buffalo structure value is a Buffalo GoAdmin adapter.
type Buffalo struct {
	adapter.BaseAdapter
	ctx buffalo.Context
	app *buffalo.App
}

func init() {
	engine.Register(new(Buffalo))
}

// User implements the method Adapter.User.
func (bu *Buffalo) User(ctx interface{}) (models.UserModel, bool) {
	return bu.GetUser(ctx, bu)
}

// Use implements the method Adapter.Use.
func (bu *Buffalo) Use(app interface{}, plugs []plugins.Plugin) error {
	return bu.GetUse(app, plugs, bu)
}

// Content implements the method Adapter.Content.
func (bu *Buffalo) Content(ctx interface{}, getPanelFn types.GetPanelFn, fn context.NodeProcessor, btns ...types.Button) {
	bu.GetContent(ctx, getPanelFn, bu, btns, fn)
}

type HandlerFunc func(ctx buffalo.Context) (types.Panel, error)

func Content(handler HandlerFunc) buffalo.Handler {
	return func(ctx buffalo.Context) error {
		engine.Content(ctx, func(ctx interface{}) (types.Panel, error) {
			return handler(ctx.(buffalo.Context))
		})
		return nil
	}
}

// SetApp implements the method Adapter.SetApp.
func (bu *Buffalo) SetApp(app interface{}) error {
	var (
		eng *buffalo.App
		ok  bool
	)
	if eng, ok = app.(*buffalo.App); !ok {
		return errors.New("buffalo adapter SetApp: wrong parameter")
	}
	bu.app = eng
	return nil
}

// AddHandler implements the method Adapter.AddHandler.
func (bu *Buffalo) AddHandler(method, path string, handlers context.Handlers) {
	url := path
	reg1 := regexp.MustCompile(":(.*?)/")
	reg2 := regexp.MustCompile(":(.*?)$")
	url = reg1.ReplaceAllString(url, "{$1}/")
	url = reg2.ReplaceAllString(url, "{$1}")

	getHandleFunc(bu.app, strings.ToUpper(method))(url, func(c buffalo.Context) error {

		if c.Request().URL.Path[len(c.Request().URL.Path)-1] == '/' {
			c.Request().URL.Path = c.Request().URL.Path[:len(c.Request().URL.Path)-1]
		}

		ctx := context.NewContext(c.Request())

		params := c.Params().(neturl.Values)

		for key, param := range params {
			if c.Request().URL.RawQuery == "" {
				c.Request().URL.RawQuery += strings.ReplaceAll(key, ":", "") + "=" + param[0]
			} else {
				c.Request().URL.RawQuery += "&" + strings.ReplaceAll(key, ":", "") + "=" + param[0]
			}
		}

		ctx.SetHandlers(handlers).Next()
		for key, head := range ctx.Response.Header {
			c.Response().Header().Set(key, head[0])
		}
		if ctx.Response.Body != nil {
			buf := new(bytes.Buffer)
			_, _ = buf.ReadFrom(ctx.Response.Body)
			c.Response().WriteHeader(ctx.Response.StatusCode)
			_, _ = c.Response().Write(buf.Bytes())
		} else {
			c.Response().WriteHeader(ctx.Response.StatusCode)
		}
		return nil
	})
}

// HandleFun is type of route methods of buffalo.
type HandleFun func(p string, h buffalo.Handler) *buffalo.RouteInfo

func getHandleFunc(eng *buffalo.App, method string) HandleFun {
	switch method {
	case "GET":
		return eng.GET
	case "POST":
		return eng.POST
	case "PUT":
		return eng.PUT
	case "DELETE":
		return eng.DELETE
	case "HEAD":
		return eng.HEAD
	case "OPTIONS":
		return eng.OPTIONS
	case "PATCH":
		return eng.PATCH
	default:
		panic("wrong method")
	}
}

// Name implements the method Adapter.Name.
func (*Buffalo) Name() string {
	return "buffalo"
}

// SetContext implements the method Adapter.SetContext.
func (*Buffalo) SetContext(contextInterface interface{}) adapter.WebFrameWork {
	var (
		ctx buffalo.Context
		ok  bool
	)
	if ctx, ok = contextInterface.(buffalo.Context); !ok {
		panic("buffalo adapter SetContext: wrong parameter")
	}
	return &Buffalo{ctx: ctx}
}

// Redirect implements the method Adapter.Redirect.
func (bu *Buffalo) Redirect() {
	_ = bu.ctx.Redirect(http.StatusFound, config.Url(config.GetLoginUrl()))
}

// SetContentType implements the method Adapter.SetContentType.
func (bu *Buffalo) SetContentType() {
	bu.ctx.Response().Header().Set("Content-Type", bu.HTMLContentType())
}

// Write implements the method Adapter.Write.
func (bu *Buffalo) Write(body []byte) {
	bu.ctx.Response().WriteHeader(http.StatusOK)
	_, _ = bu.ctx.Response().Write(body)
}

// GetCookie implements the method Adapter.GetCookie.
func (bu *Buffalo) GetCookie() (string, error) {
	return bu.ctx.Cookies().Get(bu.CookieKey())
}

// Lang implements the method Adapter.Lang.
func (bu *Buffalo) Lang() string {
	return bu.ctx.Request().URL.Query().Get("__ga_lang")
}

// Path implements the method Adapter.Path.
func (bu *Buffalo) Path() string {
	return bu.ctx.Request().URL.Path
}

// Method implements the method Adapter.Method.
func (bu *Buffalo) Method() string {
	return bu.ctx.Request().Method
}

// FormParam implements the method Adapter.FormParam.
func (bu *Buffalo) FormParam() neturl.Values {
	_ = bu.ctx.Request().ParseMultipartForm(32 << 20)
	return bu.ctx.Request().PostForm
}

// IsPjax implements the method Adapter.IsPjax.
func (bu *Buffalo) IsPjax() bool {
	return bu.ctx.Request().Header.Get(constant.PjaxHeader) == "true"
}

// Query implements the method Adapter.Query.
func (bu *Buffalo) Query() neturl.Values {
	return bu.ctx.Request().URL.Query()
}

// Request implements the method Adapter.Request.
func (bu *Buffalo) Request() *http.Request {
	return bu.ctx.Request()
}

================================================
FILE: adapter/chi/chi.go
================================================
// Copyright 2019 GoAdmin Core Team. All rights reserved.
// Use of this source code is governed by a Apache-2.0 style
// license that can be found in the LICENSE file.

package chi

import (
	"bytes"
	"errors"
	"net/http"
	"net/url"
	"regexp"
	"strings"

	"github.com/GoAdminGroup/go-admin/adapter"
	"github.com/GoAdminGroup/go-admin/context"
	"github.com/GoAdminGroup/go-admin/engine"
	cfg "github.com/GoAdminGroup/go-admin/modules/config"
	"github.com/GoAdminGroup/go-admin/plugins"
	"github.com/GoAdminGroup/go-admin/plugins/admin/models"
	"github.com/GoAdminGroup/go-admin/plugins/admin/modules/constant"
	"github.com/GoAdminGroup/go-admin/template/types"
	"github.com/go-chi/chi"
)

// Chi structure value is a Chi GoAdmin adapter.
type Chi struct {
	adapter.BaseAdapter
	ctx Context
	app *chi.Mux
}

func init() {
	engine.Register(new(Chi))
}

// User implements the method Adapter.User.
func (ch *Chi) User(ctx interface{}) (models.UserModel, bool) {
	return ch.GetUser(ctx, ch)
}

// Use implements the method Adapter.Use.
func (ch *Chi) Use(app interface{}, plugs []plugins.Plugin) error {
	return ch.GetUse(app, plugs, ch)
}

// Content implements the method Adapter.Content.
func (ch *Chi) Content(ctx interface{}, getPanelFn types.GetPanelFn, fn context.NodeProcessor, btns ...types.Button) {
	ch.GetContent(ctx, getPanelFn, ch, btns, fn)
}

type HandlerFunc func(ctx Context) (types.Panel, error)

func Content(handler HandlerFunc) http.HandlerFunc {
	return func(writer http.ResponseWriter, request *http.Request) {
		ctx := Context{
			Request:  request,
			Response: writer,
		}
		engine.Content(ctx, func(ctx interface{}) (types.Panel, error) {
			return handler(ctx.(Context))
		})
	}
}

// SetApp implements the method Adapter.SetApp.
func (ch *Chi) SetApp(app interface{}) error {
	var (
		eng *chi.Mux
		ok  bool
	)
	if eng, ok = app.(*chi.Mux); !ok {
		return errors.New("chi adapter SetApp: wrong parameter")
	}
	ch.app = eng
	return nil
}

// AddHandler implements the method Adapter.AddHandler.
func (ch *Chi) AddHandler(method, path string, handlers context.Handlers) {
	url := path
	reg1 := regexp.MustCompile(":(.*?)/")
	reg2 := regexp.MustCompile(":(.*?)$")
	url = reg1.ReplaceAllString(url, "{$1}/")
	url = reg2.ReplaceAllString(url, "{$1}")

	if len(url) > 1 && url[0] == '/' && url[1] == '/' {
		url = url[1:]
	}

	getHandleFunc(ch.app, strings.ToUpper(method))(url, func(w http.ResponseWriter, r *http.Request) {

		if r.URL.Path[len(r.URL.Path)-1] == '/' {
			r.URL.Path = r.URL.Path[:len(r.URL.Path)-1]
		}

		ctx := context.NewContext(r)

		params := chi.RouteContext(r.Context()).URLParams

		for i := 0; i < len(params.Values); i++ {
			if r.URL.RawQuery == "" {
				r.URL.RawQuery += strings.ReplaceAll(params.Keys[i], ":", "") + "=" + params.Values[i]
			} else {
				r.URL.RawQuery += "&" + strings.ReplaceAll(params.Keys[i], ":", "") + "=" + params.Values[i]
			}
		}

		ctx.SetHandlers(handlers).Next()
		for key, head := range ctx.Response.Header {
			w.Header().Set(key, head[0])
		}
		if ctx.Response.Body != nil {
			buf := new(bytes.Buffer)
			_, _ = buf.ReadFrom(ctx.Response.Body)
			w.WriteHeader(ctx.Response.StatusCode)
			_, _ = w.Write(buf.Bytes())
		} else {
			w.WriteHeader(ctx.Response.StatusCode)
		}
	})
}

// HandleFun is type of route methods of chi.
type HandleFun func(pattern string, handlerFn http.HandlerFunc)

func getHandleFunc(eng *chi.Mux, method string) HandleFun {
	switch method {
	case "GET":
		return eng.Get
	case "POST":
		return eng.Post
	case "PUT":
		return eng.Put
	case "DELETE":
		return eng.Delete
	case "HEAD":
		return eng.Head
	case "OPTIONS":
		return eng.Options
	case "PATCH":
		return eng.Patch
	default:
		panic("wrong method")
	}
}

// Context wraps the Request and Response object of Chi.
type Context struct {
	Request  *http.Request
	Response http.ResponseWriter
}

// SetContext implements the method Adapter.SetContext.
func (*Chi) SetContext(contextInterface interface{}) adapter.WebFrameWork {
	var (
		ctx Context
		ok  bool
	)
	if ctx, ok = contextInterface.(Context); !ok {
		panic("chi adapter SetContext: wrong parameter")
	}
	return &Chi{ctx: ctx}
}

// Name implements the method Adapter.Name.
func (*Chi) Name() string {
	return "chi"
}

// Redirect implements the method Adapter.Redirect.
func (ch *Chi) Redirect() {
	http.Redirect(ch.ctx.Response, ch.ctx.Request, cfg.Url(cfg.GetLoginUrl()), http.StatusFound)
}

// SetContentType implements the method Adapter.SetContentType.
func (ch *Chi) SetContentType() {
	ch.ctx.Response.Header().Set("Content-Type", ch.HTMLContentType())
}

// Write implements the method Adapter.Write.
func (ch *Chi) Write(body []byte) {
	ch.ctx.Response.WriteHeader(http.StatusOK)
	_, _ = ch.ctx.Response.Write(body)
}

// GetCookie implements the method Adapter.GetCookie.
func (ch *Chi) GetCookie() (string, error) {
	cookie, err := ch.ctx.Request.Cookie(ch.CookieKey())
	if err != nil {
		return "", err
	}
	return cookie.Value, err
}

// Lang implements the method Adapter.Lang.
func (ch *Chi) Lang() string {
	return ch.ctx.Request.URL.Query().Get("__ga_lang")
}

// Path implements the method Adapter.Path.
func (ch *Chi) Path() string {
	return ch.ctx.Request.URL.Path
}

// Method implements the method Adapter.Method.
func (ch *Chi) Method() string {
	return ch.ctx.Request.Method
}

// FormParam implements the method Adapter.FormParam.
func (ch *Chi) FormParam() url.Values {
	_ = ch.ctx.Request.ParseMultipartForm(32 << 20)
	return ch.ctx.Request.PostForm
}

// IsPjax implements the method Adapter.IsPjax.
func (ch *Chi) IsPjax() bool {
	return ch.ctx.Request.Header.Get(constant.PjaxHeader) == "true"
}

// Query implements the method Adapter.Query.
func (ch *Chi) Query() url.Values {
	return ch.ctx.Request.URL.Query()
}

// Request implements the method Adapter.Request.
func (ch *Chi) Request() *http.Request {
	return ch.ctx.Request
}

================================================
FILE: adapter/echo/echo.go
================================================
// Copyright 2019 GoAdmin Core Team. All rights reserved.
// Use of this source code is governed by a Apache-2.0 style
// license that can be found in the LICENSE file.

package echo

import (
	"bytes"
	"errors"
	"net/http"
	"net/url"
	"strings"

	"github.com/GoAdminGroup/go-admin/adapter"
	"github.com/GoAdminGroup/go-admin/context"
	"github.com/GoAdminGroup/go-admin/engine"
	"github.com/GoAdminGroup/go-admin/modules/config"
	"github.com/GoAdminGroup/go-admin/plugins"
	"github.com/GoAdminGroup/go-admin/plugins/admin/models"
	"github.com/GoAdminGroup/go-admin/plugins/admin/modules/constant"
	"github.com/GoAdminGroup/go-admin/template/types"
	"github.com/labstack/echo/v4"
)

// Echo structure value is an Echo GoAdmin adapter.
type Echo struct {
	adapter.BaseAdapter
	ctx echo.Context
	app *echo.Echo
}

func init() {
	engine.Register(new(Echo))
}

// User implements the method Adapter.User.
func (e *Echo) User(ctx interface{}) (models.UserModel, bool) {
	return e.GetUser(ctx, e)
}

// Use implements the method Adapter.Use.
func (e *Echo) Use(app interface{}, plugs []plugins.Plugin) error {
	return e.GetUse(app, plugs, e)
}

// Content implements the method Adapter.Content.
func (e *Echo) Content(ctx interface{}, getPanelFn types.GetPanelFn, fn context.NodeProcessor, btns ...types.Button) {
	e.GetContent(ctx, getPanelFn, e, btns, fn)
}

type HandlerFunc func(ctx echo.Context) (types.Panel, error)

func Content(handler HandlerFunc) echo.HandlerFunc {
	return func(ctx echo.Context) error {
		engine.Content(ctx, func(ctx interface{}) (types.Panel, error) {
			return handler(ctx.(echo.Context))
		})
		return nil
	}
}

// SetApp implements the method Adapter.SetApp.
func (e *Echo) SetApp(app interface{}) error {
	var (
		eng *echo.Echo
		ok  bool
	)
	if eng, ok = app.(*echo.Echo); !ok {
		return errors.New("echo adapter SetApp: wrong parameter")
	}
	e.app = eng
	return nil
}

// AddHandler implements the method Adapter.AddHandler.
func (e *Echo) AddHandler(method, path string, handlers context.Handlers) {
	e.app.Add(strings.ToUpper(method), path, func(c echo.Context) error {
		ctx := context.NewContext(c.Request())

		for _, key := range c.ParamNames() {
			if c.Request().URL.RawQuery == "" {
				c.Request().URL.RawQuery += strings.ReplaceAll(key, ":", "") + "=" + c.Param(key)
			} else {
				c.Request().URL.RawQuery += "&" + strings.ReplaceAll(key, ":", "") + "=" + c.Param(key)
			}
		}

		ctx.SetHandlers(handlers).Next()
		for key, head := range ctx.Response.Header {
			c.Response().Header().Set(key, head[0])
		}
		if ctx.Response.Body != nil {
			buf := new(bytes.Buffer)
			_, _ = buf.ReadFrom(ctx.Response.Body)
			_ = c.String(ctx.Response.StatusCode, buf.String())
		} else {
			c.Response().WriteHeader(ctx.Response.StatusCode)
		}
		return nil
	})
}

// Name implements the method Adapter.Name.
func (*Echo) Name() string {
	return "echo"
}

// SetContext implements the method Adapter.SetContext.
func (*Echo) SetContext(contextInterface interface{}) adapter.WebFrameWork {
	var (
		ctx echo.Context
		ok  bool
	)
	if ctx, ok = contextInterface.(echo.Context); !ok {
		panic("echo adapter SetContext: wrong parameter")
	}
	return &Echo{ctx: ctx}
}

// Redirect implements the method Adapter.Redirect.
func (e *Echo) Redirect() {
	_ = e.ctx.Redirect(http.StatusFound, config.Url(config.GetLoginUrl()))
}

// SetContentType implements the method Adapter.SetContentType.
func (e *Echo) SetContentType() {
	e.ctx.Response().Header().Set("Content-Type", e.HTMLContentType())
}

// Write implements the method Adapter.Write.
func (e *Echo) Write(body []byte) {
	e.ctx.Response().WriteHeader(http.StatusOK)
	_, _ = e.ctx.Response().Write(body)
}

// GetCookie implements the method Adapter.GetCookie.
func (e *Echo) GetCookie() (string, error) {
	cookie, err := e.ctx.Cookie(e.CookieKey())
	if err != nil {
		return "", err
	}
	return cookie.Value, err
}

// Lang implements the method Adapter.Lang.
func (e *Echo) Lang() string {
	return e.ctx.Request().URL.Query().Get("__ga_lang")
}

// Path implements the method Adapter.Path.
func (e *Echo) Path() string {
	return e.ctx.Request().URL.Path
}

// Method implements the method Adapter.Method.
func (e *Echo) Method() string {
	return e.ctx.Request().Method
}

// FormParam implements the method Adapter.FormParam.
func (e *Echo) FormParam() url.Values {
	_ = e.ctx.Request().ParseMultipartForm(32 << 20)
	return e.ctx.Request().PostForm
}

// IsPjax implements the method Adapter.IsPjax.
func (e *Echo) IsPjax() bool {
	return e.ctx.Request().Header.Get(constant.PjaxHeader) == "true"
}

// Query implements the method Adapter.Query.
func (e *Echo) Query() url.Values {
	return e.ctx.Request().URL.Query()
}

// Request implements the method Adapter.Request.
func (e *Echo) Request() *http.Request {
	return e.ctx.Request()
}

================================================
FILE: adapter/fasthttp/fasthttp.go
================================================
// Copyright 2019 GoAdmin Core Team. All rights reserved.
// Use of this source code is governed by a Apache-2.0 style
// license that can be found in the LICENSE file.

package fasthttp

import (
	"bytes"
	"errors"
	"io"
	"net/http"
	"net/url"
	"strings"

	"github.com/GoAdminGroup/go-admin/adapter"
	"github.com/GoAdminGroup/go-admin/context"
	"github.com/GoAdminGroup/go-admin/engine"
	"github.com/GoAdminGroup/go-admin/modules/config"
	"github.com/GoAdminGroup/go-admin/plugins"
	"github.com/GoAdminGroup/go-admin/plugins/admin/models"
	"github.com/GoAdminGroup/go-admin/plugins/admin/modules/constant"
	"github.com/GoAdminGroup/go-admin/template/types"
	"github.com/buaazp/fasthttprouter"
	"github.com/valyala/fasthttp"
)

// Fasthttp structure value is a Fasthttp GoAdmin adapter.
type Fasthttp struct {
	adapter.BaseAdapter
	ctx *fasthttp.RequestCtx
	app *fasthttprouter.Router
}

func init() {
	engine.Register(new(Fasthttp))
}

// User implements the method Adapter.User.
func (fast *Fasthttp) User(ctx interface{}) (models.UserModel, bool) {
	return fast.GetUser(ctx, fast)
}

// Use implements the method Adapter.Use.
func (fast *Fasthttp) Use(app interface{}, plugs []plugins.Plugin) error {
	return fast.GetUse(app, plugs, fast)
}

// Content implements the method Adapter.Content.
func (fast *Fasthttp) Content(ctx interface{}, getPanelFn types.GetPanelFn, fn context.NodeProcessor, btns ...types.Button) {
	fast.GetContent(ctx, getPanelFn, fast, btns, fn)
}

type HandlerFunc func(ctx *fasthttp.RequestCtx) (types.Panel, error)

func Content(handler HandlerFunc) fasthttp.RequestHandler {
	return func(ctx *fasthttp.RequestCtx) {
		engine.Content(ctx, func(ctx interface{}) (types.Panel, error) {
			return handler(ctx.(*fasthttp.RequestCtx))
		})
	}
}

// SetApp implements the method Adapter.SetApp.
func (fast *Fasthttp) SetApp(app interface{}) error {
	var (
		eng *fasthttprouter.Router
		ok  bool
	)
	if eng, ok = app.(*fasthttprouter.Router); !ok {
		return errors.New("fasthttp adapter SetApp: wrong parameter")
	}

	fast.app = eng
	return nil
}

// AddHandler implements the method Adapter.AddHandler.
func (fast *Fasthttp) AddHandler(method, path string, handlers context.Handlers) {
	fast.app.Handle(strings.ToUpper(method), path, func(c *fasthttp.RequestCtx) {
		httpreq := convertCtx(c)
		ctx := context.NewContext(httpreq)

		var params = make(map[string]string)
		c.VisitUserValues(func(i []byte, i2 interface{}) {
			if value, ok := i2.(string); ok {
				params[string(i)] = value
			}
		})

		for key, value := range params {
			if httpreq.URL.RawQuery == "" {
				httpreq.URL.RawQuery += strings.ReplaceAll(key, ":", "") + "=" + value
			} else {
				httpreq.URL.RawQuery += "&" + strings.ReplaceAll(key, ":", "") + "=" + value
			}
		}

		ctx.SetHandlers(handlers).Next()
		for key, head := range ctx.Response.Header {
			c.Response.Header.Set(key, head[0])
		}
		if ctx.Response.Body != nil {
			buf := new(bytes.Buffer)
			_, _ = buf.ReadFrom(ctx.Response.Body)
			_, _ = c.WriteString(buf.String())
		}
		c.Response.SetStatusCode(ctx.Response.StatusCode)
	})
}

func convertCtx(ctx *fasthttp.RequestCtx) *http.Request {
	var r http.Request

	body := ctx.PostBody()
	r.Method = string(ctx.Method())
	r.Proto = "HTTP/1.1"
	r.ProtoMajor = 1
	r.ProtoMinor = 1
	r.RequestURI = string(ctx.RequestURI())
	r.ContentLength = int64(len(body))
	r.Host = string(ctx.Host())
	r.RemoteAddr = ctx.RemoteAddr().String()

	hdr := make(http.Header)
	ctx.Request.Header.VisitAll(func(k, v []byte) {
		sk := string(k)
		sv := string(v)
		switch sk {
		case "Transfer-Encoding":
			r.TransferEncoding = append(r.TransferEncoding, sv)
		default:
			hdr.Set(sk, sv)
		}
	})
	r.Header = hdr
	r.Body = &netHTTPBody{body}
	rURL, err := url.ParseRequestURI(r.RequestURI)
	if err != nil {
		ctx.Logger().Printf("cannot parse requestURI %q: %s", r.RequestURI, err)
		ctx.Error("Internal Server Error", fasthttp.StatusInternalServerError)
		return &r
	}
	r.URL = rURL
	return &r
}

type netHTTPBody struct {
	b []byte
}

func (r *netHTTPBody) Read(p []byte) (int, error) {
	if len(r.b) == 0 {
		return 0, io.EOF
	}
	n := copy(p, r.b)
	r.b = r.b[n:]
	return n, nil
}

func (r *netHTTPBody) Close() error {
	r.b = r.b[:0]
	return nil
}

// Name implements the method Adapter.Name.
func (*Fasthttp) Name() string {
	return "fasthttp"
}

// SetContext implements the method Adapter.SetContext.
func (*Fasthttp) SetContext(contextInterface interface{}) adapter.WebFrameWork {
	var (
		ctx *fasthttp.RequestCtx
		ok  bool
	)
	if ctx, ok = contextInterface.(*fasthttp.RequestCtx); !ok {
		panic("fasthttp adapter SetContext: wrong parameter")
	}
	return &Fasthttp{ctx: ctx}
}

// Redirect implements the method Adapter.Redirect.
func (fast *Fasthttp) Redirect() {
	fast.ctx.Redirect(config.Url(config.GetLoginUrl()), http.StatusFound)
}

// SetContentType implements the method Adapter.SetContentType.
func (fast *Fasthttp) SetContentType() {
	fast.ctx.Response.Header.Set("Content-Type", fast.HTMLContentType())
}

// Write implements the method Adapter.Write.
func (fast *Fasthttp) Write(body []byte) {
	_, _ = fast.ctx.Write(body)
}

// GetCookie implements the method Adapter.GetCookie.
func (fast *Fasthttp) GetCookie() (string, error) {
	return string(fast.ctx.Request.Header.Cookie(fast.CookieKey())), nil
}

// Lang implements the method Adapter.Lang.
func (fast *Fasthttp) Lang() string {
	return string(fast.ctx.Request.URI().QueryArgs().Peek("__ga_lang"))
}

// Path implements the method Adapter.Path.
func (fast *Fasthttp) Path() string {
	return string(fast.ctx.Path())
}

// Method implements the method Adapter.Method.
func (fast *Fasthttp) Method() string {
	return string(fast.ctx.Method())
}

// FormParam implements the method Adapter.FormParam.
func (fast *Fasthttp) FormParam() url.Values {
	f, _ := fast.ctx.MultipartForm()
	if f != nil {
		return f.Value
	}
	return url.Values{}
}

// IsPjax implements the method Adapter.IsPjax.
func (fast *Fasthttp) IsPjax() bool {
	return string(fast.ctx.Request.Header.Peek(constant.PjaxHeader)) == "true"
}

// Query implements the method Adapter.Query.
func (fast *Fasthttp) Query() url.Values {
	queryStr := fast.ctx.URI().QueryString()
	queryObj, err := url.Parse(string(queryStr))

	if err != nil {
		return url.Values{}
	}

	return queryObj.Query()
}

// Request implements the method Adapter.Request.
func (fast *Fasthttp) Request() *http.Request {
	return convertCtx(fast.ctx)
}

================================================
FILE: adapter/gear/gear.go
================================================
/***
# File Name: ../../adapter/gear/gear.go
# Author: eavesmy
# Email: eavesmy@gmail.com
# Created Time: 2021年06月03日 星期四 19时05分06秒
***/

package gear

import (
	"bytes"
	"errors"
	"net/http"
	"net/url"
	"regexp"
	"strings"

	"github.com/GoAdminGroup/go-admin/adapter"
	"github.com/GoAdminGroup/go-admin/context"
	"github.com/GoAdminGroup/go-admin/engine"
	"github.com/GoAdminGroup/go-admin/modules/config"
	"github.com/GoAdminGroup/go-admin/modules/utils"
	"github.com/GoAdminGroup/go-admin/plugins"
	"github.com/GoAdminGroup/go-admin/plugins/admin/models"
	"github.com/GoAdminGroup/go-admin/plugins/admin/modules/constant"
	"github.com/GoAdminGroup/go-admin/template/types"
	"github.com/teambition/gear"
)

// Gear structure value is a Gin GoAdmin adapter.
type Gear struct {
	adapter.BaseAdapter
	ctx    *gear.Context
	app    *gear.App
	router *gear.Router
}

func init() {
	engine.Register(new(Gear))
}

// User implements the method Adapter.User.
func (gears *Gear) User(ctx interface{}) (models.UserModel, bool) {
	return gears.GetUser(ctx, gears)
}

// Use implements the method Adapter.Use.
func (gears *Gear) Use(app interface{}, plugs []plugins.Plugin) error {
	return gears.GetUse(app, plugs, gears)
}

// Content implements the method Adapter.Content.
func (gears *Gear) Content(ctx interface{}, getPanelFn types.GetPanelFn, fn context.NodeProcessor, btns ...types.Button) {
	gears.GetContent(ctx, getPanelFn, gears, btns, fn)
}

type HandlerFunc func(ctx *gear.Context) (types.Panel, error)

func Content(handler HandlerFunc) gear.Middleware {
	return func(ctx *gear.Context) error {
		engine.Content(ctx, func(ctx interface{}) (types.Panel, error) {
			return handler(ctx.(*gear.Context))
		})
		return nil
	}
}

// SetApp implements the method Adapter.SetApp.
func (gears *Gear) SetApp(app interface{}) error {
	gears.app = app.(*gear.App)
	gears.router = gear.NewRouter()
	var (
		eng *gear.App
		ok  bool
	)
	if eng, ok = app.(*gear.App); !ok {
		return errors.New("beego adapter SetApp: wrong parameter")
	}
	gears.app = eng
	return nil
}

// AddHandler implements the method Adapter.AddHandler.
func (gears *Gear) AddHandler(method, path string, handlers context.Handlers) {

	if gears.router == nil {
		gears.router = gear.NewRouter()
	}

	gears.router.Handle(strings.ToUpper(method), path, func(c *gear.Context) error {

		ctx := context.NewContext(c.Req)

		newPath := path

		reg1 := regexp.MustCompile(":(.*?)/")
		reg2 := regexp.MustCompile(":(.*?)$")

		params := reg1.FindAllString(newPath, -1)
		newPath = reg1.ReplaceAllString(newPath, "")
		params = append(params, reg2.FindAllString(newPath, -1)...)

		for _, param := range params {
			p := utils.ReplaceAll(param, ":", "", "/", "")

			if c.Req.URL.RawQuery == "" {
				c.Req.URL.RawQuery += p + "=" + c.Param(p)
			} else {
				c.Req.URL.RawQuery += "&" + p + "=" + c.Param(p)
			}
		}

		ctx.SetHandlers(handlers).Next()

		for key, head := range ctx.Response.Header {
			c.Res.Header().Add(key, head[0])
		}

		if ctx.Response.Body != nil {
			buf := new(bytes.Buffer)
			_, _ = buf.ReadFrom(ctx.Response.Body)

			return c.End(ctx.Response.StatusCode, buf.Bytes())
		}

		c.Status(ctx.Response.StatusCode)
		return nil
	})

	gears.app.UseHandler(gears.router)
}

// Name implements the method Adapter.Name.
func (*Gear) Name() string {
	return "gear"
}

// SetContext implements the method Adapter.SetContext.
func (*Gear) SetContext(contextInterface interface{}) adapter.WebFrameWork {
	var (
		ctx *gear.Context
		ok  bool
	)

	if ctx, ok = contextInterface.(*gear.Context); !ok {
		panic("gear adapter SetContext: wrong parameter")
	}

	return &Gear{ctx: ctx}
}

// Redirect implements the method Adapter.Redirect.
func (gears *Gear) Redirect() {
	gears.ctx.Redirect(config.Url(config.GetLoginUrl()))
}

// SetContentType implements the method Adapter.SetContentType.
func (gears *Gear) SetContentType() {
	gears.ctx.Res.Header().Set("Content-Type", gears.HTMLContentType())
}

// Write implements the method Adapter.Write.
func (gears *Gear) Write(body []byte) {
	gears.ctx.End(http.StatusOK, body)
}

// GetCookie implements the method Adapter.GetCookie.
func (gears *Gear) GetCookie() (string, error) {
	return gears.ctx.Cookies.Get(gears.CookieKey())
}

// Lang implements the method Adapter.Lang.
func (gears *Gear) Lang() string {
	return gears.ctx.Req.URL.Query().Get("__ga_lang")
}

// Path implements the method Adapter.Path.
func (gears *Gear) Path() string {
	return gears.ctx.Req.URL.Path
}

// Method implements the method Adapter.Method.
func (gears *Gear) Method() string {
	return gears.ctx.Req.Method
}

// FormParam implements the method Adapter.FormParam.
func (gears *Gear) FormParam() url.Values {
	_ = gears.ctx.Req.ParseMultipartForm(32 << 20)
	return gears.ctx.Req.PostForm
}

// IsPjax implements the method Adapter.IsPjax.
func (gears *Gear) IsPjax() bool {
	return gears.ctx.Req.Header.Get(constant.PjaxHeader) == "true"
}

// Query implements the method Adapter.Query.
func (gears *Gear) Query() url.Values {
	return gears.ctx.Req.URL.Query()
}

// Request implements the method Adapter.Request.
func (gears *Gear) Request() *http.Request {
	return gears.ctx.Req
}

================================================
FILE: adapter/gf/gf.go
================================================
// Copyright 2019 GoAdmin Core Team. All rights reserved.
// Use of this source code is governed by a Apache-2.0 style
// license that can be found in the LICENSE file.

package gf

import (
	"bytes"
	"errors"
	"net/http"
	"net/url"
	"regexp"
	"strings"

	"github.com/GoAdminGroup/go-admin/adapter"
	"github.com/GoAdminGroup/go-admin/context"
	"github.com/GoAdminGroup/go-admin/engine"
	"github.com/GoAdminGroup/go-admin/modules/config"
	"github.com/GoAdminGroup/go-admin/modules/utils"
	"github.com/GoAdminGroup/go-admin/plugins"
	"github.com/GoAdminGroup/go-admin/plugins/admin/models"
	"github.com/GoAdminGroup/go-admin/plugins/admin/modules/constant"
	"github.com/GoAdminGroup/go-admin/template/types"
	"github.com/gogf/gf/net/ghttp"
)

// Gf structure value is a Gf GoAdmin adapter.
type Gf struct {
	adapter.BaseAdapter
	ctx *ghttp.Request
	app *ghttp.Server
}

func init() {
	engine.Register(new(Gf))
}

// User implements the method Adapter.User.
func (gf *Gf) User(ctx interface{}) (models.UserModel, bool) {
	return gf.GetUser(ctx, gf)
}

// Use implements the method Adapter.Use.
func (gf *Gf) Use(app interface{}, plugs []plugins.Plugin) error {
	return gf.GetUse(app, plugs, gf)
}

// Content implements the method Adapter.Content.
func (gf *Gf) Content(ctx interface{}, getPanelFn types.GetPanelFn, fn context.NodeProcessor, btns ...types.Button) {
	gf.GetContent(ctx, getPanelFn, gf, btns, fn)
}

type HandlerFunc func(ctx *ghttp.Request) (types.Panel, error)

func Content(handler HandlerFunc) ghttp.HandlerFunc {
	return func(ctx *ghttp.Request) {
		engine.Content(ctx, func(ctx interface{}) (types.Panel, error) {
			return handler(ctx.(*ghttp.Request))
		})
	}
}

// SetApp implements the method Adapter.SetApp.
func (gf *Gf) SetApp(app interface{}) error {
	var (
		eng *ghttp.Server
		ok  bool
	)
	if eng, ok = app.(*ghttp.Server); !ok {
		return errors.New("gf adapter SetApp: wrong parameter")
	}
	gf.app = eng
	return nil
}

// AddHandler implements the method Adapter.AddHandler.
func (gf *Gf) AddHandler(method, path string, handlers context.Handlers) {
	gf.app.BindHandler(strings.ToUpper(method)+":"+path, func(c *ghttp.Request) {
		ctx := context.NewContext(c.Request)

		newPath := path

		reg1 := regexp.MustCompile(":(.*?)/")
		reg2 := regexp.MustCompile(":(.*?)$")

		params := reg1.FindAllString(newPath, -1)
		newPath = reg1.ReplaceAllString(newPath, "")
		params = append(params, reg2.FindAllString(newPath, -1)...)

		for _, param := range params {
			p := utils.ReplaceAll(param, ":", "", "/", "")

			if c.Request.URL.RawQuery == "" {
				c.Request.URL.RawQuery += p + "=" + c.GetRequestString(p)
			} else {
				c.Request.URL.RawQuery += "&" + p + "=" + c.GetRequestString(p)
			}
		}

		ctx.SetHandlers(handlers).Next()
		for key, head := range ctx.Response.Header {
			c.Response.Header().Add(key, head[0])
		}

		if ctx.Response.Body != nil {
			buf := new(bytes.Buffer)
			_, _ = buf.ReadFrom(ctx.Response.Body)
			c.Response.WriteStatus(ctx.Response.StatusCode, buf.Bytes())
		} else {
			c.Response.WriteStatus(ctx.Response.StatusCode)
		}
	})
}

// Name implements the method Adapter.Name.
func (*Gf) Name() string {
	return "gf"
}

// SetContext implements the method Adapter.SetContext.
func (*Gf) SetContext(contextInterface interface{}) adapter.WebFrameWork {
	var (
		ctx *ghttp.Request
		ok  bool
	)

	if ctx, ok = contextInterface.(*ghttp.Request); !ok {
		panic("gf adapter SetContext: wrong parameter")
	}
	return &Gf{ctx: ctx}
}

// Redirect implements the method Adapter.Redirect.
func (gf *Gf) Redirect() {
	gf.ctx.Response.RedirectTo(config.Url(config.GetLoginUrl()))
}

// SetContentType implements the method Adapter.SetContentType.
func (gf *Gf) SetContentType() {
	gf.ctx.Response.Header().Add("Content-Type", gf.HTMLContentType())
}

// Write implements the method Adapter.Write.
func (gf *Gf) Write(body []byte) {
	gf.ctx.Response.WriteStatus(http.StatusOK, body)
}

// GetCookie implements the method Adapter.GetCookie.
func (gf *Gf) GetCookie() (string, error) {
	return gf.ctx.Cookie.Get(gf.CookieKey()), nil
}

// Lang implements the method Adapter.Lang.
func (gf *Gf) Lang() string {
	return gf.ctx.Request.URL.Query().Get("__ga_lang")
}

// Path implements the method Adapter.Path.
func (gf *Gf) Path() string {
	return gf.ctx.URL.Path
}

// Method implements the method Adapter.Method.
func (gf *Gf) Method() string {
	return gf.ctx.Method
}

// FormParam implements the method Adapter.FormParam.
func (gf *Gf) FormParam() url.Values {
	return gf.ctx.Form
}

// IsPjax implements the method Adapter.IsPjax.
func (gf *Gf) IsPjax() bool {
	return gf.ctx.Header.Get(constant.PjaxHeader) == "true"
}

// Query implements the method Adapter.Query.
func (gf *Gf) Query() url.Values {
	return gf.ctx.Request.URL.Query()
}

// Request implements the method Adapter.Request.
func (gf *Gf) Request() *http.Request {
	return gf.ctx.Request
}

================================================
FILE: adapter/gf2/gf2.go
================================================
package gf2

import (
	"bytes"
	"errors"
	"net/http"
	"net/url"
	"regexp"
	"strings"

	"github.com/GoAdminGroup/go-admin/adapter"
	"github.com/GoAdminGroup/go-admin/context"
	"github.com/GoAdminGroup/go-admin/engine"
	"github.com/GoAdminGroup/go-admin/modules/config"
	"github.com/GoAdminGroup/go-admin/modules/constant"
	"github.com/GoAdminGroup/go-admin/modules/utils"
	"github.com/GoAdminGroup/go-admin/plugins"
	"github.com/GoAdminGroup/go-admin/plugins/admin/models"
	"github.com/GoAdminGroup/go-admin/template/types"
	"github.com/gogf/gf/v2/net/ghttp"
)

type GF2 struct {
	adapter.BaseAdapter
	ctx *ghttp.Request
	app *ghttp.Server
}

func init() {
	engine.Register(new(GF2))
}

func (*GF2) Name() string {
	return "gf2"
}

func (gf2 *GF2) Use(app interface{}, plugins []plugins.Plugin) error {
	return gf2.GetUse(app, plugins, gf2)
}

func (gf2 *GF2) Content(ctx interface{}, getPanelFn types.GetPanelFn, fn context.NodeProcessor, btns ...types.Button) {
	gf2.GetContent(ctx, getPanelFn, gf2, btns, fn)
}

func (gf2 *GF2) User(ctx interface{}) (models.UserModel, bool) {
	return gf2.GetUser(ctx, gf2)
}

func (gf2 *GF2) AddHandler(method, path string, handlers context.Handlers) {
	gf2.app.BindHandler(strings.ToUpper(method)+":"+path, func(c *ghttp.Request) {
		ctx := context.NewContext(c.Request)

		newPath := path

		reg1 := regexp.MustCompile(":(.*?)/")
		reg2 := regexp.MustCompile(":(.*?)$")

		params := reg1.FindAllString(newPath, -1)
		newPath = reg1.ReplaceAllString(newPath, "")
		params = append(params, reg2.FindAllString(newPath, -1)...)

		for _, param := range params {
			p := utils.ReplaceAll(param, ":", "", "/", "")

			if c.Request.URL.RawQuery == "" {
				c.Request.URL.RawQuery += p + "=" + c.GetRequest(p).String()
			} else {
				c.Request.URL.RawQuery += "&" + p + "=" + c.GetRequest(p).String()
			}
		}

		ctx.SetHandlers(handlers).Next()
		for key, head := range ctx.Response.Header {
			c.Response.Header().Add(key, head[0])
		}

		if ctx.Response.Body != nil {
			buf := new(bytes.Buffer)
			_, _ = buf.ReadFrom(ctx.Response.Body)
			c.Response.WriteStatus(ctx.Response.StatusCode, buf.Bytes())
		} else {
			c.Response.WriteStatus(ctx.Response.StatusCode)
		}
	})
}

func (gf2 *GF2) SetApp(app interface{}) error {
	var (
		eng *ghttp.Server
		ok  bool
	)
	if eng, ok = app.(*ghttp.Server); !ok {
		return errors.New("gf2 adapter SetApp: wrong parameter")
	}
	gf2.app = eng
	return nil
}

func (*GF2) SetContext(contextInterface interface{}) adapter.WebFrameWork {
	var (
		ctx *ghttp.Request
		ok  bool
	)
	if ctx, ok = contextInterface.(*ghttp.Request); !ok {
		panic("gf2 adapter SetContext: wrong parameter")
	}
	return &GF2{ctx: ctx}
}

func (gf2 *GF2) GetCookie() (string, error) {
	return gf2.ctx.Cookie.Get(gf2.CookieKey()).String(), nil
}

func (gf2 *GF2) Lang() string {
	return gf2.ctx.Request.URL.Query().Get("__ga_lang")
}

func (gf2 *GF2) Path() string {
	return gf2.ctx.URL.Path
}

func (gf2 *GF2) Method() string {
	return gf2.ctx.Method
}

func (gf2 *GF2) FormParam() url.Values {
	return gf2.ctx.Form
}

func (gf2 *GF2) Query() url.Values {
	return gf2.ctx.Request.URL.Query()
}

func (gf2 *GF2) IsPjax() bool {
	return gf2.ctx.Header.Get(constant.PjaxHeader) == "true"
}

func (gf2 *GF2) Redirect() {
	gf2.ctx.Response.RedirectTo(config.Url(config.GetLoginUrl()))
}

func (gf2 *GF2) SetContentType() {
	gf2.ctx.Response.Header().Add("Content-Type", gf2.HTMLContentType())
}

func (gf2 *GF2) Write(body []byte) {
	gf2.ctx.Response.WriteStatus(http.StatusOK, body)
}

// Request implements the method Adapter.Request.
func (gf2 *GF2) Request() *http.Request {
	return gf2.ctx.Request
}

================================================
FILE: adapter/gin/gin.go
================================================
// Copyright 2019 GoAdmin Core Team. All rights reserved.
// Use of this source code is governed by a Apache-2.0 style
// license that can be found in the LICENSE file.

package gin

import (
	"bytes"
	"errors"
	"net/http"
	"net/url"
	"strings"

	"github.com/GoAdminGroup/go-admin/adapter"
	"github.com/GoAdminGroup/go-admin/context"
	"github.com/GoAdminGroup/go-admin/engine"
	"github.com/GoAdminGroup/go-admin/modules/config"
	"github.com/GoAdminGroup/go-admin/plugins"
	"github.com/GoAdminGroup/go-admin/plugins/admin/models"
	"github.com/GoAdminGroup/go-admin/plugins/admin/modules/constant"
	"github.com/GoAdminGroup/go-admin/template/types"
	"github.com/gin-gonic/gin"
)

// Gin structure value is a Gin GoAdmin adapter.
type Gin struct {
	adapter.BaseAdapter
	ctx *gin.Context
	app *gin.Engine
}

func init() {
	engine.Register(new(Gin))
}

// User implements the method Adapter.User.
func (gins *Gin) User(ctx interface{}) (models.UserModel, bool) {
	return gins.GetUser(ctx, gins)
}

// Use implements the method Adapter.Use.
func (gins *Gin) Use(app interface{}, plugs []plugins.Plugin) error {
	return gins.GetUse(app, plugs, gins)
}

// Content implements the method Adapter.Content.
func (gins *Gin) Content(ctx interface{}, getPanelFn types.GetPanelFn, fn context.NodeProcessor, btns ...types.Button) {
	gins.GetContent(ctx, getPanelFn, gins, btns, fn)
}

type HandlerFunc func(ctx *gin.Context) (types.Panel, error)

func Content(handler HandlerFunc) gin.HandlerFunc {
	return func(ctx *gin.Context) {
		engine.Content(ctx, func(ctx interface{}) (types.Panel, error) {
			return handler(ctx.(*gin.Context))
		})
	}
}

// SetApp implements the method Adapter.SetApp.
func (gins *Gin) SetApp(app interface{}) error {
	var (
		eng *gin.Engine
		ok  bool
	)
	if eng, ok = app.(*gin.Engine); !ok {
		return errors.New("gin adapter SetApp: wrong parameter")
	}
	gins.app = eng
	return nil
}

// AddHandler implements the method Adapter.AddHandler.
func (gins *Gin) AddHandler(method, path string, handlers context.Handlers) {
	gins.app.Handle(strings.ToUpper(method), path, func(c *gin.Context) {
		ctx := context.NewContext(c.Request)

		for _, param := range c.Params {
			if c.Request.URL.RawQuery == "" {
				c.Request.URL.RawQuery += strings.ReplaceAll(param.Key, ":", "") + "=" + param.Value
			} else {
				c.Request.URL.RawQuery += "&" + strings.ReplaceAll(param.Key, ":", "") + "=" + param.Value
			}
		}

		ctx.SetHandlers(handlers).Next()
		for key, head := range ctx.Response.Header {
			c.Header(key, head[0])
		}
		if ctx.Response.Body != nil {
			buf := new(bytes.Buffer)
			_, _ = buf.ReadFrom(ctx.Response.Body)
			c.String(ctx.Response.StatusCode, buf.String())
		} else {
			c.Status(ctx.Response.StatusCode)
		}
	})
}

// Name implements the method Adapter.Name.
func (*Gin) Name() string {
	return "gin"
}

// SetContext implements the method Adapter.SetContext.
func (*Gin) SetContext(contextInterface interface{}) adapter.WebFrameWork {
	var (
		ctx *gin.Context
		ok  bool
	)

	if ctx, ok = contextInterface.(*gin.Context); !ok {
		panic("gin adapter SetContext: wrong parameter")
	}

	return &Gin{ctx: ctx}
}

// Redirect implements the method Adapter.Redirect.
func (gins *Gin) Redirect() {
	gins.ctx.Redirect(http.StatusFound, config.Url(config.GetLoginUrl()))
	gins.ctx.Abort()
}

// SetContentType implements the method Adapter.SetContentType.
func (*Gin) SetContentType() {}

// Write implements the method Adapter.Write.
func (gins *Gin) Write(body []byte) {
	gins.ctx.Data(http.StatusOK, gins.HTMLContentType(), body)
}

// GetCookie implements the method Adapter.GetCookie.
func (gins *Gin) GetCookie() (string, error) {
	return gins.ctx.Cookie(gins.CookieKey())
}

// Lang implements the method Adapter.Lang.
func (gins *Gin) Lang() string {
	return gins.ctx.Request.URL.Query().Get("__ga_lang")
}

// Path implements the method Adapter.Path.
func (gins *Gin) Path() string {
	return gins.ctx.Request.URL.Path
}

// Method implements the method Adapter.Method.
func (gins *Gin) Method() string {
	return gins.ctx.Request.Method
}

// FormParam implements the method Adapter.FormParam.
func (gins *Gin) FormParam() url.Values {
	_ = gins.ctx.Request.ParseMultipartForm(32 << 20)
	return gins.ctx.Request.PostForm
}

// IsPjax implements the method Adapter.IsPjax.
func (gins *Gin) IsPjax() bool {
	return gins.ctx.Request.Header.Get(constant.PjaxHeader) == "true"
}

// Query implements the method Adapter.Query.
func (gins *Gin) Query() url.Values {
	return gins.ctx.Request.URL.Query()
}

// Request implements the method Adapter.Request.
func (gins *Gin) Request() *http.Request {
	return gins.ctx.Request
}

================================================
FILE: adapter/gofiber/gofiber.go
================================================
// Copyright 2019 GoAdmin Core Team. All rights reserved.
// Use of this source code is governed by a Apache-2.0 style
// license that can be found in the LICENSE file.

package gofiber

import (
	"errors"
	"io"
	"net/http"
	"net/url"
	"strings"

	"github.com/GoAdminGroup/go-admin/adapter"
	"github.com/GoAdminGroup/go-admin/context"
	"github.com/GoAdminGroup/go-admin/engine"
	"github.com/GoAdminGroup/go-admin/modules/config"
	"github.com/GoAdminGroup/go-admin/plugins"
	"github.com/GoAdminGroup/go-admin/plugins/admin/models"
	"github.com/GoAdminGroup/go-admin/plugins/admin/modules/constant"
	"github.com/GoAdminGroup/go-admin/template/types"
	"github.com/gofiber/fiber/v2"
	"github.com/valyala/fasthttp"
)

// Fasthttp structure value is a Fasthttp GoAdmin adapter.
type Gofiber struct {
	adapter.BaseAdapter
	ctx *fiber.Ctx
	app *fiber.App
}

func init() {
	engine.Register(new(Gofiber))
}

// User implements the method Adapter.User.
func (gof *Gofiber) User(ctx interface{}) (models.UserModel, bool) {
	return gof.GetUser(ctx, gof)
}

// Use implements the method Adapter.Use.
func (gof *Gofiber) Use(app interface{}, plugs []plugins.Plugin) error {
	return gof.GetUse(app, plugs, gof)
}

// Content implements the method Adapter.Content.
func (gof *Gofiber) Content(ctx interface{}, getPanelFn types.GetPanelFn, fn context.NodeProcessor, btns ...types.Button) {
	gof.GetContent(ctx, getPanelFn, gof, btns, fn)
}

// SetApp implements the method Adapter.SetApp.
func (gof *Gofiber) SetApp(app interface{}) error {
	var (
		eng *fiber.App
		ok  bool
	)
	if eng, ok = app.(*fiber.App); !ok {
		return errors.New("fiber.App adapter SetApp: wrong parameter")
	}

	gof.app = eng
	return nil
}

// AddHandler implements the method Adapter.AddHandler.
func (gof *Gofiber) AddHandler(method, path string, handlers context.Handlers) {

	gof.app.Add(strings.ToUpper(method), path, func(c *fiber.Ctx) error {

		httpreq := convertCtx(c.Context())
		ctx := context.NewContext(httpreq)

		for _, key := range c.Route().Params {
			if httpreq.URL.RawQuery == "" {
				httpreq.URL.RawQuery += strings.ReplaceAll(key, ":", "") + "=" + c.Params(key)
			} else {
				httpreq.URL.RawQuery += "&" + strings.ReplaceAll(key, ":", "") + "=" + c.Params(key)
			}

		}

		ctx.SetHandlers(handlers).Next()
		for key, head := range ctx.Response.Header {
			c.Set(key, head[0])

		}

		return c.Status(ctx.Response.StatusCode).SendStream(ctx.Response.Body)

	})

}

func convertCtx(ctx *fasthttp.RequestCtx) *http.Request {
	var r http.Request

	body := ctx.PostBody()
	r.Method = string(ctx.Method())
	r.Proto = "HTTP/1.1"
	r.ProtoMajor = 1
	r.ProtoMinor = 1
	r.RequestURI = string(ctx.RequestURI())
	r.ContentLength = int64(len(body))
	r.Host = string(ctx.Host())
	r.RemoteAddr = ctx.RemoteAddr().String()

	hdr := make(http.Header)
	ctx.Request.Header.VisitAll(func(k, v []byte) {
		sk := string(k)
		sv := string(v)
		switch sk {
		case "Transfer-Encoding":
			r.TransferEncoding = append(r.TransferEncoding, sv)
		default:
			hdr.Set(sk, sv)
		}
	})
	r.Header = hdr
	r.Body = &netHTTPBody{body}
	rURL, err := url.ParseRequestURI(r.RequestURI)
	if err != nil {
		ctx.Logger().Printf("cannot parse requestURI %q: %s", r.RequestURI, err)
		ctx.Error("Internal Server Error", fasthttp.StatusInternalServerError)
		return &r
	}
	r.URL = rURL
	return &r
}

type netHTTPBody struct {
	b []byte
}

func (r *netHTTPBody) Read(p []byte) (int, error) {
	if len(r.b) == 0 {
		return 0, io.EOF
	}
	n := copy(p, r.b)
	r.b = r.b[n:]
	return n, nil
}

func (r *netHTTPBody) Close() error {
	r.b = r.b[:0]
	return nil
}

// Name implements the method Adapter.Name.
func (*Gofiber) Name() string {
	return "gofiber"
}

// SetContext implements the method Adapter.SetContext.
func (*Gofiber) SetContext(contextInterface interface{}) adapter.WebFrameWork {
	var (
		ctx *fiber.Ctx
		ok  bool
	)
	if ctx, ok = contextInterface.(*fiber.Ctx); !ok {
		panic("gofiber adapter SetContext: wrong parameter")
	}
	return &Gofiber{ctx: ctx}
}

// Redirect implements the method Adapter.Redirect.
func (gof *Gofiber) Redirect() {
	_ = gof.ctx.Redirect(config.Url(config.GetLoginUrl()), http.StatusFound)
}

// SetContentType implements the method Adapter.SetContentType.
func (gof *Gofiber) SetContentType() {
	gof.ctx.Response().Header.Set("Content-Type", gof.HTMLContentType())
}

// Write implements the method Adapter.Write.
func (gof *Gofiber) Write(body []byte) {
	_, _ = gof.ctx.Write(body)
}

// GetCookie implements the method Adapter.GetCookie.
func (gof *Gofiber) GetCookie() (string, error) {
	return string(gof.ctx.Cookies(gof.CookieKey())), nil
}

// Lang implements the method Adapter.Lang.
func (gof *Gofiber) Lang() string {
	return string(gof.ctx.Request().URI().QueryArgs().Peek("__ga_lang"))
}

// Path implements the method Adapter.Path.
func (gof *Gofiber) Path() string {
	return string(gof.ctx.Path())
}

// Method implements the method Adapter.Method.
func (gof *Gofiber) Method() string {
	return string(gof.ctx.Method())
}

// FormParam implements the method Adapter.FormParam.
func (gof *Gofiber) FormParam() url.Values {
	f, _ := gof.ctx.MultipartForm()
	if f != nil {
		return f.Value
	}
	return url.Values{}
}

// IsPjax implements the method Adapter.IsPjax.
func (gof *Gofiber) IsPjax() bool {
	return string(gof.ctx.Request().Header.Peek(constant.PjaxHeader)) == "true"
}

// Query implements the method Adapter.Query.
func (gof *Gofiber) Query() url.Values {
	queryStr := gof.ctx.Context().QueryArgs().QueryString()
	queryObj, err := url.Parse(string(queryStr))

	if err != nil {
		return url.Values{}
	}

	return queryObj.Query()
}

// Request implements the method Adapter.Request.
func (gof *Gofiber) Request() *http.Request {
	return convertCtx(gof.ctx.Context())
}

================================================
FILE: adapter/gorilla/gorilla.go
================================================
// Copyright 2019 GoAdmin Core Team. All rights reserved.
// Use of this source code is governed by a Apache-2.0 style
// license that can be found in the LICENSE file.

package gorilla

import (
	"bytes"
	"errors"
	"net/http"
	"net/url"
	"regexp"
	"strings"

	"github.com/GoAdminGroup/go-admin/adapter"
	"github.com/GoAdminGroup/go-admin/context"
	"github.com/GoAdminGroup/go-admin/engine"
	"github.com/GoAdminGroup/go-admin/modules/config"
	"github.com/GoAdminGroup/go-admin/plugins"
	"github.com/GoAdminGroup/go-admin/plugins/admin/models"
	"github.com/GoAdminGroup/go-admin/plugins/admin/modules/constant"
	"github.com/GoAdminGroup/go-admin/template/types"
	"github.com/gorilla/mux"
)

// Gorilla structure value is a Gorilla GoAdmin adapter.
type Gorilla struct {
	adapter.BaseAdapter
	ctx Context
	app *mux.Router
}

func init() {
	engine.Register(new(Gorilla))
}

// User implements the method Adapter.User.
func (g *Gorilla) User(ctx interface{}) (models.UserModel, bool) {
	return g.GetUser(ctx, g)
}

// Use implements the method Adapter.Use.
func (g *Gorilla) Use(app interface{}, plugs []plugins.Plugin) error {
	return g.GetUse(app, plugs, g)
}

// Content implements the method Adapter.Content.
func (g *Gorilla) Content(ctx interface{}, getPanelFn types.GetPanelFn, fn context.NodeProcessor, btns ...types.Button) {
	g.GetContent(ctx, getPanelFn, g, btns, fn)
}

type HandlerFunc func(ctx Context) (types.Panel, error)

func Content(handler HandlerFunc) http.HandlerFunc {
	return func(writer http.ResponseWriter, request *http.Request) {
		ctx := Context{
			Request:  request,
			Response: writer,
		}
		engine.Content(ctx, func(ctx interface{}) (types.Panel, error) {
			return handler(ctx.(Context))
		})
	}
}

// SetApp implements the method Adapter.SetApp.
func (g *Gorilla) SetApp(app interface{}) error {
	var (
		eng *mux.Router
		ok  bool
	)
	if eng, ok = app.(*mux.Router); !ok {
		return errors.New("gorilla adapter SetApp: wrong parameter")
	}
	g.app = eng
	return nil
}

// AddHandler implements the method Adapter.AddHandler.
func (g *Gorilla) AddHandler(method, path string, handlers context.Handlers) {

	reg1 := regexp.MustCompile(":(.*?)/")
	reg2 := regexp.MustCompile(":(.*?)$")

	u := path
	u = reg1.ReplaceAllString(u, "{$1}/")
	u = reg2.ReplaceAllString(u, "{$1}")

	g.app.HandleFunc(u, func(w http.ResponseWriter, r *http.Request) {
		ctx := context.NewContext(r)

		params := mux.Vars(r)

		for key, param := range params {
			if r.URL.RawQuery == "" {
				r.URL.RawQuery += strings.ReplaceAll(key, ":", "") + "=" + param
			} else {
				r.URL.RawQuery += "&" + strings.ReplaceAll(key, ":", "") + "=" + param
			}
		}

		ctx.SetHandlers(handlers).Next()
		for key, head := range ctx.Response.Header {
			w.Header().Add(key, head[0])
		}

		if ctx.Response.Body == nil {
			w.WriteHeader(ctx.Response.StatusCode)
			return
		}

		w.WriteHeader(ctx.Response.StatusCode)

		buf := new(bytes.Buffer)
		_, _ = buf.ReadFrom(ctx.Response.Body)

		_, err := w.Write(buf.Bytes())
		if err != nil {
			w.WriteHeader(http.StatusInternalServerError)
			return
		}
	}).Methods(strings.ToUpper(method))
}

// Context wraps the Request and Response object of Gorilla.
type Context struct {
	Request  *http.Request
	Response http.ResponseWriter
}

// Name implements the method Adapter.Name.
func (*Gorilla) Name() string {
	return "gorilla"
}

// SetContext implements the method Adapter.SetContext.
func (*Gorilla) SetContext(contextInterface interface{}) adapter.WebFrameWork {
	var (
		ctx Context
		ok  bool
	)
	if ctx, ok = contextInterface.(Context); !ok {
		panic("gorilla adapter SetContext: wrong parameter")
	}

	return &Gorilla{ctx: ctx}
}

// Redirect implements the method Adapter.Redirect.
func (g *Gorilla) Redirect() {
	http.Redirect(g.ctx.Response, g.ctx.Request, config.Url(config.GetLoginUrl()), http.StatusFound)
}

// SetContentType implements the method Adapter.SetContentType.
func (g *Gorilla) SetContentType() {
	g.ctx.Response.Header().Set("Content-Type", g.HTMLContentType())
}

// Write implements the method Adapter.Write.
func (g *Gorilla) Write(body []byte) {
	_, _ = g.ctx.Response.Write(body)
}

// GetCookie implements the method Adapter.GetCookie.
func (g *Gorilla) GetCookie() (string, error) {
	cookie, err := g.ctx.Request.Cookie(g.CookieKey())
	if err != nil {
		return "", err
	}
	return cookie.Value, err
}

// Lang implements the method Adapter.Lang.
func (g *Gorilla) Lang() string {
	return g.ctx.Request.URL.Query().Get("__ga_lang")
}

// Path implements the method Adapter.Path.
func (g *Gorilla) Path() string {
	return g.ctx.Request.RequestURI
}

// Method implements the method Adapter.Method.
func (g *Gorilla) Method() string {
	return g.ctx.Request.Method
}

// FormParam implements the method Adapter.FormParam.
func (g *Gorilla) FormParam() url.Values {
	_ = g.ctx.Request.ParseMultipartForm(32 << 20)
	return g.ctx.Request.PostForm
}

// IsPjax implements the method Adapter.IsPjax.
func (g *Gorilla) IsPjax() bool {
	return g.ctx.Request.Header.Get(constant.PjaxHeader) == "true"
}

// Query implements the method Adapter.Query.
func (g *Gorilla) Query() url.Values {
	return g.ctx.Request.URL.Query()
}

// Request implements the method Adapter.Request.
func (g *Gorilla) Request() *http.Request {
	return g.ctx.Request
}

================================================
FILE: adapter/iris/iris.go
================================================
// Copyright 2019 GoAdmin Core Team. All rights reserved.
// Use of this source code is governed by a Apache-2.0 style
// license that can be found in the LICENSE file.

package iris

import (
	"bytes"
	"errors"
	"net/http"
	"net/url"
	"strings"

	"github.com/GoAdminGroup/go-admin/adapter"
	"github.com/GoAdminGroup/go-admin/plugins/admin/models"
	"github.com/GoAdminGroup/go-admin/template/types"
	"github.com/kataras/iris/v12"

	"github.com/GoAdminGroup/go-admin/context"
	"github.com/GoAdminGroup/go-admin/engine"
	"github.com/GoAdminGroup/go-admin/modules/config"
	"github.com/GoAdminGroup/go-admin/plugins"
	"github.com/GoAdminGroup/go-admin/plugins/admin/modules/constant"
)

// Iris structure value is an Iris GoAdmin adapter.
type Iris struct {
	adapter.BaseAdapter
	ctx iris.Context
	app *iris.Application
}

func init() {
	engine.Register(new(Iris))
}

// User implements the method Adapter.User.
func (is *Iris) User(ctx interface{}) (models.UserModel, bool) {
	return is.GetUser(ctx, is)
}

// Use implements the method Adapter.Use.
func (is *Iris) Use(app interface{}, plugs []plugins.Plugin) error {
	return is.GetUse(app, plugs, is)
}

// Content implements the method Adapter.Content.
func (is *Iris) Content(ctx interface{}, getPanelFn types.GetPanelFn, fn context.NodeProcessor, btns ...types.Button) {
	is.GetContent(ctx, getPanelFn, is, btns, fn)
}

type HandlerFunc func(ctx iris.Context) (types.Panel, error)

func Content(handler HandlerFunc) iris.Handler {
	return func(ctx iris.Context) {
		engine.Content(ctx, func(ctx interface{}) (types.Panel, error) {
			return handler(ctx.(iris.Context))
		})
	}
}

// SetApp implements the method Adapter.SetApp.
func (is *Iris) SetApp(app interface{}) error {
	var (
		eng *iris.Application
		ok  bool
	)
	if eng, ok = app.(*iris.Application); !ok {
		return errors.New("iris adapter SetApp: wrong parameter")
	}
	is.app = eng
	return nil
}

// AddHandler implements the method Adapter.AddHandler.
func (is *Iris) AddHandler(method, path string, handlers context.Handlers) {
	is.app.Handle(strings.ToUpper(method), path, func(c iris.Context) {
		ctx := context.NewContext(c.Request())

		var params = map[string]string{}
		c.Params().Visit(func(key string, value string) {
			params[key] = value
		})

		for key, value := range params {
			if c.Request().URL.RawQuery == "" {
				c.Request().URL.RawQuery += strings.ReplaceAll(key, ":", "") + "=" + value
			} else {
				c.Request().URL.RawQuery += "&" + strings.ReplaceAll(key, ":", "") + "=" + value
			}
		}

		ctx.SetHandlers(handlers).Next()
		for key, head := range ctx.Response.Header {
			c.Header(key, head[0])
		}
		c.StatusCode(ctx.Response.StatusCode)
		if ctx.Response.Body != nil {
			buf := new(bytes.Buffer)
			_, _ = buf.ReadFrom(ctx.Response.Body)
			_, _ = c.WriteString(buf.String())
		}
	})
}

// Name implements the method Adapter.Name.
func (*Iris) Name() string {
	return "iris"
}

// SetContext implements the method Adapter.SetContext.
func (*Iris) SetContext(contextInterface interface{}) adapter.WebFrameWork {
	var (
		ctx iris.Context
		ok  bool
	)
	if ctx, ok = contextInterface.(iris.Context); !ok {
		panic("iris adapter SetContext: wrong parameter")
	}

	return &Iris{ctx: ctx}
}

// Redirect implements the method Adapter.Redirect.
func (is *Iris) Redirect() {
	is.ctx.Redirect(config.Url(config.GetLoginUrl()), http.StatusFound)
}

// SetContentType implements the method Adapter.SetContentType.
func (is *Iris) SetContentType() {
	is.ctx.Header("Content-Type", is.HTMLContentType())
}

// Write implements the method Adapter.Write.
func (is *Iris) Write(body []byte) {
	_, _ = is.ctx.Write(body)
}

// GetCookie implements the method Adapter.GetCookie.
func (is *Iris) GetCookie() (string, error) {
	return is.ctx.GetCookie(is.CookieKey()), nil
}

// Lang implements the method Adapter.Lang.
func (is *Iris) Lang() string {
	return is.ctx.Request().URL.Query().Get("__ga_lang")
}

// Path implements the method Adapter.Path.
func (is *Iris) Path() string {
	return is.ctx.Path()
}

// Method implements the method Adapter.Method.
func (is *Iris) Method() string {
	return is.ctx.Method()
}

// FormParam implements the method Adapter.FormParam.
func (is *Iris) FormParam() url.Values {
	return is.ctx.FormValues()
}

// IsPjax implements the method Adapter.IsPjax.
func (is *Iris) IsPjax() bool {
	return is.ctx.GetHeader(constant.PjaxHeader) == "true"
}

// Query implements the method Adapter.Query.
func (is *Iris) Query() url.Values {
	return is.ctx.Request().URL.Query()
}

// Request implements the method Adapter.Request.
func (is *Iris) Request() *http.Request {
	return is.ctx.Request()
}

================================================
FILE: adapter/nethttp/nethttp.go
================================================
package nethttp

import (
	"bytes"
	"errors"
	"fmt"
	"net/http"
	"net/url"
	"regexp"
	"strings"

	"github.com/GoAdminGroup/go-admin/adapter"
	"github.com/GoAdminGroup/go-admin/context"
	"github.com/GoAdminGroup/go-admin/engine"
	cfg "github.com/GoAdminGroup/go-admin/modules/config"
	"github.com/GoAdminGroup/go-admin/modules/constant"
	"github.com/GoAdminGroup/go-admin/plugins"
	"github.com/GoAdminGroup/go-admin/plugins/admin/models"
	"github.com/GoAdminGroup/go-admin/template/types"
)

type NetHTTP struct {
	adapter.BaseAdapter
	ctx Context
	app *http.ServeMux
}

func init() {
	engine.Register(new(NetHTTP))
}

// User implements the method Adapter.User.
func (nh *NetHTTP) User(ctx interface{}) (models.UserModel, bool) {
	return nh.GetUser(ctx, nh)
}

// Use implements the method Adapter.Use.
func (nh *NetHTTP) Use(app interface{}, plugs []plugins.Plugin) error {
	return nh.GetUse(app, plugs, nh)
}

// Content implements the method Adapter.Content.
func (nh *NetHTTP) Content(ctx interface{}, getPanelFn types.GetPanelFn, fn context.NodeProcessor, btns ...types.Button) {
	nh.GetContent(ctx, getPanelFn, nh, btns, fn)
}

type HandlerFunc func(ctx Context) (types.Panel, error)

func Content(handler HandlerFunc) http.HandlerFunc {
	return func(writer http.ResponseWriter, request *http.Request) {
		ctx := Context{
			Request:  request,
			Response: writer,
		}
		engine.Content(ctx, func(ctx interface{}) (types.Panel, error) {
			return handler(ctx.(Context))
		})
	}
}

// SetApp implements the method Adapter.SetApp.
func (nh *NetHTTP) SetApp(app interface{}) error {
	var (
		eng *http.ServeMux
		ok  bool
	)
	if eng, ok = app.(*http.ServeMux); !ok {
		return errors.New("net/http adapter SetApp: wrong parameter")
	}
	nh.app = eng
	return nil
}

// AddHandler implements the method Adapter.AddHandler.
func (nh *NetHTTP) AddHandler(method, path string, handlers context.Handlers) {
	url := path
	reg1 := regexp.MustCompile(":(.*?)/")
	reg2 := regexp.MustCompile(":(.*?)$")
	url = reg1.ReplaceAllString(url, "{$1}/")
	url = reg2.ReplaceAllString(url, "{$1}")

	if len(url) > 1 && url[0] == '/' && url[1] == '/' {
		url = url[1:]
	}

	pattern := fmt.Sprintf("%s %s", strings.ToUpper(method), url)

	nh.app.HandleFunc(pattern, func(w http.ResponseWriter, r *http.Request) {
		if r.URL.Path[len(r.URL.Path)-1] == '/' {
			r.URL.Path = r.URL.Path[:len(r.URL.Path)-1]
		}

		ctx := context.NewContext(r)

		params := getPathParams(url, r.URL.Path)
		for key, value := range params {
			if r.URL.RawQuery == "" {
				r.URL.RawQuery += strings.ReplaceAll(key, ":", "") + "=" + value
			} else {
				r.URL.RawQuery += "&" + strings.ReplaceAll(key, ":", "") + "=" + value
			}
		}

		ctx.SetHandlers(handlers).Next()
		for key, head := range ctx.Response.Header {
			w.Header().Set(key, head[0])
		}
		if ctx.Response.Body != nil {
			buf := new(bytes.Buffer)
			_, _ = buf.ReadFrom(ctx.Response.Body)
			w.WriteHeader(ctx.Response.StatusCode)
			_, _ = w.Write(buf.Bytes())
		} else {
			w.WriteHeader(ctx.Response.StatusCode)
		}
	})
}

// HandleFun is type of route methods of chi.
type HandleFun func(pattern string, handlerFn http.HandlerFunc)

// Context wraps the Request and Response object of Chi.
type Context struct {
	Request  *http.Request
	Response http.ResponseWriter
}

// SetContext implements the method Adapter.SetContext.
func (*NetHTTP) SetContext(contextInterface interface{}) adapter.WebFrameWork {
	var (
		ctx Context
		ok  bool
	)
	if ctx, ok = contextInterface.(Context); !ok {
		panic("net/http adapter SetContext: wrong parameter")
	}
	return &NetHTTP{ctx: ctx}
}

// Name implements the method Adapter.Name.
func (*NetHTTP) Name() string {
	return "net/http"
}

// Redirect implements the method Adapter.Redirect.
func (nh *NetHTTP) Redirect() {
	http.Redirect(nh.ctx.Response, nh.ctx.Request, cfg.Url(cfg.GetLoginUrl()), http.StatusFound)
}

// SetContentType implements the method Adapter.SetContentType.
func (nh *NetHTTP) SetContentType() {
	nh.ctx.Response.Header().Set("Content-Type", nh.HTMLContentType())
}

// Write implements the method Adapter.Write.
func (nh *NetHTTP) Write(body []byte) {
	nh.ctx.Response.WriteHeader(http.StatusOK)
	_, _ = nh.ctx.Response.Write(body)
}

// GetCookie implements the method Adapter.GetCookie.
func (nh *NetHTTP) GetCookie() (string, error) {
	cookie, err := nh.ctx.Request.Cookie(nh.CookieKey())
	if err != nil {
		return "", err
	}
	return cookie.Value, err
}

// Lang implements the method Adapter.Lang.
func (nh *NetHTTP) Lang() string {
	return nh.ctx.Request.URL.Query().Get("__ga_lang")
}

// Path implements the method Adapter.Path.
func (nh *NetHTTP) Path() string {
	return nh.ctx.Request.URL.Path
}

// Method implements the method Adapter.Method.
func (nh *NetHTTP) Method() string {
	return nh.ctx.Request.Method
}

// FormParam implements the method Adapter.FormParam.
func (nh *NetHTTP) FormParam() url.Values {
	_ = nh.ctx.Request.ParseMultipartForm(32 << 20)
	return nh.ctx.Request.PostForm
}

// IsPjax implements the method Adapter.IsPjax.
func (nh *NetHTTP) IsPjax() bool {
	return nh.ctx.Request.Header.Get(constant.PjaxHeader) == "true"
}

// Query implements the method Adapter.Query.
func (nh *NetHTTP) Query() url.Values {
	return nh.ctx.Request.URL.Query()
}

// Request implements the method Adapter.Request.
func (nh *NetHTTP) Request() *http.Request {
	return nh.ctx.Request
}

// getPathParams extracts path parameters from a URL based on a given pattern.
func getPathParams(pattern, url string) map[string]string {
	params := make(map[string]string)

	// Convert pattern to regex
	placeholderRegex := regexp.MustCompile(`\{(\w+)\}`)
	regexPattern := "^" + placeholderRegex.ReplaceAllStringFunc(pattern, func(s string) string {
		return `(?P<` + s[1:len(s)-1] + `>\w+)`
	}) + `$`

	// Compile regex
	regex := regexp.MustCompile(regexPattern)

	// Match the URL against the regex
	match := regex.FindStringSubmatch(url)
	if match == nil {
		return nil
	}

	// Extract named groups
	for i, name := range regex.SubexpNames() {
		if i != 0 && name != "" { // Ignore the whole match at index 0
			params[name] = match[i]
		}
	}

	return params
}


================================================
FILE: context/context.go
================================================
// Copyright 2019 GoAdmin Core Team. All rights reserved.
// Use of this source code is governed by a Apache-2.0 style
// license that can be found in the LICENSE file.

package context

import (
	"bytes"
	"encoding/json"
	"errors"
	"fmt"
	"io"
	"math"
	"net"
	"net/http"
	"net/url"
	"os"
	"path"
	"strings"
	"time"

	"github.com/GoAdminGroup/go-admin/modules/constant"
)

const abortIndex int8 = math.MaxInt8 / 2

// Context is the simplify version of web framework context.
// But it is important which will be used in plugins to custom
// the request and response. And adapter will help to transform
// the Context to the web framework`s context. It has three attributes.
// Request and response are belongs to net/http package. UserValue
// is the custom key-value store of context.
type Context struct {
	Request   *http.Request
	Response  *http.Response
	UserValue map[string]interface{}
	index     int8
	handlers  Handlers
}

// Path is used in the matching of request and response. Url stores the
// raw register url. RegUrl contains the wildcard which on behalf of
// the route params.
type Path struct {
	URL    string
	Method string
}

type RouterMap map[string]Router

func (r RouterMap) Get(name string) Router {
	return r[name]
}

type Router struct {
	Methods []string
	Patten  string
}

func (r Router) Method() string {
	return r.Methods[0]
}

func (r Router) GetURL(value ...string) string {
	u := r.Patten
	for i := 0; i < len(value); i += 2 {
		u = strings.ReplaceAll(u, ":__"+value[i], value[i+1])
	}
	return u
}

type NodeProcessor func(...Node)

type Node struct {
	Path     string
	Method   string
	Handlers []Handler
	Value    map[string]interface{}
}

// SetUserValue set the value of user context.
func (ctx *Context) SetUserValue(key string, value interface{}) {
	ctx.UserValue[key] = value
}

// GetUserValue get the value of key.
func (ctx *Context) GetUserValue(key string) interface{} {
	return ctx.UserValue[key]
}

// Path return the url path.
func (ctx *Context) Path() string {
	return ctx.Request.URL.Path
}

// Abort abort the context.
func (ctx *Context) Abort() {
	ctx.index = abortIndex
}

// Next should be used only inside middleware.
func (ctx *Context) Next() {
	ctx.index++
	for s := int8(len(ctx.handlers)); ctx.index < s; ctx.index++ {
		ctx.handlers[ctx.index](ctx)
	}
}

// SetHandlers set the handlers of Context.
func (ctx *Context) SetHandlers(handlers Handlers) *Context {
	ctx.handlers = handlers
	return ctx
}

// Method return the request method.
func (ctx *Context) Method() string {
	return ctx.Request.Method
}

// NewContext used in adapter which return a Context with request
// and slice of UserValue and a default Response.
func NewContext(req *http.Request) *Context {

	return &Context{
		Request:   req,
		UserValue: make(map[string]interface{}),
		Response: &http.Response{
			StatusCode: http.StatusOK,
			Header:     make(http.Header),
		},
		index: -1,
	}
}

const (
	HeaderContentType = "Content-Type"

	HeaderLastModified    = "Last-Modified"
	HeaderIfModifiedSince = "If-Modified-Since"
	HeaderCacheControl    = "Cache-Control"
	HeaderETag            = "ETag"

	HeaderContentDisposition = "Content-Disposition"
	HeaderContentLength      = "Content-Length"
	HeaderContentEncoding    = "Content-Encoding"

	GzipHeaderValue      = "gzip"
	HeaderAcceptEncoding = "Accept-Encoding"
	HeaderVary           = "Vary"

	ThemeKey = "__ga_theme"
)

func (ctx *Context) BindJSON(data interface{}) error {
	if ctx.Request.Body != nil {
		b, err := io.ReadAll(ctx.Request.Body)
		if err == nil {
			return json.Unmarshal(b, data)
		}
		return err
	}
	return errors.New("empty request body")
}

func (ctx *Context) MustBindJSON(data interface{}) {
	if ctx.Request.Body != nil {
		b, err := io.ReadAll(ctx.Request.Body)
		if err != nil {
			panic(err)
		}
		err = json.Unmarshal(b, data)
		if err != nil {
			panic(err)
		}
	}
	panic("empty request body")
}

// Write save the given status code, headers and body string into the response.
func (ctx *Context) Write(code int, header map[string]string, Body string) {
	ctx.Response.StatusCode = code
	for key, head := range header {
		ctx.AddHeader(key, head)
	}
	ctx.Response.Body = io.NopCloser(strings.NewReader(Body))
}

// JSON serializes the given struct as JSON into the response body.
// It also sets the Content-Type as "application/json".
func (ctx *Context) JSON(code int, Body map[string]interface{}) {
	ctx.Response.StatusCode = code
	ctx.SetContentType("application/json")
	BodyStr, err := json.Marshal(Body)
	if err != nil {
		panic(err)
	}
	ctx.Response.Body = io.NopCloser(bytes.NewReader(BodyStr))
}

// DataWithHeaders save the given status code, headers and body data into the response.
func (ctx *Context) DataWithHeaders(code int, header map[string]string, data []byte) {
	ctx.Response.StatusCode = code
	for key, head := range header {
		ctx.AddHeader(key, head)
	}
	ctx.Response.Body = io.NopCloser(bytes.NewBuffer(data))
}

// Data writes some data into the body stream and updates the HTTP code.
func (ctx *Context) Data(code int, contentType string, data []byte) {
	ctx.Response.StatusCode = code
	ctx.SetContentType(contentType)
	ctx.Response.Body = io.NopCloser(bytes.NewBuffer(data))
}

// Redirect add redirect url to header.
func (ctx *Context) Redirect(path string) {
	ctx.Response.StatusCode = http.StatusFound
	ctx.SetContentType("text/html; charset=utf-8")
	ctx.AddHeader("Location", path)
}

// HTML output html response.
func (ctx *Context) HTML(code int, body string) {
	ctx.SetContentType("text/html; charset=utf-8")
	ctx.SetStatusCode(code)
	ctx.WriteString(body)
}

// HTMLByte output html response.
func (ctx *Context) HTMLByte(code int, body []byte) {
	ctx.SetContentType("text/html; charset=utf-8")
	ctx.SetStatusCode(code)
	ctx.Response.Body = io.NopCloser(bytes.NewBuffer(body))
}

// WriteString save the given body string into the response.
func (ctx *Context) WriteString(body string) {
	ctx.Response.Body = io.NopCloser(strings.NewReader(body))
}

// SetStatusCode save the given status code into the response.
func (ctx *Context) SetStatusCode(code int) {
	ctx.Response.StatusCode = code
}

// SetContentType save the given content type header into the response header.
func (ctx *Context) SetContentType(contentType string) {
	ctx.AddHeader(HeaderContentType, contentType)
}

func (ctx *Context) SetLastModified(modtime time.Time) {
	if !IsZeroTime(modtime) {
		ctx.AddHeader(HeaderLastModified, modtime.UTC().Format(http.TimeFormat)) // or modtime.UTC()?
	}
}

var unixEpochTime = time.Unix(0, 0)

// IsZeroTime reports whether t is obviously unspecified (either zero or Unix()=0).
func IsZeroTime(t time.Time) bool {
	return t.IsZero() || t.Equal(unixEpochTime)
}

// ParseTime parses a time header (such as the Date: header),
// trying each forth formats
// that are allowed by HTTP/1.1:
// time.RFC850, and time.ANSIC.
var ParseTime = func(text string) (t time.Time, err error) {
	t, err = time.Parse(http.TimeFormat, text)
	if err != nil {
		return http.ParseTime(text)
	}

	return
}

func (ctx *Context) WriteNotModified() {
	// RFC 7232 section 4.1:
	// a sender SHOULD NOT generate representation metadata other than the
	// above listed fields unless said metadata exists for the purpose of
	// guiding cache updates (e.g.," Last-Modified" might be useful if the
	// response does not have an ETag field).
	delete(ctx.Response.Header, HeaderContentType)
	delete(ctx.Response.Header, HeaderContentLength)
	if ctx.Headers(HeaderETag) != "" {
		delete(ctx.Response.Header, HeaderLastModified)
	}
	ctx.SetStatusCode(http.StatusNotModified)
}

func (ctx *Context) CheckIfModifiedSince(modtime time.Time) (bool, error) {
	if method := ctx.Method(); method != http.MethodGet && method != http.MethodHead {
		return false, errors.New("skip: method")
	}
	ims := ctx.Headers(HeaderIfModifiedSince)
	if ims == "" || IsZeroTime(modtime) {
		return false, errors.New("skip: zero time")
	}
	t, err := ParseTime(ims)
	if err != nil {
		return false, errors.New("skip: " + err.Error())
	}
	// sub-second precision, so
	// use mtime < t+1s instead of mtime <= t to check for unmodified.
	if modtime.UTC().Before(t.Add(1 * time.Second)) {
		return false, nil
	}
	return true, nil
}

// LocalIP return the request client ip.
func (ctx *Context) LocalIP() string {
	xForwardedFor := ctx.Request.Header.Get("X-Forwarded-For")
	ip := strings.TrimSpace(strings.Split(xForwardedFor, ",")[0])
	if ip != "" {
		return ip
	}

	ip = strings.TrimSpace(ctx.Request.Header.Get("X-Real-Ip"))
	if ip != "" {
		return ip
	}

	if ip, _, err := net.SplitHostPort(strings.TrimSpace(ctx.Request.RemoteAddr)); err == nil {
		return ip
	}

	return "127.0.0.1"
}

// SetCookie save the given cookie obj into the response Set-Cookie header.
func (ctx *Context) SetCookie(cookie *http.Cookie) {
	if v := cookie.String(); v != "" {
		ctx.AddHeader("Set-Cookie", v)
	}
}

// Query get the query parameter of url.
func (ctx *Context) Query(key string) string {
	return ctx.Request.URL.Query().Get(key)
}

// QueryAll get the query parameters of url.
func (ctx *Context) QueryAll(key string) []string {
	return ctx.Request.URL.Query()[key]
}

// QueryDefault get the query parameter of url. If it is empty, return the default.
func (ctx *Context) QueryDefault(key, def string) string {
	value := ctx.Query(key)
	if value == "" {
		return def
	}
	return value
}

// Lang get the query parameter of url with given key __ga_lang.
func (ctx *Context) Lang() string {
	return ctx.Query("__ga_lang")
}

// Theme get the request theme with given key __ga_theme.
func (ctx *Context) Theme() string {
	queryTheme := ctx.Query(ThemeKey)
	if queryTheme != "" {
		return queryTheme
	}
	cookieTheme := ctx.Cookie(ThemeKey)
	if cookieTheme != "" {
		return cookieTheme
	}
	return ctx.RefererQuery(ThemeKey)
}

// Headers get the value of request headers key.
func (ctx *Context) Headers(key string) string {
	return ctx.Request.Header.Get(key)
}

// Referer get the url string of request header Referer.
func (ctx *Context) Referer() string {
	return ctx.Headers("Referer")
}

// RefererURL get the url.URL object of request header Referer.
func (ctx *Context) RefererURL() *url.URL {
	ref := ctx.Headers("Referer")
	if ref == "" {
		return nil
	}
	u, err := url.Parse(ref)
	if err != nil {
		return nil
	}
	return u
}

// RefererQuery retrieve the value of given key from url.URL object of request header Referer.
func (ctx *Context) RefererQuery(key string) string {
	if u := ctx.RefererURL(); u != nil {
		return u.Query().Get(key)
	}
	return ""
}

// FormValue get the value of request form key.
func (ctx *Context) FormValue(key string) string {
	return ctx.Request.FormValue(key)
}

// PostForm get the values of request form.
func (ctx *Context) PostForm() url.Values {
	_ = ctx.Request.ParseMultipartForm(32 << 20)
	return ctx.Request.PostForm
}

func (ctx *Context) WantHTML() bool {
	return ctx.Method() == "GET" && strings.Contains(ctx.Headers("Accept"), "html")
}

func (ctx *Context) WantJSON() bool {
	return strings.Contains(ctx.Headers("Accept"), "json")
}

// AddHeader adds the key, value pair to the header.
func (ctx *Context) AddHeader(key, value string) {
	ctx.Response.Header.Add(key, value)
}

// PjaxUrl add pjax url header.
func (ctx *Context) PjaxUrl(url string) {
	ctx.Response.Header.Add(constant.PjaxUrlHeader, url)
}

// IsPjax check request is pjax or not.
func (ctx *Context) IsPjax() bool {
	return ctx.Headers(constant.PjaxHeader) == "true"
}

// IsIframe check request is iframe or not.
func (ctx *Context) IsIframe() bool {
	return ctx.Query(constant.IframeKey) == "true" || ctx.Headers(constant.IframeKey) == "true"
}

// SetHeader set the key, value pair to the header.
func (ctx *Context) SetHeader(key, value string) {
	ctx.Response.Header.Set(key, value)
}

func (ctx *Context) GetContentType() string {
	return ctx.Request.Header.Get("Content-Type")
}

func (ctx *Context) Cookie(name string) string {
	for _, ck := range ctx.Request.Cookies() {
		if ck.Name == name {
			return ck.Value
		}
	}
	return ""
}

// User return the current login user.
func (ctx *Context) User() interface{} {
	return ctx.UserValue["user"]
}

// ServeContent serves content, headers are autoset
// receives three parameters, it's low-level function, instead you can use .ServeFile(string,bool)/SendFile(string,string)
//
// You can define your own "Content-Type" header also, after this function call
// Doesn't implements resuming (by range), use ctx.SendFile instead
func (ctx *Context) ServeContent(content io.ReadSeeker, filename string, modtime time.Time, gzipCompression bool) error {
	if modified, err := ctx.CheckIfModifiedSince(modtime); !modified && err == nil {
		ctx.WriteNotModified()
		return nil
	}

	if ctx.GetContentType() == "" {
		ctx.SetContentType(filename)
	}

	buf, _ := io.ReadAll(content)
	ctx.Response.Body = io.NopCloser(bytes.NewBuffer(buf))
	return nil
}

// ServeFile serves a view file, to send a file ( zip for example) to the client you should use the SendFile(serverfilename,clientfilename)
func (ctx *Context) ServeFile(filename string, gzipCompression bool) error {
	f, err := os.Open(filename)
	if err != nil {
		return fmt.Errorf("%d", http.StatusNotFound)
	}
	defer func() {
		_ = f.Close()
	}()
	fi, _ := f.Stat()
	if fi.IsDir() {
		return ctx.ServeFile(path.Join(filename, "index.html"), gzipCompression)
	}

	return ctx.ServeContent(f, fi.Name(), fi.ModTime(), gzipCompression)
}

type HandlerMap map[Path]Handlers

// App is the key struct of the package. App as a member of plugin
// entity contains the request and the corresponding handler. Prefix
// is the url prefix and MiddlewareList is for control flow.
type App struct {
	Requests    []Path
	Handlers    HandlerMap
	Middlewares Handlers
	Prefix      string

	Routers    RouterMap
	routeIndex int
	routeANY   bool
}

// NewApp return an empty app.
func NewApp() *App {
	return &App{
		Requests:    make([]Path, 0),
		Handlers:    make(HandlerMap),
		Prefix:      "/",
		Middlewares: make([]Handler, 0),
		routeIndex:  -1,
		Routers:     make(RouterMap),
	}
}

// Handler defines the handler used by the middleware as return value.
type Handler func(ctx *Context)

// Handlers is the array of Handler
type Handlers []Handler

// AppendReqAndResp stores the request info and handle into app.
// support the route parameter. The route parameter will be recognized as
// wildcard store into the RegUrl of Path struct. For example:
//
//	/user/:id      => /user/(.*)
//	/user/:id/info => /user/(.*?)/info
//
// The RegUrl will be used to recognize the incoming path and find
// the handler.
func (app *App) AppendReqAndResp(url, method string, handler []Handler) {

	app.Requests = append(app.Requests, Path{
		URL:    join(app.Prefix, url),
		Method: method,
	})
	app.routeIndex++

	app.Handlers[Path{
		URL:    join(app.Prefix, url),
		Method: method,
	}] = append(app.Middlewares, handler...)
}

// Find is public helper method for findPath of tree.
func (app *App) Find(url, method string) []Handler {
	app.routeANY = false
	return app.Handlers[Path{URL: url, Method: method}]
}

// POST is a shortcut for app.AppendReqAndResp(url, "post", handler).
func (app *App) POST(url string, handler ...Handler) *App {
	app.routeANY = false
	app.AppendReqAndResp(url, "post", handler)
	return app
}

// GET is a shortcut for app.AppendReqAndResp(url, "get", handler).
func (app *App) GET(url string, handler ...Handler) *App {
	app.routeANY = false
	app.AppendReqAndResp(url, "get", handler)
	return app
}

// DELETE is a shortcut for app.AppendReqAndResp(url, "delete", handler).
func (app *App) DELETE(url string, handler ...Handler) *App {
	app.routeANY = false
	app.AppendReqAndResp(url, "delete", handler)
	return app
}

// PUT is a shortcut for app.AppendReqAndResp(url, "put", handler).
func (app *App) PUT(url string, handler ...Handler) *App {
	app.routeANY = false
	app.AppendReqAndResp(url, "put", handler)
	return app
}

// OPTIONS is a shortcut for app.AppendReqAndResp(url, "options", handler).
func (app *App) OPTIONS(url string, handler ...Handler) *App {
	app.routeANY = false
	app.AppendReqAndResp(url, "options", handler)
	return app
}

// HEAD is a shortcut for app.AppendReqAndResp(url, "head", handler).
func (app *App) HEAD(url string, handler ...Handler) *App {
	app.routeANY = false
	app.AppendReqAndResp(url, "head", handler)
	return app
}

// ANY registers a route that matches all the HTTP methods.
// GET, POST, PUT, HEAD, OPTIONS, DELETE.
func (app *App) ANY(url string, handler ...Handler) *App {
	app.routeANY = true
	app.AppendReqAndResp(url, "post", handler)
	app.AppendReqAndResp(url, "get", handler)
	app.AppendReqAndResp(url, "delete", handler)
	app.AppendReqAndResp(url, "put", handler)
	app.AppendReqAndResp(url, "options", handler)
	app.AppendReqAndResp(url, "head", handler)
	return app
}

func (app *App) Name(name string) {
	if app.routeANY {
		app.Routers[name] = Router{
			Methods: []string{"POST", "GET", "DELETE", "PUT", "OPTIONS", "HEAD"},
			Patten:  app.Requests[app.routeIndex].URL,
		}
	} else {
		app.Routers[name] = Router{
			Methods: []string{app.Requests[app.routeIndex].Method},
			Patten:  app.Requests[app.routeIndex].URL,
		}
	}
}

// Group add middlewares and prefix for App.
func (app *App) Group(prefix string, middleware ...Handler) *RouterGroup {
	return &RouterGroup{
		app:         app,
		Middlewares: append(app.Middlewares, middleware...),
		Prefix:      slash(prefix),
	}
}

// RouterGroup is a group of routes.
type RouterGroup struct {
	app         *App
	Middlewares Handlers
	Prefix      string
}

// AppendReqAndResp stores the request info and handle into app.
// support the route parameter. The route parameter will be recognized as
// wildcard store into the RegUrl of Path struct. For example:
//
//	/user/:id      => /user/(.*)
//	/user/:id/info => /user/(.*?)/info
//
// The RegUrl will be used to recognize the incoming path and find
// the handler.
func (g *RouterGroup) AppendReqAndResp(url, method string, handler []Handler) {

	g.app.Requests = append(g.app.Requests, Path{
		URL:    join(g.Prefix, url),
		Method: method,
	})
	g.app.routeIndex++

	var h = make([]Handler, len(g.Middlewares))
	copy(h, g.Middlewares)

	g.app.Handlers[Path{
		URL:    join(g.Prefix, url),
		Method: method,
	}] = append(h, handler...)
}

// POST is a shortcut for app.AppendReqAndResp(url, "post", handler).
func (g *RouterGroup) POST(url string, handler ...Handler) *RouterGroup {
	g.app.routeANY = false
	g.AppendReqAndResp(url, "post", handler)
	return g
}

// GET is a shortcut for app.AppendReqAndResp(url, "get", handler).
func (g *RouterGroup) GET(url string, handler ...Handler) *RouterGroup {
	g.app.routeANY = false
	g.AppendReqAndResp(url, "get", handler)
	return g
}

// DELETE is a shortcut for app.AppendReqAndResp(url, "delete", handler).
func (g *RouterGroup) DELETE(url string, handler ...Handler) *RouterGroup {
	g.app.routeANY = false
	g.AppendReqAndResp(url, "delete", handler)
	return g
}

// PUT is a shortcut for app.AppendReqAndResp(url, "put", handler).
func (g *RouterGroup) PUT(url string, handler ...Handler) *RouterGroup {
	g.app.routeANY = false
	g.AppendReqAndResp(url, "put", handler)
	return g
}

// OPTIONS is a shortcut for app.AppendReqAndResp(url, "options", handler).
func (g *RouterGroup) OPTIONS(url string, handler ...Handler) *RouterGroup {
	g.app.routeANY = false
	g.AppendReqAndResp(url, "options", handler)
	return g
}

// HEAD is a shortcut for app.AppendReqAndResp(url, "head", handler).
func (g *RouterGroup) HEAD(url string, handler ...Handler) *RouterGroup {
	g.app.routeANY = false
	g.AppendReqAndResp(url, "head", handler)
	return g
}

// ANY registers a route that matches all the HTTP methods.
// GET, POST, PUT, HEAD, OPTIONS, DELETE.
func (g *RouterGroup) ANY(url string, handler ...Handler) *RouterGroup {
	g.app.routeANY = true
	g.AppendReqAndResp(url, "post", handler)
	g.AppendReqAndResp(url, "get", handler)
	g.AppendReqAndResp(url, "delete", handler)
	g.AppendReqAndResp(url, "put", handler)
	g.AppendReqAndResp(url, "options", handler)
	g.AppendReqAndResp(url, "head", handler)
	return g
}

func (g *RouterGroup) Name(name string) {
	g.app.Name(name)
}

// Group add middlewares and prefix for RouterGroup.
func (g *RouterGroup) Group(prefix string, middleware ...Handler) *RouterGroup {
	return &RouterGroup{
		app:         g.app,
		Middlewares: append(g.Middlewares, middleware...),
		Prefix:      join(slash(g.Prefix), slash(prefix)),
	}
}

// slash fix the path which has wrong format problem.
//
//	""      => "/"
//	"abc/"  => "/abc"
//	"/abc/" => "/abc"
//	"/abc"  => "/abc"
//	"/"     => "/"
func slash(prefix string) string {
	prefix = strings.TrimSpace(prefix)
	if prefix == "" || prefix == "/" {
		return "/"
	}
	if prefix[0] != '/' {
		if prefix[len(prefix)-1] == '/' {
			return "/" + prefix[:len(prefix)-1]
		}
		return "/" + prefix
	}
	if prefix[len(prefix)-1] == '/' {
		return prefix[:len(prefix)-1]
	}
	return prefix
}

// join join the path.
func join(prefix, suffix string) string {
	if prefix == "/" {
		return suffix
	}
	if suffix == "/" {
		return prefix
	}
	return prefix + suffix
}


================================================
FILE: context/context_test.go
================================================
package context

import (
	"fmt"
	"testing"

	"github.com/magiconair/properties/assert"
)

func TestSlash(t *testing.T) {
	assert.Equal(t, "/abc", slash("/abc"))
	assert.Equal(t, "/", slash(""))
	assert.Equal(t, "/abc", slash("abc/"))
	assert.Equal(t, "/", slash("/"))
	assert.Equal(t, "/abc", slash("/abc/"))
	assert.Equal(t, "/", slash("//"))
}

func TestJoin(t *testing.T) {
	assert.Equal(t, "/abc/abc", join(slash("/abc"), slash("/abc")))
	assert.Equal(t, "/", join(slash("/"), slash("/")))
	assert.Equal(t, "/abc", join(slash("/"), slash("/abc")))
	assert.Equal(t, "/abc", join(slash("abc/"), slash("/")))
	assert.Equal(t, "/abc", join(slash("/abc/"), slash("/")))
}

func TestTree(t *testing.T) {
	tree := tree()
	tree.addPath(stringToArr("/adm"), "GET", []Handler{func(ctx *Context) { fmt.Println(1) }})
	tree.addPath(stringToArr("/admi"), "GET", []Handler{func(ctx *Context) { fmt.Println(1) }})
	tree.addPath(stringToArr("/admin"), "GET", []Handler{func(ctx *Context) { fmt.Println(1) }})
	tree.addPath(stringToArr("/admin/menu/new"), "POST", []Handler{func(ctx *Context) { fmt.Println(1) }})
	tree.addPath(stringToArr("/admin/menu/new"), "GET", []Handler{func(ctx *Context) { fmt.Println(1) }})
	tree.addPath(stringToArr("/admin/info/:__prefix"), "GET", []Handler{
		func(ctx *Context) { fmt.Println("auth") },
		func(ctx *Context) { fmt.Println("init") },
		func(ctx *Context) { fmt.Println("info") },
	})
	tree.addPath(stringToArr("/admin/info/:__prefix/detail"), "GET", []Handler{
		func(ctx *Context) { fmt.Println("auth") },
		func(ctx *Context) { fmt.Println("detail") },
	})

	fmt.Println("/admin/menu/new", "GET")
	h := tree.findPath(stringToArr("/admin/menu/new"), "GET")
	assert.Equal(t, h != nil, true)
	printHandler(h)
	fmt.Println("/admin/menu/new", "POST")
	h = tree.findPath(stringToArr("/admin/menu/new"), "POST")
	assert.Equal(t, h != nil, true)
	printHandler(h)
	fmt.Println("/admin/me/new", "POST")
	h = tree.findPath(stringToArr("/admin/me/new"), "POST")
	assert.Equal(t, h == nil, true)
	printHandler(h)
	fmt.Println("/admin/info/user", "GET")
	h = tree.findPath(stringToArr("/admin/info/user"), "GET")
	assert.Equal(t, h != nil, true)
	printHandler(h)
	fmt.Println("/admin/info/user/detail", "GET")
	h = tree.findPath(stringToArr("/admin/info/user/detail"), "GET")
	assert.Equal(t, h != nil, true)
	printHandler(h)
	fmt.Println("=========== printChildren ===========")
	tree.printChildren()
}

func printHandler(h []Handler) {
	for _, value := range h {
		value(&Context{})
	}
}


================================================
FILE: context/trie.go
================================================
// Copyright 2019 GoAdmin Core Team. All rights reserved.
// Use of this source code is governed by a Apache-2.0 style
// license that can be found in the LICENSE file.

package context

import "fmt"

type node struct {
	children []*node
	value    string
	method   []string
	handle   [][]Handler
}

func tree() *node {
	return &node{
		children: make([]*node, 0),
		value:    "/",
		handle:   nil,
	}
}

func (n *node) hasMethod(method string) int {
	for k, m := range n.method {
		if m == method {
			return k
		}
	}
	return -1
}

func (n *node) addMethodAndHandler(method string, handler []Handler) {
	n.method = append(n.method, method)
	n.handle = append(n.handle, handler)
}

func (n *node) addChild(child *node) {
	n.children = append(n.children, child)
}

func (n *node) addContent(value string) *node {
	var child = n.search(value)
	if child == nil {
		child = &node{
			children: make([]*node, 0),
			value:    value,
		}
		n.addChild(child)
	}
	return child
}

func (n *node) search(value string) *node {
	for _, child := range n.children {
		if child.value == value || child.value == "*" {
			return child
		}
	}
	return nil
}

func (n *node) addPath(paths []string, method string, handler []Handler) {
	child := n
	for i := 0; i < len(paths); i++ {
		child = child.addContent(paths[i])
	}
	child.addMethodAndHandler(method, handler)
}

func (n *node) findPath(paths []string, method string) []Handler {
	child := n
	for i := 0; i < len(paths); i++ {
		child = child.search(paths[i])
		if child == nil {
			return nil
		}
	}

	methodIndex := child.hasMethod(method)
	if methodIndex == -1 {
		return nil
	}

	return child.handle[methodIndex]
}

func (n *node) print() {
	fmt.Println(n)
}

func (n *node) printChildren() {
	n.print()
	for _, child := range n.children {
		child.printChildren()
	}
}

func stringToArr(path string) []string {
	var (
		paths      = make([]string, 0)
		start      = 0
		end        int
		isWildcard = false
	)
	for i := 0; i < len(path); i++ {
		if i == 0 && path[0] == '/' {
			start = 1
			continue
		}
		if path[i] == ':' {
			isWildcard = true
		}
		if i == len(path)-1 {
			end = i + 1
			if isWildcard {
				paths = append(paths, "*")
			} else {
				paths = append(paths, path[start:end])
			}
		}
		if path[i] == '/' {
			end = i
			if isWildcard {
				paths = append(paths, "*")
			} else {
				paths = append(paths, path[start:end])
			}
			start = i + 1
			isWildcard = false
		}
	}
	return paths
}


================================================
FILE: data/admin.mssql
================================================


CREATE TABLE [goadmin_menu] (
 [id] int   identity(1,1) ,
 [parent_id] int   NOT NULL DEFAULT 0,
 [type] tinyint   NOT NULL DEFAULT 0,
 [order] int   NOT NULL DEFAULT '0',
 [title] varchar(50)   NOT NULL,
 [icon] varchar(50)   NOT NULL,
 [uri] varchar(3000)   NOT NULL DEFAULT '',
 [header] varchar(150)   DEFAULT NULL,
 [uuid] varchar(150)   DEFAULT NULL,
 [plugin_name] varchar(150)   NOT NULL DEFAULT '',
 [created_at] datetime NULL DEFAULT GETDATE(),
 [updated_at] datetime NULL DEFAULT GETDATE(),
 PRIMARY KEY ([id]),
) 
set  IDENTITY_INSERT [goadmin_menu] ON 
INSERT INTO[goadmin_menu] ([id],[parent_id],[type],[order],[title],[icon],[uri],[header],[created_at],[updated_at])
VALUES
	(1,0,1,2,'Admin','fa-tasks','',NULL,'2019-09-10 00:00:00','2019-09-10 00:00:00'),
	(2,1,1,2,'Users','fa-users','/info/manager',NULL,'2019-09-10 00:00:00','2019-09-10 00:00:00'),
	(3,1,1,3,'Roles','fa-user','/info/roles',NULL,'2019-09-10 00:00:00','2019-09-10 00:00:00'),
	(4,1,1,4,'Permission','fa-ban','/info/permission',NULL,'2019-09-10 00:00:00','2019-09-10 00:00:00'),
	(5,1,1,5,'Menu','fa-bars','/menu',NULL,'2019-09-10 00:00:00','2019-09-10 00:00:00'),
	(6,1,1,6,'Operation log','fa-history','/info/op',NULL,'2019-09-10 00:00:00','2019-09-10 00:00:00'),
	(7,0,1,1,'Dashboard','fa-bar-chart','/',NULL,'2019-09-10 00:00:00','2019-09-10 00:00:00');
set  IDENTITY_INSERT [goadmin_menu] OFF 




CREATE TABLE[goadmin_operation_log] (
 [id] int   identity(1,1) ,
 [user_id] int   NOT NULL,
 [path] varchar(255)   NOT NULL,
 [method] varchar(10)   NOT NULL,
 [ip] varchar(15)   NOT NULL,
 [input] text   NOT NULL,
 [created_at] datetime NULL DEFAULT GETDATE(),
 [updated_at] datetime NULL DEFAULT GETDATE(),
  PRIMARY KEY ([id]),
) 


CREATE TABLE[goadmin_site] (
 [id] int   identity(1,1) ,
 [key] varchar(100)   NOT NULL,
 [value] text   NOT NULL,
 [state] tinyint   NOT NULL DEFAULT 0,
 [description] varchar(3000)   DEFAULT NULL,
 [created_at] datetime NULL DEFAULT GETDATE(),
 [updated_at] datetime NULL DEFAULT GETDATE(),
  PRIMARY KEY ([id]),
)


CREATE TABLE[goadmin_permissions] (
 [id] int   identity(1,1) ,
 [name] varchar(50)   NOT NULL,
 [slug] varchar(50)   NOT NULL,
 [http_method] varchar(255)   DEFAULT NULL,
 [http_path] text   NOT NULL,
 [created_at] datetime NULL DEFAULT GETDATE(),
 [updated_at] datetime NULL DEFAULT GETDATE(),
  PRIMARY KEY ([id]),
) 

set  IDENTITY_INSERT [goadmin_permissions] ON 

INSERT INTO[goadmin_permissions] ([id],[name],[slug],[http_method],[http_path],[created_at],[updated_at])
VALUES
	(1,'All permission','*','','*','2019-09-10 00:00:00','2019-09-10 00:00:00'),
	(2,'Dashboard','dashboard','GET,PUT,POST,DELETE','/','2019-09-10 00:00:00','2019-09-10 00:00:00');

set  IDENTITY_INSERT [goadmin_permissions] OFF 




CREATE TABLE[goadmin_role_menu] (
 [role_id] int   NOT NULL,
 [menu_id] int   NOT NULL,
 [created_at] datetime NULL DEFAULT GETDATE(),
 [updated_at] datetime NULL DEFAULT GETDATE(),
 PRIMARY KEY([role_id],[menu_id])
) 



INSERT INTO[goadmin_role_menu] ([role_id],[menu_id],[created_at],[updated_at])
VALUES
	(1,1,'2019-09-10 00:00:00','2019-09-10 00:00:00'),
	(1,7,'2019-09-10 00:00:00','2019-09-10 00:00:00'),
	(2,7,'2019-09-10 00:00:00','2019-09-10 00:00:00'),
	(1,8,'2019-09-11 10:20:55','2019-09-11 10:20:55'),
	(2,8,'2019-09-11 10:20:55','2019-09-11 10:20:55');





CREATE TABLE[goadmin_role_permissions] (
 [role_id] int   NOT NULL,
 [permission_id] int   NOT NULL,
 [created_at] datetime NULL DEFAULT GETDATE(),
 [updated_at] datetime NULL DEFAULT GETDATE(),
  PRIMARY KEY ([role_id],[permission_id])
) 


INSERT INTO[goadmin_role_permissions] ([role_id],[permission_id],[created_at],[updated_at])
VALUES
	(1,1,'2019-09-10 00:00:00','2019-09-10 00:00:00'),
	(1,2,'2019-09-10 00:00:00','2019-09-10 00:00:00'),
	(2,2,'2019-09-10 00:00:00','2019-09-10 00:00:00');




CREATE TABLE[goadmin_role_users] (
 [role_id] int   NOT NULL,
 [user_id] int   NOT NULL,
 [created_at] datetime NULL DEFAULT GETDATE(),
 [updated_at] datetime NULL DEFAULT GETDATE(),
  PRIMARY KEY ([role_id],[user_id])
) 


INSERT INTO[goadmin_role_users] ([role_id],[user_id],[created_at],[updated_at])
VALUES
	(1,1,'2019-09-10 00:00:00','2019-09-10 00:00:00'),
	(2,2,'2019-09-10 00:00:00','2019-09-10 00:00:00');




CREATE TABLE[goadmin_roles] (
 [id] int   identity(1,1) ,
 [name] varchar(50)   NOT NULL UNIQUE,
 [slug] varchar(50)   NOT NULL,
 [created_at] datetime NULL DEFAULT GETDATE(),
 [updated_at] datetime NULL DEFAULT GETDATE(),
  PRIMARY KEY ([id]),
) 

set  IDENTITY_INSERT [goadmin_roles] ON 

INSERT INTO[goadmin_roles] ([id],[name],[slug],[created_at],[updated_at])
VALUES
	(1,'Administrator','administrator','2019-09-10 00:00:00','2019-09-10 00:00:00'),
	(2,'Operator','operator','2019-09-10 00:00:00','2019-09-10 00:00:00');

set  IDENTITY_INSERT [goadmin_roles] OFF


CREATE TABLE[goadmin_session] (
 [id] int   identity(1,1) ,
 [sid] varchar(50)   DEFAULT '',
 [values] varchar(3000)   DEFAULT '',
 [created_at] datetime NULL DEFAULT GETDATE(),
 [updated_at] datetime NULL DEFAULT GETDATE(),
  PRIMARY KEY ([id])
)  




CREATE TABLE[goadmin_user_permissions] (
 [user_id] int   NOT NULL,
 [permission_id] int   NOT NULL,
 [created_at] datetime NULL DEFAULT GETDATE(),
 [updated_at] datetime NULL DEFAULT GETDATE(),
  PRIMARY KEY  ([user_id],[permission_id])
) 


INSERT INTO[goadmin_user_permissions] ([user_id],[permission_id],[created_at],[updated_at])
VALUES
	(1,1,'2019-09-10 00:00:00','2019-09-10 00:00:00'),
	(2,2,'2019-09-10 00:00:00','2019-09-10 00:00:00');





CREATE TABLE[goadmin_users] (
 [id] int   identity(1,1) ,
 [username] varchar(100)   NOT NULL UNIQUE,
 [password] varchar(100)   NOT NULL DEFAULT '',
 [name] varchar(100)   NOT NULL,
 [avatar] varchar(255)   DEFAULT NULL,
 [remember_token] varchar(100)   DEFAULT NULL,
 [created_at] datetime NULL DEFAULT GETDATE(),
 [updated_at] datetime NULL DEFAULT GETDATE(),
  PRIMARY KEY ([id]),
) 

set  IDENTITY_INSERT [goadmin_users] ON 

INSERT INTO[goadmin_users] ([id],[username],[password],[name],[avatar],[remember_token],[created_at],[updated_at])
VALUES
	(1,'admin','$2a$10$U3F/NSaf2kaVbyXTBp7ppOn0jZFyRqXRnYXB.AMioCjXl3Ciaj4oy','admin','','tlNcBVK9AvfYH7WEnwB1RKvocJu8FfRy4um3DJtwdHuJy0dwFsLOgAc0xUfh','2019-09-10 00:00:00','2019-09-10 00:00:00'),
	(2,'operator','$2a$10$rVqkOzHjN2MdlEprRflb1eGP0oZXuSrbJLOmJagFsCd81YZm0bsh.','Operator','',NULL,'2019-09-10 00:00:00','2019-09-10 00:00:00');
set  IDENTITY_INSERT [goadmin_users] OFF 




================================================
FILE: data/admin.pgsql
================================================
--
-- PostgreSQL database dump
--

-- Dumped from database version 9.5.14
-- Dumped by pg_dump version 10.5

SET statement_timeout = 0;
SET lock_timeout = 0;
SET idle_in_transaction_session_timeout = 0;
SET client_encoding = 'UTF8';
SET standard_conforming_strings = on;
SELECT pg_catalog.set_config('search_path', '', false);
SET check_function_bodies = false;
SET client_min_messages = warning;
SET row_security = off;

--
-- Name: plpgsql; Type: EXTENSION; Schema: -; Owner: 
--

CREATE EXTENSION IF NOT EXISTS plpgsql WITH SCHEMA pg_catalog;


--
-- Name: EXTENSION plpgsql; Type: COMMENT; Schema: -; Owner: 
--

COMMENT ON EXTENSION plpgsql IS 'PL/pgSQL procedural language';


--
-- Name: goadmin_menu_myid_seq; Type: SEQUENCE; Schema: public; Owner: postgres
--

CREATE SEQUENCE public.goadmin_menu_myid_seq
    START WITH 1
    INCREMENT BY 1
    NO MINVALUE
    MAXVALUE 99999999
    CACHE 1;


ALTER TABLE public.goadmin_menu_myid_seq OWNER TO postgres;

SET default_tablespace = '';

SET default_with_oids = false;

--
-- Name: goadmin_menu; Type: TABLE; Schema: public; Owner: postgres
--

CREATE TABLE public.goadmin_menu (
    id integer DEFAULT nextval('public.goadmin_menu_myid_seq'::regclass) NOT NULL,
    parent_id integer DEFAULT 0 NOT NULL,
    type integer DEFAULT 0,
    "order" integer DEFAULT 0 NOT NULL,
    title character varying(50) NOT NULL,
    header character varying(100),
    plugin_name character varying(100) NOT NULL,
    icon character varying(50) NOT NULL,
    uri character varying(3000) NOT NULL,
    uuid character varying(100),
    created_at timestamp without time zone DEFAULT now(),
    updated_at timestamp without time zone DEFAULT now()
);


ALTER TABLE public.goadmin_menu OWNER TO postgres;

--
-- Name: goadmin_operation_log_myid_seq; Type: SEQUENCE; Schema: public; Owner: postgres
--

CREATE SEQUENCE public.goadmin_operation_log_myid_seq
    START WITH 1
    INCREMENT BY 1
    NO MINVALUE
    MAXVALUE 99999999
    CACHE 1;


ALTER TABLE public.goadmin_operation_log_myid_seq OWNER TO postgres;

--
-- Name: goadmin_operation_log; Type: TABLE; Schema: public; Owner: postgres
--

CREATE TABLE public.goadmin_operation_log (
    id integer DEFAULT nextval('public.goadmin_operation_log_myid_seq'::regclass) NOT NULL,
    user_id integer NOT NULL,
    path character varying(255) NOT NULL,
    method character varying(10) NOT NULL,
    ip character varying(15) NOT NULL,
    input text NOT NULL,
    created_at timestamp without time zone DEFAULT now(),
    updated_at timestamp without time zone DEFAULT now()
);


ALTER TABLE public.goadmin_operation_log OWNER TO postgres;

--
-- Name: goadmin_site_myid_seq; Type: SEQUENCE; Schema: public; Owner: postgres
--

CREATE SEQUENCE public.goadmin_site_myid_seq
    START WITH 1
    INCREMENT BY 1
    NO MINVALUE
    MAXVALUE 99999999
    CACHE 1;


ALTER TABLE public.goadmin_site_myid_seq OWNER TO postgres;

--
-- Name: goadmin_site; Type: TABLE; Schema: public; Owner: postgres
--

CREATE TABLE public.goadmin_site (
    id integer DEFAULT nextval('public.goadmin_site_myid_seq'::regclass) NOT NULL,
    key character varying(100) NOT NULL,
    value text NOT NULL,
    type integer DEFAULT 0,
    description character varying(3000),
    state integer DEFAULT 0,
    created_at timestamp without time zone DEFAULT now(),
    updated_at timestamp without time zone DEFAULT now()
);


ALTER TABLE public.goadmin_site OWNER TO postgres;

--
-- Name: goadmin_permissions_myid_seq; Type: SEQUENCE; Schema: public; Owner: postgres
--

CREATE SEQUENCE public.goadmin_permissions_myid_seq
    START WITH 1
    INCREMENT BY 1
    NO MINVALUE
    MAXVALUE 99999999
    CACHE 1;


ALTER TABLE public.goadmin_permissions_myid_seq OWNER TO postgres;

--
-- Name: goadmin_permissions; Type: TABLE; Schema: public; Owner: postgres
--

CREATE TABLE public.goadmin_permissions (
    id integer DEFAULT nextval('public.goadmin_permissions_myid_seq'::regclass) NOT NULL,
    name character varying(50) NOT NULL,
    slug character varying(50) NOT NULL,
    http_method character varying(255),
    http_path text NOT NULL,
    created_at timestamp without time zone DEFAULT now(),
    updated_at timestamp without time zone DEFAULT now()
);


ALTER TABLE public.goadmin_permissions OWNER TO postgres;

--
-- Name: goadmin_role_menu; Type: TABLE; Schema: public; Owner: postgres
--

CREATE TABLE public.goadmin_role_menu (
    role_id integer NOT NULL,
    menu_id integer NOT NULL,
    created_at timestamp without time zone DEFAULT now(),
    updated_at timestamp without time zone DEFAULT now()
);


ALTER TABLE public.goadmin_role_menu OWNER TO postgres;

--
-- Name: goadmin_role_permissions; Type: TABLE; Schema: public; Owner: postgres
--

CREATE TABLE public.goadmin_role_permissions (
    role_id integer NOT NULL,
    permission_id integer NOT NULL,
    created_at timestamp without time zone DEFAULT now(),
    updated_at timestamp without time zone DEFAULT now()
);


ALTER TABLE public.goadmin_role_permissions OWNER TO postgres;

--
-- Name: goadmin_role_users; Type: TABLE; Schema: public; Owner: postgres
--

CREATE TABLE public.goadmin_role_users (
    role_id integer NOT NULL,
    user_id integer NOT NULL,
    created_at timestamp without time zone DEFAULT now(),
    updated_at timestamp without time zone DEFAULT now()
);


ALTER TABLE public.goadmin_role_users OWNER TO postgres;

--
-- Name: goadmin_roles_myid_seq; Type: SEQUENCE; Schema: public; Owner: postgres
--

CREATE SEQUENCE public.goadmin_roles_myid_seq
    START WITH 1
    INCREMENT BY 1
    NO MINVALUE
    MAXVALUE 99999999
    CACHE 1;


ALTER TABLE public.goadmin_roles_myid_seq OWNER TO postgres;

--
-- Name: goadmin_roles; Type: TABLE; Schema: public; Owner: postgres
--

CREATE TABLE public.goadmin_roles (
    id integer DEFAULT nextval('public.goadmin_roles_myid_seq'::regclass) NOT NULL,
    name character varying NOT NULL,
    slug character varying NOT NULL,
    created_at timestamp without time zone DEFAULT now(),
    updated_at timestamp without time zone DEFAULT now()
);


ALTER TABLE public.goadmin_roles OWNER TO postgres;

--
-- Name: goadmin_session_myid_seq; Type: SEQUENCE; Schema: public; Owner: postgres
--

CREATE SEQUENCE public.goadmin_session_myid_seq
    START WITH 1
    INCREMENT BY 1
    NO MINVALUE
    MAXVALUE 99999999
    CACHE 1;


ALTER TABLE public.goadmin_session_myid_seq OWNER TO postgres;

--
-- Name: goadmin_session; Type: TABLE; Schema: public; Owner: postgres
--

CREATE TABLE public.goadmin_session (
    id integer DEFAULT nextval('public.goadmin_session_myid_seq'::regclass) NOT NULL,
    sid character varying(50) NOT NULL,
    "values" character varying(3000) NOT NULL,
    created_at timestamp without time zone DEFAULT now(),
    updated_at timestamp without time zone DEFAULT now()
);


ALTER TABLE public.goadmin_session OWNER TO postgres;

--
-- Name: goadmin_user_permissions; Type: TABLE; Schema: public; Owner: postgres
--

CREATE TABLE public.goadmin_user_permissions (
    user_id integer NOT NULL,
    permission_id integer NOT NULL,
    created_at timestamp without time zone DEFAULT now(),
    updated_at timestamp without time zone DEFAULT now()
);


ALTER TABLE public.goadmin_user_permissions OWNER TO postgres;

--
-- Name: goadmin_users_myid_seq; Type: SEQUENCE; Schema: public; Owner: postgres
--

CREATE SEQUENCE public.goadmin_users_myid_seq
    START WITH 1
    INCREMENT BY 1
    NO MINVALUE
    MAXVALUE 99999999
    CACHE 1;


ALTER TABLE public.goadmin_users_myid_seq OWNER TO postgres;

--
-- Name: goadmin_users; Type: TABLE; Schema: public; Owner: postgres
--

CREATE TABLE public.goadmin_users (
    id integer DEFAULT nextval('public.goadmin_users_myid_seq'::regclass) NOT NULL,
    username character varying(100) NOT NULL,
    password character varying(100) NOT NULL,
    name character varying(100) NOT NULL,
    avatar character varying(255),
    remember_token character varying(100),
    created_at timestamp without time zone DEFAULT now(),
    updated_at timestamp without time zone DEFAULT now()
);


ALTER TABLE public.goadmin_users OWNER TO postgres;

--
-- Data for Name: goadmin_menu; Type: TABLE DATA; Schema: public; Owner: postgres
--

COPY public.goadmin_menu (id, parent_id, type, "order", title, plugin_name, header, icon, uri, created_at, updated_at) FROM stdin;
1	0	1	2	Admin		\N	fa-tasks		2019-09-10 00:00:00	2019-09-10 00:00:00
2	1	1	2	Users		\N	fa-users	/info/manager	2019-09-10 00:00:00	2019-09-10 00:00:00
3	1	1	3	Roles		\N	fa-user	/info/roles	2019-09-10 00:00:00	2019-09-10 00:00:00
4	1	1	4	Permission		\N	fa-ban	/info/permission	2019-09-10 00:00:00	2019-09-10 00:00:00
5	1	1	5	Menu		\N	fa-bars	/menu	2019-09-10 00:00:00	2019-09-10 00:00:00
6	1	1	6	Operation log		\N	fa-history	/info/op	2019-09-10 00:00:00	2019-09-10 00:00:00
7	0	1	1	Dashboard		\N	fa-bar-chart	/	2019-09-10 00:00:00	2019-09-10 00:00:00
\.


--
-- Data for Name: goadmin_operation_log; Type: TABLE DATA; Schema: public; Owner: postgres
--

COPY public.goadmin_operation_log (id, user_id, path, method, ip, input, created_at, updated_at) FROM stdin;
\.


--
-- Data for Name: goadmin_site; Type: TABLE DATA; Schema: public; Owner: postgres
--

COPY public.goadmin_site (id, key, value, description, state, created_at, updated_at) FROM stdin;
\.


--
-- Data for Name: goadmin_permissions; Type: TABLE DATA; Schema: public; Owner: postgres
--

COPY public.goadmin_permissions (id, name, slug, http_method, http_path, created_at, updated_at) FROM stdin;
1	All permission	*		*	2019-09-10 00:00:00	2019-09-10 00:00:00
2	Dashboard	dashboard	GET,PUT,POST,DELETE	/	2019-09-10 00:00:00	2019-09-10 00:00:00
\.


--
-- Data for Name: goadmin_role_menu; Type: TABLE DATA; Schema: public; Owner: postgres
--

COPY public.goadmin_role_menu (role_id, menu_id, created_at, updated_at) FROM stdin;
1	1	2019-09-10 00:00:00	2019-09-10 00:00:00
1	7	2019-09-10 00:00:00	2019-09-10 00:00:00
2	7	2019-09-10 00:00:00	2019-09-10 00:00:00
\.


--
-- Data for Name: goadmin_role_permissions; Type: TABLE DATA; Schema: public; Owner: postgres
--

COPY public.goadmin_role_permissions (role_id, permission_id, created_at, updated_at) FROM stdin;
1	1	2019-09-10 00:00:00	2019-09-10 00:00:00
1	2	2019-09-10 00:00:00	2019-09-10 00:00:00
2	2	2019-09-10 00:00:00	2019-09-10 00:00:00
0	3	\N	\N
0	3	\N	\N
0	3	\N	\N
0	3	\N	\N
0	3	\N	\N
0	3	\N	\N
0	3	\N	\N
0	3	\N	\N
0	3	\N	\N
0	3	\N	\N
0	3	\N	\N
0	3	\N	\N
0	3	\N	\N
0	3	\N	\N
0	3	\N	\N
0	3	\N	\N
\.


--
-- Data for Name: goadmin_role_users; Type: TABLE DATA; Schema: public; Owner: postgres
--

COPY public.goadmin_role_users (role_id, user_id, created_at, updated_at) FROM stdin;
1	1	2019-09-10 00:00:00	2019-09-10 00:00:00
2	2	2019-09-10 00:00:00	2019-09-10 00:00:00
\.


--
-- Data for Name: goadmin_roles; Type: TABLE DATA; Schema: public; Owner: postgres
--

COPY public.goadmin_roles (id, name, slug, created_at, updated_at) FROM stdin;
1	Administrator	administrator	2019-09-10 00:00:00	2019-09-10 00:00:00
2	Operator	operator	2019-09-10 00:00:00	2019-09-10 00:00:00
\.


--
-- Data for Name: goadmin_session; Type: TABLE DATA; Schema: public; Owner: postgres
--

COPY public.goadmin_session (id, sid, "values", created_at, updated_at) FROM stdin;
\.


--
-- Data for Name: goadmin_user_permissions; Type: TABLE DATA; Schema: public; Owner: postgres
--

COPY public.goadmin_user_permissions (user_id, permission_id, created_at, updated_at) FROM stdin;
1	1	2019-09-10 00:00:00	2019-09-10 00:00:00
2	2	2019-09-10 00:00:00	2019-09-10 00:00:00
0	1	\N	\N
0	1	\N	\N
0	1	\N	\N
0	1	\N	\N
0	1	\N	\N
0	1	\N	\N
0	1	\N	\N
0	1	\N	\N
0	1	\N	\N
0	1	\N	\N
0	1	\N	\N
0	1	\N	\N
0	1	\N	\N
0	1	\N	\N
0	1	\N	\N
0	1	\N	\N
\.


--
-- Data for Name: goadmin_users; Type: TABLE DATA; Schema: public; Owner: postgres
--

COPY public.goadmin_users (id, username, password, name, avatar, remember_token, created_at, updated_at) FROM stdin;
1	admin	$2a$10$OxWYJJGTP2gi00l2x06QuOWqw5VR47MQCJ0vNKnbMYfrutij10Hwe	admin		tlNcBVK9AvfYH7WEnwB1RKvocJu8FfRy4um3DJtwdHuJy0dwFsLOgAc0xUfh	2019-09-10 00:00:00	2019-09-10 00:00:00
2	operator	$2a$10$rVqkOzHjN2MdlEprRflb1eGP0oZXuSrbJLOmJagFsCd81YZm0bsh.	Operator		\N	2019-09-10 00:00:00	2019-09-10 00:00:00
\.


--
-- Name: goadmin_menu_myid_seq; Type: SEQUENCE SET; Schema: public; Owner: postgres
--

SELECT pg_catalog.setval('public.goadmin_menu_myid_seq', 7, true);


--
-- Name: goadmin_operation_log_myid_seq; Type: SEQUENCE SET; Schema: public; Owner: postgres
--

SELECT pg_catalog.setval('public.goadmin_operation_log_myid_seq', 1, true);


--
-- Name: goadmin_permissions_myid_seq; Type: SEQUENCE SET; Schema: public; Owner: postgres
--

SELECT pg_catalog.setval('public.goadmin_permissions_myid_seq', 2, true);


--
-- Name: goadmin_roles_myid_seq; Type: SEQUENCE SET; Schema: public; Owner: postgres
--

SELECT pg_catalog.setval('public.goadmin_roles_myid_seq', 2, true);


--
-- Name: goadmin_site_myid_seq; Type: SEQUENCE SET; Schema: public; Owner: postgres
--

SELECT pg_catalog.setval('public.goadmin_site_myid_seq', 1, true);


--
-- Name: goadmin_session_myid_seq; Type: SEQUENCE SET; Schema: public; Owner: postgres
--

SELECT pg_catalog.setval('public.goadmin_session_myid_seq', 1, true);


--
-- Name: goadmin_users_myid_seq; Type: SEQUENCE SET; Schema: public; Owner: postgres
--

SELECT pg_catalog.setval('public.goadmin_users_myid_seq', 2, true);


--
-- Name: goadmin_menu goadmin_menu_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres
--

ALTER TABLE ONLY public.goadmin_menu
    ADD CONSTRAINT goadmin_menu_pkey PRIMARY KEY (id);


--
-- Name: goadmin_operation_log goadmin_operation_log_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres
--

ALTER TABLE ONLY public.goadmin_operation_log
    ADD CONSTRAINT goadmin_operation_log_pkey PRIMARY KEY (id);


--
-- Name: goadmin_permissions goadmin_permissions_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres
--

ALTER TABLE ONLY public.goadmin_permissions
    ADD CONSTRAINT goadmin_permissions_pkey PRIMARY KEY (id);


--
-- Name: goadmin_roles goadmin_roles_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres
--

ALTER TABLE ONLY public.goadmin_roles
    ADD CONSTRAINT goadmin_roles_pkey PRIMARY KEY (id);


--
-- Name: goadmin_site goadmin_site_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres
--

ALTER TABLE ONLY public.goadmin_site
    ADD CONSTRAINT goadmin_site_pkey PRIMARY KEY (id);


--
-- Name: goadmin_session goadmin_session_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres
--

ALTER TABLE ONLY public.goadmin_session
    ADD CONSTRAINT goadmin_session_pkey PRIMARY KEY (id);


--
-- Name: goadmin_users goadmin_users_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres
--

ALTER TABLE ONLY public.goadmin_users
    ADD CONSTRAINT goadmin_users_pkey PRIMARY KEY (id);


--
-- Name: SCHEMA public; Type: ACL; Schema: -; Owner: postgres
--

REVOKE ALL ON SCHEMA public FROM PUBLIC;
REVOKE ALL ON SCHEMA public FROM postgres;
GRANT ALL ON SCHEMA public TO postgres;
GRANT ALL ON SCHEMA public TO PUBLIC;


--
-- PostgreSQL database dump complete
--



================================================
FILE: data/admin.sql
================================================
# ************************************************************
# Sequel Pro SQL dump
# Version 4468
#
# http://www.sequelpro.com/
# https://github.com/sequelpro/sequelpro
#
# Host: 127.0.0.1 (MySQL 5.7.19)
# Database: godmin
# Generation Time: 2019-09-12 04:16:47 +0000
# ************************************************************


/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;


# Dump of table goadmin_menu
# ------------------------------------------------------------

DROP TABLE IF EXISTS `goadmin_menu`;

CREATE TABLE `goadmin_menu` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `parent_id` int(11) unsigned NOT NULL DEFAULT '0',
  `type` tinyint(4) unsigned NOT NULL DEFAULT '0',
  `order` int(11) unsigned NOT NULL DEFAULT '0',
  `title` varchar(50) COLLATE utf8mb4_unicode_ci NOT NULL,
  `icon` varchar(50) COLLATE utf8mb4_unicode_ci NOT NULL,
  `uri` varchar(3000) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '',
  `header` varchar(150) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `plugin_name` varchar(150) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '',
  `uuid` varchar(150) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
  `updated_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

LOCK TABLES `goadmin_menu` WRITE;
/*!40000 ALTER TABLE `goadmin_menu` DISABLE KEYS */;

INSERT INTO `goadmin_menu` (`id`, `parent_id`, `type`, `order`, `title`, `icon`, `uri`, `plugin_name`, `header`, `created_at`, `updated_at`)
VALUES
	(1,0,1,2,'Admin','fa-tasks','','',NULL,'2019-09-10 00:00:00','2019-09-10 00:00:00'),
	(2,1,1,2,'Users','fa-users','/info/manager','',NULL,'2019-09-10 00:00:00','2019-09-10 00:00:00'),
	(3,1,1,3,'Roles','fa-user','/info/roles','',NULL,'2019-09-10 00:00:00','2019-09-10 00:00:00'),
	(4,1,1,4,'Permission','fa-ban','/info/permission','',NULL,'2019-09-10 00:00:00','2019-09-10 00:00:00'),
	(5,1,1,5,'Menu','fa-bars','/menu','',NULL,'2019-09-10 00:00:00','2019-09-10 00:00:00'),
	(6,1,1,6,'Operation log','fa-history','/info/op','',NULL,'2019-09-10 00:00:00','2019-09-10 00:00:00'),
	(7,0,1,1,'Dashboard','fa-bar-chart','/','',NULL,'2019-09-10 00:00:00','2019-09-10 00:00:00');

/*!40000 ALTER TABLE `goadmin_menu` ENABLE KEYS */;
UNLOCK TABLES;


# Dump of table goadmin_operation_log
# ------------------------------------------------------------

DROP TABLE IF EXISTS `goadmin_operation_log`;

CREATE TABLE `goadmin_operation_log` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `user_id` int(11) unsigned NOT NULL,
  `path` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
  `method` varchar(10) COLLATE utf8mb4_unicode_ci NOT NULL,
  `ip` varchar(15) COLLATE utf8mb4_unicode_ci NOT NULL,
  `input` text COLLATE utf8mb4_unicode_ci NOT NULL,
  `created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
  `updated_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  KEY `admin_operation_log_user_id_index` (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;


# Dump of table goadmin_site
# ------------------------------------------------------------

DROP TABLE IF EXISTS `goadmin_site`;

CREATE TABLE `goadmin_site` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `key` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `value` longtext COLLATE utf8mb4_unicode_ci,
  `description` varchar(3000) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `state` tinyint(3) unsigned NOT NULL DEFAULT '0',
  `created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
  `updated_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;


# Dump of table goadmin_permissions
# ------------------------------------------------------------

DROP TABLE IF EXISTS `goadmin_permissions`;

CREATE TABLE `goadmin_permissions` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(50) COLLATE utf8mb4_unicode_ci NOT NULL,
  `slug` varchar(50) COLLATE utf8mb4_unicode_ci NOT NULL,
  `http_method` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `http_path` text COLLATE utf8mb4_unicode_ci NOT NULL,
  `created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
  `updated_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  UNIQUE KEY `admin_permissions_name_unique` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

LOCK TABLES `goadmin_permissions` WRITE;
/*!40000 ALTER TABLE `goadmin_permissions` DISABLE KEYS */;

INSERT INTO `goadmin_permissions` (`id`, `name`, `slug`, `http_method`, `http_path`, `created_at`, `updated_at`)
VALUES
	(1,'All permission','*','','*','2019-09-10 00:00:00','2019-09-10 00:00:00'),
	(2,'Dashboard','dashboard','GET,PUT,POST,DELETE','/','2019-09-10 00:00:00','2019-09-10 00:00:00');

/*!40000 ALTER TABLE `goadmin_permissions` ENABLE KEYS */;
UNLOCK TABLES;


# Dump of table goadmin_role_menu
# ------------------------------------------------------------

DROP TABLE IF EXISTS `goadmin_role_menu`;

CREATE TABLE `goadmin_role_menu` (
  `role_id` int(11) unsigned NOT NULL,
  `menu_id` int(11) unsigned NOT NULL,
  `created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
  `updated_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
  KEY `admin_role_menu_role_id_menu_id_index` (`role_id`,`menu_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

LOCK TABLES `goadmin_role_menu` WRITE;
/*!40000 ALTER TABLE `goadmin_role_menu` DISABLE KEYS */;

INSERT INTO `goadmin_role_menu` (`role_id`, `menu_id`, `created_at`, `updated_at`)
VALUES
	(1,1,'2019-09-10 00:00:00','2019-09-10 00:00:00'),
	(1,7,'2019-09-10 00:00:00','2019-09-10 00:00:00'),
	(2,7,'2019-09-10 00:00:00','2019-09-10 00:00:00'),
	(1,8,'2019-09-11 10:20:55','2019-09-11 10:20:55'),
	(2,8,'2019-09-11 10:20:55','2019-09-11 10:20:55');

/*!40000 ALTER TABLE `goadmin_role_menu` ENABLE KEYS */;
UNLOCK TABLES;


# Dump of table goadmin_role_permissions
# ------------------------------------------------------------

DROP TABLE IF EXISTS `goadmin_role_permissions`;

CREATE TABLE `goadmin_role_permissions` (
  `role_id` int(11) unsigned NOT NULL,
  `permission_id` int(11) unsigned NOT NULL,
  `created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
  `updated_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
  UNIQUE KEY `admin_role_permissions` (`role_id`,`permission_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

LOCK TABLES `goadmin_role_permissions` WRITE;
/*!40000 ALTER TABLE `goadmin_role_permissions` DISABLE KEYS */;

INSERT INTO `goadmin_role_permissions` (`role_id`, `permission_id`, `created_at`, `updated_at`)
VALUES
	(1,1,'2019-09-10 00:00:00','2019-09-10 00:00:00'),
	(1,2,'2019-09-10 00:00:00','2019-09-10 00:00:00'),
	(2,2,'2019-09-10 00:00:00','2019-09-10 00:00:00');

/*!40000 ALTER TABLE `goadmin_role_permissions` ENABLE KEYS */;
UNLOCK TABLES;


# Dump of table goadmin_role_users
# ------------------------------------------------------------

DROP TABLE IF EXISTS `goadmin_role_users`;

CREATE TABLE `goadmin_role_users` (
  `role_id` int(11) unsigned NOT NULL,
  `user_id` int(11) unsigned NOT NULL,
  `created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
  `updated_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
  UNIQUE KEY `admin_user_roles` (`role_id`,`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

LOCK TABLES `goadmin_role_users` WRITE;
/*!40000 ALTER TABLE `goadmin_role_users` DISABLE KEYS */;

INSERT INTO `goadmin_role_users` (`role_id`, `user_id`, `created_at`, `updated_at`)
VALUES
	(1,1,'2019-09-10 00:00:00','2019-09-10 00:00:00'),
	(2,2,'2019-09-10 00:00:00','2019-09-10 00:00:00');

/*!40000 ALTER TABLE `goadmin_role_users` ENABLE KEYS */;
UNLOCK TABLES;


# Dump of table goadmin_roles
# ------------------------------------------------------------

DROP TABLE IF EXISTS `goadmin_roles`;

CREATE TABLE `goadmin_roles` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(50) COLLATE utf8mb4_unicode_ci NOT NULL,
  `slug` varchar(50) COLLATE utf8mb4_unicode_ci NOT NULL,
  `created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
  `updated_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  UNIQUE KEY `admin_roles_name_unique` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

LOCK TABLES `goadmin_roles` WRITE;
/*!40000 ALTER TABLE `goadmin_roles` DISABLE KEYS */;

INSERT INTO `goadmin_roles` (`id`, `name`, `slug`, `created_at`, `updated_at`)
VALUES
	(1,'Administrator','administrator','2019-09-10 00:00:00','2019-09-10 00:00:00'),
	(2,'Operator','operator','2019-09-10 00:00:00','2019-09-10 00:00:00');

/*!40000 ALTER TABLE `goadmin_roles` ENABLE KEYS */;
UNLOCK TABLES;


# Dump of table goadmin_session
# ------------------------------------------------------------

DROP TABLE IF EXISTS `goadmin_session`;

CREATE TABLE `goadmin_session` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `sid` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '',
  `values` varchar(3000) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '',
  `created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
  `updated_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;



# Dump of table goadmin_user_permissions
# ------------------------------------------------------------

DROP TABLE IF EXISTS `goadmin_user_permissions`;

CREATE TABLE `goadmin_user_permissions` (
  `user_id` int(11) unsigned NOT NULL,
  `permission_id` int(11) unsigned NOT NULL,
  `created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
  `updated_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
  UNIQUE KEY `admin_user_permissions` (`user_id`,`permission_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

LOCK TABLES `goadmin_user_permissions` WRITE;
/*!40000 ALTER TABLE `goadmin_user_permissions` DISABLE KEYS */;

INSERT INTO `goadmin_user_permissions` (`user_id`, `permission_id`, `created_at`, `updated_at`)
VALUES
	(1,1,'2019-09-10 00:00:00','2019-09-10 00:00:00'),
	(2,2,'2019-09-10 00:00:00','2019-09-10 00:00:00');

/*!40000 ALTER TABLE `goadmin_user_permissions` ENABLE KEYS */;
UNLOCK TABLES;


# Dump of table goadmin_users
# ------------------------------------------------------------

DROP TABLE IF EXISTS `goadmin_users`;

CREATE TABLE `goadmin_users` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `username` varchar(100) COLLATE utf8mb4_unicode_ci NOT NULL,
  `password` varchar(100) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '',
  `name` varchar(100) COLLATE utf8mb4_unicode_ci NOT NULL,
  `avatar` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `remember_token` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
  `updated_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  UNIQUE KEY `admin_users_username_unique` (`username`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

LOCK TABLES `goadmin_users` WRITE;
/*!40000 ALTER TABLE `goadmin_users` DISABLE KEYS */;

INSERT INTO `goadmin_users` (`id`, `username`, `password`, `name`, `avatar`, `remember_token`, `created_at`, `updated_at`)
VALUES
	(1,'admin','$2a$10$U3F/NSaf2kaVbyXTBp7ppOn0jZFyRqXRnYXB.AMioCjXl3Ciaj4oy','admin','','tlNcBVK9AvfYH7WEnwB1RKvocJu8FfRy4um3DJtwdHuJy0dwFsLOgAc0xUfh','2019-09-10 00:00:00','2019-09-10 00:00:00'),
	(2,'operator','$2a$10$rVqkOzHjN2MdlEprRflb1eGP0oZXuSrbJLOmJagFsCd81YZm0bsh.','Operator','',NULL,'2019-09-10 00:00:00','2019-09-10 00:00:00');

/*!40000 ALTER TABLE `goadmin_users` ENABLE KEYS */;
UNLOCK TABLES;



/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;


================================================
FILE: data/migrations/admin_2020_04_14_100427_ms.sql
================================================
CREATE TABLE[goadmin_site] (
 [id] int   identity(1,1) ,
 [key] varchar(100)   NOT NULL,
 [value] text   NOT NULL,
 [state] tinyint   NOT NULL DEFAULT 0,
 [description] varchar(3000)   NOT NULL,
 [created_at] datetime NULL DEFAULT GETDATE(),
 [updated_at] datetime NULL DEFAULT GETDATE(),
  PRIMARY KEY ([id]),
)


================================================
FILE: data/migrations/admin_2020_04_14_100427_mysql.sql
================================================
CREATE TABLE `goadmin_site` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `key` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `value` longtext COLLATE utf8mb4_unicode_ci,
  `description` varchar(3000) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
  `state` tinyint(3) unsigned NOT NULL DEFAULT '0',
  `created_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
  `updated_at` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

================================================
FILE: data/migrations/admin_2020_04_14_100427_postgres.sql
================================================
--
-- PostgreSQL database dump
--

-- Dumped from database version 9.5.14
-- Dumped by pg_dump version 10.5

SET statement_timeout = 0;
SET lock_timeout = 0;
SET idle_in_transaction_session_timeout = 0;
SET client_encoding = 'EUC_CN';
SET standard_conforming_strings = on;
SELECT pg_catalog.set_config('search_path', '', false);
SET check_function_bodies = false;
SET client_min_messages = warning;
SET row_security = off;

SET default_tablespace = '';

SET default_with_oids = false;

--
-- Name: goadmin_site_myid_seq; Type: SEQUENCE; Schema: public; Owner: postgres
--

CREATE SEQUENCE public.goadmin_site_myid_seq
    START WITH 1
    INCREMENT BY 1
    NO MINVALUE
    MAXVALUE 99999999
    CACHE 1;

ALTER TABLE public.goadmin_site_myid_seq OWNER TO postgres;

--
-- Name: goadmin_site; Type: TABLE; Schema: public; Owner: postgres
--

CREATE TABLE public.goadmin_site (
    id integer DEFAULT nextval('public.goadmin_site_myid_seq'::regclass) NOT NULL,
    key character varying(100) NOT NULL,
    value text NOT NULL,
    type integer DEFAULT 0,
    description character varying(3000),
    state integer DEFAULT 0,
    created_at timestamp without time zone DEFAULT now(),
    updated_at timestamp without time zone DEFAULT now()
);


ALTER TABLE public.goadmin_site OWNER TO postgres;

--
-- Data for Name: goadmin_site; Type: TABLE DATA; Schema: public; Owner: postgres
--

COPY public.goadmin_site (id, key, value, type, description, state, created_at, updated_at) FROM stdin;
\.


--
-- Name: goadmin_site goadmin_site_pkey; Type: CONSTRAINT; Schema: public; Owner: postgres
--

ALTER TABLE ONLY public.goadmin_site
    ADD CONSTRAINT goadmin_site_pkey PRIMARY KEY (id);


--
-- PostgreSQL database dump complete
--



================================================
FILE: data/migrations/admin_2020_04_14_100427_sqlite.sql
================================================
CREATE TABLE IF NOT EXISTS "goadmin_site" (
`id` integer PRIMARY KEY autoincrement,
`key` CHAR(100) COLLATE NOCASE NOT NULL,
`value` text COLLATE NOCASE NOT NULL,
`state` INT NOT NULL DEFAULT '0',
`description` CHAR(3000) COLLATE NOCASE,
`created_at` TIMESTAMP default CURRENT_TIMESTAMP,
`updated_at` TIMESTAMP default CURRENT_TIMESTAMP
);

================================================
FILE: data/migrations/admin_2020_08_04_092427_ms.sql
================================================
ALTER TABLE goadmin_menu
ADD plugin_name varchar(150) NOT NULL DEFAULT '',
ADD uuid varchar(150) NOT NULL DEFAULT '';

================================================
FILE: data/migrations/admin_2020_08_04_092427_mysql.sql
================================================
ALTER TABLE goadmin_menu
ADD COLUMN `uuid` varchar(150) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '',
ADD COLUMN `plugin_name` varchar(150) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '';

================================================
FILE: data/migrations/admin_2020_08_04_092427_postgres.sql
================================================
ALTER TABLE goadmin_menu
ADD COLUMN plugin_name character varying(150) NOT NULL DEFAULT '',
ADD COLUMN uuid character varying(150) NOT NULL DEFAULT '';

================================================
FILE: data/migrations/admin_2020_08_04_092427_sqlite.sql
================================================
ALTER TABLE goadmin_menu
ADD COLUMN `uuid` varchar(150) NOT NULL DEFAULT '',
ADD COLUMN `plugin_name` varchar(150) NOT NULL DEFAULT '';

================================================
FILE: docker-compose.yml
================================================
version: "3.3"
services:
  mysql:
    image: mysql:5.6
    container_name: mysql
    ports:
      - "3306:3306"
    volumes:
      - mysql:/data
    networks:
      - goadmin
    environment:
      - MYSQL_ROOT_PASSWORD=goadmin
  postgres:
    image: postgres:latest
    container_name: postgres
    ports:
      - "5432:5432"
    volumes:
      - postgres:/data
    networks:
      - goadmin
    environment:
      - POSTGRES_PASSWORD=goadmin
  goadmin:
    image: josingcjx/goadmin:1.1
    tty: true
    container_name: goadmin
    volumes:
      - .:/home/goadmin
    networks:
      - goadmin
    command:
      - /bin/bash
  portainer:
    image: portainer/portainer:latest
    container_name: portainer
    restart: always
    ports:
      - "9000:9000"
    networks:
      - goadmin
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - portainer:/data
networks:
  goadmin: {}
volumes:
  portainer: {}
  postgres: {}
  mysql: {}


================================================
FILE: engine/engine.go
================================================
// Copyright 2019 GoAdmin Core Team. All rights reserved.
// Use of this source code is governed by a Apache-2.0 style
// license that can be found in the LICENSE file.

package engine

import (
	"bytes"
	"encoding/json"
	errors2 "errors"
	"fmt"
	template2 "html/template"
	"net/http"
	"runtime/debug"
	"strings"
	"sync"

	"github.com/GoAdminGroup/go-admin/modules/language"
	"github.com/GoAdminGroup/go-admin/template/icon"
	"github.com/GoAdminGroup/go-admin/template/types/action"

	"github.com/GoAdminGroup/go-admin/adapter"
	"github.com/GoAdminGroup/go-admin/context"
	"github.com/GoAdminGroup/go-admin/modules/auth"
	"github.com/GoAdminGroup/go-admin/modules/config"
	"github.com/GoAdminGroup/go-admin/modules/db"
	"github.com/GoAdminGroup/go-admin/modules/errors"
	"github.com/GoAdminGroup/go-admin/modules/logger"
	"github.com/GoAdminGroup/go-admin/modules/menu"
	"github.com/GoAdminGroup/go-admin/modules/service"
	"github.com/GoAdminGroup/go-admin/modules/system"
	"github.com/GoAdminGroup/go-admin/modules/ui"
	"github.com/GoAdminGroup/go-admin/plugins"
	"github.com/GoAdminGroup/go-admin/plugins/admin"
	"github.com/GoAdminGroup/go-admin/plugins/admin/models"
	"github.com/GoAdminGroup/go-admin/plugins/admin/modules/response"
	"github.com/GoAdminGroup/go-admin/plugins/admin/modules/table"
	"github.com/GoAdminGroup/go-admin/template"
	"github.com/GoAdminGroup/go-admin/template/types"
)

// Engine is the core component of goAdmin. It has two attributes.
// PluginList is an array of plugin. Adapter is the adapter of
// web framework context and goAdmin context. The relationship of adapter and
// plugin is that the adapter use the plugin which contains routers and
// controller methods to inject into the framework entity and make it work.
type Engine struct {
	PluginList   plugins.Plugins
	Adapter      adapter.WebFrameWork
	Services     service.List
	NavButtons   *types.Buttons
	config       *config.Config
	announceLock sync.Once
}

// Default return the default engine instance.
func Default() *Engine {
	engine = &Engine{
		Adapter:    defaultAdapter,
		Services:   service.GetServices(),
		NavButtons: new(types.Buttons),
	}
	return engine
}

// Use enable the adapter.
func (eng *Engine) Use(router interface{}) error {
	if eng.Adapter == nil {
		emptyAdapterPanic()
	}

	eng.Services.Add(auth.InitCSRFTokenSrv(eng.DefaultConnection()))
	eng.initSiteSetting()
	eng.initJumpNavButtons()
	eng.initPlugins()

	printInitMsg(language.Get("initialize success"))

	return eng.Adapter.Use(router, eng.PluginList)
}

// AddPlugins add the plugins
func (eng *Engine) AddPlugins(plugs ...plugins.Plugin) *Engine {

	if len(plugs) == 0 {
		return eng
	}

	for _, plug := range plugs {
		eng.PluginList = eng.PluginList.Add(plug)
	}

	return eng
}

// AddPluginList add the plugins
func (eng *Engine) AddPluginList(plugs plugins.Plugins) *Engine {

	if len(plugs) == 0 {
		return eng
	}

	for _, plug := range plugs {
		eng.PluginList = eng.PluginList.Add(plug)
	}

	return eng
}

// FindPluginByName find the register plugin by given name.
func (eng *Engine) FindPluginByName(name string) (plugins.Plugin, bool) {
	for _, plug := range eng.PluginList {
		if plug.Name() == name {
			return plug, true
		}
	}
	return nil, false
}

// AddAuthService customize the auth logic with given callback function.
func (eng *Engine) AddAuthService(processor auth.Processor) *Engine {
	eng.Services.Add("auth", auth.NewService(processor))
	return eng
}

// ============================
// Config APIs
// ============================

func (eng *Engine) announce() *Engine {
	if eng.config.Debug {
		eng.announceLock.Do(func() {
			fmt.Printf(language.Get("goadmin is now running. \nrunning in \"debug\" mode. switch to \"release\" mode in production.\n\n"))
		})
	}
	return eng
}

// AddConfig set the global config.
func (eng *Engine) AddConfig(cfg *config.Config) *Engine {
	return eng.setConfig(cfg).announce().initDatabase()
}

// setConfig set the config of engine.
func (eng *Engine) setConfig(cfg *config.Config) *Engine {
	eng.config = config.Initialize(cfg)
	sysCheck, themeCheck := template.CheckRequirements()
	if !sysCheck {
		logger.Panicf(language.Get("wrong goadmin version, theme %s required goadmin version are %s"),
			eng.config.Theme, strings.Join(template.Default().GetRequirements(), ","))
	}
	if !themeCheck {
		logger.Panicf(language.Get("wrong theme version, goadmin %s required version of theme %s is %s"),
			system.Version(), eng.config.Theme, strings.Join(system.RequireThemeVersion()[eng.config.Theme], ","))
	}
	return eng
}

// AddConfigFromJSON set the global config from json file.
func (eng *Engine) AddConfigFromJSON(path string) *Engine {
	cfg := config.ReadFromJson(path)
	return eng.setConfig(&cfg).announce().initDatabase()
}

// AddConfigFromYAML set the global config from yaml file.
func (eng *Engine) AddConfigFromYAML(path string) *Engine {
	cfg := config.ReadFromYaml(path)
	return eng.setConfig(&cfg).announce().initDatabase()
}

// AddConfigFromINI set the global config from ini file.
func (eng *Engine) AddConfigFromINI(path string) *Engine {
	cfg := config.ReadFromINI(path)
	return eng.setConfig(&cfg).announce().initDatabase()
}

// InitDatabase initialize all database connection.
func (eng *Engine) initDatabase() *Engine {
	printInitMsg(language.Get("initialize database connections"))
	for driver, databaseCfg := range eng.config.Databases.GroupByDriver() {
		eng.Services.Add(driver, db.GetConnectionByDriver(driver).InitDB(databaseCfg))
	}
	if defaultAdapter == nil {
		emptyAdapterPanic()
	}
	defaultConnection := db.GetConnection(eng.Services)
	defaultAdapter.SetConnection(defaultConnection)
	eng.Adapter.SetConnection(defaultConnection)
	return eng
}

// AddAdapter add the adapter of engine.
func (eng *Engine) AddAdapter(ada adapter.WebFrameWork) *Engine {
	eng.Adapter = ada
	defaultAdapter = ada
	return eng
}

// defaultAdapter is the default adapter of engine.
var defaultAdapter adapter.WebFrameWork

var engine *Engine

// navButtons is the default buttons in the navigation bar.
var navButtons = new(types.Buttons)

func emptyAdapterPanic() {
	logger.Panic(language.Get("adapter is nil, import the default adapter or use addadapter method add the adapter"))
}

// Register set default adapter of engine.
func Register(ada adapter.WebFrameWork) {
	if ada == nil {
		emptyAdapterPanic()
	}
	defaultAdapter = ada
}

// User call the User method of defaultAdapter.
func User(ctx interface{}) (models.UserModel, bool) {
	return defaultAdapter.User(ctx)
}

// User call the User method of engine adapter.
func (eng *Engine) User(ctx interface{}) (models.UserModel, bool) {
	return eng.Adapter.User(ctx)
}

// ============================
// DB Connection APIs
// ============================

// DB return the db connection of given driver.
func (eng *Engine) DB(driver string) db.Connection {
	return db.GetConnectionFromService(eng.Services.Get(driver))
}

// DefaultConnection return the default db connection.
func (eng *Engine) DefaultConnection() db.Connection {
	return eng.DB(eng.config.Databases.GetDefault().Driver)
}

// MysqlConnection return the mysql db connection of given driver.
func (eng *Engine) MysqlConnection() db.Connection {
	return db.GetConnectionFromService(eng.Services.Get(db.DriverMysql))
}

// MssqlConnection return the mssql db connection of given driver.
func (eng *Engine) MssqlConnection() db.Connection {
	return db.GetConnectionFromService(eng.Services.Get(db.DriverMssql))
}

// PostgresqlConnection return the postgresql db connection of given driver.
func (eng *Engine) PostgresqlConnection() db.Connection {
	return db.GetConnectionFromService(eng.Services.Get(db.DriverPostgresql))
}

// SqliteConnection return the sqlite db connection of given driver.
func (eng *Engine) SqliteConnection() db.Connection {
	return db.GetConnectionFromService(eng.Services.Get(db.DriverSqlite))
}

// OceanBaseConnection return the OceanBase db connection of given driver.
func (eng *Engine) OceanBaseConnection() db.Connection {
	return db.GetConnectionFromService(eng.Services.Get(db.DriverOceanBase))
}

type ConnectionSetter func(db.Connection)

// ResolveConnection resolve the specified driver connection.
func (eng *Engine) ResolveConnection(setter ConnectionSetter, driver string) *Engine {
	setter(eng.DB(driver))
	return eng
}

// ResolveMysqlConnection resolve the mysql connection.
func (eng *Engine) ResolveMysqlConnection(setter ConnectionSetter) *Engine {
	eng.ResolveConnection(setter, db.DriverMysql)
	return eng
}

// ResolveMssqlConnection resolve the mssql connection.
func (eng *Engine) ResolveMssqlConnection(setter ConnectionSetter) *Engine {
	eng.ResolveConnection(setter, db.DriverMssql)
	return eng
}

// ResolveSqliteConnection resolve the sqlite connection.
func (eng *Engine) ResolveSqliteConnection(setter ConnectionSetter) *Engine {
	eng.ResolveConnection(setter, db.DriverSqlite)
	return eng
}

// ResolvePostgresqlConnection resolve the postgres connection.
func (eng *Engine) ResolvePostgresqlConnection(setter ConnectionSetter) *Engine {
	eng.ResolveConnection(setter, db.DriverPostgresql)
	return eng
}

type Setter func(*Engine)

// Clone copy a new Engine.
func (eng *Engine) Clone(e *Engine) *Engine {
	e = eng
	return eng
}

// ClonedBySetter copy a new Engine by a setter callback function.
func (eng *Engine) ClonedBySetter(setter Setter) *Engine {
	setter(eng)
	return eng
}

func (eng *Engine) deferHandler(conn db.Connection) context.Handler {
	return func(ctx *context.Context) {
		defer func(ctx *context.Context) {
			if user, ok := ctx.UserValue["user"].(models.UserModel); ok {
				var input []byte
				form := ctx.Request.MultipartForm
				if form != nil {
					input, _ = json.Marshal((*form).Value)
				}

				models.OperationLog().SetConn(conn).New(user.Id, ctx.Path(), ctx.Method(), ctx.LocalIP(), string(input))
			}

			if err := recover(); err != nil {
				logger.Error(err)
				logger.Error(string(debug.Stack()))

				var (
					errMsg string
					ok     bool
					e      error
				)

				if errMsg, ok = err.(string); !ok {
					if e, ok = err.(error); ok {
						errMsg = e.Error()
					}
				}

				if errMsg == "" {
					errMsg = "system error"
				}

				if ctx.WantJSON() {
					response.Error(ctx, errMsg)
					return
				}

				eng.errorPanelHTML(ctx, new(bytes.Buffer), errors2.New(errMsg))
			}
		}(ctx)
		ctx.Next()
	}
}

// wrapWithAuthMiddleware wrap a auth middleware to the given handler.
func (eng *Engine) wrapWithAuthMiddleware(handler context.Handler) context.Handlers {
	conn := db.GetConnection(eng.Services)
	return []context.Handler{eng.deferHandler(conn), response.OffLineHandler, auth.Middleware(conn), handler}
}

// wrapWithAuthMiddleware wrap a auth middleware to the given handler.
func (eng *Engine) wrap(handler context.Handler) context.Handlers {
	conn := db.GetConnection(eng.Services)
	return []context.Handler{eng.deferHandler(conn), response.OffLineHandler, handler}
}

// ============================
// Initialize methods
// ============================

// AddNavButtons add the nav buttons.
func (eng *Engine) AddNavButtons(title template2.HTML, icon string, action types.Action) *Engine {
	btn := types.GetNavButton(title, icon, action)
	*eng.NavButtons = append(*eng.NavButtons, btn)
	return eng
}

// AddNavButtonsRaw add the nav buttons.
func (eng *Engine) AddNavButtonsRaw(btns ...types.Button) *Engine {
	*eng.NavButtons = append(*eng.NavButtons, btns...)
	return eng
}

type navJumpButtonParam struct {
	Exist      bool
	Icon       string
	BtnName    string
	URL        string
	Title      string
	TitleScore string
}

func (eng *Engine) addJumpNavButton(param navJumpButtonParam) *Engine {
	if param.Exist {
		*eng.NavButtons = (*eng.NavButtons).AddNavButton(param.Icon, param.BtnName,
			action.JumpInNewTab(config.Url(param.URL),
				language.GetWithScope(param.Title, param.TitleScore)))
	}
	return eng
}

func printInitMsg(msg string) {
	logger.Info(msg)
}

func (eng *Engine) initJumpNavButtons() {
	printInitMsg(language.Get("initialize navigation buttons"))
	for _, param := range eng.initNavJumpButtonParams() {
		eng.addJumpNavButton(param)
	}
	navButtons = eng.NavButtons
	eng.Services.Add(ui.ServiceKey, ui.NewService(eng.NavButtons))
}

func (eng *Engine) initPlugins() {

	printInitMsg(language.Get("initialize plugins"))

	eng.AddPlugins(admin.NewAdmin()).AddPluginList(plugins.Get())

	var plugGenerators = make(table.GeneratorList)

	for i := range eng.PluginList {
		if eng.PluginList[i].Name() != "admin" {
			printInitMsg("--> " + eng.PluginList[i].Name())
			eng.PluginList[i].InitPlugin(eng.Services)
			if !eng.PluginList[i].GetInfo().SkipInstallation {
				eng.AddGenerator("plugin_"+eng.PluginList[i].Name(), eng.PluginList[i].GetSettingPage())
			}
			plugGenerators = plugGenerators.Combine(eng.PluginList[i].GetGenerators())
		}
	}
	adm := eng.AdminPlugin().AddGenerators(plugGenerators)
	adm.InitPlugin(eng.Services)
	plugins.Add(adm)
}

func (eng *Engine) initNavJumpButtonParams() []navJumpButtonParam {
	return []navJumpButtonParam{
		{
			Exist:      !eng.config.HideConfigCenterEntrance,
			Icon:       icon.Gear,
			BtnName:    types.NavBtnSiteName,
			URL:        "/info/site/edit",
			Title:      "site setting",
			TitleScore: "config",
		}, {
			Exist:      !eng.config.HideToolEntrance && eng.config.IsNotProductionEnvironment(),
			Icon:       icon.Wrench,
			BtnName:    types.NavBtnToolName,
			URL:        "/info/generate/new",
			Title:      "code generate tool",
			TitleScore: "tool",
		}, {
			Exist:      !eng.config.HideAppInfoEntrance,
			Icon:       icon.Info,
			BtnName:    types.NavBtnInfoName,
			URL:        "/application/info",
			Title:      "site info",
			TitleScore: "system",
		}, {
			Exist:      !eng.config.HidePluginEntrance,
			Icon:       icon.Th,
			BtnName:    types.NavBtnPlugName,
			URL:        "/plugins",
			Title:      "plugins",
			TitleScore: "plugin",
		},
	}
}

func (eng *Engine) initSiteSetting() {

	printInitMsg(language.Get("initialize configuration"))

	err := eng.config.Update(models.Site().
		SetConn(eng.DefaultConnection()).
		Init(eng.config.ToMap()).
		AllToMap())
	if err != nil {
		logger.Panic(err)
	}
	eng.Services.Add("config", config.SrvWithConfig(eng.config))

	errors.Init()
}

// ============================
// HTML Content Render APIs
// ============================

// Content call the Content method of engine adapter.
// If adapter is nil, it will panic.
func (eng *Engine) Content(ctx interface{}, panel types.GetPanelFn) {
	if eng.Adapter == nil {
		emptyAdapterPanic()
	}
	eng.Adapter.Content(ctx, panel, eng.AdminPlugin().GetAddOperationFn(), *eng.NavButtons...)
}

// Content call the Content method of defaultAdapter.
// If defaultAd
Download .txt
gitextract_hu_9kfne/

├── .deepsource.toml
├── .drone.yml
├── .github/
│   ├── FUNDING.yml
│   └── ISSUE_TEMPLATE/
│       ├── bug_report.md
│       ├── bug_report_zh.md
│       ├── proposal.md
│       ├── proposal_zh.md
│       ├── questions.md
│       └── questions_zh.md
├── .gitignore
├── CODE_OF_CONDUCT.md
├── CONTRIBUTING.md
├── CONTRIBUTING_CN.md
├── DONATION.md
├── Dockerfile
├── LICENSE
├── Makefile
├── README.md
├── README_CN.md
├── SECURITY.md
├── adapter/
│   ├── adapter.go
│   ├── beego/
│   │   └── beego.go
│   ├── beego2/
│   │   └── beego2.go
│   ├── buffalo/
│   │   └── buffalo.go
│   ├── chi/
│   │   └── chi.go
│   ├── echo/
│   │   └── echo.go
│   ├── fasthttp/
│   │   └── fasthttp.go
│   ├── gear/
│   │   └── gear.go
│   ├── gf/
│   │   └── gf.go
│   ├── gf2/
│   │   └── gf2.go
│   ├── gin/
│   │   └── gin.go
│   ├── gofiber/
│   │   └── gofiber.go
│   ├── gorilla/
│   │   └── gorilla.go
│   ├── iris/
│   │   └── iris.go
│   └── nethttp/
│       └── nethttp.go
├── context/
│   ├── context.go
│   ├── context_test.go
│   └── trie.go
├── data/
│   ├── admin.mssql
│   ├── admin.pgsql
│   ├── admin.sql
│   └── migrations/
│       ├── admin_2020_04_14_100427_ms.sql
│       ├── admin_2020_04_14_100427_mysql.sql
│       ├── admin_2020_04_14_100427_postgres.sql
│       ├── admin_2020_04_14_100427_sqlite.sql
│       ├── admin_2020_08_04_092427_ms.sql
│       ├── admin_2020_08_04_092427_mysql.sql
│       ├── admin_2020_08_04_092427_postgres.sql
│       └── admin_2020_08_04_092427_sqlite.sql
├── docker-compose.yml
├── engine/
│   └── engine.go
├── examples/
│   ├── beego/
│   │   └── main.go
│   ├── beego2/
│   │   └── main.go
│   ├── buffalo/
│   │   └── main.go
│   ├── chi/
│   │   └── main.go
│   ├── datamodel/
│   │   ├── authors.go
│   │   ├── bootstrap.go
│   │   ├── config.json
│   │   ├── content.go
│   │   ├── goadmin_super_users.go
│   │   ├── mysql_types.go
│   │   ├── posts.go
│   │   ├── tables.go
│   │   └── user.go
│   ├── echo/
│   │   └── main.go
│   ├── fasthttp/
│   │   └── main.go
│   ├── gear/
│   │   └── main.go
│   ├── gf/
│   │   └── main.go
│   ├── gf2/
│   │   └── main.go
│   ├── gin/
│   │   └── main.go
│   ├── gofiber/
│   │   └── main.go
│   ├── gorilla/
│   │   └── main.go
│   ├── iris/
│   │   └── main.go
│   └── nethttp/
│       └── main.go
├── go.mod
├── go.sum
├── modules/
│   ├── auth/
│   │   ├── auth.go
│   │   ├── auth_test.go
│   │   ├── middleware.go
│   │   ├── middleware_test.go
│   │   └── session.go
│   ├── collection/
│   │   ├── collection.go
│   │   └── collection_test.go
│   ├── config/
│   │   ├── config.go
│   │   ├── config.ini
│   │   ├── config.yaml
│   │   └── config_test.go
│   ├── constant/
│   │   └── constant.go
│   ├── db/
│   │   ├── base.go
│   │   ├── connection.go
│   │   ├── converter.go
│   │   ├── dialect/
│   │   │   ├── common.go
│   │   │   ├── dialect.go
│   │   │   ├── mssql.go
│   │   │   ├── mysql.go
│   │   │   ├── oceanbase.go
│   │   │   ├── postgresql.go
│   │   │   └── sqlite.go
│   │   ├── drivers/
│   │   │   ├── mssql/
│   │   │   │   └── mssql.go
│   │   │   ├── mysql/
│   │   │   │   └── mysql.go
│   │   │   ├── oceanbase/
│   │   │   │   └── oceanbase.go
│   │   │   ├── postgres/
│   │   │   │   └── postgres.go
│   │   │   └── sqlite/
│   │   │       └── sqlite.go
│   │   ├── mssql.go
│   │   ├── mysql.go
│   │   ├── oceanbase.go
│   │   ├── performer.go
│   │   ├── postgresql.go
│   │   ├── sqlite.go
│   │   ├── statement.go
│   │   ├── statement_mssql_test.go
│   │   ├── statement_mysql_test.go
│   │   ├── statement_postgresql_test.go
│   │   ├── statement_sqlite_test.go
│   │   ├── statement_test.go
│   │   ├── types.go
│   │   └── types_test.go
│   ├── errors/
│   │   └── error.go
│   ├── file/
│   │   ├── file.go
│   │   └── local.go
│   ├── language/
│   │   ├── cn.go
│   │   ├── en.go
│   │   ├── jp.go
│   │   ├── language.go
│   │   ├── language_test.go
│   │   ├── pt-BR.go
│   │   ├── ru.go
│   │   └── tc.go
│   ├── logger/
│   │   ├── logger.go
│   │   └── logger_test.go
│   ├── menu/
│   │   ├── menu.go
│   │   └── menu_test.go
│   ├── page/
│   │   └── page.go
│   ├── remote_server/
│   │   └── remote_server.go
│   ├── service/
│   │   └── service.go
│   ├── system/
│   │   ├── application.go
│   │   └── version.go
│   ├── trace/
│   │   └── trace.go
│   ├── ui/
│   │   └── ui.go
│   └── utils/
│       ├── utils.go
│       └── utils_test.go
├── plugins/
│   ├── admin/
│   │   ├── admin.go
│   │   ├── controller/
│   │   │   ├── Update.go
│   │   │   ├── api_create.go
│   │   │   ├── api_detail.go
│   │   │   ├── api_list.go
│   │   │   ├── api_update.go
│   │   │   ├── auth.go
│   │   │   ├── common.go
│   │   │   ├── common_test.go
│   │   │   ├── delete.go
│   │   │   ├── detail.go
│   │   │   ├── edit.go
│   │   │   ├── handler.go
│   │   │   ├── install.go
│   │   │   ├── menu.go
│   │   │   ├── new.go
│   │   │   ├── operation.go
│   │   │   ├── plugins.go
│   │   │   ├── plugins_tmpl.go
│   │   │   ├── show.go
│   │   │   └── system.go
│   │   ├── data/
│   │   │   └── mysql/
│   │   │       └── admin.sql
│   │   ├── models/
│   │   │   ├── base.go
│   │   │   ├── menu.go
│   │   │   ├── operation_log.go
│   │   │   ├── permission.go
│   │   │   ├── role.go
│   │   │   ├── site.go
│   │   │   └── user.go
│   │   ├── modules/
│   │   │   ├── captcha/
│   │   │   │   └── captcha.go
│   │   │   ├── constant/
│   │   │   │   └── constant.go
│   │   │   ├── form/
│   │   │   │   └── form.go
│   │   │   ├── guard/
│   │   │   │   ├── delete.go
│   │   │   │   ├── edit.go
│   │   │   │   ├── export.go
│   │   │   │   ├── guard.go
│   │   │   │   ├── menu_delete.go
│   │   │   │   ├── menu_edit.go
│   │   │   │   ├── menu_new.go
│   │   │   │   ├── new.go
│   │   │   │   ├── server_login.go
│   │   │   │   └── update.go
│   │   │   ├── helper.go
│   │   │   ├── helper_test.go
│   │   │   ├── paginator/
│   │   │   │   ├── paginator.go
│   │   │   │   └── paginator_test.go
│   │   │   ├── parameter/
│   │   │   │   ├── parameter.go
│   │   │   │   └── parameter_test.go
│   │   │   ├── response/
│   │   │   │   └── response.go
│   │   │   ├── table/
│   │   │   │   ├── config.go
│   │   │   │   ├── default.go
│   │   │   │   ├── default_test.go
│   │   │   │   ├── generators.go
│   │   │   │   ├── table.go
│   │   │   │   ├── tmpl/
│   │   │   │   │   ├── choose_table_ajax.tmpl
│   │   │   │   │   └── generator.tmpl
│   │   │   │   └── tmpl.go
│   │   │   └── tools/
│   │   │       ├── generator.go
│   │   │       └── template.go
│   │   └── router.go
│   ├── example/
│   │   ├── controller.go
│   │   ├── example.go
│   │   ├── go_plugin/
│   │   │   ├── Makefile
│   │   │   └── main.go
│   │   └── router.go
│   ├── plugins.go
│   └── plugins_test.go
├── template/
│   ├── chartjs/
│   │   ├── assets.go
│   │   ├── assets_list.go
│   │   ├── bar.go
│   │   ├── chart.go
│   │   ├── chartjs.tmpl
│   │   ├── line.go
│   │   ├── pie.go
│   │   ├── radar.go
│   │   └── template.go
│   ├── color/
│   │   └── color.go
│   ├── components/
│   │   ├── alert.go
│   │   ├── base.go
│   │   ├── box.go
│   │   ├── button.go
│   │   ├── col.go
│   │   ├── composer.go
│   │   ├── form.go
│   │   ├── image.go
│   │   ├── label.go
│   │   ├── link.go
│   │   ├── paninator.go
│   │   ├── popup.go
│   │   ├── product.go
│   │   ├── row.go
│   │   ├── table.go
│   │   ├── tabs.go
│   │   ├── tree.go
│   │   └── treeview.go
│   ├── icon/
│   │   └── icon.go
│   ├── installation/
│   │   ├── Makefile
│   │   ├── assets/
│   │   │   └── src/
│   │   │       ├── css/
│   │   │       │   ├── main.css
│   │   │       │   └── noscript.css
│   │   │       ├── fonts/
│   │   │       │   └── FontAwesome.otf
│   │   │       └── js/
│   │   │           └── main.js
│   │   ├── assets.go
│   │   ├── assets_list.go
│   │   ├── installation.go
│   │   ├── installation.tmpl
│   │   └── template.go
│   ├── login/
│   │   ├── Makefile
│   │   ├── assets/
│   │   │   └── src/
│   │   │       ├── css/
│   │   │       │   ├── 0_font.css
│   │   │       │   ├── 2_animate.css
│   │   │       │   └── 3_style.css
│   │   │       └── js/
│   │   │           └── combine/
│   │   │               ├── 3_particles.js
│   │   │               └── 4_main.js
│   │   ├── assets.go
│   │   ├── assets_list.go
│   │   ├── login.go
│   │   ├── login.tmpl
│   │   └── template.go
│   ├── template.go
│   ├── template_test.go
│   └── types/
│       ├── action/
│       │   ├── ajax.go
│       │   ├── base.go
│       │   ├── event.go
│       │   ├── fieldfilter.go
│       │   ├── file_upload.go
│       │   ├── jump.go
│       │   ├── jump_selectbox.go
│       │   └── popup.go
│       ├── button.go
│       ├── components.go
│       ├── display/
│       │   ├── base.go
│       │   ├── bool.go
│       │   ├── carousel.go
│       │   ├── copy.go
│       │   ├── date.go
│       │   ├── dot.go
│       │   ├── downloadable.go
│       │   ├── filesize.go
│       │   ├── icon.go
│       │   ├── image.go
│       │   ├── label.go
│       │   ├── link.go
│       │   ├── loading.go
│       │   ├── progressbar.go
│       │   └── qrcode.go
│       ├── display.go
│       ├── display_test.go
│       ├── form/
│       │   ├── form.go
│       │   ├── form_test.go
│       │   └── select/
│       │       └── select.go
│       ├── form.go
│       ├── form_test.go
│       ├── info.go
│       ├── info_test.go
│       ├── operators.go
│       ├── operators_test.go
│       ├── page.go
│       ├── select.go
│       ├── size.go
│       ├── table/
│       │   └── table.go
│       ├── tmpl.go
│       └── tmpls/
│           ├── choose.tmpl
│           ├── choose_ajax.tmpl
│           ├── choose_custom.tmpl
│           ├── choose_disable.tmpl
│           ├── choose_hide.tmpl
│           ├── choose_map.tmpl
│           └── choose_show.tmpl
└── tests/
    ├── common/
    │   ├── api.go
    │   ├── auth.go
    │   ├── checklist.md
    │   ├── common.go
    │   ├── config.json
    │   ├── config_ms.json
    │   ├── config_pg.json
    │   ├── config_sqlite.json
    │   ├── external.go
    │   ├── manager.go
    │   ├── menu.go
    │   ├── normal.go
    │   ├── operation_log.go
    │   ├── permission.go
    │   └── role.go
    ├── data/
    │   ├── admin.sql
    │   ├── admin_ms.bak
    │   ├── admin_ms.sql
    │   └── admin_pg.sql
    ├── frameworks/
    │   ├── beego/
    │   │   ├── beego.go
    │   │   └── beego_test.go
    │   ├── beego2/
    │   │   ├── beego.go
    │   │   └── beego_test.go
    │   ├── buffalo/
    │   │   ├── buffalo.go
    │   │   └── buffalo_test.go
    │   ├── chi/
    │   │   ├── chi.go
    │   │   └── chi_test.go
    │   ├── echo/
    │   │   ├── echo.go
    │   │   └── echo_test.go
    │   ├── fasthttp/
    │   │   ├── fasthttp.go
    │   │   └── fasthttp_test.go
    │   ├── gear/
    │   │   ├── gear.go
    │   │   └── gear_test.go
    │   ├── gf/
    │   │   ├── gf.go
    │   │   └── gf_test.go
    │   ├── gf2/
    │   │   ├── gf.go
    │   │   └── gf_test.go
    │   ├── gin/
    │   │   ├── gin.go
    │   │   └── gin_test.go
    │   ├── gofiber/
    │   │   ├── gofiber.go
    │   │   └── gofiber_test.go
    │   ├── gorilla/
    │   │   ├── gorilla.go
    │   │   └── gorilla_test.go
    │   ├── iris/
    │   │   ├── iris.go
    │   │   └── iris_test.go
    │   └── nethttp/
    │       ├── nethttp.go
    │       └── nethttp_test.go
    ├── tables/
    │   ├── authors.go
    │   ├── content.go
    │   ├── external.go
    │   ├── posts.go
    │   ├── tables.go
    │   └── user.go
    ├── test.go
    ├── test_test.go
    └── web/
        ├── README_CN.md
        ├── config.json
        ├── page.go
        ├── test.go
        └── web_test.go
Download .txt
Showing preview only (400K chars total). Download the full file or copy to clipboard to get everything.
SYMBOL INDEX (4600 symbols across 275 files)

FILE: adapter/adapter.go
  type WebFrameWork (line 31) | type WebFrameWork interface
  type BaseAdapter (line 78) | type BaseAdapter struct
    method SetConnection (line 83) | func (base *BaseAdapter) SetConnection(conn db.Connection) {
    method GetConnection (line 88) | func (base *BaseAdapter) GetConnection() db.Connection {
    method HTMLContentType (line 93) | func (*BaseAdapter) HTMLContentType() string {
    method CookieKey (line 98) | func (*BaseAdapter) CookieKey() string {
    method GetUser (line 103) | func (*BaseAdapter) GetUser(ctx interface{}, wf WebFrameWork) (models....
    method GetUse (line 115) | func (*BaseAdapter) GetUse(app interface{}, plugin []plugins.Plugin, w...
    method Run (line 133) | func (*BaseAdapter) Run() error         { panic("not implement") }
    method DisableLog (line 134) | func (*BaseAdapter) DisableLog()        { panic("not implement") }
    method Static (line 135) | func (*BaseAdapter) Static(_, _ string) { panic("not implement") }
    method GetContent (line 138) | func (base *BaseAdapter) GetContent(ctx interface{}, getPanelFn types....

FILE: adapter/beego/beego.go
  type Beego (line 27) | type Beego struct
    method User (line 38) | func (bee *Beego) User(ctx interface{}) (models.UserModel, bool) {
    method Use (line 43) | func (bee *Beego) Use(app interface{}, plugs []plugins.Plugin) error {
    method Content (line 48) | func (bee *Beego) Content(ctx interface{}, getPanelFn types.GetPanelFn...
    method SetApp (line 63) | func (bee *Beego) SetApp(app interface{}) error {
    method AddHandler (line 76) | func (bee *Beego) AddHandler(method, path string, handlers gctx.Handle...
    method Name (line 100) | func (*Beego) Name() string {
    method SetContext (line 105) | func (*Beego) SetContext(contextInterface interface{}) adapter.WebFram...
    method Redirect (line 117) | func (bee *Beego) Redirect() {
    method SetContentType (line 122) | func (bee *Beego) SetContentType() {
    method Write (line 127) | func (bee *Beego) Write(body []byte) {
    method GetCookie (line 132) | func (bee *Beego) GetCookie() (string, error) {
    method Lang (line 137) | func (bee *Beego) Lang() string {
    method Path (line 142) | func (bee *Beego) Path() string {
    method Method (line 147) | func (bee *Beego) Method() string {
    method FormParam (line 152) | func (bee *Beego) FormParam() url.Values {
    method IsPjax (line 158) | func (bee *Beego) IsPjax() bool {
    method Query (line 163) | func (bee *Beego) Query() url.Values {
    method Request (line 168) | func (bee *Beego) Request() *http.Request {
  function init (line 33) | func init() {
  type HandlerFunc (line 52) | type HandlerFunc
  function Content (line 54) | func Content(handler HandlerFunc) beego.FilterFunc {

FILE: adapter/beego2/beego2.go
  type Beego2 (line 22) | type Beego2 struct
    method Name (line 32) | func (*Beego2) Name() string {
    method Use (line 36) | func (bee2 *Beego2) Use(app interface{}, plugins []plugins.Plugin) err...
    method Content (line 40) | func (bee2 *Beego2) Content(ctx interface{}, getPanelFn types.GetPanel...
    method User (line 44) | func (bee2 *Beego2) User(ctx interface{}) (models.UserModel, bool) {
    method AddHandler (line 48) | func (bee2 *Beego2) AddHandler(method, path string, handlers gctx.Hand...
    method SetApp (line 71) | func (bee2 *Beego2) SetApp(app interface{}) error {
    method SetContext (line 83) | func (*Beego2) SetContext(contextInterface interface{}) adapter.WebFra...
    method GetCookie (line 94) | func (bee2 *Beego2) GetCookie() (string, error) {
    method Lang (line 98) | func (bee2 *Beego2) Lang() string {
    method Path (line 102) | func (bee2 *Beego2) Path() string {
    method Method (line 106) | func (bee2 *Beego2) Method() string {
    method FormParam (line 110) | func (bee2 *Beego2) FormParam() url.Values {
    method Query (line 115) | func (bee2 *Beego2) Query() url.Values {
    method IsPjax (line 119) | func (bee2 *Beego2) IsPjax() bool {
    method Redirect (line 123) | func (bee2 *Beego2) Redirect() {
    method SetContentType (line 127) | func (bee2 *Beego2) SetContentType() {
    method Write (line 131) | func (bee2 *Beego2) Write(body []byte) {
    method Request (line 136) | func (bee2 *Beego2) Request() *http.Request {
  function init (line 28) | func init() {

FILE: adapter/buffalo/buffalo.go
  type Buffalo (line 27) | type Buffalo struct
    method User (line 38) | func (bu *Buffalo) User(ctx interface{}) (models.UserModel, bool) {
    method Use (line 43) | func (bu *Buffalo) Use(app interface{}, plugs []plugins.Plugin) error {
    method Content (line 48) | func (bu *Buffalo) Content(ctx interface{}, getPanelFn types.GetPanelF...
    method SetApp (line 64) | func (bu *Buffalo) SetApp(app interface{}) error {
    method AddHandler (line 77) | func (bu *Buffalo) AddHandler(method, path string, handlers context.Ha...
    method Name (line 143) | func (*Buffalo) Name() string {
    method SetContext (line 148) | func (*Buffalo) SetContext(contextInterface interface{}) adapter.WebFr...
    method Redirect (line 160) | func (bu *Buffalo) Redirect() {
    method SetContentType (line 165) | func (bu *Buffalo) SetContentType() {
    method Write (line 170) | func (bu *Buffalo) Write(body []byte) {
    method GetCookie (line 176) | func (bu *Buffalo) GetCookie() (string, error) {
    method Lang (line 181) | func (bu *Buffalo) Lang() string {
    method Path (line 186) | func (bu *Buffalo) Path() string {
    method Method (line 191) | func (bu *Buffalo) Method() string {
    method FormParam (line 196) | func (bu *Buffalo) FormParam() neturl.Values {
    method IsPjax (line 202) | func (bu *Buffalo) IsPjax() bool {
    method Query (line 207) | func (bu *Buffalo) Query() neturl.Values {
    method Request (line 212) | func (bu *Buffalo) Request() *http.Request {
  function init (line 33) | func init() {
  type HandlerFunc (line 52) | type HandlerFunc
  function Content (line 54) | func Content(handler HandlerFunc) buffalo.Handler {
  type HandleFun (line 119) | type HandleFun
  function getHandleFunc (line 121) | func getHandleFunc(eng *buffalo.App, method string) HandleFun {

FILE: adapter/chi/chi.go
  type Chi (line 27) | type Chi struct
    method User (line 38) | func (ch *Chi) User(ctx interface{}) (models.UserModel, bool) {
    method Use (line 43) | func (ch *Chi) Use(app interface{}, plugs []plugins.Plugin) error {
    method Content (line 48) | func (ch *Chi) Content(ctx interface{}, getPanelFn types.GetPanelFn, f...
    method SetApp (line 67) | func (ch *Chi) SetApp(app interface{}) error {
    method AddHandler (line 80) | func (ch *Chi) AddHandler(method, path string, handlers context.Handle...
    method SetContext (line 155) | func (*Chi) SetContext(contextInterface interface{}) adapter.WebFrameW...
    method Name (line 167) | func (*Chi) Name() string {
    method Redirect (line 172) | func (ch *Chi) Redirect() {
    method SetContentType (line 177) | func (ch *Chi) SetContentType() {
    method Write (line 182) | func (ch *Chi) Write(body []byte) {
    method GetCookie (line 188) | func (ch *Chi) GetCookie() (string, error) {
    method Lang (line 197) | func (ch *Chi) Lang() string {
    method Path (line 202) | func (ch *Chi) Path() string {
    method Method (line 207) | func (ch *Chi) Method() string {
    method FormParam (line 212) | func (ch *Chi) FormParam() url.Values {
    method IsPjax (line 218) | func (ch *Chi) IsPjax() bool {
    method Query (line 223) | func (ch *Chi) Query() url.Values {
    method Request (line 228) | func (ch *Chi) Request() *http.Request {
  function init (line 33) | func init() {
  type HandlerFunc (line 52) | type HandlerFunc
  function Content (line 54) | func Content(handler HandlerFunc) http.HandlerFunc {
  type HandleFun (line 125) | type HandleFun
  function getHandleFunc (line 127) | func getHandleFunc(eng *chi.Mux, method string) HandleFun {
  type Context (line 149) | type Context struct

FILE: adapter/echo/echo.go
  type Echo (line 26) | type Echo struct
    method User (line 37) | func (e *Echo) User(ctx interface{}) (models.UserModel, bool) {
    method Use (line 42) | func (e *Echo) Use(app interface{}, plugs []plugins.Plugin) error {
    method Content (line 47) | func (e *Echo) Content(ctx interface{}, getPanelFn types.GetPanelFn, f...
    method SetApp (line 63) | func (e *Echo) SetApp(app interface{}) error {
    method AddHandler (line 76) | func (e *Echo) AddHandler(method, path string, handlers context.Handle...
    method Name (line 104) | func (*Echo) Name() string {
    method SetContext (line 109) | func (*Echo) SetContext(contextInterface interface{}) adapter.WebFrame...
    method Redirect (line 121) | func (e *Echo) Redirect() {
    method SetContentType (line 126) | func (e *Echo) SetContentType() {
    method Write (line 131) | func (e *Echo) Write(body []byte) {
    method GetCookie (line 137) | func (e *Echo) GetCookie() (string, error) {
    method Lang (line 146) | func (e *Echo) Lang() string {
    method Path (line 151) | func (e *Echo) Path() string {
    method Method (line 156) | func (e *Echo) Method() string {
    method FormParam (line 161) | func (e *Echo) FormParam() url.Values {
    method IsPjax (line 167) | func (e *Echo) IsPjax() bool {
    method Query (line 172) | func (e *Echo) Query() url.Values {
    method Request (line 177) | func (e *Echo) Request() *http.Request {
  function init (line 32) | func init() {
  type HandlerFunc (line 51) | type HandlerFunc
  function Content (line 53) | func Content(handler HandlerFunc) echo.HandlerFunc {

FILE: adapter/fasthttp/fasthttp.go
  type Fasthttp (line 28) | type Fasthttp struct
    method User (line 39) | func (fast *Fasthttp) User(ctx interface{}) (models.UserModel, bool) {
    method Use (line 44) | func (fast *Fasthttp) Use(app interface{}, plugs []plugins.Plugin) err...
    method Content (line 49) | func (fast *Fasthttp) Content(ctx interface{}, getPanelFn types.GetPan...
    method SetApp (line 64) | func (fast *Fasthttp) SetApp(app interface{}) error {
    method AddHandler (line 78) | func (fast *Fasthttp) AddHandler(method, path string, handlers context...
    method Name (line 166) | func (*Fasthttp) Name() string {
    method SetContext (line 171) | func (*Fasthttp) SetContext(contextInterface interface{}) adapter.WebF...
    method Redirect (line 183) | func (fast *Fasthttp) Redirect() {
    method SetContentType (line 188) | func (fast *Fasthttp) SetContentType() {
    method Write (line 193) | func (fast *Fasthttp) Write(body []byte) {
    method GetCookie (line 198) | func (fast *Fasthttp) GetCookie() (string, error) {
    method Lang (line 203) | func (fast *Fasthttp) Lang() string {
    method Path (line 208) | func (fast *Fasthttp) Path() string {
    method Method (line 213) | func (fast *Fasthttp) Method() string {
    method FormParam (line 218) | func (fast *Fasthttp) FormParam() url.Values {
    method IsPjax (line 227) | func (fast *Fasthttp) IsPjax() bool {
    method Query (line 232) | func (fast *Fasthttp) Query() url.Values {
    method Request (line 244) | func (fast *Fasthttp) Request() *http.Request {
  function init (line 34) | func init() {
  type HandlerFunc (line 53) | type HandlerFunc
  function Content (line 55) | func Content(handler HandlerFunc) fasthttp.RequestHandler {
  function convertCtx (line 111) | func convertCtx(ctx *fasthttp.RequestCtx) *http.Request {
  type netHTTPBody (line 147) | type netHTTPBody struct
    method Read (line 151) | func (r *netHTTPBody) Read(p []byte) (int, error) {
    method Close (line 160) | func (r *netHTTPBody) Close() error {

FILE: adapter/gear/gear.go
  type Gear (line 31) | type Gear struct
    method User (line 43) | func (gears *Gear) User(ctx interface{}) (models.UserModel, bool) {
    method Use (line 48) | func (gears *Gear) Use(app interface{}, plugs []plugins.Plugin) error {
    method Content (line 53) | func (gears *Gear) Content(ctx interface{}, getPanelFn types.GetPanelF...
    method SetApp (line 69) | func (gears *Gear) SetApp(app interface{}) error {
    method AddHandler (line 84) | func (gears *Gear) AddHandler(method, path string, handlers context.Ha...
    method Name (line 134) | func (*Gear) Name() string {
    method SetContext (line 139) | func (*Gear) SetContext(contextInterface interface{}) adapter.WebFrame...
    method Redirect (line 153) | func (gears *Gear) Redirect() {
    method SetContentType (line 158) | func (gears *Gear) SetContentType() {
    method Write (line 163) | func (gears *Gear) Write(body []byte) {
    method GetCookie (line 168) | func (gears *Gear) GetCookie() (string, error) {
    method Lang (line 173) | func (gears *Gear) Lang() string {
    method Path (line 178) | func (gears *Gear) Path() string {
    method Method (line 183) | func (gears *Gear) Method() string {
    method FormParam (line 188) | func (gears *Gear) FormParam() url.Values {
    method IsPjax (line 194) | func (gears *Gear) IsPjax() bool {
    method Query (line 199) | func (gears *Gear) Query() url.Values {
    method Request (line 204) | func (gears *Gear) Request() *http.Request {
  function init (line 38) | func init() {
  type HandlerFunc (line 57) | type HandlerFunc
  function Content (line 59) | func Content(handler HandlerFunc) gear.Middleware {

FILE: adapter/gf/gf.go
  type Gf (line 28) | type Gf struct
    method User (line 39) | func (gf *Gf) User(ctx interface{}) (models.UserModel, bool) {
    method Use (line 44) | func (gf *Gf) Use(app interface{}, plugs []plugins.Plugin) error {
    method Content (line 49) | func (gf *Gf) Content(ctx interface{}, getPanelFn types.GetPanelFn, fn...
    method SetApp (line 64) | func (gf *Gf) SetApp(app interface{}) error {
    method AddHandler (line 77) | func (gf *Gf) AddHandler(method, path string, handlers context.Handler...
    method Name (line 116) | func (*Gf) Name() string {
    method SetContext (line 121) | func (*Gf) SetContext(contextInterface interface{}) adapter.WebFrameWo...
    method Redirect (line 134) | func (gf *Gf) Redirect() {
    method SetContentType (line 139) | func (gf *Gf) SetContentType() {
    method Write (line 144) | func (gf *Gf) Write(body []byte) {
    method GetCookie (line 149) | func (gf *Gf) GetCookie() (string, error) {
    method Lang (line 154) | func (gf *Gf) Lang() string {
    method Path (line 159) | func (gf *Gf) Path() string {
    method Method (line 164) | func (gf *Gf) Method() string {
    method FormParam (line 169) | func (gf *Gf) FormParam() url.Values {
    method IsPjax (line 174) | func (gf *Gf) IsPjax() bool {
    method Query (line 179) | func (gf *Gf) Query() url.Values {
    method Request (line 184) | func (gf *Gf) Request() *http.Request {
  function init (line 34) | func init() {
  type HandlerFunc (line 53) | type HandlerFunc
  function Content (line 55) | func Content(handler HandlerFunc) ghttp.HandlerFunc {

FILE: adapter/gf2/gf2.go
  type GF2 (line 23) | type GF2 struct
    method Name (line 33) | func (*GF2) Name() string {
    method Use (line 37) | func (gf2 *GF2) Use(app interface{}, plugins []plugins.Plugin) error {
    method Content (line 41) | func (gf2 *GF2) Content(ctx interface{}, getPanelFn types.GetPanelFn, ...
    method User (line 45) | func (gf2 *GF2) User(ctx interface{}) (models.UserModel, bool) {
    method AddHandler (line 49) | func (gf2 *GF2) AddHandler(method, path string, handlers context.Handl...
    method SetApp (line 87) | func (gf2 *GF2) SetApp(app interface{}) error {
    method SetContext (line 99) | func (*GF2) SetContext(contextInterface interface{}) adapter.WebFrameW...
    method GetCookie (line 110) | func (gf2 *GF2) GetCookie() (string, error) {
    method Lang (line 114) | func (gf2 *GF2) Lang() string {
    method Path (line 118) | func (gf2 *GF2) Path() string {
    method Method (line 122) | func (gf2 *GF2) Method() string {
    method FormParam (line 126) | func (gf2 *GF2) FormParam() url.Values {
    method Query (line 130) | func (gf2 *GF2) Query() url.Values {
    method IsPjax (line 134) | func (gf2 *GF2) IsPjax() bool {
    method Redirect (line 138) | func (gf2 *GF2) Redirect() {
    method SetContentType (line 142) | func (gf2 *GF2) SetContentType() {
    method Write (line 146) | func (gf2 *GF2) Write(body []byte) {
    method Request (line 151) | func (gf2 *GF2) Request() *http.Request {
  function init (line 29) | func init() {

FILE: adapter/gin/gin.go
  type Gin (line 26) | type Gin struct
    method User (line 37) | func (gins *Gin) User(ctx interface{}) (models.UserModel, bool) {
    method Use (line 42) | func (gins *Gin) Use(app interface{}, plugs []plugins.Plugin) error {
    method Content (line 47) | func (gins *Gin) Content(ctx interface{}, getPanelFn types.GetPanelFn,...
    method SetApp (line 62) | func (gins *Gin) SetApp(app interface{}) error {
    method AddHandler (line 75) | func (gins *Gin) AddHandler(method, path string, handlers context.Hand...
    method Name (line 102) | func (*Gin) Name() string {
    method SetContext (line 107) | func (*Gin) SetContext(contextInterface interface{}) adapter.WebFrameW...
    method Redirect (line 121) | func (gins *Gin) Redirect() {
    method SetContentType (line 127) | func (*Gin) SetContentType() {}
    method Write (line 130) | func (gins *Gin) Write(body []byte) {
    method GetCookie (line 135) | func (gins *Gin) GetCookie() (string, error) {
    method Lang (line 140) | func (gins *Gin) Lang() string {
    method Path (line 145) | func (gins *Gin) Path() string {
    method Method (line 150) | func (gins *Gin) Method() string {
    method FormParam (line 155) | func (gins *Gin) FormParam() url.Values {
    method IsPjax (line 161) | func (gins *Gin) IsPjax() bool {
    method Query (line 166) | func (gins *Gin) Query() url.Values {
    method Request (line 171) | func (gins *Gin) Request() *http.Request {
  function init (line 32) | func init() {
  type HandlerFunc (line 51) | type HandlerFunc
  function Content (line 53) | func Content(handler HandlerFunc) gin.HandlerFunc {

FILE: adapter/gofiber/gofiber.go
  type Gofiber (line 27) | type Gofiber struct
    method User (line 38) | func (gof *Gofiber) User(ctx interface{}) (models.UserModel, bool) {
    method Use (line 43) | func (gof *Gofiber) Use(app interface{}, plugs []plugins.Plugin) error {
    method Content (line 48) | func (gof *Gofiber) Content(ctx interface{}, getPanelFn types.GetPanel...
    method SetApp (line 53) | func (gof *Gofiber) SetApp(app interface{}) error {
    method AddHandler (line 67) | func (gof *Gofiber) AddHandler(method, path string, handlers context.H...
    method Name (line 150) | func (*Gofiber) Name() string {
    method SetContext (line 155) | func (*Gofiber) SetContext(contextInterface interface{}) adapter.WebFr...
    method Redirect (line 167) | func (gof *Gofiber) Redirect() {
    method SetContentType (line 172) | func (gof *Gofiber) SetContentType() {
    method Write (line 177) | func (gof *Gofiber) Write(body []byte) {
    method GetCookie (line 182) | func (gof *Gofiber) GetCookie() (string, error) {
    method Lang (line 187) | func (gof *Gofiber) Lang() string {
    method Path (line 192) | func (gof *Gofiber) Path() string {
    method Method (line 197) | func (gof *Gofiber) Method() string {
    method FormParam (line 202) | func (gof *Gofiber) FormParam() url.Values {
    method IsPjax (line 211) | func (gof *Gofiber) IsPjax() bool {
    method Query (line 216) | func (gof *Gofiber) Query() url.Values {
    method Request (line 228) | func (gof *Gofiber) Request() *http.Request {
  function init (line 33) | func init() {
  function convertCtx (line 95) | func convertCtx(ctx *fasthttp.RequestCtx) *http.Request {
  type netHTTPBody (line 131) | type netHTTPBody struct
    method Read (line 135) | func (r *netHTTPBody) Read(p []byte) (int, error) {
    method Close (line 144) | func (r *netHTTPBody) Close() error {

FILE: adapter/gorilla/gorilla.go
  type Gorilla (line 27) | type Gorilla struct
    method User (line 38) | func (g *Gorilla) User(ctx interface{}) (models.UserModel, bool) {
    method Use (line 43) | func (g *Gorilla) Use(app interface{}, plugs []plugins.Plugin) error {
    method Content (line 48) | func (g *Gorilla) Content(ctx interface{}, getPanelFn types.GetPanelFn...
    method SetApp (line 67) | func (g *Gorilla) SetApp(app interface{}) error {
    method AddHandler (line 80) | func (g *Gorilla) AddHandler(method, path string, handlers context.Han...
    method Name (line 132) | func (*Gorilla) Name() string {
    method SetContext (line 137) | func (*Gorilla) SetContext(contextInterface interface{}) adapter.WebFr...
    method Redirect (line 150) | func (g *Gorilla) Redirect() {
    method SetContentType (line 155) | func (g *Gorilla) SetContentType() {
    method Write (line 160) | func (g *Gorilla) Write(body []byte) {
    method GetCookie (line 165) | func (g *Gorilla) GetCookie() (string, error) {
    method Lang (line 174) | func (g *Gorilla) Lang() string {
    method Path (line 179) | func (g *Gorilla) Path() string {
    method Method (line 184) | func (g *Gorilla) Method() string {
    method FormParam (line 189) | func (g *Gorilla) FormParam() url.Values {
    method IsPjax (line 195) | func (g *Gorilla) IsPjax() bool {
    method Query (line 200) | func (g *Gorilla) Query() url.Values {
    method Request (line 205) | func (g *Gorilla) Request() *http.Request {
  function init (line 33) | func init() {
  type HandlerFunc (line 52) | type HandlerFunc
  function Content (line 54) | func Content(handler HandlerFunc) http.HandlerFunc {
  type Context (line 126) | type Context struct

FILE: adapter/iris/iris.go
  type Iris (line 27) | type Iris struct
    method User (line 38) | func (is *Iris) User(ctx interface{}) (models.UserModel, bool) {
    method Use (line 43) | func (is *Iris) Use(app interface{}, plugs []plugins.Plugin) error {
    method Content (line 48) | func (is *Iris) Content(ctx interface{}, getPanelFn types.GetPanelFn, ...
    method SetApp (line 63) | func (is *Iris) SetApp(app interface{}) error {
    method AddHandler (line 76) | func (is *Iris) AddHandler(method, path string, handlers context.Handl...
    method Name (line 107) | func (*Iris) Name() string {
    method SetContext (line 112) | func (*Iris) SetContext(contextInterface interface{}) adapter.WebFrame...
    method Redirect (line 125) | func (is *Iris) Redirect() {
    method SetContentType (line 130) | func (is *Iris) SetContentType() {
    method Write (line 135) | func (is *Iris) Write(body []byte) {
    method GetCookie (line 140) | func (is *Iris) GetCookie() (string, error) {
    method Lang (line 145) | func (is *Iris) Lang() string {
    method Path (line 150) | func (is *Iris) Path() string {
    method Method (line 155) | func (is *Iris) Method() string {
    method FormParam (line 160) | func (is *Iris) FormParam() url.Values {
    method IsPjax (line 165) | func (is *Iris) IsPjax() bool {
    method Query (line 170) | func (is *Iris) Query() url.Values {
    method Request (line 175) | func (is *Iris) Request() *http.Request {
  function init (line 33) | func init() {
  type HandlerFunc (line 52) | type HandlerFunc
  function Content (line 54) | func Content(handler HandlerFunc) iris.Handler {

FILE: adapter/nethttp/nethttp.go
  type NetHTTP (line 22) | type NetHTTP struct
    method User (line 33) | func (nh *NetHTTP) User(ctx interface{}) (models.UserModel, bool) {
    method Use (line 38) | func (nh *NetHTTP) Use(app interface{}, plugs []plugins.Plugin) error {
    method Content (line 43) | func (nh *NetHTTP) Content(ctx interface{}, getPanelFn types.GetPanelF...
    method SetApp (line 62) | func (nh *NetHTTP) SetApp(app interface{}) error {
    method AddHandler (line 75) | func (nh *NetHTTP) AddHandler(method, path string, handlers context.Ha...
    method SetContext (line 129) | func (*NetHTTP) SetContext(contextInterface interface{}) adapter.WebFr...
    method Name (line 141) | func (*NetHTTP) Name() string {
    method Redirect (line 146) | func (nh *NetHTTP) Redirect() {
    method SetContentType (line 151) | func (nh *NetHTTP) SetContentType() {
    method Write (line 156) | func (nh *NetHTTP) Write(body []byte) {
    method GetCookie (line 162) | func (nh *NetHTTP) GetCookie() (string, error) {
    method Lang (line 171) | func (nh *NetHTTP) Lang() string {
    method Path (line 176) | func (nh *NetHTTP) Path() string {
    method Method (line 181) | func (nh *NetHTTP) Method() string {
    method FormParam (line 186) | func (nh *NetHTTP) FormParam() url.Values {
    method IsPjax (line 192) | func (nh *NetHTTP) IsPjax() bool {
    method Query (line 197) | func (nh *NetHTTP) Query() url.Values {
    method Request (line 202) | func (nh *NetHTTP) Request() *http.Request {
  function init (line 28) | func init() {
  type HandlerFunc (line 47) | type HandlerFunc
  function Content (line 49) | func Content(handler HandlerFunc) http.HandlerFunc {
  type HandleFun (line 120) | type HandleFun
  type Context (line 123) | type Context struct
  function getPathParams (line 207) | func getPathParams(pattern, url string) map[string]string {

FILE: context/context.go
  constant abortIndex (line 25) | abortIndex int8 = math.MaxInt8 / 2
  type Context (line 33) | type Context struct
    method SetUserValue (line 82) | func (ctx *Context) SetUserValue(key string, value interface{}) {
    method GetUserValue (line 87) | func (ctx *Context) GetUserValue(key string) interface{} {
    method Path (line 92) | func (ctx *Context) Path() string {
    method Abort (line 97) | func (ctx *Context) Abort() {
    method Next (line 102) | func (ctx *Context) Next() {
    method SetHandlers (line 110) | func (ctx *Context) SetHandlers(handlers Handlers) *Context {
    method Method (line 116) | func (ctx *Context) Method() string {
    method BindJSON (line 154) | func (ctx *Context) BindJSON(data interface{}) error {
    method MustBindJSON (line 165) | func (ctx *Context) MustBindJSON(data interface{}) {
    method Write (line 180) | func (ctx *Context) Write(code int, header map[string]string, Body str...
    method JSON (line 190) | func (ctx *Context) JSON(code int, Body map[string]interface{}) {
    method DataWithHeaders (line 201) | func (ctx *Context) DataWithHeaders(code int, header map[string]string...
    method Data (line 210) | func (ctx *Context) Data(code int, contentType string, data []byte) {
    method Redirect (line 217) | func (ctx *Context) Redirect(path string) {
    method HTML (line 224) | func (ctx *Context) HTML(code int, body string) {
    method HTMLByte (line 231) | func (ctx *Context) HTMLByte(code int, body []byte) {
    method WriteString (line 238) | func (ctx *Context) WriteString(body string) {
    method SetStatusCode (line 243) | func (ctx *Context) SetStatusCode(code int) {
    method SetContentType (line 248) | func (ctx *Context) SetContentType(contentType string) {
    method SetLastModified (line 252) | func (ctx *Context) SetLastModified(modtime time.Time) {
    method WriteNotModified (line 278) | func (ctx *Context) WriteNotModified() {
    method CheckIfModifiedSince (line 292) | func (ctx *Context) CheckIfModifiedSince(modtime time.Time) (bool, err...
    method LocalIP (line 313) | func (ctx *Context) LocalIP() string {
    method SetCookie (line 333) | func (ctx *Context) SetCookie(cookie *http.Cookie) {
    method Query (line 340) | func (ctx *Context) Query(key string) string {
    method QueryAll (line 345) | func (ctx *Context) QueryAll(key string) []string {
    method QueryDefault (line 350) | func (ctx *Context) QueryDefault(key, def string) string {
    method Lang (line 359) | func (ctx *Context) Lang() string {
    method Theme (line 364) | func (ctx *Context) Theme() string {
    method Headers (line 377) | func (ctx *Context) Headers(key string) string {
    method Referer (line 382) | func (ctx *Context) Referer() string {
    method RefererURL (line 387) | func (ctx *Context) RefererURL() *url.URL {
    method RefererQuery (line 400) | func (ctx *Context) RefererQuery(key string) string {
    method FormValue (line 408) | func (ctx *Context) FormValue(key string) string {
    method PostForm (line 413) | func (ctx *Context) PostForm() url.Values {
    method WantHTML (line 418) | func (ctx *Context) WantHTML() bool {
    method WantJSON (line 422) | func (ctx *Context) WantJSON() bool {
    method AddHeader (line 427) | func (ctx *Context) AddHeader(key, value string) {
    method PjaxUrl (line 432) | func (ctx *Context) PjaxUrl(url string) {
    method IsPjax (line 437) | func (ctx *Context) IsPjax() bool {
    method IsIframe (line 442) | func (ctx *Context) IsIframe() bool {
    method SetHeader (line 447) | func (ctx *Context) SetHeader(key, value string) {
    method GetContentType (line 451) | func (ctx *Context) GetContentType() string {
    method Cookie (line 455) | func (ctx *Context) Cookie(name string) string {
    method User (line 465) | func (ctx *Context) User() interface{} {
    method ServeContent (line 474) | func (ctx *Context) ServeContent(content io.ReadSeeker, filename strin...
    method ServeFile (line 490) | func (ctx *Context) ServeFile(filename string, gzipCompression bool) e...
  type Path (line 44) | type Path struct
  type RouterMap (line 49) | type RouterMap
    method Get (line 51) | func (r RouterMap) Get(name string) Router {
  type Router (line 55) | type Router struct
    method Method (line 60) | func (r Router) Method() string {
    method GetURL (line 64) | func (r Router) GetURL(value ...string) string {
  type NodeProcessor (line 72) | type NodeProcessor
  type Node (line 74) | type Node struct
  function NewContext (line 122) | func NewContext(req *http.Request) *Context {
  constant HeaderContentType (line 136) | HeaderContentType = "Content-Type"
  constant HeaderLastModified (line 138) | HeaderLastModified    = "Last-Modified"
  constant HeaderIfModifiedSince (line 139) | HeaderIfModifiedSince = "If-Modified-Since"
  constant HeaderCacheControl (line 140) | HeaderCacheControl    = "Cache-Control"
  constant HeaderETag (line 141) | HeaderETag            = "ETag"
  constant HeaderContentDisposition (line 143) | HeaderContentDisposition = "Content-Disposition"
  constant HeaderContentLength (line 144) | HeaderContentLength      = "Content-Length"
  constant HeaderContentEncoding (line 145) | HeaderContentEncoding    = "Content-Encoding"
  constant GzipHeaderValue (line 147) | GzipHeaderValue      = "gzip"
  constant HeaderAcceptEncoding (line 148) | HeaderAcceptEncoding = "Accept-Encoding"
  constant HeaderVary (line 149) | HeaderVary           = "Vary"
  constant ThemeKey (line 151) | ThemeKey = "__ga_theme"
  function IsZeroTime (line 261) | func IsZeroTime(t time.Time) bool {
  type HandlerMap (line 506) | type HandlerMap
  type App (line 511) | type App struct
    method AppendReqAndResp (line 549) | func (app *App) AppendReqAndResp(url, method string, handler []Handler) {
    method Find (line 564) | func (app *App) Find(url, method string) []Handler {
    method POST (line 570) | func (app *App) POST(url string, handler ...Handler) *App {
    method GET (line 577) | func (app *App) GET(url string, handler ...Handler) *App {
    method DELETE (line 584) | func (app *App) DELETE(url string, handler ...Handler) *App {
    method PUT (line 591) | func (app *App) PUT(url string, handler ...Handler) *App {
    method OPTIONS (line 598) | func (app *App) OPTIONS(url string, handler ...Handler) *App {
    method HEAD (line 605) | func (app *App) HEAD(url string, handler ...Handler) *App {
    method ANY (line 613) | func (app *App) ANY(url string, handler ...Handler) *App {
    method Name (line 624) | func (app *App) Name(name string) {
    method Group (line 639) | func (app *App) Group(prefix string, middleware ...Handler) *RouterGro...
  function NewApp (line 523) | func NewApp() *App {
  type Handler (line 535) | type Handler
  type Handlers (line 538) | type Handlers
  type RouterGroup (line 648) | type RouterGroup struct
    method AppendReqAndResp (line 663) | func (g *RouterGroup) AppendReqAndResp(url, method string, handler []H...
    method POST (line 681) | func (g *RouterGroup) POST(url string, handler ...Handler) *RouterGroup {
    method GET (line 688) | func (g *RouterGroup) GET(url string, handler ...Handler) *RouterGroup {
    method DELETE (line 695) | func (g *RouterGroup) DELETE(url string, handler ...Handler) *RouterGr...
    method PUT (line 702) | func (g *RouterGroup) PUT(url string, handler ...Handler) *RouterGroup {
    method OPTIONS (line 709) | func (g *RouterGroup) OPTIONS(url string, handler ...Handler) *RouterG...
    method HEAD (line 716) | func (g *RouterGroup) HEAD(url string, handler ...Handler) *RouterGroup {
    method ANY (line 724) | func (g *RouterGroup) ANY(url string, handler ...Handler) *RouterGroup {
    method Name (line 735) | func (g *RouterGroup) Name(name string) {
    method Group (line 740) | func (g *RouterGroup) Group(prefix string, middleware ...Handler) *Rou...
  function slash (line 755) | func slash(prefix string) string {
  function join (line 773) | func join(prefix, suffix string) string {

FILE: context/context_test.go
  function TestSlash (line 10) | func TestSlash(t *testing.T) {
  function TestJoin (line 19) | func TestJoin(t *testing.T) {
  function TestTree (line 27) | func TestTree(t *testing.T) {
  function printHandler (line 68) | func printHandler(h []Handler) {

FILE: context/trie.go
  type node (line 9) | type node struct
    method hasMethod (line 24) | func (n *node) hasMethod(method string) int {
    method addMethodAndHandler (line 33) | func (n *node) addMethodAndHandler(method string, handler []Handler) {
    method addChild (line 38) | func (n *node) addChild(child *node) {
    method addContent (line 42) | func (n *node) addContent(value string) *node {
    method search (line 54) | func (n *node) search(value string) *node {
    method addPath (line 63) | func (n *node) addPath(paths []string, method string, handler []Handle...
    method findPath (line 71) | func (n *node) findPath(paths []string, method string) []Handler {
    method print (line 88) | func (n *node) print() {
    method printChildren (line 92) | func (n *node) printChildren() {
  function tree (line 16) | func tree() *node {
  function stringToArr (line 99) | func stringToArr(path string) []string {

FILE: data/admin.sql
  type `goadmin_menu` (line 28) | CREATE TABLE `goadmin_menu` (
  type `goadmin_operation_log` (line 66) | CREATE TABLE `goadmin_operation_log` (
  type `goadmin_site` (line 85) | CREATE TABLE `goadmin_site` (
  type `goadmin_permissions` (line 102) | CREATE TABLE `goadmin_permissions` (
  type `goadmin_role_menu` (line 131) | CREATE TABLE `goadmin_role_menu` (
  type `goadmin_role_permissions` (line 159) | CREATE TABLE `goadmin_role_permissions` (
  type `goadmin_role_users` (line 185) | CREATE TABLE `goadmin_role_users` (
  type `goadmin_roles` (line 210) | CREATE TABLE `goadmin_roles` (
  type `goadmin_session` (line 237) | CREATE TABLE `goadmin_session` (
  type `goadmin_user_permissions` (line 253) | CREATE TABLE `goadmin_user_permissions` (
  type `goadmin_users` (line 278) | CREATE TABLE `goadmin_users` (

FILE: data/migrations/admin_2020_04_14_100427_ms.sql
  type goadmin_site (line 1) | CREATE TABLE[goadmin_site] (

FILE: data/migrations/admin_2020_04_14_100427_mysql.sql
  type `goadmin_site` (line 1) | CREATE TABLE `goadmin_site` (

FILE: data/migrations/admin_2020_04_14_100427_postgres.sql
  type public (line 39) | CREATE TABLE public.goadmin_site (

FILE: data/migrations/admin_2020_04_14_100427_sqlite.sql
  type "goadmin_site" (line 1) | CREATE TABLE IF NOT EXISTS "goadmin_site" (

FILE: engine/engine.go
  type Engine (line 47) | type Engine struct
    method Use (line 67) | func (eng *Engine) Use(router interface{}) error {
    method AddPlugins (line 83) | func (eng *Engine) AddPlugins(plugs ...plugins.Plugin) *Engine {
    method AddPluginList (line 97) | func (eng *Engine) AddPluginList(plugs plugins.Plugins) *Engine {
    method FindPluginByName (line 111) | func (eng *Engine) FindPluginByName(name string) (plugins.Plugin, bool) {
    method AddAuthService (line 121) | func (eng *Engine) AddAuthService(processor auth.Processor) *Engine {
    method announce (line 130) | func (eng *Engine) announce() *Engine {
    method AddConfig (line 140) | func (eng *Engine) AddConfig(cfg *config.Config) *Engine {
    method setConfig (line 145) | func (eng *Engine) setConfig(cfg *config.Config) *Engine {
    method AddConfigFromJSON (line 160) | func (eng *Engine) AddConfigFromJSON(path string) *Engine {
    method AddConfigFromYAML (line 166) | func (eng *Engine) AddConfigFromYAML(path string) *Engine {
    method AddConfigFromINI (line 172) | func (eng *Engine) AddConfigFromINI(path string) *Engine {
    method initDatabase (line 178) | func (eng *Engine) initDatabase() *Engine {
    method AddAdapter (line 193) | func (eng *Engine) AddAdapter(ada adapter.WebFrameWork) *Engine {
    method User (line 225) | func (eng *Engine) User(ctx interface{}) (models.UserModel, bool) {
    method DB (line 234) | func (eng *Engine) DB(driver string) db.Connection {
    method DefaultConnection (line 239) | func (eng *Engine) DefaultConnection() db.Connection {
    method MysqlConnection (line 244) | func (eng *Engine) MysqlConnection() db.Connection {
    method MssqlConnection (line 249) | func (eng *Engine) MssqlConnection() db.Connection {
    method PostgresqlConnection (line 254) | func (eng *Engine) PostgresqlConnection() db.Connection {
    method SqliteConnection (line 259) | func (eng *Engine) SqliteConnection() db.Connection {
    method OceanBaseConnection (line 264) | func (eng *Engine) OceanBaseConnection() db.Connection {
    method ResolveConnection (line 271) | func (eng *Engine) ResolveConnection(setter ConnectionSetter, driver s...
    method ResolveMysqlConnection (line 277) | func (eng *Engine) ResolveMysqlConnection(setter ConnectionSetter) *En...
    method ResolveMssqlConnection (line 283) | func (eng *Engine) ResolveMssqlConnection(setter ConnectionSetter) *En...
    method ResolveSqliteConnection (line 289) | func (eng *Engine) ResolveSqliteConnection(setter ConnectionSetter) *E...
    method ResolvePostgresqlConnection (line 295) | func (eng *Engine) ResolvePostgresqlConnection(setter ConnectionSetter...
    method Clone (line 303) | func (eng *Engine) Clone(e *Engine) *Engine {
    method ClonedBySetter (line 309) | func (eng *Engine) ClonedBySetter(setter Setter) *Engine {
    method deferHandler (line 314) | func (eng *Engine) deferHandler(conn db.Connection) context.Handler {
    method wrapWithAuthMiddleware (line 360) | func (eng *Engine) wrapWithAuthMiddleware(handler context.Handler) con...
    method wrap (line 366) | func (eng *Engine) wrap(handler context.Handler) context.Handlers {
    method AddNavButtons (line 376) | func (eng *Engine) AddNavButtons(title template2.HTML, icon string, ac...
    method AddNavButtonsRaw (line 383) | func (eng *Engine) AddNavButtonsRaw(btns ...types.Button) *Engine {
    method addJumpNavButton (line 397) | func (eng *Engine) addJumpNavButton(param navJumpButtonParam) *Engine {
    method initJumpNavButtons (line 410) | func (eng *Engine) initJumpNavButtons() {
    method initPlugins (line 419) | func (eng *Engine) initPlugins() {
    method initNavJumpButtonParams (line 442) | func (eng *Engine) initNavJumpButtonParams() []navJumpButtonParam {
    method initSiteSetting (line 476) | func (eng *Engine) initSiteSetting() {
    method Content (line 498) | func (eng *Engine) Content(ctx interface{}, panel types.GetPanelFn) {
    method Data (line 515) | func (eng *Engine) Data(method, url string, handler context.Handler, n...
    method HTML (line 524) | func (eng *Engine) HTML(method, url string, fn types.GetPanelInfoFn, n...
    method HTMLFile (line 568) | func (eng *Engine) HTMLFile(method, url, path string, data map[string]...
    method HTMLFiles (line 619) | func (eng *Engine) HTMLFiles(method, url string, data map[string]inter...
    method HTMLFilesNoAuth (line 625) | func (eng *Engine) HTMLFilesNoAuth(method, url string, data map[string...
    method htmlFilesHandler (line 631) | func (eng *Engine) htmlFilesHandler(data map[string]interface{}, files...
    method errorPanelHTML (line 674) | func (eng *Engine) errorPanelHTML(ctx *context.Context, buf *bytes.Buf...
    method AddGenerators (line 702) | func (eng *Engine) AddGenerators(list ...table.GeneratorList) *Engine {
    method AdminPlugin (line 713) | func (eng *Engine) AdminPlugin() *admin.Admin {
    method SetCaptcha (line 724) | func (eng *Engine) SetCaptcha(captcha map[string]string) *Engine {
    method SetCaptchaDriver (line 730) | func (eng *Engine) SetCaptchaDriver(driver string) *Engine {
    method AddGenerator (line 736) | func (eng *Engine) AddGenerator(key string, g table.Generator) *Engine {
    method AddGlobalDisplayProcessFn (line 742) | func (eng *Engine) AddGlobalDisplayProcessFn(f types.FieldFilterFn) *E...
    method AddDisplayFilterLimit (line 748) | func (eng *Engine) AddDisplayFilterLimit(limit int) *Engine {
    method AddDisplayFilterTrimSpace (line 754) | func (eng *Engine) AddDisplayFilterTrimSpace() *Engine {
    method AddDisplayFilterSubstr (line 760) | func (eng *Engine) AddDisplayFilterSubstr(start int, end int) *Engine {
    method AddDisplayFilterToTitle (line 766) | func (eng *Engine) AddDisplayFilterToTitle() *Engine {
    method AddDisplayFilterToUpper (line 772) | func (eng *Engine) AddDisplayFilterToUpper() *Engine {
    method AddDisplayFilterToLower (line 778) | func (eng *Engine) AddDisplayFilterToLower() *Engine {
    method AddDisplayFilterXssFilter (line 784) | func (eng *Engine) AddDisplayFilterXssFilter() *Engine {
    method AddDisplayFilterXssJsFilter (line 790) | func (eng *Engine) AddDisplayFilterXssJsFilter() *Engine {
  function Default (line 57) | func Default() *Engine {
  function emptyAdapterPanic (line 207) | func emptyAdapterPanic() {
  function Register (line 212) | func Register(ada adapter.WebFrameWork) {
  function User (line 220) | func User(ctx interface{}) (models.UserModel, bool) {
  type ConnectionSetter (line 268) | type ConnectionSetter
  type Setter (line 300) | type Setter
  type navJumpButtonParam (line 388) | type navJumpButtonParam struct
  function printInitMsg (line 406) | func printInitMsg(msg string) {
  function Content (line 507) | func Content(ctx interface{}, panel types.GetPanelFn) {

FILE: examples/beego/main.go
  function main (line 23) | func main() {

FILE: examples/beego2/main.go
  function main (line 23) | func main() {

FILE: examples/buffalo/main.go
  function main (line 24) | func main() {

FILE: examples/chi/main.go
  function main (line 26) | func main() {
  function FileServer (line 111) | func FileServer(r chi.Router, path string, root http.FileSystem) {

FILE: examples/datamodel/authors.go
  function GetAuthorsTable (line 11) | func GetAuthorsTable(ctx *context.Context) (authorsTable table.Table) {

FILE: examples/datamodel/content.go
  function GetContent (line 20) | func GetContent(ctx *context.Context) (types.Panel, error) {

FILE: examples/datamodel/goadmin_super_users.go
  function GetGoadminSuperUsersTable (line 10) | func GetGoadminSuperUsersTable(ctx *context.Context) table.Table {

FILE: examples/datamodel/mysql_types.go
  function GetAllTypesTable (line 10) | func GetAllTypesTable() table.Table {

FILE: examples/datamodel/posts.go
  function GetPostsTable (line 16) | func GetPostsTable(ctx *context.Context) (postsTable table.Table) {

FILE: examples/datamodel/user.go
  function GetUserTable (line 20) | func GetUserTable(ctx *context.Context) (userTable table.Table) {

FILE: examples/echo/main.go
  function main (line 23) | func main() {

FILE: examples/fasthttp/main.go
  function main (line 24) | func main() {

FILE: examples/gear/main.go
  function main (line 24) | func main() {

FILE: examples/gf/main.go
  function main (line 23) | func main() {

FILE: examples/gf2/main.go
  function main (line 24) | func main() {

FILE: examples/gin/main.go
  function main (line 25) | func main() {

FILE: examples/gofiber/main.go
  function main (line 24) | func main() {

FILE: examples/gorilla/main.go
  function main (line 24) | func main() {

FILE: examples/iris/main.go
  function main (line 23) | func main() {

FILE: examples/nethttp/main.go
  function main (line 25) | func main() {
  function FileServer (line 110) | func FileServer(r *http.ServeMux, path string, root http.FileSystem) {

FILE: modules/auth/auth.go
  function Auth (line 23) | func Auth(ctx *context.Context) models.UserModel {
  function Check (line 28) | func Check(password string, username string, conn db.Connection) (user m...
  function comparePassword (line 46) | func comparePassword(comPwd, pwdHash string) bool {
  function EncodePassword (line 52) | func EncodePassword(pwd []byte) string {
  function SetCookie (line 61) | func SetCookie(ctx *context.Context, user models.UserModel, conn db.Conn...
  function DelCookie (line 72) | func DelCookie(ctx *context.Context, conn db.Connection) error {
  type TokenService (line 82) | type TokenService struct
    method Name (line 88) | func (s *TokenService) Name() string {
    method AddToken (line 123) | func (s *TokenService) AddToken() string {
    method CheckToken (line 140) | func (s *TokenService) CheckToken(toCheckToken string) (ok bool) {
  function InitCSRFTokenSrv (line 92) | func InitCSRFTokenSrv(conn db.Connection) (string, service.Service) {
  constant TokenServiceKey (line 110) | TokenServiceKey = "token_csrf_helper"
  constant ServiceKey (line 111) | ServiceKey      = "auth"
  function GetTokenService (line 114) | func GetTokenService(s interface{}) *TokenService {
  type CSRFToken (line 173) | type CSRFToken
  type Processor (line 175) | type Processor
  type Service (line 177) | type Service struct
    method Name (line 181) | func (s *Service) Name() string {
  function GetService (line 185) | func GetService(s interface{}) *Service {
  function NewService (line 193) | func NewService(processor Processor) *Service {

FILE: modules/auth/auth_test.go
  function TestEncodePassword (line 9) | func TestEncodePassword(t *testing.T) {

FILE: modules/auth/middleware.go
  type Invoker (line 26) | type Invoker struct
    method SetAuthFailCallback (line 111) | func (invoker *Invoker) SetAuthFailCallback(callback MiddlewareCallbac...
    method SetPermissionDenyCallback (line 117) | func (invoker *Invoker) SetPermissionDenyCallback(callback MiddlewareC...
    method Middleware (line 126) | func (invoker *Invoker) Middleware() context.Handler {
  function Middleware (line 34) | func Middleware(conn db.Connection) context.Handler {
  function DefaultInvoker (line 39) | func DefaultInvoker(conn db.Connection) *Invoker {
  function SetPrefix (line 104) | func SetPrefix(prefix string, conn db.Connection) *Invoker {
  type MiddlewareCallback (line 123) | type MiddlewareCallback
  function Filter (line 153) | func Filter(ctx *context.Context, conn db.Connection) (models.UserModel,...
  constant defaultUserIDSesKey (line 180) | defaultUserIDSesKey = "user_id"
  function GetUserID (line 183) | func GetUserID(sesKey string, conn db.Connection) int64 {
  function GetCurUser (line 196) | func GetCurUser(sesKey string, conn db.Connection) (user models.UserMode...
  function GetCurUserByID (line 212) | func GetCurUserByID(id int64, conn db.Connection) (user models.UserModel...
  function CheckPermissions (line 235) | func CheckPermissions(user models.UserModel, path, method string, param ...

FILE: modules/auth/middleware_test.go
  function TestCheckPermissions (line 12) | func TestCheckPermissions(t *testing.T) {

FILE: modules/auth/session.go
  constant DefaultCookieKey (line 21) | DefaultCookieKey = "go_admin_session"
  function newDBDriver (line 24) | func newDBDriver(conn db.Connection) *DBDriver {
  type PersistenceDriver (line 32) | type PersistenceDriver interface
  function GetSessionByKey (line 38) | func GetSessionByKey(sesKey, key string, conn db.Connection) (interface{...
  type Session (line 44) | type Session struct
    method UpdateConfig (line 60) | func (ses *Session) UpdateConfig(config Config) {
    method Get (line 66) | func (ses *Session) Get(key string) interface{} {
    method Add (line 71) | func (ses *Session) Add(key string, value interface{}) error {
    method Clear (line 92) | func (ses *Session) Clear() error {
    method UseDriver (line 98) | func (ses *Session) UseDriver(driver PersistenceDriver) {
    method StartCtx (line 103) | func (ses *Session) StartCtx(ctx *context.Context) (*Session, error) {
  type Config (line 54) | type Config struct
  function InitSession (line 121) | func InitSession(ctx *context.Context, conn db.Connection) (*Session, er...
  type DBDriver (line 136) | type DBDriver struct
    method Load (line 142) | func (driver *DBDriver) Load(sid string) (map[string]interface{}, erro...
    method deleteOverdueSession (line 158) | func (driver *DBDriver) deleteOverdueSession() {
    method Update (line 191) | func (driver *DBDriver) Update(sid string, values map[string]interface...
    method table (line 236) | func (driver *DBDriver) table() *db.SQL {

FILE: modules/collection/collection.go
  type Collection (line 3) | type Collection
    method Where (line 6) | func (c Collection) Where(key string, values ...interface{}) Collection {
    method Length (line 30) | func (c Collection) Length() int {
    method FirstGet (line 34) | func (c Collection) FirstGet(key string) interface{} {
  function isTrue (line 38) | func isTrue(a interface{}) bool {

FILE: modules/config/config.go
  type Database (line 37) | type Database struct
    method GetDSN (line 56) | func (d Database) GetDSN() string {
    method ParamStr (line 83) | func (d Database) ParamStr() string {
  type DatabaseList (line 125) | type DatabaseList
    method GetDefault (line 128) | func (d DatabaseList) GetDefault() Database {
    method Add (line 133) | func (d DatabaseList) Add(key string, db Database) {
    method GroupByDriver (line 138) | func (d DatabaseList) GroupByDriver() map[string]DatabaseList {
    method JSON (line 151) | func (d DatabaseList) JSON() string {
    method Copy (line 155) | func (d DatabaseList) Copy() DatabaseList {
    method Connections (line 163) | func (d DatabaseList) Connections() []string {
  function GetDatabaseListFromJSON (line 173) | func GetDatabaseListFromJSON(m string) DatabaseList {
  constant EnvTest (line 184) | EnvTest = "test"
  constant EnvLocal (line 186) | EnvLocal = "local"
  constant EnvProd (line 188) | EnvProd = "prod"
  constant DriverMysql (line 191) | DriverMysql = "mysql"
  constant DriverSqlite (line 193) | DriverSqlite = "sqlite"
  constant DriverPostgresql (line 195) | DriverPostgresql = "postgresql"
  constant DriverMssql (line 197) | DriverMssql = "mssql"
  constant DriverOceanBase (line 199) | DriverOceanBase = "oceanbase"
  type Store (line 204) | type Store struct
    method URL (line 209) | func (s Store) URL(suffix string) string {
    method JSON (line 237) | func (s Store) JSON() string {
  function GetStoreFromJSON (line 244) | func GetStoreFromJSON(m string) Store {
  type Config (line 255) | type Config struct
    method GetIndexURL (line 509) | func (c *Config) GetIndexURL() string {
    method Url (line 519) | func (c *Config) Url(suffix string) string {
    method IsTestEnvironment (line 530) | func (c *Config) IsTestEnvironment() bool {
    method IsLocalEnvironment (line 535) | func (c *Config) IsLocalEnvironment() bool {
    method IsProductionEnvironment (line 540) | func (c *Config) IsProductionEnvironment() bool {
    method IsNotProductionEnvironment (line 545) | func (c *Config) IsNotProductionEnvironment() bool {
    method IsAllowConfigModification (line 549) | func (c *Config) IsAllowConfigModification() bool {
    method URLRemovePrefix (line 554) | func (c *Config) URLRemovePrefix(url string) string {
    method Index (line 565) | func (c *Config) Index() string {
    method Prefix (line 576) | func (c *Config) Prefix() string {
    method AssertPrefix (line 581) | func (c *Config) AssertPrefix() string {
    method AddUpdateProcessFn (line 588) | func (c *Config) AddUpdateProcessFn(fn UpdateConfigProcessFn) *Config {
    method PrefixFixSlash (line 594) | func (c *Config) PrefixFixSlash() string {
    method Copy (line 604) | func (c *Config) Copy() *Config {
    method ToMap (line 636) | func (c *Config) ToMap() map[string]string {
    method Update (line 715) | func (c *Config) Update(m map[string]string) error {
    method EraseSens (line 813) | func (c *Config) EraseSens() *Config {
  type Logger (line 413) | type Logger struct
  type EncoderCfg (line 419) | type EncoderCfg struct
  type RotateCfg (line 433) | type RotateCfg struct
  type URLFormat (line 440) | type URLFormat struct
    method SetDefault (line 452) | func (f URLFormat) SetDefault() URLFormat {
  type ExtraInfo (line 465) | type ExtraInfo
  type UpdateConfigProcessFn (line 467) | type UpdateConfigProcessFn
  type PageAnimation (line 470) | type PageAnimation struct
    method JSON (line 476) | func (p PageAnimation) JSON() string {
  type FileUploadEngine (line 484) | type FileUploadEngine struct
    method JSON (line 489) | func (f FileUploadEngine) JSON() string {
  function GetFileUploadEngineFromJSON (line 499) | func GetFileUploadEngineFromJSON(m string) FileUploadEngine {
  function ReadFromJson (line 829) | func ReadFromJson(path string) Config {
  function ReadFromYaml (line 848) | func ReadFromYaml(path string) Config {
  function ReadFromINI (line 867) | func ReadFromINI(path string) Config {
  function SetDefault (line 896) | func SetDefault(cfg *Config) *Config {
  function Initialize (line 927) | func Initialize(cfg *Config) *Config {
  function initLogger (line 944) | func initLogger(cfg *Config) {
  function AssertPrefix (line 979) | func AssertPrefix() string {
  function GetIndexURL (line 984) | func GetIndexURL() string {
  function IsProductionEnvironment (line 989) | func IsProductionEnvironment() bool {
  function IsNotProductionEnvironment (line 994) | func IsNotProductionEnvironment() bool {
  function URLRemovePrefix (line 999) | func URLRemovePrefix(url string) string {
  function Url (line 1003) | func Url(suffix string) string {
  function GetURLFormats (line 1007) | func GetURLFormats() URLFormat {
  function Prefix (line 1012) | func Prefix() string {
  function PrefixFixSlash (line 1017) | func PrefixFixSlash() string {
  function Get (line 1022) | func Get() *Config {
  function GetDatabases (line 1032) | func GetDatabases() DatabaseList {
  function GetDomain (line 1043) | func GetDomain() string {
  function GetLanguage (line 1049) | func GetLanguage() string {
  function GetAppID (line 1055) | func GetAppID() string {
  function GetUrlPrefix (line 1061) | func GetUrlPrefix() string {
  function GetOpenAdminApi (line 1067) | func GetOpenAdminApi() bool {
  function GetAllowDelOperationLog (line 1073) | func GetAllowDelOperationLog() bool {
  function GetOperationLogOff (line 1079) | func GetOperationLogOff() bool {
  function GetCustom500HTML (line 1085) | func GetCustom500HTML() template.HTML {
  function GetCustom404HTML (line 1091) | func GetCustom404HTML() template.HTML {
  function GetCustom403HTML (line 1097) | func GetCustom403HTML() template.HTML {
  function GetTheme (line 1103) | func GetTheme() string {
  function GetStore (line 1109) | func GetStore() Store {
  function GetTitle (line 1115) | func GetTitle() string {
  function GetAssetRootPath (line 1121) | func GetAssetRootPath() string {
  function GetLogo (line 1127) | func GetLogo() template.HTML {
  function GetSiteOff (line 1133) | func GetSiteOff() bool {
  function GetMiniLogo (line 1139) | func GetMiniLogo() template.HTML {
  function GetIndexUrl (line 1145) | func GetIndexUrl() string {
  function GetLoginUrl (line 1151) | func GetLoginUrl() string {
  function GetDebug (line 1157) | func GetDebug() bool {
  function GetEnv (line 1163) | func GetEnv() string {
  function GetInfoLogPath (line 1169) | func GetInfoLogPath() string {
  function GetErrorLogPath (line 1175) | func GetErrorLogPath() string {
  function GetAccessLogPath (line 1181) | func GetAccessLogPath() string {
  function GetSqlLog (line 1187) | func GetSqlLog() bool {
  function GetAccessLogOff (line 1193) | func GetAccessLogOff() bool {
  function GetInfoLogOff (line 1198) | func GetInfoLogOff() bool {
  function GetErrorLogOff (line 1203) | func GetErrorLogOff() bool {
  function GetColorScheme (line 1209) | func GetColorScheme() string {
  function GetSessionLifeTime (line 1215) | func GetSessionLifeTime() int {
  function GetAssetUrl (line 1221) | func GetAssetUrl() string {
  function GetFileUploadEngine (line 1227) | func GetFileUploadEngine() FileUploadEngine {
  function GetCustomHeadHtml (line 1233) | func GetCustomHeadHtml() template.HTML {
  function GetCustomFootHtml (line 1239) | func GetCustomFootHtml() template.HTML {
  function GetFooterInfo (line 1245) | func GetFooterInfo() template.HTML {
  function GetLoginTitle (line 1251) | func GetLoginTitle() string {
  function GetLoginLogo (line 1257) | func GetLoginLogo() template.HTML {
  function GetAuthUserTable (line 1263) | func GetAuthUserTable() string {
  function GetExtra (line 1269) | func GetExtra() map[string]interface{} {
  function GetAnimation (line 1275) | func GetAnimation() PageAnimation {
  function GetNoLimitLoginIP (line 1281) | func GetNoLimitLoginIP() bool {
  function GetHideVisitorUserCenterEntrance (line 1287) | func GetHideVisitorUserCenterEntrance() bool {
  function GetExcludeThemeComponents (line 1293) | func GetExcludeThemeComponents() []string {
  type Service (line 1299) | type Service struct
    method Name (line 1303) | func (s *Service) Name() string {
  function SrvWithConfig (line 1307) | func SrvWithConfig(c *Config) *Service {
  function GetService (line 1311) | func GetService(s interface{}) *Config {

FILE: modules/config/config_test.go
  function TestConfig_GetIndexUrl (line 13) | func TestConfig_GetIndexUrl(t *testing.T) {
  function TestConfig_Index (line 36) | func TestConfig_Index(t *testing.T) {
  function TestConfig_Prefix (line 45) | func TestConfig_Prefix(t *testing.T) {
  function TestConfig_Url (line 61) | func TestConfig_Url(t *testing.T) {
  function TestConfig_UrlRemovePrefix (line 78) | func TestConfig_UrlRemovePrefix(t *testing.T) {
  function TestConfig_PrefixFixSlash (line 88) | func TestConfig_PrefixFixSlash(t *testing.T) {
  function TestSet (line 105) | func TestSet(t *testing.T) {
  function TestStore_URL (line 111) | func TestStore_URL(t *testing.T) {
  function TestDatabase_ParamStr (line 140) | func TestDatabase_ParamStr(t *testing.T) {
  function TestReadFromYaml (line 150) | func TestReadFromYaml(t *testing.T) {
  function TestReadFromINI (line 162) | func TestReadFromINI(t *testing.T) {
  function testSetCfg (line 174) | func testSetCfg(cfg *Config) {
  function TestUpdate (line 179) | func TestUpdate(t *testing.T) {
  function TestToMap (line 318) | func TestToMap(t *testing.T) {

FILE: modules/constant/constant.go
  constant PjaxHeader (line 5) | PjaxHeader = "X-PJAX"
  constant PjaxUrlHeader (line 8) | PjaxUrlHeader = "X-PJAX-Url"
  constant Title (line 11) | Title = "GoAdmin"
  constant ContextNodeNeedAuth (line 13) | ContextNodeNeedAuth = "need_auth"
  constant IframeKey (line 15) | IframeKey   = "__goadmin_iframe"
  constant IframeIDKey (line 16) | IframeIDKey = "__goadmin_iframe_id"

FILE: modules/db/base.go
  type Base (line 13) | type Base struct
    method Close (line 20) | func (db *Base) Close() []error {
    method GetDB (line 29) | func (db *Base) GetDB(key string) *sql.DB {
    method CreateDB (line 33) | func (db *Base) CreateDB(name string, beans ...interface{}) error {
    method GetConfig (line 52) | func (db *Base) GetConfig(name string) config.Database {

FILE: modules/db/connection.go
  constant DriverMysql (line 18) | DriverMysql = "mysql"
  constant DriverSqlite (line 20) | DriverSqlite = "sqlite"
  constant DriverPostgresql (line 22) | DriverPostgresql = "postgresql"
  constant DriverMssql (line 24) | DriverMssql = "mssql"
  constant DriverOceanBase (line 26) | DriverOceanBase = "oceanbase"
  type Connection (line 30) | type Connection interface
  function GetConnectionByDriver (line 79) | func GetConnectionByDriver(driver string) Connection {
  function GetConnectionFromService (line 96) | func GetConnectionFromService(srv interface{}) Connection {
  function GetConnection (line 103) | func GetConnection(srvs service.List) Connection {
  function GetAggregationExpression (line 110) | func GetAggregationExpression(driver, field, headField, delimiter string...
  constant INSERT (line 129) | INSERT = 0
  constant DELETE (line 130) | DELETE = 1
  constant UPDATE (line 131) | UPDATE = 2
  constant QUERY (line 132) | QUERY  = 3
  function CheckError (line 163) | func CheckError(err error, t int) bool {

FILE: modules/db/converter.go
  function SetColVarType (line 12) | func SetColVarType(colVar *[]interface{}, i int, typeName string) {
  function SetResultValue (line 37) | func SetResultValue(result *map[string]interface{}, index string, colVar...

FILE: modules/db/dialect/common.go
  type commonDialect (line 5) | type commonDialect struct
    method Insert (line 10) | func (c commonDialect) Insert(comp *SQLComponent) string {
    method Delete (line 15) | func (c commonDialect) Delete(comp *SQLComponent) string {
    method Update (line 20) | func (c commonDialect) Update(comp *SQLComponent) string {
    method Count (line 25) | func (c commonDialect) Count(comp *SQLComponent) string {
    method Select (line 30) | func (c commonDialect) Select(comp *SQLComponent) string {
    method ShowColumns (line 36) | func (c commonDialect) ShowColumns(table string) string {
    method GetName (line 40) | func (c commonDialect) GetName() string {
    method WrapTableName (line 44) | func (c commonDialect) WrapTableName(comp *SQLComponent) string {
    method ShowTables (line 48) | func (c commonDialect) ShowTables() string {
    method ShowColumnsWithComment (line 52) | func (c commonDialect) ShowColumnsWithComment(schema, table string) st...
    method GetDelimiter (line 56) | func (c commonDialect) GetDelimiter() string {
    method GetDelimiter2 (line 60) | func (c commonDialect) GetDelimiter2() string {
    method GetDelimiters (line 64) | func (c commonDialect) GetDelimiters() []string {

FILE: modules/db/dialect/dialect.go
  type Dialect (line 14) | type Dialect interface
  function GetDialect (line 44) | func GetDialect() Dialect {
  function GetDialectByDriver (line 49) | func GetDialectByDriver(driver string) Dialect {
  type H (line 77) | type H
  type SQLComponent (line 80) | type SQLComponent struct
    method getLimit (line 122) | func (sql *SQLComponent) getLimit() string {
    method getOffset (line 129) | func (sql *SQLComponent) getOffset() string {
    method getOrderBy (line 136) | func (sql *SQLComponent) getOrderBy() string {
    method getGroupBy (line 143) | func (sql *SQLComponent) getGroupBy() string {
    method getJoins (line 150) | func (sql *SQLComponent) getJoins(delimiter, delimiter2 string) string {
    method processLeftJoinField (line 163) | func (sql *SQLComponent) processLeftJoinField(field, delimiter, delimi...
    method getFields (line 171) | func (sql *SQLComponent) getFields(delimiter, delimiter2 string) string {
    method getWheres (line 204) | func (sql *SQLComponent) getWheres(delimiter, delimiter2 string) string {
    method prepareUpdate (line 228) | func (sql *SQLComponent) prepareUpdate(delimiter, delimiter2 string) {
    method prepareInsert (line 272) | func (sql *SQLComponent) prepareInsert(delimiter, delimiter2 string) {
  type Where (line 98) | type Where struct
  type Join (line 105) | type Join struct
  type RawUpdate (line 113) | type RawUpdate struct
  function wrap (line 197) | func wrap(delimiter, delimiter2, field string) string {

FILE: modules/db/dialect/mssql.go
  type mssql (line 9) | type mssql struct
    method GetName (line 13) | func (mssql) GetName() string {
    method ShowColumnsWithComment (line 17) | func (mssql) ShowColumnsWithComment(schema, table string) string {
    method ShowColumns (line 21) | func (mssql) ShowColumns(table string) string {
    method ShowTables (line 25) | func (mssql) ShowTables() string {

FILE: modules/db/dialect/mysql.go
  type mysql (line 7) | type mysql struct
    method GetName (line 11) | func (mysql) GetName() string {
    method ShowColumnsWithComment (line 15) | func (mysql) ShowColumnsWithComment(schema, table string) string {
    method ShowColumns (line 25) | func (mysql) ShowColumns(table string) string {
    method ShowTables (line 29) | func (mysql) ShowTables() string {

FILE: modules/db/dialect/oceanbase.go
  type oceanbase (line 3) | type oceanbase struct
    method GetName (line 7) | func (oceanbase) GetName() string {
    method ShowColumnsWithComment (line 11) | func (oceanbase) ShowColumnsWithComment(schema, table string) string {
    method ShowColumns (line 15) | func (oceanbase) ShowColumns(table string) string {
    method ShowTables (line 19) | func (oceanbase) ShowTables() string {

FILE: modules/db/dialect/postgresql.go
  type postgresql (line 12) | type postgresql struct
    method GetName (line 16) | func (postgresql) GetName() string {
    method ShowColumnsWithComment (line 20) | func (postgresql) ShowColumnsWithComment(schema, table string) string {
    method ShowTables (line 29) | func (postgresql) ShowTables() string {
    method ShowColumns (line 33) | func (postgresql) ShowColumns(table string) string {

FILE: modules/db/dialect/sqlite.go
  type sqlite (line 7) | type sqlite struct
    method GetName (line 11) | func (sqlite) GetName() string {
    method ShowColumnsWithComment (line 15) | func (sqlite) ShowColumnsWithComment(schema, table string) string {
    method ShowColumns (line 19) | func (sqlite) ShowColumns(table string) string {
    method ShowTables (line 23) | func (sqlite) ShowTables() string {

FILE: modules/db/mssql.go
  type Mssql (line 18) | type Mssql struct
    method GetDelimiter (line 32) | func (db *Mssql) GetDelimiter() string {
    method GetDelimiter2 (line 37) | func (db *Mssql) GetDelimiter2() string {
    method GetDelimiters (line 42) | func (db *Mssql) GetDelimiters() []string {
    method Name (line 47) | func (db *Mssql) Name() string {
    method handleSqlBeforeExec (line 112) | func (db *Mssql) handleSqlBeforeExec(query string) string {
    method parseSql (line 126) | func (db *Mssql) parseSql(sql string) string {
    method QueryWithConnection (line 214) | func (db *Mssql) QueryWithConnection(con string, query string, args .....
    method ExecWithConnection (line 220) | func (db *Mssql) ExecWithConnection(con string, query string, args ......
    method Query (line 226) | func (db *Mssql) Query(query string, args ...interface{}) ([]map[strin...
    method Exec (line 232) | func (db *Mssql) Exec(query string, args ...interface{}) (sql.Result, ...
    method QueryWith (line 237) | func (db *Mssql) QueryWith(tx *sql.Tx, conn, query string, args ...int...
    method ExecWith (line 244) | func (db *Mssql) ExecWith(tx *sql.Tx, conn, query string, args ...inte...
    method InitDB (line 252) | func (db *Mssql) InitDB(cfgs map[string]config.Database) Connection {
    method BeginTxWithReadUncommitted (line 284) | func (db *Mssql) BeginTxWithReadUncommitted() *sql.Tx {
    method BeginTxWithReadCommitted (line 289) | func (db *Mssql) BeginTxWithReadCommitted() *sql.Tx {
    method BeginTxWithRepeatableRead (line 294) | func (db *Mssql) BeginTxWithRepeatableRead() *sql.Tx {
    method BeginTx (line 299) | func (db *Mssql) BeginTx() *sql.Tx {
    method BeginTxWithLevel (line 304) | func (db *Mssql) BeginTxWithLevel(level sql.IsolationLevel) *sql.Tx {
    method BeginTxWithReadUncommittedAndConnection (line 309) | func (db *Mssql) BeginTxWithReadUncommittedAndConnection(conn string) ...
    method BeginTxWithReadCommittedAndConnection (line 314) | func (db *Mssql) BeginTxWithReadCommittedAndConnection(conn string) *s...
    method BeginTxWithRepeatableReadAndConnection (line 319) | func (db *Mssql) BeginTxWithRepeatableReadAndConnection(conn string) *...
    method BeginTxAndConnection (line 324) | func (db *Mssql) BeginTxAndConnection(conn string) *sql.Tx {
    method BeginTxWithLevelAndConnection (line 329) | func (db *Mssql) BeginTxWithLevelAndConnection(conn string, level sql....
    method QueryWithTx (line 334) | func (db *Mssql) QueryWithTx(tx *sql.Tx, query string, args ...interfa...
    method ExecWithTx (line 340) | func (db *Mssql) ExecWithTx(tx *sql.Tx, query string, args ...interfac...
  function GetMssqlDB (line 23) | func GetMssqlDB() *Mssql {
  function replaceStringFunc (line 53) | func replaceStringFunc(pattern, src string, rpl func(s string) string) (...
  function replace (line 67) | func replace(pattern string, replace, src []byte) ([]byte, error) {
  function replaceString (line 77) | func replaceString(pattern, rep, src string) (string, error) {
  function matchAllString (line 82) | func matchAllString(pattern string, src string) ([][]string, error) {
  function isMatch (line 90) | func isMatch(pattern string, src []byte) bool {
  function isMatchString (line 98) | func isMatchString(pattern string, src string) bool {
  function matchString (line 102) | func matchString(pattern string, src string) ([]string, error) {

FILE: modules/db/mysql.go
  type SQLTx (line 14) | type SQLTx struct
  type Mysql (line 19) | type Mysql struct
    method Name (line 33) | func (db *Mysql) Name() string {
    method GetDelimiter (line 38) | func (db *Mysql) GetDelimiter() string {
    method GetDelimiter2 (line 43) | func (db *Mysql) GetDelimiter2() string {
    method GetDelimiters (line 48) | func (db *Mysql) GetDelimiters() []string {
    method InitDB (line 53) | func (db *Mysql) InitDB(cfgs map[string]config.Database) Connection {
    method QueryWithConnection (line 84) | func (db *Mysql) QueryWithConnection(con string, query string, args .....
    method ExecWithConnection (line 89) | func (db *Mysql) ExecWithConnection(con string, query string, args ......
    method Query (line 94) | func (db *Mysql) Query(query string, args ...interface{}) ([]map[strin...
    method Exec (line 99) | func (db *Mysql) Exec(query string, args ...interface{}) (sql.Result, ...
    method QueryWithTx (line 104) | func (db *Mysql) QueryWithTx(tx *sql.Tx, query string, args ...interfa...
    method ExecWithTx (line 109) | func (db *Mysql) ExecWithTx(tx *sql.Tx, query string, args ...interfac...
    method QueryWith (line 113) | func (db *Mysql) QueryWith(tx *sql.Tx, conn, query string, args ...int...
    method ExecWith (line 120) | func (db *Mysql) ExecWith(tx *sql.Tx, conn, query string, args ...inte...
    method BeginTxWithReadUncommitted (line 128) | func (db *Mysql) BeginTxWithReadUncommitted() *sql.Tx {
    method BeginTxWithReadCommitted (line 133) | func (db *Mysql) BeginTxWithReadCommitted() *sql.Tx {
    method BeginTxWithRepeatableRead (line 138) | func (db *Mysql) BeginTxWithRepeatableRead() *sql.Tx {
    method BeginTx (line 143) | func (db *Mysql) BeginTx() *sql.Tx {
    method BeginTxWithLevel (line 148) | func (db *Mysql) BeginTxWithLevel(level sql.IsolationLevel) *sql.Tx {
    method BeginTxWithReadUncommittedAndConnection (line 153) | func (db *Mysql) BeginTxWithReadUncommittedAndConnection(conn string) ...
    method BeginTxWithReadCommittedAndConnection (line 158) | func (db *Mysql) BeginTxWithReadCommittedAndConnection(conn string) *s...
    method BeginTxWithRepeatableReadAndConnection (line 163) | func (db *Mysql) BeginTxWithRepeatableReadAndConnection(conn string) *...
    method BeginTxAndConnection (line 168) | func (db *Mysql) BeginTxAndConnection(conn string) *sql.Tx {
    method BeginTxWithLevelAndConnection (line 173) | func (db *Mysql) BeginTxWithLevelAndConnection(conn string, level sql....
  function GetMysqlDB (line 24) | func GetMysqlDB() *Mysql {

FILE: modules/db/oceanbase.go
  type OceanBase (line 9) | type OceanBase struct
    method Name (line 23) | func (db *OceanBase) Name() string {
    method GetDelimiter (line 28) | func (db *OceanBase) GetDelimiter() string {
    method GetDelimiter2 (line 33) | func (db *OceanBase) GetDelimiter2() string {
    method GetDelimiters (line 38) | func (db *OceanBase) GetDelimiters() []string {
    method InitDB (line 43) | func (db *OceanBase) InitDB(cfgs map[string]config.Database) Connection {
    method QueryWithConnection (line 74) | func (db *OceanBase) QueryWithConnection(con string, query string, arg...
    method ExecWithConnection (line 79) | func (db *OceanBase) ExecWithConnection(con string, query string, args...
    method Query (line 84) | func (db *OceanBase) Query(query string, args ...interface{}) ([]map[s...
    method Exec (line 89) | func (db *OceanBase) Exec(query string, args ...interface{}) (sql.Resu...
    method QueryWithTx (line 94) | func (db *OceanBase) QueryWithTx(tx *sql.Tx, query string, args ...int...
    method ExecWithTx (line 99) | func (db *OceanBase) ExecWithTx(tx *sql.Tx, query string, args ...inte...
    method QueryWith (line 103) | func (db *OceanBase) QueryWith(tx *sql.Tx, conn, query string, args .....
    method ExecWith (line 110) | func (db *OceanBase) ExecWith(tx *sql.Tx, conn, query string, args ......
    method BeginTxWithReadUncommitted (line 118) | func (db *OceanBase) BeginTxWithReadUncommitted() *sql.Tx {
    method BeginTxWithReadCommitted (line 123) | func (db *OceanBase) BeginTxWithReadCommitted() *sql.Tx {
    method BeginTxWithRepeatableRead (line 128) | func (db *OceanBase) BeginTxWithRepeatableRead() *sql.Tx {
    method BeginTx (line 133) | func (db *OceanBase) BeginTx() *sql.Tx {
    method BeginTxWithLevel (line 138) | func (db *OceanBase) BeginTxWithLevel(level sql.IsolationLevel) *sql.Tx {
    method BeginTxWithReadUncommittedAndConnection (line 143) | func (db *OceanBase) BeginTxWithReadUncommittedAndConnection(conn stri...
    method BeginTxWithReadCommittedAndConnection (line 148) | func (db *OceanBase) BeginTxWithReadCommittedAndConnection(conn string...
    method BeginTxWithRepeatableReadAndConnection (line 153) | func (db *OceanBase) BeginTxWithRepeatableReadAndConnection(conn strin...
    method BeginTxAndConnection (line 158) | func (db *OceanBase) BeginTxAndConnection(conn string) *sql.Tx {
    method BeginTxWithLevelAndConnection (line 163) | func (db *OceanBase) BeginTxWithLevelAndConnection(conn string, level ...
  function GetOceanBaseDB (line 14) | func GetOceanBaseDB() *OceanBase {

FILE: modules/db/performer.go
  function CommonQuery (line 15) | func CommonQuery(db *sql.DB, query string, args ...interface{}) ([]map[s...
  function CommonExec (line 68) | func CommonExec(db *sql.DB, query string, args ...interface{}) (sql.Resu...
  function CommonQueryWithTx (line 78) | func CommonQueryWithTx(tx *sql.Tx, query string, args ...interface{}) ([...
  function CommonExecWithTx (line 131) | func CommonExecWithTx(tx *sql.Tx, query string, args ...interface{}) (sq...
  function CommonBeginTxWithLevel (line 140) | func CommonBeginTxWithLevel(db *sql.DB, level sql.IsolationLevel) *sql.Tx {

FILE: modules/db/postgresql.go
  type Postgresql (line 16) | type Postgresql struct
    method Name (line 30) | func (db *Postgresql) Name() string {
    method GetDelimiter (line 35) | func (db *Postgresql) GetDelimiter() string {
    method GetDelimiter2 (line 40) | func (db *Postgresql) GetDelimiter2() string {
    method GetDelimiters (line 45) | func (db *Postgresql) GetDelimiters() []string {
    method QueryWithConnection (line 50) | func (db *Postgresql) QueryWithConnection(con string, query string, ar...
    method ExecWithConnection (line 55) | func (db *Postgresql) ExecWithConnection(con string, query string, arg...
    method Query (line 60) | func (db *Postgresql) Query(query string, args ...interface{}) ([]map[...
    method Exec (line 65) | func (db *Postgresql) Exec(query string, args ...interface{}) (sql.Res...
    method QueryWith (line 69) | func (db *Postgresql) QueryWith(tx *sql.Tx, conn, query string, args ....
    method ExecWith (line 76) | func (db *Postgresql) ExecWith(tx *sql.Tx, conn, query string, args .....
    method InitDB (line 94) | func (db *Postgresql) InitDB(cfgList map[string]config.Database) Conne...
    method BeginTxWithReadUncommitted (line 122) | func (db *Postgresql) BeginTxWithReadUncommitted() *sql.Tx {
    method BeginTxWithReadCommitted (line 127) | func (db *Postgresql) BeginTxWithReadCommitted() *sql.Tx {
    method BeginTxWithRepeatableRead (line 132) | func (db *Postgresql) BeginTxWithRepeatableRead() *sql.Tx {
    method BeginTx (line 137) | func (db *Postgresql) BeginTx() *sql.Tx {
    method BeginTxWithLevel (line 142) | func (db *Postgresql) BeginTxWithLevel(level sql.IsolationLevel) *sql....
    method BeginTxWithReadUncommittedAndConnection (line 147) | func (db *Postgresql) BeginTxWithReadUncommittedAndConnection(conn str...
    method BeginTxWithReadCommittedAndConnection (line 152) | func (db *Postgresql) BeginTxWithReadCommittedAndConnection(conn strin...
    method BeginTxWithRepeatableReadAndConnection (line 157) | func (db *Postgresql) BeginTxWithRepeatableReadAndConnection(conn stri...
    method BeginTxAndConnection (line 162) | func (db *Postgresql) BeginTxAndConnection(conn string) *sql.Tx {
    method BeginTxWithLevelAndConnection (line 167) | func (db *Postgresql) BeginTxWithLevelAndConnection(conn string, level...
    method QueryWithTx (line 172) | func (db *Postgresql) QueryWithTx(tx *sql.Tx, query string, args ...in...
    method ExecWithTx (line 177) | func (db *Postgresql) ExecWithTx(tx *sql.Tx, query string, args ...int...
  function GetPostgresqlDB (line 21) | func GetPostgresqlDB() *Postgresql {
  function filterQuery (line 83) | func filterQuery(query string) string {

FILE: modules/db/sqlite.go
  type Sqlite (line 14) | type Sqlite struct
    method Name (line 28) | func (db *Sqlite) Name() string {
    method GetDelimiter (line 33) | func (db *Sqlite) GetDelimiter() string {
    method GetDelimiter2 (line 38) | func (db *Sqlite) GetDelimiter2() string {
    method GetDelimiters (line 43) | func (db *Sqlite) GetDelimiters() []string {
    method QueryWithConnection (line 48) | func (db *Sqlite) QueryWithConnection(con string, query string, args ....
    method ExecWithConnection (line 53) | func (db *Sqlite) ExecWithConnection(con string, query string, args .....
    method Query (line 58) | func (db *Sqlite) Query(query string, args ...interface{}) ([]map[stri...
    method Exec (line 63) | func (db *Sqlite) Exec(query string, args ...interface{}) (sql.Result,...
    method QueryWith (line 67) | func (db *Sqlite) QueryWith(tx *sql.Tx, conn, query string, args ...in...
    method ExecWith (line 74) | func (db *Sqlite) ExecWith(tx *sql.Tx, conn, query string, args ...int...
    method InitDB (line 82) | func (db *Sqlite) InitDB(cfgList map[string]config.Database) Connection {
    method BeginTxWithReadUncommitted (line 108) | func (db *Sqlite) BeginTxWithReadUncommitted() *sql.Tx {
    method BeginTxWithReadCommitted (line 113) | func (db *Sqlite) BeginTxWithReadCommitted() *sql.Tx {
    method BeginTxWithRepeatableRead (line 118) | func (db *Sqlite) BeginTxWithRepeatableRead() *sql.Tx {
    method BeginTx (line 123) | func (db *Sqlite) BeginTx() *sql.Tx {
    method BeginTxWithLevel (line 128) | func (db *Sqlite) BeginTxWithLevel(level sql.IsolationLevel) *sql.Tx {
    method BeginTxWithReadUncommittedAndConnection (line 133) | func (db *Sqlite) BeginTxWithReadUncommittedAndConnection(conn string)...
    method BeginTxWithReadCommittedAndConnection (line 138) | func (db *Sqlite) BeginTxWithReadCommittedAndConnection(conn string) *...
    method BeginTxWithRepeatableReadAndConnection (line 143) | func (db *Sqlite) BeginTxWithRepeatableReadAndConnection(conn string) ...
    method BeginTxAndConnection (line 148) | func (db *Sqlite) BeginTxAndConnection(conn string) *sql.Tx {
    method BeginTxWithLevelAndConnection (line 153) | func (db *Sqlite) BeginTxWithLevelAndConnection(conn string, level sql...
    method QueryWithTx (line 158) | func (db *Sqlite) QueryWithTx(tx *sql.Tx, query string, args ...interf...
    method ExecWithTx (line 163) | func (db *Sqlite) ExecWithTx(tx *sql.Tx, query string, args ...interfa...
  function GetSqliteDB (line 19) | func GetSqliteDB() *Sqlite {

FILE: modules/db/statement.go
  type SQL (line 20) | type SQL struct
    method WithDriver (line 89) | func (sql *SQL) WithDriver(conn Connection) *SQL {
    method WithConnection (line 96) | func (sql *SQL) WithConnection(conn string) *SQL {
    method WithTx (line 102) | func (sql *SQL) WithTx(tx *dbsql.Tx) *SQL {
    method Table (line 108) | func (sql *SQL) Table(table string) *SQL {
    method Select (line 115) | func (sql *SQL) Select(fields ...string) *SQL {
    method OrderBy (line 130) | func (sql *SQL) OrderBy(fields ...string) *SQL {
    method OrderByRaw (line 145) | func (sql *SQL) OrderByRaw(order string) *SQL {
    method GroupBy (line 152) | func (sql *SQL) GroupBy(fields ...string) *SQL {
    method GroupByRaw (line 167) | func (sql *SQL) GroupByRaw(group string) *SQL {
    method Skip (line 175) | func (sql *SQL) Skip(offset int) *SQL {
    method Take (line 181) | func (sql *SQL) Take(take int) *SQL {
    method Where (line 187) | func (sql *SQL) Where(field string, operation string, arg interface{})...
    method WhereIn (line 198) | func (sql *SQL) WhereIn(field string, arg []interface{}) *SQL {
    method WhereNotIn (line 212) | func (sql *SQL) WhereNotIn(field string, arg []interface{}) *SQL {
    method Find (line 226) | func (sql *SQL) Find(arg interface{}) (map[string]interface{}, error) {
    method Count (line 231) | func (sql *SQL) Count() (int64, error) {
    method Sum (line 252) | func (sql *SQL) Sum(field string) (float64, error) {
    method Max (line 276) | func (sql *SQL) Max(field string) (interface{}, error) {
    method Min (line 294) | func (sql *SQL) Min(field string) (interface{}, error) {
    method Avg (line 312) | func (sql *SQL) Avg(field string) (interface{}, error) {
    method WhereRaw (line 330) | func (sql *SQL) WhereRaw(raw string, args ...interface{}) *SQL {
    method UpdateRaw (line 337) | func (sql *SQL) UpdateRaw(raw string, args ...interface{}) *SQL {
    method LeftJoin (line 346) | func (sql *SQL) LeftJoin(table string, fieldA string, operation string...
    method WithTransaction (line 365) | func (sql *SQL) WithTransaction(fn TxFn) (res map[string]interface{}, ...
    method WithTransactionByLevel (line 389) | func (sql *SQL) WithTransactionByLevel(level dbsql.IsolationLevel, fn ...
    method First (line 419) | func (sql *SQL) First() (map[string]interface{}, error) {
    method All (line 437) | func (sql *SQL) All() ([]map[string]interface{}, error) {
    method ShowColumns (line 446) | func (sql *SQL) ShowColumns() ([]map[string]interface{}, error) {
    method ShowColumnsWithComment (line 453) | func (sql *SQL) ShowColumnsWithComment(database string) ([]map[string]...
    method ShowTables (line 460) | func (sql *SQL) ShowTables() ([]string, error) {
    method Update (line 496) | func (sql *SQL) Update(values dialect.H) (int64, error) {
    method Delete (line 517) | func (sql *SQL) Delete() error {
    method Exec (line 536) | func (sql *SQL) Exec() (int64, error) {
    method Insert (line 557) | func (sql *SQL) Insert(values dialect.H) (int64, error) {
    method wrap (line 610) | func (sql *SQL) wrap(field string) string {
    method clean (line 614) | func (sql *SQL) clean() {
  type H (line 51) | type H
  function newSQL (line 54) | func newSQL() *SQL {
  function Table (line 63) | func Table(table string) *SQL {
  function WithDriver (line 71) | func WithDriver(conn Connection) *SQL {
  function WithDriverAndConnection (line 80) | func WithDriverAndConnection(connName string, conn Connection) *SQL {
  type TxFn (line 361) | type TxFn
  constant postgresInsertCheckTableName (line 554) | postgresInsertCheckTableName = "goadmin_menu|goadmin_permissions|goadmin...
  function RecycleSQL (line 632) | func RecycleSQL(sql *SQL) {

FILE: modules/db/statement_mssql_test.go
  function InitMssql (line 12) | func InitMssql() {
  function TestMssqlSQL_WhereIn (line 22) | func TestMssqlSQL_WhereIn(t *testing.T)         { testSQLWhereIn(t, driv...
  function TestMssqlSQL_Count (line 23) | func TestMssqlSQL_Count(t *testing.T)           { testSQLCount(t, driver...
  function TestMssqlSQL_Select (line 24) | func TestMssqlSQL_Select(t *testing.T)          { testSQLSelect(t, drive...
  function TestMssqlSQL_OrderBy (line 25) | func TestMssqlSQL_OrderBy(t *testing.T)         { testSQLOrderBy(t, driv...
  function TestMssqlSQL_GroupBy (line 26) | func TestMssqlSQL_GroupBy(t *testing.T)         { testSQLGroupBy(t, driv...
  function TestMssqlSQL_Skip (line 27) | func TestMssqlSQL_Skip(t *testing.T)            { testSQLSkip(t, driverT...
  function TestMssqlSQL_Take (line 28) | func TestMssqlSQL_Take(t *testing.T)            { testSQLTake(t, driverT...
  function TestMssqlSQL_Where (line 29) | func TestMssqlSQL_Where(t *testing.T)           { testSQLWhere(t, driver...
  function TestMssqlSQL_WhereNotIn (line 30) | func TestMssqlSQL_WhereNotIn(t *testing.T)      { testSQLWhereNotIn(t, d...
  function TestMssqlSQL_Find (line 31) | func TestMssqlSQL_Find(t *testing.T)            { testSQLFind(t, driverT...
  function TestMssqlSQL_Sum (line 32) | func TestMssqlSQL_Sum(t *testing.T)             { testSQLSum(t, driverTe...
  function TestMssqlSQL_Max (line 33) | func TestMssqlSQL_Max(t *testing.T)             { testSQLMax(t, driverTe...
  function TestMssqlSQL_Min (line 34) | func TestMssqlSQL_Min(t *testing.T)             { testSQLMin(t, driverTe...
  function TestMssqlSQL_Avg (line 35) | func TestMssqlSQL_Avg(t *testing.T)             { testSQLAvg(t, driverTe...
  function TestMssqlSQL_WhereRaw (line 36) | func TestMssqlSQL_WhereRaw(t *testing.T)        { testSQLWhereRaw(t, dri...
  function TestMssqlSQL_UpdateRaw (line 37) | func TestMssqlSQL_UpdateRaw(t *testing.T)       { testSQLUpdateRaw(t, dr...
  function TestMssqlSQL_LeftJoin (line 38) | func TestMssqlSQL_LeftJoin(t *testing.T)        { testSQLLeftJoin(t, dri...
  function TestMssqlSQL_WithTransaction (line 39) | func TestMssqlSQL_WithTransaction(t *testing.T) { testSQLWithTransaction...
  function TestMssqlSQL_WithTransactionByLevel (line 40) | func TestMssqlSQL_WithTransactionByLevel(t *testing.T) {
  function TestMssqlSQL_First (line 43) | func TestMssqlSQL_First(t *testing.T)       { testSQLFirst(t, driverTest...
  function TestMssqlSQL_All (line 44) | func TestMssqlSQL_All(t *testing.T)         { testSQLAll(t, driverTestMs...
  function TestMssqlSQL_ShowColumns (line 45) | func TestMssqlSQL_ShowColumns(t *testing.T) { testSQLShowColumns(t, driv...
  function TestMssqlSQL_ShowTables (line 46) | func TestMssqlSQL_ShowTables(t *testing.T)  { testSQLShowTables(t, drive...
  function TestMssqlSQL_Update (line 47) | func TestMssqlSQL_Update(t *testing.T)      { testSQLUpdate(t, driverTes...
  function TestMssqlSQL_Delete (line 48) | func TestMssqlSQL_Delete(t *testing.T)      { testSQLDelete(t, driverTes...
  function TestMssqlSQL_Exec (line 49) | func TestMssqlSQL_Exec(t *testing.T)        { testSQLExec(t, driverTestM...
  function TestMssqlSQL_Insert (line 50) | func TestMssqlSQL_Insert(t *testing.T)      { testSQLInsert(t, driverTes...
  function TestMssqlSQL_Wrap (line 51) | func TestMssqlSQL_Wrap(t *testing.T)        { testSQLWrap(t, driverTestM...

FILE: modules/db/statement_mysql_test.go
  constant driverTestDBName (line 14) | driverTestDBName = "go-admin-statement-test"
  function InitMysql (line 17) | func InitMysql() {
  function TestMysqlSQL_WhereIn (line 34) | func TestMysqlSQL_WhereIn(t *testing.T)         { testSQLWhereIn(t, driv...
  function TestMysqlSQL_Count (line 35) | func TestMysqlSQL_Count(t *testing.T)           { testSQLCount(t, driver...
  function TestMysqlSQL_Select (line 36) | func TestMysqlSQL_Select(t *testing.T)          { testSQLSelect(t, drive...
  function TestMysqlSQL_OrderBy (line 37) | func TestMysqlSQL_OrderBy(t *testing.T)         { testSQLOrderBy(t, driv...
  function TestMysqlSQL_GroupBy (line 38) | func TestMysqlSQL_GroupBy(t *testing.T)         { testSQLGroupBy(t, driv...
  function TestMysqlSQL_Skip (line 39) | func TestMysqlSQL_Skip(t *testing.T)            { testSQLSkip(t, driverT...
  function TestMysqlSQL_Take (line 40) | func TestMysqlSQL_Take(t *testing.T)            { testSQLTake(t, driverT...
  function TestMysqlSQL_Where (line 41) | func TestMysqlSQL_Where(t *testing.T)           { testSQLWhere(t, driver...
  function TestMysqlSQL_WhereNotIn (line 42) | func TestMysqlSQL_WhereNotIn(t *testing.T)      { testSQLWhereNotIn(t, d...
  function TestMysqlSQL_Find (line 43) | func TestMysqlSQL_Find(t *testing.T)            { testSQLFind(t, driverT...
  function TestMysqlSQL_Sum (line 44) | func TestMysqlSQL_Sum(t *testing.T)             { testSQLSum(t, driverTe...
  function TestMysqlSQL_Max (line 45) | func TestMysqlSQL_Max(t *testing.T)             { testSQLMax(t, driverTe...
  function TestMysqlSQL_Min (line 46) | func TestMysqlSQL_Min(t *testing.T)             { testSQLMin(t, driverTe...
  function TestMysqlSQL_Avg (line 47) | func TestMysqlSQL_Avg(t *testing.T)             { testSQLAvg(t, driverTe...
  function TestMysqlSQL_WhereRaw (line 48) | func TestMysqlSQL_WhereRaw(t *testing.T)        { testSQLWhereRaw(t, dri...
  function TestMysqlSQL_UpdateRaw (line 49) | func TestMysqlSQL_UpdateRaw(t *testing.T)       { testSQLUpdateRaw(t, dr...
  function TestMysqlSQL_LeftJoin (line 50) | func TestMysqlSQL_LeftJoin(t *testing.T)        { testSQLLeftJoin(t, dri...
  function TestMysqlSQL_WithTransaction (line 51) | func TestMysqlSQL_WithTransaction(t *testing.T) { testSQLWithTransaction...
  function TestMysqlSQL_WithTransactionByLevel (line 52) | func TestMysqlSQL_WithTransactionByLevel(t *testing.T) {
  function TestMysqlSQL_First (line 55) | func TestMysqlSQL_First(t *testing.T)       { testSQLFirst(t, driverTest...
  function TestMysqlSQL_All (line 56) | func TestMysqlSQL_All(t *testing.T)         { testSQLAll(t, driverTestMy...
  function TestMysqlSQL_ShowColumns (line 57) | func TestMysqlSQL_ShowColumns(t *testing.T) { testSQLShowColumns(t, driv...
  function TestMysqlSQL_ShowTables (line 58) | func TestMysqlSQL_ShowTables(t *testing.T)  { testSQLShowTables(t, drive...
  function TestMysqlSQL_Update (line 59) | func TestMysqlSQL_Update(t *testing.T)      { testSQLUpdate(t, driverTes...
  function TestMysqlSQL_Delete (line 60) | func TestMysqlSQL_Delete(t *testing.T)      { testSQLDelete(t, driverTes...
  function TestMysqlSQL_Exec (line 61) | func TestMysqlSQL_Exec(t *testing.T)        { testSQLExec(t, driverTestM...
  function TestMysqlSQL_Insert (line 62) | func TestMysqlSQL_Insert(t *testing.T)      { testSQLInsert(t, driverTes...
  function TestMysqlSQL_Wrap (line 63) | func TestMysqlSQL_Wrap(t *testing.T)        { testSQLWrap(t, driverTestM...

FILE: modules/db/statement_postgresql_test.go
  function InitPostgresql (line 15) | func InitPostgresql() {
  function TestPgSQL_WhereIn (line 35) | func TestPgSQL_WhereIn(t *testing.T)         { testSQLWhereIn(t, driverT...
  function TestPgSQL_Count (line 36) | func TestPgSQL_Count(t *testing.T)           { testSQLCount(t, driverTes...
  function TestPgSQL_Select (line 37) | func TestPgSQL_Select(t *testing.T)          { testSQLSelect(t, driverTe...
  function TestPgSQL_OrderBy (line 38) | func TestPgSQL_OrderBy(t *testing.T)         { testSQLOrderBy(t, driverT...
  function TestPgSQL_GroupBy (line 39) | func TestPgSQL_GroupBy(t *testing.T)         { testSQLGroupBy(t, driverT...
  function TestPgSQL_Skip (line 40) | func TestPgSQL_Skip(t *testing.T)            { testSQLSkip(t, driverTest...
  function TestPgSQL_Take (line 41) | func TestPgSQL_Take(t *testing.T)            { testSQLTake(t, driverTest...
  function TestPgSQL_Where (line 42) | func TestPgSQL_Where(t *testing.T)           { testSQLWhere(t, driverTes...
  function TestPgSQL_WhereNotIn (line 43) | func TestPgSQL_WhereNotIn(t *testing.T)      { testSQLWhereNotIn(t, driv...
  function TestPgSQL_Find (line 44) | func TestPgSQL_Find(t *testing.T)            { testSQLFind(t, driverTest...
  function TestPgSQL_Sum (line 45) | func TestPgSQL_Sum(t *testing.T)             { testSQLSum(t, driverTestP...
  function TestPgSQL_Max (line 46) | func TestPgSQL_Max(t *testing.T)             { testSQLMax(t, driverTestP...
  function TestPgSQL_Min (line 47) | func TestPgSQL_Min(t *testing.T)             { testSQLMin(t, driverTestP...
  function TestPgSQL_Avg (line 48) | func TestPgSQL_Avg(t *testing.T)             { testSQLAvg(t, driverTestP...
  function TestPgSQL_WhereRaw (line 49) | func TestPgSQL_WhereRaw(t *testing.T)        { testSQLWhereRaw(t, driver...
  function TestPgSQL_UpdateRaw (line 50) | func TestPgSQL_UpdateRaw(t *testing.T)       { testSQLUpdateRaw(t, drive...
  function TestPgSQL_LeftJoin (line 51) | func TestPgSQL_LeftJoin(t *testing.T)        { testSQLLeftJoin(t, driver...
  function TestPgSQL_WithTransaction (line 52) | func TestPgSQL_WithTransaction(t *testing.T) { testSQLWithTransaction(t,...
  function TestPgSQL_WithTransactionByLevel (line 53) | func TestPgSQL_WithTransactionByLevel(t *testing.T) {
  function TestPgSQL_First (line 56) | func TestPgSQL_First(t *testing.T)       { testSQLFirst(t, driverTestPgC...
  function TestPgSQL_All (line 57) | func TestPgSQL_All(t *testing.T)         { testSQLAll(t, driverTestPgCon...
  function TestPgSQL_ShowColumns (line 58) | func TestPgSQL_ShowColumns(t *testing.T) { testSQLShowColumns(t, driverT...
  function TestPgSQL_ShowTables (line 59) | func TestPgSQL_ShowTables(t *testing.T)  { testSQLShowTables(t, driverTe...
  function TestPgSQL_Update (line 60) | func TestPgSQL_Update(t *testing.T)      { testSQLUpdate(t, driverTestPg...
  function TestPgSQL_Delete (line 61) | func TestPgSQL_Delete(t *testing.T)      { testSQLDelete(t, driverTestPg...
  function TestPgSQL_Exec (line 62) | func TestPgSQL_Exec(t *testing.T)        { testSQLExec(t, driverTestPgCo...
  function TestPgSQL_Insert (line 63) | func TestPgSQL_Insert(t *testing.T)      { testSQLInsert(t, driverTestPg...
  function TestPgSQL_Wrap (line 64) | func TestPgSQL_Wrap(t *testing.T)        { testSQLWrap(t, driverTestPgCo...

FILE: modules/db/statement_sqlite_test.go
  function InitSqlite (line 12) | func InitSqlite() {
  function TestSQLiteSQL_WhereIn (line 16) | func TestSQLiteSQL_WhereIn(t *testing.T)         { testSQLWhereIn(t, dri...
  function TestSQLiteSQL_Count (line 17) | func TestSQLiteSQL_Count(t *testing.T)           { testSQLCount(t, drive...
  function TestSQLiteSQL_Select (line 18) | func TestSQLiteSQL_Select(t *testing.T)          { testSQLSelect(t, driv...
  function TestSQLiteSQL_OrderBy (line 19) | func TestSQLiteSQL_OrderBy(t *testing.T)         { testSQLOrderBy(t, dri...
  function TestSQLiteSQL_GroupBy (line 20) | func TestSQLiteSQL_GroupBy(t *testing.T)         { testSQLGroupBy(t, dri...
  function TestSQLiteSQL_Skip (line 21) | func TestSQLiteSQL_Skip(t *testing.T)            { testSQLSkip(t, driver...
  function TestSQLiteSQL_Take (line 22) | func TestSQLiteSQL_Take(t *testing.T)            { testSQLTake(t, driver...
  function TestSQLiteSQL_Where (line 23) | func TestSQLiteSQL_Where(t *testing.T)           { testSQLWhere(t, drive...
  function TestSQLiteSQL_WhereNotIn (line 24) | func TestSQLiteSQL_WhereNotIn(t *testing.T)      { testSQLWhereNotIn(t, ...
  function TestSQLiteSQL_Find (line 25) | func TestSQLiteSQL_Find(t *testing.T)            { testSQLFind(t, driver...
  function TestSQLiteSQL_Sum (line 26) | func TestSQLiteSQL_Sum(t *testing.T)             { testSQLSum(t, driverT...
  function TestSQLiteSQL_Max (line 27) | func TestSQLiteSQL_Max(t *testing.T)             { testSQLMax(t, driverT...
  function TestSQLiteSQL_Min (line 28) | func TestSQLiteSQL_Min(t *testing.T)             { testSQLMin(t, driverT...
  function TestSQLiteSQL_Avg (line 29) | func TestSQLiteSQL_Avg(t *testing.T)             { testSQLAvg(t, driverT...
  function TestSQLiteSQL_WhereRaw (line 30) | func TestSQLiteSQL_WhereRaw(t *testing.T)        { testSQLWhereRaw(t, dr...
  function TestSQLiteSQL_UpdateRaw (line 31) | func TestSQLiteSQL_UpdateRaw(t *testing.T)       { testSQLUpdateRaw(t, d...
  function TestSQLiteSQL_LeftJoin (line 32) | func TestSQLiteSQL_LeftJoin(t *testing.T)        { testSQLLeftJoin(t, dr...
  function TestSQLiteSQL_WithTransaction (line 33) | func TestSQLiteSQL_WithTransaction(t *testing.T) { testSQLWithTransactio...
  function TestSQLiteSQL_WithTransactionByLevel (line 34) | func TestSQLiteSQL_WithTransactionByLevel(t *testing.T) {
  function TestSQLiteSQL_First (line 37) | func TestSQLiteSQL_First(t *testing.T)       { testSQLFirst(t, driverTes...
  function TestSQLiteSQL_All (line 38) | func TestSQLiteSQL_All(t *testing.T)         { testSQLAll(t, driverTestS...
  function TestSQLiteSQL_ShowColumns (line 39) | func TestSQLiteSQL_ShowColumns(t *testing.T) { testSQLShowColumns(t, dri...
  function TestSQLiteSQL_ShowTables (line 40) | func TestSQLiteSQL_ShowTables(t *testing.T)  { testSQLShowTables(t, driv...
  function TestSQLiteSQL_Update (line 41) | func TestSQLiteSQL_Update(t *testing.T)      { testSQLUpdate(t, driverTe...
  function TestSQLiteSQL_Delete (line 42) | func TestSQLiteSQL_Delete(t *testing.T)      { testSQLDelete(t, driverTe...
  function TestSQLiteSQL_Exec (line 43) | func TestSQLiteSQL_Exec(t *testing.T)        { testSQLExec(t, driverTest...
  function TestSQLiteSQL_Insert (line 44) | func TestSQLiteSQL_Insert(t *testing.T)      { testSQLInsert(t, driverTe...
  function TestSQLiteSQL_Wrap (line 45) | func TestSQLiteSQL_Wrap(t *testing.T)        { testSQLWrap(t, driverTest...

FILE: modules/db/statement_test.go
  function testSQLWhereIn (line 12) | func testSQLWhereIn(t *testing.T, conn Connection) {
  function testSQLCount (line 24) | func testSQLCount(t *testing.T, conn Connection) {
  function testSQLSelect (line 30) | func testSQLSelect(t *testing.T, conn Connection) {}
  function testSQLOrderBy (line 33) | func testSQLOrderBy(t *testing.T, conn Connection) {}
  function testSQLGroupBy (line 36) | func testSQLGroupBy(t *testing.T, conn Connection) {}
  function testSQLSkip (line 39) | func testSQLSkip(t *testing.T, conn Connection) {}
  function testSQLTake (line 42) | func testSQLTake(t *testing.T, conn Connection) {}
  function testSQLWhere (line 45) | func testSQLWhere(t *testing.T, conn Connection) {}
  function testSQLWhereNotIn (line 48) | func testSQLWhereNotIn(t *testing.T, conn Connection) {}
  function testSQLFind (line 51) | func testSQLFind(t *testing.T, conn Connection) {}
  function testSQLSum (line 54) | func testSQLSum(t *testing.T, conn Connection) {}
  function testSQLMax (line 57) | func testSQLMax(t *testing.T, conn Connection) {}
  function testSQLMin (line 60) | func testSQLMin(t *testing.T, conn Connection) {}
  function testSQLAvg (line 63) | func testSQLAvg(t *testing.T, conn Connection) {}
  function testSQLWhereRaw (line 66) | func testSQLWhereRaw(t *testing.T, conn Connection) {}
  function testSQLUpdateRaw (line 69) | func testSQLUpdateRaw(t *testing.T, conn Connection) {}
  function testSQLLeftJoin (line 72) | func testSQLLeftJoin(t *testing.T, conn Connection) {}
  function testSQLWithTransaction (line 75) | func testSQLWithTransaction(t *testing.T, conn Connection) {}
  function testSQLWithTransactionByLevel (line 78) | func testSQLWithTransactionByLevel(t *testing.T, conn Connection) {}
  function testSQLFirst (line 81) | func testSQLFirst(t *testing.T, conn Connection) {}
  function testSQLAll (line 84) | func testSQLAll(t *testing.T, conn Connection) {}
  function testSQLShowColumns (line 87) | func testSQLShowColumns(t *testing.T, conn Connection) {}
  function testSQLShowTables (line 90) | func testSQLShowTables(t *testing.T, conn Connection) {}
  function testSQLUpdate (line 93) | func testSQLUpdate(t *testing.T, conn Connection) {}
  function testSQLDelete (line 96) | func testSQLDelete(t *testing.T, conn Connection) {}
  function testSQLExec (line 99) | func testSQLExec(t *testing.T, conn Connection) {}
  function testSQLInsert (line 102) | func testSQLInsert(t *testing.T, conn Connection) {}
  function testSQLWrap (line 105) | func testSQLWrap(t *testing.T, conn Connection) {}

FILE: modules/db/types.go
  type DatabaseType (line 14) | type DatabaseType
  constant Int (line 21) | Int       DatabaseType = "INT"
  constant Tinyint (line 22) | Tinyint   DatabaseType = "TINYINT"
  constant Mediumint (line 23) | Mediumint DatabaseType = "MEDIUMINT"
  constant Smallint (line 24) | Smallint  DatabaseType = "SMALLINT"
  constant Bigint (line 25) | Bigint    DatabaseType = "BIGINT"
  constant Bit (line 26) | Bit       DatabaseType = "BIT"
  constant Int8 (line 27) | Int8      DatabaseType = "INT8"
  constant Int4 (line 28) | Int4      DatabaseType = "INT4"
  constant Int2 (line 29) | Int2      DatabaseType = "INT2"
  constant Integer (line 31) | Integer     DatabaseType = "INTEGER"
  constant Numeric (line 32) | Numeric     DatabaseType = "NUMERIC"
  constant Smallserial (line 33) | Smallserial DatabaseType = "SMALLSERIAL"
  constant Serial (line 34) | Serial      DatabaseType = "SERIAL"
  constant Bigserial (line 35) | Bigserial   DatabaseType = "BIGSERIAL"
  constant Money (line 36) | Money       DatabaseType = "MONEY"
  constant Real (line 42) | Real    DatabaseType = "REAL"
  constant Float (line 43) | Float   DatabaseType = "FLOAT"
  constant Float4 (line 44) | Float4  DatabaseType = "FLOAT4"
  constant Float8 (line 45) | Float8  DatabaseType = "FLOAT8"
  constant Double (line 46) | Double  DatabaseType = "DOUBLE"
  constant Decimal (line 47) | Decimal DatabaseType = "DECIMAL"
  constant Doubleprecision (line 49) | Doubleprecision DatabaseType = "DOUBLEPRECISION"
  constant Date (line 55) | Date      DatabaseType = "DATE"
  constant Time (line 56) | Time      DatabaseType = "TIME"
  constant Year (line 57) | Year      DatabaseType = "YEAR"
  constant Datetime (line 58) | Datetime  DatabaseType = "DATETIME"
  constant Timestamp (line 59) | Timestamp DatabaseType = "TIMESTAMP"
  constant Text (line 61) | Text       DatabaseType = "TEXT"
  constant Longtext (line 62) | Longtext   DatabaseType = "LONGTEXT"
  constant Mediumtext (line 63) | Mediumtext DatabaseType = "MEDIUMTEXT"
  constant Tinytext (line 64) | Tinytext   DatabaseType = "TINYTEXT"
  constant Varchar (line 66) | Varchar DatabaseType = "VARCHAR"
  constant Char (line 67) | Char    DatabaseType = "CHAR"
  constant Bpchar (line 68) | Bpchar  DatabaseType = "BPCHAR"
  constant JSON (line 69) | JSON    DatabaseType = "JSON"
  constant Blob (line 71) | Blob       DatabaseType = "BLOB"
  constant Tinyblob (line 72) | Tinyblob   DatabaseType = "TINYBLOB"
  constant Mediumblob (line 73) | Mediumblob DatabaseType = "MEDIUMBLOB"
  constant Longblob (line 74) | Longblob   DatabaseType = "LONGBLOB"
  constant Interval (line 76) | Interval DatabaseType = "INTERVAL"
  constant Boolean (line 77) | Boolean  DatabaseType = "BOOLEAN"
  constant Bool (line 78) | Bool     DatabaseType = "BOOL"
  constant Point (line 80) | Point   DatabaseType = "POINT"
  constant Line (line 81) | Line    DatabaseType = "LINE"
  constant Lseg (line 82) | Lseg    DatabaseType = "LSEG"
  constant Box (line 83) | Box     DatabaseType = "BOX"
  constant Path (line 84) | Path    DatabaseType = "PATH"
  constant Polygon (line 85) | Polygon DatabaseType = "POLYGON"
  constant Circle (line 86) | Circle  DatabaseType = "CIRCLE"
  constant Cidr (line 88) | Cidr    DatabaseType = "CIDR"
  constant Inet (line 89) | Inet    DatabaseType = "INET"
  constant Macaddr (line 90) | Macaddr DatabaseType = "MACADDR"
  constant Character (line 92) | Character        DatabaseType = "CHARACTER"
  constant Varyingcharacter (line 93) | Varyingcharacter DatabaseType = "VARYINGCHARACTER"
  constant Nchar (line 94) | Nchar            DatabaseType = "NCHAR"
  constant Nativecharacter (line 95) | Nativecharacter  DatabaseType = "NATIVECHARACTER"
  constant Nvarchar (line 96) | Nvarchar         DatabaseType = "NVARCHAR"
  constant Clob (line 97) | Clob             DatabaseType = "CLOB"
  constant Binary (line 99) | Binary    DatabaseType = "BINARY"
  constant Varbinary (line 100) | Varbinary DatabaseType = "VARBINARY"
  constant Enum (line 101) | Enum      DatabaseType = "ENUM"
  constant Set (line 102) | Set       DatabaseType = "SET"
  constant Geometry (line 104) | Geometry DatabaseType = "GEOMETRY"
  constant Multilinestring (line 106) | Multilinestring    DatabaseType = "MULTILINESTRING"
  constant Multipolygon (line 107) | Multipolygon       DatabaseType = "MULTIPOLYGON"
  constant Linestring (line 108) | Linestring         DatabaseType = "LINESTRING"
  constant Multipoint (line 109) | Multipoint         DatabaseType = "MULTIPOINT"
  constant Geometrycollection (line 110) | Geometrycollection DatabaseType = "GEOMETRYCOLLECTION"
  constant Name (line 112) | Name DatabaseType = "NAME"
  constant UUID (line 113) | UUID DatabaseType = "UUID"
  constant Timestamptz (line 115) | Timestamptz DatabaseType = "TIMESTAMPTZ"
  constant Timetz (line 116) | Timetz      DatabaseType = "TIMETZ"
  function DT (line 120) | func DT(s string) DatabaseType {
  function GetDTAndCheck (line 125) | func GetDTAndCheck(s string) DatabaseType {
  function Contains (line 169) | func Contains(v DatabaseType, a []DatabaseType) bool {
  type Value (line 179) | type Value
    method ToInt64 (line 182) | func (v Value) ToInt64() int64 {
    method String (line 191) | func (v Value) String() string {
    method HTML (line 196) | func (v Value) HTML() template.HTML {
  function GetValueFromDatabaseType (line 200) | func GetValueFromDatabaseType(typ DatabaseType, value interface{}, json ...
  function GetValueFromSQLOfDatabaseType (line 209) | func GetValueFromSQLOfDatabaseType(typ DatabaseType, value interface{}) ...
  function GetValueFromJSONOfDatabaseType (line 253) | func GetValueFromJSONOfDatabaseType(typ DatabaseType, value interface{})...

FILE: modules/db/types_test.go
  constant typeTestdbName (line 17) | typeTestdbName            = "go-admin-type-test"
  constant typeTesttableName (line 18) | typeTesttableName         = "all_types"
  constant typeTestpostgresCreateSql (line 19) | typeTestpostgresCreateSql = `CREATE TABLE public.%s
  function TestMysqlGetTypeFromString (line 61) | func TestMysqlGetTypeFromString(t *testing.T) {
  function TestPostgresqlGetTypeFromString (line 145) | func TestPostgresqlGetTypeFromString(t *testing.T) {
  function testPG (line 153) | func testPG(t *testing.T, port string) {
  function testGetType (line 210) | func testGetType(typeName string) string {
  function testConnDSN (line 216) | func testConnDSN(driver, dsn string) Connection {
  function testConn (line 222) | func testConn(driver string, cfg config.Database) Connection {
  function testDelimiter (line 233) | func testDelimiter(s string) string {
  function testCurrentPath (line 237) | func testCurrentPath() string {

FILE: modules/errors/error.go
  constant PermissionDenied (line 18) | PermissionDenied     = "permission denied"
  constant WrongID (line 19) | WrongID              = "wrong id"
  constant OperationNotAllow (line 20) | OperationNotAllow    = "operation not allow"
  constant EditFailWrongToken (line 21) | EditFailWrongToken   = "edit fail, wrong token"
  constant CreateFailWrongToken (line 22) | CreateFailWrongToken = "create fail, wrong token"
  constant NoPermission (line 23) | NoPermission         = "no permission"
  constant SiteOff (line 24) | SiteOff              = "site is off"
  function WrongPK (line 27) | func WrongPK(pk string) string {
  function Init (line 31) | func Init() {
  type PageError (line 42) | type PageError

FILE: modules/file/file.go
  type Uploader (line 19) | type Uploader interface
  type UploaderGenerator (line 24) | type UploaderGenerator
  function AddUploader (line 35) | func AddUploader(name string, up UploaderGenerator) {
  function GetFileEngine (line 48) | func GetFileEngine(name string) Uploader {
  type UploadFun (line 56) | type UploadFun
  function Upload (line 59) | func Upload(c UploadFun, form *multipart.Form) error {
  function SaveMultipartFile (line 85) | func SaveMultipartFile(fh *multipart.FileHeader, path string) error {
  function copyZeroAlloc (line 130) | func copyZeroAlloc(w io.Writer, r io.Reader) (int64, error) {

FILE: modules/file/local.go
  type LocalFileUploader (line 14) | type LocalFileUploader struct
    method Upload (line 26) | func (local *LocalFileUploader) Upload(form *multipart.Form) error {
  function GetLocalFileUploader (line 19) | func GetLocalFileUploader() Uploader {

FILE: modules/language/language.go
  function FixedLanguageKey (line 24) | func FixedLanguageKey(key string) string {
  function Get (line 49) | func Get(value string) string {
  function GetWithScope (line 54) | func GetWithScope(value string, scopes ...string) string {
  function GetWithLang (line 63) | func GetWithLang(value, lang string) string {
  function GetWithScopeAndLanguageSet (line 71) | func GetWithScopeAndLanguageSet(value, lang string, scopes ...string) st...
  function GetFromHtml (line 80) | func GetFromHtml(value template.HTML, scopes ...string) template.HTML {
  function WithScopes (line 93) | func WithScopes(value string, scopes ...string) string {
  type LangSet (line 97) | type LangSet
    method Add (line 99) | func (l LangSet) Add(key, value string) {
    method Combine (line 103) | func (l LangSet) Combine(set LangSet) LangSet {
  type LangMap (line 111) | type LangMap
    method Get (line 131) | func (lang LangMap) Get(value string) string {
    method GetWithScope (line 136) | func (lang LangMap) GetWithScope(value string, scopes ...string) string {
  function Add (line 149) | func Add(key string, lang map[string]string) {
  function AppendTo (line 154) | func AppendTo(lang string, set map[string]string) {
  function JoinScopes (line 160) | func JoinScopes(scopes []string) string {

FILE: modules/language/language_test.go
  function TestKK (line 12) | func TestKK(t *testing.T) {
  function TestAdd (line 20) | func TestAdd(t *testing.T) {
  function TestGetWithScope (line 24) | func TestGetWithScope(t *testing.T) {
  function TestGet (line 36) | func TestGet(t *testing.T) {
  function TestWithScopes (line 44) | func TestWithScopes(t *testing.T) {
  function TestGetFromHtml (line 48) | func TestGetFromHtml(t *testing.T) {

FILE: modules/logger/logger.go
  function init (line 61) | func init() {
  type Logger (line 65) | type Logger struct
    method Init (line 110) | func (l *Logger) Init() {
    method getEncoder (line 120) | func (l *Logger) getEncoder(levelKey string) zapcore.Encoder {
    method getLogWriter (line 154) | func (l *Logger) getLogWriter(path string) zapcore.WriteSyncer {
    method SetRotate (line 171) | func (l *Logger) SetRotate(cfg RotateCfg) {
    method SetEncoder (line 177) | func (l *Logger) SetEncoder(cfg EncoderCfg) {
  type EncoderCfg (line 89) | type EncoderCfg struct
  type RotateCfg (line 103) | type RotateCfg struct
  type Config (line 192) | type Config struct
  function InitWithConfig (line 213) | func InitWithConfig(cfg Config) {
  function SetRotate (line 229) | func SetRotate(cfg RotateCfg) {
  function OpenSQLLog (line 235) | func OpenSQLLog() {
  function Debug (line 240) | func Debug(info ...interface{}) {
  function Debugf (line 249) | func Debugf(template string, args ...interface{}) {
  function Info (line 256) | func Info(info ...interface{}) {
  function InfoCtx (line 263) | func InfoCtx(ctx *context.Context, format string, args ...interface{}) {
  type logFunc (line 269) | type logFunc
  function logCtx (line 271) | func logCtx(ctx *context.Context, logFunc logFunc, format string, args ....
  function Infof (line 276) | func Infof(template string, args ...interface{}) {
  function Warn (line 283) | func Warn(info ...interface{}) {
  function WarnCtx (line 290) | func WarnCtx(ctx *context.Context, format string, args ...interface{}) {
  function Warnf (line 297) | func Warnf(template string, args ...interface{}) {
  function Error (line 304) | func Error(err ...interface{}) {
  function ErrorCtx (line 311) | func ErrorCtx(ctx *context.Context, format string, args ...interface{}) {
  function Errorf (line 318) | func Errorf(template string, args ...interface{}) {
  function Fatal (line 325) | func Fatal(info ...interface{}) {
  function FatalCtx (line 332) | func FatalCtx(ctx *context.Context, format string, args ...interface{}) {
  function Fatalf (line 339) | func Fatalf(template string, args ...interface{}) {
  function Panic (line 346) | func Panic(info ...interface{}) {
  function PanicCtx (line 351) | func PanicCtx(ctx *context.Context, format string, args ...interface{}) {
  function Panicf (line 356) | func Panicf(template string, args ...interface{}) {
  function Access (line 361) | func Access(ctx *context.Context) {
  function LogSQL (line 382) | func LogSQL(statement string, args []interface{}) {
  function filterZapEncoder (line 390) | func filterZapEncoder(encoding string, encoderConfig zapcore.EncoderConf...
  function filterZapAtomicLevelByViper (line 403) | func filterZapAtomicLevelByViper(level int8) zapcore.Level {

FILE: modules/logger/logger_test.go
  function TestInfo (line 5) | func TestInfo(t *testing.T) {

FILE: modules/menu/menu.go
  type Item (line 21) | type Item struct
  type Menu (line 33) | type Menu struct
    method GetUpdateJS (line 41) | func (menu *Menu) GetUpdateJS(updateFlag bool) template.JS {
    method SetMaxOrder (line 59) | func (menu *Menu) SetMaxOrder(order int64) {
    method AddMaxOrder (line 64) | func (menu *Menu) AddMaxOrder() {
    method SetActiveClass (line 69) | func (menu *Menu) SetActiveClass(path string) *Menu {
    method FormatPath (line 100) | func (menu Menu) FormatPath() template.HTML {
    method GetEditMenuList (line 123) | func (menu *Menu) GetEditMenuList() []Item {
  type NewMenuData (line 127) | type NewMenuData struct
  function NewMenu (line 139) | func NewMenu(conn db.Connection, data NewMenuData) (int64, error) {
  function GetGlobalMenu (line 169) | func GetGlobalMenu(user models.UserModel, conn db.Connection, lang strin...
  function constructMenuTree (line 227) | func constructMenuTree(menus []map[string]interface{}, parentID int64, l...

FILE: modules/menu/menu_test.go
  function TestMenu_AddMaxOrder (line 9) | func TestMenu_AddMaxOrder(t *testing.T) {
  function TestMenu_SetMaxOrder (line 17) | func TestMenu_SetMaxOrder(t *testing.T) {
  function TestMenu_SetActiveClass (line 25) | func TestMenu_SetActiveClass(t *testing.T) {

FILE: modules/page/page.go
  function SetPageContent (line 21) | func SetPageContent(ctx *context.Context, user models.UserModel, c func(...

FILE: modules/remote_server/remote_server.go
  constant ServerHost (line 18) | ServerHost    = "https://www.go-admin.cn"
  constant ServerHostApi (line 19) | ServerHostApi = "https://www.go-admin.cn/api"
  type LoginRes (line 22) | type LoginRes struct
  function Login (line 32) | func Login(account, password string) LoginRes {
  type GetDownloadURLRes (line 80) | type GetDownloadURLRes struct
  function GetDownloadURL (line 89) | func GetDownloadURL(uuid, token string) (string, string, error) {
  constant TokenKey (line 125) | TokenKey = "GOADMIN_OFFICIAL_SESS"
  type GetOnlineReq (line 127) | type GetOnlineReq struct
    method Format (line 138) | func (req GetOnlineReq) Format() string {
  function GetOnline (line 170) | func GetOnline(reqData GetOnlineReq, token string) ([]byte, error) {

FILE: modules/service/service.go
  type Service (line 11) | type Service interface
  type Generator (line 15) | type Generator
  function Register (line 17) | func Register(k string, gen Generator) {
  function GetServices (line 24) | func GetServices() List {
  type Generators (line 39) | type Generators
  type List (line 41) | type List
    method Get (line 43) | func (g List) Get(k string) Service {
    method GetOrNot (line 51) | func (g List) GetOrNot(k string) (Service, bool) {
    method Add (line 56) | func (g List) Add(k string, service Service) {

FILE: modules/system/application.go
  type AppStatus (line 17) | type AppStatus struct
  function GetAppStatus (line 58) | func GetAppStatus() AppStatus {
  type SysStatus (line 99) | type SysStatus struct

FILE: modules/system/version.go
  constant version (line 3) | version = "v1.2.27"
  function Version (line 11) | func Version() string {
  function RequireThemeVersion (line 16) | func RequireThemeVersion() map[string][]string {

FILE: modules/trace/trace.go
  function getMachineID (line 20) | func getMachineID() string {
  function GenerateTraceID (line 42) | func GenerateTraceID() string {
  function machineIDToHex (line 53) | func machineIDToHex(machineID string) uint32 {
  function GetTraceID (line 59) | func GetTraceID(ctx *context.Context) string {
  constant TraceIDKey (line 68) | TraceIDKey = "traceID"

FILE: modules/ui/ui.go
  type Service (line 12) | type Service struct
    method Name (line 18) | func (s *Service) Name() string {
    method UpdateButtons (line 35) | func (s *Service) UpdateButtons() {
    method RemoveOrShowSiteNavButton (line 39) | func (s *Service) RemoveOrShowSiteNavButton(remove bool) {
    method RemoveOrShowInfoNavButton (line 49) | func (s *Service) RemoveOrShowInfoNavButton(remove bool) {
    method RemoveOrShowToolNavButton (line 60) | func (s *Service) RemoveOrShowToolNavButton(remove bool) {
    method RemoveOrShowPlugNavButton (line 71) | func (s *Service) RemoveOrShowPlugNavButton(remove bool) {
  constant ServiceKey (line 16) | ServiceKey = "ui"
  function GetService (line 22) | func GetService(srv service.List) *Service {
  function NewService (line 29) | func NewService(btns *types.Buttons) *Service {

FILE: modules/utils/utils.go
  function Uuid (line 26) | func Uuid(length int64) string {
  function Random (line 39) | func Random(strings []string) ([]string, error) {
  function CompressedContent (line 52) | func CompressedContent(h *template.HTML) {
  function ReplaceNth (line 64) | func ReplaceNth(s, old, new string, n int) string {
  function InArray (line 80) | func InArray(arr []string, str string) bool {
  function WrapURL (line 89) | func WrapURL(u string) string {
  function JSON (line 102) | func JSON(a interface{}) string {
  function ParseBool (line 110) | func ParseBool(s string) bool {
  function ReplaceAll (line 115) | func ReplaceAll(s string, oldnew ...string) string {
  function PackageName (line 120) | func PackageName(v interface{}) string {
  function ParseFloat32 (line 132) | func ParseFloat32(f string) float32 {
  function SetDefault (line 137) | func SetDefault(value, condition, def string) string {
  function AorB (line 144) | func AorB(condition bool, a, b string) string {
  function IsJSON (line 151) | func IsJSON(str string) bool {
  function CopyMap (line 156) | func CopyMap(m map[string]string) map[string]string {
  function ParseTime (line 172) | func ParseTime(stringTime string) time.Time {
  function ParseHTML (line 178) | func ParseHTML(name, tmpl string, param interface{}) template.HTML {
  function ParseText (line 194) | func ParseText(name, tmpl string, param interface{}) string {
  function CompareVersion (line 210) | func CompareVersion(src, toCompare string) bool {
  constant Byte (line 271) | Byte  = 1
  constant KByte (line 272) | KByte = Byte * 1024
  constant MByte (line 273) | MByte = KByte * 1024
  constant GByte (line 274) | GByte = MByte * 1024
  constant TByte (line 275) | TByte = GByte * 1024
  constant PByte (line 276) | PByte = TByte * 1024
  constant EByte (line 277) | EByte = PByte * 1024
  function logn (line 280) | func logn(n, b float64) float64 {
  function humanateBytes (line 284) | func humanateBytes(s uint64, base float64, sizes []string) string {
  function FileSize (line 300) | func FileSize(s uint64) string {
  function FileExist (line 305) | func FileExist(path string) bool {
  function TimeSincePro (line 314) | func TimeSincePro(then time.Time, m map[string]string) string {
  constant Minute (line 336) | Minute = 60
  constant Hour (line 337) | Hour   = 60 * Minute
  constant Day (line 338) | Day    = 24 * Hour
  constant Week (line 339) | Week   = 7 * Day
  constant Month (line 340) | Month  = 30 * Day
  constant Year (line 341) | Year   = 12 * Month
  function computeTimeDiff (line 344) | func computeTimeDiff(diff int64, m map[string]string) (int64, string) {
  function DownloadTo (line 402) | func DownloadTo(url, output string) error {
  function UnzipDir (line 435) | func UnzipDir(src, dest string) error {

FILE: modules/utils/utils_test.go
  function TestCompressedContent (line 10) | func TestCompressedContent(t *testing.T) {
  function TestCompareVersion (line 30) | func TestCompareVersion(t *testing.T) {

FILE: plugins/admin/admin.go
  type Admin (line 19) | type Admin struct
    method InitPlugin (line 29) | func (admin *Admin) InitPlugin(services service.List) {
    method GetIndexURL (line 69) | func (admin *Admin) GetIndexURL() string {
    method GetInfo (line 73) | func (admin *Admin) GetInfo() plugins.Info {
    method IsInstalled (line 85) | func (admin *Admin) IsInstalled() bool {
    method GetAddOperationFn (line 98) | func (admin *Admin) GetAddOperationFn() context.NodeProcessor {
    method SetCaptcha (line 103) | func (admin *Admin) SetCaptcha(captcha map[string]string) *Admin {
    method AddGenerator (line 109) | func (admin *Admin) AddGenerator(key string, g table.Generator) *Admin {
    method AddGenerators (line 115) | func (admin *Admin) AddGenerators(gen ...table.GeneratorList) *Admin {
    method AddGlobalDisplayProcessFn (line 121) | func (admin *Admin) AddGlobalDisplayProcessFn(f types.FieldFilterFn) *...
    method AddDisplayFilterLimit (line 127) | func (admin *Admin) AddDisplayFilterLimit(limit int) *Admin {
    method AddDisplayFilterTrimSpace (line 133) | func (admin *Admin) AddDisplayFilterTrimSpace() *Admin {
    method AddDisplayFilterSubstr (line 139) | func (admin *Admin) AddDisplayFilterSubstr(start int, end int) *Admin {
    method AddDisplayFilterToTitle (line 145) | func (admin *Admin) AddDisplayFilterToTitle() *Admin {
    method AddDisplayFilterToUpper (line 151) | func (admin *Admin) AddDisplayFilterToUpper() *Admin {
    method AddDisplayFilterToLower (line 157) | func (admin *Admin) AddDisplayFilterToLower() *Admin {
    method AddDisplayFilterXssFilter (line 163) | func (admin *Admin) AddDisplayFilterXssFilter() *Admin {
    method AddDisplayFilterXssJsFilter (line 169) | func (admin *Admin) AddDisplayFilterXssJsFilter() *Admin {
  function NewAdmin (line 90) | func NewAdmin(tableCfg ...table.GeneratorList) *Admin {

FILE: plugins/admin/controller/Update.go
  method Update (line 10) | func (h *Handler) Update(ctx *context.Context) {

FILE: plugins/admin/controller/api_create.go
  method ApiCreate (line 11) | func (h *Handler) ApiCreate(ctx *context.Context) {
  method ApiCreateForm (line 31) | func (h *Handler) ApiCreateForm(ctx *context.Context) {

FILE: plugins/admin/controller/api_detail.go
  method ApiDetail (line 17) | func (h *Handler) ApiDetail(ctx *context.Context) {

FILE: plugins/admin/controller/api_list.go
  method ApiList (line 10) | func (h *Handler) ApiList(ctx *context.Context) {

FILE: plugins/admin/controller/api_update.go
  method ApiUpdate (line 16) | func (h *Handler) ApiUpdate(ctx *context.Context) {
  method ApiUpdateForm (line 44) | func (h *Handler) ApiUpdateForm(ctx *context.Context) {

FILE: plugins/admin/controller/auth.go
  method Auth (line 23) | func (h *Handler) Auth(ctx *context.Context) {
  method Logout (line 87) | func (h *Handler) Logout(ctx *context.Context) {
  method ShowLogin (line 97) | func (h *Handler) ShowLogin(ctx *context.Context) {

FILE: plugins/admin/controller/common.go
  type Handler (line 29) | type Handler struct
    method UpdateCfg (line 67) | func (h *Handler) UpdateCfg(cfg Config) {
    method SetCaptcha (line 75) | func (h *Handler) SetCaptcha(captcha map[string]string) {
    method AssetsTheme (line 79) | func (h *Handler) AssetsTheme(asset, theme string) {
    method SetRoutes (line 83) | func (h *Handler) SetRoutes(r context.RouterMap) {
    method table (line 87) | func (h *Handler) table(prefix string, ctx *context.Context) table.Tab...
    method route (line 115) | func (h *Handler) route(name string) context.Router {
    method routePath (line 119) | func (h *Handler) routePath(name string, value ...string) string {
    method routePathWithPrefix (line 123) | func (h *Handler) routePathWithPrefix(name string, prefix string) stri...
    method AddOperation (line 127) | func (h *Handler) AddOperation(nodes ...context.Node) {
    method AddNavButton (line 141) | func (h *Handler) AddNavButton(btns *types.Buttons) {
    method searchOperation (line 148) | func (h *Handler) searchOperation(path, method string) bool {
    method OperationHandler (line 157) | func (h *Handler) OperationHandler(path string, ctx *context.Context) ...
    method HTML (line 169) | func (h *Handler) HTML(ctx *context.Context, user models.UserModel, pa...
    method HTMLPlug (line 175) | func (h *Handler) HTMLPlug(ctx *context.Context, user models.UserModel...
    method ExecuteWithBtns (line 197) | func (h *Handler) ExecuteWithBtns(ctx *context.Context, user models.Us...
    method Execute (line 218) | func (h *Handler) Execute(ctx *context.Context, user models.UserModel,...
    method authSrv (line 255) | func (h *Handler) authSrv() *auth.TokenService {
  function New (line 42) | func New(cfg ...Config) *Handler {
  type Config (line 60) | type Config struct
  function isInfoUrl (line 239) | func isInfoUrl(s string) bool {
  function isNewUrl (line 245) | func isNewUrl(s string, p string) bool {
  function isEditUrl (line 250) | func isEditUrl(s string, p string) bool {
  function aAlert (line 259) | func aAlert(ctx *context.Context) types.AlertAttribute {
  function aForm (line 263) | func aForm(ctx *context.Context) types.FormAttribute {
  function aRow (line 267) | func aRow(ctx *context.Context) types.RowAttribute {
  function aCol (line 271) | func aCol(ctx *context.Context) types.ColAttribute {
  function aImage (line 275) | func aImage(ctx *context.Context) types.ImgAttribute {
  function aButton (line 279) | func aButton(ctx *context.Context) types.ButtonAttribute {
  function aTree (line 283) | func aTree(ctx *context.Context) types.TreeAttribute {
  function aTable (line 287) | func aTable(ctx *context.Context) types.TableAttribute {
  function aDataTable (line 291) | func aDataTable(ctx *context.Context) types.DataTableAttribute {
  function aBox (line 295) | func aBox(ctx *context.Context) types.BoxAttribute {
  function aTab (line 299) | func aTab(ctx *context.Context) types.TabsAttribute {
  function aTemplate (line 303) | func aTemplate(ctx *context.Context) template.Template {
  function aTemplateByTheme (line 307) | func aTemplateByTheme(ctx *context.Context, theme string) template.Templ...
  function isPjax (line 311) | func isPjax(ctx *context.Context) bool {
  function formFooter (line 315) | func formFooter(ctx *context.Context, page string, isHideEdit, isHideNew...
  function filterFormFooter (line 415) | func filterFormFooter(ctx *context.Context, infoUrl string) template2.HT...
  function formContent (line 439) | func formContent(ctx *context.Context, form types.FormAttribute, isTab, ...
  function detailContent (line 457) | func detailContent(ctx *context.Context, form types.FormAttribute, editU...
  function menuFormContent (line 466) | func menuFormContent(ctx *context.Context, form types.FormAttribute) tem...

FILE: plugins/admin/controller/common_test.go
  function TestIsInfoUrl (line 9) | func TestIsInfoUrl(t *testing.T) {
  function TestIsNewUrl (line 14) | func TestIsNewUrl(t *testing.T) {

FILE: plugins/admin/controller/delete.go
  method Delete (line 11) | func (h *Handler) Delete(ctx *context.Context) {

FILE: plugins/admin/controller/detail.go
  method ShowDetail (line 18) | func (h *Handler) ShowDetail(ctx *context.Context) {

FILE: plugins/admin/controller/edit.go
  method ShowForm (line 29) | func (h *Handler) ShowForm(ctx *context.Context) {
  method showForm (line 34) | func (h *Handler) showForm(ctx *context.Context, alert template2.HTML, p...
  method EditForm (line 139) | func (h *Handler) EditForm(ctx *context.Context) {

FILE: plugins/admin/controller/handler.go
  method GlobalDeferHandler (line 23) | func (h *Handler) GlobalDeferHandler(ctx *context.Context) {
  method setFormWithReturnErrMessage (line 68) | func (h *Handler) setFormWithReturnErrMessage(ctx *context.Context, errM...

FILE: plugins/admin/controller/install.go
  method ShowInstall (line 13) | func (h *Handler) ShowInstall(ctx *context.Context) {
  method CheckDatabase (line 28) | func (h *Handler) CheckDatabase(ctx *context.Context) {

FILE: plugins/admin/controller/menu.go
  method ShowMenu (line 26) | func (h *Handler) ShowMenu(ctx *context.Context) {
  method ShowNewMenu (line 31) | func (h *Handler) ShowNewMenu(ctx *context.Context) {
  function getPlugNameFromReferer (line 35) | func getPlugNameFromReferer(ctx *context.Context) string {
  function getMenuPlugNameParams (line 45) | func getMenuPlugNameParams(plugName string) string {
  method showNewMenu (line 53) | func (h *Handler) showNewMenu(ctx *context.Context, err error) {
  method ShowEditMenu (line 89) | func (h *Handler) ShowEditMenu(ctx *context.Context) {
  method showEditMenu (line 115) | func (h *Handler) showEditMenu(ctx *context.Context, plugName string, fo...
  method DeleteMenu (line 147) | func (h *Handler) DeleteMenu(ctx *context.Context) {
  method EditMenu (line 153) | func (h *Handler) EditMenu(ctx *context.Context) {
  method NewMenu (line 200) | func (h *Handler) NewMenu(ctx *context.Context) {
  method MenuOrder (line 240) | func (h *Handler) MenuOrder(ctx *context.Context) {
  method getMenuInfoPanel (line 250) | func (h *Handler) getMenuInfoPanel(ctx *context.Context, plugName string...

FILE: plugins/admin/controller/new.go
  method ShowNewForm (line 26) | func (h *Handler) ShowNewForm(ctx *context.Context) {
  method showNewForm (line 31) | func (h *Handler) showNewForm(ctx *context.Context, alert template2.HTML...
  method NewForm (line 98) | func (h *Handler) NewForm(ctx *context.Context) {

FILE: plugins/admin/controller/operation.go
  method Operation (line 13) | func (h *Handler) Operation(ctx *context.Context) {
  method RecordOperationLog (line 27) | func (h *Handler) RecordOperationLog(ctx *context.Context) {

FILE: plugins/admin/controller/plugins.go
  method Plugins (line 33) | func (h *Handler) Plugins(ctx *context.Context) {
  method PluginStore (line 71) | func (h *Handler) PluginStore(ctx *context.Context) {
  method PluginDetail (line 165) | func (h *Handler) PluginDetail(ctx *context.Context) {
  type PluginBoxParam (line 207) | type PluginBoxParam struct
  function GetPluginBoxParamFromPlug (line 217) | func GetPluginBoxParamFromPlug(plug plugins.Plugin) PluginBoxParam {
  method pluginStoreBox (line 229) | func (h *Handler) pluginStoreBox(ctx *context.Context, param PluginBoxPa...
  method pluginBox (line 298) | func (h *Handler) pluginBox(ctx *context.Context, param PluginBoxParam) ...
  method PluginDownload (line 320) | func (h *Handler) PluginDownload(ctx *context.Context) {
  method ServerLogin (line 505) | func (h *Handler) ServerLogin(ctx *context.Context) {
  function pluginBtnClass (line 524) | func pluginBtnClass(class ...string) []string {
  function plugWord (line 528) | func plugWord(word string) string {
  function plugWordHTML (line 532) | func plugWordHTML(word template.HTML) template.HTML {

FILE: plugins/admin/controller/plugins_tmpl.go
  function GetPluginsPageJS (line 13) | func GetPluginsPageJS(data PluginsPageJSData) template.JS {
  type PluginsPageJSData (line 33) | type PluginsPageJSData struct

FILE: plugins/admin/controller/show.go
  method ShowInfo (line 37) | func (h *Handler) ShowInfo(ctx *context.Context) {
  method showTableData (line 65) | func (h *Handler) showTableData(ctx *context.Context, prefix string, par...
  method showTable (line 101) | func (h *Handler) showTable(ctx *context.Context, prefix string, params ...
  method Assets (line 354) | func (h *Handler) Assets(ctx *context.Context) {
  method Export (line 397) | func (h *Handler) Export(ctx *context.Context) {

FILE: plugins/admin/controller/system.go
  method SystemInfo (line 16) | func (h *Handler) SystemInfo(ctx *context.Context) {
  function stripedTable (line 172) | func stripedTable(ctx *context.Context, list []map[string]types.InfoItem...
  function lg (line 184) | func lg(v template.HTML) template.HTML {
  function itos (line 188) | func itos(i interface{}) template.HTML {

FILE: plugins/admin/data/mysql/admin.sql
  type `goadmin_menu` (line 28) | CREATE TABLE `goadmin_menu` (
  type `goadmin_operation_log` (line 64) | CREATE TABLE `goadmin_operation_log` (
  type `goadmin_permissions` (line 84) | CREATE TABLE `goadmin_permissions` (
  type `goadmin_role_menu` (line 113) | CREATE TABLE `goadmin_role_menu` (
  type `goadmin_role_permissions` (line 141) | CREATE TABLE `goadmin_role_permissions` (
  type `goadmin_role_users` (line 167) | CREATE TABLE `goadmin_role_users` (
  type `goadmin_roles` (line 192) | CREATE TABLE `goadmin_roles` (
  type `goadmin_session` (line 219) | CREATE TABLE `goadmin_session` (
  type `goadmin_user_permissions` (line 235) | CREATE TABLE `goadmin_user_permissions` (
  type `goadmin_users` (line 260) | CREATE TABLE `goadmin_users` (

FILE: plugins/admin/models/base.go
  type Base (line 10) | type Base struct
    method SetConn (line 17) | func (b Base) SetConn(con db.Connection) Base {
    method Table (line 22) | func (b Base) Table(table string) *db.SQL {

FILE: plugins/admin/models/menu.go
  type MenuModel (line 13) | type MenuModel struct
    method SetConn (line 37) | func (t MenuModel) SetConn(con db.Connection) MenuModel {
    method Find (line 43) | func (t MenuModel) Find(id interface{}) MenuModel {
    method New (line 49) | func (t MenuModel) New(title, icon, uri, header, pluginName string, pa...
    method Delete (line 72) | func (t MenuModel) Delete() {
    method Update (line 89) | func (t MenuModel) Update(title, icon, uri, header, pluginName string,...
    method ResetOrder (line 111) | func (t MenuModel) ResetOrder(data []byte) {
    method CheckRole (line 168) | func (t MenuModel) CheckRole(roleId string) bool {
    method AddRole (line 177) | func (t MenuModel) AddRole(roleId string) (int64, error) {
    method DeleteRoles (line 191) | func (t MenuModel) DeleteRoles() error {
    method MapToModel (line 198) | func (t MenuModel) MapToModel(m map[string]interface{}) MenuModel {
  function Menu (line 27) | func Menu() MenuModel {
  function MenuWithId (line 32) | func MenuWithId(id string) MenuModel {
  type OrderItems (line 103) | type OrderItems
  type OrderItem (line 105) | type OrderItem struct

FILE: plugins/admin/models/operation_log.go
  type OperationLogModel (line 9) | type OperationLogModel struct
    method Find (line 28) | func (t OperationLogModel) Find(id interface{}) OperationLogModel {
    method SetConn (line 33) | func (t OperationLogModel) SetConn(con db.Connection) OperationLogModel {
    method New (line 39) | func (t OperationLogModel) New(userId int64, path, method, ip, input s...
    method MapToModel (line 60) | func (t OperationLogModel) MapToModel(m map[string]interface{}) Operat...
  function OperationLog (line 23) | func OperationLog() OperationLogModel {

FILE: plugins/admin/models/permission.go
  type PermissionModel (line 11) | type PermissionModel struct
    method SetConn (line 34) | func (t PermissionModel) SetConn(con db.Connection) PermissionModel {
    method IsEmpty (line 40) | func (t PermissionModel) IsEmpty() bool {
    method IsSlugExist (line 45) | func (t PermissionModel) IsSlugExist(slug string, id string) bool {
    method Find (line 58) | func (t PermissionModel) Find(id interface{}) PermissionModel {
    method FindBySlug (line 64) | func (t PermissionModel) FindBySlug(slug string) PermissionModel {
    method FindByName (line 70) | func (t PermissionModel) FindByName(name string) PermissionModel {
    method MapToModel (line 76) | func (t PermissionModel) MapToModel(m map[string]interface{}) Permissi...
  function Permission (line 24) | func Permission() PermissionModel {
  function PermissionWithId (line 29) | func PermissionWithId(id string) PermissionModel {

FILE: plugins/admin/models/role.go
  type RoleModel (line 13) | type RoleModel struct
    method SetConn (line 34) | func (t RoleModel) SetConn(con db.Connection) RoleModel {
    method WithTx (line 39) | func (t RoleModel) WithTx(tx *sql.Tx) RoleModel {
    method Find (line 45) | func (t RoleModel) Find(id interface{}) RoleModel {
    method IsSlugExist (line 51) | func (t RoleModel) IsSlugExist(slug string, id string) bool {
    method New (line 64) | func (t RoleModel) New(name, slug string) (RoleModel, error) {
    method Update (line 79) | func (t RoleModel) Update(name, slug string) (int64, error) {
    method CheckPermission (line 91) | func (t RoleModel) CheckPermission(permissionId string) bool {
    method DeletePermissions (line 100) | func (t RoleModel) DeletePermissions() error {
    method AddPermission (line 107) | func (t RoleModel) AddPermission(permissionId string) (int64, error) {
    method MapToModel (line 121) | func (t RoleModel) MapToModel(m map[string]interface{}) RoleModel {
  function Role (line 24) | func Role() RoleModel {
  function RoleWithId (line 29) | func RoleWithId(id string) RoleModel {

FILE: plugins/admin/models/site.go
  type SiteModel (line 15) | type SiteModel struct
    method SetConn (line 38) | func (t SiteModel) SetConn(con db.Connection) SiteModel {
    method WithTx (line 43) | func (t SiteModel) WithTx(tx *sql.Tx) SiteModel {
    method Init (line 48) | func (t SiteModel) Init(cfg map[string]string) SiteModel {
    method AllToMap (line 81) | func (t SiteModel) AllToMap() map[string]string {
    method AllToMapInterface (line 97) | func (t SiteModel) AllToMapInterface() map[string]interface{} {
    method Update (line 121) | func (t SiteModel) Update(v form.Values) error {
  constant SiteItemOpenState (line 29) | SiteItemOpenState = 1
  constant SiteItemOffState (line 30) | SiteItemOffState  = 0
  function Site (line 34) | func Site() SiteModel {

FILE: plugins/admin/models/user.go
  type UserModel (line 20) | type UserModel struct
    method SetConn (line 52) | func (t UserModel) SetConn(con db.Connection) UserModel {
    method WithTx (line 57) | func (t UserModel) WithTx(tx *sql.Tx) UserModel {
    method Find (line 63) | func (t UserModel) Find(id interface{}) UserModel {
    method FindByUserName (line 69) | func (t UserModel) FindByUserName(username interface{}) UserModel {
    method IsEmpty (line 75) | func (t UserModel) IsEmpty() bool {
    method HasMenu (line 80) | func (t UserModel) HasMenu() bool {
    method IsSuperAdmin (line 85) | func (t UserModel) IsSuperAdmin() bool {
    method GetCheckPermissionByUrlMethod (line 94) | func (t UserModel) GetCheckPermissionByUrlMethod(path, method string) ...
    method IsVisitor (line 101) | func (t UserModel) IsVisitor() bool {
    method HideUserCenterEntrance (line 105) | func (t UserModel) HideUserCenterEntrance() bool {
    method Template (line 109) | func (t UserModel) Template(str string) string {
    method CheckPermissionByUrlMethod (line 117) | func (t UserModel) CheckPermissionByUrlMethod(path, method string, for...
    method checkParam (line 195) | func (t UserModel) checkParam(src, comp url.Values) bool {
    method ReleaseConn (line 234) | func (t UserModel) ReleaseConn() UserModel {
    method UpdateAvatar (line 240) | func (t UserModel) UpdateAvatar(avatar string) {
    method WithRoles (line 245) | func (t UserModel) WithRoles() UserModel {
    method GetAllRoleId (line 265) | func (t UserModel) GetAllRoleId() []interface{} {
    method WithPermissions (line 277) | func (t UserModel) WithPermissions() UserModel {
    method WithMenus (line 321) | func (t UserModel) WithMenus() UserModel {
    method New (line 361) | func (t UserModel) New(username, password, name, avatar string) (UserM...
    method Update (line 380) | func (t UserModel) Update(username, password, name, avatar string, isU...
    method UpdatePwd (line 402) | func (t UserModel) UpdatePwd(password string) UserModel {
    method CheckRoleId (line 415) | func (t UserModel) CheckRoleId(roleId string) bool {
    method DeleteRoles (line 424) | func (t UserModel) DeleteRoles() error {
    method AddRole (line 431) | func (t UserModel) AddRole(roleId string) (int64, error) {
    method CheckRole (line 445) | func (t UserModel) CheckRole(slug string) bool {
    method CheckPermissionById (line 456) | func (t UserModel) CheckPermissionById(permissionId string) bool {
    method CheckPermission (line 465) | func (t UserModel) CheckPermission(permission string) bool {
    method DeletePermissions (line 476) | func (t UserModel) DeletePermissions() error {
    method AddPermission (line 483) | func (t UserModel) AddPermission(permissionId string) (int64, error) {
    method MapToModel (line 497) | func (t UserModel) MapToModel(m map[string]interface{}) UserModel {
  function User (line 42) | func User() UserModel {
  function UserWithId (line 47) | func UserWithId(id string) UserModel {
  function getParam (line 186) | func getParam(u string) (string, url.Values) {
  function inMethodArr (line 224) | func inMethodArr(arr []string, str string) bool {

FILE: plugins/admin/modules/captcha/captcha.go
  type Captcha (line 3) | type Captcha interface
  function Add (line 9) | func Add(key string, captcha Captcha) {
  function Get (line 16) | func Get(key string) (Captcha, bool) {

FILE: plugins/admin/modules/constant/constant.go
  constant PjaxHeader (line 9) | PjaxHeader = constant.PjaxHeader
  constant PjaxUrlHeader (line 12) | PjaxUrlHeader = constant.PjaxUrlHeader
  constant EditPKKey (line 14) | EditPKKey   = "__goadmin_edit_pk"
  constant DetailPKKey (line 15) | DetailPKKey = "__goadmin_detail_pk"
  constant PrefixKey (line 16) | PrefixKey   = "__prefix"
  constant IframeKey (line 18) | IframeKey   = "__goadmin_iframe"
  constant IframeIDKey (line 19) | IframeIDKey = "__goadmin_iframe_id"
  constant ContextNodeNeedAuth (line 21) | ContextNodeNeedAuth = constant.ContextNodeNeedAuth

FILE: plugins/admin/modules/form/form.go
  constant PostTypeKey (line 8) | PostTypeKey           = "__go_admin_post_type"
  constant PostResultKey (line 9) | PostResultKey         = "__go_admin_post_result"
  constant PostIsSingleUpdateKey (line 10) | PostIsSingleUpdateKey = "__go_admin_is_single_update"
  constant PreviousKey (line 12) | PreviousKey = "__go_admin_previous_"
  constant TokenKey (line 13) | TokenKey    = "__go_admin_t_"
  constant MethodKey (line 14) | MethodKey   = "__go_admin_method_"
  constant NoAnimationKey (line 16) | NoAnimationKey = "__go_admin_no_animation_"
  type Values (line 23) | type Values
    method Get (line 29) | func (f Values) Get(key string) string {
    method Add (line 38) | func (f Values) Add(key string, value string) {
    method IsEmpty (line 43) | func (f Values) IsEmpty(key ...string) bool {
    method Has (line 53) | func (f Values) Has(key ...string) bool {
    method Delete (line 63) | func (f Values) Delete(key string) {
    method ToMap (line 68) | func (f Values) ToMap() map[string]string {
    method IsUpdatePost (line 79) | func (f Values) IsUpdatePost() bool {
    method IsInsertPost (line 84) | func (f Values) IsInsertPost() bool {
    method PostError (line 89) | func (f Values) PostError() error {
    method IsSingleUpdatePost (line 98) | func (f Values) IsSingleUpdatePost() bool {
    method RemoveRemark (line 103) | func (f Values) RemoveRemark() Values {
    method RemoveSysRemark (line 110) | func (f Values) RemoveSysRemark() Values {

FILE: plugins/admin/modules/guard/delete.go
  type DeleteParam (line 9) | type DeleteParam struct
  method Delete (line 15) | func (g *Guard) Delete(ctx *context.Context) {
  function GetDeleteParam (line 38) | func GetDeleteParam(ctx *context.Context) *DeleteParam {

FILE: plugins/admin/modules/guard/edit.go
  type ShowFormParam (line 24) | type ShowFormParam struct
  method ShowForm (line 31) | func (g *Guard) ShowForm(ctx *context.Context) {
  function GetShowFormParam (line 75) | func GetShowFormParam(ctx *context.Context) *ShowFormParam {
  type EditFormParam (line 79) | type EditFormParam struct
    method Value (line 93) | func (e EditFormParam) Value() form.Values {
  method EditForm (line 97) | func (g *Guard) EditForm(ctx *context.Context) {
  function isInfoUrl (line 146) | func isInfoUrl(s string) bool {
  function GetEditFormParam (line 152) | func GetEditFormParam(ctx *context.Context) *EditFormParam {
  function alert (line 156) | func alert(ctx *context.Context, panel table.Table, msg string, conn db....
  function alertWithTitleAndDesc (line 164) | func alertWithTitleAndDesc(ctx *context.Context, title, desc, msg string...
  function getAlert (line 168) | func getAlert(ctx *context.Context, msg string) tmpl.HTML {

FILE: plugins/admin/modules/guard/export.go
  type ExportParam (line 11) | type ExportParam struct
  method Export (line 18) | func (g *Guard) Export(ctx *context.Context) {
  function GetExportParam (line 41) | func GetExportParam(ctx *context.Context) *ExportParam {

FILE: plugins/admin/modules/guard/guard.go
  type Guard (line 15) | type Guard struct
    method table (line 31) | func (g *Guard) table(ctx *context.Context) (table.Table, string) {
    method CheckPrefix (line 36) | func (g *Guard) CheckPrefix(ctx *context.Context) {
  function New (line 22) | func New(s service.List, c db.Connection, t table.GeneratorList, b *type...
  constant editFormParamKey (line 55) | editFormParamKey    = "edit_form_param"
  constant deleteParamKey (line 56) | deleteParamKey      = "delete_param"
  constant exportParamKey (line 57) | exportParamKey      = "export_param"
  constant serverLoginParamKey (line 58) | serverLoginParamKey = "server_login_param"
  constant deleteMenuParamKey (line 59) | deleteMenuParamKey  = "delete_menu_param"
  constant editMenuParamKey (line 60) | editMenuParamKey    = "edit_menu_param"
  constant newMenuParamKey (line 61) | newMenuParamKey     = "new_menu_param"
  constant newFormParamKey (line 62) | newFormParamKey     = "new_form_param"
  constant updateParamKey (line 63) | updateParamKey      = "update_param"
  constant showFormParamKey (line 64) | showFormParamKey    = "show_form_param"
  constant showNewFormParam (line 65) | showNewFormParam    = "show_new_form_param"

FILE: plugins/admin/modules/guard/menu_delete.go
  type MenuDeleteParam (line 8) | type MenuDeleteParam struct
  method MenuDelete (line 12) | func (g *Guard) MenuDelete(ctx *context.Context) {
  function GetMenuDeleteParam (line 30) | func GetMenuDeleteParam(ctx *context.Context) *MenuDeleteParam {

FILE: plugins/admin/modules/guard/menu_edit.go
  type MenuEditParam (line 13) | type MenuEditParam struct
    method HasAlert (line 25) | func (e MenuEditParam) HasAlert() bool {
  method MenuEdit (line 29) | func (g *Guard) MenuEdit(ctx *context.Context) {
  function GetMenuEditParam (line 64) | func GetMenuEditParam(ctx *context.Context) *MenuEditParam {
  function checkEmpty (line 68) | func checkEmpty(ctx *context.Context, key ...string) template.HTML {

FILE: plugins/admin/modules/guard/menu_new.go
  type MenuNewParam (line 13) | type MenuNewParam struct
    method HasAlert (line 24) | func (e MenuNewParam) HasAlert() bool {
  method MenuNew (line 28) | func (g *Guard) MenuNew(ctx *context.Context) {
  function GetMenuNewParam (line 63) | func GetMenuNewParam(ctx *context.Context) *MenuNewParam {

FILE: plugins/admin/modules/guard/new.go
  type ShowNewFormParam (line 19) | type ShowNewFormParam struct
  method ShowNewForm (line 25) | func (g *Guard) ShowNewForm(ctx *context.Context) {
  function GetShowNewFormParam (line 62) | func GetShowNewFormParam(ctx *context.Context) *ShowNewFormParam {
  type NewFormParam (line 66) | type NewFormParam struct
    method Value (line 80) | func (e NewFormParam) Value() form.Values {
  method NewForm (line 84) | func (g *Guard) NewForm(ctx *context.Context) {
  function GetNewFormParam (line 124) | func GetNewFormParam(ctx *context.Context) *NewFormParam {

FILE: plugins/admin/modules/guard/server_login.go
  type ServerLoginParam (line 11) | type ServerLoginParam struct
  method ServerLogin (line 16) | func (g *Guard) ServerLogin(ctx *context.Context) {
  function GetServerLoginParam (line 36) | func GetServerLoginParam(ctx *context.Context) *ServerLoginParam {

FILE: plugins/admin/modules/guard/update.go
  type UpdateParam (line 11) | type UpdateParam struct
  method Update (line 17) | func (g *Guard) Update(ctx *context.Context) {
  function GetUpdateParam (line 45) | func GetUpdateParam(ctx *context.Context) *UpdateParam {

FILE: plugins/admin/modules/helper.go
  function InArray (line 10) | func InArray(arr []string, str string) bool {
  function Delimiter (line 19) | func Delimiter(del, del2, s string) string {
  function FilterField (line 23) | func FilterField(filed, delimiter, delimiter2 string) string {
  function InArrayWithoutEmpty (line 27) | func InArrayWithoutEmpty(arr []string, str string) bool {
  function RemoveBlankFromArray (line 39) | func RemoveBlankFromArray(s []string) []string {
  function Uuid (line 49) | func Uuid() string {
  function SetDefault (line 53) | func SetDefault(source, def string) string {
  function GetPage (line 60) | func GetPage(page string) (pageInt int) {
  function AorB (line 69) | func AorB(condition bool, a, b string) string {
  function AorEmpty (line 76) | func AorEmpty(condition bool, a string) string {
  function AorBHTML (line 83) | func AorBHTML(condition bool, a, b template.HTML) template.HTML {

FILE: plugins/admin/modules/helper_test.go
  function TestInArray (line 10) | func TestInArray(t *testing.T) {
  function isFormURL (line 14) | func isFormURL(s string) bool {

FILE: plugins/admin/modules/paginator/paginator.go
  type Config (line 18) | type Config struct
  function Get (line 24) | func Get(ctx *context.Context, cfg Config) types.PaginatorAttribute {
  function addPageLink (line 141) | func addPageLink(arr []map[string]string, params parameter.Parameters, p...

FILE: plugins/admin/modules/paginator/paginator_test.go
  function TestGet (line 11) | func TestGet(t *testing.T) {

FILE: plugins/admin/modules/parameter/parameter.go
  type Parameters (line 13) | type Parameters struct
    method WithPKs (line 148) | func (param Parameters) WithPKs(id ...string) Parameters {
    method PKs (line 153) | func (param Parameters) PKs() []string {
    method DeletePK (line 161) | func (param Parameters) DeletePK() Parameters {
    method PK (line 166) | func (param Parameters) PK() string {
    method IsAll (line 174) | func (param Parameters) IsAll() bool {
    method WithURLPath (line 178) | func (param *Parameters) WithURLPath(path string) Parameters {
    method isAllTrue (line 183) | func (param *Parameters) isAllTrue() {
    method isAllFalse (line 187) | func (param *Parameters) isAllFalse() {
    method WithIsAll (line 191) | func (param Parameters) WithIsAll(isAll bool) Parameters {
    method DeleteIsAll (line 200) | func (param Parameters) DeleteIsAll() Parameters {
    method GetFilterFieldValueStart (line 205) | func (param Parameters) GetFilterFieldValueStart(field string) string {
    method GetFilterFieldValueEnd (line 209) | func (param Parameters) GetFilterFieldValueEnd(field string) string {
    method GetFieldValue (line 213) | func (param Parameters) GetFieldValue(field string) string {
    method AddField (line 221) | func (param Parameters) AddField(field, value string) Parameters {
    method DeleteField (line 226) | func (param Parameters) DeleteField(fields ...string) Parameters {
    method DeleteEditPk (line 233) | func (param Parameters) DeleteEditPk() Parameters {
    method DeleteDetailPk (line 238) | func (param Parameters) DeleteDetailPk() Parameters {
    method GetFieldValues (line 243) | func (param Parameters) GetFieldValues(field string) []string {
    method GetFieldValuesStr (line 247) | func (param Parameters) GetFieldValuesStr(field string) string {
    method GetFieldOperator (line 251) | func (param Parameters) GetFieldOperator(field, suffix string) string {
    method Join (line 259) | func (param Parameters) Join() string {
    method SetPage (line 265) | func (param *Parameters) SetPage(page string) Parameters {
    method SetPageSize (line 271) | func (param *Parameters) SetPageSize(pageSize string) Parameters {
    method GetRouteParamStr (line 277) | func (param Parameters) GetRouteParamStr() string {
    method URL (line 283) | func (param Parameters) URL(page string) string {
    method URLNoAnimation (line 287) | func (param Parameters) URLNoAnimation(page string) string {
    method GetRouteParamStrWithoutPageSize (line 291) | func (param Parameters) GetRouteParamStrWithoutPageSize(page string) s...
    method GetFixedParamStrFromCache (line 305) | func (param Parameters) GetFixedParamStrFromCache() url.Values {
    method GetLastPageRouteParamStr (line 315) | func (param Parameters) GetLastPageRouteParamStr(cache ...bool) string {
    method GetNextPageRouteParamStr (line 326) | func (param Parameters) GetNextPageRouteParamStr(cache ...bool) string {
    method GetFixedParamStr (line 337) | func (param Parameters) GetFixedParamStr() url.Values {
    method GetFixedParamStrWithoutColumnsAndPage (line 351) | func (param Parameters) GetFixedParamStrWithoutColumnsAndPage() string {
    method GetFixedParamStrWithoutSort (line 362) | func (param Parameters) GetFixedParamStrWithoutSort() string {
    method Statement (line 375) | func (param Parameters) Statement(wheres, table, delimiter, delimiter2...
  constant Page (line 30) | Page     = "__page"
  constant PageSize (line 31) | PageSize = "__pageSize"
  constant Sort (line 32) | Sort     = "__sort"
  constant SortType (line 33) | SortType = "__sort_type"
  constant Columns (line 34) | Columns  = "__columns"
  constant Prefix (line 35) | Prefix   = "__prefix"
  constant Pjax (line 36) | Pjax     = "_pjax"
  constant sortTypeDesc (line 38) | sortTypeDesc = "desc"
  constant sortTypeAsc (line 39) | sortTypeAsc  = "asc"
  constant IsAll (line 41) | IsAll      = "__is_all"
  constant PrimaryKey (line 42) | PrimaryKey = "__pk"
  constant True (line 44) | True  = "true"
  constant False (line 45) | False = "false"
  constant FilterRangeParamStartSuffix (line 47) | FilterRangeParamStartSuffix = "_start__goadmin"
  constant FilterRangeParamEndSuffix (line 48) | FilterRangeParamEndSuffix   = "_end__goadmin"
  constant FilterParamJoinInfix (line 49) | FilterParamJoinInfix        = "_goadmin_join_"
  constant FilterParamOperatorSuffix (line 50) | FilterParamOperatorSuffix   = "__goadmin_operator__"
  constant FilterParamCountInfix (line 51) | FilterParamCountInfix       = "__goadmin_index__"
  constant Separator (line 53) | Separator = "__goadmin_separator__"
  function BaseParam (line 69) | func BaseParam() Parameters {
  function GetParam (line 73) | func GetParam(u *url.URL, defaultPageSize int, p ...string) Parameters {
  function GetParamFromURL (line 137) | func GetParamFromURL(urlStr string, defaultPageSize int, defaultSortType...
  function getDefault (line 484) | func getDefault(values url.Values, key, def string) string {

FILE: plugins/admin/modules/parameter/parameter_test.go
  function TestGetParamFromUrl (line 8) | func TestGetParamFromUrl(t *testing.T) {
  function TestParameters_PKs (line 13) | func TestParameters_PKs(t *testing.T) {

FILE: plugins/admin/modules/response/response.go
  function Ok (line 17) | func Ok(ctx *context.Context) {
  function OkWithMsg (line 24) | func OkWithMsg(ctx *context.Context, msg string) {
  function OkWithData (line 31) | func OkWithData(ctx *context.Context, data map[string]interface{}) {
  function BadRequest (line 39) | func BadRequest(ctx *context.Context, msg string) {
  function Alert (line 46) | func Alert(ctx *context.Context, desc, title, msg string, conn db.Connec...
  function Error (line 77) | func Error(ctx *context.Context, msg string, datas ...map[string]interfa...
  function Denied (line 88) | func Denied(ctx *context.Context, msg string) {

FILE: plugins/admin/modules/table/config.go
  type Config (line 7) | type Config struct
    method SetPrimaryKey (line 39) | func (config Config) SetPrimaryKey(name string, typ db.DatabaseType) C...
    method SetDriverMode (line 45) | func (config Config) SetDriverMode(mode string) Config {
    method SetPrimaryKeyType (line 50) | func (config Config) SetPrimaryKeyType(typ string) Config {
    method SetCanAdd (line 55) | func (config Config) SetCanAdd(canAdd bool) Config {
    method SetSourceURL (line 60) | func (config Config) SetSourceURL(url string) Config {
    method SetGetDataFun (line 65) | func (config Config) SetGetDataFun(fun GetDataFun) Config {
    method SetEditable (line 70) | func (config Config) SetEditable(editable bool) Config {
    method SetDeletable (line 75) | func (config Config) SetDeletable(deletable bool) Config {
    method SetOnlyInfo (line 80) | func (config Config) SetOnlyInfo() Config {
    method SetOnlyUpdateForm (line 85) | func (config Config) SetOnlyUpdateForm() Config {
    method SetOnlyNewForm (line 90) | func (config Config) SetOnlyNewForm() Config {
    method SetOnlyDetail (line 95) | func (config Config) SetOnlyDetail() Config {
    method SetExportable (line 100) | func (config Config) SetExportable(exportable bool) Config {
    method SetConnection (line 105) | func (config Config) SetConnection(connection string) Config {
  function DefaultConfig (line 24) | func DefaultConfig() Config {
  function DefaultConfigWithDriver (line 110) | func DefaultConfigWithDriver(driver string) Config {
  function DefaultConfigWithDriverAndConnection (line 125) | func DefaultConfigWithDriverAndConnection(driver, conn string) Config {

FILE: plugins/admin/modules/table/default.go
  type DefaultTable (line 31) | type DefaultTable struct
    method Copy (line 79) | func (tb *DefaultTable) Copy() Table {
    method GetData (line 111) | func (tb *DefaultTable) GetData(ctx *context.Context, params parameter...
    method getDataFromURL (line 188) | func (tb *DefaultTable) getDataFromURL(params parameter.Parameters) ([...
    method GetDataWithIds (line 224) | func (tb *DefaultTable) GetDataWithIds(ctx *context.Context, params pa...
    method getTempModelData (line 268) | func (tb *DefaultTable) getTempModelData(res map[string]interface{}, p...
    method getAllDataFromDatabase (line 377) | func (tb *DefaultTable) getAllDataFromDatabase(params parameter.Parame...
    method getDataFromDatabase (line 444) | func (tb *DefaultTable) getDataFromDatabase(ctx *context.Context, para...
    method GetDataWithId (line 629) | func (tb *DefaultTable) GetDataWithId(param parameter.Parameters) (For...
    method UpdateData (line 758) | func (tb *DefaultTable) UpdateData(ctx *context.Context, dataList form...
    method InsertData (line 826) | func (tb *DefaultTable) InsertData(ctx *context.Context, dataList form...
    method getInjectValueFromFormValue (line 893) | func (tb *DefaultTable) getInjectValueFromFormValue(dataList form.Valu...
    method PreProcessValue (line 967) | func (tb *DefaultTable) PreProcessValue(dataList form.Values, typ type...
    method DeleteData (line 996) | func (tb *DefaultTable) DeleteData(id string) error {
    method GetNewFormInfo (line 1055) | func (tb *DefaultTable) GetNewFormInfo() FormInfo {
    method delete (line 1072) | func (tb *DefaultTable) delete(table, key string, values []string) err...
    method getTheadAndFilterForm (line 1084) | func (tb *DefaultTable) getTheadAndFilterForm(params parameter.Paramet...
    method db (line 1097) | func (tb *DefaultTable) db() db.Connection {
    method delimiter (line 1104) | func (tb *DefaultTable) delimiter() string {
    method delimiter2 (line 1111) | func (tb *DefaultTable) delimiter2() string {
    method getDataFromDB (line 1118) | func (tb *DefaultTable) getDataFromDB() bool {
    method sql (line 1123) | func (tb *DefaultTable) sql() *db.SQL {
    method sqlObjOrNil (line 1128) | func (tb *DefaultTable) sqlObjOrNil() *db.SQL {
    method getColumns (line 1137) | func (tb *DefaultTable) getColumns(table string) (Columns, bool) {
  type GetDataFun (line 42) | type GetDataFun
  function NewDefaultTable (line 44) | func NewDefaultTable(ctx *context.Context, cfgs ...Config) Table {
  type GetDataFromURLRes (line 183) | type GetDataFromURLRes struct
  function getDataRes (line 621) | func getDataRes(list []map[string]interface{}, _ int) map[string]interfa...
  type Columns (line 1135) | type Columns

FILE: plugins/admin/modules/table/generators.go
  type SystemTable (line 39) | type SystemTable struct
    method GetManagerTable (line 51) | func (s *SystemTable) GetManagerTable(ctx *context.Context) (managerTa...
    method GetNormalManagerTable (line 361) | func (s *SystemTable) GetNormalManagerTable(ctx *context.Context) (man...
    method GetPermissionTable (line 529) | func (s *SystemTable) GetPermissionTable(ctx *context.Context) (permis...
    method GetRolesTable (line 667) | func (s *SystemTable) GetRolesTable(ctx *context.Context) (roleTable T...
    method GetOpTable (line 824) | func (s *SystemTable) GetOpTable(ctx *context.Context) (opTable Table) {
    method GetMenuTable (line 904) | func (s *SystemTable) GetMenuTable(ctx *context.Context) (menuTable Ta...
    method GetSiteTable (line 1048) | func (s *SystemTable) GetSiteTable(ctx *context.Context) (siteTable Ta...
    method GetGenerateForm (line 1368) | func (s *SystemTable) GetGenerateForm(ctx *context.Context) (generateT...
    method table (line 1914) | func (s *SystemTable) table(table string) *db.SQL {
    method connection (line 1918) | func (s *SystemTable) connection() *db.SQL {
  function NewSystemTable (line 44) | func NewSystemTable(conn db.Connection, c *config.Config) *SystemTable {
  function encodePassword (line 1848) | func encodePassword(pwd []byte) string {
  function label (line 1856) | func label(ctx *context.Context) types.LabelAttribute {
  function lg (line 1860) | func lg(v string) string {
  function defaultFilterFn (line 1864) | func defaultFilterFn(val string, def ...string) types.FieldFilterFn {
  function lgWithScore (line 1879) | func lgWithScore(v string, score ...string) string {
  function lgWithConfigScore (line 1883) | func lgWithConfigScore(v string, score ...string) string {
  function link (line 1888) | func link(url, content string) tmpl.HTML {
  function escape (line 1895) | func escape(s string) string {
  function checkJSON (line 1906) | func checkJSON(values form2.Values, key string) error {
  function interfaces (line 1922) | func interfaces(arr []string) []interface{} {
  function addSwitchForTool (line 1932) | func addSwitchForTool(formList *types.FormPanel, head, field, def string...
  function formTypeOptions (line 1949) | func formTypeOptions() types.FieldOptions {
  function databaseTypeOptions (line 1958) | func databaseTypeOptions() types.FieldOptions {
  function getType (line 1998) | func getType(typeName string) string {

FILE: plugins/admin/modules/table/table.go
  type Generator (line 17) | type Generator
  type GeneratorList (line 19) | type GeneratorList
    method Add (line 21) | func (g GeneratorList) Add(key string, gen Generator) {
    method Combine (line 25) | func (g GeneratorList) Combine(list GeneratorList) GeneratorList {
    method CombineAll (line 34) | func (g GeneratorList) CombineAll(gens []GeneratorList) GeneratorList {
  type Table (line 45) | type Table interface
  type BaseTable (line 77) | type BaseTable struct
    method GetInfo (line 93) | func (base *BaseTable) GetInfo() *types.InfoPanel {
    method GetDetail (line 97) | func (base *BaseTable) GetDetail() *types.InfoPanel {
    method GetDetailFromInfo (line 101) | func (base *BaseTable) GetDetailFromInfo() *types.InfoPanel {
    method GetForm (line 108) | func (base *BaseTable) GetForm() *types.FormPanel {
    method GetNewForm (line 112) | func (base *BaseTable) GetNewForm() *types.FormPanel {
    method GetActualNewForm (line 116) | func (base *BaseTable) GetActualNewForm() *types.FormPanel {
    method GetCanAdd (line 123) | func (base *BaseTable) GetCanAdd() bool {
    method GetPrimaryKey (line 127) | func (base *BaseTable) GetPrimaryKey() PrimaryKey { return base.Primar...
    method GetEditable (line 128) | func (base *BaseTable) GetEditable() bool         { return base.Editab...
    method GetDeletable (line 129) | func (base *BaseTable) GetDeletable() bool        { return base.Deleta...
    method GetExportable (line 130) | func (base *BaseTable) GetExportable() bool       { return base.Export...
    method GetOnlyInfo (line 131) | func (base *BaseTable) GetOnlyInfo() bool         { return base.OnlyIn...
    method GetOnlyDetail (line 132) | func (base *BaseTable) GetOnlyDetail() bool       { return base.OnlyDe...
    method GetOnlyNewForm (line 133) | func (base *BaseTable) GetOnlyNewForm() bool      { return base.OnlyNe...
    method GetOnlyUpdateForm (line 134) | func (base *BaseTable) GetOnlyUpdateForm() bool   { return base.OnlyUp...
    method GetPaginator (line 136) | func (base *BaseTable) GetPaginator(ctx *context.Context, size int, pa...
  type PanelInfo (line 151) | type PanelInfo struct
  type FormInfo (line 160) | type FormInfo struct
  type PrimaryKey (line 168) | type PrimaryKey struct
  constant DefaultPrimaryKeyName (line 174) | DefaultPrimaryKeyName = "id"
  constant DefaultConnectionName (line 175) | DefaultConnectionName = "default"
  function SetServices (line 184) | func SetServices(srv service.List) {

FILE: plugins/admin/modules/tools/generator.go
  type Param (line 23) | type Param struct
  type Config (line 72) | type Config struct
  function fixedTable (line 110) | func fixedTable(table string) string {
  function NewParam (line 121) | func NewParam(cfg Config) *Param {
  function NewParamWithFields (line 172) | func NewParamWithFields(cfg Config, fields ...Fields) *Param {
  type Fields (line 229) | type Fields
    method GetPrimaryKey (line 231) | func (fs Fields) GetPrimaryKey() (string, string) {
  type Field (line 240) | type Field struct
  function Generate (line 259) | func Generate(param *Param) error {
  constant commentStrEnd (line 277) | commentStrEnd = "example end"
  constant tablesEnd (line 278) | tablesEnd     = "generators end"
  function GenerateTables (line 281) | func GenerateTables(outputPath, packageName string, tables []string, isN...
  function InsertPermissionOfTable (line 380) | func InsertPermissionOfTable(conn db.Connection, table string) {
  function InsertPermissionInfoDB (line 397) | func InsertPermissionInfoDB(conn db.Connection, name, slug, httpMethod, ...
  function camelcase (line 423) | func camelcase(s string) string {
  function getType (line 436) | func getType(typeName string) string {
  function getFieldsFromConn (line 443) | func getFieldsFromConn(conn db.Connection, table, driver, connName strin...

FILE: plugins/admin/modules/tools/template.go
  constant tableModelTmpl (line 3) | tableModelTmpl = `{{define "table_model"}}

FILE: plugins/admin/router.go
  method initRouter (line 16) | func (admin *Admin) initRouter() *Admin {
  method globalErrorHandler (line 108) | func (admin *Admin) globalErrorHandler(ctx *context.Context) {
  method traceIDMiddleware (line 114) | func (admin *Admin) traceIDMiddleware(ctx *context.Context) {
  constant traceIDHeaderKey (line 127) | traceIDHeaderKey = "x-request-id"
  method themeMiddleware (line 130) | func (admin *Admin) themeMiddleware(ctx *context.Context) {

FILE: plugins/example/controller.go
  method TestHandler (line 20) | func (e *Example) TestHandler(rawCtx *context.Context) {

FILE: plugins/example/example.go
  type Example (line 9) | type Example struct
    method InitPlugin (line 19) | func (e *Example) InitPlugin(srv service.List) {
  function NewExample (line 13) | func NewExample() *Example {

FILE: plugins/example/go_plugin/main.go
  type Example (line 12) | type Example struct
    method InitPlugin (line 20) | func (example *Example) InitPlugin(srv service.List) {
    method initRouter (line 25) | func (example *Example) initRouter(prefix string, srv service.List) *c...
    method TestHandler (line 34) | func (example *Example) TestHandler(ctx *context.Context) {

FILE: plugins/example/router.go
  method initRouter (line 10) | func (e *Example) initRouter(prefix string, srv service.List) *context.A...

FILE: plugins/plugins.go
  type Plugin (line 42) | type Plugin interface
  type Info (line 56) | type Info struct
    method IsFree (line 88) | func (i Info) IsFree() bool {
  type Base (line 92) | type Base struct
    method InitPlugin (line 102) | func (b *Base) InitPlugin(services service.List)   {}
    method GetGenerators (line 103) | func (b *Base) GetGenerators() table.GeneratorList { return make(table...
    method GetHandler (line 104) | func (b *Base) GetHandler() context.HandlerMap     { return b.App.Hand...
    method Name (line 105) | func (b *Base) Name() string                       { return b.PlugName }
    method GetInfo (line 106) | func (b *Base) GetInfo() Info                      { return b.Info }
    method Prefix (line 107) | func (b *Base) Prefix() string                     { return b.URLPrefix }
    method IsInstalled (line 108) | func (b *Base) IsInstalled() bool                  { return false }
    method Uninstall (line 109) | func (b *Base) Uninstall() error                   { return nil }
    method Upgrade (line 110) | func (b *Base) Upgrade() error                     { return nil }
    method GetIndexURL (line 111) | func (b *Base) GetIndexURL() string                { return "" }
    method GetSettingPage (line 112) | func (b *Base) GetSettingPage() table.Generator    { return nil }
    method InitBase (line 114) | func (b *Base) InitBase(srv service.List, prefix string) {
    method SetInfo (line 121) | func (b *Base) SetInfo(info Info) {
    method Title (line 125) | func (b *Base) Title() string {
    method ExecuteTmpl (line 129) | func (b *Base) ExecuteTmpl(ctx *context.Context, panel types.Panel, op...
    method ExecuteTmplWithNavButtons (line 133) | func (b *Base) ExecuteTmplWithNavButtons(ctx *context.Context, panel t...
    method ExecuteTmplWithMenu (line 138) | func (b *Base) ExecuteTmplWithMenu(ctx *context.Context, panel types.P...
    method ExecuteTmplWithCustomMenu (line 142) | func (b *Base) ExecuteTmplWithCustomMenu(ctx *context.Context, panel t...
    method ExecuteTmplWithMenuAndNavButtons (line 146) | func (b *Base) ExecuteTmplWithMenuAndNavButtons(ctx *context.Context, ...
    method NewMenu (line 151) | func (b *Base) NewMenu(data menu.NewMenuData) (int64, error) {
    method HTML (line 155) | func (b *Base) HTML(ctx *context.Context, panel types.Panel, options ....
    method HTMLCustomMenu (line 160) | func (b *Base) HTMLCustomMenu(ctx *context.Context, panel types.Panel,...
    method HTMLMenu (line 165) | func (b *Base) HTMLMenu(ctx *context.Context, panel types.Panel, optio...
    method HTMLBtns (line 170) | func (b *Base) HTMLBtns(ctx *context.Context, panel types.Panel, btns ...
    method HTMLMenuWithBtns (line 175) | func (b *Base) HTMLMenuWithBtns(ctx *context.Context, panel types.Pane...
    method HTMLFile (line 180) | func (b *Base) HTMLFile(ctx *context.Context, path string, data map[st...
    method HTMLFiles (line 201) | func (b *Base) HTMLFiles(ctx *context.Context, data map[string]interfa...
  type BasePlugin (line 221) | type BasePlugin struct
    method GetInfo (line 228) | func (b *BasePlugin) GetInfo() Info       { return b.Info }
    method Name (line 229) | func (b *BasePlugin) Name() string        { return b.Info.Name }
    method GetIndexURL (line 230) | func (b *BasePlugin) GetIndexURL() string { return b.IndexURL }
    method IsInstalled (line 231) | func (b *BasePlugin) IsInstalled() bool   { return b.Installed }
  function NewBasePluginWithInfo (line 233) | func NewBasePluginWithInfo(info Info) Plugin {
  function NewBasePluginWithInfoAndIndexURL (line 237) | func NewBasePluginWithInfoAndIndexURL(info Info, u string, installed boo...
  function GetPluginsWithInfos (line 241) | func GetPluginsWithInfos(info []Info) Plugins {
  function LoadFromPlugin (line 249) | func LoadFromPlugin(mod string) Plugin {
  function GetHandler (line 274) | func GetHandler(app *context.App) context.HandlerMap { return app.Handle...
  function Execute (line 276) | func Execute(ctx *context.Context, conn db.Connection, navButtons types....
  function ExecuteWithCustomMenu (line 295) | func ExecuteWithCustomMenu(ctx *context.Context,
  function ExecuteWithMenu (line 319) | func ExecuteWithMenu(ctx *context.Context,
  type Plugins (line 365) | type Plugins
    method Add (line 367) | func (pp Plugins) Add(p Plugin) Plugins {
    method Exist (line 374) | func (pp Plugins) Exist(p Plugin) bool {
  function FindByName (line 383) | func FindByName(name string) (Plugin, bool) {
  function FindByNameAll (line 392) | func FindByNameAll(name string) (Plugin, bool) {
  function Exist (line 406) | func Exist(p Plugin) bool {
  function Add (line 410) | func Add(p Plugin) {
  function GetAll (line 415) | func GetAll(req remote_server.GetOnlineReq, token string) (Plugins, Page) {
  function Get (line 471) | func Get() Plugins {
  type GetOnlineRes (line 477) | type GetOnlineRes struct
  type GetOnlineResData (line 483) | type GetOnlineResData struct
  type Page (line 490) | type Page struct

FILE: plugins/plugins_test.go
  function TestLoadFromPlugin (line 5) | func TestLoadFromPlugin(t *testing.T) {

FILE: template/chartjs/assets.go
  function bindataRead (line 18) | func bindataRead(data []byte, name string) ([]byte, error) {
  type asset (line 38) | type asset struct
  type bindataFileInfo (line 43) | type bindataFileInfo struct
    method Name (line 50) | func (fi bindataFileInfo) Name() string {
    method Size (line 53) | func (fi bindataFileInfo) Size() int64 {
    method Mode (line 56) | func (fi bindataFileInfo) Mode() os.FileMode {
    method ModTime (line 59) | func (fi bindataFileInfo) ModTime() time.Time {
    method IsDir (line 62) | func (fi bindataFileInfo) IsDir() bool {
    method Sys (line 65) | func (fi bindataFileInfo) Sys() interface{} {
  function assetsChartMinJsBytes (line 71) | func assetsChartMinJsBytes() ([]byte, error) {
  function assetsChartMinJs (line 78) | func assetsChartMinJs() (*asset, error) {
  function Asset (line 92) | func Asset(name string) ([]byte, error) {
  function MustAsset (line 106) | func MustAsset(name string) []byte {
  function AssetInfo (line 118) | func AssetInfo(name string) (os.FileInfo, error) {
  function AssetNames (line 131) | func AssetNames() []string {
  function AssetDir (line 157) | func AssetDir(name string) ([]string, error) {
  type bintree (line 179) | type bintree struct
  function RestoreAsset (line 191) | func RestoreAsset(dir, name string) error {
  function RestoreAssets (line 216) | func RestoreAssets(dir, name string) error {
  function _filePath (line 232) | func _filePath(dir, name string) string {

FILE: template/chartjs/bar.go
  type BarChart (line 12) | type BarChart struct
    method SetID (line 149) | func (l *BarChart) SetID(s string) *BarChart {
    method SetTitle (line 154) | func (l *BarChart) SetTitle(s template.HTML) *BarChart {
    method SetHeight (line 159) | func (l *BarChart) SetHeight(s int) *BarChart {
    method SetLabels (line 164) | func (l *BarChart) SetLabels(s []string) *BarChart {
    method AddDataSet (line 169) | func (l *BarChart) AddDataSet(s string) *BarChart {
    method DSLabel (line 178) | func (l *BarChart) DSLabel(s string) *BarChart {
    method DSData (line 183) | func (l *BarChart) DSData(data []float64) *BarChart {
    method DSType (line 188) | func (l *BarChart) DSType(t string) *BarChart {
    method DSBackgroundColor (line 193) | func (l *BarChart) DSBackgroundColor(backgroundColor Color) *BarChart {
    method DSBorderCapStyle (line 198) | func (l *BarChart) DSBorderCapStyle(borderCapStyle string) *BarChart {
    method DSBorderSkipped (line 203) | func (l *BarChart) DSBorderSkipped(skip string) *BarChart {
    method DSBorderColor (line 208) | func (l *BarChart) DSBorderColor(borderColor Color) *BarChart {
    method DSBorderWidth (line 213) | func (l *BarChart) DSBorderWidth(borderWidth float64) *BarChart {
    method DSHoverBackgroundColor (line 218) | func (l *BarChart) DSHoverBackgroundColor(hoverBackgroundColor Color) ...
    method DSHoverBorderColor (line 223) | func (l *BarChart) DSHoverBorderColor(hoverBorderColor Color) *BarChart {
    method DSHoverBorderWidth (line 228) | func (l *BarChart) DSHoverBorderWidth(hoverBorderWidth float64) *BarCh...
    method DSOrder (line 233) | func (l *BarChart) DSOrder(order float64) *BarChart {
    method DSXAxisID (line 238) | func (l *BarChart) DSXAxisID(xAxisID string) *BarChart {
    method DSYAxisID (line 243) | func (l *BarChart) DSYAxisID(yAxisID string) *BarChart {
    method GetContent (line 248) | func (l *BarChart) GetContent() template.HTML {
  type BarJsContent (line 18) | type BarJsContent struct
  type BarAttributes (line 24) | type BarAttributes struct
  type BarDataSets (line 30) | type BarDataSets
    method Add (line 32) | func (l BarDataSets) Add(ds *BarDataSet) BarDataSets {
  type BarDataSet (line 36) | type BarDataSet struct
    method SetLabel (line 56) | func (l *BarDataSet) SetLabel(label string) *BarDataSet {
    method SetData (line 61) | func (l *BarDataSet) SetData(data []float64) *BarDataSet {
    method SetType (line 66) | func (l *BarDataSet) SetType(t string) *BarDataSet {
    method SetBackgroundColor (line 71) | func (l *BarDataSet) SetBackgroundColor(backgroundColor Color) *BarDat...
    method SetBorderCapStyle (line 76) | func (l *BarDataSet) SetBorderCapStyle(borderCapStyle string) *BarData...
    method SetBorderColor (line 81) | func (l *BarDataSet) SetBorderColor(borderColor Color) *BarDataSet {
    method SetBorderWidth (line 86) | func (l *BarDataSet) SetBorderWidth(borderWidth float64) *BarDataSet {
    method SetBorderSkipped (line 91) | func (l *BarDataSet) SetBorderSkipped(skip string) *BarDataSet {
    method SetHoverBackgroundColor (line 96) | func (l *BarDataSet) SetHoverBackgroundColor(hoverBackgroundColor Colo...
    method SetHoverBorderColor (line 101) | func (l *BarDataSet) SetHoverBorderColor(hoverBorderColor Color) *BarD...
    method SetHoverBorderWidth (line 106) | func (l *BarDataSet) SetHoverBorderWidth(hoverBorderWidth float64) *Ba...
    method SetOrder (line 111) | func (l *BarDataSet) SetOrder(order float64) *BarDataSet {
    method SetXAxisID (line 116) | func (l *BarDataSet) SetXAxisID(xAxisID string) *BarDataSet {
    method SetYAxisID (line 121) | func (l *BarDataSet) SetYAxisID(yAxisID string) *BarDataSet {
  function Bar (line 126) | func Bar() *BarChart {

FILE: template/chartjs/chart.go
  type Chart (line 9) | type Chart struct
    method SetID (line 22) | func (c *Chart) SetID(id string) *Chart {
    method SetTitle (line 27) | func (c *Chart) SetTitle(title template.HTML) *Chart {
    method SetHeight (line 32) | func (c *Chart) SetHeight(height int) *Chart {
    method SetOptionAnimationDuration (line 37) | func (c *Chart) SetOptionAnimationDuration(duration int) {
    method SetOptionAnimationEasing (line 47) | func (c *Chart) SetOptionAnimationEasing(easing string) {
    method SetOptionLayoutPaddingLeft (line 57) | func (c *Chart) SetOptionLayoutPaddingLeft(left int) {
    method SetOptionLayoutPaddingRight (line 67) | func (c *Chart) SetOptionLayoutPaddingRight(right int) {
    method SetOptionLayoutPaddingTop (line 77) | func (c *Chart) SetOptionLayoutPaddingTop(top int) {
    method SetOptionLayoutPaddingBottom (line 87) | func (c *Chart) SetOptionLayoutPaddingBottom(bottom int) {
    method SetOptionLegendDisplay (line 97) | func (c *Chart) SetOptionLegendDisplay(display bool) {
    method SetOptionLegendPosition (line 107) | func (c *Chart) SetOptionLegendPosition(position string) {
    method SetOptionLegendAlign (line 117) | func (c *Chart) SetOptionLegendAlign(align string) {
    method SetOptionLegendFullWidt (line 127) | func (c *Chart) SetOptionLegendFullWidt(fullWidth bool) {
    method SetOptionLegendRevers (line 137) | func (c *Chart) SetOptionLegendRevers(reverse bool) {
    method SetOptionLegendRt (line 147) | func (c *Chart) SetOptionLegendRt(rtl bool) {
    method SetOptionLegendTextDirection (line 157) | func (c *Chart) SetOptionLegendTextDirection(textDirection string) {
    method SetOptionLegendLabels (line 167) | func (c *Chart) SetOptionLegendLabels(labels *OptionLegendLabel) {
    method SetOptionTitleDisplay (line 177) | func (c *Chart) SetOptionTitleDisplay(display bool) {
    method SetOptionTitleFontSize (line 187) | func (c *Chart) SetOptionTitleFontSize(fontSize int) {
    method SetOptionTitlePosition (line 197) | func (c *Chart) SetOptionTitlePosition(position string) {
    method SetOptionTitleFontFamily (line 207) | func (c *Chart) SetOptionTitleFontFamily(fontFamily string) {
    method SetOptionTitleFontColor (line 217) | func (c *Chart) SetOptionTitleFontColor(fontColor Color) {
    method SetOptionTitleFontStyle (line 227) | func (c *Chart) SetOptionTitleFontStyle(fontStyle string) {
    method SetOptionTitlePadding (line 237) | func (c *Chart) SetOptionTitlePadding(padding int) {
    method SetOptionTitleLineHeight (line 247) | func (c *Chart) SetOptionTitleLineHeight(lineHeight int) {
    method SetOptionTitleText (line 257) | func (c *Chart) SetOptionTitleText(text string) {
    method SetOptionTooltipsEnabled (line 267) | func (c *Chart) SetOptionTooltipsEnabled(enabled bool) {
    method SetOptionTooltipsMode (line 277) | func (c *Chart) SetOptionTooltipsMode(mode string) {
    method SetOptionTooltipsIntersect (line 287) | func (c *Chart) SetOptionTooltipsIntersect(intersect bool) {
    method SetOptionTooltipsPosition (line 297) | func (c *Chart) SetOptionTooltipsPosition(position string) {
    method SetOptionTooltipsBackgroundColor (line 307) | func (c *Chart) SetOptionTooltipsBackgroundColor(backgroundColor Color) {
    method SetOptionTooltipsTitleFontFamily (line 317) | func (c *Chart) SetOptionTooltipsTitleFontFamily(titleFontFamily strin...
    method SetOptionTooltipsTitleFontSize (line 327) | func (c *Chart) SetOptionTooltipsTitleFontSize(titleFontSize int) {
    method SetOptionTooltipsTitleFontStyle (line 337) | func (c *Chart) SetOptionTooltipsTitleFontStyle(titleFontStyle string) {
    method SetOptionTooltipsTitleFontColor (line 347) | func (c *Chart) SetOptionTooltipsTitleFontColor(titleFontColor Color) {
    method SetOptionTooltipsTitleAlign (line 357) | func (c *Chart) SetOptionTooltipsTitleAlign(titleAlign string) {
    method SetOptionTooltipsTitleSpacing (line 367) | func (c *Chart) SetOptionTooltipsTitleSpacing(titleSpacing int) {
    method SetOptionTooltipsTitleMarginBottom (line 377) | func (c *Chart) SetOptionTooltipsTitleMarginBottom(titleMarginBottom i...
    method SetOptionTooltipsBodyFontFamily (line 387) | func (c *Chart) SetOptionTooltipsBodyFontFamily(bodyFontFamily string) {
    method SetOptionTooltipsBodyFontSize (line 397) | func (c *Chart) SetOptionTooltipsBodyFontSize(bodyFontSize int) {
    method SetOptionTooltipsBodyFontStyle (line 407) | func (c *Chart) SetOptionTooltipsBodyFontStyle(bodyFontStyle string) {
    method SetOptionTooltipsBodyFontColor (line 417) | func (c *Chart) SetOptionTooltipsBodyFontColor(bodyFontColor Color) {
    method SetOptionTooltipsBodyAlign (line 427) | func (c *Chart) SetOptionTooltipsBodyAlign(bodyAlign string) {
    method SetOptionTooltipsBodySpacing (line 437) | func (c *Chart) SetOptionTooltipsBodySpacing(bodySpacing int) {
    method SetOptionTooltipsFooterFontFamily (line 447) | func (c *Chart) SetOptionTooltipsFooterFontFamily(footerFontFamily str...
    method SetOptionTooltipsFooterFontSize (line 457) | func (c *Chart) SetOptionTooltipsFooterFontSize(footerFontSize int) {
    method SetOptionTooltipsFooterFontStyle (line 467) | func (c *Chart) SetOptionTooltipsFooterFontStyle(footerFontStyle strin...
    method SetOptionTooltipsFooterFontColor (line 477) | func (c *Chart) SetOptionTooltipsFooterFontColor(footerFontColor Color) {
    method SetOptionTooltipsFooterAlign (line 487) | func (c *Chart) SetOptionTooltipsFooterAlign(footerAlign string) {
    method SetOptionTooltipsFooterSpacing (line 497) | func (c *Chart) SetOptionTooltipsFooterSpacing(footerSpacing int) {
    method SetOptionTooltipsFooterMarginTop (line 507) | func (c *Chart) SetOptionTooltipsFooterMarginTop(footerMarginTop int) {
    method SetOptionTooltipsXPadding (line 517) | func (c *Chart) SetOptionTooltipsXPadding(xPadding int) {
    method SetOptionTooltipsYPadding (line 527) | func (c *Chart) SetOptionTooltipsYPadding(yPadding int) {
    method SetOptionTooltipsCaretPadding (line 537) | func (c *Chart) SetOptionTooltipsCaretPadding(caretPadding int) {
    method SetOptionTooltipsCaretSize (line 547) | func (c *Chart) SetOptionTooltipsCaretSize(caretSize int) {
    method SetOptionTooltipsCornerRadius (line 557) | func (c *Chart) SetOptionTooltipsCornerRadius(cornerRadius int) {
    method SetOptionTooltipsMultiKeyBackground (line 567) | func (c *Chart) SetOptionTooltipsMultiKeyBackground(multiKeyBackground...
    method SetOptionTooltipsDisplayColors (line 577) | func (c *Chart) SetOptionTooltipsDisplayColors(displayColors bool) {
    method SetOptionTooltipsBorderColor (line 587) | func (c *Chart) SetOptionTooltipsBorderColor(borderColor Color) {
    method SetOptionTooltipsBorderWidth (line 597) | func (c *Chart) SetOptionTooltipsBorderWidth(borderWidth int) {
    method SetOptionTooltipsRtl (line 607) | func (c *Chart) SetOptionTooltipsRtl(rtl bool) {
    method SetOptionTooltipsTextDirection (line 617) | func (c *Chart) SetOptionTooltipsTextDirection(textDirection string) {
    method SetOptionElementPoint (line 627) | func (c *Chart) SetOptionElementPoint(point *OptionElementPoint) {
    method SetOptionElementLine (line 637) | func (c *Chart) SetOptionElementLine(line *OptionElementLine) {
    method SetOptionElementArc (line 647) | func (c *Chart) SetOptionElementArc(arc *OptionElementArc) {
    method SetOptionElementRectangle (line 657) | func (c *Chart) SetOptionElementRectangle(rectangle *OptionElementRect...
    method GetAssetList (line 836) | func (c *Chart) GetAssetList() []string               { return AssetsL...
    method GetAsset (line 837) | func (c *Chart) GetAsset(name string) ([]byte, error) { return Asset(n...
    method GetContent (line 838) | func (c *Chart) GetContent() template.HTML            { return c.GetCo...
  type JsContent (line 664) | type JsContent struct
  type OptionAnimation (line 669) | type OptionAnimation struct
  type OptionLayout (line 674) | type OptionLayout struct
  type OptionLegend (line 683) | type OptionLegend struct
  type OptionLegendLabel (line 694) | type OptionLegendLabel struct
  type OptionTitle (line 704) | type OptionTitle struct
  type OptionTooltips (line 716) | type OptionTooltips struct
  type OptionElement (line 755) | type OptionElement struct
  type OptionElementPoint (line 762) | type OptionElementPoint struct
  type OptionElementLine (line 774) | type OptionElementLine struct
  type OptionElementRectangle (line 789) | type OptionElementRectangle struct
  type OptionElementArc (line 796) | type OptionElementArc struct
  type Options (line 804) | type Options struct
  type Attributes (line 813) | type Attributes struct
  type DataSets (line 817) | type DataSets
  type DataSet (line 819) | type DataSet struct
  type Color (line 825) | type Color
  function NewChart (line 827) | func NewChart() *Chart {

FILE: template/chartjs/line.go
  type LineChart (line 12) | type LineChart struct
    method SetID (line 284) | func (l *LineChart) SetID(s string) *LineChart {
    method SetTitle (line 289) | func (l *LineChart) SetTitle(s template.HTML) *LineChart {
    method SetHeight (line 294) | func (l *LineChart) SetHeight(s int) *LineChart {
    method SetLabels (line 299) | func (l *LineChart) SetLabels(s []string) *LineChart {
    method AddDataSet (line 304) | func (l *LineChart) AddDataSet(s string) *LineChart {
    method DSLabel (line 313) | func (l *LineChart) DSLabel(s string) *LineChart {
    method DSData (line 318) | func (l *LineChart) DSData(data []float64) *LineChart {
    method DSType (line 323) | func (l *LineChart) DSType(t string) *LineChart {
    method DSBackgroundColor (line 328) | func (l *LineChart) DSBackgroundColor(backgroundColor Color) *LineChart {
    method DSBorderCapStyle (line 333) | func (l *LineChart) DSBorderCapStyle(borderCapStyle string) *LineChart {
    method DSBorderColor (line 338) | func (l *LineChart) DSBorderColor(borderColor Color) *LineChart {
    method DSBorderDash (line 343) | func (l *LineChart) DSBorderDash(borderDash []int) *LineChart {
    method DSBorderDashOffset (line 348) | func (l *LineChart) DSBorderDashOffset(borderDashOffset float64) *Line...
    method DSBorderJoinStyle (line 353) | func (l *LineChart) DSBorderJoinStyle(borderJoinStyle string) *LineCha...
    method DSBorderWidth (line 358) | func (l *LineChart) DSBorderWidth(borderWidth float64) *LineChart {
    method DSCubicInterpolationMode (line 363) | func (l *LineChart) DSCubicInterpolationMode(cubicInterpolationMode st...
    method DSFill (line 368) | func (l *LineChart) DSFill(fill bool) *LineChart {
    method DSHoverBackgroundColor (line 373) | func (l *LineChart) DSHoverBackgroundColor(hoverBackgroundColor Color)...
    method DSHoverBorderCapStyle (line 378) | func (l *LineChart) DSHoverBorderCapStyle(hoverBorderCapStyle string) ...
    method DSHoverBorderColor (line 383) | func (l *LineChart) DSHoverBorderColor(hoverBorderColor Color) *LineCh...
    method DSHoverBorderDash (line 388) | func (l *LineChart) DSHoverBorderDash(hoverBorderDash float64) *LineCh...
    method DSHoverBorderDashOffset (line 393) | func (l *LineChart) DSHoverBorderDashOffset(hoverBorderDashOffset floa...
    method DSHoverBorderJoinStyle (line 398) | func (l *LineChart) DSHoverBorderJoinStyle(hoverBorderJoinStyle string...
    method DSHoverBorderWidth (line 403) | func (l *LineChart) DSHoverBorderWidth(hoverBorderWidth float64) *Line...
    method DSLineTension (line 408) | func (l *LineChart) DSLineTension(lineTension float64) *LineChart {
    method DSOrder (line 413) | func (l *LineChart) DSOrder(order float64) *LineChart {
    method DSPointBackgroundColor (line 418) | func (l *LineChart) DSPointBackgroundColor(pointBackgroundColor Color)...
    method DSPointBorderColor (line 423) | func (l *LineChart) DSPointBorderColor(pointBorderColor Color) *LineCh...
    method DSPointBorderWidth (line 428) | func (l *LineChart) DSPointBorderWidth(pointBorderWidth float64) *Line...
    method DSPointHitRadius (line 433) | func (l *LineChart) DSPointHitRadius(pointHitRadius float64) *LineChart {
    method DSPointHoverBackgroundColor (line 438) | func (l *LineChart) DSPointHoverBackgroundColor(pointHoverBackgroundCo...
    method DSPointHoverBorderColor (line 443) | func (l *LineChart) DSPointHoverBorderColor(pointHoverBorderColor Colo...
    method DSPointHoverBorderWidth (line 448) | func (l *LineChart) DSPointHoverBorderWidth(pointHoverBorderWidth floa...
    method DSPointHoverRadius (line 453) | func (l *LineChart) DSPointHoverRadius(pointHoverRadius float64) *Line...
    method DSPointRadius (line 458) | func (l *LineChart) DSPointRadius(pointRadius float64) *LineChart {
    method DSPointRotation (line 463) | func (l *LineChart) DSPointRotation(pointRotation float64) *LineChart {
    method DSPointStyle (line 468) | func (l *LineChart) DSPointStyle(pointStyle string) *LineChart {
    method DSShowLine (line 473) | func (l *LineChart) DSShowLine(showLine bool) *LineChart {
    method DSSpanGaps (line 478) | func (l *LineChart) DSSpanGaps(spanGaps bool) *LineChart {
    method DSSteppedLine (line 483) | func (l *LineChart) DSSteppedLine(steppedLine bool) *LineChart {
    method DSXAxisID (line 488) | func (l *LineChart) DSXAxisID(xAxisID string) *LineChart {
    method DSYAxisID (line 493) | func (l *LineChart) DSYAxisID(yAxisID string) *LineChart {
    method GetContent (line 498) | func (l *LineChart) GetContent() template.HTML {
  type LineJsContent (line 18) | type LineJsContent struct
  type LineAttributes (line 24) | type LineAttributes struct
  type LineDataSets (line 30) | type LineDataSets
    method Add (line 32) | func (l LineDataSets) Add(ds *LineDataSet) LineDataSets {
  type LineDataSet (line 36) | type LineDataSet struct
    method SetLabel (line 76) | func (l *LineDataSet) SetLabel(label string) *LineDataSet {
    method SetData (line 81) | func (l *LineDataSet) SetData(data []float64) *LineDataSet {
    method SetType (line 86) | func (l *LineDataSet) SetType(t string) *LineDataSet {
    method SetBackgroundColor (line 91) | func (l *LineDataSet) SetBackgroundColor(backgroundColor Color) *LineD...
    method SetBorderCapStyle (line 96) | func (l *LineDataSet) SetBorderCapStyle(borderCapStyle string) *LineDa...
    method SetBorderColor (line 101) | func (l *LineDataSet) SetBorderColor(borderColor Color) *LineDataSet {
    method SetBorderDash (line 106) | func (l *LineDataSet) SetBorderDash(borderDash []int) *LineDataSet {
    method SetBorderDashOffset (line 111) | func (l *LineDataSet) SetBorderDashOffset(borderDashOffset float64) *L...
    method SetBorderJoinStyle (line 116) | func (l *LineDataSet) SetBorderJoinStyle(borderJoinStyle string) *Line...
    method SetBorderWidth (line 121) | func (l *LineDataSet) SetBorderWidth(borderWidth float64) *LineDataSet {
    method SetCubicInterpolationMode (line 126) | func (l *LineDataSet) SetCubicInterpolationMode(cubicInterpolationMode...
    method SetFill (line 131) | func (l *LineDataSet) SetFill(fill bool) *LineDataSet {
    method SetHoverBackgroundColor (line 136) | func (l *LineDataSet) SetHoverBackgroundColor(hoverBackgroundColor Col...
    method SetHoverBorderCapStyle (line 141) | func (l *LineDataSet) SetHoverBorderCapStyle(hoverBorderCapStyle strin...
    method SetHoverBorderColor (line 146) | func (l *LineDataSet) SetHoverBorderColor(hoverBorderColor Color) *Lin...
    method SetHoverBorderDash (line 151) | func (l *LineDataSet) SetHoverBorderDash(hoverBorderDash float64) *Lin...
    method SetHoverBorderDashOffset (line 156) | func (l *LineDataSet) SetHoverBorderDashOffset(hoverBorderDashOffset f...
    method SetHoverBorderJoinStyle (line 161) | func (l *LineDataSet) SetHoverBorderJoinStyle(hoverBorderJoinStyle str...
    method SetHoverBorderWidth (line 166) | func (l *LineDataSet) SetHoverBorderWidth(hoverBorderWidth float64) *L...
    method SetLineTension (line 171) | func (l *LineDataSet) SetLineTension(lineTension float64) *LineDataSet {
    method SetOrder (line 176) | func (l *LineDataSet) SetOrder(order float64) *LineDataSet {
    method SetPointBackgroundColor (line 181) | func (l *LineDataSet) SetPointBackgroundColor(pointBackgroundColor Col...
    method SetPointBorderColor (line 186) | func (l *LineDataSet) SetPointBorderColor(pointBorderColor Color) *Lin...
    method SetPointBorderWidth (line 191) | func (l *LineDataSet) SetPointBorderWidth(pointBorderWidth float64) *L...
    method SetPointHitRadius (line 196) | func (l *LineDataSet) SetPointHitRadius(pointHitRadius float64) *LineD...
    method SetPointHoverBackgroundColor (line 201) | func (l *LineDataSet) SetPointHoverBackgroundColor(pointHoverBackgroun...
    method SetPointHoverBorderColor (line 206) | func (l *LineDataSet) SetPointHoverBorderColor(pointHoverBorderColor C...
    method SetPointHoverBorderWidth (line 211) | func (l *LineDataSet) SetPointHoverBorderWidth(pointHoverBorderWidth f...
    method SetPointHoverRadius (line 216) | func (l *LineDataSet) SetPointHoverRadius(pointHoverRadius float64) *L...
    method SetPointRadius (line 221) | func (l *LineDataSet) SetPointRadius(pointRadius float64) *LineDataSet {
    method SetPointRotation (line 226) | func (l *LineDataSet) SetPointRotation(pointRotation float64) *LineDat...
    method SetPointStyle (line 231) | func (l *LineDataSet) SetPointStyle(pointStyle string) *LineDataSet {
    method SetShowLine (line 236) | func (l *LineDataSet) SetShowLine(showLine bool) *LineDataSet {
    method SetSpanGaps (line 241) | func (l *LineDataSet) SetSpanGaps(spanGaps bool) *LineDataSet {
    method SetSteppedLine (line 246) | func (l *LineDataSet) SetSteppedLine(steppedLine bool) *LineDataSet {
    method SetXAxisID (line 251) | func (l *LineDataSet) SetXAxisID(xAxisID string) *LineDataSet {
    method SetYAxisID (line 256) | func (l *LineDataSet) SetYAxisID(yAxisID string) *LineDataSet {
  function Line (line 261) | func Line() *LineChart {

FILE: template/chartjs/pie.go
  type PieChart (line 12) | type PieChart struct
    method SetID (line 131) | func (l *PieChart) SetID(s string) *PieChart {
    method SetTitle (line 136) | func (l *PieChart) SetTitle(s template.HTML) *PieChart {
    method SetHeight (line 141) | func (l *PieChart) SetHeight(s int) *PieChart {
    method SetLabels (line 146) | func (l *PieChart) SetLabels(s []string) *PieChart {
    method AddDataSet (line 151) | func (l *PieChart) AddDataSet(s string) *PieChart {
    method DSLabel (line 160) | func (l *PieChart) DSLabel(s string) *PieChart {
    method DSData (line 165) | func (l *PieChart) DSData(data []float64) *PieChart {
    method DSType (line 170) | func (l *PieChart) DSType(t string) *PieChart {
    method DSBackgroundColor (line 175) | func (l *PieChart) DSBackgroundColor(backgroundColor []Color) *PieChart {
    method DSBorderColor (line 180) | func (l *PieChart) DSBorderColor(borderColor Color) *PieChart {
    method DSBorderWidth (line 185) | func (l *PieChart) DSBorderWidth(borderWidth float64) *PieChart {
    method DSWeight (line 190) | func (l *PieChart) DSWeight(weight int) *PieChart {
    method DSHoverBackgroundColor (line 195) | func (l *PieChart) DSHoverBackgroundColor(hoverBackgroundColor Color) ...
    method DSHoverBorderColor (line 200) | func (l *PieChart) DSHoverBorderColor(hoverBorderColor Color) *PieChart {
    method DSHoverBorderWidth (line 205) | func (l *PieChart) DSHoverBorderWidth(hoverBorderWidth float64) *PieCh...
    method GetContent (line 210) | func (l *PieChart) GetContent() template.HTML {
  type PieJsContent (line 18) | type PieJsContent struct
  type PieAttributes (line 24) | type PieAttributes struct
  type PieDataSets (line 30) | type PieDataSets
Condensed preview — 368 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (3,451K chars).
[
  {
    "path": ".deepsource.toml",
    "chars": 128,
    "preview": "version = 1\n\n[[analyzers]]\nname = \"go\"\nenabled = true\n\n  [analyzers.meta]\n  import_paths = [\"github.com/GoAdminGroup/go-"
  },
  {
    "path": ".drone.yml",
    "chars": 3327,
    "preview": "---\nkind: pipeline\ntype: docker\nname: api_mysql\n\ntrigger:\n  event:\n  - pull_request\n\nclone:\n  disable: true\n\nservices:\n-"
  },
  {
    "path": ".github/FUNDING.yml",
    "chars": 199,
    "preview": "# These are supported funding model platforms\n\ngithub:\npatreon:\nopen_collective: go-admin\nko_fi: \ntidelift:\ncommunity_br"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/bug_report.md",
    "chars": 481,
    "preview": "---\nname: Bug report\nabout: Create a report to help us improve\ntitle: \"[BUG]\"\nlabels: \"\\U0001F41Bbug\"\nassignees: ''\n\n---"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/bug_report_zh.md",
    "chars": 295,
    "preview": "---\nname: Bug 报告\nabout: 提交bug帮助我们修复\ntitle: \"[BUG]\"\nlabels: \"\\U0001F41Bbug\"\nassignees: ''\n\n---\n\n### bug 描述 [详细地描述 bug,让大家"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/proposal.md",
    "chars": 228,
    "preview": "---\nname: Proposal\nabout: Any advice for GoAdmin\ntitle: \"[Proposal]\"\nlabels: ''\nassignees: ''\n\n---\n\n### Description [des"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/proposal_zh.md",
    "chars": 174,
    "preview": "---\nname: 功能需求\nabout: 对 GoAdmin 的需求或建议\ntitle: \"[Proposal]\"\nlabels: ''\nassignees: ''\n\n---\n\n### 需求描述 [详细地描述需求,让大家都能理解]\n\n##"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/questions.md",
    "chars": 239,
    "preview": "---\nname: Questions\nabout: Any questions when using GoAdmin\ntitle: \"[Question]\"\nlabels: ''\nassignees: ''\n\n---\n\n### Descr"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/questions_zh.md",
    "chars": 179,
    "preview": "---\nname: 疑问或需要帮助 ❓\nabout: 关于 GoAdmin 的问题\ntitle: \"[Question]\"\nlabels: ''\nassignees: ''\n\n---\n\n### 问题描述 [详细地描述问题,让大家都能理解]\n"
  },
  {
    "path": ".gitignore",
    "chars": 206,
    "preview": ".idea\n.vscode\n.DS_Store\ndemo/config.json\ndemo/config\ndemo/deploy.yml\ndemo/hosts\ndemo/go-admin\ndemo/Makefile\ndemo/deploy."
  },
  {
    "path": "CODE_OF_CONDUCT.md",
    "chars": 3214,
    "preview": "# Contributor Covenant Code of Conduct\n\n## Our Pledge\n\nIn the interest of fostering an open and welcoming environment, w"
  },
  {
    "path": "CONTRIBUTING.md",
    "chars": 2549,
    "preview": "# Contributing\n\nIf you want to contribute, but not sure what to do, here's a list of things that I always need help with"
  },
  {
    "path": "CONTRIBUTING_CN.md",
    "chars": 1707,
    "preview": "# 贡献\n\n如果你想要对项目作出贡献,却不知道怎么做,下面有一些帮助:\n\n* 翻译\n    * README.md\n    * [docs](https://github.com/GoAdminGroup/docs/issues/1)\n* "
  },
  {
    "path": "DONATION.md",
    "chars": 28,
    "preview": "# Donation List 捐赠名单(排名不分先后)"
  },
  {
    "path": "Dockerfile",
    "chars": 1328,
    "preview": "# This file describes the standard way to build GoAdmin develop env image, and using container\n#\n# Usage:\n#\n# # Assemble"
  },
  {
    "path": "LICENSE",
    "chars": 11357,
    "preview": "                                 Apache License\n                           Version 2.0, January 2004\n                   "
  },
  {
    "path": "Makefile",
    "chars": 3931,
    "preview": "GOCMD = go\nGOBUILD = $(GOCMD) build\n\nTEST_CONFIG_PATH=./../../common/config.json\nTEST_CONFIG_PQ_PATH=./../../common/conf"
  },
  {
    "path": "README.md",
    "chars": 3770,
    "preview": "<p align=\"center\">\n  <a href=\"https://github.com/GoAdminGroup/go-admin\">\n    <img width=\"48%\" alt=\"go-admin\" src=\"http:/"
  },
  {
    "path": "README_CN.md",
    "chars": 3246,
    "preview": "<p align=\"center\">\n  <a href=\"https://github.com/GoAdminGroup/go-admin\">\n    <img width=\"48%\" alt=\"go-admin\" src=\"http:/"
  },
  {
    "path": "SECURITY.md",
    "chars": 102,
    "preview": "# Security Policy\n\n## Reporting a Vulnerability\n\nPlease report security issues to `chg80333@gmail.com`"
  },
  {
    "path": "adapter/adapter.go",
    "chars": 5771,
    "preview": "// Copyright 2019 GoAdmin Core Team. All rights reserved.\n// Use of this source code is governed by a Apache-2.0 style\n/"
  },
  {
    "path": "adapter/beego/beego.go",
    "chars": 4782,
    "preview": "// Copyright 2019 GoAdmin Core Team. All rights reserved.\n// Use of this source code is governed by a Apache-2.0 style\n/"
  },
  {
    "path": "adapter/beego2/beego2.go",
    "chars": 3535,
    "preview": "package beego2\n\nimport (\n\t\"bytes\"\n\t\"errors\"\n\t\"net/http\"\n\t\"net/url\"\n\t\"strings\"\n\n\t\"github.com/GoAdminGroup/go-admin/adapte"
  },
  {
    "path": "adapter/buffalo/buffalo.go",
    "chars": 5796,
    "preview": "// Copyright 2019 GoAdmin Core Team. All rights reserved.\n// Use of this source code is governed by a Apache-2.0 style\n/"
  },
  {
    "path": "adapter/chi/chi.go",
    "chars": 5893,
    "preview": "// Copyright 2019 GoAdmin Core Team. All rights reserved.\n// Use of this source code is governed by a Apache-2.0 style\n/"
  },
  {
    "path": "adapter/echo/echo.go",
    "chars": 4817,
    "preview": "// Copyright 2019 GoAdmin Core Team. All rights reserved.\n// Use of this source code is governed by a Apache-2.0 style\n/"
  },
  {
    "path": "adapter/fasthttp/fasthttp.go",
    "chars": 6448,
    "preview": "// Copyright 2019 GoAdmin Core Team. All rights reserved.\n// Use of this source code is governed by a Apache-2.0 style\n/"
  },
  {
    "path": "adapter/gear/gear.go",
    "chars": 5182,
    "preview": "/***\n# File Name: ../../adapter/gear/gear.go\n# Author: eavesmy\n# Email: eavesmy@gmail.com\n# Created Time: 2021年06月03日 星期"
  },
  {
    "path": "adapter/gf/gf.go",
    "chars": 4903,
    "preview": "// Copyright 2019 GoAdmin Core Team. All rights reserved.\n// Use of this source code is governed by a Apache-2.0 style\n/"
  },
  {
    "path": "adapter/gf2/gf2.go",
    "chars": 3644,
    "preview": "package gf2\n\nimport (\n\t\"bytes\"\n\t\"errors\"\n\t\"net/http\"\n\t\"net/url\"\n\t\"regexp\"\n\t\"strings\"\n\n\t\"github.com/GoAdminGroup/go-admin"
  },
  {
    "path": "adapter/gin/gin.go",
    "chars": 4652,
    "preview": "// Copyright 2019 GoAdmin Core Team. All rights reserved.\n// Use of this source code is governed by a Apache-2.0 style\n/"
  },
  {
    "path": "adapter/gofiber/gofiber.go",
    "chars": 5758,
    "preview": "// Copyright 2019 GoAdmin Core Team. All rights reserved.\n// Use of this source code is governed by a Apache-2.0 style\n/"
  },
  {
    "path": "adapter/gorilla/gorilla.go",
    "chars": 5303,
    "preview": "// Copyright 2019 GoAdmin Core Team. All rights reserved.\n// Use of this source code is governed by a Apache-2.0 style\n/"
  },
  {
    "path": "adapter/iris/iris.go",
    "chars": 4651,
    "preview": "// Copyright 2019 GoAdmin Core Team. All rights reserved.\n// Use of this source code is governed by a Apache-2.0 style\n/"
  },
  {
    "path": "adapter/nethttp/nethttp.go",
    "chars": 6155,
    "preview": "package nethttp\n\nimport (\n\t\"bytes\"\n\t\"errors\"\n\t\"fmt\"\n\t\"net/http\"\n\t\"net/url\"\n\t\"regexp\"\n\t\"strings\"\n\n\t\"github.com/GoAdminGro"
  },
  {
    "path": "context/context.go",
    "chars": 21159,
    "preview": "// Copyright 2019 GoAdmin Core Team. All rights reserved.\n// Use of this source code is governed by a Apache-2.0 style\n/"
  },
  {
    "path": "context/context_test.go",
    "chars": 2511,
    "preview": "package context\n\nimport (\n\t\"fmt\"\n\t\"testing\"\n\n\t\"github.com/magiconair/properties/assert\"\n)\n\nfunc TestSlash(t *testing.T) "
  },
  {
    "path": "context/trie.go",
    "chars": 2448,
    "preview": "// Copyright 2019 GoAdmin Core Team. All rights reserved.\n// Use of this source code is governed by a Apache-2.0 style\n/"
  },
  {
    "path": "data/admin.mssql",
    "chars": 6462,
    "preview": "\n\nCREATE TABLE [goadmin_menu] (\n [id] int   identity(1,1) ,\n [parent_id] int   NOT NULL DEFAULT 0,\n [type] tinyint   NOT"
  },
  {
    "path": "data/admin.pgsql",
    "chars": 15062,
    "preview": "--\n-- PostgreSQL database dump\n--\n\n-- Dumped from database version 9.5.14\n-- Dumped by pg_dump version 10.5\n\nSET stateme"
  },
  {
    "path": "data/admin.sql",
    "chars": 12487,
    "preview": "# ************************************************************\n# Sequel Pro SQL dump\n# Version 4468\n#\n# http://www.seque"
  },
  {
    "path": "data/migrations/admin_2020_04_14_100427_ms.sql",
    "chars": 313,
    "preview": "CREATE TABLE[goadmin_site] (\n [id] int   identity(1,1) ,\n [key] varchar(100)   NOT NULL,\n [value] text   NOT NULL,\n [sta"
  },
  {
    "path": "data/migrations/admin_2020_04_14_100427_mysql.sql",
    "chars": 513,
    "preview": "CREATE TABLE `goadmin_site` (\n  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,\n  `key` varchar(100) COLLATE utf8mb4_unic"
  },
  {
    "path": "data/migrations/admin_2020_04_14_100427_postgres.sql",
    "chars": 1730,
    "preview": "--\n-- PostgreSQL database dump\n--\n\n-- Dumped from database version 9.5.14\n-- Dumped by pg_dump version 10.5\n\nSET stateme"
  },
  {
    "path": "data/migrations/admin_2020_04_14_100427_sqlite.sql",
    "chars": 339,
    "preview": "CREATE TABLE IF NOT EXISTS \"goadmin_site\" (\n`id` integer PRIMARY KEY autoincrement,\n`key` CHAR(100) COLLATE NOCASE NOT N"
  },
  {
    "path": "data/migrations/admin_2020_08_04_092427_ms.sql",
    "chars": 117,
    "preview": "ALTER TABLE goadmin_menu\nADD plugin_name varchar(150) NOT NULL DEFAULT '',\nADD uuid varchar(150) NOT NULL DEFAULT '';"
  },
  {
    "path": "data/migrations/admin_2020_08_04_092427_mysql.sql",
    "chars": 189,
    "preview": "ALTER TABLE goadmin_menu\nADD COLUMN `uuid` varchar(150) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '',\nADD COLUMN `plug"
  },
  {
    "path": "data/migrations/admin_2020_08_04_092427_postgres.sql",
    "chars": 151,
    "preview": "ALTER TABLE goadmin_menu\nADD COLUMN plugin_name character varying(150) NOT NULL DEFAULT '',\nADD COLUMN uuid character va"
  },
  {
    "path": "data/migrations/admin_2020_08_04_092427_sqlite.sql",
    "chars": 135,
    "preview": "ALTER TABLE goadmin_menu\nADD COLUMN `uuid` varchar(150) NOT NULL DEFAULT '',\nADD COLUMN `plugin_name` varchar(150) NOT N"
  },
  {
    "path": "docker-compose.yml",
    "chars": 953,
    "preview": "version: \"3.3\"\nservices:\n  mysql:\n    image: mysql:5.6\n    container_name: mysql\n    ports:\n      - \"3306:3306\"\n    volu"
  },
  {
    "path": "engine/engine.go",
    "chars": 24166,
    "preview": "// Copyright 2019 GoAdmin Core Team. All rights reserved.\n// Use of this source code is governed by a Apache-2.0 style\n/"
  },
  {
    "path": "examples/beego/main.go",
    "chars": 2489,
    "preview": "package main\n\nimport (\n\t\"log\"\n\t\"os\"\n\t\"os/signal\"\n\t\"time\"\n\n\t_ \"github.com/GoAdminGroup/go-admin/adapter/beego\"\n\t_ \"github"
  },
  {
    "path": "examples/beego2/main.go",
    "chars": 1919,
    "preview": "package main\n\nimport (\n\t\"log\"\n\t\"os\"\n\t\"os/signal\"\n\t\"time\"\n\n\t_ \"github.com/GoAdminGroup/go-admin/adapter/beego2\"\n\t_ \"githu"
  },
  {
    "path": "examples/buffalo/main.go",
    "chars": 2507,
    "preview": "package main\n\nimport (\n\t\"log\"\n\t\"net/http\"\n\t\"os\"\n\t\"os/signal\"\n\t\"time\"\n\n\t_ \"github.com/GoAdminGroup/go-admin/adapter/buffa"
  },
  {
    "path": "examples/chi/main.go",
    "chars": 3150,
    "preview": "package main\n\nimport (\n\t\"log\"\n\t\"net/http\"\n\t\"os\"\n\t\"os/signal\"\n\t\"path/filepath\"\n\t\"strings\"\n\t\"time\"\n\n\t_ \"github.com/GoAdmin"
  },
  {
    "path": "examples/datamodel/authors.go",
    "chars": 1551,
    "preview": "package datamodel\n\nimport (\n\t\"github.com/GoAdminGroup/go-admin/context\"\n\t\"github.com/GoAdminGroup/go-admin/modules/db\"\n\t"
  },
  {
    "path": "examples/datamodel/bootstrap.go",
    "chars": 18,
    "preview": "package datamodel\n"
  },
  {
    "path": "examples/datamodel/config.json",
    "chars": 437,
    "preview": "{\n  \"database\": {\n    \"default\": {\n      \"host\": \"127.0.0.1\",\n      \"port\": \"3306\",\n      \"user\": \"root\",\n      \"pwd\": \""
  },
  {
    "path": "examples/datamodel/content.go",
    "chars": 14129,
    "preview": "package datamodel\n\nimport (\n\t\"html/template\"\n\n\t\"github.com/GoAdminGroup/go-admin/context\"\n\ttmpl \"github.com/GoAdminGroup"
  },
  {
    "path": "examples/datamodel/goadmin_super_users.go",
    "chars": 1701,
    "preview": "package datamodel\n\nimport (\n\t\"github.com/GoAdminGroup/go-admin/context\"\n\t\"github.com/GoAdminGroup/go-admin/modules/db\"\n\t"
  },
  {
    "path": "examples/datamodel/mysql_types.go",
    "chars": 5722,
    "preview": "package datamodel\n\nimport (\n\t\"github.com/GoAdminGroup/go-admin/modules/db\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/ad"
  },
  {
    "path": "examples/datamodel/posts.go",
    "chars": 2762,
    "preview": "package datamodel\n\nimport (\n\ttemplate2 \"html/template\"\n\n\t\"github.com/GoAdminGroup/go-admin/context\"\n\t\"github.com/GoAdmin"
  },
  {
    "path": "examples/datamodel/tables.go",
    "chars": 557,
    "preview": "package datamodel\n\nimport \"github.com/GoAdminGroup/go-admin/plugins/admin/modules/table\"\n\n// Generators is a map of tabl"
  },
  {
    "path": "examples/datamodel/user.go",
    "chars": 8529,
    "preview": "package datamodel\n\nimport (\n\t\"fmt\"\n\n\t\"github.com/GoAdminGroup/go-admin/context\"\n\t\"github.com/GoAdminGroup/go-admin/modul"
  },
  {
    "path": "examples/echo/main.go",
    "chars": 2377,
    "preview": "package main\n\nimport (\n\t\"log\"\n\t\"os\"\n\t\"os/signal\"\n\t\"time\"\n\n\t_ \"github.com/GoAdminGroup/go-admin/adapter/echo\"\n\t_ \"github."
  },
  {
    "path": "examples/fasthttp/main.go",
    "chars": 2438,
    "preview": "package main\n\nimport (\n\t\"log\"\n\t\"os\"\n\t\"os/signal\"\n\t\"time\"\n\n\t_ \"github.com/GoAdminGroup/go-admin/adapter/fasthttp\"\n\t_ \"git"
  },
  {
    "path": "examples/gear/main.go",
    "chars": 2655,
    "preview": "package main\n\nimport (\n\t\"log\"\n\t\"os\"\n\t\"os/signal\"\n\t\"time\"\n\n\t_ \"github.com/GoAdminGroup/go-admin/adapter/gear\"\n\t_ \"github."
  },
  {
    "path": "examples/gf/main.go",
    "chars": 2472,
    "preview": "package main\n\nimport (\n\t\"log\"\n\t\"os\"\n\t\"os/signal\"\n\t\"time\"\n\n\t_ \"github.com/GoAdminGroup/go-admin/adapter/gf\"\n\t_ \"github.co"
  },
  {
    "path": "examples/gf2/main.go",
    "chars": 1911,
    "preview": "package main\n\nimport (\n\t\"log\"\n\t\"os\"\n\t\"os/signal\"\n\t\"time\"\n\n\t_ \"github.com/GoAdminGroup/go-admin/adapter/gf2\"\n\t_ \"github.c"
  },
  {
    "path": "examples/gin/main.go",
    "chars": 2753,
    "preview": "package main\n\nimport (\n\t\"io/ioutil\"\n\t\"log\"\n\t\"os\"\n\t\"os/signal\"\n\t\"time\"\n\n\t_ \"github.com/GoAdminGroup/go-admin/adapter/gin\""
  },
  {
    "path": "examples/gofiber/main.go",
    "chars": 2326,
    "preview": "package main\n\nimport (\n\t\"log\"\n\t\"os\"\n\t\"os/signal\"\n\t\"time\"\n\n\t_ \"github.com/GoAdminGroup/go-admin/adapter/gofiber\"\n\t_ \"gith"
  },
  {
    "path": "examples/gorilla/main.go",
    "chars": 2437,
    "preview": "package main\n\nimport (\n\t\"log\"\n\t\"net/http\"\n\t\"os\"\n\t\"os/signal\"\n\t\"time\"\n\n\t_ \"github.com/GoAdminGroup/go-admin/adapter/goril"
  },
  {
    "path": "examples/iris/main.go",
    "chars": 2456,
    "preview": "package main\n\nimport (\n\t\"log\"\n\t\"os\"\n\t\"os/signal\"\n\t\"time\"\n\n\t_ \"github.com/GoAdminGroup/go-admin/adapter/iris\"\n\t_ \"github."
  },
  {
    "path": "examples/nethttp/main.go",
    "chars": 3164,
    "preview": "package main\n\nimport (\n\t\"log\"\n\t\"net/http\"\n\t\"os\"\n\t\"os/signal\"\n\t\"path/filepath\"\n\t\"strings\"\n\t\"time\"\n\n\t_ \"github.com/GoAdmin"
  },
  {
    "path": "go.mod",
    "chars": 8327,
    "preview": "module github.com/GoAdminGroup/go-admin\n\ngo 1.22.10\n\nrequire (\n\tgithub.com/360EntSecGroup-Skylar/excelize v1.4.1\n\tgithub"
  },
  {
    "path": "go.sum",
    "chars": 61304,
    "preview": "cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ncloud.google.com/go v0.34.0/go.mod h1"
  },
  {
    "path": "modules/auth/auth.go",
    "chars": 4631,
    "preview": "// Copyright 2019 GoAdmin Core Team. All rights reserved.\n// Use of this source code is governed by a Apache-2.0 style\n/"
  },
  {
    "path": "modules/auth/auth_test.go",
    "chars": 214,
    "preview": "package auth\n\nimport (\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n)\n\nfunc TestEncodePassword(t *testing.T) {\n\tpwd"
  },
  {
    "path": "modules/auth/middleware.go",
    "chars": 6303,
    "preview": "// Copyright 2019 GoAdmin Core Team. All rights reserved.\n// Use of this source code is governed by a Apache-2.0 style\n/"
  },
  {
    "path": "modules/auth/middleware_test.go",
    "chars": 3269,
    "preview": "package auth\n\nimport (\n\t\"net/url\"\n\t\"testing\"\n\n\t\"github.com/GoAdminGroup/go-admin/modules/config\"\n\t\"github.com/GoAdminGro"
  },
  {
    "path": "modules/auth/session.go",
    "chars": 6105,
    "preview": "// Copyright 2019 GoAdmin Core Team. All rights reserved.\n// Use of this source code is governed by a Apache-2.0 style\n/"
  },
  {
    "path": "modules/collection/collection.go",
    "chars": 1332,
    "preview": "package collection\n\ntype Collection []map[string]interface{}\n\n// Where filters the collection by a given key / value pai"
  },
  {
    "path": "modules/collection/collection_test.go",
    "chars": 19,
    "preview": "package collection\n"
  },
  {
    "path": "modules/config/config.go",
    "chars": 39001,
    "preview": "// Copyright 2019 GoAdmin Core Team. All rights reserved.\n// Use of this source code is governed by a Apache-2.0 style\n/"
  },
  {
    "path": "modules/config/config.ini",
    "chars": 318,
    "preview": "domain = localhost\nprefix = admin\nlanguage = en\nindex = /\ndebug = true\nopen_admin_api = true\ncolor_scheme = skin-black\n\n"
  },
  {
    "path": "modules/config/config.yaml",
    "chars": 330,
    "preview": "---\ndatabase:\n  default:\n    host: 127.0.0.1\n    port: '1433'\n    user: sa\n    pwd: Aa123456\n    name: goadmin\n    max_i"
  },
  {
    "path": "modules/config/config_test.go",
    "chars": 12132,
    "preview": "package config\n\nimport (\n\t\"fmt\"\n\t\"reflect\"\n\t\"testing\"\n\n\t\"github.com/GoAdminGroup/go-admin/modules/utils\"\n\n\t\"github.com/s"
  },
  {
    "path": "modules/constant/constant.go",
    "chars": 356,
    "preview": "package constant\n\nconst (\n\t// PjaxHeader is default pjax http header key.\n\tPjaxHeader = \"X-PJAX\"\n\n\t// PjaxUrlHeader is d"
  },
  {
    "path": "modules/db/base.go",
    "chars": 1026,
    "preview": "package db\n\nimport (\n\t\"database/sql\"\n\t\"errors\"\n\t\"sync\"\n\n\t\"github.com/GoAdminGroup/go-admin/modules/config\"\n\t\"xorm.io/xor"
  },
  {
    "path": "modules/db/connection.go",
    "chars": 4756,
    "preview": "// Copyright 2019 GoAdmin Core Team. All rights reserved.\n// Use of this source code is governed by a Apache-2.0 style\n/"
  },
  {
    "path": "modules/db/converter.go",
    "chars": 2125,
    "preview": "// Copyright 2019 GoAdmin Core Team. All rights reserved.\n// Use of this source code is governed by a Apache-2.0 style\n/"
  },
  {
    "path": "modules/db/dialect/common.go",
    "chars": 1777,
    "preview": "package dialect\n\nimport \"fmt\"\n\ntype commonDialect struct {\n\tdelimiter  string\n\tdelimiter2 string\n}\n\nfunc (c commonDialec"
  },
  {
    "path": "modules/db/dialect/dialect.go",
    "chars": 6977,
    "preview": "// Copyright 2019 GoAdmin Core Team. All rights reserved.\n// Use of this source code is governed by a Apache-2.0 style\n/"
  },
  {
    "path": "modules/db/dialect/mssql.go",
    "chars": 730,
    "preview": "// Copyright 2019 GoAdmin Core Team. All rights reserved.\n// Use of this source code is governed by a Apache-2.0 style\n/"
  },
  {
    "path": "modules/db/dialect/mysql.go",
    "chars": 765,
    "preview": "// Copyright 2019 GoAdmin Core Team. All rights reserved.\n// Use of this source code is governed by a Apache-2.0 style\n/"
  },
  {
    "path": "modules/db/dialect/oceanbase.go",
    "chars": 380,
    "preview": "package dialect\n\ntype oceanbase struct {\n\tcommonDialect\n}\n\nfunc (oceanbase) GetName() string {\n\treturn \"oceanbase\"\n}\n\nfu"
  },
  {
    "path": "modules/db/dialect/postgresql.go",
    "chars": 1250,
    "preview": "// Copyright 2019 GoAdmin Core Team. All rights reserved.\n// Use of this source code is governed by a Apache-2.0 style\n/"
  },
  {
    "path": "modules/db/dialect/sqlite.go",
    "chars": 602,
    "preview": "// Copyright 2019 GoAdmin Core Team. All rights reserved.\n// Use of this source code is governed by a Apache-2.0 style\n/"
  },
  {
    "path": "modules/db/drivers/mssql/mssql.go",
    "chars": 87,
    "preview": "package mssql\n\nimport _ \"github.com/denisenkom/go-mssqldb\" // Import the mssql driver.\n"
  },
  {
    "path": "modules/db/drivers/mysql/mysql.go",
    "chars": 85,
    "preview": "package mysql\n\nimport _ \"github.com/go-sql-driver/mysql\" // Import the mysql driver.\n"
  },
  {
    "path": "modules/db/drivers/oceanbase/oceanbase.go",
    "chars": 125,
    "preview": "package oceanbase\n\n//oceanbase-ce can use mysql driver\nimport _ \"github.com/go-sql-driver/mysql\" // Import the mysql dri"
  },
  {
    "path": "modules/db/drivers/postgres/postgres.go",
    "chars": 80,
    "preview": "package postgres\n\nimport _ \"github.com/lib/pq\" // Import the postgresql driver.\n"
  },
  {
    "path": "modules/db/drivers/sqlite/sqlite.go",
    "chars": 84,
    "preview": "package sqlite\n\nimport _ \"github.com/mattn/go-sqlite3\" // Import the sqlite driver.\n"
  },
  {
    "path": "modules/db/mssql.go",
    "chars": 10046,
    "preview": "// Copyright 2019 GoAdmin Core Team. All rights reserved.\n// Use of this source code is governed by a Apache-2.0 style\n/"
  },
  {
    "path": "modules/db/mysql.go",
    "chars": 5787,
    "preview": "// Copyright 2019 GoAdmin Core Team. All rights reserved.\n// Use of this source code is governed by a Apache-2.0 style\n/"
  },
  {
    "path": "modules/db/oceanbase.go",
    "chars": 5660,
    "preview": "package db\n\nimport (\n\t\"database/sql\"\n\t\"github.com/GoAdminGroup/go-admin/modules/config\"\n)\n\n// OceanBase is a Connection "
  },
  {
    "path": "modules/db/performer.go",
    "chars": 3558,
    "preview": "// Copyright 2019 GoAdmin Core Team. All rights reserved.\n// Use of this source code is governed by a Apache-2.0 style\n/"
  },
  {
    "path": "modules/db/postgresql.go",
    "chars": 6230,
    "preview": "// Copyright 2019 GoAdmin Core Team. All rights reserved.\n// Use of this source code is governed by a Apache-2.0 style\n/"
  },
  {
    "path": "modules/db/sqlite.go",
    "chars": 5632,
    "preview": "// Copyright 2019 GoAdmin Core Team. All rights reserved.\n// Use of this source code is governed by a Apache-2.0 style\n/"
  },
  {
    "path": "modules/db/statement.go",
    "chars": 14680,
    "preview": "// Copyright 2019 GoAdmin Core Team. All rights reserved.\n// Use of this source code is governed by a Apache-2.0 style\n/"
  },
  {
    "path": "modules/db/statement_mssql_test.go",
    "chars": 2876,
    "preview": "package db\n\nimport (\n\t\"testing\"\n\n\t\"github.com/GoAdminGroup/go-admin/modules/config\"\n\t_ \"github.com/GoAdminGroup/go-admin"
  },
  {
    "path": "modules/db/statement_mysql_test.go",
    "chars": 3262,
    "preview": "package db\n\nimport (\n\t\"fmt\"\n\t\"os/exec\"\n\t\"testing\"\n\n\t_ \"github.com/GoAdminGroup/go-admin/modules/db/drivers/mysql\"\n)\n\nvar"
  },
  {
    "path": "modules/db/statement_postgresql_test.go",
    "chars": 3151,
    "preview": "package db\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\t\"os/exec\"\n\t\"path\"\n\t\"testing\"\n\n\t_ \"github.com/GoAdminGroup/go-admin/modules/db/drivers"
  },
  {
    "path": "modules/db/statement_sqlite_test.go",
    "chars": 2862,
    "preview": "package db\n\nimport (\n\t\"testing\"\n\n\t\"github.com/GoAdminGroup/go-admin/modules/config\"\n\t_ \"github.com/GoAdminGroup/go-admin"
  },
  {
    "path": "modules/db/statement_test.go",
    "chars": 2451,
    "preview": "package db\n\nimport (\n\t\"database/sql\"\n\t\"testing\"\n\n\t_ \"github.com/GoAdminGroup/go-admin/modules/db/drivers/mssql\"\n\t_ \"gith"
  },
  {
    "path": "modules/db/types.go",
    "chars": 7441,
    "preview": "// Copyright 2019 GoAdmin Core Team. All rights reserved.\n// Use of this source code is governed by a Apache-2.0 style\n/"
  },
  {
    "path": "modules/db/types_test.go",
    "chars": 9526,
    "preview": "package db\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\t\"regexp\"\n\t\"strings\"\n\t\"testing\"\n\t\"time\"\n\n\t\"github.com/GoAdminGroup/go-admin/modules/co"
  },
  {
    "path": "modules/errors/error.go",
    "chars": 1118,
    "preview": "package errors\n\nimport (\n\t\"errors\"\n\t\"html/template\"\n\n\t\"github.com/GoAdminGroup/go-admin/modules/language\"\n\t\"github.com/G"
  },
  {
    "path": "modules/file/file.go",
    "chars": 3098,
    "preview": "// Copyright 2019 GoAdmin Core Team. All rights reserved.\n// Use of this source code is governed by a Apache-2.0 style\n/"
  },
  {
    "path": "modules/file/local.go",
    "chars": 867,
    "preview": "// Copyright 2019 GoAdmin Core Team. All rights reserved.\n// Use of this source code is governed by a Apache-2.0 style\n/"
  },
  {
    "path": "modules/language/cn.go",
    "chars": 17218,
    "preview": "// Copyright 2019 GoAdmin Core Team. All rights reserved.\n// Use of this source code is governed by a Apache-2.0 style\n/"
  },
  {
    "path": "modules/language/en.go",
    "chars": 20955,
    "preview": "// Copyright 2019 GoAdmin Core Team. All rights reserved.\n// Use of this source code is governed by a Apache-2.0 style\n/"
  },
  {
    "path": "modules/language/jp.go",
    "chars": 18551,
    "preview": "// Copyright 2019 GoAdmin Core Team. All rights reserved.\n// Use of this source code is governed by a Apache-2.0 style\n/"
  },
  {
    "path": "modules/language/language.go",
    "chars": 3736,
    "preview": "// Copyright 2019 GoAdmin Core Team. All rights reserved.\n// Use of this source code is governed by a Apache-2.0 style\n/"
  },
  {
    "path": "modules/language/language_test.go",
    "chars": 1155,
    "preview": "package language\n\nimport (\n\t\"fmt\"\n\t\"html/template\"\n\t\"testing\"\n\n\t\"github.com/GoAdminGroup/go-admin/modules/config\"\n\t\"gith"
  },
  {
    "path": "modules/language/pt-BR.go",
    "chars": 22161,
    "preview": "// Copyright 2019 GoAdmin Core Team. All rights reserved.\n// Use of this source code is governed by a Apache-2.0 style\n/"
  },
  {
    "path": "modules/language/ru.go",
    "chars": 20091,
    "preview": "// Copyright 2019 GoAdmin Core Team. All rights reserved.\n// Use of this source code is governed by a Apache-2.0 style\n/"
  },
  {
    "path": "modules/language/tc.go",
    "chars": 17241,
    "preview": "package language\n\nimport \"strings\"\n\nvar tc = LangSet{\n\t\"managers\":  \"管理員管理\",\n\t\"name\":      \"用戶名\",\n\t\"nickname\":  \"暱稱\",\n\t\""
  },
  {
    "path": "modules/logger/logger.go",
    "chars": 11418,
    "preview": "// Copyright 2019 GoAdmin Core Team. All rights reserved.\n// Use of this source code is governed by a Apache-2.0 style\n/"
  },
  {
    "path": "modules/logger/logger_test.go",
    "chars": 80,
    "preview": "package logger\n\nimport \"testing\"\n\nfunc TestInfo(t *testing.T) {\n\tInfo(\"test\")\n}\n"
  },
  {
    "path": "modules/menu/menu.go",
    "chars": 6779,
    "preview": "// Copyright 2019 GoAdmin Core Team. All rights reserved.\n// Use of this source code is governed by a Apache-2.0 style\n/"
  },
  {
    "path": "modules/menu/menu_test.go",
    "chars": 1594,
    "preview": "package menu\n\nimport (\n\t\"testing\"\n\n\t\"github.com/magiconair/properties/assert\"\n)\n\nfunc TestMenu_AddMaxOrder(t *testing.T)"
  },
  {
    "path": "modules/page/page.go",
    "chars": 1696,
    "preview": "// Copyright 2019 GoAdmin Core Team. All rights reserved.\n// Use of this source code is governed by a Apache-2.0 style\n/"
  },
  {
    "path": "modules/remote_server/remote_server.go",
    "chars": 4241,
    "preview": "package remote_server\n\nimport (\n\t\"encoding/json\"\n\t\"io/ioutil\"\n\t\"net/http\"\n\t\"strings\"\n\n\t\"github.com/GoAdminGroup/go-admin"
  },
  {
    "path": "modules/service/service.go",
    "chars": 1097,
    "preview": "// Copyright 2019 GoAdmin Core Team. All rights reserved.\n// Use of this source code is governed by a Apache-2.0 style\n/"
  },
  {
    "path": "modules/system/application.go",
    "chars": 3443,
    "preview": "package system\n\nimport (\n\t\"fmt\"\n\t\"runtime\"\n\t\"time\"\n\n\t\"github.com/GoAdminGroup/go-admin/modules/config\"\n\t\"github.com/GoAd"
  },
  {
    "path": "modules/system/version.go",
    "chars": 374,
    "preview": "package system\n\nconst version = \"v1.2.27\"\n\nvar requireThemeVersion = map[string][]string{\n\t\"adminlte\": {\">=v0.0.41\"},\n\t\""
  },
  {
    "path": "modules/trace/trace.go",
    "chars": 1283,
    "preview": "package trace\n\nimport (\n\t\"fmt\"\n\t\"net\"\n\t\"os\"\n\t\"sync\"\n\t\"sync/atomic\"\n\t\"time\"\n\n\t\"github.com/GoAdminGroup/go-admin/context\"\n"
  },
  {
    "path": "modules/ui/ui.go",
    "chars": 2040,
    "preview": "package ui\n\nimport (\n\t\"github.com/GoAdminGroup/go-admin/modules/config\"\n\t\"github.com/GoAdminGroup/go-admin/modules/langu"
  },
  {
    "path": "modules/utils/utils.go",
    "chars": 9691,
    "preview": "package utils\n\nimport (\n\t\"archive/zip\"\n\t\"bytes\"\n\t\"encoding/gob\"\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"html/template\"\n\t\"io\"\n\t\"math\"\n\t"
  },
  {
    "path": "modules/utils/utils_test.go",
    "chars": 1596,
    "preview": "package utils\n\nimport (\n\t\"html/template\"\n\t\"testing\"\n\n\t\"github.com/stretchr/testify/assert\"\n)\n\nfunc TestCompressedContent"
  },
  {
    "path": "plugins/admin/admin.go",
    "chars": 5005,
    "preview": "package admin\n\nimport (\n\t\"github.com/GoAdminGroup/go-admin/context\"\n\t\"github.com/GoAdminGroup/go-admin/modules/config\"\n\t"
  },
  {
    "path": "plugins/admin/controller/Update.go",
    "chars": 473,
    "preview": "package controller\n\nimport (\n\t\"github.com/GoAdminGroup/go-admin/context\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/admi"
  },
  {
    "path": "plugins/admin/controller/api_create.go",
    "chars": 1817,
    "preview": "package controller\n\nimport (\n\t\"github.com/GoAdminGroup/go-admin/context\"\n\t\"github.com/GoAdminGroup/go-admin/modules/file"
  },
  {
    "path": "plugins/admin/controller/api_detail.go",
    "chars": 3344,
    "preview": "package controller\n\nimport (\n\t\"fmt\"\n\n\t\"github.com/GoAdminGroup/go-admin/context\"\n\t\"github.com/GoAdminGroup/go-admin/modu"
  },
  {
    "path": "plugins/admin/controller/api_list.go",
    "chars": 1148,
    "preview": "package controller\n\nimport (\n\t\"github.com/GoAdminGroup/go-admin/context\"\n\t\"github.com/GoAdminGroup/go-admin/plugins/admi"
  },
  {
    "path": "plugins/admin/controller/api_update.go",
    "chars": 2580,
    "preview": "package controller\n\nimport (\n\t\"net/url\"\n\n\t\"github.com/GoAdminGroup/go-admin/context\"\n\t\"github.com/GoAdminGroup/go-admin/"
  },
  {
    "path": "plugins/admin/controller/auth.go",
    "chars": 2981,
    "preview": "package controller\n\nimport (\n\t\"bytes\"\n\ttemplate2 \"html/template\"\n\t\"net/http\"\n\t\"net/url\"\n\n\t\"github.com/GoAdminGroup/go-ad"
  },
  {
    "path": "plugins/admin/controller/common.go",
    "chars": 13966,
    "preview": "package controller\n\nimport (\n\t\"bytes\"\n\ttemplate2 \"html/template\"\n\t\"net/http\"\n\t\"regexp\"\n\t\"strings\"\n\t\"sync\"\n\n\t\"github.com/"
  },
  {
    "path": "plugins/admin/controller/common_test.go",
    "chars": 356,
    "preview": "package controller\n\nimport (\n\t\"testing\"\n\n\t\"github.com/magiconair/properties/assert\"\n)\n\nfunc TestIsInfoUrl(t *testing.T) "
  },
  {
    "path": "plugins/admin/controller/delete.go",
    "chars": 846,
    "preview": "package controller\n\nimport (\n\t\"github.com/GoAdminGroup/go-admin/context\"\n\t\"github.com/GoAdminGroup/go-admin/modules/logg"
  },
  {
    "path": "plugins/admin/controller/detail.go",
    "chars": 4150,
    "preview": "package controller\n\nimport (\n\t\"fmt\"\n\n\t\"github.com/GoAdminGroup/go-admin/context\"\n\t\"github.com/GoAdminGroup/go-admin/modu"
  },
  {
    "path": "plugins/admin/controller/edit.go",
    "chars": 7465,
    "preview": "package controller\n\nimport (\n\t\"fmt\"\n\ttemplate2 \"html/template\"\n\t\"net/http\"\n\t\"net/url\"\n\n\t\"github.com/GoAdminGroup/go-admi"
  },
  {
    "path": "plugins/admin/controller/handler.go",
    "chars": 3764,
    "preview": "package controller\n\nimport (\n\ttemplate2 \"html/template\"\n\t\"regexp\"\n\n\t\"github.com/GoAdminGroup/go-admin/context\"\n\t\"github."
  },
  {
    "path": "plugins/admin/controller/install.go",
    "chars": 1555,
    "preview": "package controller\n\nimport (\n\t\"bytes\"\n\t\"database/sql\"\n\t\"net/http\"\n\n\t\"github.com/GoAdminGroup/go-admin/context\"\n\t\"github."
  },
  {
    "path": "plugins/admin/controller/menu.go",
    "chars": 9512,
    "preview": "package controller\n\nimport (\n\t\"encoding/json\"\n\ttemplate2 \"html/template\"\n\t\"net/url\"\n\n\t\"github.com/GoAdminGroup/go-admin/"
  },
  {
    "path": "plugins/admin/controller/new.go",
    "chars": 5254,
    "preview": "package controller\n\nimport (\n\t\"fmt\"\n\ttemplate2 \"html/template\"\n\t\"net/http\"\n\n\t\"github.com/GoAdminGroup/go-admin/template\""
  },
  {
    "path": "plugins/admin/controller/operation.go",
    "chars": 1144,
    "preview": "package controller\n\nimport (\n\t\"encoding/json\"\n\n\t\"github.com/GoAdminGroup/go-admin/context\"\n\t\"github.com/GoAdminGroup/go-"
  },
  {
    "path": "plugins/admin/controller/plugins.go",
    "chars": 16361,
    "preview": "package controller\n\nimport (\n\t\"bytes\"\n\t\"fmt\"\n\t\"html/template\"\n\t\"net/http\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"strings\"\n\t\"time\"\n\n\t\"g"
  },
  {
    "path": "plugins/admin/controller/plugins_tmpl.go",
    "chars": 10245,
    "preview": "package controller\n\nimport (\n\t\"bytes\"\n\t\"html/template\"\n\n\t\"github.com/GoAdminGroup/go-admin/modules/remote_server\"\n\n\t\"git"
  },
  {
    "path": "plugins/admin/controller/show.go",
    "chars": 16272,
    "preview": "package controller\n\nimport (\n\t\"bytes\"\n\t\"crypto/md5\"\n\t\"fmt\"\n\ttemplate2 \"html/template\"\n\t\"mime\"\n\t\"net/http\"\n\t\"path\"\n\t\"strc"
  },
  {
    "path": "plugins/admin/controller/system.go",
    "chars": 6764,
    "preview": "package controller\n\nimport (\n\t\"fmt\"\n\t\"html/template\"\n\t\"os\"\n\t\"runtime\"\n\n\t\"github.com/GoAdminGroup/go-admin/context\"\n\t\"git"
  },
  {
    "path": "plugins/admin/data/mysql/admin.sql",
    "chars": 11662,
    "preview": "# ************************************************************\n# Sequel Pro SQL dump\n# Version 4468\n#\n# http://www.seque"
  },
  {
    "path": "plugins/admin/models/base.go",
    "chars": 364,
    "preview": "package models\n\nimport (\n\t\"database/sql\"\n\n\t\"github.com/GoAdminGroup/go-admin/modules/db\"\n)\n\n// Base is base model struct"
  },
  {
    "path": "plugins/admin/models/menu.go",
    "chars": 4806,
    "preview": "package models\n\nimport (\n\t\"encoding/json\"\n\t\"strconv\"\n\t\"time\"\n\n\t\"github.com/GoAdminGroup/go-admin/modules/db\"\n\t\"github.co"
  },
  {
    "path": "plugins/admin/models/operation_log.go",
    "chars": 1663,
    "preview": "package models\n\nimport (\n\t\"github.com/GoAdminGroup/go-admin/modules/db\"\n\t\"github.com/GoAdminGroup/go-admin/modules/db/di"
  },
  {
    "path": "plugins/admin/models/permission.go",
    "chars": 2467,
    "preview": "package models\n\nimport (\n\t\"strconv\"\n\t\"strings\"\n\n\t\"github.com/GoAdminGroup/go-admin/modules/db\"\n)\n\n// PermissionModel is "
  },
  {
    "path": "plugins/admin/models/role.go",
    "chars": 3052,
    "preview": "package models\n\nimport (\n\t\"database/sql\"\n\t\"strconv\"\n\t\"time\"\n\n\t\"github.com/GoAdminGroup/go-admin/modules/db\"\n\t\"github.com"
  },
  {
    "path": "plugins/admin/models/site.go",
    "chars": 2817,
    "preview": "package models\n\nimport (\n\t\"database/sql\"\n\n\t\"github.com/GoAdminGroup/go-admin/modules/utils\"\n\n\t\"github.com/GoAdminGroup/g"
  },
  {
    "path": "plugins/admin/models/user.go",
    "chars": 12503,
    "preview": "package models\n\nimport (\n\t\"database/sql\"\n\t\"net/url\"\n\t\"regexp\"\n\t\"strconv\"\n\t\"strings\"\n\t\"time\"\n\n\t\"github.com/GoAdminGroup/g"
  },
  {
    "path": "plugins/admin/modules/captcha/captcha.go",
    "chars": 325,
    "preview": "package captcha\n\ntype Captcha interface {\n\tValidate(token string) bool\n}\n\nvar List = make(map[string]Captcha)\n\nfunc Add("
  },
  {
    "path": "plugins/admin/modules/constant/constant.go",
    "chars": 495,
    "preview": "package constant\n\nimport (\n\t\"github.com/GoAdminGroup/go-admin/modules/constant\"\n)\n\nconst (\n\t// PjaxHeader is default pja"
  },
  {
    "path": "plugins/admin/modules/form/form.go",
    "chars": 2809,
    "preview": "package form\n\nimport (\n\t\"errors\"\n)\n\nconst (\n\tPostTypeKey           = \"__go_admin_post_type\"\n\tPostResultKey         = \"__"
  },
  {
    "path": "plugins/admin/modules/guard/delete.go",
    "chars": 815,
    "preview": "package guard\n\nimport (\n\t\"github.com/GoAdminGroup/go-admin/context\"\n\t\"github.com/GoAdminGroup/go-admin/modules/errors\"\n\t"
  },
  {
    "path": "plugins/admin/modules/guard/edit.go",
    "chars": 4396,
    "preview": "package guard\n\nimport (\n\ttmpl \"html/template\"\n\t\"mime/multipart\"\n\t\"regexp\"\n\t\"strings\"\n\n\t\"github.com/GoAdminGroup/go-admin"
  },
  {
    "path": "plugins/admin/modules/guard/export.go",
    "chars": 893,
    "preview": "package guard\n\nimport (\n\t\"strings\"\n\n\t\"github.com/GoAdminGroup/go-admin/context\"\n\t\"github.com/GoAdminGroup/go-admin/modul"
  },
  {
    "path": "plugins/admin/modules/guard/guard.go",
    "chars": 1857,
    "preview": "package guard\n\nimport (\n\t\"github.com/GoAdminGroup/go-admin/context\"\n\t\"github.com/GoAdminGroup/go-admin/modules/db\"\n\t\"git"
  },
  {
    "path": "plugins/admin/modules/guard/menu_delete.go",
    "chars": 614,
    "preview": "package guard\n\nimport (\n\t\"github.com/GoAdminGroup/go-admin/context\"\n\t\"github.com/GoAdminGroup/go-admin/modules/errors\"\n)"
  },
  {
    "path": "plugins/admin/modules/guard/menu_edit.go",
    "chars": 1742,
    "preview": "package guard\n\nimport (\n\t\"html/template\"\n\t\"strconv\"\n\n\t\"github.com/GoAdminGroup/go-admin/context\"\n\t\"github.com/GoAdminGro"
  },
  {
    "path": "plugins/admin/modules/guard/menu_new.go",
    "chars": 1460,
    "preview": "package guard\n\nimport (\n\t\"html/template\"\n\t\"strconv\"\n\n\t\"github.com/GoAdminGroup/go-admin/context\"\n\t\"github.com/GoAdminGro"
  },
  {
    "path": "plugins/admin/modules/guard/new.go",
    "chars": 3213,
    "preview": "package guard\n\nimport (\n\t\"html/template\"\n\t\"mime/multipart\"\n\t\"strings\"\n\n\t\"github.com/GoAdminGroup/go-admin/context\"\n\t\"git"
  },
  {
    "path": "plugins/admin/modules/guard/server_login.go",
    "chars": 734,
    "preview": "package guard\n\nimport (\n\t\"encoding/json\"\n\t\"io/ioutil\"\n\n\t\"github.com/GoAdminGroup/go-admin/context\"\n\t\"github.com/GoAdminG"
  },
  {
    "path": "plugins/admin/modules/guard/update.go",
    "chars": 940,
    "preview": "package guard\n\nimport (\n\t\"net/http\"\n\n\t\"github.com/GoAdminGroup/go-admin/context\"\n\t\"github.com/GoAdminGroup/go-admin/plug"
  },
  {
    "path": "plugins/admin/modules/helper.go",
    "chars": 1283,
    "preview": "package modules\n\nimport (\n\t\"html/template\"\n\t\"strconv\"\n\n\t\"github.com/google/uuid\"\n)\n\nfunc InArray(arr []string, str strin"
  },
  {
    "path": "plugins/admin/modules/helper_test.go",
    "chars": 312,
    "preview": "package modules\n\nimport (\n\t\"regexp\"\n\t\"testing\"\n\n\t\"github.com/magiconair/properties/assert\"\n)\n\nfunc TestInArray(t *testin"
  },
  {
    "path": "plugins/admin/modules/paginator/paginator.go",
    "chars": 4413,
    "preview": "package paginator\n\nimport (\n\t\"fmt\"\n\t\"html/template\"\n\t\"math\"\n\t\"strconv\"\n\n\t\"github.com/GoAdminGroup/go-admin/context\"\n\t\"gi"
  },
  {
    "path": "plugins/admin/modules/paginator/paginator_test.go",
    "chars": 453,
    "preview": "package paginator\n\nimport (\n\t\"testing\"\n\n\t\"github.com/GoAdminGroup/go-admin/modules/config\"\n\t\"github.com/GoAdminGroup/go-"
  },
  {
    "path": "plugins/admin/modules/parameter/parameter.go",
    "chars": 12289,
    "preview": "package parameter\n\nimport (\n\t\"net/url\"\n\t\"strconv\"\n\t\"strings\"\n\n\t\"github.com/GoAdminGroup/go-admin/plugins/admin/modules\"\n"
  },
  {
    "path": "plugins/admin/modules/parameter/parameter_test.go",
    "chars": 321,
    "preview": "package parameter\n\nimport (\n\t\"fmt\"\n\t\"testing\"\n)\n\nfunc TestGetParamFromUrl(t *testing.T) {\n\tfmt.Println(GetParamFromURL(\""
  },
  {
    "path": "plugins/admin/modules/response/response.go",
    "chars": 2843,
    "preview": "package response\n\nimport (\n\t\"net/http\"\n\n\t\"github.com/GoAdminGroup/go-admin/context\"\n\t\"github.com/GoAdminGroup/go-admin/m"
  },
  {
    "path": "plugins/admin/modules/table/config.go",
    "chars": 2759,
    "preview": "package table\n\nimport (\n\t\"github.com/GoAdminGroup/go-admin/modules/db\"\n)\n\ntype Config struct {\n\tDriver         string\n\tD"
  },
  {
    "path": "plugins/admin/modules/table/default.go",
    "chars": 33553,
    "preview": "package table\n\nimport (\n\t\"encoding/json\"\n\t\"errors\"\n\t\"fmt\"\n\t\"html/template\"\n\t\"io/ioutil\"\n\t\"net/http\"\n\t\"strconv\"\n\t\"strings"
  },
  {
    "path": "plugins/admin/modules/table/default_test.go",
    "chars": 14,
    "preview": "package table\n"
  },
  {
    "path": "plugins/admin/modules/table/generators.go",
    "chars": 75629,
    "preview": "package table\n\nimport (\n\t\"database/sql\"\n\t\"errors\"\n\t\"fmt\"\n\ttmpl \"html/template\"\n\t\"net/url\"\n\t\"regexp\"\n\t\"strconv\"\n\t\"strings"
  },
  {
    "path": "plugins/admin/modules/table/table.go",
    "chars": 5264,
    "preview": "package table\n\nimport (\n\t\"html/template\"\n\t\"sync\"\n\t\"sync/atomic\"\n\n\t\"github.com/GoAdminGroup/go-admin/context\"\n\t\"github.co"
  },
  {
    "path": "plugins/admin/modules/table/tmpl/choose_table_ajax.tmpl",
    "chars": 3087,
    "preview": "{{define \"choose_table_ajax\"}}\n        NProgress.start();\n        let info_table = $(\"tbody.fields-table\");\n        info"
  },
  {
    "path": "plugins/admin/modules/table/tmpl/generator.tmpl",
    "chars": 17346,
    "preview": "{{define \"generator\"}}\n    <script>\n        $(function () {\n            let pack = localStorage.getItem(\"{{index . \"pref"
  },
  {
    "path": "plugins/admin/modules/table/tmpl.go",
    "chars": 20520,
    "preview": "package table\n\nvar tmpls = map[string]string{\"choose_table_ajax\": `{{define \"choose_table_ajax\"}}\n        NProgress.star"
  },
  {
    "path": "plugins/admin/modules/tools/generator.go",
    "chars": 15431,
    "preview": "package tools\n\nimport (\n\t\"bytes\"\n\t\"fmt\"\n\t\"go/format\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"regexp\"\n\t\"strings\"\n\t\"text/template\"\n\n\t\"git"
  },
  {
    "path": "plugins/admin/modules/tools/template.go",
    "chars": 3610,
    "preview": "package tools\n\nconst tableModelTmpl = `{{define \"table_model\"}}\npackage {{.Package}}\n\nimport (\n\t{{.ExtraImport}}\n\t\"githu"
  }
]

// ... and 168 more files (download for full content)

About this extraction

This page contains the full source code of the GoAdminGroup/go-admin GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 368 files (2.9 MB), approximately 778.1k tokens, and a symbol index with 4600 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!