diff --git a/g/os/gview/gview.go b/g/os/gview/gview.go index e1f82cf0a..4a53d9033 100644 --- a/g/os/gview/gview.go +++ b/g/os/gview/gview.go @@ -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 } diff --git a/g/util/gvalid/gvalid.go b/g/util/gvalid/gvalid.go index 96cfc0ca8..630423aed 100644 --- a/g/util/gvalid/gvalid.go +++ b/g/util/gvalid/gvalid.go @@ -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 } diff --git a/geg/frame/mvc/controller/demo/template.go b/geg/frame/mvc/controller/demo/template.go new file mode 100644 index 000000000..80a61c458 --- /dev/null +++ b/geg/frame/mvc/controller/demo/template.go @@ -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") +} + + + diff --git a/geg/other/gvalid.go b/geg/other/gvalid.go new file mode 100644 index 000000000..9d24271a9 --- /dev/null +++ b/geg/other/gvalid.go @@ -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:两次密码输入不相等]] +}