Cómo crear un blog simple y extensible con Elixir y Phoenix

En esta publicación, discutiremos cómo crear una aplicación web Phoenix estándar con autenticación de usuario y un panel de administración, junto con la carga de imágenes en Elixir.

TodoMVC se ha convertido en una herramienta de facto para comparar varios frameworks MV * basados ​​en JavaScript. En la misma línea, creo que una aplicación de blog puede ser un factor decisivo al elegir un nuevo backend o marco de API.

Así que comencemos y construyamos uno en Phoenix. Seguiremos la configuración predeterminada, es decir, Phoenix conectado con Ecto ejecutándose en PostgreSQL.

Aquí están las pantallas finales para darle una idea de cómo se verá la aplicación al final.

La página de destino mostrará todos los blogs publicados en un diseño de tarjeta. Se puede hacer clic en una tarjeta para ver esa publicación en particular.

Tendremos un tablero que mostrará las estadísticas de forma breve. El acceso a esta página requiere inicio de sesión de usuario administrador.

Habrá una sección separada que tiene una descripción general de todas las publicaciones. Aquí puede publicar / modificar / eliminar publicaciones.

Este es el diseño del editor de publicaciones que presenta un editor de rebajas junto con un selector de archivos para la imagen destacada.

Nota: El código de trabajo completo está alojado en GitHub. Hay numerosos archivos en el proyecto que no se pueden compartir en un solo blog. Así que he explicado los específicos que supongo que son críticos.

Mantengamos el nombre del proyecto como CMS por ahora. Entonces, comenzaremos creando un nuevo proyecto con mix phx.new cms. Ejecutar mix deps.getpara instalar dependencias.

Genere un archivo de migración para usuarios y publicaciones, respectivamente.

# 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

Deben crearse dos tablas en la base de datos que representen usuarios y publicaciones. Lo he mantenido bastante simple, manteniendo solo los campos obligatorios y expandiéndome cuando surge la necesidad.

Posteriormente, podemos definir conjuntos de cambios y métodos adicionales en el esquema de usuario y publicación también.

user.ex

post.ex

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

Dado que queremos que las publicaciones tengan una estructura de URL legible y compatible con SEO, informamos a los asistentes de ruta para que hagan referencia en sluglugar de hacerlo iden el espacio de nombres de URL.

Las rutas se describen aquí:

Los recursos que son específicos de la sección de administración se agrupan y se les asigna una canalización que fuerza la autenticación.

Mientras tanto, las rutas globales se tratan con autenticación pasiva. Los detalles del usuario se obtienen si hay una sesión, pero las páginas aún son accesibles. Las páginas de inicio de sesión y de inicio pertenecen aquí.

La ejecución mix phx.routesme da este resultado:

La vista se divide en tres secciones lógicas:

  1. Barra de navegación
  2. Barra lateral
  3. Contenido principal

Si bien la barra de navegación siempre está visible, la barra lateral aparece solo si un usuario administrador está conectado. El contenido de navegación estará dentro del contexto de administrador. Los enlaces en la barra lateral crecerán a medida que la aplicación evolucione.

El controlador Admin.Post sigue la arquitectura CRUD típica e incluye una acción para cambiar el estado publicado de una publicación determinada.

Muchos controles residen en la página de índice de la sección de publicaciones del administrador. Aquí, las publicaciones se pueden eliminar, publicar y modificar.

templates / admin / post / index.html.eex

Para mantener la plantilla ordenada, podemos definir ayudantes de vista de conveniencia como tiempo de formato, etc. por separado.

vistas / admin / post_view.ex

Arc junto con arc_ecto proporciona capacidades de carga de archivos listas para usar. Dado que una publicación presenta una imagen de portada, tenemos que definir una configuración de arco en nuestra aplicación.

Cada publicación de nuestro blog requiere dos versiones de imágenes de portada: la original, que es visible dentro de la vista de publicación específica, y una versión en miniatura con una huella más pequeña para llenar las tarjetas. Por ahora, vayamos con una resolución de 250x250 para la versión en miniatura.

Volviendo a la página de inicio de la aplicación, albergará las tarjetas de todas las publicaciones publicadas. Y cada publicación será accesible a través de la barra formada.

controllers/page_controller.ex

Este proyecto explora Phoenix: cómo se estructura una aplicación Phoenix y cómo desmantelar un proyecto basado en Phoenix. ¡Espero que hayas aprendido algo y lo hayas disfrutado!

La aplicación de trabajo completa está en Github: //github.com/ramansah/cms. ¿Te sientes libre de clonar? y aplaudir si encuentra útil este blog?