hotgo/server/internal/logic/view/view.go

193 lines
4.9 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// Package view
// @Link https://github.com/bufanyun/hotgo
// @Copyright Copyright (c) 2023 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, "/")
}