some changes

posts
serr 2025-04-10 22:43:47 +03:00
parent 70d82d69d1
commit b68851c862
9 changed files with 43 additions and 50 deletions

30
main.go
View File

@ -12,11 +12,19 @@ import (
) )
func main() { func main() {
var app *models.App
var err error var err error
// Инициализация конфига
if err := models.Cfg.Load("config.json"); err != nil {
log.Fatal(err)
}
// Инициализация приложения // Загрузка постов
if app, err = models.AppInit(); err != nil { if err := models_pages.LoadPosts(models.Cfg.PostsDir); err != nil {
log.Fatal(err)
}
// Инициализация приложения (обязательно после инициализации конфига)
if err := models.InitApp(); err != nil {
log.Fatal(err) log.Fatal(err)
} }
@ -24,14 +32,14 @@ func main() {
log.SetPrefix(fmt.Sprintf("%s | ", models.Cfg.ServerDomain)) log.SetPrefix(fmt.Sprintf("%s | ", models.Cfg.ServerDomain))
// Настройка маршрутов и запуск // Настройка маршрутов и запуск
if setupRoutesAndRun(app) != nil { if setupRoutesAndRun() != nil {
log.Fatal(err) log.Fatal(err)
} }
} }
func setupRoutesAndRun(a *models.App) error { func setupRoutesAndRun() error {
// Настройка маршрутов // Настройка маршрутов
router := setupRoutes(a) router := setupRoutes()
// Запуск сервера // Запуск сервера
if ok, err := tools.IsIPInUse(models.Cfg.ServerIP); err != nil { if ok, err := tools.IsIPInUse(models.Cfg.ServerIP); err != nil {
@ -46,7 +54,7 @@ func setupRoutesAndRun(a *models.App) error {
} }
// Настраивает маршруты // Настраивает маршруты
func setupRoutes(a *models.App) *http.ServeMux { func setupRoutes() *http.ServeMux {
router := http.NewServeMux() router := http.NewServeMux()
// Цепочка обработчиков, которые сработают до отдачи страницы юзеру // Цепочка обработчиков, которые сработают до отдачи страницы юзеру
@ -58,15 +66,15 @@ func setupRoutes(a *models.App) *http.ServeMux {
// Главные странички // Главные странички
{ {
// Обработка главной страницы (русская версия) // Обработка главной страницы (русская версия)
router.Handle("/ru/", m(controllers_pages.MainRuPageHandler(a))) router.Handle("/ru/", m(controllers_pages.MainRuPageHandler()))
// Обработка главной страницы // Обработка главной страницы
router.Handle("/", m(controllers_pages.MainPageHandler(a))) router.Handle("/", m(controllers_pages.MainPageHandler()))
// Обработка страницы со списком постов // Обработка страницы со списком постов
router.Handle("/posts/", m(controllers_pages.PostsPageHandler(a))) router.Handle("/posts/", m(controllers_pages.PostsPageHandler()))
// Обработка страничек постов // Обработка страничек постов
for key := range models_pages.GetPosts() { for key := range models_pages.GetPosts() {
postLink := string(key) postLink := string(key)
router.Handle(postLink, m(controllers_pages.PostPageHandler(a))) router.Handle(postLink, m(controllers_pages.PostPageHandler()))
} }
} }

View File

@ -10,7 +10,7 @@ import (
) )
// Обработчик главной страницы // Обработчик главной страницы
func MainPageHandler(a *models.App) http.HandlerFunc { func MainPageHandler() http.HandlerFunc {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
var err error var err error
@ -40,7 +40,7 @@ func MainPageHandler(a *models.App) http.HandlerFunc {
// Страничка рендерится только если ее нет в кэше // Страничка рендерится только если ее нет в кэше
pageData, ok := models.PagesCache.Get(models_pages.MainPageTmplName) pageData, ok := models.PagesCache.Get(models_pages.MainPageTmplName)
if !ok { if !ok {
pageData, err = models_pages.RenderMainPage(a.Templates, a.Version) pageData, err = models_pages.RenderMainPage(models.App.Templates, models.App.Version)
if err != nil { if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError) http.Error(w, err.Error(), http.StatusInternalServerError)
return return

View File

@ -7,14 +7,14 @@ import (
) )
// Обработчик главной страницы // Обработчик главной страницы
func MainRuPageHandler(a *models.App) http.HandlerFunc { func MainRuPageHandler() http.HandlerFunc {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
var err error var err error
// Страничка рендерится только если ее нет в кэше // Страничка рендерится только если ее нет в кэше
pageData, ok := models.PagesCache.Get(models_pages.MainRuPageTmplName) pageData, ok := models.PagesCache.Get(models_pages.MainRuPageTmplName)
if !ok { if !ok {
pageData, err = models_pages.RenderMainRuPage(a.Templates, a.Version) pageData, err = models_pages.RenderMainRuPage(models.App.Templates, models.App.Version)
if err != nil { if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError) http.Error(w, err.Error(), http.StatusInternalServerError)
return return

View File

@ -7,7 +7,7 @@ import (
) )
// Обработчик главной страницы // Обработчик главной страницы
func PostPageHandler(a *models.App) http.HandlerFunc { func PostPageHandler() http.HandlerFunc {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
var err error var err error
@ -19,7 +19,7 @@ func PostPageHandler(a *models.App) http.HandlerFunc {
post := posts[models_pages.PostLink(r.URL.Path)] post := posts[models_pages.PostLink(r.URL.Path)]
pageData, err = models_pages.RenderPostPage(a.Templates, a.Version, post.Data) pageData, err = models_pages.RenderPostPage(models.App.Templates, models.App.Version, post.Data)
if err != nil { if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError) http.Error(w, err.Error(), http.StatusInternalServerError)
return return

View File

@ -7,14 +7,14 @@ import (
) )
// Обработчик главной страницы // Обработчик главной страницы
func PostsPageHandler(a *models.App) http.HandlerFunc { func PostsPageHandler() http.HandlerFunc {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
var err error var err error
// Страничка рендерится только если ее нет в кэше // Страничка рендерится только если ее нет в кэше
pageData, ok := models.PagesCache.Get(models_pages.PostsPageTmplName) pageData, ok := models.PagesCache.Get(models_pages.PostsPageTmplName)
if !ok { if !ok {
pageData, err = models_pages.RenderPostsPage(a.Templates, a.Version) pageData, err = models_pages.RenderPostsPage(models.App.Templates, models.App.Version)
if err != nil { if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError) http.Error(w, err.Error(), http.StatusInternalServerError)
return return

View File

@ -2,7 +2,6 @@ package models
import ( import (
"html/template" "html/template"
"log"
"os" "os"
"path/filepath" "path/filepath"
"strings" "strings"
@ -10,28 +9,29 @@ import (
) )
// App хранит шаблоны и время запуска // App хранит шаблоны и время запуска
type App struct { type app struct {
Templates *template.Template // Шаблоны страниц Templates *template.Template // Шаблоны страниц
Version int64 // Время запуска Version int64 // Время запуска
} }
var (
App = &app{}
)
// Инициализирует приложение // Инициализирует приложение
func AppInit() (*App, error) { func InitApp() error {
a := &App{ App.Version = time.Now().Unix()
Version: time.Now().Unix(),
// Загрузка шаблонов
if err := App.loadTemplates(Cfg.TemplatesDir, Cfg.TemplatesExt); err != nil {
return err
}
return nil
} }
// Загрузка шаблонов // Загрузка шаблонов
if err := a.loadTemplates(Cfg.TemplatesDir, Cfg.TemplatesExt); err != nil { func (a *app) loadTemplates(templatesPath string, ext string) error {
log.Fatal(err)
}
return a, nil
}
// Загрузка шаблонов
func (a *App) loadTemplates(templatesPath string, ext string) error {
tmpls := template.New("") 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 {

View File

@ -2,7 +2,6 @@ package models
import ( import (
"encoding/json" "encoding/json"
"log"
"os" "os"
) )
@ -20,16 +19,10 @@ type config struct {
} }
var ( var (
Cfg = config{} Cfg = &config{}
) )
func init() { func (c *config) Load(configPath string) error {
if err := Cfg.load("config.json"); err != nil {
log.Fatalf("%v", err)
}
}
func (c *config) load(configPath string) error {
configFile, err := os.ReadFile(configPath) configFile, err := os.ReadFile(configPath)
if err != nil { if err != nil {
return err return err

View File

@ -5,8 +5,6 @@ import (
"fmt" "fmt"
"html/template" "html/template"
"io" "io"
"log"
"main/mvc/models"
"main/tools" "main/tools"
"os" "os"
"path/filepath" "path/filepath"
@ -25,17 +23,11 @@ var (
allPosts = posts{} allPosts = posts{}
) )
func init() {
if err := loadPosts(models.Cfg.PostsDir); err != nil {
log.Fatalf("%v", err)
}
}
func GetPosts() posts { func GetPosts() posts {
return allPosts return allPosts
} }
func loadPosts(dir string) error { func LoadPosts(dir string) error {
err := filepath.Walk(dir, func(path string, f os.FileInfo, err error) error { err := filepath.Walk(dir, func(path string, f os.FileInfo, err error) error {
if err != nil { if err != nil {
return err return err

View File

@ -1,2 +1,2 @@
# Это тестовый пост # Это тестовый пост
Этот пост был написан в файле формата .md [Этот](/test/) пост был *написан* в файле **формата** .md