Git Product home page Git Product logo

evolutio / djavue3 Goto Github PK

View Code? Open in Web Editor NEW
50.0 7.0 13.0 2.92 MB

Cookiecutter project template for a full-stack production-ready web application using Django and Vue.js

Home Page: https://www.djavue.org

License: GNU General Public License v3.0

Python 52.25% Shell 2.11% Dockerfile 2.67% Makefile 2.12% JavaScript 19.78% HTML 1.84% Vue 19.23%
cookiecutter cookiecutter-template django docker frontend pytest vite vitest vue3 hacktoberfest hacktoberfest2023

djavue3's Introduction

djavue-matrix-background

D-jà vue

Um 📦template de projeto completo full-stack, pronto para produção, com boas práticas e focado na produtividade. Combina um frontend moderno (Vue 3 | ⚡️ Vite | Vuetify) e Backend Python (🦄 Django API)

 _______         __       ___   ____    ____  __    __   _______
|       \       |  |     /   \  \   \  /   / |  |  |  | |   ____|
|  .--.  |      |  |    /  ^  \  \   \/   /  |  |  |  | |  |__
|  |  |  |.--.  |  |   /  /_\  \  \      /   |  |  |  | |   __|
|  '--'  ||  `--'  |  /  _____  \  \    /    |  `--'  | |  |____
|_______/  \______/  /__/     \__\  \__/      \______/  |_______|

Links Importantes

Arquitetura Djàvue

djavue-arquitetura

❓ Por que?

Este template foi criado pelo Tony Lâmpada em 2018. Nesta versão iniciada em 2023, está com diversas boas praticas, principalmente no frontend com Vite e Vue 3. Este template empacota a experiência de muitos anos trabalho com o objetivo de:

  • 💡 Todos do time conseguirem ser mais produtivos com entregas mais rápidas focando no negócio
  • 💡 Clientes mais felizes
  • 💡 Produto final com mais qualidade, boas práticas e fácil de mudar

💡 Principais funcionalidades

Backend

  • 🦄 Django e Postgres (Local == PROD)
  • 📦 Estrutura de pastas para facilitar a organizacao e implementacao de novas funcionalidades
  • 🛠️ Pytest | Teste configurado com exemplos para promover TDD
  • 🛠️ Qualidade de código usando Linter
  • 💡 Integração entre FRONTEND e BACKEND para focar no que interessa
  • 🔩 .dotenv usando python-decouple para facilitar uso variáveis de ambiente | Também usa dj-database-url
  • 🔩 Usando django-extensions
  • 🔩 Usuário com campos extras abstract-user
  • 📦 Views enxutas (urls ➡️ views ➡️ services ➡️ models) | Mais fácil de testar
  • 📦 Negócio separado em contexto (Django Apps)
  • 🐳 Container para PROD (Dockerfile + dcoker compose) | Início com mínimo de esforço
  • CI usando GitHub Actions rodando linter, testes
  • CD usando GitHub Actions para deploy no fly.io

Frontend

  • ⚡️ Vite (Servidor super rápido | Fast HMR | Build otimizado ...)
  • 📦 Projeto organizado (Router ➡️ Pages ➡️ Store ➡️ API Client)
  • 🤡 API Mock usando MirageJS | backendless e modo de mock-apis para um modo mais produtivo no frontend
  • 🔩 API Cliente usando Axios
  • 🛠️ Qualidade de código usando Linter + Code Style (ESLint + Prettier)
  • 🍍 Pinia para manter estado de forma mais simples | separada em contextos
  • 🛠️ Testando lógica de negócio dentro da STORE🍍 com Vitest
  • 📦 Negócio separado em contexto (Pastas refletindo apps do backend)
  • 💡 Herança de página usando Layout (View Component & Router)
  • 💡 Funcionalidades de exemplo (Login, Logout, Task List, Create Tasks)
  • 🔑 Proteção de rotas (Login required based on 401 responses)
  • 🍪 Autenticação configurada para funcionar com o Django (cookies)

djavue-página-inicial

Pré-Requisitos

  • Python & Cookiecutter instalados
  • Docker & Docker compose instalados para subir tudo muito rápido e não precisar instalar/configurar infinitas libs/ferramentas diretamente na sua máquina

Começando

Este é um template de projetos Cookiecutter

Neste exemplo, vamos criar o projeto mytodolist, mas você pode trocar este nome para qual faz mais sentido para seu produto!

Primeiro passo

asciicast

Vamos precisar criar o projeto e fazer o build de tudo, utilize os comandos abaixo:

# Crie o novo projeto usando o vue init
$ cookiecutter https://github.com/evolutio/djavue3

Para customizar seu projeto, responda as perguntas conforme a necessidade do seu projeto:

djavue-página-inicial

Com o projeto criado, precisamos preparar o ambiente local:

$ cd mytodolist
# Para criar os containers
$ docker compose build
# Para iniciar os containers
$ docker compose up -d backend frontend
# ou apenas
$ docker compose up -d

NOTA: O comando é docker-compose para versão mais antiga do docker compose e docker compose para versões mais atualizadas

Depois de fazer o build e iniciar todos containers, fazendo um docker ps é possível ver que temos os seguintes serviços rodando:

$ docker ps
CONTAINER ID   IMAGE                  COMMAND                 NAMES
a72fb2ab3ba2   back-todoten           "wait-for-it localho…"  mytodolist_backend_1
6ef83aab15e5   front-todoten          "docker-entrypoint.s…"  mytodolist_frontend_1
6def45b54094   nginx                  "/docker-entrypoint.…"  mytodolist_nginx_1
93e76c660729   postgres:13.3-alpine   "docker-entrypoint.s…"  mytodolist_postgres_1

E estes containers estão organizados como no diagrama abaixo:

djavue-containers

🚀 Para acessar os serviços, utilize as URLs abaixo:

  • http://localhost para acessar o frontend
  • http://localhost/api para acessar diretamente alguma rota da API
  • http://localhost/admin para acessar o Django admin

📝 NOTA: Embora o frontend está em http://localhost:3000, não faz muito sentido acessar esta URL diretamente. Utilize http://localhost para acessar o front, desta forma o NGINX vai intermediar e saber redirecionar requisições feitas pelo frontend para http://localhost/api, ou seja, acessando com a porta 3000, as requisições /api não funcionam.

Para conseguir logar, vamos precisar criar um usuário no Django. Podemos fazer isto entrando no container backend e rodar o comando do Django ./manage.py createsuperuser:

$ docker-compose exec backend ./manage.py createsuperuser

Usuário (leave blank to use 'root'): admin
Endereço de email: [email protected]
Password:
Password (again):
Superuser created successfully.

📝 NOTA: Também podemos acessar diretamente o container do backend usando docker exec -it mytodolist_backend_1 bash e ai digitar o comando que quisermos, mas temos que ter atenção que o prefixo do nome do container muda conforme o nome dado na criação do projeto.

Passo 2

Para preparar o ambiente para que seja possível evoluir o frontend, dado que algumas pastas foram geradas pelo processo de build do docker, vamos precisar fazer alguns ajustes:

# Mudar o dono da pasta de root para o seu usuário
$ sudo chown 1000:1000 -Rf frontend/
$ cd frontend
$ npm install

# Para garantir que tudo está funcionando, o comando abaixo tem que rodar sem dar erro:
$ npm run lint
  > [email protected] lint /home/user1/workspace/mytodolist/frontend
  > npm run lint:js
  > [email protected] lint:js /home/user1/workspace/mytodolist/frontend
  > eslint --ext ".js,.vue" --ignore-path .gitignore .

Se conseguiu ver a saída acima, tudo esta funcionando!

Para parar todos os containers, utilize o comando abaixo:

$ docker-compose down
  Stopping mytodolist_backend_1  ... done
  Stopping mytodolist_frontend_1 ... done
  Stopping mytodolist_nginx_1    ... done
  Stopping mytodolist_postgres_1 ... done

📝 NOTA: Utilize o comando docker ps e garanta que nenhum container está rodando

Para mais informações, siga o README.md que foi gerado dentro do seu projeto mytodolist

Subindo apenas o frontend (backend-less)

Para algumas demandas de trabalho, faz sentido alterar primeiro o frontend, e assim não faz sentido subir o backend com banco de dados. No Djàvue temos o conceito de API MOCK. ou seja, subir apenas o front com um imitador de backend (mock). Em ouras palavras, subir apenas código JavaScript e nada de Python ou qualquer outra tecnologia.

Para isto, ao invés de utilizar o docker-compose up apresentado no início, vamos utilizar uma pequena variação:

$ docker compose -f docker-compose.apimock.yml up -d

🚀 Para acessar os serviços, utilize as URLs abaixo:

  • http://localhost:3000 para acessar o frontend

📝 NOTA: Para utilizar a versão anterior do API MOCK, utilize a opção 2 na criação do projeto. Rode um docker ps e veja que temos rodando um imitador de backend (que está na pasta apimock) em código NodeJS com Express.

Para mais informações sobre Djávue & API Mock

👨‍💻 Contribuindo

Este é template de projeto que vem evoluindo desde do início de 2018, aceitamos sugestões e ficaremos muito felizes em saber a sua! A melhor forma para promover uma mudança é criando uma Issue aqui.

Vue 2

  • Se precisar todas estas boas praticas mas na versao Vue 2, acesse este outro repo aqui

djavue3's People

Contributors

henriqueccda avatar huogerac avatar jlplautz avatar luiz-lins avatar luxu avatar wfoschiera avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar

djavue3's Issues

Fazer upgrade das libs do frontend

Após fazer npm install, tem vários avisos de bibliotecas desatualizadas....
Ver quais libs tem atualizações, vue, vuetify, axios ....

Criar/Revisar documentação em Português 🇧🇷

Hoje o Djavue tem uma documentação inicial que foi feita para ajudar algumas pessoas que não falam Português, assim fiz em Inglês mesmo ou o arquivo markdown no repo, mas a motivação maior é criar documentação em Português. Assim, qualquer ajuda na melhoria ou tradução é mais que bem-vinda.

Você pode pegar qualquer parte da documentação, criar um Issue, exemplo, "Rodando o backend sem docker" e fazer um PR com esta documentação.

Exemplos de partes que podem ser traduzidas para pt-br:

  • Introduction
  • D-Jà Vue template requirements
  • Creating my first project using D-Jà Vue
  • Run locally using Docker vs not using Docker (containers)
  • Running the 🦄 backend without docker
  • Running the ⚡️ frontend without docker
  • Running all with docker
  • Package Management with Poetry

Exemplos de precisam da criação da documentação e podem ser feitas diretamente em Português:

  • Debugging the Django API
  • Debugging the VueJS web
  • Package Management with requirements
  • Package Management with Pip-tools
  • Backend structure & organization
  • Frontend structure & organization
  • Frontend using API MOCK
  • Build, CI & Deploy workflow
  • Contributing

Qualquer dúvida, é só enviar uma mensagem aqui mesmo nesta Issue.

Valeu

Links:

Como começar:

  • Fazer fork
  • Clonar
  • Entra na pasta docs
  • Utilizar node 18
  • Rodar npm install e depois npm run docs:dev
  • Criar uma branch issue57_adiciona_docs_pt_br_poetry (fazer PR pequenos)

Criar o endpoint para deletar/completar tarefa

Atualmente só conseguimos criar tarefas e falta a funcionalidade de deletar

O que falta:

  • Escrever o teste da camada de API
  • Escrever o teste da camada de serviço que com base no ID e os novos dados, a task foi alterada
  • Novo endpoint para alterar tarefa (DELETE no /tarefas) - levando em conta que os endpoints serão mais RESTful
  • criar novo campo no model para fazer o soft delete (note que ao inves de deleted, poderia ser algo como status e assim tarefas completadas seria resolvido com esta funcionalidade também, faz sentido?)
  • Alterar página de listagem de forma a poder chamar a nova funcionalidade, exibir toast mostrando que a ação foi executada
  • Testar que a nova funcionalidade funciona independente se foi escolhido: django_only, django_ninja ou openapi

Remover ActivityLogs e adicionar algum server

Hoje por padrão tem uma tabela (ActivityLogs) para registrar logs, mas a ideia é colocar algo externo ou algo que não deixe o banco de negócio ter o gargalo do log....

Algo como o Papertrail ou qualquer outro opensource, alguma sugestão???

Criar o endpoint de alterar tarefa

Atualmente só conseguimos criar tarefas e falta a funcionalidade de alterar

O que falta:

  • Escrever o teste da camada de API
  • Escrever o teste da camada de serviço que com base no ID e os novos dados, a task foi alterada
  • Novo endpoint para alterar tarefa (PATCH no /tarefas) - levando em conta que os endpoints serão mais RESTful
  • Criar nova rota e nova página para a página de alterar
  • Reutilizar o formulário de campos, mas alterar o comportamento para preencher os dados quando tiver

nota: Poderia ser um PUT, mas como não vamos enviar todos os campos do modelo e sim alguns específicos, pode ser que o PATCH encaixa melhor

Melhorar a experiência de quem quer rodar local sem docker

Para quem quer começar sem docker está um pouco difícil, principalmente se é a primeira vez. Também é algo bastante pedido nos grupos onde é falado de D-jà Vue

  • Tem alterar diversas variáveis (na pasta raiz e na pasta frontend)
  • Tem que resolver problemas de cors

Permitir rodar mesmo sem docker

pode ser um pouco contra o princípio de rodar localmente o mais próximo de produção, mas pode ser interessante do ponto de vista de iniciantes não ter a complexidade do docker.

  • Configurar o DATABASE_URL para apontar para um sqlite
  • Subir o backend sem precisar do docker nenhum
  • Ter comentando no backend o django cors e forma q seja possível descomentar
  • garantir que o frotend funciona via localshost:3000 sem dar erro de CORS

Melhorar Dockerfile utilizando o hadolint

❯ hadolint Dockerfile 
Dockerfile:8 DL3008 warning: Pin versions in apt get install. Instead of `apt-get install <package>` use `apt-get install <package>=<version>`
Dockerfile:8 DL3013 warning: Pin versions in pip. Instead of `pip install <package>` use `pip install <package>==<version>` or `pip install --requirement <requirements file>`
Dockerfile:8 DL3042 warning: Avoid use of cache directory with pip. Use `pip install --no-cache-dir <package>`
Dockerfile:17 DL4005 warning: Use SHELL to change the default shell
Dockerfile:17 SC2140 warning: Word is of the form "A"B"C" (B indicated). Did you mean "ABC" or "A\"B\"C"?
Dockerfile:29 DL3042 warning: Avoid use of cache directory with pip. Use `pip install --no-cache-dir <package>`

Como instalar hadolint no Debian:

sudo wget -O /bin/hadolint https://github.com/hadolint/hadolint/releases/download/v2.9.3/hadolint-Linux-x86_64
sudo chmod +x /bin/hadolint

#check hadolint install 
hadolint --help

Fazer upgrade das libs do backend

Tem versões novas do Django e Django Ninja!

Da para revisar todas libs e ver o que pode ser atualizado...

pip list --outdated
pip-upgrader
pip-check

Usar o Csv do python decouple no settings do Django.

Existe uma classe Csv() que podeira ser usada aqui:

O código atual:

ALLOWED_HOSTS = config(
    "ALLOWED_HOSTS",
    default="{{cookiecutter.deploy_domain}}",
    cast=lambda v: [s.strip() for s in v.split(",")],
)

O código depois da modificação:

ALLOWED_HOSTS = config(
    "ALLOWED_HOSTS",
    default="{{cookiecutter.deploy_domain}}",
    cast=Csv(),
)

Criar endpoint de /status

Um endpoint de status pode ser útil para exibir o estado da aplicação, como se o banco de dados está rodando

Adicionar suporte ao celery

  • Uma ideia é implementar a funcionalidade de Like em uma tarefa chamando via uma tarefa async no celery.
  • Mas a ideia principal da tarefa é adicionar suporte ao celery e configurações de como integrar django e celery

Melhorar documentação geral

Documentação que pode ser melhorada:

  • Ter a versão inglês do README.md principal e link do README padrão (pt-br) para o en-US
  • Corrigir o "{{cookiecutter.project_slug}}/README.md" o qual está bem desatualizado
  • Criar a documentação de como criar um projeto djavue3 no Windows
  • Revisar os README.md de cada pasta do frontend
  • Gerar a versão inglês dos READMEs do frontend
  • Criar um README docker, poetry e pip-tools

Fazer o model de Task ser ligado com um User

problema

A tabela de tarefas cria tarefas independente do usuário, ou seja, não importa como quem fazemos login, sempre vamos ver as mesmas tasks

solução

  • Adicionar foreignkey de User no model de Tasks
  • Fazer o tasks_list fazer o filtro pelo usuário logado
  • Criar testes para este cenário

Deixar o endpoint inserir tarefa mais RESTful

O endpoint atual para inserir é /tarefas/add e a ideia é ser um POST para /tarefas

Envolve:

  • Alterar o endpoint para o django_only para ter um if GET/POST
  • Alterar o endpoint para o django_ninja onde a anotação muda
  • Alterar o endpoint para o openapi
  • a camada api (axios) no frontend que faz a chamada precisa ser alterada para o nova
  • revisar que a documentação (swagger) foi atualizada

Melhorar a organização dos testes

os testes estão misturando API e Services, seria legal separar um pouco

o que vocês acham que pode ser melhorado nestes testes aqui:

from unittest.mock import ANY

from twitterclone.accounts.models import User
from twitterclone.accounts.tests import fixtures
from twitterclone.core.models import Tweet


def test_criar_tweet_sem_login(client):
    resp = client.post("/api/core/tweets/add", {"new_tweet": "walk the dog"})
    assert resp.status_code == 401


def test_criar_tweet_com_login(client, db):
    fixtures.user_jon()
    client.force_login(User.objects.get(username="jon"))
    payload = {"description": "estudar pytest"}
    resp = client.post("/api/core/tweets/add", payload, content_type="application/json")
    assert resp.status_code == 200


def test_listar_tweet_com_login(client, db):
    fixtures.user_jon()
    Tweet.objects.create(description="walk the dog")

    client.force_login(User.objects.get(username="jon"))
    resp = client.get("/api/core/tweets/list")
    data = resp.json()

    assert resp.status_code == 200
    assert data == {
        "tweets": [{"description": "walk the dog", "done": False, "id": ANY}]
    }

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.