Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Vue Login Router Navigation Drawer
Vue Login Router Navigation Drawer
Introducción:
Creación de un proyecto administrativo el cual tiene diferentes componentes:
formulario de login redireccionamiento y componente principal
1.-Creación de un proyecto
2.-Agregar dependencias
3.-Creación de componentes
4.-Creación de rutas (Router)
5.-Creación de login (Vuex)
6.-Consumo de servicios
Características técnicas
Vue versión 3.9.0
Dependencia de diseño Vuetify versión 1.5.5
NodeJs version 12.6.0
Vuex version 3.0.1
Router
Sass
Eslint prettier
1.- Creación del proyecto
Para crear un proyecto en vue utilizamos la interfaz grafica o directamente desde
consola con la siguiente instrucción
Usando la consola:
MacBook-Pro-de-shenick: shenick$ Vue create “Nombre de tu proyecto”
>Manually
>Babel
>Router
>Vuex
>CSS
routes: [
path: indica el nombre de nuestra ruta
redirect: indica hacia donde queremos mandar cuando ingresen esa ruta
*: nos indica que cualquier cosa que no se conozca nos redireccionara al componente 404 que es una
vista de alerta de no encontrado
/: nos indica la ruta principal por donde empiezan a cargar nuestros componentes
{ path: '*', redirect: '404' },
{
path: '/',
redirect: 'login'
},
{
path: '/404',
component: errorNotFound
},
{
path: '/403',
component: errorDeny
},
{
path: '/login',
name: 'admin-login',
props: true,
component: loginAdminComponent
}
Nosotros podemos agregar seguridad a nuestras rutas para que solo aquellos que tengan
permisos puedan acceder para ello agregamos lo siguiente a nuestras rutas:
meta: {
requiresAuthAdmin: true
}
Una ruta puede tener rutas hijos es decir a partir de esas se presenta un flujo como se muestra en
el siguiente ejemplo utilizamos children: [ ]
{
path: '/dashboard',
name: 'dashboard',
props: true,
component: dashboardComponent,
meta: {
requiresAuthAdmin: true
},
children: [
{
path: 'catalogs',
name: 'catalogs',
component: catalogsComponent,
props: true,
meta: {
requiresAuthAdmin: true
}
},
{
path: 'detail-catalog',
name: 'detail-catalog',
component: detailCatalogComponent,
props: true,
meta: {
requiresAuthAdmin: true
}
},
{
path: 'attributes',
name: 'attributes',
component: attributesComponent,
props: true,
meta: {
requiresAuthAdmin: true
}
},
{
path: 'register-carousel',
name: 'register-carousel',
component: registerCarouselComponent,
meta: {
requiresAuthAdmin: true
}
},
{
path: 'edit-pages',
name: 'edit-page',
component: editPageComponent,
meta: {
requiresAuthAdmin: true
}
},
{
path: 'register-widget',
name: 'register-widget',
component: registerWidgetComponent,
meta: {
requiresAuthAdmin: true
}
}
]
Vista de login.html
<section class="login">
<v-layout row wrap>
<v-flex class="login-header" xs12>
<v-img class="img-login-header" :src="require('@/assets/img/jac-logo.png')" width=144 />
</v-flex>
<v-flex class="login-section">
<div class="login-form">
<h1 class="login-title">¡Bienvenido al Administrador de Jac Store Online!</h1>
<v-text-field class="user-input" label="Usuario" v-model="email"
@keyup.enter.native="login()"
append-icon="person" :messages="messageValidLogin"></v-text-field>
<v-text-field class="user-password" :type="showPassword ? 'text' : 'password'" v-model="password"
:append-icon="showPassword ? 'visibility' : 'visibility_off'" label="Constraseña"
@keyup.enter.native="login()"
@click:append="showPassword = !showPassword"></v-text-field>
<v-btn class="btn-login" @click="login()" color="#e63e32">ENTRAR</v-btn>
<v-flex class="login-footer">
<label class="label-input-footer">¿Olvidaste tu contraseña? <span
@click="currentView = 'recover-password'">Recupérala</span></label>
</v-flex>
</div>
</v-flex>
</v-layout>
</section>
Vista login.js
export default {
name: 'login',
components: {},
props: [],
data () {
return {
showPassword: false,
password: '',
email: '',
messageValidLogin: ''
},
computed: {
logo () {
return require('@/assets/img/jac-logo-negro.png')
},
created () {
},
methods: {
login: function () {
//envio de datos
const data = {
'email': this.email,
'password': this.password
customerService.loginPassword(data).then((res) => {
if (res.hasOwnProperty('accessToken')) {
this.$router.push('/dashboard')
} else {
this.valid = false
})
}
Servicio CostumerService
const apiLoginPassword = configService.apiUrl + `usermanagement/auth/login`
const apiGetUser = configService.apiUrl + `usermanagement/user/me`
const apiGetUserInfo = configService.apiUrl + `customer/customerdata/`
const customerService = {
loginPassword (data) {
return (fetch(apiLoginPassword, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(data)
})
.then((res) => res.json())
.then((json) => json))
}
getUser () {
return (fetch(apiGetUser, {
method: 'GET',
withCredentials: true,
credentials: 'include',
headers: new Headers({
'Content-Type': 'application/json',
//le mandamos el token
'Authorization': 'Bearer ' + localStorage.getItem('access_token')
})
})
.then((res) => res.json())
.then((json) => json))
},
//recibe el ID del usuario
getUserInfo (id) {
return (fetch(apiGetUserInfo + id, {
method: 'GET',
withCredentials: true,
credentials: 'include',
headers: new Headers({
'Content-Type': 'application/json',
//le mandamos el token
'Authorization': 'Bearer ' + localStorage.getItem('access_token')
})
})
.then((res) => res.json())
.then((json) => json))
},
postLogout () {
return (fetch(apiGetLogout, {
method: 'POST',
withCredentials: true,
credentials: 'include',
headers: new Headers({
'Content-Type': 'application/json',
//le enviamos el token
'Authorization': 'Bearer ' + localStorage.getItem('access_token')
})
})
.then((json) => json))
}
Vuex
Vue.use(Vuex)
},