From f3a7c67eeb9885f300f43468a8185e8e51afe451 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=92=8B=E5=90=89=E5=85=86?= <303176530@qq.com> Date: Fri, 10 Dec 2021 22:41:00 +0800 Subject: [PATCH 1/4] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=A8=A1=E6=9D=BF?= =?UTF-8?q?=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/resource/template/web/table.vue.tpl | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/server/resource/template/web/table.vue.tpl b/server/resource/template/web/table.vue.tpl index 2c2dde47..9cf641d1 100644 --- a/server/resource/template/web/table.vue.tpl +++ b/server/resource/template/web/table.vue.tpl @@ -22,14 +22,14 @@ {{ end }}{{ end }}{{ end }} - 查询 - 重置 + 查询 + 重置
- 新增 + 新增

确定要删除吗?

@@ -37,7 +37,7 @@ 确定
@@ -69,8 +69,8 @@ {{- end }} From 3e1c04c3487c364a0b597ee0734e389872c880b5 Mon Sep 17 00:00:00 2001 From: ShadowWalker Date: Fri, 10 Dec 2021 22:56:18 +0800 Subject: [PATCH 2/4] =?UTF-8?q?feat:=20CORS=E7=BB=84=E4=BB=B6=E6=94=AF?= =?UTF-8?q?=E6=8C=81=E4=BD=BF=E7=94=A8=E9=85=8D=E7=BD=AE=E6=96=87=E4=BB=B6?= =?UTF-8?q?=E6=9B=B4=E7=81=B5=E6=B4=BB=E7=9A=84=E9=85=8D=E7=BD=AE=E5=A4=84?= =?UTF-8?q?=E7=90=86=E8=B7=A8=E5=9F=9F=E7=9A=84=E9=80=BB=E8=BE=91;?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/config.docker.yaml | 16 ++++++++++++ server/config.yaml | 16 +++++++++++- server/config/config.go | 3 +++ server/config/cors.go | 14 +++++++++++ server/initialize/router.go | 5 ++-- server/middleware/cors.go | 49 ++++++++++++++++++++++++++++++++++++- 6 files changed, 99 insertions(+), 4 deletions(-) create mode 100644 server/config/cors.go diff --git a/server/config.docker.yaml b/server/config.docker.yaml index a5a72c50..8466fc05 100644 --- a/server/config.docker.yaml +++ b/server/config.docker.yaml @@ -135,3 +135,19 @@ Timer: { tableName: "sys_operation_records" , compareField: "created_at", interval: "2160h" }, #{ tableName: "log2" , compareField: "created_at", interval: "2160h" } ] + +# 跨域配置 +# 需要配合 server/initialize/router.go#L32 使用 +cors: + mode: whitelist # 放行模式: allow-all, 放行全部; whitelist, 白名单模式, 来自白名单内域名的请求添加 cors 头; strict-whitelist 严格白名单模式, 白名单外的请求一律拒绝 + whitelist: + - allow-origin: example1.com + allow-headers: content-type + allow-methods: GET, POST + expose-headers: Content-Length, Access-Control-Allow-Origin, Access-Control-Allow-Headers, Content-Type + allow-credentials: true # 布尔值 + - allow-origin: example2.com + allow-headers: content-type + allow-methods: GET, POST + expose-headers: Content-Length, Access-Control-Allow-Origin, Access-Control-Allow-Headers, Content-Type + allow-credentials: true # 布尔值 diff --git a/server/config.yaml b/server/config.yaml index 97b0bcc6..4ad8e3d6 100644 --- a/server/config.yaml +++ b/server/config.yaml @@ -179,4 +179,18 @@ Timer: #{ tableName: "log2" , compareField: "created_at", interval: "2160h" } ] - +# 跨域配置 +# 需要配合 server/initialize/router.go#L32 使用 +cors: + mode: whitelist # 放行模式: allow-all, 放行全部; whitelist, 白名单模式, 来自白名单内域名的请求添加 cors 头; strict-whitelist 严格白名单模式, 白名单外的请求一律拒绝 + whitelist: + - allow-origin: example1.com + allow-headers: content-type + allow-methods: GET, POST + expose-headers: Content-Length, Access-Control-Allow-Origin, Access-Control-Allow-Headers, Content-Type + allow-credentials: true # 布尔值 + - allow-origin: example2.com + allow-headers: content-type + allow-methods: GET, POST + expose-headers: Content-Length, Access-Control-Allow-Origin, Access-Control-Allow-Headers, Content-Type + allow-credentials: true # 布尔值 diff --git a/server/config/config.go b/server/config/config.go index 5668edc8..dae3571f 100644 --- a/server/config/config.go +++ b/server/config/config.go @@ -23,4 +23,7 @@ type Server struct { Excel Excel `mapstructure:"excel" json:"excel" yaml:"excel"` Timer Timer `mapstructure:"timer" json:"timer" yaml:"timer"` + + // 跨域配置 + Cors CORS `mapstructure:"cors" json:"cors" yaml:"cors"` } diff --git a/server/config/cors.go b/server/config/cors.go new file mode 100644 index 00000000..7fba9934 --- /dev/null +++ b/server/config/cors.go @@ -0,0 +1,14 @@ +package config + +type CORS struct { + Mode string `mapstructure:"mode" json:"mode" yaml:"mode"` + Whitelist []CORSWhitelist `mapstructure:"whitelist" json:"whitelist" yaml:"whitelist"` +} + +type CORSWhitelist struct { + AllowOrigin string `mapstructure:"allow-origin" json:"allow-origin" yaml:"allow-origin"` + AllowMethods string `mapstructure:"allow-methods" json:"allow-methods" yaml:"allow-methods"` + AllowHeaders string `mapstructure:"allow-headers" json:"allow-headers" yaml:"allow-headers"` + ExposeHeaders string `mapstructure:"expose-headers" json:"expose-headers" yaml:"expose-headers"` + AllowCredentials bool `mapstructure:"allow-credentials" json:"allow-credentials" yaml:"allow-credentials"` +} diff --git a/server/initialize/router.go b/server/initialize/router.go index 79cb2c2d..30937c18 100644 --- a/server/initialize/router.go +++ b/server/initialize/router.go @@ -29,8 +29,9 @@ func Routers() *gin.Engine { Router.StaticFS(global.GVA_CONFIG.Local.Path, http.Dir(global.GVA_CONFIG.Local.Path)) // 为用户头像和文件提供静态地址 // Router.Use(middleware.LoadTls()) // 打开就能玩https了 global.GVA_LOG.Info("use middleware logger") - // 跨域 - //Router.Use(middleware.Cors()) // 如需跨域可以打开 + // 跨域,如需跨域可以打开下面的注释 + // Router.Use(middleware.Cors()) // 直接放行全部跨域请求 + //Router.Use(middleware.CorsByRules()) // 按照配置的规则放行跨域请求 global.GVA_LOG.Info("use middleware cors") Router.GET("/swagger/*any", ginSwagger.WrapHandler(swaggerFiles.Handler)) global.GVA_LOG.Info("register swagger handler") diff --git a/server/middleware/cors.go b/server/middleware/cors.go index 68f6651f..fa1c6e2f 100644 --- a/server/middleware/cors.go +++ b/server/middleware/cors.go @@ -1,11 +1,13 @@ package middleware import ( + "github.com/flipped-aurora/gin-vue-admin/server/config" + "github.com/flipped-aurora/gin-vue-admin/server/global" "github.com/gin-gonic/gin" "net/http" ) -// 处理跨域请求,支持options访问 +// Cors 直接放行所有跨域请求并放行所有 OPTIONS 方法 func Cors() gin.HandlerFunc { return func(c *gin.Context) { method := c.Request.Method @@ -24,3 +26,48 @@ func Cors() gin.HandlerFunc { c.Next() } } + +// CorsByRules 按照配置处理跨域请求 +func CorsByRules() gin.HandlerFunc { + // 放行全部 + if global.GVA_CONFIG.Cors.Mode == "allow-all" { + return Cors() + } + return func(c *gin.Context) { + whitelist := checkCors(c.GetHeader("origin")) + + // 通过检查, 添加请求头 + if whitelist != nil { + c.Header("Access-Control-Allow-Origin", whitelist.AllowOrigin) + c.Header("Access-Control-Allow-Headers", whitelist.AllowHeaders) + c.Header("Access-Control-Allow-Methods", whitelist.AllowMethods) + c.Header("Access-Control-Expose-Headers", whitelist.ExposeHeaders) + if whitelist.AllowCredentials { + c.Header("Access-Control-Allow-Credentials", "true") + } + } + + // 严格白名单模式且未通过检查,直接拒绝处理请求 + if whitelist == nil && global.GVA_CONFIG.Cors.Mode == "strict-whitelist" { + c.AbortWithStatus(http.StatusForbidden) + } else { + // 非严格白名单模式,无论是否通过检查均放行所有 OPTIONS 方法 + if c.Request.Method == "OPTIONS" { + c.AbortWithStatus(http.StatusNoContent) + } + } + + // 处理请求 + c.Next() + } +} + +func checkCors(currentOrigin string) *config.CORSWhitelist { + for _, whitelist := range global.GVA_CONFIG.Cors.Whitelist { + // 遍历配置中的跨域头,寻找匹配项 + if currentOrigin == whitelist.AllowOrigin { + return &whitelist + } + } + return nil +} From e01d52b771518ed837b0c40492ef8b8f5bbf9ce7 Mon Sep 17 00:00:00 2001 From: ShadowWalker Date: Sat, 11 Dec 2021 00:27:51 +0800 Subject: [PATCH 3/4] =?UTF-8?q?fix:=20=E4=B8=A5=E6=A0=BC=E7=99=BD=E5=90=8D?= =?UTF-8?q?=E5=8D=95=E6=A8=A1=E5=BC=8F=E6=8B=A6=E6=88=AA=E4=BA=86=E5=81=A5?= =?UTF-8?q?=E5=BA=B7=E6=A3=80=E6=9F=A5=E5=AF=BC=E8=87=B4=E5=81=A5=E5=BA=B7?= =?UTF-8?q?=E6=A3=80=E6=9F=A5=E9=80=BB=E8=BE=91=E5=A4=B1=E6=95=88=E7=9A=84?= =?UTF-8?q?=E9=97=AE=E9=A2=98;?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/middleware/cors.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/middleware/cors.go b/server/middleware/cors.go index fa1c6e2f..99664b7e 100644 --- a/server/middleware/cors.go +++ b/server/middleware/cors.go @@ -48,7 +48,7 @@ func CorsByRules() gin.HandlerFunc { } // 严格白名单模式且未通过检查,直接拒绝处理请求 - if whitelist == nil && global.GVA_CONFIG.Cors.Mode == "strict-whitelist" { + if whitelist == nil && global.GVA_CONFIG.Cors.Mode == "strict-whitelist" && !(c.Request.Method == "GET" && c.Request.URL.Path == "/health") { c.AbortWithStatus(http.StatusForbidden) } else { // 非严格白名单模式,无论是否通过检查均放行所有 OPTIONS 方法 From 7c5939d50031c03fe2d3e37d25778db661902ab0 Mon Sep 17 00:00:00 2001 From: piexlmax Date: Mon, 13 Dec 2021 17:27:57 +0800 Subject: [PATCH 4/4] =?UTF-8?q?=E8=87=AA=E5=8A=A8=E5=8C=96=E4=BB=A3?= =?UTF-8?q?=E7=A0=81=E5=8F=96=E6=B6=88=E6=95=B0=E6=8D=AE=E5=BA=93=E7=B1=BB?= =?UTF-8?q?=E5=9E=8B=E5=AE=9A=E4=B9=89=20=E5=AF=B9=E4=BC=9A=E4=BA=A7?= =?UTF-8?q?=E7=94=9F=E6=8A=A5=E9=94=99=E7=9A=84=E5=9C=B0=E6=96=B9=E5=81=9A?= =?UTF-8?q?=E4=BA=86=E7=BB=9F=E4=B8=80=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/model/system/sys_auto_code.go | 1 - server/resource/template/server/model.go.tpl | 4 +-- web/package.json | 6 ++-- .../autoCode/component/fieldDialog.vue | 36 ++----------------- web/src/view/systemTools/autoCode/index.vue | 15 +++++--- 5 files changed, 18 insertions(+), 44 deletions(-) diff --git a/server/model/system/sys_auto_code.go b/server/model/system/sys_auto_code.go index f3128898..349bec61 100644 --- a/server/model/system/sys_auto_code.go +++ b/server/model/system/sys_auto_code.go @@ -21,7 +21,6 @@ type Field struct { FieldDesc string `json:"fieldDesc"` // 中文名 FieldType string `json:"fieldType"` // Field数据类型 FieldJson string `json:"fieldJson"` // FieldJson - DataType string `json:"dataType"` // 数据库字段类型 DataTypeLong string `json:"dataTypeLong"` // 数据库字段长度 Comment string `json:"comment"` // 数据库字段描述 ColumnName string `json:"columnName"` // 数据库字段 diff --git a/server/resource/template/server/model.go.tpl b/server/resource/template/server/model.go.tpl index fbad1e01..e585cc20 100644 --- a/server/resource/template/server/model.go.tpl +++ b/server/resource/template/server/model.go.tpl @@ -10,9 +10,9 @@ import ( type {{.StructName}} struct { global.GVA_MODEL {{- range .Fields}} {{- if ne .FieldType "string" }} - {{.FieldName}} *{{.FieldType}} `json:"{{.FieldJson}}" form:"{{.FieldJson}}" gorm:"column:{{.ColumnName}};comment:{{.Comment}}{{- if .DataType -}};type:{{.DataType}}{{- end }}"` + {{.FieldName}} *{{.FieldType}} `json:"{{.FieldJson}}" form:"{{.FieldJson}}" gorm:"column:{{.ColumnName}};comment:{{.Comment}};{{- if .DataTypeLong -}}size:{{.DataTypeLong}};{{- end -}}"` {{- else }} - {{.FieldName}} {{.FieldType}} `json:"{{.FieldJson}}" form:"{{.FieldJson}}" gorm:"column:{{.ColumnName}};comment:{{.Comment}}{{- if .DataType -}};type:{{.DataType}}{{- if eq .FieldType "string" -}}{{- if .DataTypeLong -}}({{.DataTypeLong}}){{- end -}}{{- end -}};{{- if ne .FieldType "string" -}}{{- if .DataTypeLong -}}size:{{.DataTypeLong}};{{- end -}}{{- end -}}{{- end -}}"` + {{.FieldName}} {{.FieldType}} `json:"{{.FieldJson}}" form:"{{.FieldJson}}" gorm:"column:{{.ColumnName}};comment:{{.Comment}};{{- if .DataTypeLong -}}size:{{.DataTypeLong}};{{- end -}}"` {{- end }} {{- end }} } diff --git a/web/package.json b/web/package.json index c13bf41b..10a1381b 100644 --- a/web/package.json +++ b/web/package.json @@ -24,7 +24,7 @@ "screenfull": "^5.0.2", "script-ext-html-webpack-plugin": "^2.1.4", "spark-md5": "^3.0.1", - "vue": "^3.2.0", + "vue": "^3.2.25", "vue-particle-line": "^0.1.4", "vue-router": "^4.0.0-0", "vuex": "^4.0.0-0", @@ -47,8 +47,8 @@ "eslint-plugin-vue": "^7.0.0", "sass": "^1.26.5", "sass-loader": "^8.0.2", - "vite": "2.5.3", + "vite": "2.5.10", "vite-plugin-banner": "^0.1.3", "vite-plugin-importer": "^0.2.5" } -} \ No newline at end of file +} diff --git a/web/src/view/systemTools/autoCode/component/fieldDialog.vue b/web/src/view/systemTools/autoCode/component/fieldDialog.vue index 18f2c9f3..0661ba89 100644 --- a/web/src/view/systemTools/autoCode/component/fieldDialog.vue +++ b/web/src/view/systemTools/autoCode/component/fieldDialog.vue @@ -40,25 +40,8 @@ /> - - - - - - - - + + diff --git a/web/src/view/systemTools/autoCode/index.vue b/web/src/view/systemTools/autoCode/index.vue index 720b6d38..85cc8e5d 100644 --- a/web/src/view/systemTools/autoCode/index.vue +++ b/web/src/view/systemTools/autoCode/index.vue @@ -61,7 +61,7 @@ - +