106 lines
2.2 KiB
Go
106 lines
2.2 KiB
Go
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(`<input type="hidden" name="csrf_token" value="%s" />`, 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
|
|
}
|