Giter Club home page Giter Club logo

flipped-aurora / gin-vue-admin Goto Github PK

View Code? Open in Web Editor NEW
20.2K 286.0 6.0K 12.46 MB

🚀Vite+Vue3+Gin的开发基础平台,支持TS和JS混用。它集成了JWT鉴权、权限管理、动态路由、显隐可控组件、分页封装、多点登录拦截、资源权限、上传下载、代码生成器、表单生成器和可配置的导入导出等开发必备功能。

Home Page: http://demo.gin-vue-admin.com/

License: Apache License 2.0

Go 73.70% JavaScript 4.34% Vue 17.91% Smarty 3.25% Dockerfile 0.09% SCSS 0.53% Makefile 0.15% Shell 0.03%
gin-vue-admin gin vue golang vue-admin go-admin go admin gin-admin casbin

gin-vue-admin's Issues

我最迫切需求是,单表的 增删改查的从 service 里分离出来, 搞个单表万能查询接口,前端单表 也要搞个查询按钮

type {{Table}} struct {
{% for col in structArr %} {{col.key}} {{col.type}} json:"{{col.jsonTag}}"{% if col.sql %} sql:"{{col.sql}}"{% endif %} {% if !col.type %} // TODO: 类型判断错误,请自行选择类型 {% endif %}
{% endfor %}
}

const {{Table}}Table = "{{snake}}"

func Create{{Table}}(e *{{Table}}) *{{Table}} {
return DBCreate{{Table}}(DB({{Table}}Table), e)
}

func DBCreate{{Table}}(db *gorm.DB, e *{{Table}}) *{{Table}} {
err := db.Create(e).Error
if err != nil {
logger.Errorf("create {{table}} [%v] fails: %s", e, err.Error())
return nil
}
return e
}

func Update{{Table}}({{pk}} {{type}}, m map[string]interface{}) (*{{Table}}, int64, bool, error) {
return DBUpdate{{Table}}(DB({{Table}}Table), {{pk}}, m)
}

func DBUpdate{{Table}}(db gorm.DB, {{pk}} {{type}}, m map[string]interface{}) ({{Table}}, int64, bool, error) {
delete(m, "{{pk_snake}}")
delete(m, "ctime")
delete(m, "utime")

aff := db.Model(&{{Table}}{}).Where("{{pk_snake}} = ?", {{pk}}).UpdateColumns(m).RowsAffected
e := &{{Table}}{}
if err := db.Where("{{pk_snake}} = ?", {{pk}}).First(e).Error; err != nil {
	if err == gorm.ErrRecordNotFound {
		return nil, aff, false, nil
	} else {
		logger.Errorf("%v", err)
		return nil, aff, false, err
	}
}
return e, aff, true, nil

}

func Get{{Table}}({{pk}} {{type}}) *{{Table}} {
return DBGet{{Table}}(DB({{Table}}Table), {{pk}})
}

func DBGet{{Table}}(db *gorm.DB, {{pk}} {{type}}) *{{Table}} {
e := &{{Table}}{}
if err := db.Where("{{pk_snake}} = ?", {{pk}}).First(e).Error; err != nil {
logger.Errorf("get {{table}} [%d] fails: %s", {{pk}}, err.Error())
return nil
}
return e
}

func Get{{Table}}s(m map[string]interface{}) []*{{Table}} {
return DBGet{{Table}}s(DB({{Table}}Table), m)
}

func DBGet{{Table}}s(db gorm.DB, m map[string]interface{}) []{{Table}} {
result := []*{{Table}}{}
if err := db.Where(m).Find(&result).Error; err != nil {
logger.Errorf("get {{table}} with filter [%v] fails: %s", m, err.Error())
return nil
}
return result
}

func Get{{Table}}sBy{{Pk}}s({{pk}}s []{{type}}) []*{{Table}} {
return DBGet{{Table}}sBy{{Pk}}s(DB({{Table}}Table), {{pk}}s)
}

func DBGet{{Table}}sBy{{Pk}}s(db gorm.DB, {{pk}}s []{{type}}) []{{Table}} {
result := []*{{Table}}{}
if err := db.Where("{{pk_snake}} in (?)", {{pk}}s).Order("{{pk_snake}} asc").Find(&result).Error; err != nil {
logger.Errorf("get {{table}} with {{pk}}s %v fails: %s", {{pk}}s, err.Error())
return nil
}
return result
}

func Delete{{Table}}({{pk}} {{type}}) {
DBDelete{{Table}}(DB({{Table}}Table), {{pk}})
}

func DBDelete{{Table}}(db *gorm.DB, {{pk}} {{type}}){
if err := db.Where("{{pk_snake}} = ?", {{pk}}).Delete({{Table}}{}).Error; err != nil {
logger.Errorf("delete {{table}} [%d] fails: %s", {{pk}}, err.Error())

}

}

func Get{{Table}}sByOffset(offset int, m map[string]interface{}, rawq string, order int, ordcond string, limit int, getCount bool) ([]*{{Table}}, int) {
return DBGet{{Table}}sByOffset(DB({{Table}}Table), offset, m, rawq, order, ordcond, limit, getCount)
}

func DBGet{{Table}}sByOffset(db gorm.DB, offset int, m map[string]interface{}, rawq string, order int, ordcond string, limit int, getCount bool) ([]{{Table}}, int) {
totalCount := 0
result := make([]*{{Table}}, 0)
db = db.Model({{Table}}{})
if m != nil {
db = db.Where(m)
}
if len(rawq) > 0 {
db = db.Where(rawq)
}
if order > 0 {
db = db.Order("{{pk_snake}} asc")
} else if order < 0 {
db = db.Order("{{pk_snake}} desc")
} else if len(ordcond) > 0 {
db = db.Order(ordcond)
}
if getCount {
db.Count(&totalCount)
}
if limit > 0 {
db = db.Limit(limit)
}
if err := db.Offset(offset).Find(&result).Error; err != nil {
logger.Errorf("get {{table}} by offset fails: %s", err.Error)
return nil, 0
}
return result, totalCount
}

func Get{{Table}}sByTime(start time.Time, end time.Time, m map[string]interface{}, rawq string, limit int, getCount bool) ([]*{{Table}}, int) {
return DBGet{{Table}}sByTime(DB({{Table}}Table), start, end, m, rawq, limit, getCount)
}

func DBGet{{Table}}sByTime(db gorm.DB, start time.Time, end time.Time, m map[string]interface{}, rawq string, limit int, getCount bool) ([]{{Table}}, int) {
totalCount := 0
result := make([]*{{Table}}, 0)
db = db.Model({{Table}}{})
if m != nil {
db = db.Where(m)
}
if len(rawq) > 0 {
db = db.Where(rawq)
}
db = db.Where("ctime > ?", start)
if end.After(start) {
db = db.Where("ctime < ?", end)
}
if getCount {
db.Count(&totalCount)
}
if err := db.Order("ctime asc").Limit(limit).Find(&result).Error; err != nil {
logger.Errorf("get {{table}} by time fails: %s", err.Error())
return nil, 0
}
return result, totalCount
}

// Get{{Table}}sByFilter json 分页获取
// @param filter query string false "{"key":value}"
// @param pageSize query int false "PageSize"
// @param current query int false "Current"
// @success 200 {object} dao.{{Table}}
// @router /{{AppName}}/table/{{table}}sByFilter [get]
func Get{{Table}}sByFilter(c *gin.Context) {
current := c.MustGet("current").(int64)
pagesize := c.MustGet("pageSize").(int64)

jsonstring := c.MustGet("filter").(string)
filter := make(map[string]interface{})
err := json.Unmarshal([]byte(jsonstring), &filter)
if err != nil {
    c.JSON(http.StatusOK, &utils.Response{Code:e.INVALID_PARAMS,Msg:err.Error(),Data:nil})
    return
}
res, cnt := dao.Get{{Table}}sByOffset(
	int(uint(current-1))*int(pagesize),
	utils.MCamelToSnake(filter),
	"", 0, "", int(pagesize),true,
)
c.JSON(http.StatusOK, &utils.Response{Code: e.SUCCESS, Msg: "", Data: map[string]interface{}{
	"list": res,
	"count": cnt,
}})

}

角色权限管理

您好,当前子角色能够选择所有权限。我觉得它只显示和获取父角色权限范围内的权限比较合理,这样应该要增加不少代码量

富文本编辑器的选择

为什么不选择Tinymce而是选择vue-quill-editor,我试了,简单的加粗,斜体都不行。。。。。。

数据库发生这种错误

[2020-04-25 15:06:54] sql: Scan error on column index 7, name "data_authority_id": unsupported Scan, storing driver.Value type []uint8 into type *[]model.SysAuthority

为什么基本都是POST

您好,我粗略看了下api,发现method基本都是POST,请问是基于什么考量的呢,后续会考虑RESTful吗?

linux下docker快速部署方式

花了点时间,打包了一个docker镜像,方便在linux环境下快速部署

#启动容器
docker run -itd --net=host --name=go_container shareclz/go_node /bin/bash;

#进入容器
docker exec -it go_container /bin/bash;
git clone https://github.com/piexlmax/gin-vue-admin.git /data1/www/htdocs/go/admin;

#启动前端
cd /data1/www/htdocs/go/admin/QMPlusVuePage;
cnpm i ;
npm run serve;

#修改数据库配置
vi /data1/www/htdocs/go/admin/QMPlusServer/static/dbconfig/config.json;

#启动后端
cd /data1/www/htdocs/go/admin/QMPlusServer;
go run main.go;

希望表单生成器可以添加 【多重输入】功能

大致功能为:
1.默认第一个输入框 右侧一个 ‘’+‘’ 的按钮
2.点击 “+”按钮,会向下创建一个输入框,同事当前输入框右侧生成有两个按钮 “+” “-”
3.点击 “-”按钮,会删除当前输入框
4. 第一个输入框始终只有一个 “+” 按钮

vue 线上打包配置问题

前端我看到有个配置是vue.config.js 配置的是开发环境的一些参数。现在我想上线 在生产环境 我怎么新建一个生产配置和npm run build联系起来打包呢? 对前端不是很熟悉 希望解答下

BreakpointContinue

文件断点续传是不是还没有做完整,是不是要判断文件整个上传完成之后把文件切片删除。

重构CreateTemp

初步想法是遍历resource/template文件夹下所有.tpl文件
根据该文件路径信息,实现当前功能(应该只需要很少的额外辅助信息 )
减少当前的重复代码,后续增加tpl文件也更方便

如果有需要我会进行这部分代码的重构,后续提交pr

功能增强及建议

1:目前查询部分没有实现表所有字段模糊匹配功能
2:加载动画部分可以加在右侧的列表部分,只局部动画即可,现在全页面loading。。。觉得不太好
image
3:时间日期部分自动生成代码model部分没有引入time
4:生成model部分建议可以自定义表名,那么在生成架构体时灵活性更大了
类似这样
//get real table name
func (Example *Example) TableName() string {
return "example_table"
}
5:自动生成代码部分如果是布尔值时,那么前端部分需要自己实现布尔值的render功能
6:日期的处理,在前端建议给一个提示,或者在视频教学中说明(然并卵,建议生成模板时加提示吧)

无论如何,以上只是个人愚见,望采纳

建议

为什么超级管理员都没的权限,手动该数据库吗?

前端项目缺少文件

'@/api/fileUploadAndDownload'
'@/utils/downloadImg'

期待 完成 "工作流,任务交接功能"

希望提供 Validator 校验器功能

希望提供 Validator 校验器功能,此功能在参数校验时比较有用,此功能可以在参数与规则不匹配时,直接抛出错误信息

关于Api的疑惑

首先感谢团队的开源项目!
体验自动生成代码功能过程中发现: 更新记录时提示“没有权限”,查看API,前端使用“PUT”更新方法,后端添加的更新方法是“POST”,这里应该是一个bug。

另外想问所有API都带有谓语 (貌似RESTful不提倡),出于何种考虑采用带谓语的API而不是如下形式

POST /posts
GET /posts
GET /posts/:id
POST /posts/:id
PUT /posts/:id
DELETE /posts/:id

初学者一枚,望作者指点迷津

自动生成代码

能否根据数据库表结自动生成相应model,controller,server等代码

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.