基于gin+vue搭建的后台管理系统框架,集成jwt鉴权,权限管理,动态路由,分页封装,多点登录拦截,资源权限,上传下载,代码生成器,表单生成器,通用工作流等基础功能,五分钟一套CURD前后端代码,目前已支持VUE3,欢迎issue和pr~

English | 简体中文

gitee地址:https://gitee.com/pixelmax/gin-vue-admin

github地址:https://github.com/flipped-aurora/gin-vue-admin

vue3版本分支地址:https://github.com/flipped-aurora/gin-vue-admin/tree/vue3Develop

审批流分支:https://github.com/flipped-aurora/gin-vue-admin/tree/gva_workflow

项目文档

在线文档 : https://www.gin-vue-admin.com/

从环境到部署教学视频

开发教学 (贡献者: LLemonGreen And Fann)

1. 基本介绍

1.1 项目介绍

在线预览

测试用户名:admin

测试密码:123456

Gin-vue-admin是一个基于vue和gin开发的全栈前后端分离的后台管理系统,集成jwt鉴权,动态路由,动态菜单,casbin鉴权,表单生成器,代码生成器等功能,提供多种示例文件,让您把更多时间专注在业务开发上。

1.2 贡献指南

Hi! 首先感谢你使用 gin-vue-admin。

Gin-vue-admin 是一套为后台管理平台准备的一整套前后端分离架构式的开源框架,旨在快速搭建后台管理系统。

Gin-vue-admin 的成长离不开大家的支持,如果你愿意为 gin-vue-admin 贡献代码或提供建议,请阅读以下内容。

1.2.1 Issue 规范

  • issue 仅用于提交 Bug 或 Feature 以及设计相关的内容,其它内容可能会被直接关闭。如果你在使用时产生了疑问,请到 Slack 或 Gitter 里咨询。

  • 在提交 issue 之前,请搜索相关内容是否已被提出。

1.2.2 Pull Request 规范

  • 请先 fork 一份到自己的项目下,不要直接在仓库下建分支。

  • commit 信息要以[文件名]: 描述信息 的形式填写,例如 README.md: fix xxx bug

  • 确保 PR 是提交到 develop 分支,而不是 master 分支。

  • 如果是修复 bug,请在 PR 中给出描述信息。

  • 合并代码需要两名维护人员参与:一人进行 review 后 approve,另一人再次 review,通过后即可合并。

1.3 版本列表

2. 使用说明

- node版本 > v8.6.0
- golang版本 >= v1.14
- IDE推荐:Goland
- 初始化项目: 不同版本数据库初始化不通 参见https://www.gin-vue-admin.com/docs/server#1-%E5%88%9D%E5%A7%8B%E5%8C%96server%E9%A1%B9%E7%9B%AE
- 替换掉项目中的七牛云公钥,私钥,仓名和默认url地址,以免发生测试文件数据错乱

使用docker-compose体验本项目

  • 安装 docker-compose 官方文档

  • 使用git克隆本项目

    •   git clone https://github.com/flipped-aurora/gin-vue-admin.git
      
  • 使用docker-compose up一键启动启动项目

    • # 使用docker-compose启动四个容器
      docker-compose up
      # 如果您修改了某些配置选项,可以使用此命令重新打包镜像
      docker-compose up --build
      # 使用docker-compose 后台启动
      docker-compose up -d
    • web项目预览 http://127.0.0.1:8000

    • swagger文档 http://127.0.0.1:8888/swagger/index.html

  • 如果server的177.7.0.12这个容器内部ip被占用了,需要修改地方为

  • docker-compose使用自定义的一个docker网络

    •   networks:
          network:
            ipam:
              driver: default
              config:
                - subnet: '177.7.0.0/16' 
    • 子网地址, 默认网关是177.7.0.1(docker-compose V2需要写,V3则不需要),具体信息看官方文档

    • 默认的network名为gin-vue-admin_network,默认是bridge模式

    • 如果修改了子网,对应的每个service的ipv4_address都需要修改,还有.docker-compose/nginx/conf.d/my.conf的第20行的server的ip也需要修改

使用docker-compose进行部署本项目需注意的问题

  • mysql数据库请使用装在服务器磁盘的本地数据库.
    • 避免使用docker容器内的mysql,可能会出现写入的问题, io比宿主机低 docker的持久化机制问题
  • init.sql是给docker-compose进行体验本项目的, 禁止init.sql使用进行项目数据的初始化, 数据库初始化请使用此方法
    • 使用init.sql进行初始化出现的所有问题,请自行承担,与本项目无关
  • 使用本项目的docker-compose进行部署时,请修改docker-compose.yaml对应的nginx配置,mysql配置,networks配置,redis配置,按需自行更改.

2.1 web端

# clone the project
git clone https://github.com/piexlmax/gin-vue-admin.git

# enter the project directory
cd web

# install dependency
npm install

# develop
npm run serve

2.2 server端

使用 goland等编辑工具,打开server目录,不可以打开 gin-vue-admin跟目录

# 使用 go.mod

# 安装go依赖包
go list (go mod tidy)

# 编译
go build

Zap日志库使用指南&&配置指南

Zap日志库的配置选择在config.yaml下的zap

# zap logger configuration
zap:
  level: 'debug'
  format: 'console'
  prefix: '[GIN-VUE-ADMIN]'
  director: 'log'
  link_name: 'latest_log'
  show_line: true
  encode_level: 'LowercaseColorLevelEncoder'
  stacktrace_key: 'stacktrace'
  log_in_console: true
配置名 配置的类型 说明
level string level的模式的详细说明,请看zap官方文档
info: info模式,无错误的堆栈信息,只输出信息
debug:debug模式,有错误的堆栈详细信息
warn:warn模式
error: error模式,有错误的堆栈详细信息
dpanic: dpanic模式
panic: panic模式
fatal: fatal模式
format string console: 控制台形式输出日志
json: json格式输出日志
prefix string 日志的前缀
director string 存放日志的文件夹,修改即可,不需要手动创建
link_name string 在server目录下会生成一个link_name的软连接文件,链接的是director配置项的最新日志文件
show_line bool 显示行号, 默认为true,不建议修改
encode_level string LowercaseLevelEncoder:小写
LowercaseColorLevelEncoder:小写带颜色
CapitalLevelEncoder: 大写
CapitalColorLevelEncoder: 大写带颜色
stacktrace_key string 堆栈的名称,即在json格式输出日志时的josn的key
log_in_console bool 是否输出到控制台,默认为true
  • 开发环境 || 调试环境配置建议
    • level:debug
    • format:console
    • encode_level:LowercaseColorLevelEncoder或者encode_leve:CapitalColorLevelEncoder
  • 部署环境配置建议
    • level:error
    • format:json
    • encode_level: LowercaseLevelEncoder 或者 encode_level:CapitalLevelEncoder
    • log_in_console: false
  • 建议只是建议,按照自己的需求进行即可,给出建议仅供参考

2.3 swagger自动化API文档

2.3.1 安装 swagger

(1)可以翻墙
go get -u github.com/swaggo/swag/cmd/swag
(2)无法翻墙

由于国内没法安装 go.org/x 包下面的东西,推荐使用 goproxy.io

如果您使用的 Go 版本是 1.13 及以上(推荐)
# 启用 Go Modules 功能
go env -w GO111MODULE=on 
# 配置 GOPROXY 环境变量
go env -w GOPROXY=https://goproxy.io,direct

# 使用如下命令下载swag
go get -u github.com/swaggo/swag/cmd/swag

2.3.2 生成API文档

cd server
swag init

执行上面的命令后,server目录下会出现docs文件夹,登录http://localhost:8888/swagger/index.html,即可查看swagger文档

3. 技术选型

  • 前端:用基于vueElement-UI构建基础页面。
  • 后端:用Gin快速搭建基础restful风格API,Gin是一个go语言编写的Web框架。
  • 数据库:采用MySql(5.6.44)版本,使用gorm实现对数据库的基本操作,已添加对sqlite数据库的支持。
  • 缓存:使用Redis实现记录当前活跃用户的jwt令牌并实现多点登录限制。
  • API文档:使用Swagger构建自动化文档。
  • 配置文件:使用fsnotifyviper实现yaml格式的配置文件。
  • 日志:使用go-logging实现日志记录。

4. 项目架构

4.1 系统架构图

系统架构图

4.2 前端详细设计图 (提供者:baobeisuper

前端详细设计图

4.3 目录结构

    ├─server  	     (后端文件夹)
    │  ├─api            (API)
    │  ├─config         (配置包)
    │  ├─core  	        (內核)
    │  ├─docs  	        (swagger文档目录)
    │  ├─global         (全局对象)
    │  ├─initialiaze    (初始化)
    │  ├─middleware     (中间件)
    │  ├─model          (结构体层)
    │  ├─resource       (资源)
    │  ├─router         (路由)
    │  ├─service         (服务)
    │  └─utils	        (公共功能)
    └─web            (前端文件)
        ├─public        (发布模板)
        └─src           (源码包)
            ├─api       (向后台发送ajax的封装层)
            ├─assets	(静态文件)
            ├─components(组件)
            ├─router	(前端路由)
            ├─store     (vuex 状态管理仓)
            ├─style     (通用样式文件)
            ├─utils     (前端工具库)
            └─view      (前端页面)

5. 主要功能

  • 权限管理:基于jwtcasbin实现的权限管理
  • 文件上传下载:实现基于七牛云的文件上传操作(为了方便大家测试,我公开了自己的七牛测试号的各种重要token,恳请大家不要乱传东西)
  • 分页封装:前端使用mixins封装分页,分页方法调用mixins即可
  • 用户管理:系统管理员分配用户角色和角色权限。
  • 角色管理:创建权限控制的主要对象,可以给角色分配不同api权限和菜单权限。
  • 菜单管理:实现用户动态菜单配置,实现不同角色不同菜单。
  • api管理:不同用户可调用的api接口的权限不同。
  • 配置管理:配置文件可前台修改(测试环境不开放此功能)。
  • 富文本编辑器:MarkDown编辑器功能嵌入。
  • 条件搜索:增加条件搜索示例。
  • restful示例:可以参考用户管理模块中的示例API。
前端文件参考: src\view\superAdmin\api\api.vue 
后台文件参考: model\dnModel\api.go 
  • 多点登录限制:需要在config.yaml中把system中的useMultipoint修改为true(需要自行配置Redis和Config中的Redis参数,测试阶段,有bug请及时反馈)。
  • 分片长传:提供文件分片上传和大文件分片上传功能示例。
  • 表单生成器:表单生成器借助 @form-generator
  • 代码生成器:后台基础逻辑以及简单curd的代码生成器。

6. 计划任务

  • 导入,导出Excel
  • Echart图表支持
  • 单独前端使用模式以及数据模拟

7. 知识库

7.1 团队博客

https://www.yuque.com/flipped-aurora

内有前端框架教学视频。如果觉得项目对您有所帮助可以添加我的个人微信:shouzi_1994,欢迎您提出宝贵的需求。

7.2 教学视频

(1)环境搭建

Bilibili:https://www.bilibili.com/video/BV1Fg4y187Bw/ (v1.0版本视频,v2.0操作相同目录不同)

(2)模板使用

Bilibili:https://www.bilibili.com/video/BV16K4y1r7BD/ (v1.0版本视频,v2.0操作相同目录不同)

(3)2.0目录以及开发体验

Bilibili:https://www.bilibili.com/video/BV1aV411d7Gm#reply2831798461

(4)golang基础教学视频录制中...

https://space.bilibili.com/322210472/channel/detail?cid=108884

8. 联系方式

8.1 技术群

QQ交流群:622360840

QQ 群

微信交流群

微信

添加微信,备注"加入gin-vue-admin交流群"

关于我们

9. 捐赠

如果你觉得这个项目对你有帮助,你可以请作者喝饮料 🍹 点我

10. 商用注意事项

如果您将此项目用于商业用途,请遵守Apache2.0协议并保留作者技术支持声明。

Comments
  • [Bug]: 添加菜单失败

    [Bug]: 添加菜单失败

    gin-vue-admin 版本

    latest

    Node 版本

    docker-compose

    Golang 版本

    docker-compose

    是否依旧存在

    可以

    bug描述

    userscript.html?name=%E8%AE%A1%E6%97%B6%E5%99%A8%E6%8E%8C%E6%8E%A7%E8%80%85%7C%E8%A7%86%E9%A2%91%E5%B9%BF%E5%91%8A%E8%B7%B3%E8%BF%87%7C%E8%A7%86%E9%A2%91%E5%B9%BF%E5%91%8A%E5%8A%A0%E9%80%9F%E5%99%A8.user.js&id=e5832578-2605-470f-a8e1-c885ea602bb0:2872 [TimeHooker] loading outer window...
    userscript.html?name=%E8%AE%A1%E6%97%B6%E5%99%A8%E6%8E%8C%E6%8E%A7%E8%80%85%7C%E8%A7%86%E9%A2%91%E5%B9%BF%E5%91%8A%E8%B7%B3%E8%BF%87%7C%E8%A7%86%E9%A2%91%E5%B9%BF%E5%91%8A%E5%8A%A0%E9%80%9F%E5%99%A8.user.js&id=e5832578-2605-470f-a8e1-c885ea602bb0:2357 Time Hooker Works!
    gin-vue-admin-index.1646733026000.js:4 
           欢迎使用 Gin-Vue-Admin
           当前版本:V2.5.0
           加群方式:微信:shouzi_1994 QQ群:622360840
           GVA讨论社区:https://support.qq.com/products/371961
           默认自动化文档地址:http://127.0.0.1:8888/swagger/index.html
           默认前端文件运行地址:http://127.0.0.1:8080
           如果项目让您获得了收益,希望您能请团队喝杯可乐:https://www.gin-vue-admin.com/docs/coffee
        
    DevTools 无法加载来源映射:无法加载 chrome-extension://dobbfkjhgbkmmcooahlnllfopfmhcoln/scripts/contentscript.js.map 的内容:HTTP 错误:状态代码 404,net::ERR_UNKNOWN_URL_SCHEME
    gin-vue-admin-index.16467330260007.js:4 Proxy {0: 'SuperAdmin', 1: 'Menus', 2: 'Api', 3: 'System', 4: 'AutoCode', 5: 'FormGenerator'}
    content_script.js:240 Uncaught TypeError: Cannot read properties of undefined (reading 'eventType')
        at content_script.js:240:28
    (匿名) @ content_script.js:240
    postMessage(异步)
    script.onload @ content.js:25
    load(异步)
    (匿名) @ content.js:10
    inject @ content.js:6
    getJs @ content.js:37
    onGetTechnologies @ content.js:394
    init @ content.js:289
    await in init(异步)
    (匿名) @ content.js:408
    content_script.js:240 Uncaught TypeError: Cannot read properties of undefined (reading 'eventType')
        at content_script.js:240:28
    (匿名) @ content_script.js:240
    postMessage(异步)
    onMessage @ VM348 js.js:14
    postMessage(异步)
    script.onload @ content.js:25
    load(异步)
    (匿名) @ content.js:10
    inject @ content.js:6
    getJs @ content.js:37
    onGetTechnologies @ content.js:394
    init @ content.js:289
    await in init(异步)
    (匿名) @ content.js:408
    content_script.js:240 Uncaught TypeError: Cannot read properties of undefined (reading 'eventType')
        at content_script.js:240:28
    (匿名) @ content_script.js:240
    postMessage(异步)
    script.onload @ content.js:25
    load(异步)
    (匿名) @ content.js:10
    inject @ content.js:6
    getDom @ content.js:50
    onGetTechnologies @ content.js:395
    await in onGetTechnologies(异步)
    init @ content.js:289
    await in init(异步)
    (匿名) @ content.js:408
    content_script.js:240 Uncaught TypeError: Cannot read properties of undefined (reading 'eventType')
        at content_script.js:240:28
    (匿名) @ content_script.js:240
    postMessage(异步)
    onMessage @ dom.js:17
    postMessage(异步)
    script.onload @ content.js:25
    load(异步)
    (匿名) @ content.js:10
    inject @ content.js:6
    getDom @ content.js:50
    onGetTechnologies @ content.js:395
    await in onGetTechnologies(异步)
    init @ content.js:289
    await in init(异步)
    (匿名) @ content.js:408
    content_script.js:240 Uncaught TypeError: Cannot read properties of undefined (reading 'eventType')
        at content_script.js:240:28
    (匿名) @ content_script.js:240
    postMessage(异步)
    script.onload @ content.js:25
    load(异步)
    (匿名) @ content.js:10
    inject @ content.js:6
    getJs @ content.js:37
    init @ content.js:294
    await in init(异步)
    (匿名) @ content.js:408
    content_script.js:240 Uncaught TypeError: Cannot read properties of undefined (reading 'eventType')
        at content_script.js:240:28
    (匿名) @ content_script.js:240
    postMessage(异步)
    onMessage @ js.js:14
    postMessage(异步)
    script.onload @ content.js:25
    load(异步)
    (匿名) @ content.js:10
    inject @ content.js:6
    getJs @ content.js:37
    init @ content.js:294
    await in init(异步)
    (匿名) @ content.js:408
    gin-vue-admin-vendor.1646733026000.js:20 TypeError: Cannot use 'in' operator to search for 'displayName' in undefined
        at N6 (gin-vue-admin-vendor.1646733026000.js:20:13067)
        at gin-vue-admin-vendor.1646733026000.js:20:19395
    E @ gin-vue-admin-vendor.1646733026000.js:20
    (匿名) @ gin-vue-admin-vendor.1646733026000.js:20
    Promise.catch(异步)
    y @ gin-vue-admin-vendor.1646733026000.js:20
    m @ gin-vue-admin-vendor.1646733026000.js:20
    _ @ gin-vue-admin-index.16467330260008.js:4
    qt @ gin-vue-admin-vendor.1646733026000.js:1
    Wt @ gin-vue-admin-vendor.1646733026000.js:1
    vn @ gin-vue-admin-vendor.1646733026000.js:1
    g @ gin-vue-admin-vendor.1646733026000.js:15
    handleClick @ gin-vue-admin-vendor.1646733026000.js:15
    ma.onClick.t.<computed>.t.<computed> @ gin-vue-admin-vendor.1646733026000.js:15
    qt @ gin-vue-admin-vendor.1646733026000.js:1
    Wt @ gin-vue-admin-vendor.1646733026000.js:1
    n @ gin-vue-admin-vendor.1646733026000.js:1
    gin-vue-admin-vendor.1646733026000.js:20 Uncaught (in promise) TypeError: Cannot use 'in' operator to search for 'displayName' in undefined
        at N6 (gin-vue-admin-vendor.1646733026000.js:20:13067)
        at gin-vue-admin-vendor.1646733026000.js:20:19395
    N6 @ gin-vue-admin-vendor.1646733026000.js:20
    (匿名) @ gin-vue-admin-vendor.1646733026000.js:20
    Promise.then(异步)
    y @ gin-vue-admin-vendor.1646733026000.js:20
    m @ gin-vue-admin-vendor.1646733026000.js:20
    _ @ gin-vue-admin-index.16467330260008.js:4
    qt @ gin-vue-admin-vendor.1646733026000.js:1
    Wt @ gin-vue-admin-vendor.1646733026000.js:1
    vn @ gin-vue-admin-vendor.1646733026000.js:1
    g @ gin-vue-admin-vendor.1646733026000.js:15
    handleClick @ gin-vue-admin-vendor.1646733026000.js:15
    ma.onClick.t.<computed>.t.<computed> @ gin-vue-admin-vendor.1646733026000.js:15
    qt @ gin-vue-admin-vendor.1646733026000.js:1
    Wt @ gin-vue-admin-vendor.1646733026000.js:1
    n @ gin-vue-admin-vendor.1646733026000.js:1
    

    修改建议

    No response

  • 项目需求征集

    项目需求征集

    为了项目的不断完善,特此在issue区域开放项目需求征集,大家可以提出合理的通用性高的需求,描述详细,建议合理更容易采纳加入gva的开发计划中。

    示例: 需求:工作流相关功能 描述:提供工作流绘制工具(类似java的active),绘制包含开始节点,批改节点,事件节点,网关,结束节点等功能组件,进行拖拽布局绘制。生成工作流相关图以及节点数据。

    将实际项目挂载后可以调用工作流提供的创建,提交,回退,驳回等方法实现个人业务挂载工作流功能。

    提供示例:https://github.com/flipped-aurora/gin-vue-admin/tree/gva_workflow (此为我们gva的workflow分支,目前已完成绘制工具和节点流程存储工作,正在提供创建、提交、回退、驳回、等挂载方法)

    此功能较为通用,期望采纳

  • [Bug]: 未知条件下发生upstream timed out

    [Bug]: 未知条件下发生upstream timed out

    gin-vue-admin 版本

    2.5.0

    Node 版本

    非开发环境,用nginx

    Golang 版本

    go 1.17.8

    是否依旧存在

    未测试

    bug描述

    场景:nginx部署前端,后端直接启动包文件的方式运行,运行一段时间后(这个时间不确定,有时会突然出现,不好复现),前端刷新进入不了,查看nginx日志,发现是( upstream timed out (110: Connection timed out) while reading response header from upstream, client:xx.xx, server: xx.xx.xx.xx, request: "POST /api/menu/getMenu HTTP/1.1", upstream: "http://1xx.xx.xx.xx:8888/menu/getMenu", host: "xx.xx.xx.xx:18080", referrer: "http://xx.xx.xx.xx:18080/") 但是将nginx超时时间设长仍然无效,后通过postman调用后端接口PrivateGroup中的那些接口后端日志不刷新,但调用健康检查和其他无效的接口后有日志打印。 不太清楚是否是PrivateGroup这个组里面的接口的问题,当时未去尝试调用login这些

    修改建议

    No response

  • 为什么有个 model 写在了source里……

    为什么有个 model 写在了source里……

    功能描述以及必要性描述

    https://github.com/flipped-aurora/gin-vue-admin/blob/6c0b2ac018cafeda692e411a82c4b46afbb36297/server/source/system/authorities_menus.go#L84

    这是个正儿八经的连接表又不是只临时用一下的

    建议和方案

    No response

  • sqlite3 数据库适配和初始数据导入

    sqlite3 数据库适配和初始数据导入

    1. 您使用的是哪个版本的Go和系统类型/架构 ?

    go version go1.16.2

    2. 您使用的是哪个版本的 Nodejsnpmcnpm ?

    v10.16.0

    3. 您使用的是哪个版本的 gin-vue-admin ?

    2.4.0

    4. 可以在master版本中复现此问题吗 ?

    可以

    5. 您做了什么 ?

    新版本无法适配sqlite3 原因: 默认依赖版本为casbin3.0.2,在github.com/casbin/gorm-adapter/v3/adapter.go中,官方注释了判断数据库类型为sqlite3的代码.

    以下为3.0.2版本代码,注意下面注释了sqlite3判断 func openDBConnection(driverName, dataSourceName string) (*gorm.DB, error) { var err error var db *gorm.DB if driverName == "postgres" { db, err = gorm.Open(postgres.Open(dataSourceName+" dbname=postgres"), &gorm.Config{}) } else if driverName == "mysql" { db, err = gorm.Open(mysql.Open(dataSourceName), &gorm.Config{}) //} else if driverName == "sqlite3" { // db, err = gorm.Open(sqlite.Open(dataSourceName), &gorm.Config{}) } else if driverName == "sqlserver" { db, err = gorm.Open(sqlserver.Open(dataSourceName), &gorm.Config{}) } else { return nil, errors.New("database dialect is not supported") } if err != nil { return nil, err } return db, err }

    解决办法: 修改config.yaml中system->db-type为sqlite3 升级casbin到最新版. 升级后,在source/authority_menu.go中加入数据库类型sqlite3判断,sql语句中开头修改为CREATE VIEW authority_menu AS xxxx,用来创建sqlite3视图. 修改source/casbin.go中所有PType: "p"为Ptype: "p" 然后即可使用initialize/gorm.go中initDB方法用来初始化所需数据

  • 根据代码注释和issue记录配置https并未生效

    根据代码注释和issue记录配置https并未生效

    1. 您使用的是哪个版本的Go和系统类型/架构 ?

    go version go1.15.2 darwin/amd64

    2. 您使用的是哪个版本的 Nodejsnpmcnpm ?

    nodejs v12.18.3 npm 6.14.6

    3. 您使用的是哪个版本的 gin-vue-admin ?

    master

    4. 可以在master版本中复现此问题吗 ?

    可以

    5. 您做了什么 ?

    取消了router.go中的Router.Use(middleware.LoadTls())注释,项目目录下添加了证书文件 key.pem, cert.pem

    6. 您期望看到什么 ?

    1. 能够正常访问https接口;
    2. swagger能够正常访问。

    7. 您看到了什么 ?

    1. 无法正常访问https接口;
    2. swagger 跳转到https地址但无法连接

    检查代码未发现任何调用对 ListenAndServeTls方法的调用,无法理解如何实现的tls监听。

    8. 错误堆栈或者SQL打印

  • [Bug]: 赋予少量权限无法登录后台

    [Bug]: 赋予少量权限无法登录后台

    gin-vue-admin 版本

    V2.5.1 beta

    Node 版本

    16.14.2 (包含 npm 8.5.0)

    Golang 版本

    16.14.2 (包含 npm 8.5.0)

    是否依旧存在

    可以

    bug描述

    权限 角色 设置如上最小权限,无法登录后台。 提示权限不足,还需要添加哪些授权

    修改建议

    设置如上最小权限,无法登录后台。 提示权限不足,还需要添加哪些授权

  • [Bug]: 2.4.5Beta npm run serve报错

    [Bug]: 2.4.5Beta npm run serve报错

    gin-vue-admin 版本

    2.4.5Beta

    Node 版本

    v14.16.0

    Golang 版本

    go 1.16

    是否依旧存在

    不可以

    bug描述

    [email protected] serve /root/gin-vue/web node openDocument.js && vite --host --mode development

    linux

    vite v2.5.3 dev server running at:

    Local: http://localhost:8080/ Network: http://192.196.166.180:8080/ Network: http://10.121.216.255:8080/

    ready in 488ms.

    events.js:377 throw er; // Unhandled 'error' event ^

    Error: spawn xdg-open ENOENT at Process.ChildProcess._handle.onexit (internal/child_process.js:269:19) at onErrorNT (internal/child_process.js:467:16) at processTicksAndRejections (internal/process/task_queues.js:82:21) Emitted 'error' event on ChildProcess instance at: at Process.ChildProcess._handle.onexit (internal/child_process.js:275:12) at onErrorNT (internal/child_process.js:467:16) at processTicksAndRejections (internal/process/task_queues.js:82:21) { errno: -2, code: 'ENOENT', syscall: 'spawn xdg-open', path: 'xdg-open', spawnargs: [ 'http://localhost:8080/' ] } npm ERR! code ELIFECYCLE npm ERR! errno 1 npm ERR! [email protected] serve: node openDocument.js && vite --host --mode development npm ERR! Exit status 1 npm ERR! npm ERR! Failed at the [email protected] serve script. npm ERR! This is probably not a problem with npm. There is likely additional logging output above.

    npm ERR! A complete log of this run can be found in: npm ERR! /root/.npm/_logs/2021-09-16T07_14_10_928Z-debug.log

    root@go-env-pod:~/gin-vue/web# cat /root/.npm/_logs/2021-09-16T07_14_10_928Z-debug.log 0 info it worked if it ends with ok 1 verbose cli [ 1 verbose cli '/root/node-v14.17.6-linux-x64/bin/node', 1 verbose cli '/root/node-v14.17.6-linux-x64/bin/npm', 1 verbose cli 'run', 1 verbose cli 'serve' 1 verbose cli ] 2 info using [email protected] 3 info using [email protected] 4 verbose run-script [ 'preserve', 'serve', 'postserve' ] 5 info lifecycle [email protected]~preserve: [email protected] 6 info lifecycle [email protected]~serve: [email protected] 7 verbose lifecycle [email protected]~serve: unsafe-perm in lifecycle true 8 verbose lifecycle [email protected]~serve: PATH: /root/node-v14.17.6-linux-x64/lib/node_modules/npm/node_modules/npm-lifecycle/node-gyp-bin:/root/gin-vue/web/node_modules/.bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/local/protoc/bin:/usr/local/go/bin:/root/golib/bin:/root/node-v14.17.6-linux-x64/bin 9 verbose lifecycle [email protected]~serve: CWD: /root/gin-vue/web 10 silly lifecycle [email protected]~serve: Args: [ '-c', 'node openDocument.js && vite --host --mode development' ] 11 silly lifecycle [email protected]~serve: Returned: code: 1 signal: null 12 info lifecycle [email protected]~serve: Failed to exec serve script 13 verbose stack Error: [email protected] serve: node openDocument.js && vite --host --mode development 13 verbose stack Exit status 1 13 verbose stack at EventEmitter. (/root/node-v14.17.6-linux-x64/lib/node_modules/npm/node_modules/npm-lifecycle/index.js:332:16) 13 verbose stack at EventEmitter.emit (events.js:400:28) 13 verbose stack at ChildProcess. (/root/node-v14.17.6-linux-x64/lib/node_modules/npm/node_modules/npm-lifecycle/lib/spawn.js:55:14) 13 verbose stack at ChildProcess.emit (events.js:400:28) 13 verbose stack at maybeClose (internal/child_process.js:1055:16) 13 verbose stack at Process.ChildProcess._handle.onexit (internal/child_process.js:288:5) 14 verbose pkgid [email protected] 15 verbose cwd /root/gin-vue/web 16 verbose Linux 5.3.0-45-generic 17 verbose argv "/root/node-v14.17.6-linux-x64/bin/node" "/root/node-v14.17.6-linux-x64/bin/npm" "run" "serve" 18 verbose node v14.17.6 19 verbose npm v6.14.15 20 error code ELIFECYCLE 21 error errno 1 22 error [email protected] serve: node openDocument.js && vite --host --mode development 22 error Exit status 1 23 error Failed at the [email protected] serve script. 23 error This is probably not a problem with npm. There is likely additional logging output above. 24 verbose exit [ 1, true ]

    修改建议

    No response

  • [feature]:实现admin数据库和业务数据库的分离

    [feature]:实现admin数据库和业务数据库的分离

    1. 您使用的是哪个版本的Go和系统类型/架构 ?

    go 1.13

    2. 您使用的是哪个版本的 Nodejsnpmcnpm ?

    3. 您使用的是哪个版本的 gin-vue-admin ?

    latest

    4. 可以在master版本中复现此问题吗 ?

    5. 您做了什么 ?

    6. 您期望看到什么 ?

    期望实现admin数据库与业务数据库的分离,避免耦合加快新系统的接入速度

    7. 您看到了什么 ?

    8. 错误堆栈或者SQL打印

  • [Bug]: 自动化填充数据后新增菜单和字典告知主键重复

    [Bug]: 自动化填充数据后新增菜单和字典告知主键重复

    gin-vue-admin 版本

    V2.5.1 beta

    Node 版本

    V2.5.1 beta

    Golang 版本

    1.7

    是否依旧存在

    可以

    bug描述

    postgresql 14 添加菜单错误

    `2022/03/27 09:29:32 D:/code/gin-vue-admin/server/service/system/sys_menu.go:114 record not found [1.651ms] [rows:0] SELECT * FROM "sys_base_menus" WHERE name = 'testtwo' AND "sys_base_menus"."deleted_at" IS NULL ORDER BY "sys_base_menus"."id" LIMIT 1

    2022/03/27 09:29:32 D:/code/gin-vue-admin/server/service/system/sys_menu.go:117 ERROR: duplicate key value violates unique constraint "sys_base_menus_pkey" (SQLSTATE 23505) [4.891ms] [rows:0] INSERT INTO "sys_base_menus" ("created_at","updated_at","deleted_at","menu_level","parent_i d","path","name","hidden","component","sort","keep_alive","default_menu","title","icon","close_tab") VALUES ('2022-03-27 09:29:32.186','2022-03-27 09:29:32.186',NULL,0,'0','testtwo','testtwo',false,'view/testStruct/testStruct.vue',0,false,false,'啊啊','aim',false) RETURNING "id" [github.com/flipped-aurora/gin-vue-admin/server]2022/03/27 - 09:29:32.190 error D:/code/gin-vue-admin/server/api/v 1/system/sys_menu.go:119 添加失败! {"error": "ERROR: duplicate key value violates unique constraint "sys_base_menus_pkey" (SQLSTATE 23505)"} [GIN] 2022/03/27 - 09:29:32 | 200 | 30.8095ms | 127.0.0.1 | POST "/menu/addBaseMenu"`

    修改建议

    No response

  • [Bug]: 在GetXXXXXInfoList里面使用`join`操作并且是指定的`select`的字段时,`select`没生效

    [Bug]: 在GetXXXXXInfoList里面使用`join`操作并且是指定的`select`的字段时,`select`没生效

    gin-vue-admin 版本

    master

    Node 版本

    v14.16.0

    Golang 版本

    go 1.17

    是否依旧存在

    可以

    bug描述

    在GetXXXXXInfoList里面使用join操作并且是指定的select的字段时,select没生效

    例如

        db = db.Select("`user`.*, `account`.balance").
            Joins("left join `account` on `account`.user_id = `user`.user_id")
    

    在现有的情况下,是直接是查询user表的信息,没加入account.balance这个字段。

    修改建议

    修复方法是将

        err = db.Count(&total).Error
    

    这一句,移到

        err = db.Limit(limit).Offset(offset).Scan(&users).Error
    

    的后面

        err = db.Limit(limit).Offset(offset).Scan(&users).Error
        if err!=nil {
    	return
        }
    
        err = db.Count(&total).Error
    
  • [Bug]: gin-vue-admin does not properly termine existing user sessions when the user was deleted or disabled

    [Bug]: gin-vue-admin does not properly termine existing user sessions when the user was deleted or disabled

    gin-vue-admin 版本

    2.4.5

    Node 版本

    v14.16.0

    Golang 版本

    go 1.16

    是否依旧存在

    可以

    bug描述

    First, a user login gin-vue-admin in one page. Then the admin deletes or disables the user in another page. But the user is still able to do any operations inside gin-vue-admin. Notice that refreshing the page does not force users to login again.

    We have report it on https://huntr.dev/bounties/49ee5f87-3e84-46ec-b8d3-8a57d4886db5/ 21days ago through [email protected] but do not receive feedback.

    修改建议

    invalid all the user session once the user is deleted.

  • [Feature]: 注册API时,自动导入数据库

    [Feature]: 注册API时,自动导入数据库

    功能描述以及必要性描述

    1,无需手动注册API,自动化程度更高,用户使用更方便,用户只需要管理授权即可 2,解耦开发环境和线上环境,关于API管理的数据库,无需进行数据库迁移(这个在迭代更新时,很麻烦)

    建议和方案

    1,服务初始化过程中,后端向gin router注册API时,自动适配到数据库记录(自动增删)

  • [Bug]: strict-whitelist 严格白名单模式下无法正常工作

    [Bug]: strict-whitelist 严格白名单模式下无法正常工作

    gin-vue-admin 版本

    main

    Node 版本

    v16.18.1

    Golang 版本

    go 1.19.3

    是否依旧存在

    可以

    bug描述

    1. config.yaml设置好cors的mode为strict-whitelist
    2. Router.Use(middleware.CorsByRules())这一行开启
    3. 所有的GET请求都无法正常工作,例如获取用户信息的/api/user/getUserInfo,会返回403

    修改建议

    原因是浏览器在处理GET请求的时候不会携带Origin头,导致后端拿不到这个头,修改方案或许可以设置为GET请求校验Referer?