// Package view // @Link https://github.com/bufanyun/hotgo // @Copyright Copyright (c) 2022 HotGo CLI // @Author Ms <133814250@qq.com> // @License https://github.com/bufanyun/hotgo/blob/master/LICENSE // package view import ( "context" "github.com/gogf/gf/v2/frame/g" "github.com/gogf/gf/v2/os/gfile" "github.com/gogf/gf/v2/text/gstr" "github.com/gogf/gf/v2/util/gconv" "hotgo/internal/model" "hotgo/internal/service" ) type sView struct{} func init() { service.RegisterView(New()) } func New() *sView { return &sView{} } // GetBreadCrumb 前台系统-获取面包屑列表 func (s *sView) GetBreadCrumb(ctx context.Context, in *model.ViewGetBreadCrumbInput) []model.ViewBreadCrumb { breadcrumb := []model.ViewBreadCrumb{ {Name: "首页", Url: "/"}, } return breadcrumb } // GetTitle 前台系统-获取标题 func (s *sView) GetTitle(ctx context.Context, in *model.ViewGetTitleInput) string { return "title" } // RenderTpl 渲染指定模板页面 func (s *sView) RenderTpl(ctx context.Context, tpl string, data ...model.View) { var ( viewObj = model.View{} viewData = make(g.Map) request = g.RequestFromCtx(ctx) ) if len(data) > 0 { viewObj = data[0] } if viewObj.Title == "" { viewObj.Title = g.Cfg().MustGet(ctx, `setting.title`).String() } else { viewObj.Title = viewObj.Title + ` - ` + g.Cfg().MustGet(ctx, `setting.title`).String() } if viewObj.Keywords == "" { viewObj.Keywords = g.Cfg().MustGet(ctx, `setting.keywords`).String() } if viewObj.Description == "" { viewObj.Description = g.Cfg().MustGet(ctx, `setting.description`).String() } if viewObj.IpcCode == "" { viewObj.IpcCode = g.Cfg().MustGet(ctx, `setting.icpCode`).String() } if viewObj.GET == nil { viewObj.GET = request.GetQueryMap() } // 去掉空数据 viewData = gconv.Map(viewObj) for k, v := range viewData { if g.IsEmpty(v) { delete(viewData, k) } } // 内置对象 viewData["BuildIn"] = &viewBuildIn{httpRequest: request} // 渲染模板 _ = request.Response.WriteTpl(tpl, viewData) } // Render 渲染默认模板页面 func (s *sView) Render(ctx context.Context, data ...model.View) { s.RenderTpl(ctx, g.Cfg().MustGet(ctx, "viewer.homeLayout").String(), data...) } // Render302 跳转中间页面 func (s *sView) Render302(ctx context.Context, data ...model.View) { view := model.View{} if len(data) > 0 { view = data[0] } if view.Title == "" { view.Title = "页面跳转中" } //view.MainTpl = s.getViewFolderName(ctx) + "/pages/302.html" //s.Render(ctx, view) s.RenderTpl(ctx, "default/pages/302.html", view) } // Render401 401页面 func (s *sView) Render401(ctx context.Context, data ...model.View) { view := model.View{} if len(data) > 0 { view = data[0] } if view.Title == "" { view.Title = "无访问权限" } s.RenderTpl(ctx, "default/pages/401.html", view) } // Render403 403页面 func (s *sView) Render403(ctx context.Context, data ...model.View) { view := model.View{} if len(data) > 0 { view = data[0] } if view.Title == "" { view.Title = "无访问权限" } s.RenderTpl(ctx, "default/pages/403.html", view) } // Render404 404页面 func (s *sView) Render404(ctx context.Context, data ...model.View) { view := model.View{} if len(data) > 0 { view = data[0] } if view.Title == "" { view.Title = "资源不存在" } s.RenderTpl(ctx, "default/pages/404.html", view) } // Render500 500页面 func (s *sView) Render500(ctx context.Context, data ...model.View) { view := model.View{} if len(data) > 0 { view = data[0] } if view.Title == "" { view.Title = "请求执行错误" } s.RenderTpl(ctx, "default/pages/500.html", view) } func (s *sView) Error(ctx context.Context, err error) { view := model.View{ Title: "错误提示", Error: err.Error(), } s.RenderTpl(ctx, "default/pages/500.html", view) } // 获取视图存储目录 func (s *sView) getViewFolderName(ctx context.Context) string { return gstr.Split(g.Cfg().MustGet(ctx, "viewer.indexLayout").String(), "/")[0] } // 获取自动设置的MainTpl func (s *sView) getDefaultMainTpl(ctx context.Context) string { var ( viewFolderPrefix = s.getViewFolderName(ctx) urlPathArray = gstr.SplitAndTrim(g.RequestFromCtx(ctx).URL.Path, "/") mainTpl string ) if len(urlPathArray) > 0 && urlPathArray[0] == viewFolderPrefix { urlPathArray = urlPathArray[1:] } switch { case len(urlPathArray) == 2: // 如果2级路由为数字,那么为模块的详情页面,那么路由固定为/xxx/detail。 // 如果需要定制化内容模板,请在具体路由方法中设置MainTpl。 if gstr.IsNumeric(urlPathArray[1]) { urlPathArray[1] = "detail" } mainTpl = viewFolderPrefix + "/" + gfile.Join(urlPathArray[0], urlPathArray[1]) + ".html" case len(urlPathArray) == 1: mainTpl = viewFolderPrefix + "/" + urlPathArray[0] + "/index.html" default: // 默认首页内容 mainTpl = viewFolderPrefix + "/index/index.html" } return gstr.TrimLeft(mainTpl, "/") }