some changes
parent
70d82d69d1
commit
b68851c862
30
main.go
30
main.go
|
@ -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()))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -1,2 +1,2 @@
|
||||||
# Это тестовый пост
|
# Это тестовый пост
|
||||||
Этот пост был написан в файле формата .md
|
[Этот](/test/) пост был *написан* в файле **формата** .md
|
||||||
|
|
Loading…
Reference in New Issue