Front-end VUEJS
acompanhar aula
https://daisyui.com/
Uma biblioteca de componentes prontos que funciona como um plugin do Tailwind CSS. Ele oferece classes semânticas (como btn, card, alert) que geram componentes estilizados usando as classes do Tailwind por baixo dos panos.
Vem com componentes prontos, responsivos e acessíveis (botões, formulários, modais, barras de navegação etc.);
Suporta (modo claro/escuro e mais de 30 esquemas de cores);
Reduz código repetitivo — por exemplo:
<button class="btn btn-primary">em vez declass="px-4 py-2 bg-blue-500 text-white rounded-lg...".Totalmente compatível com o Tailwind — você pode misturar classes utilitárias e classes do DaisyUI.
Traz um estilo mais "opinativo" (menos flexibilidade se você quiser controle total).
Aumenta um pouco o tamanho do bundle (mas ainda é leve).
Você depende da API de componentes do DaisyUI.
manda um exemplo
// tailwindcss
<button class="px-4 py-2 bg-blue-500 hover:bg-blue-700 text-white font-medium rounded-lg transition">
Clique aqui
</button>
// daisyUI
<button class="btn btn-primary">
Clique aqui
</button>
Use o Tailwind CSS se quiser máxima flexibilidade.
Adicione o DaisyUI se quiser agilizar o desenvolvimento com componentes bonitos, consistentes e suporte a temas — sem sair do ecossistema do Tailwind.
Tailwind CSS
Tailwind CSS
Rapidly build modern websites without ever leaving your HTML.
Clínica Veterinária
Clínica Veterinária
📌 Módulo 1: Cadastro de Clientes e Pets
📌 Módulo 2: Agendamento de Consultas
📌 Módulo 3: Prontuário Veterinário
📌 Módulo 4: Dashboard Administrativo
📌 Módulo 1: Cadastro de Clientes e Pets
Objetivo
Registrar e gerenciar os dados dos tutores (clientes) e de seus animais de estimação.
Funcionalidades Principais
📌 Módulo 1: Cadastro de Clientes e Pets
Elementos de Interface para Design
Fluxo Sugerido
Estrutura básica de um sistema
src/
├── models/
│ ├── User.js
│ └── Pet.js
├── services/
│ ├── apiClient.js
│ ├── UserService.js
│ └── PetService.js
├── repositories/
│ ├── UserRepository.js
│ └── PetRepository.js
├── controllers/
│ ├── UserController.js
│ └── PetController.js
└── views/
├── users/
│ ├── index.vue
│ ├── add.vue
│ ├── edit.vue
│ └── show.vue
└── pets/
├── index.vue
├── add.vue
├── edit.vue
└── show.vueMVC
"É um padrão de arquitetura de software que divide uma aplicação em três camadas interconectadas: Model (modelo de dados e lógica de negócios), View (interface do usuário) e Controller (lógica de controle)"
src/
├── models/
│ ├── User.js
│ └── Pet.js
├── services/
│ ├── apiClient.js
│ ├── UserService.js
│ └── PetService.js
├── repositories/
│ ├── UserRepository.js
│ └── PetRepository.js
├── controllers/
│ ├── UserController.js
│ └── PetController.js
└── views/
├── users/
│ ├── index.vue
│ ├── add.vue
│ ├── edit.vue
│ └── show.vue
└── pets/
├── index.vue
├── add.vue
├── edit.vue
└── show.vueServices
"É uma camada intermediária que lida com a lógica de negócios da aplicação, separando-a do Controlador e da persitência de dados.
src/
├── models/
│ ├── User.js
│ └── Pet.js
├── services/
│ ├── apiClient.js
│ ├── UserService.js
│ └── PetService.js
├── repositories/
│ ├── UserRepository.js
│ └── PetRepository.js
├── controllers/
│ ├── UserController.js
│ └── PetController.js
└── views/
├── users/
│ ├── index.vue
│ ├── add.vue
│ ├── edit.vue
│ └── show.vue
└── pets/
├── index.vue
├── add.vue
├── edit.vue
└── show.vueRepositories
"Atua como uma camada de abstração para gerenciar o acesso a dados. Ele isola a lógica de negócio (no Model e Service) da lógica de persistência (como consultas a um banco de dados), fornecendo uma interface simples para operações de dados comuns como adicionar, buscar, editar e deletar entidades.
A Model-View-Controller (MVC) architecture
Por onde a gente começa?
src/
├── models/
│ ├── User.js
│ └── Pet.js
├── services/
│ ├── apiClient.js
│ ├── UserService.js
│ └── PetService.js
├── repositories/
│ ├── UserRepository.js
│ └── PetRepository.js
├── controllers/
│ ├── UserController.js
│ └── PetController.js
└── views/
├── users/
│ ├── index.vue
│ ├── add.vue
│ ├── edit.vue
│ └── show.vue
└── pets/
├── index.vue
├── add.vue
├── edit.vue
└── show.vuePor onde a gente sabe!
estrutura de
dados de um
sistema
import { createRouter, createWebHistory } from 'vue-router'
const router = createRouter({
history: createWebHistory(import.meta.env.BASE_URL),
routes: [
{
path: '/',
name: 'home',
component: () => import('@/views/dashboard.vue')
},
{
path: '/tutors',
component: () => import('@/views/tutors/index.vue')
},
{
path: '/tutors/add',
component: () => import('@/views/tutors/add.vue')
},
{
path: '/tutors/:id/edit',
component: () => import('@/views/tutors/index.vue'),
props: true
},
{
path: '/tutors/:id/show',
component: () => import('@/views/tutors/index.vue'),
props: true
}
],
})
export default router
/user/johnny/profile /user/johnny/posts
┌──────────────────┐ ┌──────────────────┐
│ User │ │ User │
│ ┌──────────────┐ │ │ ┌──────────────┐ │
│ │ Profile │ │ ────────────> │ │ Posts │ │
│ │ │ │ │ │ │ │
│ └──────────────┘ │ │ └──────────────┘ │
└──────────────────┘ └──────────────────┘
const routes = [
{
path: '/user/:id',
component: User,
children: [
// when /user/:id/profile is matched
path: 'profile',
component: UserProfile,
props: (route) => ({
id: route.params.id // 👈 pega o :id da rota PAI
})
},
{
// when /user/:id/posts is matched
path: 'posts',
component: UserPosts,
props: (route) => ({
id: route.params.id // 👈 pega o :id da rota PAI
})
},
],
},
]
<template>
<div class="user">
<h2>User {{ $route.params.id }}</h2>
<router-view />
</div>
</template>
<template>
<div>
<h2>Editar Tutor #{{ id }}</h2>
</div>
</template>
<script setup>
const props = defineProps({
id: {
type: [String, Number],
required: true
}
})
// Se quiser converter para número (já que a rota passa como string):
// const tutorId = computed(() => parseInt(props.id, 10))
</script>