Explicación en vídeo
Este vídeo corresponde a la versión vieja del script.
El script de creación ha cambiado desde que se grabó este vídeo, pero la forma de ejecutarlo es la misma. El proceso con el nuevo script se describe en los apartados siguientes.
Creación de proyecto
Para crear un proyecto Vue seguiremos los siguientes pasos (omitiendo los de instalar requisitos previos si ya los tenemos):
Lo primero que necesitamos tener instalado es Node.js, que trae el gestor de paquetes npm, y lo podemos descargar aquí: https://nodejs.org/es/. Debemos instalar la versión LTS (a día de hoy, 05/10/22, es la v14), pues con la última versión puede saltar un error "vue no se reconoce como un comando interno o externo", y esto no sucede con la LTS.
Una vez instalado, tenemos que instalar Vue CLI, que nos proporciona unos comandos para la creación y prototipado de proyectos de forma simple y rápida. Para instalarlo abrimos una terminal de comandos y ejecutamos lo siguiente:
npm install -g @vue/cli
Una vez hecho esto, tenemos dos opciones, un script que sirve de arquetipo para aplicaciones FundewebJS, o la forma nativa.
Arquetipo FundewebJS
- En primer lugar, debemos descargar este archivo: crearProyectoFDWJS.rar. Descomprimimos la carpeta que contiene.
- Nos abrimos una terminal y nos situamos dentro de la carpeta que hemos extraído.
Ejecutamos:
crearProyecto.bat
- Nos pedirá que introduzcamos lo siguiente: nombre del proyecto (será el nombre de la carpeta que contenga el proyecto), ruta base (ruta en la que se desplegará nuestro frontend, por ejemplo "/consulta/expedienteacademico") y ruta del backend (coincidirá con la propiedad server.servlet.context-path que tengamos en el application.properties de nuestro proyecto Spring Boot). Con estas últimas dos se establecen dos variables de entorno necesarias (archivo.env), que se podrán cambiar sin problema.
- Por último, debemos cambiar el campo "name" del archivo package.json e indicar el nombre de nuestro proyecto (el nombre sigue unas convenciones, básicamente debe estar formado por letras minúsculas y guiones, por ejemplo "consultaexpedientes-ui".
- Ejecutar npm i para descargar las dependencias de nuestro proyecto.
Una vez hecho esto, ya podemos iniciar nuestro proyecto, pero para que funcione correctamente en local, hay que tener dos variables de entorno que colocaremos en un archivo .env.local en la raíz del proyecto. Estas variables son:
VUE_APP_API_ENVIRONMENT=https://micampusdesa.um.esVUE_APP_BACKEND=https://mipc.atica.um.es:8080(indicar la ruta correspondiente en nuestro equipo)
La primera de ellas será micampusdesa, pues se utilizará para proxyficar las llamadas al portal, por ejemplo para poder hacer login. La segunda será la ruta completa de nuestro backend.
Importante: cuando probemos nuestra aplicación en local, tendremos que usar nuestro dominio .atica.um.es, pues a través de localhost no nos dejará hacer login con el portal.
Estructura de un proyecto Vue
La estructura de nuestros proyectos Vue vendrá marcada por unos directorios comunes de forma que el código quede organizado de forma similar en todos los proyectos FundeWebJs. El código lo tendremos bajo la carpeta :
- /src/assets: contendrá archivos que necesite nuestro proyecto, imágenes por ejemplo, y también el estilo corporativo mientras no esté disponible como un paquete de npm (guía de estilo corporativo).
- /src/components: componentes Vue propios.
- /src/locales: archivos de internacionalización (documentación de internacionalización).
- /src/mixins: mixins, archivos js para añadir funcionalidad a los componentes.
- /src/router: contendrá un index.js con el router donde vendrán definidas las rutas de nuestra aplicación (documentación vue-router).
- /src/services: archivos js correspondientes a las llamadas a nuestros servicios REST (documentación de llamadas a servicios REST).
- /src/store: store de Vuex y sus módulos (documentación Vuex).
- /src/views: componentes que sean vistas, generalmente tendremos uno por ruta.
- /src/App.vue: componente inicial de la aplicación.
- /src/main.js: archivo js donde hacemos imports globales e inicializamos la instancia de Vue.
Además, en la raíz del proyecto, tendremos:
- package.json: archivo que contiene las dependencias de nuestro proyecto.
- vue.config.js: archivo de configuración.
- archivos de parametrización: podemos tener diferentes archivos que contengan variables de entorno (documentación de parametrización).
Hacemos una diferenciación entre lo que serán vistas y lo que serán componentes para mantener cierta organización y que no acabemos con una carpeta poco intuitiva que contenga demasiados archivos. En ambos casos serán componentes, archivos .vue, pero las vistas serán los componentes que contengan una pantalla completa, mientras que los componentes son partes de éstas, por ejemplo una tabla, o cierta sección que queramos mostrar en nuestra pantalla, o una parte reutilizable que se utilice en diferentes vistas.
Actualizar proyectos
Si se ha creado el proyecto de cero, el contenido de los siguientes archivos estará igual, pero si tenemos proyectos antiguos, tenemos que actualizarlos para evitar conflictos y mezclas no deseadas.
package.json
En el apartado dependencies debemos poner versiones fijas. Esto es, sin ^ precediendo al número de versión. Además, debemos poner la última versión de @mncs/fwjs-components, la 0.1.56.
.env
Será así:
Debemos establecer estas variables:
- VUE_APP_PUBLIC_PATH: ruta de nuestra aplicación, será "/algo", siendo algo lo correspondiente a nuestra aplicación. No dejar con "/" o en blanco.
- VUE_APP_API_URL: ruta del backend, coincidirá con la propiedad server.servlet.context-path del application.properties
- VUE_APP_UMU_CLIENT_APP: nombre de la aplicación seguido de "-ui"
Archivos Login
Los archivos del login están en @mncs/fwjs-components, por lo que debemos cambiar los imports de éstos, y borrar los anteriores. En concreto, son los archivos:
- Login.vue
- AuthRefresher.js
- interceptors.js
- login.js
- user.js
Internacionalización
- También se ha incluido el archivo i18n.js en @mncs/fwjs-components, hay que importar este y borrar lo que tuviésemos.
Los archivos que contienen los mensajes antes eran archivos javascript, .js, ahora son JSON. Tendremos en la carpeta locales los archivos es.json y en.json. En ellos los mensajes se definen así:
es.json{ "titulo": "Mi aplicación", "hola": "Hola mundo" }
main.js
Con los cambios mencionados, el main.js queda así:
Vuex
Nuestro index.js de Vuex queda inicialmente así:
Router
El index.js de nuestro router queda inicialmente así:
.npmrc
Debe contener:
registry = https://verdaccio.um.es/
Vista inicial de la aplicación
La aplicación se inicia en main.js, donde se crea la instancia de Vue. El componente inicial, el que será el padre de todos los componentes, será App.vue. En éste, generalmente tendremos las partes fijas de la aplicación, como el header, footer, o menú. Para el contenido de la página, con <router-view> se le indica que se cargue el componente (que será una vista, es decir, un componente del directorio Views) correspondiente a la ruta en la que nos encontremos. Las diferentes rutas tendremos que definirlas en src/router/index.js. Un ejemplo de App.vue podría ser este, que incluye el header del portal de servicios y el elemento <router-view>:
<template>
<div id="app fwjsLoader-container">
<fwjsLoader v-if="loading" :fullScreen="true" :blurry="true" :dark="false" />
<Toast />
<fwjsSessionModal @expired="logout" style="width: 100%" />
<div style="height: 56px">
<fwjsHeader :title="$t('titulo')" :hasBack="true" :is-logged="isLogged" style="z-index: 9" />
</div>
<div id="contenido" style="margin-top: 15px">
<div id="vista">
<router-view />
</div>
<fwjsFooter />
</div>
</div>
</template>
<script>
import fwjsHeader from "@mncs/fwjs-components/fwjsHeader";
import AuthRefresher from "@mncs/fwjs-components/loginPOSE/AuthRefresher";
import { mapGetters, mapState } from "vuex";
import Toast from "primevue/toast";
import fwjsSessionModal from "@mncs/fwjs-components/fwjsSessionModal";
import fwjsLoader from "@mncs/fwjs-components/fwjsLoader";
import fwjsFooter from "@mncs/fwjs-components/fwjsFooter";
export default {
computed: {
...mapState("loadingGlobal", ["loading"]),
},
methods: {
logout() {
this.$store.dispatch("login/revokeToken");
},
},
mixins: [AuthRefresher],
components: {
fwjsHeader,
AuthRefresher,
Toast,
fwjsSessionModal,
fwjsLoader,
fwjsFooter,
},
};
</script>
<style scoped>
@media screen and (min-width: 40em) {
#contenido {
overflow: hidden;
overflow-y: auto;
padding: 24px 48px 0 48px;
flex: 1;
}
}
#vista {
min-height: calc(100vh - 185px);
margin-bottom: 15px;
}
</style>