完善模板引擎功能,完善gvalid示例

This commit is contained in:
John
2018-01-04 18:04:11 +08:00
parent c9e781e925
commit 855cb59caf
4 changed files with 126 additions and 23 deletions

View File

@ -56,23 +56,32 @@ func New(path string) *View {
}
}
// 设置模板文件后缀名
//func (view *View) SetSuffix(suffix string) {
// view.mu.Lock()
// defer view.mu.Unlock()
// view.suffix = suffix
//}
// 设置模板目录绝对路径
func (view *View) SetPath(path string) {
view.mu.Lock()
defer view.mu.Unlock()
view.path = path
}
// 获取模板文件后缀名
func (view *View) GetSuffix() string {
// 获取模板目录绝对路径
func (view *View) GetPath() string {
view.mu.RLock()
defer view.mu.RUnlock()
return view.suffix
return view.path
}
// 直接解析模板,返回解析后的内容
func (view *View) Parse(file string, params map[string]interface{}) ([]byte, error) {
if t, err := view.Template(file); err == nil {
return t.Parse(params)
} else {
return nil, err
}
}
// 根据文件名称生成一个模板对象,或者获取一个现有的模板对象
func (view *View) Template(file string) (*Template, error) {
path := strings.TrimRight(view.path, gfile.Separator) + gfile.Separator + file + "." + view.GetSuffix()
path := strings.TrimRight(view.GetPath(), gfile.Separator) + gfile.Separator + file + "." + view.suffix
if t := view.tpls.Get(path); t != nil {
return t.(*Template), nil
}

View File

@ -374,13 +374,18 @@ func checkSize(value, rulekey, ruleval string, cmsgs map[string]string) string {
return msg
}
// 检测键值对Map注意返回参数是一个2维的关联数组第一维键名为参数键名第二维为带有错误的校验规则名称值为错误信息
func CheckMap(kvmap map[string]string, rules map[string]string, msgs map[string]interface{}) map[string]map[string]string {
// 检测键值对参数Map注意返回参数是一个2维的关联数组第一维键名为参数键名第二维为带有错误的校验规则名称值为错误信息
func CheckMap(params map[string]string, rules map[string]string, msgs...map[string]interface{}) map[string]map[string]string {
// 自定义消息,非必须参数,因此这里需要做判断
cmsgs := make(map[string]interface{})
if len(msgs) > 0 {
cmsgs = msgs[0]
}
emsgs := make(map[string]map[string]string)
for key, value := range kvmap {
for key, value := range params {
if rule, ok := rules[key]; ok {
msg, _ := msgs[key]
if m := Check(value, rule, msg, kvmap); m != nil {
msg, _ := cmsgs[key]
if m := Check(value, rule, msg, params); m != nil {
if _, ok := emsgs[key]; !ok {
emsgs[key] = make(map[string]string)
}
@ -396,15 +401,15 @@ func CheckMap(kvmap map[string]string, rules map[string]string, msgs map[string]
return nil
}
// 检测单条数据的规则,其中values参数为非必须参数可以传递所有的校验参数进来进行多参数对比(部分校验规则需要)
// 检测单条数据的规则,其中params参数为非必须参数可以传递所有的校验参数进来进行多参数对比(部分校验规则需要)
// msgs为自定义错误信息由于同一条数据的校验规则可能存在多条为方便调用参数类型支持string/map[string]string允许传递多个自定义的错误信息如果类型为string那么中间使用"|"符号分隔多个自定义错误
// values参数为表单联合校验参数对于需要联合校验的规则有效required-*、same、different
func Check(value, rules string, msgs interface{}, values...map[string]string) map[string]string {
func Check(value, rules string, msgs interface{}, params...map[string]string) map[string]string {
value = strings.TrimSpace(value)
params := make(map[string]string)
kvmap := make(map[string]string)
errmsgs := make(map[string]string)
if len(values) > 0 {
params = values[0]
if len(params) > 0 {
kvmap = params[0]
}
// 自定义错误消息处理
list := make([]string, 0)
@ -434,7 +439,7 @@ func Check(value, rules string, msgs interface{}, values...map[string]string) ma
case "required-with-all": fallthrough
case "required-without": fallthrough
case "required-without-all":
match = checkRequired(value, rulekey, ruleval, params)
match = checkRequired(value, rulekey, ruleval, kvmap)
// 长度范围
case "length": fallthrough
@ -485,7 +490,7 @@ func Check(value, rules string, msgs interface{}, values...map[string]string) ma
// 两字段值应相同(非敏感字符判断,非类型判断)
case "same":
if v, ok := params[ruleval]; ok {
if v, ok := kvmap[ruleval]; ok {
if strings.Compare(value, v) == 0 {
match = true
}
@ -494,7 +499,7 @@ func Check(value, rules string, msgs interface{}, values...map[string]string) ma
// 两字段值不应相同(非敏感字符判断,非类型判断)
case "different":
match = true
if v, ok := params[ruleval]; ok {
if v, ok := kvmap[ruleval]; ok {
if strings.Compare(value, v) == 0 {
match = false
}

View File

@ -0,0 +1,24 @@
package demo
import (
"gitee.com/johng/gf/g/net/ghttp"
"gitee.com/johng/gf/g/frame/gmvc"
"gitee.com/johng/gf/g/frame/gins"
)
type ControllerTemplate struct {
gmvc.Controller
}
func init() {
gins.View().
ghttp.GetServer().BindController("/template", &ControllerTemplate{})
}
func (c *ControllerTemplate) Info() {
c.View.Assign("name", "john")
c.View.Display("user/index")
}

65
geg/other/gvalid.go Normal file
View File

@ -0,0 +1,65 @@
package main
import (
"fmt"
"gitee.com/johng/gf/g/util/gvalid"
)
func main() {
//rule := "length:6,16"
//if m := gvalid.Check("123456", rule, nil); m != nil {
// fmt.Println(m)
//}
//if m := gvalid.Check("12345", rule, nil); m != nil {
// fmt.Println(m)
// // map[length:字段长度为6到16个字符]
//}
//rule := "integer|between:6,16"
//msgs := "请输入一个整数|参数大小不对啊老铁"
//fmt.Println(gvalid.Check("5.66", rule, msgs))
//// map[integer:请输入一个整数 between:参数大小不对啊老铁]
//// 参数长度至少为6个数字或者6个字母但是总长度不能超过16个字符
//rule := `regex:\d{6,}|\D{6,}|max-length:16`
//if m := gvalid.Check("123456", rule, nil); m != nil {
// fmt.Println(m)
//}
//if m := gvalid.Check("abcde6", rule, nil); m != nil {
// fmt.Println(m)
// // map[regex:字段值不合法]
//}
//params := map[string]string {
// "passport" : "john",
// "password" : "123456",
// "password2" : "1234567",
//}
//rules := map[string]string {
// "passport" : "required|length:6,16",
// "password" : "required|length:6,16|same:password2",
// "password2" : "required|length:6,16",
//}
//fmt.Println(gvalid.CheckMap(params, rules))
//// map[passport:map[length:字段长度为6到16个字符] password:map[same:字段值不合法]]
params := map[string]string {
"passport" : "john",
"password" : "123456",
"password2" : "1234567",
}
rules := map[string]string {
"passport" : "required|length:6,16",
"password" : "required|length:6,16|same:password2",
"password2" : "required|length:6,16",
}
msgs := map[string]interface{} {
"passport" : "账号不能为空|账号长度应当在:min到:max之间",
"password" : map[string]string {
"required" : "密码不能为空",
"same" : "两次密码输入不相等",
},
}
fmt.Println(gvalid.CheckMap(params, rules, msgs))
// map[passport:map[length:账号长度应当在6到16之间] password:map[same:两次密码输入不相等]]
}