From 1323a5a94cf8fc26110c036cf977fad9d1d9caa2 Mon Sep 17 00:00:00 2001 From: John Date: Thu, 10 May 2018 12:55:16 +0800 Subject: [PATCH 1/5] =?UTF-8?q?=E4=BF=AE=E6=AD=A3gvalid.CheckMap=E5=BD=93?= =?UTF-8?q?=E4=BC=A0=E9=80=92=E7=9A=84params=E5=8F=82=E6=95=B0=E5=AF=B9?= =?UTF-8?q?=E5=BA=94rules=E7=9A=84=E9=94=AE=E5=80=BC=E5=AF=B9=E4=B8=BA?= =?UTF-8?q?=E7=A9=BA=E6=97=B6=E7=9A=84=E6=A0=A1=E9=AA=8C=E5=A4=B1=E6=95=88?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- g/util/gvalid/gvalid.go | 23 +++++++++++++---------- g/util/gvalid/gvalid_test.go | 1 + 2 files changed, 14 insertions(+), 10 deletions(-) diff --git a/g/util/gvalid/gvalid.go b/g/util/gvalid/gvalid.go index eab2aa76d..228c65afa 100644 --- a/g/util/gvalid/gvalid.go +++ b/g/util/gvalid/gvalid.go @@ -378,22 +378,25 @@ func checkSize(value, rulekey, ruleval string, cmsgs map[string]string) string { // 检测键值对参数Map,注意返回参数是一个2维的关联数组,第一维键名为参数键名,第二维为带有错误的校验规则名称,值为错误信息 func CheckMap(params map[string]interface{}, rules map[string]string, msgs...map[string]interface{}) map[string]map[string]string { + var value interface{} // 自定义消息,非必须参数,因此这里需要做判断 cmsgs := make(map[string]interface{}) if len(msgs) > 0 { cmsgs = msgs[0] } emsgs := make(map[string]map[string]string) - for key, value := range params { - if rule, ok := rules[key]; ok { - msg, _ := cmsgs[key] - if m := Check(value, rule, msg, params); m != nil { - if _, ok := emsgs[key]; !ok { - emsgs[key] = make(map[string]string) - } - for k, v := range m { - emsgs[key][k] = v - } + for key, rule := range rules { + value = nil + if v, ok := params[key]; ok { + value = v + } + msg, _ := cmsgs[key] + if m := Check(value, rule, msg, params); m != nil { + if _, ok := emsgs[key]; !ok { + emsgs[key] = make(map[string]string) + } + for k, v := range m { + emsgs[key][k] = v } } } diff --git a/g/util/gvalid/gvalid_test.go b/g/util/gvalid/gvalid_test.go index 82ebff6ac..b7230b459 100644 --- a/g/util/gvalid/gvalid_test.go +++ b/g/util/gvalid/gvalid_test.go @@ -5,6 +5,7 @@ // You can obtain one at https://gitee.com/johng/gf. // 单元测试 +// go test *.go -bench=".*" package gvalid_test From 753ebac30f3cfa15cca46451946a25c130eef848 Mon Sep 17 00:00:00 2001 From: John Date: Mon, 14 May 2018 14:16:42 +0800 Subject: [PATCH 2/5] =?UTF-8?q?=E4=BF=AE=E5=A4=8Dgvalid=E5=8C=85=E9=AA=8C?= =?UTF-8?q?=E8=AF=81=E9=97=AE=E9=A2=98=EF=BC=9A=E5=A6=82=E6=9E=9C=E5=80=BC?= =?UTF-8?q?=E4=B8=BAnil=EF=BC=8C=E5=B9=B6=E4=B8=94=E4=B8=8D=E9=9C=80?= =?UTF-8?q?=E8=A6=81require*=E9=AA=8C=E8=AF=81=E6=97=B6=EF=BC=8C=E5=85=B6?= =?UTF-8?q?=E4=BB=96=E9=AA=8C=E8=AF=81=E5=A4=B1=E6=95=88=E3=80=82=E5=B9=B6?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=8D=95=E5=85=83=E6=B5=8B=E8=AF=95=E9=A1=B9?= =?UTF-8?q?=EF=BC=8C=E6=B5=8B=E8=AF=95=E9=80=9A=E8=BF=87=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- g/util/gvalid/gvalid.go | 160 +++++++++++++++++++---------------- g/util/gvalid/gvalid_test.go | 14 +++ geg/other/test.go | 11 ++- 3 files changed, 111 insertions(+), 74 deletions(-) diff --git a/g/util/gvalid/gvalid.go b/g/util/gvalid/gvalid.go index 228c65afa..6f4e842a6 100644 --- a/g/util/gvalid/gvalid.go +++ b/g/util/gvalid/gvalid.go @@ -137,9 +137,9 @@ func SetDefaultErrorMsgs(msgs map[string]string) { } // 判断必须字段 -func checkRequired(value, rulekey, ruleval string, params map[string]string) bool { +func checkRequired(value, ruleKey, ruleVal string, params map[string]string) bool { required := false - switch rulekey { + switch ruleKey { // 必须字段 case "required": required = true @@ -147,7 +147,7 @@ func checkRequired(value, rulekey, ruleval string, params map[string]string) boo // 必须字段(当任意所给定字段值与所给值相等时) case "required-if": required = false - array := strings.Split(ruleval, ",") + array := strings.Split(ruleVal, ",") // 必须为偶数,才能是键值对匹配 if len(array)%2 == 0 { for i := 0; i < len(array); { @@ -166,7 +166,7 @@ func checkRequired(value, rulekey, ruleval string, params map[string]string) boo // 必须字段(当所给定字段值与所给值都不相等时) case "required-unless": required = true - array := strings.Split(ruleval, ",") + array := strings.Split(ruleVal, ",") // 必须为偶数,才能是键值对匹配 if len(array)%2 == 0 { for i := 0; i < len(array); { @@ -185,7 +185,7 @@ func checkRequired(value, rulekey, ruleval string, params map[string]string) boo // 必须字段(当所给定任意字段值不为空时) case "required-with": required = false - array := strings.Split(ruleval, ",") + array := strings.Split(ruleVal, ",") for i := 0; i < len(array); i++ { if v, ok := params[array[i]]; ok { if v != "" { @@ -198,7 +198,7 @@ func checkRequired(value, rulekey, ruleval string, params map[string]string) boo // 必须字段(当所给定所有字段值都不为空时) case "required-with-all": required = true - array := strings.Split(ruleval, ",") + array := strings.Split(ruleVal, ",") for i := 0; i < len(array); i++ { if v, ok := params[array[i]]; ok { if v == "" { @@ -211,7 +211,7 @@ func checkRequired(value, rulekey, ruleval string, params map[string]string) boo // 必须字段(当所给定任意字段值为空时) case "required-without": required = false - array := strings.Split(ruleval, ",") + array := strings.Split(ruleVal, ",") for i := 0; i < len(array); i++ { if v, ok := params[array[i]]; ok { if v == "" { @@ -224,7 +224,7 @@ func checkRequired(value, rulekey, ruleval string, params map[string]string) boo // 必须字段(当所给定所有字段值都为空时) case "required-without-all": required = true - array := strings.Split(ruleval, ",") + array := strings.Split(ruleVal, ",") for i := 0; i < len(array); i++ { if v, ok := params[array[i]]; ok { if v != "" { @@ -242,12 +242,12 @@ func checkRequired(value, rulekey, ruleval string, params map[string]string) boo } // 对字段值长度进行检测 -func checkLength(value, rulekey, ruleval string, cmsgs map[string]string) string { +func checkLength(value, ruleKey, ruleVal string, custonMsgs map[string]string) string { msg := "" - switch rulekey { + switch ruleKey { // 长度范围 case "length": - array := strings.Split(ruleval, ",") + array := strings.Split(ruleVal, ",") min := 0 max := 0 if len(array) > 0 { @@ -261,8 +261,8 @@ func checkLength(value, rulekey, ruleval string, cmsgs map[string]string) string } } if len(value) < min || len(value) > max { - if v, ok := cmsgs[rulekey]; !ok { - msg = errorMsgMap.Get(rulekey) + if v, ok := custonMsgs[ruleKey]; !ok { + msg = errorMsgMap.Get(ruleKey) } else { msg = v } @@ -273,44 +273,44 @@ func checkLength(value, rulekey, ruleval string, cmsgs map[string]string) string // 最小长度 case "min-length": - if min, err := strconv.Atoi(ruleval); err == nil { + if min, err := strconv.Atoi(ruleVal); err == nil { if len(value) < min { - if v, ok := cmsgs[rulekey]; !ok { - msg = errorMsgMap.Get(rulekey) + if v, ok := custonMsgs[ruleKey]; !ok { + msg = errorMsgMap.Get(ruleKey) } else { msg = v } msg = strings.Replace(msg, ":min", strconv.Itoa(min), -1) } } else { - msg = "校验参数[" + ruleval + "]应当为整数类型" + msg = "校验参数[" + ruleVal + "]应当为整数类型" } // 最大长度 case "max-length": - if max, err := strconv.Atoi(ruleval); err == nil { + if max, err := strconv.Atoi(ruleVal); err == nil { if len(value) > max { - if v, ok := cmsgs[rulekey]; !ok { - msg = errorMsgMap.Get(rulekey) + if v, ok := custonMsgs[ruleKey]; !ok { + msg = errorMsgMap.Get(ruleKey) } else { msg = v } msg = strings.Replace(msg, ":max", strconv.Itoa(max), -1) } } else { - msg = "校验参数[" + ruleval + "]应当为整数类型" + msg = "校验参数[" + ruleVal + "]应当为整数类型" } } return msg } // 对字段值大小进行检测 -func checkSize(value, rulekey, ruleval string, cmsgs map[string]string) string { +func checkSize(value, ruleKey, ruleVal string, custonMsgs map[string]string) string { msg := "" - switch rulekey { + switch ruleKey { // 大小范围 case "between": - array := strings.Split(ruleval, ",") + array := strings.Split(ruleVal, ",") min := float64(0) max := float64(0) if len(array) > 0 { @@ -325,8 +325,8 @@ func checkSize(value, rulekey, ruleval string, cmsgs map[string]string) string { } if v, err := strconv.ParseFloat(value, 10); err == nil { if v < min || v > max { - if v, ok := cmsgs[rulekey]; !ok { - msg = errorMsgMap.Get(rulekey) + if v, ok := custonMsgs[ruleKey]; !ok { + msg = errorMsgMap.Get(ruleKey) } else { msg = v } @@ -339,12 +339,12 @@ func checkSize(value, rulekey, ruleval string, cmsgs map[string]string) string { // 最小值 case "min": - if min, err := strconv.ParseFloat(ruleval, 10); err == nil { + if min, err := strconv.ParseFloat(ruleVal, 10); err == nil { if v, err := strconv.ParseFloat(value, 10); err == nil { if v < min { - msg, ok := cmsgs[rulekey] + msg, ok := custonMsgs[ruleKey] if !ok { - msg = errorMsgMap.Get(rulekey) + msg = errorMsgMap.Get(ruleKey) } msg = strings.Replace(msg, ":min", strconv.FormatFloat(min, 'f', -1, 64), -1) } @@ -352,17 +352,17 @@ func checkSize(value, rulekey, ruleval string, cmsgs map[string]string) string { msg = "输入参数[" + value + "]应当为数字类型" } } else { - msg = "校验参数[" + ruleval + "]应当为数字类型" + msg = "校验参数[" + ruleVal + "]应当为数字类型" } // 最大值 case "max": - if max, err := strconv.ParseFloat(ruleval, 10); err == nil { + if max, err := strconv.ParseFloat(ruleVal, 10); err == nil { if v, err := strconv.ParseFloat(value, 10); err == nil { if v > max { - msg, ok := cmsgs[rulekey] + msg, ok := custonMsgs[ruleKey] if !ok { - msg = errorMsgMap.Get(rulekey) + msg = errorMsgMap.Get(ruleKey) } msg = strings.Replace(msg, ":max", strconv.FormatFloat(max, 'f', -1, 64), -1) } @@ -370,7 +370,7 @@ func checkSize(value, rulekey, ruleval string, cmsgs map[string]string) string { msg = "输入参数[" + value + "]应当为数字类型" } } else { - msg = "校验参数[" + ruleval + "]应当为数字类型" + msg = "校验参数[" + ruleVal + "]应当为数字类型" } } return msg @@ -380,28 +380,42 @@ func checkSize(value, rulekey, ruleval string, cmsgs map[string]string) string { func CheckMap(params map[string]interface{}, rules map[string]string, msgs...map[string]interface{}) map[string]map[string]string { var value interface{} // 自定义消息,非必须参数,因此这里需要做判断 - cmsgs := make(map[string]interface{}) + customMsgs := make(map[string]interface{}) if len(msgs) > 0 { - cmsgs = msgs[0] + customMsgs = msgs[0] } - emsgs := make(map[string]map[string]string) + errorMsgs := make(map[string]map[string]string) + // 以校验规则作为基础 for key, rule := range rules { value = nil if v, ok := params[key]; ok { value = v } - msg, _ := cmsgs[key] + msg, _ := customMsgs[key] if m := Check(value, rule, msg, params); m != nil { - if _, ok := emsgs[key]; !ok { - emsgs[key] = make(map[string]string) + // 如果值为nil,并且不需要require*验证时,其他验证失效 + if value == nil { + required := false; + for k, _ := range m { + if strings.Index(k, "required") != -1 { + required = true; + break + } + } + if !required { + continue + } + } + if _, ok := errorMsgs[key]; !ok { + errorMsgs[key] = make(map[string]string) } for k, v := range m { - emsgs[key][k] = v + errorMsgs[key][k] = v } } } - if len(emsgs) > 0 { - return emsgs + if len(errorMsgs) > 0 { + return errorMsgs } return nil } @@ -416,20 +430,20 @@ func CheckObject(object interface{}, rules map[string]string, msgs...map[string] // values参数为表单联合校验参数,对于需要联合校验的规则有效,如:required-*、same、different func Check(val interface{}, rules string, msgs interface{}, params...map[string]interface{}) map[string]string { // 内部会将参数全部转换为字符串类型进行校验 - value := strings.TrimSpace(gconv.String(val)) - kvmap := make(map[string]string) - errmsgs := make(map[string]string) + value := strings.TrimSpace(gconv.String(val)) + data := make(map[string]string) + errorMsgs := make(map[string]string) if len(params) > 0 { for k, v := range params[0] { - kvmap[k] = gconv.String(v) + data[k] = gconv.String(v) } } // 自定义错误消息处理 - list := make([]string, 0) - cmsgs := make(map[string]string) + list := make([]string, 0) + custonMsgs := make(map[string]string) switch value := msgs.(type) { case map[string]string: - cmsgs = value + custonMsgs = value case string: list = strings.Split(value, "|") } @@ -437,13 +451,13 @@ func Check(val interface{}, rules string, msgs interface{}, params...map[string] for index := 0; index < len(items); { item := items[index] results := ruleRegex.FindStringSubmatch(item) - rulekey := strings.TrimSpace(results[1]) - ruleval := strings.TrimSpace(results[2]) + ruleKey := strings.TrimSpace(results[1]) + ruleVal := strings.TrimSpace(results[2]) match := false if len(list) > index { - cmsgs[rulekey] = strings.TrimSpace(list[index]) + custonMsgs[ruleKey] = strings.TrimSpace(list[index]) } - switch rulekey { + switch ruleKey { // 必须字段 case "required": fallthrough case "required-if": fallthrough @@ -452,14 +466,14 @@ func Check(val interface{}, rules string, msgs interface{}, params...map[string] case "required-with-all": fallthrough case "required-without": fallthrough case "required-without-all": - match = checkRequired(value, rulekey, ruleval, kvmap) + match = checkRequired(value, ruleKey, ruleVal, data) // 长度范围 case "length": fallthrough case "min-length": fallthrough case "max-length": - if msg := checkLength(value, rulekey, ruleval, cmsgs); msg != "" { - errmsgs[rulekey] = msg + if msg := checkLength(value, ruleKey, ruleVal, custonMsgs); msg != "" { + errorMsgs[ruleKey] = msg } else { match = true } @@ -468,8 +482,8 @@ func Check(val interface{}, rules string, msgs interface{}, params...map[string] case "min": fallthrough case "max": fallthrough case "between": - if msg := checkSize(value, rulekey, ruleval, cmsgs); msg != "" { - errmsgs[rulekey] = msg + if msg := checkSize(value, ruleKey, ruleVal, custonMsgs); msg != "" { + errorMsgs[ruleKey] = msg } else { match = true } @@ -480,11 +494,11 @@ func Check(val interface{}, rules string, msgs interface{}, params...map[string] for i := index + 1; i < len(items); i++ { // 判断下一个规则是否合法,不合法那么和当前正则规则进行整合 if !gregx.IsMatchString(gSINGLE_RULE_PATTERN, items[i]) { - ruleval += "|" + items[i] + ruleVal += "|" + items[i] index++ } } - match = gregx.IsMatchString(ruleval, value) + match = gregx.IsMatchString(ruleVal, value) // 日期格式, case "date": @@ -497,13 +511,13 @@ func Check(val interface{}, rules string, msgs interface{}, params...map[string] // 日期格式,需要给定日期格式 case "date-format": - if _, err := gtime.StrToTime(value, ruleval); err == nil { + if _, err := gtime.StrToTime(value, ruleVal); err == nil { match = true } // 两字段值应相同(非敏感字符判断,非类型判断) case "same": - if v, ok := kvmap[ruleval]; ok { + if v, ok := data[ruleVal]; ok { if strings.Compare(value, v) == 0 { match = true } @@ -512,7 +526,7 @@ func Check(val interface{}, rules string, msgs interface{}, params...map[string] // 两字段值不应相同(非敏感字符判断,非类型判断) case "different": match = true - if v, ok := kvmap[ruleval]; ok { + if v, ok := data[ruleVal]; ok { if strings.Compare(value, v) == 0 { match = false } @@ -520,7 +534,7 @@ func Check(val interface{}, rules string, msgs interface{}, params...map[string] // 字段值应当在指定范围中 case "in": - array := strings.Split(ruleval, ",") + array := strings.Split(ruleVal, ",") for _, v := range array { if strings.Compare(value, strings.TrimSpace(v)) == 0 { match = true @@ -531,7 +545,7 @@ func Check(val interface{}, rules string, msgs interface{}, params...map[string] // 字段值不应当在指定范围中 case "not-in": match = true - array := strings.Split(ruleval, ",") + array := strings.Split(ruleVal, ",") for _, v := range array { if strings.Compare(value, strings.TrimSpace(v)) == 0 { match = false @@ -659,25 +673,25 @@ func Check(val interface{}, rules string, msgs interface{}, params...map[string] match = gregx.IsMatchString(`^([0-9A-Fa-f]{2}-){5}[0-9A-Fa-f]{2}$`, value) default: - errmsgs[rulekey] = "Invalid rule name:" + rulekey + errorMsgs[ruleKey] = "Invalid rule name:" + ruleKey } // 错误消息整合 if !match { // 不存在则使用默认的错误信息, // 如果在校验过程中已经设置了错误信息,那么这里便不作处理 - if _, ok := errmsgs[rulekey]; !ok { - if msg, ok := cmsgs[rulekey]; ok { - errmsgs[rulekey] = msg + if _, ok := errorMsgs[ruleKey]; !ok { + if msg, ok := custonMsgs[ruleKey]; ok { + errorMsgs[ruleKey] = msg } else { - errmsgs[rulekey] = errorMsgMap.Get(rulekey) + errorMsgs[ruleKey] = errorMsgMap.Get(ruleKey) } } } index++ } - if len(errmsgs) > 0 { - return errmsgs + if len(errorMsgs) > 0 { + return errorMsgs } return nil } \ No newline at end of file diff --git a/g/util/gvalid/gvalid_test.go b/g/util/gvalid/gvalid_test.go index b7230b459..d6206cda2 100644 --- a/g/util/gvalid/gvalid_test.go +++ b/g/util/gvalid/gvalid_test.go @@ -225,4 +225,18 @@ func Test_CustomError2(t *testing.T) { } } } +} + +// 如果值为nil,并且不需要require*验证时,其他验证失效 +func Test_CheckMapWithNilAndNotRequiredField(t *testing.T) { + data := map[string]interface{} { + "id" : "1", + } + rules := map[string]string { + "id" : "required", + "name" : "length:4,16", + } + if m := gvalid.CheckMap(data, rules); m != nil { + t.Error(m) + } } \ No newline at end of file diff --git a/geg/other/test.go b/geg/other/test.go index 56d488a57..48ef3ddd3 100644 --- a/geg/other/test.go +++ b/geg/other/test.go @@ -2,8 +2,17 @@ package main import ( "fmt" + "gitee.com/johng/gf/g/util/gvalid" ) func main() { - fmt.Println("我要加入gf框架开发团队!!") + data := map[string]interface{} { + "id" : "1", + } + rules := map[string]string { + "id" : "required", + "name" : "length:4,16", + } + m := gvalid.CheckMap(data, rules) + fmt.Println(m) } From bef18543a27ac519dca73409c974e7c6db195e7d Mon Sep 17 00:00:00 2001 From: John Date: Tue, 15 May 2018 13:53:13 +0800 Subject: [PATCH 3/5] =?UTF-8?q?=E5=AE=8C=E5=96=84=E6=A8=A1=E6=9D=BF?= =?UTF-8?q?=E5=BC=95=E6=93=8E=E7=83=AD=E6=9B=B4=E6=96=B0=E6=9C=BA=E5=88=B6?= =?UTF-8?q?=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- geg/os/gview/controller_hot_update.go | 30 +++++++++++++++++++ ...iew_auto_update.go => gview_hot_update.go} | 6 ++-- geg/os/gview/test.tpl | 2 +- geg/os/gview/web_hot_update.go | 17 +++++++++++ 4 files changed, 51 insertions(+), 4 deletions(-) create mode 100644 geg/os/gview/controller_hot_update.go rename geg/os/gview/{gview_auto_update.go => gview_hot_update.go} (64%) create mode 100644 geg/os/gview/web_hot_update.go diff --git a/geg/os/gview/controller_hot_update.go b/geg/os/gview/controller_hot_update.go new file mode 100644 index 000000000..536db26d6 --- /dev/null +++ b/geg/os/gview/controller_hot_update.go @@ -0,0 +1,30 @@ +package main + + +import ( + "gitee.com/johng/gf/g" + "gitee.com/johng/gf/g/frame/gmvc" +) + +func init() { + g.View().SetPath(`D:\Workspace\Go\GOPATH\src\gitee.com\johng\gf\geg\os\gview`) +} + +// 测试控制器注册模板热更新机制 +type Controller struct { + gmvc.Controller +} + +// 测试模板热更新机制 +func (c *Controller) Test() { + b, _ := c.View.Parse("test.tpl") + c.Response.Write(b) +} + + + +func main() { + s := g.Server() + s.BindController("/", &Controller{}) + s.Run() +} \ No newline at end of file diff --git a/geg/os/gview/gview_auto_update.go b/geg/os/gview/gview_hot_update.go similarity index 64% rename from geg/os/gview/gview_auto_update.go rename to geg/os/gview/gview_hot_update.go index 47cb3ae93..74b142716 100644 --- a/geg/os/gview/gview_auto_update.go +++ b/geg/os/gview/gview_hot_update.go @@ -4,13 +4,13 @@ package main import ( "fmt" "time" + "gitee.com/johng/gf/g" "gitee.com/johng/gf/g/os/gtime" - "gitee.com/johng/gf/g/frame/gins" ) func main() { - v := gins.View() - v.SetPath("/home/john/Workspace/Go/GOPATH/src/gitee.com/johng/gf/geg/os/gview") + v := g.View() + v.SetPath(`D:\Workspace\Go\GOPATH\src\gitee.com\johng\gf\geg\os\gview`) gtime.SetInterval(time.Second, func() bool { b, _ := v.Parse("test.tpl", nil) fmt.Println(string(b)) diff --git a/geg/os/gview/test.tpl b/geg/os/gview/test.tpl index e699e960d..f83d6f176 100644 --- a/geg/os/gview/test.tpl +++ b/geg/os/gview/test.tpl @@ -1 +1 @@ -test.tpl content \ No newline at end of file +test.tpl content2 \ No newline at end of file diff --git a/geg/os/gview/web_hot_update.go b/geg/os/gview/web_hot_update.go new file mode 100644 index 000000000..46624cee9 --- /dev/null +++ b/geg/os/gview/web_hot_update.go @@ -0,0 +1,17 @@ +package main + + +import ( + "gitee.com/johng/gf/g" + "gitee.com/johng/gf/g/net/ghttp" +) + +func main() { + s := g.Server() + s.BindHandler("/", func(r *ghttp.Request) { + g.View().SetPath(`D:\Workspace\Go\GOPATH\src\gitee.com\johng\gf\geg\os\gview`) + b, _ := g.View().Parse("test.tpl", nil) + r.Response.Write(b) + }) + s.Run() +} \ No newline at end of file From f83610389775afa42613b0ec4c0b90587e86f474 Mon Sep 17 00:00:00 2001 From: John Date: Tue, 15 May 2018 15:07:01 +0800 Subject: [PATCH 4/5] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=9C=A8windows=E4=B8=8B?= =?UTF-8?q?=E6=96=87=E4=BB=B6=E5=8F=82=E6=95=B0=E4=B8=AD=E4=B8=8D=E5=90=8C?= =?UTF-8?q?=E6=96=87=E4=BB=B6=E5=88=86=E9=9A=94=E7=AC=A6=E5=BC=95=E8=B5=B7?= =?UTF-8?q?=E7=9A=84=E7=83=AD=E6=9B=B4=E6=96=B0=E6=9C=BA=E5=88=B6=E5=A4=B1?= =?UTF-8?q?=E6=95=88=E9=97=AE=E9=A2=98=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- g/os/gspath/gspath.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/g/os/gspath/gspath.go b/g/os/gspath/gspath.go index 67fd3134f..39d1aac90 100644 --- a/g/os/gspath/gspath.go +++ b/g/os/gspath/gspath.go @@ -61,8 +61,8 @@ func (sp *SPath) Search(name string) string { if path == "" { sp.mu.RLock() for _, v := range sp.paths { - path = v + gfile.Separator + name - if gfile.Exists(path) { + path = gfile.RealPath(v + gfile.Separator + name) + if path != "" && gfile.Exists(path) { break } } From b8964f07ab8acac206fadd35282751c599ad16af Mon Sep 17 00:00:00 2001 From: John Date: Wed, 16 May 2018 17:37:40 +0800 Subject: [PATCH 5/5] =?UTF-8?q?=E6=8E=A7=E5=88=B6=E5=99=A8=E5=8F=8A?= =?UTF-8?q?=E6=89=A7=E8=A1=8C=E5=AF=B9=E8=B1=A1=E6=B3=A8=E5=86=8C=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0=E6=9B=B4=E7=81=B5=E6=B4=BB=E7=9A=84=E5=8A=A8=E6=80=81?= =?UTF-8?q?=E8=B7=AF=E7=94=B1=E7=89=B9=E6=80=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- g/net/ghttp/http_server_service.go | 34 ++++++++++++++++----------- geg/frame/mvc/controller/demo/rule.go | 19 +++++++++++++++ geg/frame/mvc/main.go | 6 ++--- 3 files changed, 42 insertions(+), 17 deletions(-) create mode 100644 geg/frame/mvc/controller/demo/rule.go diff --git a/g/net/ghttp/http_server_service.go b/g/net/ghttp/http_server_service.go index 54a907b36..678d3e652 100644 --- a/g/net/ghttp/http_server_service.go +++ b/g/net/ghttp/http_server_service.go @@ -34,23 +34,29 @@ func (s *Server)bindHandlerByMap(m HandlerMap) error { return nil } -// 将方法名称按照设定的规则转换为URI并附加到指定的URI后面 -func (s *Server)appendMethodNameToUriWithPattern(pattern string, name string) string { +// 将方法名称按照设定的规则合并到pattern中. +// 规则1:pattern中的URI包含{method}关键字,则替换该关键字为方法名称 +// 规则2:如果不满足规则1,那么直接将防发明附加到pattern中的URI后面 +func (s *Server)mergeMethodNameToPattern(pattern string, name string) string { + // 方法名中间存在大写字母,转换为小写URI地址以“-”号链接每个单词 + method := "" + for i := 0; i < len(name); i++ { + if i > 0 && gutil.IsLetterUpper(name[i]) { + method += "-" + } + method += strings.ToLower(string(name[i])) + } + if strings.Index(pattern, "{method}") != -1 { + return strings.Replace(pattern, "{method}", method, -1) + } // 检测域名后缀 array := strings.Split(pattern, "@") // 分离URI(其实可能包含HTTP Method) uri := array[0] uri = strings.TrimRight(uri, "/") + "/" - // 方法名中间存在大写字母,转换为小写URI地址以“-”号链接每个单词 - for i := 0; i < len(name); i++ { - if i > 0 && gutil.IsLetterUpper(name[i]) { - uri += "-" - } - uri += strings.ToLower(string(name[i])) - } // 加上指定域名后缀 if len(array) > 1 { - uri += "@" + array[1] + return uri + "@" + array[1] } return uri } @@ -72,7 +78,7 @@ func (s *Server)BindObject(pattern string, obj interface{}) error { t := v.Type() for i := 0; i < v.NumMethod(); i++ { name := t.Method(i).Name - key := s.appendMethodNameToUriWithPattern(pattern, name) + key := s.mergeMethodNameToPattern(pattern, name) m[key] = &HandlerItem { ctype : nil, fname : "", @@ -100,7 +106,7 @@ func (s *Server)BindObjectMethod(pattern string, obj interface{}, methods string if !fval.IsValid() { return errors.New("invalid method name:" + name) } - key := s.appendMethodNameToUriWithPattern(pattern, name) + key := s.mergeMethodNameToPattern(pattern, name) m[key] = &HandlerItem{ ctype : nil, fname : "", @@ -152,7 +158,7 @@ func (s *Server)BindController(pattern string, c Controller) error { if name == "Init" || name == "Shut" || name == "Exit" { continue } - key := s.appendMethodNameToUriWithPattern(pattern, name) + key := s.mergeMethodNameToPattern(pattern, name) m[key] = &HandlerItem { ctype : v.Elem().Type(), fname : name, @@ -181,7 +187,7 @@ func (s *Server)BindControllerMethod(pattern string, c Controller, methods strin if !cval.MethodByName(name).IsValid() { return errors.New("invalid method name:" + name) } - key := s.appendMethodNameToUriWithPattern(pattern, name) + key := s.mergeMethodNameToPattern(pattern, name) m[key] = &HandlerItem { ctype : ctype, fname : name, diff --git a/geg/frame/mvc/controller/demo/rule.go b/geg/frame/mvc/controller/demo/rule.go new file mode 100644 index 000000000..224f9a885 --- /dev/null +++ b/geg/frame/mvc/controller/demo/rule.go @@ -0,0 +1,19 @@ +package demo + +import ( + "gitee.com/johng/gf/g" + "gitee.com/johng/gf/g/frame/gmvc" +) + +type ControllerRule struct { + gmvc.Controller +} + +func init() { + g.Server().BindController("/rule/{method}/:name", &ControllerRule{}) +} + +func (c *ControllerRule) Show() { + c.Response.Write(c.Request.Get("name")) +} + diff --git a/geg/frame/mvc/main.go b/geg/frame/mvc/main.go index e4161b36b..0544de505 100644 --- a/geg/frame/mvc/main.go +++ b/geg/frame/mvc/main.go @@ -1,11 +1,11 @@ package main import ( - "gitee.com/johng/gf/g/net/ghttp" + "gitee.com/johng/gf/g" _ "gitee.com/johng/gf/geg/frame/mvc/controller/demo" ) func main() { - ghttp.GetServer().SetPort(8199) - ghttp.GetServer().Run() + g.Server().SetPort(8199) + g.Server().Run() }