func CreateFromSelectCommandAndHttpContext(Select *MysqlAst.SelectCommand, Ctx *kmgHttp.Context) *KmgPage { page := &KmgPage{} page.BaseUrl = Ctx.GetRequestUrl() page.CurrentPage = Ctx.InNum("Page") page.PageKeyName = "Page" page.init() return page.runSelectCommand(Select) }
// 默认不用这个,容易搞的测试里面到处都是log. // TODO 静态文件的log问题 // TODO 尝试搞出更好用的log系统. func RequestLogger(ctx *kmgHttp.Context, processorList []HttpProcessor) { startTime := time.Now() processorList[0](ctx, processorList[1:]) time := time.Since(startTime) log := ctx.Log() log.ProcessTime = kmgTime.DurationFormat(time) kmgLog.Log("Request", log) }
func PanicHandler(ctx *kmgHttp.Context, processorList []HttpProcessor) { err := kmgErr.PanicToErrorAndLog(func() { processorList[0](ctx, processorList[1:]) }) if err != nil { ctx.Error(err) return } return }
func (e Example) DemoPostAction(ctx *kmgHttp.Context) { ctx.MustPost() b := kmgYaml.MustMarshal(ctx.GetInMap()) ctx.WriteString(kmgBootstrap.NewWrap("DemoPostAction", kmgBootstrap.Pre(` You send me a HTTP POST Request `+string(b))).HtmlRender()) }
func Dispatcher(ctx *kmgHttp.Context, processorList []HttpProcessor) { apiName := ctx.InStr("n") if apiName == "" && EnterPointApiName != "" { if ctx.GetRequestUrl() == "/favicon.ico" { // 避免网站图标请求,占用大量资源. ctx.NotFound("api not found") return } apiName = EnterPointApiName } apiFunc, ok := controllerObjMap[apiName] if !ok { ctx.NotFound("api not found") return } apiFunc(ctx) return }
func (e Example) Demo1(ctx *kmgHttp.Context) { ctx.WriteString(kmgBootstrap.NewWrap("kmg bootstrap demo", kmgBootstrap.NavBar{ Title: kmgView.String("kmgBootstrap DEMO"), OptionList: []kmgBootstrap.NavBarNode{ {Name: "主页", Url: "/"}, { Name: "测试菜单1", Url: "/?menu=1", ChildList: []kmgBootstrap.NavBarNode{ { Name: "测试菜单-子菜单1-1", Url: "/?menu=1-1", ChildList: []kmgBootstrap.NavBarNode{ { Name: "测试菜单-子菜单1-1-1", Url: "/?menu=1-1-1", ChildList: []kmgBootstrap.NavBarNode{ {Name: "测试菜单-子菜单1-1-1-1", Url: "/?menu=1-1-1-1"}, }, }, {Name: "测试菜单-子菜单1-1-2", Url: "/?menu=1-1-2"}, }, }, {Name: "测试菜单-子菜单1-2", Url: "/?menu=1-2"}, }, }, }, RightOptionList: []kmgBootstrap.NavBarNode{ { Name: "测试菜单1右", Url: "/", ChildList: []kmgBootstrap.NavBarNode{ {Name: "测试菜单-子菜单1-1右边", Url: "/"}, }, }, }, }, kmgBootstrap.Panel{ Title: "Panel", Body: kmgBootstrap.Panel{ Title: "Panel", Body: kmgView.String("Body"), }, }, kmgBootstrap.Panel{ Title: "Table", Body: kmgBootstrap.Table{ Caption: kmgView.String("Caption"), TitleList: []kmgView.HtmlRenderer{ kmgView.String("title1"), kmgView.String("title2"), }, DataList: [][]kmgView.HtmlRenderer{ { kmgView.String("r1c1"), kmgView.String("r1c2"), }, { kmgView.String("r2c1"), kmgView.String("r2c2"), }, }, }, }, kmgBootstrap.Panel{ Title: "DropDown", Body: kmgView.HtmlRendererList{ kmgView.String("使用 DropDown"), kmgBootstrap.DropDown{ Title: kmgBootstrap.Button{ Size: kmgBootstrap.ButtonSizeSmall, Color: kmgBootstrap.ButtonColorSuccess, Content: kmgView.HtmlRendererList{ kmgView.String("更多"), kmgBootstrap.Blank(1), kmgBootstrap.NewCaret(), }, }, OptionList: []kmgBootstrap.NavBarNode{ { Name: "Say", Url: "/", ChildList: []kmgBootstrap.NavBarNode{ { Name: "你好", }, { Name: "Hello", }, { Name: "もしもし", }, { Name: "Ciao", }, }, }, { Name: "Do", ChildList: []kmgBootstrap.NavBarNode{ { Name: "Walk", }, { Name: "Sleep", }, }, }, }, }, kmgView.String("将操作集中起来,节省空间"), kmgBootstrap.Br(1), kmgView.String("还可以使用快捷方法 kmgBootstrap.NewMoreButton,获得默认样式"), kmgBootstrap.NewMoreButton([]kmgBootstrap.NavBarNode{ { Name: "新增", }, { Name: "删除", }, { Name: "编辑", }, }), }, }, kmgBootstrap.Panel{ Title: "Icon", Body: kmgBootstrap.Icon{ IconName: "exchange", IconColor: kmgBootstrap.TextDanger, AttributeNode: kmgBootstrap.Popover{Title: "这里应该有一个图标"}, }, }, kmgBootstrap.Panel{ Title: "NavTabList", Body: kmgView.HtmlRendererList{ kmgBootstrap.NavTabList{ ActiveName: "状态1", OptionList: []kmgBootstrap.NavTabOption{ {Name: "状态1", Url: "/#1"}, {Name: "状态2", Url: "/#2"}, }, }, kmgBootstrap.Br(1), kmgBootstrap.NavTabList{ ActiveName: "状态3", CustomClass: "nav-tabs", OptionList: []kmgBootstrap.NavTabOption{ {Name: "状态3", Url: "/#3"}, {Name: "状态4", Url: "/#4"}, }, }, }, }, kmgBootstrap.Panel{ Title: "Form", Body: kmgView.HtmlRendererList{ kmgBootstrap.Form{ Url: "/", InputList: []kmgView.HtmlRenderer{ kmgBootstrap.InputVerticalString{ Name: "UserName", ShowName: "用户名", Value: "enter your username here", Comment: "必填", Need: true, }, kmgBootstrap.TextAreaVerticalString{ ShowName: "服务条款", Value: "服务条款", ReadOnly: true, }, kmgBootstrap.SelectVerticalString{ ShowName: "性别", Value: "girl", Name: "Gender", OptionList: []kmgBootstrap.SelectOption{ {ShowName: "男", Value: "boy"}, {ShowName: "女", Value: "girl"}, }, }, }, }, kmgBootstrap.Br(2), kmgBootstrap.Pre(`从 URL 直接发送 POST 的链接`), kmgBootstrap.NewPostButton("/?n=main.Example.DemoPostAction&Name=kmg&Age=12", "POST 请求"), kmgBootstrap.Blank(2), kmgBootstrap.NewGetButton("/?n=main.Example.DemoPostAction&Name=kmg&Age=12", "非 POST 请求"), }, }, ).HtmlRender()) }
func (t TestApiObj) Count(ctx *kmgHttp.Context) { shareSessionId = ctx.Session.Id ctx.WriteString(ctx.Session.Id) }
func (t TestObj) TestHandleUploadFile(ctx *kmgHttp.Context) { fileInfo := ctx.MustInFile("UFile") file, err := fileInfo.Open() if err != nil { panic(err) } defer file.Close() content, err := ioutil.ReadAll(file) if err != nil { panic(err) } a := ctx.InStr("a") ctx.WriteString(fileInfo.Filename) ctx.WriteString(" ") ctx.WriteString(a) ctx.WriteString(" ") ctx.WriteString(string(content)) }
func (t TestObj) TestFunc(ctx *kmgHttp.Context) { a := ctx.InNum("a") ctx.WriteString(strconv.Itoa(a + i)) }
func (ot *OverseaTrade) mustNotifyActionV2(ctx *kmgHttp.Context, f func(info OverseaTradeTransaction)) { kmgLog.Log("Alipay", "Oversea PayNotifyAction", ctx.GetInMap()) var err error ctx.MustPost() info := OverseaTradeTransaction{} //info.NotifyId = ctx.MustInStr("notify_id") 这两项没有什么意义. //info.NotifyTime = kmgTime.MustFromMysqlFormatInLocation(ctx.MustInStr("notify_time"), kmgTime.BeijingZone) info.OutTradeNo = ctx.MustInStr("out_trade_no") info.Currency = ctx.MustInStr("currency") info.TotalFee, err = kmgStrconv.ParseFloat64(ctx.MustInStr("total_fee")) if err != nil { panic(err) } info.TradeStatus = OverseaTradeStatus(ctx.MustInStr("trade_status")) info.TradeNo = ctx.MustInStr("trade_no") err = ot.md5Verify(ctx.GetInMap()) if err != nil { panic(err) } err = ot.VerifyNotify(ctx.MustInStr("notify_id")) if err != nil { panic(err) } // 向支付宝询问这个订单的情况 oInfo := ot.MustSingleTransactionQuery(info.OutTradeNo) if oInfo.TradeStatus != info.TradeStatus { panic("两次查询订单状态不一致") } info.Subject = oInfo.Subject f(info) ctx.WriteString("success") }
// 同步回调 // 调用前请清除您自己的参数. // @deprecated 请使用 OverseaTrade.PayFinishCallback 和 OverseaTrade.PayCloseCallback func (ot *OverseaTrade) MustReturnPage(ctx *kmgHttp.Context) (info OverseaTradeTransaction) { kmgLog.Log("Alipay", "Oversea PayReturnPage", ctx.GetInMap()) var err error info.OutTradeNo = ctx.MustInStr("out_trade_no") info.Currency = ctx.MustInStr("currency") info.TotalFee, err = kmgStrconv.ParseFloat64(ctx.MustInStr("total_fee")) if err != nil { panic(err) } info.TradeStatus = OverseaTradeStatus(ctx.MustInStr("trade_status")) info.TradeNo = ctx.MustInStr("trade_no") //这个也可以验证数据,只是文档上面没写. err = ot.md5Verify(ctx.GetInMap()) if err != nil { panic(err) } // 向支付宝询问这个订单的情况 oInfo := ot.MustSingleTransactionQuery(info.OutTradeNo) if oInfo.TradeStatus != info.TradeStatus { panic("两次查询订单状态不一致") } info.Subject = oInfo.Subject return info }
// 请不要手动调用,这个是自动注册到 kmgControllerRunner里面的 func (ot *OverseaTrade) NotifyAction(ctx *kmgHttp.Context) { ctx.DeleteInMap("n") ot.mustNotifyActionV2(ctx, ot.payCallbackProceess) }
// 请不要手动调用,这个是自动注册到 kmgControllerRunner里面的 func (ot *OverseaTrade) ReturnPage(ctx *kmgHttp.Context) { ctx.DeleteInMap("n") info := ot.MustReturnPage(ctx) ot.payCallbackProceess(info) ot.PayReturnPageCallback(info, ctx) }
//Server Side func GetIPFromCTXAndRespond(ctx *kmgHttp.Context) { req := ctx.GetRequest() address := req.RemoteAddr address = strings.Split(address, ":")[0] ctx.WriteString("OK" + address) }
func (s *Demo) DemoClientIp(httpCtx *kmgHttp.Context) (ip string) { return httpCtx.MustGetClientIp().String() }