|
+### QQ交流群:470239250
### 微信交流群
| 微信 |
diff --git a/deploy/docker-compose/docker-compose-dev.yaml b/deploy/docker-compose/docker-compose-dev.yaml
index 468564ca..8bdb3347 100644
--- a/deploy/docker-compose/docker-compose-dev.yaml
+++ b/deploy/docker-compose/docker-compose-dev.yaml
@@ -41,8 +41,10 @@ services:
ports:
- '8888:8888'
depends_on:
- - mysql
- - redis
+ mysql:
+ condition: service_healthy
+ redis:
+ condition: service_healthy
volumes:
- ../../server:/server
working_dir: /server # 如果docker 设置了workdir 则此处不需要设置
@@ -67,6 +69,11 @@ services:
MYSQL_DATABASE: 'qmPlus' # 初始化启动时要创建的数据库的名称
MYSQL_USER: 'gva'
MYSQL_PASSWORD: 'Aa@6447985'
+ healthcheck:
+ test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "gva", "-pAa@6447985"]
+ interval: 10s
+ timeout: 5s
+ retries: 3
volumes:
- mysql:/var/lib/mysql
networks:
@@ -80,6 +87,11 @@ services:
restart: always
ports:
- '16379:6379'
+ healthcheck:
+ test: ["CMD-SHELL", "redis-cli ping | grep PONG || exit 1"]
+ interval: 10s
+ timeout: 5s
+ retries: 3
volumes:
- redis:/data
networks:
diff --git a/deploy/docker-compose/docker-compose.yaml b/deploy/docker-compose/docker-compose.yaml
index 6c8ae02d..1e304c2e 100644
--- a/deploy/docker-compose/docker-compose.yaml
+++ b/deploy/docker-compose/docker-compose.yaml
@@ -38,8 +38,10 @@ services:
ports:
- '8888:8888'
depends_on:
- - mysql
- - redis
+ mysql:
+ condition: service_healthy
+ redis:
+ condition: service_healthy
links:
- mysql
- redis
@@ -59,6 +61,11 @@ services:
MYSQL_DATABASE: 'qmPlus' # 初始化启动时要创建的数据库的名称
MYSQL_USER: 'gva'
MYSQL_PASSWORD: 'Aa@6447985'
+ healthcheck:
+ test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "gva", "-pAa@6447985"]
+ interval: 10s
+ timeout: 5s
+ retries: 3
volumes:
- mysql:/var/lib/mysql
networks:
@@ -71,6 +78,11 @@ services:
restart: always
ports:
- '16379:6379'
+ healthcheck:
+ test: ["CMD-SHELL", "redis-cli ping | grep PONG || exit 1"]
+ interval: 10s
+ timeout: 5s
+ retries: 3
volumes:
- redis:/data
networks:
diff --git a/server/api/v1/system/sys_auto_code.go b/server/api/v1/system/sys_auto_code.go
index 6f0faeb0..3ca49a96 100644
--- a/server/api/v1/system/sys_auto_code.go
+++ b/server/api/v1/system/sys_auto_code.go
@@ -63,6 +63,7 @@ func (autoApi *AutoCodeApi) CreateTemp(c *gin.Context) {
}
a.Pretreatment()
var apiIds []uint
+ var menuId uint
if a.AutoCreateApiToSql {
if ids, err := autoCodeService.AutoCreateApi(&a); err != nil {
global.GVA_LOG.Error("自动化创建失败!请自行清空垃圾数据!", zap.Error(err))
@@ -73,8 +74,17 @@ func (autoApi *AutoCodeApi) CreateTemp(c *gin.Context) {
apiIds = ids
}
}
+ if a.AutoCreateMenuToSql {
+ if id, err := autoCodeService.AutoCreateMenu(&a); err != nil {
+ global.GVA_LOG.Error("自动化创建失败!请自行清空垃圾数据!", zap.Error(err))
+ c.Writer.Header().Add("success", "false")
+ c.Writer.Header().Add("msg", url.QueryEscape("自动化创建失败!请自行清空垃圾数据!"))
+ } else {
+ menuId = id
+ }
+ }
a.PackageT = utils.FirstUpper(a.Package)
- err := autoCodeService.CreateTemp(a, apiIds...)
+ err := autoCodeService.CreateTemp(a, menuId, apiIds...)
if err != nil {
if errors.Is(err, system.ErrAutoMove) {
c.Writer.Header().Add("success", "true")
diff --git a/server/api/v1/system/sys_export_template.go b/server/api/v1/system/sys_export_template.go
index 57da9305..4eaaf47b 100644
--- a/server/api/v1/system/sys_export_template.go
+++ b/server/api/v1/system/sys_export_template.go
@@ -191,11 +191,12 @@ func (sysExportTemplateApi *SysExportTemplateApi) GetSysExportTemplateList(c *gi
// @Router /sysExportTemplate/exportExcel [get]
func (sysExportTemplateApi *SysExportTemplateApi) ExportExcel(c *gin.Context) {
templateID := c.Query("templateID")
+ queryParams := c.Request.URL.Query()
if templateID == "" {
response.FailWithMessage("模板ID不能为空", c)
return
}
- if file, name, err := sysExportTemplateService.ExportExcel(templateID); err != nil {
+ if file, name, err := sysExportTemplateService.ExportExcel(templateID, queryParams); err != nil {
global.GVA_LOG.Error("获取失败!", zap.Error(err))
response.FailWithMessage("获取失败", c)
} else {
diff --git a/server/config.yaml b/server/config.yaml
index ffdb7db5..7ba41f0b 100644
--- a/server/config.yaml
+++ b/server/config.yaml
@@ -30,6 +30,7 @@ mongo:
database: ''
username: ''
password: ''
+ auth-source: ''
min-pool-size: 0
max-pool-size: 100
socket-timeout-ms: 0
diff --git a/server/config/mongo.go b/server/config/mongo.go
index fe4f0e09..2034a3fb 100644
--- a/server/config/mongo.go
+++ b/server/config/mongo.go
@@ -11,6 +11,7 @@ type Mongo struct {
Database string `json:"database" yaml:"database" mapstructure:"database"` // database name
Username string `json:"username" yaml:"username" mapstructure:"username"` // 用户名
Password string `json:"password" yaml:"password" mapstructure:"password"` // 密码
+ AuthSource string `json:"auth-source" yaml:"auth-source" mapstructure:"auth-source"` // 验证数据库
MinPoolSize uint64 `json:"min-pool-size" yaml:"min-pool-size" mapstructure:"min-pool-size"` // 最小连接池
MaxPoolSize uint64 `json:"max-pool-size" yaml:"max-pool-size" mapstructure:"max-pool-size"` // 最大连接池
SocketTimeoutMs int64 `json:"socket-timeout-ms" yaml:"socket-timeout-ms" mapstructure:"socket-timeout-ms"` // socket超时时间
diff --git a/server/config/system.go b/server/config/system.go
index 7ab33876..398bf789 100644
--- a/server/config/system.go
+++ b/server/config/system.go
@@ -1,7 +1,6 @@
package config
type System struct {
- Env string `mapstructure:"env" json:"env" yaml:"env"` // 环境值
DbType string `mapstructure:"db-type" json:"db-type" yaml:"db-type"` // 数据库类型:mysql(默认)|sqlite|sqlserver|postgresql
OssType string `mapstructure:"oss-type" json:"oss-type" yaml:"oss-type"` // Oss类型
RouterPrefix string `mapstructure:"router-prefix" json:"router-prefix" yaml:"router-prefix"`
@@ -10,5 +9,5 @@ type System struct {
LimitTimeIP int `mapstructure:"iplimit-time" json:"iplimit-time" yaml:"iplimit-time"`
UseMultipoint bool `mapstructure:"use-multipoint" json:"use-multipoint" yaml:"use-multipoint"` // 多点登录拦截
UseRedis bool `mapstructure:"use-redis" json:"use-redis" yaml:"use-redis"` // 使用redis
- UseMongo bool `mapstructure:"use-mongo" json:"use-mongo" yaml:"use-mongo"` // 使用redis
+ UseMongo bool `mapstructure:"use-mongo" json:"use-mongo" yaml:"use-mongo"` // 使用mongo
}
diff --git a/server/core/server.go b/server/core/server.go
index 663aa042..d58626ca 100644
--- a/server/core/server.go
+++ b/server/core/server.go
@@ -2,8 +2,6 @@ package core
import (
"fmt"
- "time"
-
"github.com/flipped-aurora/gin-vue-admin/server/global"
"github.com/flipped-aurora/gin-vue-admin/server/initialize"
"github.com/flipped-aurora/gin-vue-admin/server/service/system"
@@ -35,15 +33,13 @@ func RunWindowsServer() {
address := fmt.Sprintf(":%d", global.GVA_CONFIG.System.Addr)
s := initServer(address, Router)
- // 保证文本顺序输出
- // In order to ensure that the text order output can be deleted
- time.Sleep(10 * time.Microsecond)
+
global.GVA_LOG.Info("server run success on ", zap.String("address", address))
fmt.Printf(`
欢迎使用 gin-vue-admin
- 当前版本:v2.5.9
- 加群方式:微信号:shouzi_1994 QQ群:622360840
+ 当前版本:v2.6.1
+ 加群方式:微信号:shouzi_1994 QQ群:470239250
插件市场:https://plugin.gin-vue-admin.com
GVA讨论社区:https://support.qq.com/products/371961
默认自动化文档地址:http://127.0.0.1%s/swagger/index.html
diff --git a/server/core/viper.go b/server/core/viper.go
index e4cbc318..42b58932 100644
--- a/server/core/viper.go
+++ b/server/core/viper.go
@@ -29,13 +29,13 @@ func Viper(path ...string) *viper.Viper {
switch gin.Mode() {
case gin.DebugMode:
config = internal.ConfigDefaultFile
- fmt.Printf("您正在使用gin模式的%s环境名称,config的路径为%s\n", gin.EnvGinMode, internal.ConfigDefaultFile)
+ fmt.Printf("您正在使用gin模式的%s环境名称,config的路径为%s\n", gin.Mode(), internal.ConfigDefaultFile)
case gin.ReleaseMode:
config = internal.ConfigReleaseFile
- fmt.Printf("您正在使用gin模式的%s环境名称,config的路径为%s\n", gin.EnvGinMode, internal.ConfigReleaseFile)
+ fmt.Printf("您正在使用gin模式的%s环境名称,config的路径为%s\n", gin.Mode(), internal.ConfigReleaseFile)
case gin.TestMode:
config = internal.ConfigTestFile
- fmt.Printf("您正在使用gin模式的%s环境名称,config的路径为%s\n", gin.EnvGinMode, internal.ConfigTestFile)
+ fmt.Printf("您正在使用gin模式的%s环境名称,config的路径为%s\n", gin.Mode(), internal.ConfigTestFile)
}
} else { // internal.ConfigEnv 常量存储的环境变量不为空 将值赋值于config
config = configEnv
diff --git a/server/docs/docs.go b/server/docs/docs.go
index ede55e68..323b73e9 100644
--- a/server/docs/docs.go
+++ b/server/docs/docs.go
@@ -7001,7 +7001,7 @@ const docTemplate = `{
// SwaggerInfo holds exported Swagger Info so clients can modify it
var SwaggerInfo = &swag.Spec{
- Version: "v2.5.9",
+ Version: "v2.6.1",
Host: "",
BasePath: "",
Schemes: []string{},
diff --git a/server/docs/swagger.json b/server/docs/swagger.json
index 7d5e4c08..324d491a 100644
--- a/server/docs/swagger.json
+++ b/server/docs/swagger.json
@@ -4,7 +4,7 @@
"description": "使用gin+vue进行极速开发的全栈开发基础平台",
"title": "Gin-Vue-Admin Swagger API接口文档",
"contact": {},
- "version": "v2.5.9"
+ "version": "v2.6.1"
},
"paths": {
"/api/createApi": {
@@ -6989,4 +6989,4 @@
"in": "header"
}
}
-}
\ No newline at end of file
+}
diff --git a/server/docs/swagger.yaml b/server/docs/swagger.yaml
index 0e53bb15..d7e5ec12 100644
--- a/server/docs/swagger.yaml
+++ b/server/docs/swagger.yaml
@@ -1585,7 +1585,7 @@ info:
contact: {}
description: 使用gin+vue进行极速开发的全栈开发基础平台
title: Gin-Vue-Admin Swagger API接口文档
- version: v2.5.9
+ version: v2.6.1
paths:
/api/createApi:
post:
diff --git a/server/go.mod b/server/go.mod
index 1452b7fc..f1967622 100644
--- a/server/go.mod
+++ b/server/go.mod
@@ -123,6 +123,7 @@ require (
github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d // indirect
github.com/yusufpapurcu/wmi v1.2.3 // indirect
go.uber.org/atomic v1.9.0 // indirect
+ go.uber.org/automaxprocs v1.5.3 // indirect
go.uber.org/multierr v1.8.0 // indirect
golang.org/x/arch v0.3.0 // indirect
golang.org/x/image v0.11.0 // indirect
diff --git a/server/go.sum b/server/go.sum
index b92c3709..fa4974d0 100644
--- a/server/go.sum
+++ b/server/go.sum
@@ -459,6 +459,8 @@ go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ=
go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
go.uber.org/atomic v1.9.0 h1:ECmE8Bn/WFTYwEW/bpKD3M8VtR/zQVbavAoalC1PYyE=
go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
+go.uber.org/automaxprocs v1.5.3 h1:kWazyxZUrS3Gs4qUpbwo5kEIMGe/DAvi5Z4tl2NW4j8=
+go.uber.org/automaxprocs v1.5.3/go.mod h1:eRbA25aqJrxAbsLO0xy5jVwPt7FQnRgjW+efnwa1WM0=
go.uber.org/goleak v1.1.11 h1:wy28qYRKZgnJTxGxvye5/wgWr1EKjmUDGYox5mGlRlI=
go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU=
go.uber.org/multierr v1.8.0 h1:dg6GjLku4EH+249NNmoIciG9N/jURbDG+pFlTkhzIC8=
diff --git a/server/initialize/ensure_tables.go b/server/initialize/ensure_tables.go
index 780e3555..d49c1a23 100644
--- a/server/initialize/ensure_tables.go
+++ b/server/initialize/ensure_tables.go
@@ -49,6 +49,7 @@ func (e *ensureTables) MigrateTable(ctx context.Context) (context.Context, error
sysModel.SysAuthorityBtn{},
sysModel.SysAutoCode{},
sysModel.SysExportTemplate{},
+ sysModel.Condition{},
adapter.CasbinRule{},
@@ -85,6 +86,7 @@ func (e *ensureTables) TableCreated(ctx context.Context) bool {
sysModel.SysAuthorityBtn{},
sysModel.SysAutoCode{},
sysModel.SysExportTemplate{},
+ sysModel.Condition{},
adapter.CasbinRule{},
diff --git a/server/initialize/gorm.go b/server/initialize/gorm.go
index a2886b04..6c309385 100644
--- a/server/initialize/gorm.go
+++ b/server/initialize/gorm.go
@@ -46,6 +46,7 @@ func RegisterTables() {
system.SysAuthorityBtn{},
system.SysAutoCode{},
system.SysExportTemplate{},
+ system.Condition{},
example.ExaFile{},
example.ExaCustomer{},
diff --git a/server/initialize/mongo.go b/server/initialize/mongo.go
index 1c183b32..d88afaa7 100644
--- a/server/initialize/mongo.go
+++ b/server/initialize/mongo.go
@@ -54,8 +54,9 @@ func (m *mongo) Initialization() error {
SocketTimeoutMS: &global.GVA_CONFIG.Mongo.SocketTimeoutMs,
ConnectTimeoutMS: &global.GVA_CONFIG.Mongo.ConnectTimeoutMs,
Auth: &qmgo.Credential{
- Username: global.GVA_CONFIG.Mongo.Username,
- Password: global.GVA_CONFIG.Mongo.Password,
+ Username: global.GVA_CONFIG.Mongo.Username,
+ Password: global.GVA_CONFIG.Mongo.Password,
+ AuthSource: global.GVA_CONFIG.Mongo.AuthSource,
},
}, opts...)
if err != nil {
diff --git a/server/initialize/router.go b/server/initialize/router.go
index 3c369cbe..3b90889b 100644
--- a/server/initialize/router.go
+++ b/server/initialize/router.go
@@ -1,29 +1,41 @@
package initialize
import (
- swaggerFiles "github.com/swaggo/files"
- "net/http"
-
"github.com/flipped-aurora/gin-vue-admin/server/docs"
"github.com/flipped-aurora/gin-vue-admin/server/global"
"github.com/flipped-aurora/gin-vue-admin/server/middleware"
"github.com/flipped-aurora/gin-vue-admin/server/router"
"github.com/gin-gonic/gin"
+ swaggerFiles "github.com/swaggo/files"
ginSwagger "github.com/swaggo/gin-swagger"
+ "net/http"
+ "os"
)
+type justFilesFilesystem struct {
+ fs http.FileSystem
+}
+
+func (fs justFilesFilesystem) Open(name string) (http.File, error) {
+ f, err := fs.fs.Open(name)
+ if err != nil {
+ return nil, err
+ }
+
+ stat, err := f.Stat()
+ if stat.IsDir() {
+ return nil, os.ErrPermission
+ }
+
+ return f, nil
+}
+
// 初始化总路由
func Routers() *gin.Engine {
-
- // 设置为发布模式
- if global.GVA_CONFIG.System.Env == "public" {
- gin.SetMode(gin.ReleaseMode) //DebugMode ReleaseMode TestMode
- }
-
Router := gin.New()
Router.Use(gin.Recovery())
- if global.GVA_CONFIG.System.Env != "public" {
+ if gin.Mode() == gin.DebugMode {
Router.Use(gin.Logger())
}
@@ -35,11 +47,10 @@ func Routers() *gin.Engine {
// VUE_APP_BASE_PATH = http://localhost
// 然后执行打包命令 npm run build。在打开下面3行注释
//Router.Static("/favicon.ico", "./dist/favicon.ico")
- //Router.Static("/static", "./dist/static") // dist里面的静态资源
+ //Router.Static("/assets", "./dist/assets") // dist里面的静态资源
//Router.StaticFile("/", "./dist/index.html") // 前端网页入口页面
- Router.StaticFS(global.GVA_CONFIG.Local.StorePath, http.Dir(global.GVA_CONFIG.Local.StorePath)) // 为用户头像和文件提供静态地址
- // Router.Use(middleware.LoadTls()) // 如果需要使用https 请打开此中间件 然后前往 core/server.go 将启动模式 更变为 Router.RunTLS("端口","你的cre/pem文件","你的key文件")
+ Router.StaticFS(global.GVA_CONFIG.Local.StorePath, justFilesFilesystem{http.Dir(global.GVA_CONFIG.Local.StorePath)}) // Router.Use(middleware.LoadTls()) // 如果需要使用https 请打开此中间件 然后前往 core/server.go 将启动模式 更变为 Router.RunTLS("端口","你的cre/pem文件","你的key文件")
// 跨域,如需跨域可以打开下面的注释
// Router.Use(middleware.Cors()) // 直接放行全部跨域请求
// Router.Use(middleware.CorsByRules()) // 按照配置的规则放行跨域请求
diff --git a/server/main.go b/server/main.go
index ecc56f45..e08c8e00 100644
--- a/server/main.go
+++ b/server/main.go
@@ -1,6 +1,7 @@
package main
import (
+ _ "go.uber.org/automaxprocs"
"go.uber.org/zap"
"github.com/flipped-aurora/gin-vue-admin/server/core"
@@ -14,7 +15,7 @@ import (
//go:generate go mod download
// @title Gin-Vue-Admin Swagger API接口文档
-// @version v2.5.9
+// @version v2.6.1
// @description 使用gin+vue进行极速开发的全栈开发基础平台
// @securityDefinitions.apikey ApiKeyAuth
// @in header
diff --git a/server/middleware/casbin_rbac.go b/server/middleware/casbin_rbac.go
index 7994db1e..a1ca4c2b 100644
--- a/server/middleware/casbin_rbac.go
+++ b/server/middleware/casbin_rbac.go
@@ -16,22 +16,20 @@ var casbinService = service.ServiceGroupApp.SystemServiceGroup.CasbinService
// CasbinHandler 拦截器
func CasbinHandler() gin.HandlerFunc {
return func(c *gin.Context) {
- if global.GVA_CONFIG.System.Env != "develop" {
- waitUse, _ := utils.GetClaims(c)
- //获取请求的PATH
- path := c.Request.URL.Path
- obj := strings.TrimPrefix(path, global.GVA_CONFIG.System.RouterPrefix)
- // 获取请求方法
- act := c.Request.Method
- // 获取用户的角色
- sub := strconv.Itoa(int(waitUse.AuthorityId))
- e := casbinService.Casbin() // 判断策略中是否存在
- success, _ := e.Enforce(sub, obj, act)
- if !success {
- response.FailWithDetailed(gin.H{}, "权限不足", c)
- c.Abort()
- return
- }
+ waitUse, _ := utils.GetClaims(c)
+ //获取请求的PATH
+ path := c.Request.URL.Path
+ obj := strings.TrimPrefix(path, global.GVA_CONFIG.System.RouterPrefix)
+ // 获取请求方法
+ act := c.Request.Method
+ // 获取用户的角色
+ sub := strconv.Itoa(int(waitUse.AuthorityId))
+ e := casbinService.Casbin() // 判断策略中是否存在
+ success, _ := e.Enforce(sub, obj, act)
+ if !success {
+ response.FailWithDetailed(gin.H{}, "权限不足", c)
+ c.Abort()
+ return
}
c.Next()
}
diff --git a/server/middleware/jwt.go b/server/middleware/jwt.go
index 67ae4dfc..aa7ca37b 100644
--- a/server/middleware/jwt.go
+++ b/server/middleware/jwt.go
@@ -23,12 +23,12 @@ func JWTAuth() gin.HandlerFunc {
// 我们这里jwt鉴权取头部信息 x-token 登录时回返回token信息 这里前端需要把token存储到cookie或者本地localStorage中 不过需要跟后端协商过期时间 可以约定刷新令牌或者重新登录
token := utils.GetToken(c)
if token == "" {
- response.FailWithDetailed(gin.H{"reload": true}, "未登录或非法访问", c)
+ response.NoAuth("未登录或非法访问", c)
c.Abort()
return
}
if jwtService.IsBlacklist(token) {
- response.FailWithDetailed(gin.H{"reload": true}, "您的帐户异地登陆或令牌失效", c)
+ response.NoAuth("您的帐户异地登陆或令牌失效", c)
utils.ClearToken(c)
c.Abort()
return
@@ -38,12 +38,12 @@ func JWTAuth() gin.HandlerFunc {
claims, err := j.ParseToken(token)
if err != nil {
if errors.Is(err, utils.TokenExpired) {
- response.FailWithDetailed(gin.H{"reload": true}, "授权已过期", c)
+ response.NoAuth("授权已过期", c)
utils.ClearToken(c)
c.Abort()
return
}
- response.FailWithDetailed(gin.H{"reload": true}, err.Error(), c)
+ response.NoAuth(err.Error(), c)
utils.ClearToken(c)
c.Abort()
return
@@ -58,7 +58,6 @@ func JWTAuth() gin.HandlerFunc {
// c.Abort()
//}
c.Set("claims", claims)
- c.Next()
if claims.ExpiresAt.Unix()-time.Now().Unix() < claims.BufferTime {
dr, _ := utils.ParseDuration(global.GVA_CONFIG.JWT.ExpiresTime)
claims.ExpiresAt = jwt.NewNumericDate(time.Now().Add(dr))
@@ -78,5 +77,13 @@ func JWTAuth() gin.HandlerFunc {
_ = jwtService.SetRedisJWT(newToken, newClaims.Username)
}
}
+ c.Next()
+
+ if newToken, exists := c.Get("new-token"); exists {
+ c.Header("new-token", newToken.(string))
+ }
+ if newExpiresAt, exists := c.Get("new-expires-at"); exists {
+ c.Header("new-expires-at", newExpiresAt.(string))
+ }
}
}
diff --git a/server/middleware/operation.go b/server/middleware/operation.go
index 776433a1..f34cf68e 100644
--- a/server/middleware/operation.go
+++ b/server/middleware/operation.go
@@ -71,14 +71,18 @@ func OperationRecord() gin.HandlerFunc {
Method: c.Request.Method,
Path: c.Request.URL.Path,
Agent: c.Request.UserAgent(),
- Body: string(body),
+ Body: "",
UserID: userId,
}
// 上传文件时候 中间件日志进行裁断操作
if strings.Contains(c.GetHeader("Content-Type"), "multipart/form-data") {
- if len(record.Body) > bufferSize {
- record.Body = "[文件]"
+ record.Body = "[文件]"
+ } else {
+ if len(body) > bufferSize {
+ record.Body = "[超出记录长度]"
+ } else {
+ record.Body = string(body)
}
}
diff --git a/server/model/common/response/response.go b/server/model/common/response/response.go
index 733f7573..fcd69538 100644
--- a/server/model/common/response/response.go
+++ b/server/model/common/response/response.go
@@ -50,6 +50,14 @@ func FailWithMessage(message string, c *gin.Context) {
Result(ERROR, map[string]interface{}{}, message, c)
}
+func NoAuth(message string, c *gin.Context) {
+ c.JSON(http.StatusUnauthorized, Response{
+ 7,
+ nil,
+ message,
+ })
+}
+
func FailWithDetailed(data interface{}, message string, c *gin.Context) {
Result(ERROR, data, message, c)
}
diff --git a/server/model/system/request/sys_init.go b/server/model/system/request/sys_init.go
index d77a89ac..91b690ce 100644
--- a/server/model/system/request/sys_init.go
+++ b/server/model/system/request/sys_init.go
@@ -47,6 +47,10 @@ func (i *InitDB) SqliteEmptyDsn() string {
return i.DBPath + separator + i.DBName + ".db"
}
+func (i *InitDB) MssqlEmptyDsn() string {
+ return "sqlserver://" + i.UserName + ":" + i.Password + "@" + i.Host + ":" + i.Port + "?database=" + i.DBName + "&encrypt=disable"
+}
+
// ToMysqlConfig 转换 config.Mysql
// Author [SliverHorn](https://github.com/SliverHorn)
func (i *InitDB) ToMysqlConfig() config.Mysql {
@@ -100,3 +104,19 @@ func (i *InitDB) ToSqliteConfig() config.Sqlite {
},
}
}
+
+func (i *InitDB) ToMssqlConfig() config.Mssql {
+ return config.Mssql{
+ GeneralDB: config.GeneralDB{
+ Path: i.DBPath,
+ Port: i.Port,
+ Dbname: i.DBName,
+ Username: i.UserName,
+ Password: i.Password,
+ MaxIdleConns: 10,
+ MaxOpenConns: 100,
+ LogMode: "error",
+ Config: "",
+ },
+ }
+}
diff --git a/server/model/system/response/sys_auto_code.go b/server/model/system/response/sys_auto_code.go
index 1e440053..9e99bde3 100644
--- a/server/model/system/response/sys_auto_code.go
+++ b/server/model/system/response/sys_auto_code.go
@@ -13,4 +13,5 @@ type Column struct {
ColumnName string `json:"columnName" gorm:"column:column_name"`
DataTypeLong string `json:"dataTypeLong" gorm:"column:data_type_long"`
ColumnComment string `json:"columnComment" gorm:"column:column_comment"`
+ PrimaryKey bool `json:"primaryKey" gorm:"column:primary_key"`
}
diff --git a/server/model/system/sys_auto_code.go b/server/model/system/sys_auto_code.go
index d68b415f..23a7d6f4 100644
--- a/server/model/system/sys_auto_code.go
+++ b/server/model/system/sys_auto_code.go
@@ -10,26 +10,30 @@ import (
// AutoCodeStruct 初始版本自动化代码工具
type AutoCodeStruct struct {
- StructName string `json:"structName"` // Struct名称
- TableName string `json:"tableName"` // 表名
- PackageName string `json:"packageName"` // 文件名称
- HumpPackageName string `json:"humpPackageName"` // go文件名称
- Abbreviation string `json:"abbreviation"` // Struct简称
- Description string `json:"description"` // Struct中文名称
- AutoCreateApiToSql bool `json:"autoCreateApiToSql"` // 是否自动创建api
- AutoCreateResource bool `json:"autoCreateResource"` // 是否自动创建资源标识
- AutoMoveFile bool `json:"autoMoveFile"` // 是否自动移动文件
- BusinessDB string `json:"businessDB"` // 业务数据库
- Fields []*Field `json:"fields,omitempty"`
- HasTimer bool
- DictTypes []string `json:"-"`
- Package string `json:"package"`
- PackageT string `json:"-"`
- NeedSort bool `json:"-"`
- HasPic bool `json:"-"`
- HasRichText bool `json:"-"`
- HasFile bool `json:"-"`
- NeedJSON bool `json:"-"`
+ StructName string `json:"structName"` // Struct名称
+ TableName string `json:"tableName"` // 表名
+ PackageName string `json:"packageName"` // 文件名称
+ HumpPackageName string `json:"humpPackageName"` // go文件名称
+ Abbreviation string `json:"abbreviation"` // Struct简称
+ Description string `json:"description"` // Struct中文名称
+ AutoCreateApiToSql bool `json:"autoCreateApiToSql"` // 是否自动创建api
+ AutoCreateMenuToSql bool `json:"autoCreateMenuToSql"` // 是否自动创建menu
+ AutoCreateResource bool `json:"autoCreateResource"` // 是否自动创建资源标识
+ AutoMoveFile bool `json:"autoMoveFile"` // 是否自动移动文件
+ BusinessDB string `json:"businessDB"` // 业务数据库
+ GvaModel bool `json:"gvaModel"` // 是否使用gva默认Model
+ Fields []*Field `json:"fields"`
+ PrimaryField *Field `json:"primaryField"`
+ HasTimer bool `json:"-"`
+ HasSearchTimer bool `json:"-"`
+ DictTypes []string `json:"-"`
+ Package string `json:"package"`
+ PackageT string `json:"-"`
+ NeedSort bool `json:"-"`
+ HasPic bool `json:"-"`
+ HasRichText bool `json:"-"`
+ HasFile bool `json:"-"`
+ NeedJSON bool `json:"-"`
}
func (a *AutoCodeStruct) Pretreatment() {
@@ -67,6 +71,7 @@ type Field struct {
ErrorText string `json:"errorText"` // 校验失败文字
Clearable bool `json:"clearable"` // 是否可清空
Sort bool `json:"sort"` // 是否增加排序
+ PrimaryKey bool `json:"primaryKey"` // 是否主键
}
var ErrAutoMove error = errors.New("创建代码成功并移动文件成功")
diff --git a/server/model/system/sys_autocode_history.go b/server/model/system/sys_autocode_history.go
index 07cac3bd..60607938 100644
--- a/server/model/system/sys_autocode_history.go
+++ b/server/model/system/sys_autocode_history.go
@@ -14,6 +14,7 @@ type SysAutoCodeHistory struct {
Package string `json:"package"`
BusinessDB string `json:"businessDB"`
TableName string `json:"tableName"`
+ MenuID uint `json:"menuID"`
RequestMeta string `gorm:"type:text" json:"requestMeta,omitempty"` // 前端传入的结构化信息
AutoCodePath string `gorm:"type:text" json:"autoCodePath,omitempty"` // 其他meta信息 path;path
InjectionMeta string `gorm:"type:text" json:"injectionMeta,omitempty"` // 注入的内容 RouterPath@functionName@RouterString;
diff --git a/server/model/system/sys_dictionary_detail.go b/server/model/system/sys_dictionary_detail.go
index 443f1071..4084136c 100644
--- a/server/model/system/sys_dictionary_detail.go
+++ b/server/model/system/sys_dictionary_detail.go
@@ -9,7 +9,7 @@ import (
type SysDictionaryDetail struct {
global.GVA_MODEL
Label string `json:"label" form:"label" gorm:"column:label;comment:展示值"` // 展示值
- Value int `json:"value" form:"value" gorm:"column:value;comment:字典值"` // 字典值
+ Value string `json:"value" form:"value" gorm:"column:value;comment:字典值"` // 字典值
Extend string `json:"extend" form:"extend" gorm:"column:extend;comment:扩展值"` // 扩展值
Status *bool `json:"status" form:"status" gorm:"column:status;comment:启用状态"` // 启用状态
Sort int `json:"sort" form:"sort" gorm:"column:sort;comment:排序标记"` // 排序标记
diff --git a/server/model/system/sys_export_template.go b/server/model/system/sys_export_template.go
index 94929614..09fea02b 100644
--- a/server/model/system/sys_export_template.go
+++ b/server/model/system/sys_export_template.go
@@ -8,8 +8,24 @@ import (
// 导出模板 结构体 SysExportTemplate
type SysExportTemplate struct {
global.GVA_MODEL
- Name string `json:"name" form:"name" gorm:"column:name;comment:模板名称;"` //模板名称
- TableName string `json:"tableName" form:"tableName" gorm:"column:table_name;comment:表名称;"` //表名称
- TemplateID string `json:"templateID" form:"templateID" gorm:"column:template_id;comment:模板标识;"` //模板标识
- TemplateInfo string `json:"templateInfo" form:"templateInfo" gorm:"column:template_info;type:text;"` //模板信息
+ DBName string `json:"dbName" form:"dbName" gorm:"column:db_name;comment:数据库名称;"` //数据库名称
+ Name string `json:"name" form:"name" gorm:"column:name;comment:模板名称;"` //模板名称
+ TableName string `json:"tableName" form:"tableName" gorm:"column:table_name;comment:表名称;"` //表名称
+ TemplateID string `json:"templateID" form:"templateID" gorm:"column:template_id;comment:模板标识;"` //模板标识
+ TemplateInfo string `json:"templateInfo" form:"templateInfo" gorm:"column:template_info;type:text;"` //模板信息
+ Limit int `json:"limit" form:"limit" gorm:"column:limit;comment:导出限制"`
+ Order string `json:"order" form:"order" gorm:"column:order;comment:排序"`
+ Conditions []Condition `json:"conditions" form:"conditions" gorm:"foreignKey:TemplateID;references:TemplateID;comment:条件"`
+}
+
+type Condition struct {
+ global.GVA_MODEL
+ TemplateID string `json:"templateID" form:"templateID" gorm:"column:template_id;comment:模板标识"`
+ From string `json:"from" form:"from" gorm:"column:from;comment:条件取的key"`
+ Column string `json:"column" form:"column" gorm:"column:column;comment:作为查询条件的字段"`
+ Operator string `json:"operator" form:"operator" gorm:"column:operator;comment:操作符"`
+}
+
+func (Condition) TableName() string {
+ return "sys_export_template_condition"
}
diff --git a/server/resource/autocode_template/server/api.go.tpl b/server/resource/autocode_template/server/api.go.tpl
index 4e2254e1..4229125b 100644
--- a/server/resource/autocode_template/server/api.go.tpl
+++ b/server/resource/autocode_template/server/api.go.tpl
@@ -57,11 +57,11 @@ func ({{.Abbreviation}}Api *{{.StructName}}Api) Create{{.StructName}}(c *gin.Con
// @Success 200 {string} string "{"success":true,"data":{},"msg":"删除成功"}"
// @Router /{{.Abbreviation}}/delete{{.StructName}} [delete]
func ({{.Abbreviation}}Api *{{.StructName}}Api) Delete{{.StructName}}(c *gin.Context) {
- id := c.Query("ID")
+ {{.PrimaryField.FieldJson}} := c.Query("{{.PrimaryField.FieldJson}}")
{{- if .AutoCreateResource }}
userID := utils.GetUserID(c)
{{- end }}
- if err := {{.Abbreviation}}Service.Delete{{.StructName}}(id{{- if .AutoCreateResource -}},userID{{- end -}}); err != nil {
+ if err := {{.Abbreviation}}Service.Delete{{.StructName}}({{.PrimaryField.FieldJson}} {{- if .AutoCreateResource -}},userID{{- end -}}); err != nil {
global.GVA_LOG.Error("删除失败!", zap.Error(err))
response.FailWithMessage("删除失败", c)
} else {
@@ -75,15 +75,14 @@ func ({{.Abbreviation}}Api *{{.StructName}}Api) Delete{{.StructName}}(c *gin.Con
// @Security ApiKeyAuth
// @accept application/json
// @Produce application/json
-// @Param data body request.IdsReq true "批量删除{{.Description}}"
// @Success 200 {string} string "{"success":true,"data":{},"msg":"批量删除成功"}"
// @Router /{{.Abbreviation}}/delete{{.StructName}}ByIds [delete]
func ({{.Abbreviation}}Api *{{.StructName}}Api) Delete{{.StructName}}ByIds(c *gin.Context) {
- ids := c.QueryArray("ids[]")
+ {{.PrimaryField.FieldJson}}s := c.QueryArray("{{.PrimaryField.FieldJson}}s[]")
{{- if .AutoCreateResource }}
userID := utils.GetUserID(c)
{{- end }}
- if err := {{.Abbreviation}}Service.Delete{{.StructName}}ByIds(ids{{- if .AutoCreateResource }},userID{{- end }}); err != nil {
+ if err := {{.Abbreviation}}Service.Delete{{.StructName}}ByIds({{.PrimaryField.FieldJson}}s{{- if .AutoCreateResource }},userID{{- end }}); err != nil {
global.GVA_LOG.Error("批量删除失败!", zap.Error(err))
response.FailWithMessage("批量删除失败", c)
} else {
@@ -129,8 +128,8 @@ func ({{.Abbreviation}}Api *{{.StructName}}Api) Update{{.StructName}}(c *gin.Con
// @Success 200 {string} string "{"success":true,"data":{},"msg":"查询成功"}"
// @Router /{{.Abbreviation}}/find{{.StructName}} [get]
func ({{.Abbreviation}}Api *{{.StructName}}Api) Find{{.StructName}}(c *gin.Context) {
- id := c.Query("ID")
- if re{{.Abbreviation}}, err := {{.Abbreviation}}Service.Get{{.StructName}}(id); err != nil {
+ {{.PrimaryField.FieldJson}} := c.Query("{{.PrimaryField.FieldJson}}")
+ if re{{.Abbreviation}}, err := {{.Abbreviation}}Service.Get{{.StructName}}({{.PrimaryField.FieldJson}}); err != nil {
global.GVA_LOG.Error("查询失败!", zap.Error(err))
response.FailWithMessage("查询失败", c)
} else {
diff --git a/server/resource/autocode_template/server/model.go.tpl b/server/resource/autocode_template/server/model.go.tpl
index 0906b76a..6d4f5929 100644
--- a/server/resource/autocode_template/server/model.go.tpl
+++ b/server/resource/autocode_template/server/model.go.tpl
@@ -2,30 +2,33 @@
package {{.Package}}
import (
- "github.com/flipped-aurora/gin-vue-admin/server/global"
- {{ if .HasTimer }}"time"{{ end }}
+ {{ if .GvaModel }}"github.com/flipped-aurora/gin-vue-admin/server/global"{{ end }}
+ {{ if or .HasTimer }}"time"{{ end }}
{{ if .NeedJSON }}"gorm.io/datatypes"{{ end }}
)
// {{.Description}} 结构体 {{.StructName}}
type {{.StructName}} struct {
- global.GVA_MODEL {{- range .Fields}}
+{{ if .GvaModel }} global.GVA_MODEL {{ end }}
+ {{- range .Fields}}
{{- if eq .FieldType "enum" }}
- {{.FieldName}} string `json:"{{.FieldJson}}" form:"{{.FieldJson}}" gorm:"column:{{.ColumnName}};type:enum({{.DataTypeLong}});comment:{{.Comment}};" {{- if .Require -}}binding:"required"{{- end -}}`
+ {{.FieldName}} string `json:"{{.FieldJson}}" form:"{{.FieldJson}}" gorm:"{{- if .PrimaryKey -}}primarykey;{{- end -}}column:{{.ColumnName}};type:enum({{.DataTypeLong}});comment:{{.Comment}};" {{- if .Require }} binding:"required"{{- end -}}`
{{- else if eq .FieldType "picture" }}
- {{.FieldName}} string `json:"{{.FieldJson}}" form:"{{.FieldJson}}" gorm:"column:{{.ColumnName}};comment:{{.Comment}};{{- if .DataTypeLong -}}size:{{.DataTypeLong}};{{- end -}}" {{- if .Require -}}binding:"required"{{- end -}}`
+ {{.FieldName}} string `json:"{{.FieldJson}}" form:"{{.FieldJson}}" gorm:"{{- if .PrimaryKey -}}primarykey;{{- end -}}column:{{.ColumnName}};comment:{{.Comment}};{{- if .DataTypeLong -}}size:{{.DataTypeLong}};{{- end -}}" {{- if .Require }} binding:"required"{{- end -}}`
{{- else if eq .FieldType "video" }}
- {{.FieldName}} string `json:"{{.FieldJson}}" form:"{{.FieldJson}}" gorm:"column:{{.ColumnName}};comment:{{.Comment}};{{- if .DataTypeLong -}}size:{{.DataTypeLong}};{{- end -}}" {{- if .Require -}}binding:"required"{{- end -}}`
+ {{.FieldName}} string `json:"{{.FieldJson}}" form:"{{.FieldJson}}" gorm:"{{- if .PrimaryKey -}}primarykey;{{- end -}}column:{{.ColumnName}};comment:{{.Comment}};{{- if .DataTypeLong -}}size:{{.DataTypeLong}};{{- end -}}" {{- if .Require }} binding:"required"{{- end -}}`
{{- else if eq .FieldType "file" }}
- {{.FieldName}} datatypes.JSON `json:"{{.FieldJson}}" form:"{{.FieldJson}}" gorm:"column:{{.ColumnName}};comment:{{.Comment}};{{- if .DataTypeLong -}}size:{{.DataTypeLong}};{{- end -}}" {{- if .Require -}}binding:"required"{{- end -}}`
+ {{.FieldName}} datatypes.JSON `json:"{{.FieldJson}}" form:"{{.FieldJson}}" gorm:"{{- if .PrimaryKey -}}primarykey;{{- end -}}column:{{.ColumnName}};comment:{{.Comment}};{{- if .DataTypeLong -}}size:{{.DataTypeLong}};{{- end -}}" {{- if .Require }} binding:"required"{{- end -}}`
{{- else if eq .FieldType "pictures" }}
- {{.FieldName}} datatypes.JSON `json:"{{.FieldJson}}" form:"{{.FieldJson}}" gorm:"column:{{.ColumnName}};comment:{{.Comment}};{{- if .DataTypeLong -}}size:{{.DataTypeLong}};{{- end -}}" {{- if .Require -}}binding:"required"{{- end -}}`
+ {{.FieldName}} datatypes.JSON `json:"{{.FieldJson}}" form:"{{.FieldJson}}" gorm:"{{- if .PrimaryKey -}}primarykey;{{- end -}}column:{{.ColumnName}};comment:{{.Comment}};{{- if .DataTypeLong -}}size:{{.DataTypeLong}};{{- end -}}" {{- if .Require }} binding:"required"{{- end -}}`
{{- else if eq .FieldType "richtext" }}
- {{.FieldName}} string `json:"{{.FieldJson}}" form:"{{.FieldJson}}" gorm:"column:{{.ColumnName}};comment:{{.Comment}};{{- if .DataTypeLong -}}size:{{.DataTypeLong}};{{- end -}}type:text;" {{- if .Require -}}binding:"required"{{- end -}}`
+ {{.FieldName}} string `json:"{{.FieldJson}}" form:"{{.FieldJson}}" gorm:"{{- if .PrimaryKey -}}primarykey;{{- end -}}column:{{.ColumnName}};comment:{{.Comment}};{{- if .DataTypeLong -}}size:{{.DataTypeLong}};{{- end -}}type:text;" {{- if .Require }} binding:"required"{{- end -}}`
+ {{- else if eq .FieldType "json" }}
+ {{.FieldName}} datatypes.JSON `json:"{{.FieldJson}}" form:"{{.FieldJson}}" gorm:"{{- if .PrimaryKey -}}primarykey;{{- end -}}column:{{.ColumnName}};comment:{{.Comment}};{{- if .DataTypeLong -}}size:{{.DataTypeLong}};{{- end -}}type:text;" {{- if .Require }} binding:"required"{{- end -}}`
{{- else if ne .FieldType "string" }}
- {{.FieldName}} *{{.FieldType}} `json:"{{.FieldJson}}" form:"{{.FieldJson}}" gorm:"column:{{.ColumnName}};comment:{{.Comment}};{{- if .DataTypeLong -}}size:{{.DataTypeLong}};{{- end -}}" {{- if .Require -}}binding:"required"{{- end -}}`
+ {{.FieldName}} *{{.FieldType}} `json:"{{.FieldJson}}" form:"{{.FieldJson}}" gorm:"{{- if .PrimaryKey -}}primarykey;{{- end -}}column:{{.ColumnName}};comment:{{.Comment}};{{- if .DataTypeLong -}}size:{{.DataTypeLong}};{{- end -}}" {{- if .Require }} binding:"required"{{- end -}}`
{{- else }}
- {{.FieldName}} {{.FieldType}} `json:"{{.FieldJson}}" form:"{{.FieldJson}}" gorm:"column:{{.ColumnName}};comment:{{.Comment}};{{- if .DataTypeLong -}}size:{{.DataTypeLong}};{{- end -}}" {{- if .Require -}}binding:"required"{{- end -}}`
+ {{.FieldName}} {{.FieldType}} `json:"{{.FieldJson}}" form:"{{.FieldJson}}" gorm:"{{- if .PrimaryKey -}}primarykey;{{- end -}}column:{{.ColumnName}};comment:{{.Comment}};{{- if .DataTypeLong -}}size:{{.DataTypeLong}};{{- end -}}" {{- if .Require }} binding:"required"{{- end -}}`
{{- end }} {{ if .FieldDesc }}//{{.FieldDesc}} {{ end }} {{- end }}
{{- if .AutoCreateResource }}
CreatedBy uint `gorm:"column:created_by;comment:创建者"`
diff --git a/server/resource/autocode_template/server/request.go.tpl b/server/resource/autocode_template/server/request.go.tpl
index 6483a71b..7acd20ff 100644
--- a/server/resource/autocode_template/server/request.go.tpl
+++ b/server/resource/autocode_template/server/request.go.tpl
@@ -2,13 +2,15 @@ package request
import (
"github.com/flipped-aurora/gin-vue-admin/server/model/common/request"
- "time"
+ {{ if or .HasSearchTimer .GvaModel}}"time"{{ end }}
{{ if .NeedJSON }}"gorm.io/datatypes"{{ end }}
)
type {{.StructName}}Search struct{
- StartCreatedAt *time.Time `json:"startCreatedAt" form:"startCreatedAt"`
- EndCreatedAt *time.Time `json:"endCreatedAt" form:"endCreatedAt"`
+ {{ if .GvaModel }}
+ StartCreatedAt *time.Time `json:"startCreatedAt" form:"startCreatedAt"`
+ EndCreatedAt *time.Time `json:"endCreatedAt" form:"endCreatedAt"`
+ {{ end }}
{{- range .Fields}}
{{- if ne .FieldSearchType ""}}
{{- if eq .FieldSearchType "BETWEEN" "NOT BETWEEN"}}
diff --git a/server/resource/autocode_template/server/service.go.tpl b/server/resource/autocode_template/server/service.go.tpl
index a9708e6e..6cf5f2af 100644
--- a/server/resource/autocode_template/server/service.go.tpl
+++ b/server/resource/autocode_template/server/service.go.tpl
@@ -28,38 +28,38 @@ func ({{.Abbreviation}}Service *{{.StructName}}Service) Create{{.StructName}}({{
// Delete{{.StructName}} 删除{{.Description}}记录
// Author [piexlmax](https://github.com/piexlmax)
-func ({{.Abbreviation}}Service *{{.StructName}}Service)Delete{{.StructName}}(id string{{- if .AutoCreateResource -}},userID uint{{- end -}}) (err error) {
+func ({{.Abbreviation}}Service *{{.StructName}}Service)Delete{{.StructName}}({{.PrimaryField.FieldJson}} string{{- if .AutoCreateResource -}},userID uint{{- end -}}) (err error) {
{{- if .AutoCreateResource }}
err = {{$db}}.Transaction(func(tx *gorm.DB) error {
- if err := tx.Model(&{{.Package}}.{{.StructName}}{}).Where("id = ?", id).Update("deleted_by", userID).Error; err != nil {
+ if err := tx.Model(&{{.Package}}.{{.StructName}}{}).Where("{{.PrimaryField.ColumnName}} = ?", {{.PrimaryField.FieldJson}}).Update("deleted_by", userID).Error; err != nil {
return err
}
- if err = tx.Delete(&{{.Package}}.{{.StructName}}{},"id = ?",id).Error; err != nil {
+ if err = tx.Delete(&{{.Package}}.{{.StructName}}{},"{{.PrimaryField.ColumnName}} = ?",{{.PrimaryField.FieldJson}}).Error; err != nil {
return err
}
return nil
})
{{- else }}
- err = {{$db}}.Delete(&{{.Package}}.{{.StructName}}{},"id = ?",id).Error
+ err = {{$db}}.Delete(&{{.Package}}.{{.StructName}}{},"{{.PrimaryField.ColumnName}} = ?",{{.PrimaryField.FieldJson}}).Error
{{- end }}
return err
}
// Delete{{.StructName}}ByIds 批量删除{{.Description}}记录
// Author [piexlmax](https://github.com/piexlmax)
-func ({{.Abbreviation}}Service *{{.StructName}}Service)Delete{{.StructName}}ByIds(ids []string{{- if .AutoCreateResource }},deleted_by uint{{- end}}) (err error) {
+func ({{.Abbreviation}}Service *{{.StructName}}Service)Delete{{.StructName}}ByIds({{.PrimaryField.FieldJson}}s []string {{- if .AutoCreateResource }},deleted_by uint{{- end}}) (err error) {
{{- if .AutoCreateResource }}
err = {{$db}}.Transaction(func(tx *gorm.DB) error {
- if err := tx.Model(&{{.Package}}.{{.StructName}}{}).Where("id in ?", ids).Update("deleted_by", deleted_by).Error; err != nil {
+ if err := tx.Model(&{{.Package}}.{{.StructName}}{}).Where("{{.PrimaryField.ColumnName}} in ?", {{.PrimaryField.FieldJson}}s).Update("deleted_by", deleted_by).Error; err != nil {
return err
}
- if err := tx.Where("id in ?", ids).Delete(&{{.Package}}.{{.StructName}}{}).Error; err != nil {
+ if err := tx.Where("{{.PrimaryField.ColumnName}} in ?", {{.PrimaryField.FieldJson}}s).Delete(&{{.Package}}.{{.StructName}}{}).Error; err != nil {
return err
}
return nil
})
{{- else}}
- err = {{$db}}.Delete(&[]{{.Package}}.{{.StructName}}{},"id in ?",ids).Error
+ err = {{$db}}.Delete(&[]{{.Package}}.{{.StructName}}{},"{{.PrimaryField.ColumnName}} in ?",{{.PrimaryField.FieldJson}}s).Error
{{- end}}
return err
}
@@ -71,10 +71,10 @@ func ({{.Abbreviation}}Service *{{.StructName}}Service)Update{{.StructName}}({{.
return err
}
-// Get{{.StructName}} 根据id获取{{.Description}}记录
+// Get{{.StructName}} 根据{{.PrimaryField.FieldJson}}获取{{.Description}}记录
// Author [piexlmax](https://github.com/piexlmax)
-func ({{.Abbreviation}}Service *{{.StructName}}Service)Get{{.StructName}}(id string) ({{.Abbreviation}} {{.Package}}.{{.StructName}}, err error) {
- err = {{$db}}.Where("id = ?", id).First(&{{.Abbreviation}}).Error
+func ({{.Abbreviation}}Service *{{.StructName}}Service)Get{{.StructName}}({{.PrimaryField.FieldJson}} string) ({{.Abbreviation}} {{.Package}}.{{.StructName}}, err error) {
+ err = {{$db}}.Where("{{.PrimaryField.ColumnName}} = ?", {{.PrimaryField.FieldJson}}).First(&{{.Abbreviation}}).Error
return
}
@@ -87,9 +87,11 @@ func ({{.Abbreviation}}Service *{{.StructName}}Service)Get{{.StructName}}InfoLis
db := {{$db}}.Model(&{{.Package}}.{{.StructName}}{})
var {{.Abbreviation}}s []{{.Package}}.{{.StructName}}
// 如果有条件搜索 下方会自动创建搜索语句
+{{- if .GvaModel }}
if info.StartCreatedAt !=nil && info.EndCreatedAt !=nil {
db = db.Where("created_at BETWEEN ? AND ?", info.StartCreatedAt, info.EndCreatedAt)
}
+{{- end }}
{{- range .Fields}}
{{- if .FieldSearchType}}
{{- if or (eq .FieldType "string") (eq .FieldType "enum") (eq .FieldType "picture") (eq .FieldType "video") (eq .FieldType "richtext") }}
diff --git a/server/resource/autocode_template/web/form.vue.tpl b/server/resource/autocode_template/web/form.vue.tpl
index ed228741..9510e21c 100644
--- a/server/resource/autocode_template/web/form.vue.tpl
+++ b/server/resource/autocode_template/web/form.vue.tpl
@@ -8,7 +8,13 @@
确定要删除吗?
-确定要删除吗?
-确定要删除吗?
-{{ fmtBody(scope.row.body) }}
@@ -161,7 +138,6 @@
{{ fmtBody(scope.row.resp) }}
@@ -179,32 +155,12 @@
label="操作"
>
- 确定要删除吗?
-确定要删除此用户吗
-