Compare commits
5 Commits
v1.0.00019
...
main
| Author | SHA1 | Date |
|---|---|---|
|
|
60f0d8053d | |
|
|
258112d38e | |
|
|
8927551779 | |
|
|
0ad7304eca | |
|
|
a1a2785c71 |
|
|
@ -10,13 +10,6 @@
|
|||
</set>
|
||||
</value>
|
||||
</entry>
|
||||
<entry key="ApiResponse">
|
||||
<value>
|
||||
<set>
|
||||
<option value="file://$PROJECT_DIR$/valid/valid.go" />
|
||||
</set>
|
||||
</value>
|
||||
</entry>
|
||||
<entry key="BaseConfig">
|
||||
<value>
|
||||
<set>
|
||||
|
|
@ -52,25 +45,10 @@
|
|||
</set>
|
||||
</value>
|
||||
</entry>
|
||||
<entry key="Crud">
|
||||
<value>
|
||||
<set>
|
||||
<option value="file://$PROJECT_DIR$/dao/dao.go" />
|
||||
</set>
|
||||
</value>
|
||||
</entry>
|
||||
<entry key="Cs1News">
|
||||
<value>
|
||||
<set>
|
||||
<option value="file://$PROJECT_DIR$/../gin_test/model/news.go" />
|
||||
</set>
|
||||
</value>
|
||||
</entry>
|
||||
<entry key="Curd">
|
||||
<value>
|
||||
<set>
|
||||
<option value="file://$PROJECT_DIR$/curd/curd.go" />
|
||||
<option value="file://$PROJECT_DIR$/dao/dao.go" />
|
||||
</set>
|
||||
</value>
|
||||
</entry>
|
||||
|
|
@ -109,23 +87,10 @@
|
|||
</set>
|
||||
</value>
|
||||
</entry>
|
||||
<entry key="News">
|
||||
<value>
|
||||
<set>
|
||||
<option value="file://$PROJECT_DIR$/../gin_test/model/news.go" />
|
||||
</set>
|
||||
</value>
|
||||
</entry>
|
||||
<entry key="NewsDb">
|
||||
<value>
|
||||
<set>
|
||||
<option value="file://$PROJECT_DIR$/../gin_test/model/news.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>
|
||||
|
|
@ -133,6 +98,7 @@
|
|||
<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>
|
||||
|
|
@ -141,7 +107,6 @@
|
|||
<value>
|
||||
<set>
|
||||
<option value="file://$PROJECT_DIR$/curd/curd.go" />
|
||||
<option value="file://$PROJECT_DIR$/dao/dao.go" />
|
||||
</set>
|
||||
</value>
|
||||
</entry>
|
||||
|
|
@ -187,27 +152,6 @@
|
|||
</set>
|
||||
</value>
|
||||
</entry>
|
||||
<entry key="sNewsDao">
|
||||
<value>
|
||||
<set>
|
||||
<option value="file://$PROJECT_DIR$/../gin_test/dao/newsDao.go" />
|
||||
</set>
|
||||
</value>
|
||||
</entry>
|
||||
<entry key="sNewsDb">
|
||||
<value>
|
||||
<set>
|
||||
<option value="file://$PROJECT_DIR$/../gin_test/model/news.go" />
|
||||
</set>
|
||||
</value>
|
||||
</entry>
|
||||
<entry key="userDao">
|
||||
<value>
|
||||
<set>
|
||||
<option value="file://$PROJECT_DIR$/../gin_test/dao/userDao.go" />
|
||||
</set>
|
||||
</value>
|
||||
</entry>
|
||||
</map>
|
||||
</option>
|
||||
<option name="scannedPathMapping">
|
||||
|
|
@ -254,23 +198,10 @@
|
|||
</ScannedPath>
|
||||
</value>
|
||||
</entry>
|
||||
<entry key="file://$PROJECT_DIR$/dao/dao.go">
|
||||
<value>
|
||||
<ScannedPath>
|
||||
<option name="lastModified" value="1770086496457" />
|
||||
<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="1770100613057" />
|
||||
<option name="lastModified" value="1770258641711" />
|
||||
</ScannedPath>
|
||||
</value>
|
||||
</entry>
|
||||
|
|
@ -408,22 +339,10 @@
|
|||
</ScannedPath>
|
||||
</value>
|
||||
</entry>
|
||||
<entry key="file://$PROJECT_DIR$/valid/index.go">
|
||||
<value>
|
||||
<ScannedPath>
|
||||
<option name="lastModified" value="1770109401228" />
|
||||
</ScannedPath>
|
||||
</value>
|
||||
</entry>
|
||||
<entry key="file://$PROJECT_DIR$/valid/valid.go">
|
||||
<value>
|
||||
<ScannedPath>
|
||||
<option name="lastModified" value="1770109758999" />
|
||||
<option name="schema">
|
||||
<list>
|
||||
<option value="ApiResponse" />
|
||||
</list>
|
||||
</option>
|
||||
<option name="lastModified" value="1770197737203" />
|
||||
</ScannedPath>
|
||||
</value>
|
||||
</entry>
|
||||
|
|
@ -449,82 +368,51 @@
|
|||
</ScannedPath>
|
||||
</value>
|
||||
</entry>
|
||||
<entry key="file://$PROJECT_DIR$/../gin_test/dao/dao.go">
|
||||
<entry key="file://$PROJECT_DIR$/../gin_test/api/home.go">
|
||||
<value>
|
||||
<ScannedPath>
|
||||
<option name="lastModified" value="1770085772445" />
|
||||
<option name="lastModified" value="1770190095707" />
|
||||
</ScannedPath>
|
||||
</value>
|
||||
</entry>
|
||||
<entry key="file://$PROJECT_DIR$/../gin_test/dao/newsDao.go">
|
||||
<entry key="file://$PROJECT_DIR$/../gin_test/api/new.go">
|
||||
<value>
|
||||
<ScannedPath>
|
||||
<option name="lastModified" value="1770097580598" />
|
||||
<option name="lastModified" value="1770191206242" />
|
||||
<option name="schema">
|
||||
<list>
|
||||
<option value="sNewsDao" />
|
||||
<option value="NewsOne" />
|
||||
<option value="NewsSave" />
|
||||
</list>
|
||||
</option>
|
||||
</ScannedPath>
|
||||
</value>
|
||||
</entry>
|
||||
<entry key="file://$PROJECT_DIR$/../gin_test/dao/userDao.go">
|
||||
<entry key="file://$PROJECT_DIR$/../gin_test/controller/home/houeRouter.go">
|
||||
<value>
|
||||
<ScannedPath>
|
||||
<option name="lastModified" value="1770087884880" />
|
||||
<option name="schema">
|
||||
<list>
|
||||
<option value="userDao" />
|
||||
</list>
|
||||
</option>
|
||||
<option name="lastModified" value="1770191001042" />
|
||||
</ScannedPath>
|
||||
</value>
|
||||
</entry>
|
||||
<entry key="file://$PROJECT_DIR$/../gin_test/main.go">
|
||||
<entry key="file://$PROJECT_DIR$/../gin_test/controller/home/index.go">
|
||||
<value>
|
||||
<ScannedPath>
|
||||
<option name="lastModified" value="1770097796404" />
|
||||
<option name="lastModified" value="1770255253603" />
|
||||
</ScannedPath>
|
||||
</value>
|
||||
</entry>
|
||||
<entry key="file://$PROJECT_DIR$/../gin_test/migrate/index.go">
|
||||
<entry key="file://$PROJECT_DIR$/../gin_test/controller/home/router.go">
|
||||
<value>
|
||||
<ScannedPath>
|
||||
<option name="lastModified" value="1770097713976" />
|
||||
</ScannedPath>
|
||||
</value>
|
||||
</entry>
|
||||
<entry key="file://$PROJECT_DIR$/../gin_test/migrate/migrate.go">
|
||||
<value>
|
||||
<ScannedPath>
|
||||
<option name="lastModified" value="1770097831261" />
|
||||
</ScannedPath>
|
||||
</value>
|
||||
</entry>
|
||||
<entry key="file://$PROJECT_DIR$/../gin_test/model/index.go">
|
||||
<value>
|
||||
<ScannedPath>
|
||||
<option name="lastModified" value="1770083071840" />
|
||||
</ScannedPath>
|
||||
</value>
|
||||
</entry>
|
||||
<entry key="file://$PROJECT_DIR$/../gin_test/model/news.go">
|
||||
<value>
|
||||
<ScannedPath>
|
||||
<option name="lastModified" value="1770103134469" />
|
||||
<option name="schema">
|
||||
<list>
|
||||
<option value="News" />
|
||||
<option value="sNewsDb" />
|
||||
</list>
|
||||
</option>
|
||||
<option name="lastModified" value="1770190557848" />
|
||||
</ScannedPath>
|
||||
</value>
|
||||
</entry>
|
||||
<entry key="file://$PROJECT_DIR$/../gin_test/req/new.go">
|
||||
<value>
|
||||
<ScannedPath>
|
||||
<option name="lastModified" value="1770109333290" />
|
||||
<option name="lastModified" value="1770186504009" />
|
||||
<option name="schema">
|
||||
<list>
|
||||
<option value="NewsOne" />
|
||||
|
|
@ -537,7 +425,7 @@
|
|||
<entry key="file://$PROJECT_DIR$/../gin_test/router/router.go">
|
||||
<value>
|
||||
<ScannedPath>
|
||||
<option name="lastModified" value="1770109774053" />
|
||||
<option name="lastModified" value="1770191024510" />
|
||||
</ScannedPath>
|
||||
</value>
|
||||
</entry>
|
||||
|
|
@ -546,36 +434,28 @@
|
|||
<option name="tableStructMapping">
|
||||
<map>
|
||||
<entry key="api" value="Api" />
|
||||
<entry key="api_response" value="ApiResponse" />
|
||||
<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="crud" value="Crud" />
|
||||
<entry key="cs1_news" value="Cs1News" />
|
||||
<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" value="News" />
|
||||
<entry key="news_db" value="NewsDb" />
|
||||
<entry key="news_one" value="NewsOne" />
|
||||
<entry key="news_save" value="NewsSave" />
|
||||
<entry key="paginate" value="Paginate" />
|
||||
<entry key="response" value="response" />
|
||||
<entry key="s_news_dao" value="sNewsDao" />
|
||||
<entry key="s_news_db" value="sNewsDb" />
|
||||
<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" />
|
||||
<entry key="user_dao" value="userDao" />
|
||||
</map>
|
||||
</option>
|
||||
<option name="lastTimeChecked" value="1770082491799" />
|
||||
<option name="lastTimeChecked" value="1770185677345" />
|
||||
</component>
|
||||
</project>
|
||||
|
|
@ -68,10 +68,12 @@ func mysqlInit() {
|
|||
}
|
||||
|
||||
func sqliteInit() {
|
||||
if !gfile.Exists(dns.String()) {
|
||||
_, err = gfile.Create(dns.String())
|
||||
if err != nil {
|
||||
log.Error("创建数据库文件失败: ", err)
|
||||
return
|
||||
}
|
||||
}
|
||||
Type = sqlite.Open(fmt.Sprintf("%s?cache=shared&mode=rwc&_busy_timeout=10000&_fk=1&_journal=WAL&_sync=FULL", dns.String()))
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1 +0,0 @@
|
|||
package valid
|
||||
|
|
@ -1,72 +1,44 @@
|
|||
package valid
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"reflect"
|
||||
"strings"
|
||||
|
||||
"github.com/gin-gonic/gin/binding"
|
||||
"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"
|
||||
"github.com/gin-gonic/gin"
|
||||
"github.com/gogf/gf/v2/errors/gerror"
|
||||
"github.com/gogf/gf/v2/frame/g"
|
||||
"github.com/gogf/gf/v2/util/gconv"
|
||||
)
|
||||
|
||||
// -------------------------- 全局变量(翻译器+验证器) --------------------------
|
||||
var (
|
||||
trans ut.Translator // 全局中文翻译器
|
||||
validate *validator.Validate // 全局验证器实例
|
||||
found bool
|
||||
)
|
||||
|
||||
// -------------------------- 初始化全局验证器+中文翻译器(关键:与Gin关联) --------------------------
|
||||
func init() {
|
||||
// 1. 初始化中文本地化
|
||||
zhLocale := zh.New()
|
||||
uni := ut.New(zhLocale, zhLocale)
|
||||
|
||||
// 2. 获取中文翻译器
|
||||
var err error
|
||||
trans, found = uni.GetTranslator("zh")
|
||||
if !found {
|
||||
panic("获取中文翻译器失败")
|
||||
// ValidToStruct 验证参数并返回结构体
|
||||
func ValidToStruct[T any](c *gin.Context) (object *T) {
|
||||
obj := new(T)
|
||||
if err := c.Bind(obj); err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
// 3. 关键:获取 Gin 内置的 validator 实例(而非手动创建 new(validator.Validate))
|
||||
// 保证 Gin 绑定参数时使用的是我们注册了翻译的这个验证器
|
||||
if v, ok := binding.Validator.Engine().(*validator.Validate); ok {
|
||||
validate = v
|
||||
} else {
|
||||
panic("获取 Gin 内置验证器失败")
|
||||
if err := g.Validator().Data(obj).Run(c); err != nil {
|
||||
panic(gerror.Current(err).Error())
|
||||
}
|
||||
|
||||
// 4. 注册中文翻译(核心:将验证器与中文翻译器绑定)
|
||||
err = zh_translations.RegisterDefaultTranslations(validate, trans)
|
||||
if err != nil {
|
||||
panic("注册中文翻译失败:" + err.Error())
|
||||
}
|
||||
|
||||
// 5. 注册字段名映射:用 json 标签替换结构体字段名(解决报错中的 Title -> title 问题)
|
||||
validate.RegisterTagNameFunc(func(fld reflect.StructField) string {
|
||||
// 提取 json 标签,忽略 ,omitempty 等附加选项
|
||||
jsonTag := strings.SplitN(fld.Tag.Get("json"), ",", 2)[0]
|
||||
if jsonTag == "-" {
|
||||
return ""
|
||||
}
|
||||
return jsonTag
|
||||
})
|
||||
return obj
|
||||
}
|
||||
|
||||
// ValidateError -------------------------- 工具函数:解析第一条验证错误(中文翻译) --------------------------
|
||||
func ValidateError(err error) string {
|
||||
// 1. 断言错误类型为 validator.ValidationErrors
|
||||
var validateErrors validator.ValidationErrors
|
||||
ok := errors.As(err, &validateErrors)
|
||||
if !ok {
|
||||
// 非参数验证错误,直接返回
|
||||
return "参数格式错误:" + err.Error()
|
||||
// ValidToMap 验证参数并返回结构体
|
||||
func ValidToMap[T any](c *gin.Context) (object map[string]any) {
|
||||
obj := new(T)
|
||||
if err := c.Bind(obj); err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
// 2. 只返回第一条中文翻译错误
|
||||
return validateErrors[0].Translate(trans)
|
||||
if err := g.Validator().Data(obj).Run(c); err != nil {
|
||||
panic(gerror.Current(err).Error())
|
||||
}
|
||||
return gconv.Map(obj)
|
||||
}
|
||||
|
||||
// ValidToStructAndMap 验证参数并返回map
|
||||
func ValidToStructAndMap[T any](c *gin.Context) (stru *T, object map[string]any) {
|
||||
obj := new(T)
|
||||
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 obj, gconv.Map(obj)
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue