Skip to content

Commit a494b46

Browse files
奇淼(piexlmaxbypanghu
andauthored
增加必填校验 提升casbin版本 (flipped-aurora#1170)
* 添加rule检测 * 调整初始化顺序,防止在数据库创建错误的时候,修改了配置文件。 * (feat):自动生产代码新增校验 * 增加校验功能 升级casbin Co-authored-by: bypanghu <bypanghu@163.com>
1 parent 84ef7fb commit a494b46

File tree

17 files changed

+626
-369
lines changed

17 files changed

+626
-369
lines changed

server/go.mod

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@ require (
77
github.com/aliyun/aliyun-oss-go-sdk v2.1.6+incompatible
88
github.com/aws/aws-sdk-go v1.42.27
99
github.com/baiyubin/aliyun-sts-go-sdk v0.0.0-20180326062324-cfa1a18b161f // indirect
10-
github.com/casbin/casbin/v2 v2.11.0
11-
github.com/casbin/gorm-adapter/v3 v3.0.2
10+
github.com/casbin/casbin/v2 v2.51.0
11+
github.com/casbin/gorm-adapter/v3 v3.7.3
1212
github.com/flipped-aurora/ws v1.0.2
1313
github.com/fsnotify/fsnotify v1.4.9
1414
github.com/fvbock/endless v0.0.0-20170109170031-447134032cb6
@@ -17,11 +17,10 @@ require (
1717
github.com/go-openapi/spec v0.20.3 // indirect
1818
github.com/go-openapi/swag v0.19.15 // indirect
1919
github.com/go-redis/redis/v8 v8.11.0
20-
github.com/go-sql-driver/mysql v1.5.0
20+
github.com/go-sql-driver/mysql v1.6.0
2121
github.com/golang-jwt/jwt/v4 v4.3.0
2222
github.com/gookit/color v1.3.1
2323
github.com/huaweicloud/huaweicloud-sdk-go-obs v3.21.8+incompatible
24-
github.com/jackc/pgx/v4 v4.15.0 // indirect
2524
github.com/jordan-wright/email v0.0.0-20200824153738-3f5bafa1cd84
2625
github.com/json-iterator/go v1.1.10 // indirect
2726
github.com/lestrrat-go/file-rotatelogs v2.4.0+incompatible
@@ -49,13 +48,13 @@ require (
4948
github.com/unrolled/secure v1.0.7
5049
github.com/xuri/excelize/v2 v2.4.1
5150
go.uber.org/zap v1.16.0
52-
golang.org/x/crypto v0.0.0-20220213190939-1e6e3497d506
51+
golang.org/x/crypto v0.0.0-20220411220226-7b82a4e95df4
5352
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c
5453
golang.org/x/text v0.3.7
5554
golang.org/x/tools v0.1.5 // indirect
5655
gopkg.in/ini.v1 v1.55.0 // indirect
57-
gorm.io/driver/mysql v1.0.1
58-
gorm.io/driver/postgres v1.2.3
59-
gorm.io/gorm v1.22.5
56+
gorm.io/driver/mysql v1.3.3
57+
gorm.io/driver/postgres v1.3.4
58+
gorm.io/gorm v1.23.4
6059
nhooyr.io/websocket v1.8.6
6160
)

server/go.sum

Lines changed: 203 additions & 61 deletions
Large diffs are not rendered by default.

server/model/system/sys_auto_code.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ type AutoCodeStruct struct {
2222
DictTypes []string `json:"-"`
2323
Package string `json:"package"`
2424
PackageT string `json:"-"`
25+
NeedValid bool `json:"-"`
2526
}
2627

2728
func (a *AutoCodeStruct) Pretreatment() {
@@ -55,6 +56,9 @@ type Field struct {
5556
ColumnName string `json:"columnName"` // 数据库字段
5657
FieldSearchType string `json:"fieldSearchType"` // 搜索条件
5758
DictType string `json:"dictType"` // 字典
59+
Require bool `json:"require"` // 是否必填
60+
ErrorText string `json:"errorText"` // 校验失败文字
61+
Clearable bool `json:"clearable"` // 是否可清空
5862
}
5963

6064
var AutoMoveErr error = errors.New("创建代码成功并移动文件成功")

server/resource/autocode_template/server/api.go.tpl

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,9 @@ import (
99
"github.com/flipped-aurora/gin-vue-admin/server/service"
1010
"github.com/gin-gonic/gin"
1111
"go.uber.org/zap"
12+
{{- if .NeedValid }}
13+
"github.com/flipped-aurora/gin-vue-admin/server/utils"
14+
{{- end }}
1215
)
1316

1417
type {{.StructName}}Api struct {
@@ -29,6 +32,19 @@ var {{.Abbreviation}}Service = service.ServiceGroupApp.{{.PackageT}}ServiceGroup
2932
func ({{.Abbreviation}}Api *{{.StructName}}Api) Create{{.StructName}}(c *gin.Context) {
3033
var {{.Abbreviation}} {{.Package}}.{{.StructName}}
3134
_ = c.ShouldBindJSON(&{{.Abbreviation}})
35+
{{- if .NeedValid }}
36+
verify := utils.Rules{
37+
{{- range $index,$element := .Fields }}
38+
{{- if $element.Require }}
39+
"{{$element.FieldName}}":{utils.NotEmpty()},
40+
{{- end }}
41+
{{- end }}
42+
}
43+
if err := utils.Verify({{.Abbreviation}}, verify); err != nil {
44+
response.FailWithMessage(err.Error(), c)
45+
return
46+
}
47+
{{- end }}
3248
if err := {{.Abbreviation}}Service.Create{{.StructName}}({{.Abbreviation}}); err != nil {
3349
global.GVA_LOG.Error("创建失败!", zap.Error(err))
3450
response.FailWithMessage("创建失败", c)
@@ -89,6 +105,19 @@ func ({{.Abbreviation}}Api *{{.StructName}}Api) Delete{{.StructName}}ByIds(c *gi
89105
func ({{.Abbreviation}}Api *{{.StructName}}Api) Update{{.StructName}}(c *gin.Context) {
90106
var {{.Abbreviation}} {{.Package}}.{{.StructName}}
91107
_ = c.ShouldBindJSON(&{{.Abbreviation}})
108+
{{- if .NeedValid }}
109+
verify := utils.Rules{
110+
{{- range $index,$element := .Fields }}
111+
{{- if $element.Require }}
112+
"{{$element.FieldName}}":{utils.NotEmpty()},
113+
{{- end }}
114+
{{- end }}
115+
}
116+
if err := utils.Verify({{.Abbreviation}}, verify); err != nil {
117+
response.FailWithMessage(err.Error(), c)
118+
return
119+
}
120+
{{- end }}
92121
if err := {{.Abbreviation}}Service.Update{{.StructName}}({{.Abbreviation}}); err != nil {
93122
global.GVA_LOG.Error("更新失败!", zap.Error(err))
94123
response.FailWithMessage("更新失败", c)

server/resource/autocode_template/web/form.vue.tpl

Lines changed: 60 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,32 @@
11
<template>
22
<div>
33
<div class="gva-form-box">
4-
<el-form :model="formData" label-position="right" label-width="80px">
4+
<el-form :model="formData" ref="elFormRef" label-position="right" :rules="rule" label-width="80px">
55
{{- range .Fields}}
6-
<el-form-item label="{{.FieldDesc}}:">
6+
<el-form-item label="{{.FieldDesc}}:" prop="{{.FieldJson}}">
77
{{- if eq .FieldType "bool" }}
88
<el-switch v-model="formData.{{.FieldJson}}" active-color="#13ce66" inactive-color="#ff4949" active-text="" inactive-text="" clearable ></el-switch>
99
{{- end }}
1010
{{- if eq .FieldType "string" }}
11-
<el-input v-model="formData.{{.FieldJson}}" clearable placeholder="请输入" />
11+
<el-input v-model="formData.{{.FieldJson}}" :clearable="{{.Clearable}}" placeholder="请输入" />
1212
{{- end }}
1313
{{- if eq .FieldType "int" }}
1414
{{- if .DictType }}
15-
<el-select v-model="formData.{{ .FieldJson }}" placeholder="请选择" clearable>
15+
<el-select v-model="formData.{{ .FieldJson }}" placeholder="请选择" :clearable="{{.Clearable}}">
1616
<el-option v-for="(item,key) in {{ .DictType }}Options" :key="key" :label="item.label" :value="item.value" />
1717
</el-select>
1818
{{- else }}
19-
<el-input v-model.number="formData.{{ .FieldJson }}" clearable placeholder="请输入" />
19+
<el-input v-model.number="formData.{{ .FieldJson }}" :clearable="{{.Clearable}}" placeholder="请输入" />
2020
{{- end }}
2121
{{- end }}
2222
{{- if eq .FieldType "time.Time" }}
23-
<el-date-picker v-model="formData.{{ .FieldJson }}" type="date" placeholder="选择日期" clearable></el-date-picker>
23+
<el-date-picker v-model="formData.{{ .FieldJson }}" type="date" placeholder="选择日期" :clearable="{{.Clearable}}"></el-date-picker>
2424
{{- end }}
2525
{{- if eq .FieldType "float64" }}
26-
<el-input-number v-model="formData.{{ .FieldJson }}" :precision="2" clearable></el-input-number>
26+
<el-input-number v-model="formData.{{ .FieldJson }}" :precision="2" :clearable="{{.Clearable}}"></el-input-number>
2727
{{- end }}
2828
{{- if eq .FieldType "enum" }}
29-
<el-select v-model="formData.{{ .FieldJson }}" placeholder="请选择" style="width:100%" clearable>
29+
<el-select v-model="formData.{{ .FieldJson }}" placeholder="请选择" style="width:100%" :clearable="{{.Clearable}}">
3030
<el-option v-for="item in [{{ .DataTypeLong }}]" :key="item" :label="item" :value="item" />
3131
</el-select>
3232
{{- end }}
@@ -58,32 +58,47 @@ import {
5858
import { getDictFunc } from '@/utils/format'
5959
import { useRoute, useRouter } from "vue-router"
6060
import { ElMessage } from 'element-plus'
61-
import { ref } from 'vue'
61+
import { ref, reactive } from 'vue'
6262
const route = useRoute()
6363
const router = useRouter()
64+
6465
const type = ref('')
6566
{{- range $index, $element := .DictTypes}}
6667
const {{ $element }}Options = ref([])
6768
{{- end }}
6869
const formData = ref({
6970
{{- range .Fields}}
70-
{{- if eq .FieldType "bool" }}
71-
{{.FieldJson}}: false,
72-
{{- end }}
73-
{{- if eq .FieldType "string" }}
74-
{{.FieldJson}}: '',
75-
{{- end }}
76-
{{- if eq .FieldType "int" }}
77-
{{.FieldJson}}: {{- if .DictType }} undefined{{ else }} 0{{- end }},
78-
{{- end }}
79-
{{- if eq .FieldType "time.Time" }}
80-
{{.FieldJson}}: new Date(),
81-
{{- end }}
82-
{{- if eq .FieldType "float64" }}
83-
{{.FieldJson}}: 0,
84-
{{- end }}
71+
{{- if eq .FieldType "bool" }}
72+
{{.FieldJson}}: false,
73+
{{- end }}
74+
{{- if eq .FieldType "string" }}
75+
{{.FieldJson}}: '',
76+
{{- end }}
77+
{{- if eq .FieldType "int" }}
78+
{{.FieldJson}}: {{- if .DictType }} undefined{{ else }} 0{{- end }},
79+
{{- end }}
80+
{{- if eq .FieldType "time.Time" }}
81+
{{.FieldJson}}: new Date(),
82+
{{- end }}
83+
{{- if eq .FieldType "float64" }}
84+
{{.FieldJson}}: 0,
85+
{{- end }}
8586
{{- end }}
8687
})
88+
// 验证规则
89+
const rule = reactive({
90+
{{- range .Fields }}
91+
{{- if eq .Require true }}
92+
{{.FieldJson }} : [{
93+
required: true,
94+
message: '{{ .ErrorText }}',
95+
trigger: ['input','blur'],
96+
}],
97+
{{- end }}
98+
{{- end }}
99+
})
100+
101+
const elFormRef = ref()
87102
88103
// 初始化方法
89104
const init = async () => {
@@ -105,24 +120,27 @@ const init = async () => {
105120
init()
106121
// 保存按钮
107122
const save = async() => {
108-
let res
109-
switch (type.value) {
110-
case 'create':
111-
res = await create{{.StructName}}(formData.value)
112-
break
113-
case 'update':
114-
res = await update{{.StructName}}(formData.value)
115-
break
116-
default:
117-
res = await create{{.StructName}}(formData.value)
118-
break
119-
}
120-
if (res.code === 0) {
121-
ElMessage({
122-
type: 'success',
123-
message: '创建/更改成功'
124-
})
125-
}
123+
elFormRef.value?.validate( async (valid) => {
124+
if (!valid) return
125+
let res
126+
switch (type.value) {
127+
case 'create':
128+
res = await create{{.StructName}}(formData.value)
129+
break
130+
case 'update':
131+
res = await update{{.StructName}}(formData.value)
132+
break
133+
default:
134+
res = await create{{.StructName}}(formData.value)
135+
break
136+
}
137+
if (res.code === 0) {
138+
ElMessage({
139+
type: 'success',
140+
message: '创建/更改成功'
141+
})
142+
}
143+
})
126144
}
127145
128146
// 返回按钮

server/resource/autocode_template/web/table.vue.tpl

Lines changed: 48 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -93,32 +93,32 @@
9393
</div>
9494
</div>
9595
<el-dialog v-model="dialogFormVisible" :before-close="closeDialog" title="弹窗操作">
96-
<el-form :model="formData" label-position="right" label-width="80px">
96+
<el-form :model="formData" label-position="right" ref="elFormRef" :rules="rule" label-width="80px">
9797
{{- range .Fields}}
98-
<el-form-item label="{{.FieldDesc}}:">
98+
<el-form-item label="{{.FieldDesc}}:" prop="{{.FieldJson}}" >
9999
{{- if eq .FieldType "bool" }}
100100
<el-switch v-model="formData.{{.FieldJson}}" active-color="#13ce66" inactive-color="#ff4949" active-text="" inactive-text="" clearable ></el-switch>
101101
{{- end }}
102102
{{- if eq .FieldType "string" }}
103-
<el-input v-model="formData.{{.FieldJson}}" clearable placeholder="请输入" />
103+
<el-input v-model="formData.{{.FieldJson}}" :clearable="{{.Clearable}}" placeholder="请输入" />
104104
{{- end }}
105105
{{- if eq .FieldType "int" }}
106106
{{- if .DictType}}
107-
<el-select v-model="formData.{{ .FieldJson }}" placeholder="请选择" style="width:100%" clearable>
107+
<el-select v-model="formData.{{ .FieldJson }}" placeholder="请选择" style="width:100%" :clearable="{{.Clearable}}" >
108108
<el-option v-for="(item,key) in {{ .DictType }}Options" :key="key" :label="item.label" :value="item.value" />
109109
</el-select>
110110
{{- else }}
111-
<el-input v-model.number="formData.{{ .FieldJson }}" clearable placeholder="请输入" />
111+
<el-input v-model.number="formData.{{ .FieldJson }}" :clearable="{{.Clearable}}" placeholder="请输入" />
112112
{{- end }}
113113
{{- end }}
114114
{{- if eq .FieldType "time.Time" }}
115-
<el-date-picker v-model="formData.{{ .FieldJson }}" type="date" style="width:100%" placeholder="选择日期" clearable />
115+
<el-date-picker v-model="formData.{{ .FieldJson }}" type="date" style="width:100%" placeholder="选择日期" :clearable="{{.Clearable}}" />
116116
{{- end }}
117117
{{- if eq .FieldType "float64" }}
118-
<el-input-number v-model="formData.{{ .FieldJson }}" style="width:100%" :precision="2" clearable />
118+
<el-input-number v-model="formData.{{ .FieldJson }}" style="width:100%" :precision="2" :clearable="{{.Clearable}}" />
119119
{{- end }}
120120
{{- if eq .FieldType "enum" }}
121-
<el-select v-model="formData.{{ .FieldJson }}" placeholder="请选择" style="width:100%" clearable>
121+
<el-select v-model="formData.{{ .FieldJson }}" placeholder="请选择" style="width:100%" :clearable="{{.Clearable}}" >
122122
<el-option v-for="item in [{{.DataTypeLong}}]" :key="item" :label="item" :value="item" />
123123
</el-select>
124124
{{- end }}
@@ -154,7 +154,7 @@ import {
154154
// 全量引入格式化工具 请按需保留
155155
import { getDictFunc, formatDate, formatBoolean, filterDict } from '@/utils/format'
156156
import { ElMessage, ElMessageBox } from 'element-plus'
157-
import { ref } from 'vue'
157+
import { ref, reactive } from 'vue'
158158
159159
// 自动化生成的字典(可能为空)以及字段
160160
{{- range $index, $element := .DictTypes}}
@@ -180,6 +180,22 @@ const formData = ref({
180180
{{- end }}
181181
})
182182
183+
// 验证规则
184+
const rule = reactive({
185+
{{- range .Fields }}
186+
{{- if eq .Require true }}
187+
{{.FieldJson }} : [{
188+
required: true,
189+
message: '{{ .ErrorText }}',
190+
trigger: ['input','blur'],
191+
}],
192+
{{- end }}
193+
{{- end }}
194+
})
195+
196+
const elFormRef = ref()
197+
198+
183199
// =========== 表格控制部分 ===========
184200
const page = ref(1)
185201
const total = ref(0)
@@ -354,26 +370,29 @@ const closeDialog = () => {
354370
}
355371
// 弹窗确定
356372
const enterDialog = async () => {
357-
let res
358-
switch (type.value) {
359-
case 'create':
360-
res = await create{{.StructName}}(formData.value)
361-
break
362-
case 'update':
363-
res = await update{{.StructName}}(formData.value)
364-
break
365-
default:
366-
res = await create{{.StructName}}(formData.value)
367-
break
368-
}
369-
if (res.code === 0) {
370-
ElMessage({
371-
type: 'success',
372-
message: '创建/更改成功'
373-
})
374-
closeDialog()
375-
getTableData()
376-
}
373+
elFormRef.value?.validate( async (valid) => {
374+
if (!valid) return
375+
let res
376+
switch (type.value) {
377+
case 'create':
378+
res = await create{{.StructName}}(formData.value)
379+
break
380+
case 'update':
381+
res = await update{{.StructName}}(formData.value)
382+
break
383+
default:
384+
res = await create{{.StructName}}(formData.value)
385+
break
386+
}
387+
if (res.code === 0) {
388+
ElMessage({
389+
type: 'success',
390+
message: '创建/更改成功'
391+
})
392+
closeDialog()
393+
getTableData()
394+
}
395+
})
377396
}
378397
</script>
379398

0 commit comments

Comments
 (0)