feat: Add guide page
This commit is contained in:
@@ -22,6 +22,7 @@ COPY --from=frontend-builder /_frontend/out ./_frontend/out
|
|||||||
COPY --from=backend-builder /backend/phc-website-server ./phc-website-server
|
COPY --from=backend-builder /backend/phc-website-server ./phc-website-server
|
||||||
COPY ./_views ./_views
|
COPY ./_views ./_views
|
||||||
COPY ./_content/news ./_content/news
|
COPY ./_content/news ./_content/news
|
||||||
|
COPY ./_content/guide ./_content/guide
|
||||||
COPY ./_public ./_public
|
COPY ./_public ./_public
|
||||||
COPY ./.env ./.env
|
COPY ./.env ./.env
|
||||||
EXPOSE 8000
|
EXPOSE 8000
|
||||||
|
|||||||
@@ -0,0 +1,19 @@
|
|||||||
|
---
|
||||||
|
id: guida-git
|
||||||
|
title: "Guida a Git"
|
||||||
|
tags: git
|
||||||
|
publish_date: 2022/08/27 22:00
|
||||||
|
description: |
|
||||||
|
Vedremo come creare una repository Git per tracciare i cambiamenti di una serie di file nel tempo, e molto altro.
|
||||||
|
---
|
||||||
|
|
||||||
|
## A cosa serve
|
||||||
|
|
||||||
|
## Creiamo una repository git
|
||||||
|
|
||||||
|
Nonostante per grossi progetti sia comodo usare server Git come github.com, che essendo popolare attirerà l'attenzione di più potenziali __contributors__, per progetti personali o
|
||||||
|
di piccola scala va benissimo utilizzare un server **self-hostato**: in questo caso noi useremo il server del PHC.
|
||||||
|
|
||||||
|
Per prima cosa, visitiamo git.phc.dm.unipi.it ed accediamo con le credenziali di
|
||||||
|
|
||||||
|
## Comandi di base
|
||||||
@@ -0,0 +1,31 @@
|
|||||||
|
---
|
||||||
|
id: guida-terminale
|
||||||
|
title: "Guida al Terminale"
|
||||||
|
tags: shell, zsh, vim, ssh
|
||||||
|
publish_date: 2022/08/27 22:00
|
||||||
|
description: |
|
||||||
|
Questo articolo introduce all'uso dei comandi di base di un terminale su sistemi Unix come Linux e MacOS; parleremo inoltre di Vim, Zsh e SSH.
|
||||||
|
---
|
||||||
|
|
||||||
|
## 1. Shell & Terminale: differenze?
|
||||||
|
|
||||||
|
- introduzione storica + bash
|
||||||
|
|
||||||
|
### Le Basi
|
||||||
|
|
||||||
|
- keybinding utili: ctrl+a/e, ctrl+c, ctrl+d
|
||||||
|
- copiare/incollare testo
|
||||||
|
- comandi di base: navigazione(cd, ls), modifica(cp, mv, rm, mkdir)
|
||||||
|
- chiedere aiuto: man, info
|
||||||
|
|
||||||
|
### Zsh: una shell moderna e potente
|
||||||
|
|
||||||
|
https://wiki.archlinux.org/title/Zsh
|
||||||
|
|
||||||
|
## 2. Vim: l'Editor intramontabile
|
||||||
|
Parentesi storica, neovim, VimTutor e comandi di base(come si esce?)
|
||||||
|
|
||||||
|
## 3. E la TTY?
|
||||||
|
Come utilizzarla, quando è utile, limitazioni(no scrollback)
|
||||||
|
|
||||||
|
## SSH: la magia della remote shell
|
||||||
@@ -0,0 +1,18 @@
|
|||||||
|
{{template "base" .}}
|
||||||
|
|
||||||
|
{{define "title"}}{{ .Article.Title }} • Guide • PHC{{end}}
|
||||||
|
|
||||||
|
{{define "body"}}
|
||||||
|
<section class="news-content">
|
||||||
|
<h1>{{ .Article.Title }}</h1>
|
||||||
|
<div class="date">
|
||||||
|
{{ .Article.PublishDate.Format "2006/01/02" }}
|
||||||
|
</div>
|
||||||
|
<div class="tags">
|
||||||
|
{{ range .Article.Tags }}
|
||||||
|
<span class="tag">{{ . }}</span>
|
||||||
|
{{ end }}
|
||||||
|
</div>
|
||||||
|
{{ .ContentHTML }}
|
||||||
|
</section>
|
||||||
|
{{end}}
|
||||||
@@ -0,0 +1,33 @@
|
|||||||
|
{{template "base" .}}
|
||||||
|
|
||||||
|
{{define "title"}}Guide • PHC{{end}}
|
||||||
|
|
||||||
|
{{define "body"}}
|
||||||
|
<section>
|
||||||
|
<h1>
|
||||||
|
<i class="fa-solid fa-person-chalkboard"></i>
|
||||||
|
Articoli
|
||||||
|
</h1>
|
||||||
|
<div class="card-list">
|
||||||
|
{{ range .Articles }}
|
||||||
|
<div class="card">
|
||||||
|
<div class="title">
|
||||||
|
<a href="/guide/{{ .Id }}">
|
||||||
|
{{ .Title }}
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
<div class="date">{{ .PublishDate.Format "2006/01/02" }}</div>
|
||||||
|
<div class="description">
|
||||||
|
<p>{{ .Description }}</p>
|
||||||
|
</div>
|
||||||
|
<div class="tags">
|
||||||
|
{{ range .Tags }}
|
||||||
|
<span class="tag">{{ . }}</span>
|
||||||
|
{{ end }}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{{ end }}
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
{{end}}
|
||||||
@@ -22,7 +22,8 @@ func main() {
|
|||||||
"./_views/base.html",
|
"./_views/base.html",
|
||||||
"./_views/partials/*.html",
|
"./_views/partials/*.html",
|
||||||
),
|
),
|
||||||
NewsArticlesRegistry: articles.NewRegistry("./_content/news"),
|
NewsArticlesRegistry: articles.NewRegistry("./_content/news"),
|
||||||
|
GuideArticlesRegistry: articles.NewRegistry("./_content/guide"),
|
||||||
ListaUtenti: &website.JsonFileListUtenti{
|
ListaUtenti: &website.JsonFileListUtenti{
|
||||||
Path: "./utenti-poisson-2022.local.json",
|
Path: "./utenti-poisson-2022.local.json",
|
||||||
},
|
},
|
||||||
|
|||||||
+40
-7
@@ -20,11 +20,13 @@ type Service interface {
|
|||||||
HandleStoriaPage(w io.Writer, ctx Context) error
|
HandleStoriaPage(w io.Writer, ctx Context) error
|
||||||
HandleQueryAppunti(w io.Writer, query string, ctx Context) error
|
HandleQueryAppunti(w io.Writer, query string, ctx Context) error
|
||||||
HandleNewsPage(w io.Writer, ctx Context) error
|
HandleNewsPage(w io.Writer, ctx Context) error
|
||||||
|
HandleGuidePage(w io.Writer, ctx Context) error
|
||||||
HandleLogin(username, password string) (*model.Session, error)
|
HandleLogin(username, password string) (*model.Session, error)
|
||||||
HandleUser(token string) *model.User
|
HandleUser(token string) *model.User
|
||||||
HandleRequiredUser(ctx Context) (*model.User, error)
|
HandleRequiredUser(ctx Context) (*model.User, error)
|
||||||
HandleProfilePage(w io.Writer, ctx Context) error
|
HandleProfilePage(w io.Writer, ctx Context) error
|
||||||
HandleArticlePage(w io.Writer, articleID string, ctx Context) error
|
HandleNewsArticlePage(w io.Writer, articleID string, ctx Context) error
|
||||||
|
HandleGuideArticlePage(w io.Writer, articleID string, ctx Context) error
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
@@ -40,11 +42,12 @@ func (ctx Context) getUser() *model.User {
|
|||||||
|
|
||||||
// Handler holds references to abstract services for easy testing provided by every module (TODO: Make every field an interface of -Service)
|
// Handler holds references to abstract services for easy testing provided by every module (TODO: Make every field an interface of -Service)
|
||||||
type DefaultHandler struct {
|
type DefaultHandler struct {
|
||||||
AuthService auth.Service
|
AuthService auth.Service
|
||||||
Renderer *templates.TemplateRenderer
|
Renderer *templates.TemplateRenderer
|
||||||
NewsArticlesRegistry *articles.Registry
|
NewsArticlesRegistry *articles.Registry
|
||||||
ListaUtenti website.ListaUtentiService
|
GuideArticlesRegistry *articles.Registry
|
||||||
Storia website.StoriaService
|
ListaUtenti website.ListaUtentiService
|
||||||
|
Storia website.StoriaService
|
||||||
}
|
}
|
||||||
|
|
||||||
func (h *DefaultHandler) HandleStaticPage(w io.Writer, view string, ctx Context) error {
|
func (h *DefaultHandler) HandleStaticPage(w io.Writer, view string, ctx Context) error {
|
||||||
@@ -102,6 +105,18 @@ func (h *DefaultHandler) HandleNewsPage(w io.Writer, ctx Context) error {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (h *DefaultHandler) HandleGuidePage(w io.Writer, ctx Context) error {
|
||||||
|
articles, err := h.GuideArticlesRegistry.GetArticles()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
return h.Renderer.Render(w, "guide.html", util.Map{
|
||||||
|
"User": ctx.getUser(),
|
||||||
|
"Articles": articles,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
func (h *DefaultHandler) HandleLogin(username, password string) (*model.Session, error) {
|
func (h *DefaultHandler) HandleLogin(username, password string) (*model.Session, error) {
|
||||||
session, err := h.AuthService.Login(username, password)
|
session, err := h.AuthService.Login(username, password)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -138,7 +153,7 @@ func (h *DefaultHandler) HandleProfilePage(w io.Writer, ctx Context) error {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
func (h *DefaultHandler) HandleArticlePage(w io.Writer, articleID string, ctx Context) error {
|
func (h *DefaultHandler) HandleNewsArticlePage(w io.Writer, articleID string, ctx Context) error {
|
||||||
article, err := h.NewsArticlesRegistry.GetArticle(articleID)
|
article, err := h.NewsArticlesRegistry.GetArticle(articleID)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
@@ -155,3 +170,21 @@ func (h *DefaultHandler) HandleArticlePage(w io.Writer, articleID string, ctx Co
|
|||||||
"ContentHTML": template.HTML(html),
|
"ContentHTML": template.HTML(html),
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (h *DefaultHandler) HandleGuideArticlePage(w io.Writer, articleID string, ctx Context) error {
|
||||||
|
article, err := h.GuideArticlesRegistry.GetArticle(articleID)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
html, err := article.Render()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
return h.Renderer.Render(w, "guide-base.html", util.Map{
|
||||||
|
"User": ctx.getUser(),
|
||||||
|
"Article": article,
|
||||||
|
"ContentHTML": template.HTML(html),
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|||||||
+13
-1
@@ -100,6 +100,11 @@ func routes(h handler.Service, r fiber.Router) {
|
|||||||
return h.HandleNewsPage(c, CreateContext(c))
|
return h.HandleNewsPage(c, CreateContext(c))
|
||||||
})
|
})
|
||||||
|
|
||||||
|
r.Get("/guide", func(c *fiber.Ctx) error {
|
||||||
|
c.Type("html")
|
||||||
|
return h.HandleGuidePage(c, CreateContext(c))
|
||||||
|
})
|
||||||
|
|
||||||
r.Post("/login", func(c *fiber.Ctx) error {
|
r.Post("/login", func(c *fiber.Ctx) error {
|
||||||
var loginForm struct {
|
var loginForm struct {
|
||||||
Provider string `form:"provider"`
|
Provider string `form:"provider"`
|
||||||
@@ -147,7 +152,14 @@ func routes(h handler.Service, r fiber.Router) {
|
|||||||
articleID := c.Params("article")
|
articleID := c.Params("article")
|
||||||
|
|
||||||
c.Type("html")
|
c.Type("html")
|
||||||
return h.HandleArticlePage(c, articleID, CreateContext(c))
|
return h.HandleNewsArticlePage(c, articleID, CreateContext(c))
|
||||||
|
})
|
||||||
|
|
||||||
|
r.Get("/guide/:article", func(c *fiber.Ctx) error {
|
||||||
|
articleID := c.Params("article")
|
||||||
|
|
||||||
|
c.Type("html")
|
||||||
|
return h.HandleGuideArticlePage(c, articleID, CreateContext(c))
|
||||||
})
|
})
|
||||||
|
|
||||||
routesApi(h, r.Group("/api"))
|
routesApi(h, r.Group("/api"))
|
||||||
|
|||||||
Reference in New Issue
Block a user