Documentação Lavarel

Framework fullstack completo para criar aplicações Laravel + Vue 3 com componentes modernos, autenticação, gerador de CRUD e muito mais.

🔧 Laravel 10

Backend robusto com Eloquent, Sanctum e API Resources

Vue 3

Composition API, reatividade e Single File Components

📱 Quasar 2

Build para SPA, PWA, SSR e aplicativos mobile

🎨 Naive UI

Componentes Vue 3 modernos com TypeScript e Dark Mode

Requisitos

Antes de começar, certifique-se de ter as seguintes ferramentas instaladas:

Ferramenta Versão Mínima Verificar
PHP 8.1+ php -v
Composer 2.x composer -V
Node.js 18+ node -v
npm 9+ npm -v
💡
Dica Recomendamos usar SQLite para desenvolvimento local. Não requer instalação adicional!

Instalação

1. Clone o repositório

bash
# Clone o projeto
git clone https://github.com/leonardo-matheus/Lavarel-Fullstack-Generator.git

# Entre no diretório
cd Lavarel-Fullstack-Generator

2. Configure o Backend (Laravel)

bash
# Copie o arquivo de ambiente
cp .env.example .env

# Instale as dependências PHP
composer install

# Gere a chave da aplicação
php artisan key:generate

# Crie o banco de dados SQLite
touch database/database.sqlite

# Execute as migrations com seeds
php artisan migrate --seed

3. Configure o Frontend (Vue/Quasar)

bash
# Entre no diretório do frontend
cd ui

# Instale as dependências
npm install

# Volte para a raiz
cd ..
Pronto! A instalação está completa. Agora você pode executar o projeto.

Executando

Você precisará de dois terminais para executar o projeto:

Terminal 1: Backend Laravel

bash
# Na raiz do projeto
php artisan serve

# Acessível em: http://localhost:8000

Terminal 2: Frontend Vue/Quasar

bash
# No diretório ui/
cd ui
npx quasar dev

# Acessível em: http://localhost:8080

Login Padrão

Email boss@mail.com
Senha password

Estrutura do Projeto

Backend (Laravel)

Estrutura
app/
├── Http/Controllers/API/    # REST endpoints
├── Models/                  # Eloquent (*_H.php = helpers)
├── Repositories/            # Query abstraction
├── Services/                # Business logic
└── Traits/                  # Shared behaviors

generator/
├── scopes/*.json            # Definições dos módulos
└── template/                # Templates de código
    ├── api/                 # Controller, Model, Migration
    └── ui/                  # Index, Form, Detail (Vue)

Frontend (Vue/Quasar)

Estrutura
ui/src/
├── boot/                    # Inicialização (naive.js)
├── components/
│   ├── core/                # Layout: TopBar, SideNav
│   ├── Lavarel/             # Componentes customizados
│   └── Naive/               # UI Kit Naive UI
├── composables/             # Hooks reutilizáveis
├── layouts/                 # MainLayout, LoginLayout
├── pages/                   # Telas por módulo
├── services/                # Api.js, Helper.js
└── store/                   # Pinia (GlobalStore)

Gerador de Módulos

O gerador cria automaticamente todo o código necessário para um módulo CRUD completo, incluindo backend (Laravel) e frontend (Vue).

1. Criar arquivo de definição

Crie um arquivo JSON em generator/scopes/:

generator/scopes/products.json
[{
  "name": "Products",
  "column": [
    { "name": "id", "type": "bigIncrements", "attributes": ["index"] },
    { "name": "name", "type": "string" },
    { "name": "price", "type": "double", "length": 10, "length2": 2 },
    { "name": "description", "type": "text", "nullable": true },
    { "name": "is_active", "type": "boolean", "default": true },
    { 
      "name": "category_id", 
      "type": "unsignedBigInteger",
      "belongsTo": { "model": "Categories", "name": "Category" }
    }
  ]
}]

2. Executar o gerador

bash
php artisan lv:generate --scope=products

3. Registrar o módulo

Adicione ao arquivo config/lv_modules.php:

config/lv_modules.php
return [
    "Users",
    "Roles",
    // ... outros módulos
    "Products",  // Novo módulo
];

4. Executar migration

bash
php artisan migrate

Tipos de Coluna Suportados

Tipo Descrição Opções
bigIncrements Chave primária auto-increment -
string VARCHAR(255) length
text Texto longo nullable
double Número decimal length, length2
boolean Verdadeiro/Falso default
enum Lista fixa de valores enum_list: [...]
dateTime Data e hora nullable
unsignedBigInteger Chave estrangeira belongsTo

Autenticação

O Lavarel usa Laravel Sanctum para autenticação via tokens.

Login

Endpoint
POST /api/app/login

{
  "email": "boss@mail.com",
  "password": "password"
}

// Response
{
  "token": "1|abc123...",
  "user": { ... }
}

Usando o Token

Inclua o token em todas as requisições autenticadas:

Header
Authorization: Bearer 1|abc123...

Endpoints do Usuário

Método Endpoint Descrição
GET /api/me Dados do usuário logado
GET /api/me/permissions Permissões do usuário
GET /api/me/notifications Notificações do usuário
POST /api/app/logout Encerrar sessão

API REST

Cada módulo gerado expõe endpoints CRUD padronizados:

Método Endpoint Descrição
GET /api/{module} Listar todos (paginado)
GET /api/{module}/{id} Buscar por ID
POST /api/{module} Criar novo registro
PUT /api/{module}/{id} Atualizar registro
PUT /api/{module}/delete Soft delete (batch)
PUT /api/{module}/restore Restaurar (batch)

Parâmetros de Query

Exemplo
GET /api/products?page=1&per_page=15&search=notebook&order_by=name&order=asc
Parâmetro Descrição Default
page Página atual 1
per_page Itens por página 15
search Busca global -
order_by Campo para ordenar id
order Direção (asc/desc) desc

Componentes

O Lavarel inclui uma biblioteca de componentes Vue 3 construídos sobre o Naive UI, todos registrados globalmente e prontos para uso.

📦
Prefixo Lv Todos os componentes usam o prefixo lv- para fácil identificação.

LvInput

Campo de entrada com suporte a múltiplos modos e validação integrada.

Template
<lv-input
  v-model="form.name"
  label="Nome"
  placeholder="Digite seu nome"
  mode="text"
  required
/>

<!-- Modo currency -->
<lv-input
  v-model="form.price"
  label="Preço"
  mode="currency"
  prefix="R$"
/>

Props

PropTipoDefaultDescrição
v-modelString/Number-Valor do campo
modeStringtexttext, number, currency, date, datetime, password
labelString-Rótulo do campo
placeholderString-Texto placeholder
requiredBooleanfalseCampo obrigatório
disabledBooleanfalseDesabilitar campo
prefixString-Prefixo (ex: R$)
suffixString-Sufixo (ex: kg)

LvSelect

Seletor com autocomplete, múltipla seleção e busca ajax.

Template
<lv-select
  v-model="form.category_id"
  label="Categoria"
  :options="categories"
  searchable
  clearable
/>

<!-- Com busca ajax -->
<lv-select
  v-model="form.user_id"
  label="Usuário"
  url="/api/users/options"
  searchable
/>

Props

PropTipoDefaultDescrição
v-modelAny-Valor selecionado
optionsArray[][{ label, value }]
urlString-URL para busca ajax
multipleBooleanfalseMúltipla seleção
searchableBooleanfalsePermite buscar
clearableBooleanfalsePermite limpar

LvBtn

Botão com variantes de estilo e estado de loading.

Template
<lv-btn label="Salvar" color="primary" @click="save" />
<lv-btn label="Cancelar" flat />
<lv-btn label="Excluir" color="error" soft />
<lv-btn icon="add" color="success" round />
<lv-btn label="Carregando..." :loading="true" />

Props

PropTipoDefaultDescrição
labelString-Texto do botão
colorStringdefaultprimary, success, warning, error
iconString-Nome do ícone
loadingBooleanfalseEstado de carregamento
softBooleanfalseEstilo soft (fundo suave)
flatBooleanfalseSem fundo
roundBooleanfalseApenas ícone, circular

LvTable

Tabela de dados com paginação, busca e ordenação integradas.

Template
<lv-table
  :columns="columns"
  :data="products"
  :loading="loading"
  :pagination="pagination"
  @update:page="fetchData"
/>

// Definição das colunas
const columns = [
  { title: 'ID', key: 'id', width: 80 },
  { title: 'Nome', key: 'name' },
  { title: 'Preço', key: 'price', render: formatCurrency },
]

LvCard

Card container com header, footer e slots personalizáveis.

Template
<lv-card title="Meu Card" subtitle="Descrição">
  <template #header-extra>
    <lv-btn icon="settings" quaternary />
  </template>
  
  Conteúdo do card aqui...
  
  <template #footer>
    <lv-btn label="Salvar" color="primary" />
  </template>
</lv-card>

LvModal

Modal/Dialog com diferentes tamanhos e animações.

Template
<lv-modal
  v-model="showModal"
  title="Título do Modal"
  size="medium"
>
  Conteúdo do modal...
  
  <template #footer>
    <lv-btn label="Cancelar" flat @click="showModal = false" />
    <lv-btn label="Confirmar" color="primary" />
  </template>
</lv-modal>

Props

PropTipoDefaultDescrição
v-modelBooleanfalseControla visibilidade
titleString-Título do modal
sizeStringmediumsmall, medium, large, huge

LvDisplayer

Exibição de dados com formatação automática para CPF, CNPJ, moeda, datas e mais.

Template
<lv-displayer label="Nome" :value="user.name" />
<lv-displayer label="CPF" value="12345678901" type="cpf" copyable />
<lv-displayer label="CNPJ" value="12345678000190" type="cnpj" />
<lv-displayer label="Telefone" value="11987654321" type="phone" />
<lv-displayer label="Valor" :value="1500.50" type="currency" />
<lv-displayer label="Ativo" :value="true" type="boolean" />

Tipos Suportados

TipoEntradaSaída
cpf12345678901123.456.789-01
cnpj1234567800019012.345.678/0001-90
phone11987654321(11) 98765-4321
currency1500.50R$ 1.500,50
percent75.575,50%
date2024-01-1515/01/2024
booleantrue✓ Sim

LvAvatar

Avatar com imagem ou iniciais automáticas baseadas no nome.

Template
<lv-avatar name="João Silva" />
<lv-avatar src="/avatar.jpg" status="online" />
<lv-avatar name="Admin" size="large" shape="square" />

LvBadge

Badge para notificações e contadores.

Template
<lv-badge :value="5">
  <n-button>Notificações</n-button>
</lv-badge>

<lv-badge :value="150" :max="99">...</lv-badge>  <!-- Mostra 99+ -->
<lv-badge dot processing>...</lv-badge>  <!-- Dot pulsante -->

LvTag

Tag/chip com estilos e ações.

Template
<lv-tag label="Novo" type="success" />
<lv-tag label="Pendente" type="warning" closable @close="remove" />
<lv-tag label="Premium" type="primary" round />

LvProgress

Barra de progresso linear ou circular.

Template
<lv-progress :percentage="75" status="success" />
<lv-progress :percentage="50" striped striped-animated />
<lv-progress :percentage="60" type="circle" :circle-width="100" />
<lv-progress indeterminate />  <!-- Animação contínua -->

LvCreditCard

Componente de cartão de crédito com detecção automática de bandeira e banco brasileiro.

Template
<lv-credit-card
  :number="cardNumber"
  :holder="cardHolder"
  :expiry="cardExpiry"
  :cvv="cardCvv"
  v-model:flipped="isFlipped"
/>

Bandeiras Detectadas

Visa, Mastercard, American Express, Elo, Hipercard

Bancos Brasileiros Detectados

Nubank, Inter, Itaú, Bradesco, Banco do Brasil, Santander, Caixa, C6 Bank, PicPay, Neon, Next

Dark Mode

O Lavarel possui suporte nativo a Dark Mode com o Naive UI.

Usando o Theme
import { useTheme } from '@/composables/useTheme'

const { isDark, toggleTheme } = useTheme()

// No template
<n-button @click="toggleTheme">
  {{ isDark ? '☀️ Light' : '🌙 Dark' }}
</n-button>

Permissões

Sistema de permissões baseado em roles.

Verificando Permissões
// No Store
const store = useGlobalStore()

if (store.hasPermission('products.create')) {
  // Pode criar produtos
}

// No Template com v-if
<lv-btn 
  v-if="$store.hasPermission('products.delete')"
  label="Excluir" 
  color="error"
/>

Customização

Cores e Tema

Personalize as cores editando ui/src/css/app.scss:

CSS
:root {
  --primary: #6366f1;
  --secondary: #22c55e;
  --accent: #f59e0b;
}

Configurações do Projeto

ArquivoDescrição
config/lv_modules.phpMódulos habilitados
config/lv_menu.phpItens do menu lateral
config/lv_settings.phpConfigurações gerais
ui/quasar.conf.jsConfigurações do Quasar