Compare commits
No commits in common. "main" and "v1.0.00016" have entirely different histories.
main
...
v1.0.00016
|
|
@ -1,461 +0,0 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<project version="4">
|
|
||||||
<component name="GoORMHelperCache">
|
|
||||||
<option name="schemaMapping">
|
|
||||||
<map>
|
|
||||||
<entry key="Api">
|
|
||||||
<value>
|
|
||||||
<set>
|
|
||||||
<option value="file://$PROJECT_DIR$/response/code.go" />
|
|
||||||
</set>
|
|
||||||
</value>
|
|
||||||
</entry>
|
|
||||||
<entry key="BaseConfig">
|
|
||||||
<value>
|
|
||||||
<set>
|
|
||||||
<option value="file://$PROJECT_DIR$/config/structs.go" />
|
|
||||||
</set>
|
|
||||||
</value>
|
|
||||||
</entry>
|
|
||||||
<entry key="Client">
|
|
||||||
<value>
|
|
||||||
<set>
|
|
||||||
<option value="file://$PROJECT_DIR$/mqtt/client/mqtt.go" />
|
|
||||||
</set>
|
|
||||||
</value>
|
|
||||||
</entry>
|
|
||||||
<entry key="Config">
|
|
||||||
<value>
|
|
||||||
<set>
|
|
||||||
<option value="file://$PROJECT_DIR$/ws/websocket.go" />
|
|
||||||
</set>
|
|
||||||
</value>
|
|
||||||
</entry>
|
|
||||||
<entry key="Connection">
|
|
||||||
<value>
|
|
||||||
<set>
|
|
||||||
<option value="file://$PROJECT_DIR$/ws/websocket.go" />
|
|
||||||
</set>
|
|
||||||
</value>
|
|
||||||
</entry>
|
|
||||||
<entry key="ConnectionPool">
|
|
||||||
<value>
|
|
||||||
<set>
|
|
||||||
<option value="file://$PROJECT_DIR$/tcp/tcp.go" />
|
|
||||||
</set>
|
|
||||||
</value>
|
|
||||||
</entry>
|
|
||||||
<entry key="Curd">
|
|
||||||
<value>
|
|
||||||
<set>
|
|
||||||
<option value="file://$PROJECT_DIR$/curd/curd.go" />
|
|
||||||
</set>
|
|
||||||
</value>
|
|
||||||
</entry>
|
|
||||||
<entry key="DataBaseConfig">
|
|
||||||
<value>
|
|
||||||
<set>
|
|
||||||
<option value="file://$PROJECT_DIR$/config/structs.go" />
|
|
||||||
</set>
|
|
||||||
</value>
|
|
||||||
</entry>
|
|
||||||
<entry key="JWTClaims">
|
|
||||||
<value>
|
|
||||||
<set>
|
|
||||||
<option value="file://$PROJECT_DIR$/utils/jwt.go" />
|
|
||||||
</set>
|
|
||||||
</value>
|
|
||||||
</entry>
|
|
||||||
<entry key="JwtConfig">
|
|
||||||
<value>
|
|
||||||
<set>
|
|
||||||
<option value="file://$PROJECT_DIR$/config/structs.go" />
|
|
||||||
</set>
|
|
||||||
</value>
|
|
||||||
</entry>
|
|
||||||
<entry key="Manager">
|
|
||||||
<value>
|
|
||||||
<set>
|
|
||||||
<option value="file://$PROJECT_DIR$/ws/websocket.go" />
|
|
||||||
</set>
|
|
||||||
</value>
|
|
||||||
</entry>
|
|
||||||
<entry key="Msg">
|
|
||||||
<value>
|
|
||||||
<set>
|
|
||||||
<option value="file://$PROJECT_DIR$/ws/websocket.go" />
|
|
||||||
</set>
|
|
||||||
</value>
|
|
||||||
</entry>
|
|
||||||
<entry key="NewsOne">
|
|
||||||
<value>
|
|
||||||
<set>
|
|
||||||
<option value="file://$PROJECT_DIR$/../gin_test/api/new.go" />
|
|
||||||
<option value="file://$PROJECT_DIR$/../gin_test/req/new.go" />
|
|
||||||
</set>
|
|
||||||
</value>
|
|
||||||
</entry>
|
|
||||||
<entry key="NewsSave">
|
|
||||||
<value>
|
|
||||||
<set>
|
|
||||||
<option value="file://$PROJECT_DIR$/../gin_test/api/new.go" />
|
|
||||||
<option value="file://$PROJECT_DIR$/../gin_test/req/new.go" />
|
|
||||||
</set>
|
|
||||||
</value>
|
|
||||||
</entry>
|
|
||||||
<entry key="Paginate">
|
|
||||||
<value>
|
|
||||||
<set>
|
|
||||||
<option value="file://$PROJECT_DIR$/curd/curd.go" />
|
|
||||||
</set>
|
|
||||||
</value>
|
|
||||||
</entry>
|
|
||||||
<entry key="ServerConfig">
|
|
||||||
<value>
|
|
||||||
<set>
|
|
||||||
<option value="file://$PROJECT_DIR$/config/structs.go" />
|
|
||||||
</set>
|
|
||||||
</value>
|
|
||||||
</entry>
|
|
||||||
<entry key="TCPServer">
|
|
||||||
<value>
|
|
||||||
<set>
|
|
||||||
<option value="file://$PROJECT_DIR$/tcp/tcp.go" />
|
|
||||||
</set>
|
|
||||||
</value>
|
|
||||||
</entry>
|
|
||||||
<entry key="TcpConnection">
|
|
||||||
<value>
|
|
||||||
<set>
|
|
||||||
<option value="file://$PROJECT_DIR$/tcp/tcpConfig.go" />
|
|
||||||
</set>
|
|
||||||
</value>
|
|
||||||
</entry>
|
|
||||||
<entry key="TcpMessage">
|
|
||||||
<value>
|
|
||||||
<set>
|
|
||||||
<option value="file://$PROJECT_DIR$/tcp/tcpConfig.go" />
|
|
||||||
</set>
|
|
||||||
</value>
|
|
||||||
</entry>
|
|
||||||
<entry key="TcpPoolConfig">
|
|
||||||
<value>
|
|
||||||
<set>
|
|
||||||
<option value="file://$PROJECT_DIR$/tcp/tcpConfig.go" />
|
|
||||||
</set>
|
|
||||||
</value>
|
|
||||||
</entry>
|
|
||||||
<entry key="response">
|
|
||||||
<value>
|
|
||||||
<set>
|
|
||||||
<option value="file://$PROJECT_DIR$/response/code.go" />
|
|
||||||
</set>
|
|
||||||
</value>
|
|
||||||
</entry>
|
|
||||||
</map>
|
|
||||||
</option>
|
|
||||||
<option name="scannedPathMapping">
|
|
||||||
<map>
|
|
||||||
<entry key="file://$PROJECT_DIR$/config/fun.go">
|
|
||||||
<value>
|
|
||||||
<ScannedPath>
|
|
||||||
<option name="lastModified" value="1770100625919" />
|
|
||||||
</ScannedPath>
|
|
||||||
</value>
|
|
||||||
</entry>
|
|
||||||
<entry key="file://$PROJECT_DIR$/config/index.go">
|
|
||||||
<value>
|
|
||||||
<ScannedPath>
|
|
||||||
<option name="lastModified" value="1770011355476" />
|
|
||||||
</ScannedPath>
|
|
||||||
</value>
|
|
||||||
</entry>
|
|
||||||
<entry key="file://$PROJECT_DIR$/config/structs.go">
|
|
||||||
<value>
|
|
||||||
<ScannedPath>
|
|
||||||
<option name="lastModified" value="1770022381063" />
|
|
||||||
<option name="schema">
|
|
||||||
<list>
|
|
||||||
<option value="BaseConfig" />
|
|
||||||
<option value="ServerConfig" />
|
|
||||||
<option value="DataBaseConfig" />
|
|
||||||
<option value="JwtConfig" />
|
|
||||||
</list>
|
|
||||||
</option>
|
|
||||||
</ScannedPath>
|
|
||||||
</value>
|
|
||||||
</entry>
|
|
||||||
<entry key="file://$PROJECT_DIR$/curd/curd.go">
|
|
||||||
<value>
|
|
||||||
<ScannedPath>
|
|
||||||
<option name="lastModified" value="1770102564408" />
|
|
||||||
<option name="schema">
|
|
||||||
<list>
|
|
||||||
<option value="Paginate" />
|
|
||||||
<option value="Curd" />
|
|
||||||
</list>
|
|
||||||
</option>
|
|
||||||
</ScannedPath>
|
|
||||||
</value>
|
|
||||||
</entry>
|
|
||||||
<entry key="file://$PROJECT_DIR$/database/database.go">
|
|
||||||
<value>
|
|
||||||
<ScannedPath>
|
|
||||||
<option name="lastModified" value="1770258641711" />
|
|
||||||
</ScannedPath>
|
|
||||||
</value>
|
|
||||||
</entry>
|
|
||||||
<entry key="file://$PROJECT_DIR$/database/index.go">
|
|
||||||
<value>
|
|
||||||
<ScannedPath>
|
|
||||||
<option name="lastModified" value="1770025447924" />
|
|
||||||
</ScannedPath>
|
|
||||||
</value>
|
|
||||||
</entry>
|
|
||||||
<entry key="file://$PROJECT_DIR$/database/migrate.go">
|
|
||||||
<value>
|
|
||||||
<ScannedPath>
|
|
||||||
<option name="lastModified" value="1770101088203" />
|
|
||||||
</ScannedPath>
|
|
||||||
</value>
|
|
||||||
</entry>
|
|
||||||
<entry key="file://$PROJECT_DIR$/log/index.go">
|
|
||||||
<value>
|
|
||||||
<ScannedPath>
|
|
||||||
<option name="lastModified" value="1770011347706" />
|
|
||||||
</ScannedPath>
|
|
||||||
</value>
|
|
||||||
</entry>
|
|
||||||
<entry key="file://$PROJECT_DIR$/log/log.go">
|
|
||||||
<value>
|
|
||||||
<ScannedPath>
|
|
||||||
<option name="lastModified" value="1770011076335" />
|
|
||||||
</ScannedPath>
|
|
||||||
</value>
|
|
||||||
</entry>
|
|
||||||
<entry key="file://$PROJECT_DIR$/main.go">
|
|
||||||
<value>
|
|
||||||
<ScannedPath>
|
|
||||||
<option name="lastModified" value="1770025551953" />
|
|
||||||
</ScannedPath>
|
|
||||||
</value>
|
|
||||||
</entry>
|
|
||||||
<entry key="file://$PROJECT_DIR$/middleware/middleware.go">
|
|
||||||
<value>
|
|
||||||
<ScannedPath>
|
|
||||||
<option name="lastModified" value="1770108038945" />
|
|
||||||
</ScannedPath>
|
|
||||||
</value>
|
|
||||||
</entry>
|
|
||||||
<entry key="file://$PROJECT_DIR$/mqtt/client/mqtt.go">
|
|
||||||
<value>
|
|
||||||
<ScannedPath>
|
|
||||||
<option name="lastModified" value="1770025698340" />
|
|
||||||
<option name="schema">
|
|
||||||
<list>
|
|
||||||
<option value="Client" />
|
|
||||||
</list>
|
|
||||||
</option>
|
|
||||||
</ScannedPath>
|
|
||||||
</value>
|
|
||||||
</entry>
|
|
||||||
<entry key="file://$PROJECT_DIR$/response/code.go">
|
|
||||||
<value>
|
|
||||||
<ScannedPath>
|
|
||||||
<option name="lastModified" value="1770014431840" />
|
|
||||||
<option name="schema">
|
|
||||||
<list>
|
|
||||||
<option value="response" />
|
|
||||||
<option value="Api" />
|
|
||||||
</list>
|
|
||||||
</option>
|
|
||||||
</ScannedPath>
|
|
||||||
</value>
|
|
||||||
</entry>
|
|
||||||
<entry key="file://$PROJECT_DIR$/server/server.go">
|
|
||||||
<value>
|
|
||||||
<ScannedPath>
|
|
||||||
<option name="lastModified" value="1770026239951" />
|
|
||||||
</ScannedPath>
|
|
||||||
</value>
|
|
||||||
</entry>
|
|
||||||
<entry key="file://$PROJECT_DIR$/tcp/example.go">
|
|
||||||
<value>
|
|
||||||
<ScannedPath>
|
|
||||||
<option name="lastModified" value="1770025697304" />
|
|
||||||
</ScannedPath>
|
|
||||||
</value>
|
|
||||||
</entry>
|
|
||||||
<entry key="file://$PROJECT_DIR$/tcp/tcp.go">
|
|
||||||
<value>
|
|
||||||
<ScannedPath>
|
|
||||||
<option name="lastModified" value="1770025697304" />
|
|
||||||
<option name="schema">
|
|
||||||
<list>
|
|
||||||
<option value="TCPServer" />
|
|
||||||
<option value="ConnectionPool" />
|
|
||||||
</list>
|
|
||||||
</option>
|
|
||||||
</ScannedPath>
|
|
||||||
</value>
|
|
||||||
</entry>
|
|
||||||
<entry key="file://$PROJECT_DIR$/tcp/tcpConfig.go">
|
|
||||||
<value>
|
|
||||||
<ScannedPath>
|
|
||||||
<option name="lastModified" value="1770025697304" />
|
|
||||||
<option name="schema">
|
|
||||||
<list>
|
|
||||||
<option value="TcpPoolConfig" />
|
|
||||||
<option value="TcpConnection" />
|
|
||||||
<option value="TcpMessage" />
|
|
||||||
</list>
|
|
||||||
</option>
|
|
||||||
</ScannedPath>
|
|
||||||
</value>
|
|
||||||
</entry>
|
|
||||||
<entry key="file://$PROJECT_DIR$/utils/file.go">
|
|
||||||
<value>
|
|
||||||
<ScannedPath>
|
|
||||||
<option name="lastModified" value="1769850381300" />
|
|
||||||
</ScannedPath>
|
|
||||||
</value>
|
|
||||||
</entry>
|
|
||||||
<entry key="file://$PROJECT_DIR$/utils/jwt.go">
|
|
||||||
<value>
|
|
||||||
<ScannedPath>
|
|
||||||
<option name="lastModified" value="1770090940817" />
|
|
||||||
<option name="schema">
|
|
||||||
<list>
|
|
||||||
<option value="JWTClaims" />
|
|
||||||
</list>
|
|
||||||
</option>
|
|
||||||
</ScannedPath>
|
|
||||||
</value>
|
|
||||||
</entry>
|
|
||||||
<entry key="file://$PROJECT_DIR$/utils/ptr.go">
|
|
||||||
<value>
|
|
||||||
<ScannedPath>
|
|
||||||
<option name="lastModified" value="1770016124510" />
|
|
||||||
</ScannedPath>
|
|
||||||
</value>
|
|
||||||
</entry>
|
|
||||||
<entry key="file://$PROJECT_DIR$/valid/valid.go">
|
|
||||||
<value>
|
|
||||||
<ScannedPath>
|
|
||||||
<option name="lastModified" value="1770197737203" />
|
|
||||||
</ScannedPath>
|
|
||||||
</value>
|
|
||||||
</entry>
|
|
||||||
<entry key="file://$PROJECT_DIR$/ws/example.go">
|
|
||||||
<value>
|
|
||||||
<ScannedPath>
|
|
||||||
<option name="lastModified" value="1770025697531" />
|
|
||||||
</ScannedPath>
|
|
||||||
</value>
|
|
||||||
</entry>
|
|
||||||
<entry key="file://$PROJECT_DIR$/ws/websocket.go">
|
|
||||||
<value>
|
|
||||||
<ScannedPath>
|
|
||||||
<option name="lastModified" value="1770018907536" />
|
|
||||||
<option name="schema">
|
|
||||||
<list>
|
|
||||||
<option value="Config" />
|
|
||||||
<option value="Connection" />
|
|
||||||
<option value="Manager" />
|
|
||||||
<option value="Msg" />
|
|
||||||
</list>
|
|
||||||
</option>
|
|
||||||
</ScannedPath>
|
|
||||||
</value>
|
|
||||||
</entry>
|
|
||||||
<entry key="file://$PROJECT_DIR$/../gin_test/api/home.go">
|
|
||||||
<value>
|
|
||||||
<ScannedPath>
|
|
||||||
<option name="lastModified" value="1770190095707" />
|
|
||||||
</ScannedPath>
|
|
||||||
</value>
|
|
||||||
</entry>
|
|
||||||
<entry key="file://$PROJECT_DIR$/../gin_test/api/new.go">
|
|
||||||
<value>
|
|
||||||
<ScannedPath>
|
|
||||||
<option name="lastModified" value="1770191206242" />
|
|
||||||
<option name="schema">
|
|
||||||
<list>
|
|
||||||
<option value="NewsOne" />
|
|
||||||
<option value="NewsSave" />
|
|
||||||
</list>
|
|
||||||
</option>
|
|
||||||
</ScannedPath>
|
|
||||||
</value>
|
|
||||||
</entry>
|
|
||||||
<entry key="file://$PROJECT_DIR$/../gin_test/controller/home/houeRouter.go">
|
|
||||||
<value>
|
|
||||||
<ScannedPath>
|
|
||||||
<option name="lastModified" value="1770191001042" />
|
|
||||||
</ScannedPath>
|
|
||||||
</value>
|
|
||||||
</entry>
|
|
||||||
<entry key="file://$PROJECT_DIR$/../gin_test/controller/home/index.go">
|
|
||||||
<value>
|
|
||||||
<ScannedPath>
|
|
||||||
<option name="lastModified" value="1770255253603" />
|
|
||||||
</ScannedPath>
|
|
||||||
</value>
|
|
||||||
</entry>
|
|
||||||
<entry key="file://$PROJECT_DIR$/../gin_test/controller/home/router.go">
|
|
||||||
<value>
|
|
||||||
<ScannedPath>
|
|
||||||
<option name="lastModified" value="1770190557848" />
|
|
||||||
</ScannedPath>
|
|
||||||
</value>
|
|
||||||
</entry>
|
|
||||||
<entry key="file://$PROJECT_DIR$/../gin_test/req/new.go">
|
|
||||||
<value>
|
|
||||||
<ScannedPath>
|
|
||||||
<option name="lastModified" value="1770186504009" />
|
|
||||||
<option name="schema">
|
|
||||||
<list>
|
|
||||||
<option value="NewsOne" />
|
|
||||||
<option value="NewsSave" />
|
|
||||||
</list>
|
|
||||||
</option>
|
|
||||||
</ScannedPath>
|
|
||||||
</value>
|
|
||||||
</entry>
|
|
||||||
<entry key="file://$PROJECT_DIR$/../gin_test/router/router.go">
|
|
||||||
<value>
|
|
||||||
<ScannedPath>
|
|
||||||
<option name="lastModified" value="1770191024510" />
|
|
||||||
</ScannedPath>
|
|
||||||
</value>
|
|
||||||
</entry>
|
|
||||||
</map>
|
|
||||||
</option>
|
|
||||||
<option name="tableStructMapping">
|
|
||||||
<map>
|
|
||||||
<entry key="api" value="Api" />
|
|
||||||
<entry key="base_config" value="BaseConfig" />
|
|
||||||
<entry key="client" value="Client" />
|
|
||||||
<entry key="config" value="Config" />
|
|
||||||
<entry key="connection" value="Connection" />
|
|
||||||
<entry key="connection_pool" value="ConnectionPool" />
|
|
||||||
<entry key="curd" value="Curd" />
|
|
||||||
<entry key="data_base_config" value="DataBaseConfig" />
|
|
||||||
<entry key="jwt_claims" value="JWTClaims" />
|
|
||||||
<entry key="jwt_config" value="JwtConfig" />
|
|
||||||
<entry key="manager" value="Manager" />
|
|
||||||
<entry key="msg" value="Msg" />
|
|
||||||
<entry key="news_one" value="NewsOne" />
|
|
||||||
<entry key="news_save" value="NewsSave" />
|
|
||||||
<entry key="paginate" value="Paginate" />
|
|
||||||
<entry key="response" value="response" />
|
|
||||||
<entry key="server_config" value="ServerConfig" />
|
|
||||||
<entry key="tcp_connection" value="TcpConnection" />
|
|
||||||
<entry key="tcp_message" value="TcpMessage" />
|
|
||||||
<entry key="tcp_pool_config" value="TcpPoolConfig" />
|
|
||||||
<entry key="tcp_server" value="TCPServer" />
|
|
||||||
</map>
|
|
||||||
</option>
|
|
||||||
<option name="lastTimeChecked" value="1770185677345" />
|
|
||||||
</component>
|
|
||||||
</project>
|
|
||||||
|
|
@ -68,12 +68,10 @@ func mysqlInit() {
|
||||||
}
|
}
|
||||||
|
|
||||||
func sqliteInit() {
|
func sqliteInit() {
|
||||||
if !gfile.Exists(dns.String()) {
|
|
||||||
_, err = gfile.Create(dns.String())
|
_, err = gfile.Create(dns.String())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Error("创建数据库文件失败: ", err)
|
log.Error("创建数据库文件失败: ", err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
}
|
|
||||||
Type = sqlite.Open(fmt.Sprintf("%s?cache=shared&mode=rwc&_busy_timeout=10000&_fk=1&_journal=WAL&_sync=FULL", dns.String()))
|
Type = sqlite.Open(fmt.Sprintf("%s?cache=shared&mode=rwc&_busy_timeout=10000&_fk=1&_journal=WAL&_sync=FULL", dns.String()))
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,44 +1,70 @@
|
||||||
package valid
|
package valid
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/gin-gonic/gin"
|
"errors"
|
||||||
"github.com/gogf/gf/v2/errors/gerror"
|
"reflect"
|
||||||
"github.com/gogf/gf/v2/frame/g"
|
"strings"
|
||||||
"github.com/gogf/gf/v2/util/gconv"
|
|
||||||
|
"github.com/go-playground/locales/zh"
|
||||||
|
ut "github.com/go-playground/universal-translator"
|
||||||
|
"github.com/go-playground/validator/v10"
|
||||||
|
zh_translations "github.com/go-playground/validator/v10/translations/zh"
|
||||||
)
|
)
|
||||||
|
|
||||||
// ValidToStruct 验证参数并返回结构体
|
var (
|
||||||
func ValidToStruct[T any](c *gin.Context) (object *T) {
|
uni *ut.UniversalTranslator // 全局翻译器实例
|
||||||
obj := new(T)
|
validate *validator.Validate // 全局验证器实例
|
||||||
if err := c.Bind(obj); err != nil {
|
trans ut.Translator // 全局中文翻译器
|
||||||
panic(err)
|
foun bool
|
||||||
}
|
)
|
||||||
if err := g.Validator().Data(obj).Run(c); err != nil {
|
|
||||||
panic(gerror.Current(err).Error())
|
|
||||||
}
|
|
||||||
return obj
|
|
||||||
}
|
|
||||||
|
|
||||||
// ValidToMap 验证参数并返回结构体
|
func init() {
|
||||||
func ValidToMap[T any](c *gin.Context) (object map[string]any) {
|
// 1. 初始化中文本地化实例
|
||||||
obj := new(T)
|
zhLocale := zh.New()
|
||||||
if err := c.Bind(obj); err != nil {
|
|
||||||
panic(err)
|
|
||||||
}
|
|
||||||
if err := g.Validator().Data(obj).Run(c); err != nil {
|
|
||||||
panic(gerror.Current(err).Error())
|
|
||||||
}
|
|
||||||
return gconv.Map(obj)
|
|
||||||
}
|
|
||||||
|
|
||||||
// ValidToStructAndMap 验证参数并返回map
|
// 2. 初始化通用翻译器,加载中文本地化
|
||||||
func ValidToStructAndMap[T any](c *gin.Context) (stru *T, object map[string]any) {
|
uni = ut.New(zhLocale, zhLocale)
|
||||||
obj := new(T)
|
|
||||||
if err := c.Bind(obj); err != nil {
|
// 3. 获取中文翻译器实例
|
||||||
panic(err)
|
var err error
|
||||||
|
trans, foun = uni.GetTranslator("zh")
|
||||||
|
if !foun {
|
||||||
|
panic("获取中文翻译器失败")
|
||||||
}
|
}
|
||||||
if err := g.Validator().Data(obj).Run(c); err != nil {
|
|
||||||
panic(gerror.Current(err).Error())
|
// 4. 获取 Gin 内置的 validator 验证器实例
|
||||||
|
validate = validator.New()
|
||||||
|
|
||||||
|
// 5. 注册 validator 中文翻译(替换默认英文错误提示)
|
||||||
|
err = zh_translations.RegisterDefaultTranslations(validate, trans)
|
||||||
|
if err != nil {
|
||||||
|
panic("注册中文翻译失败:" + err.Error())
|
||||||
}
|
}
|
||||||
return obj, gconv.Map(obj)
|
|
||||||
|
// 6. 核心优化:注册字段名映射函数,用结构体的 json 标签作为返回的字段名
|
||||||
|
// 例如:结构体字段 Username -> json 标签 username -> 错误提示中显示 username(更友好)
|
||||||
|
validate.RegisterTagNameFunc(func(fld reflect.StructField) string {
|
||||||
|
// 提取 json 标签(忽略 ,omitempty 等附加选项)
|
||||||
|
jsonTag := strings.SplitN(fld.Tag.Get("json"), ",", 2)[0]
|
||||||
|
// 若 json 标签为 "-"(表示忽略该字段),返回空字符串
|
||||||
|
if jsonTag == "-" {
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
return jsonTag
|
||||||
|
})
|
||||||
|
}
|
||||||
|
func GetFirstValidateError(err error) string {
|
||||||
|
// 1. 断言错误类型是否为 validator 验证错误
|
||||||
|
var validateErrors validator.ValidationErrors
|
||||||
|
ok := errors.As(err, &validateErrors)
|
||||||
|
if !ok {
|
||||||
|
// 非参数验证错误(如绑定格式错误),直接返回错误信息
|
||||||
|
return "参数格式错误:" + err.Error()
|
||||||
|
}
|
||||||
|
|
||||||
|
// 2. 仅返回第一条验证错误(核心:取切片索引 0 的元素)
|
||||||
|
firstErr := validateErrors[0]
|
||||||
|
|
||||||
|
// 3. 翻译第一条错误为中文,返回给前端
|
||||||
|
return firstErr.Translate(trans)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue