small changes
parent
a1d7d00963
commit
a95f922155
117
main.go
117
main.go
|
@ -12,90 +12,96 @@ import (
|
|||
"time"
|
||||
)
|
||||
|
||||
var (
|
||||
// App представляет основное состояние приложения
|
||||
type App struct {
|
||||
templates *template.Template
|
||||
startTime int64
|
||||
)
|
||||
}
|
||||
|
||||
func main() {
|
||||
// Инициализация приложения
|
||||
app := AppInit()
|
||||
|
||||
// Загрузка шаблонов
|
||||
tmpls, err := loadTemplates(cfg.TemplatesPath, cfg.TemplatesExt)
|
||||
if err != nil {
|
||||
if err := app.loadTemplates(cfg.TemplatesPath, cfg.TemplatesExt); err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
|
||||
// Настройка маршрутов
|
||||
setupRoutes(tmpls)
|
||||
router := app.setupRouter()
|
||||
|
||||
// Запуск сервера
|
||||
log.Println("Run on", cfg.ServerAddr)
|
||||
startTime = time.Now().Unix()
|
||||
log.Fatal(http.ListenAndServe(cfg.ServerAddr, nil))
|
||||
log.Fatal(http.ListenAndServe(cfg.ServerAddr, router))
|
||||
}
|
||||
|
||||
func setupRoutes(tmpls *template.Template) {
|
||||
// Статика
|
||||
{
|
||||
fs := http.FileServer(http.Dir("assets"))
|
||||
http.Handle("/assets/", http.StripPrefix("/assets/", fs))
|
||||
// Инициализирует приложение
|
||||
func AppInit() *App {
|
||||
return &App{
|
||||
startTime: time.Now().Unix(),
|
||||
}
|
||||
|
||||
// Странички
|
||||
{
|
||||
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
|
||||
|
||||
tmplName := "main.html"
|
||||
context := map[string]any{
|
||||
"timestamp": startTime,
|
||||
}
|
||||
|
||||
if pageData, err := renderPage(tmpls, tmplName, context); err != nil {
|
||||
http.Error(w, err.Error(), http.StatusInternalServerError)
|
||||
} else {
|
||||
sendPage(w, pageData)
|
||||
}
|
||||
|
||||
})
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// Загрузка шаблонов, создание хранилища шаблонов
|
||||
func loadTemplates(
|
||||
templatesPath string,
|
||||
ext string) (*template.Template, error) {
|
||||
// Настраивает маршруты
|
||||
func (a *App) setupRouter() *http.ServeMux {
|
||||
router := http.NewServeMux()
|
||||
|
||||
// Обработка статических файлов
|
||||
fs := http.FileServer(http.Dir("assets"))
|
||||
router.Handle("/assets/", http.StripPrefix("/assets/", fs))
|
||||
|
||||
// Обработка главной страницы
|
||||
router.HandleFunc("/", a.handleMainPage)
|
||||
|
||||
return router
|
||||
}
|
||||
|
||||
// Обработчик главной страницы
|
||||
func (a *App) handleMainPage(w http.ResponseWriter, r *http.Request) {
|
||||
tmplName := "main.html"
|
||||
context := map[string]any{
|
||||
"timestamp": a.startTime,
|
||||
}
|
||||
|
||||
pageData, err := a.renderPage(tmplName, context)
|
||||
if err != nil {
|
||||
http.Error(w, err.Error(), http.StatusInternalServerError)
|
||||
return
|
||||
}
|
||||
|
||||
a.sendPage(w, pageData)
|
||||
}
|
||||
|
||||
// Загрузка шаблонов
|
||||
func (a *App) loadTemplates(templatesPath string, ext string) error {
|
||||
tmpls := template.New("")
|
||||
|
||||
err := filepath.Walk(
|
||||
templatesPath, func(path string, f os.FileInfo, err error) error {
|
||||
err := filepath.Walk(templatesPath, func(path string, f os.FileInfo, err error) error {
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if !f.IsDir() && strings.HasSuffix(f.Name(), ext) {
|
||||
_, err = tmpls.ParseFiles(path)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if !f.IsDir() && strings.HasSuffix(f.Name(), ext) {
|
||||
_, err = tmpls.ParseFiles(path)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
return nil
|
||||
})
|
||||
}
|
||||
return nil
|
||||
})
|
||||
|
||||
if err != nil {
|
||||
return nil, err
|
||||
return err
|
||||
}
|
||||
|
||||
return tmpls, nil
|
||||
a.templates = tmpls
|
||||
return nil
|
||||
}
|
||||
|
||||
// Рендерит шаблон в срез байт
|
||||
func renderPage(
|
||||
tmpl *template.Template,
|
||||
tmplName string,
|
||||
context any) ([]byte, error) {
|
||||
|
||||
func (a *App) renderPage(tmplName string, context any) ([]byte, error) {
|
||||
var pageData bytes.Buffer
|
||||
|
||||
if err := tmpl.ExecuteTemplate(&pageData, tmplName, context); err != nil {
|
||||
if err := a.templates.ExecuteTemplate(&pageData, tmplName, context); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
|
@ -103,10 +109,7 @@ func renderPage(
|
|||
}
|
||||
|
||||
// Отправляет страницу
|
||||
func sendPage(
|
||||
w http.ResponseWriter,
|
||||
data []byte) {
|
||||
|
||||
func (a *App) sendPage(w http.ResponseWriter, data []byte) {
|
||||
w.Header().Set("Content-Type", "text/html; charset=utf-8")
|
||||
w.WriteHeader(http.StatusOK)
|
||||
w.Write(data)
|
||||
|
|
Loading…
Reference in New Issue