package render import ( "bytes" "context" "fmt" "html/template" "net/http" "path/filepath" "strings" "management/internal/erpserver/model/dto" "management/internal/pkg/know" "github.com/justinas/nosurf" ) type TemplateConfig struct { Root string Extension string Layout string Partial string } type HtmlData struct { IsAuthenticated bool AuthorizeUser dto.AuthorizeUser AuthorizeMenus []*dto.OwnerMenuDto Data any } func (r *render) HTML(w http.ResponseWriter, req *http.Request, tpl string, data map[string]any) { name := strings.ReplaceAll(tpl, "/", "_") t, ok := r.templates[name] if !ok { http.Error(w, "template is empty", http.StatusInternalServerError) return } hd := r.setDefaultData(req, data) buf := new(bytes.Buffer) err := t.ExecuteTemplate(buf, filepath.Base(tpl), hd) if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return } _, err = buf.WriteTo(w) if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return } } func (r *render) setDefaultData(req *http.Request, data map[string]any) map[string]any { if data == nil { data = make(map[string]any) } ctx := req.Context() authUser, err := r.session.GetUser(ctx, know.StoreName) if err != nil || authUser.ID == 0 { data["IsAuthenticated"] = false } else { data["IsAuthenticated"] = true data["AuthorizeMenus"] = r.getCurrentPathButtons(ctx, authUser.RoleID, req.URL.Path) } token := nosurf.Token(req) data["CsrfToken"] = token data["CsrfTokenField"] = template.HTML(fmt.Sprintf(``, token)) return data } func (r *render) getCurrentPathButtons(ctx context.Context, roleID int32, path string) []*dto.OwnerMenuDto { var res []*dto.OwnerMenuDto // 获取当前登陆角色的权限 menus, err := r.menuService.ListByRoleIDToMap(ctx, roleID) if err != nil { return res } menu, ok := menus[path] if !ok { return res } for _, item := range menus { if menu.IsList { if item.ParentID == menu.ID || item.ID == menu.ID { res = append(res, item) } } else { if item.ParentID == menu.ParentID { res = append(res, item) } } } return res }