Sådan opbygges en enkel, udvidelig blog med Elixir og Phoenix

I dette indlæg vil vi diskutere, hvordan man opbygger en kogeplade Phoenix-webapp med brugergodkendelse og et adminpanel sammen med upload af billeder i Elixir.

TodoMVC er blevet et de facto-værktøj til at sammenligne forskellige JavaScript-baserede MV * -rammer. På samme måde føler jeg, at en blogapplikation kan være en tiebreaker ved valg af en ny backend eller API-ramme.

Så lad os komme i gang og bygge en i Phoenix. Vi følger standardopsætningen, dvs. Phoenix er tilsluttet med Ecto, der kører på PostgreSQL.

Her er de sidste skærmbilleder, der giver dig en idé om, hvordan appen ser ud i slutningen.

Landingssiden viser alle de offentliggjorte blogs i et kortlayout. Der kan klikkes på et kort for at se det pågældende indlæg.

Vi har et dashboard, der viser statistikken i korte træk. Adgang til denne side kræver login til administratorbruger.

Der vil være et separat afsnit, der har en oversigt over alle indlæg. Her kan du publicere / ændre / slette indlæg.

Dette er post-editorens layout med en markdown-editor sammen med en filvælger til det fremhævede billede.

Bemærk: Den fulde arbejdskode er hostet på GitHub. Der er mange filer i projektet, som ikke kan deles i en enkelt blog. Så jeg har forklaret de specifikke, som jeg antager er kritiske.

Lad os holde projektets navn som CMS for nu. Så vi starter med at oprette et nyt projekt med mix phx.new cms. Kør for mix deps.getat installere afhængigheder.

Generer en migreringsfil til henholdsvis brugere og indlæg.

# User migration file
mix phx.gen.schema Auth.User users name:string email:string password_hash:string is_admin:boolean
# Posts migration file
mix phx.gen.schema Content.Post posts title:string body:text published:boolean cover:string user_id:integer slug:string

Der skal oprettes to tabeller i databasen, som repræsenterer brugere og indlæg. Jeg har holdt det ret simpelt, kun med de krævede felter og udvidet, når behovet opstår.

Derefter kan vi også definere ændringssæt og yderligere metoder i bruger- og postskemaet.

user.ex

post.ex

@derive {Phoenix.Param, key: :slug}

Da vi ønsker, at indlægene skal have en læsbar og SEO-venlig URL-struktur, informerer vi rutehjælpere om at henvise til i slugstedet for idi URL-navneområdet.

Ruterne er beskrevet her:

Ressourcer, der er specifikke for admin-sektionen, samles sammen og tildeles en pipeline, der tvinger godkendelse.

I mellemtiden behandles globale ruter med passiv godkendelse. Brugeroplysninger hentes, hvis en session er til stede, men siderne stadig er tilgængelige. Login og startsider hører hjemme her.

At udføre mix phx.routesgiver mig denne output:

Visningen er opdelt i tre logiske sektioner:

  1. Navigations bar
  2. Sidebjælke
  3. Hovedindhold

Mens navigationsbjælken altid er synlig, vises sidebjælken kun, hvis en administratorbruger er logget ind. Gennemse indhold vil være inden for admin-konteksten. Links i sidebjælken vil vokse, når og når appen udvikler sig.

Admin.Post-controlleren følger den typiske CRUD-arkitektur og inkluderer en handling for at skifte den offentliggjorte tilstand for et givet indlæg.

Der findes mange kontrolelementer på indekssiden i administratorens indlægssektion. Her kan indlæg slettes, offentliggøres og ændres.

skabeloner / admin / post / index.html.eex

For at holde skabelonen ryddig kan vi definere hjælpere til bekvemmelighedsvisning som formateringstid osv. Separat.

visninger / admin / post_view.ex

Bue sammen med arc_ecto giver out of the box fil upload muligheder. Da et indlæg indeholder et forsidebillede, skal vi definere en buekonfiguration i vores app.

Hvert indlæg i vores blog kræver to versioner af forsidebilleder - original, som er synlig inden for specifik indlægsvisning, og en tommelfingerversion med et mindre fodaftryk for at udfylde kortene. Lad os nu gå med 250x250 opløsning til tommelfingerversionen.

Kommer tilbage til appens landingsside, vil det rumme kortene til alle de offentliggjorte indlæg. Og hvert indlæg vil være tilgængeligt gennem den dannede slug.

controllers/page_controller.ex

Dette projekt udforsker Phoenix - hvordan en Phoenix-app er struktureret, og hvordan man demonterer et Phoenix-baseret projekt. Jeg håber, du har lært noget og nød det!

Den fuldt fungerende app findes på Github: //github.com/ramansah/cms. Du er velkommen til at klone? og klapper, hvis du finder denne blog nyttig?