From 78587f8544cd6ae6498963b0943deb58baec20ee Mon Sep 17 00:00:00 2001 From: Alexis <35.alexis.pele@gmail.com> Date: Mon, 6 Jul 2020 12:49:09 +0200 Subject: [PATCH] - Added basic user login --- client/package-lock.json | 5 ++ client/package.json | 1 + client/src/api/repositories.js | 2 + client/src/api/usersRepository.js | 12 ++++ .../src/components/global/navbar/navbar.vue | 1 + client/src/main.js | 20 +++--- client/src/pages/user/login-page.vue | 53 ++++++++++++++- client/src/pages/user/profile-page.vue | 25 ++++++++ client/src/routes.js | 64 ++++++++++++++++--- 9 files changed, 161 insertions(+), 22 deletions(-) create mode 100644 client/src/api/usersRepository.js create mode 100644 client/src/pages/user/profile-page.vue diff --git a/client/package-lock.json b/client/package-lock.json index e53b9cb..8aa7da7 100644 --- a/client/package-lock.json +++ b/client/package-lock.json @@ -11960,6 +11960,11 @@ "resolved": "https://registry.npmjs.org/vue/-/vue-2.6.11.tgz", "integrity": "sha512-VfPwgcGABbGAue9+sfrD4PuwFar7gPb1yl1UK1MwXoQPAw0BKSqWfoYCT/ThFrdEVWoI51dBuyCoiNU9bZDZxQ==" }, + "vue-cookies": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/vue-cookies/-/vue-cookies-1.7.0.tgz", + "integrity": "sha512-vuEUm6wYMMrFAHFCrkzIUAy8+MgPAbBGmYXnk2M6X6O2KHbMT1wuDD2izacmsSUp6ZM02e23MJRtPRobl88VMg==" + }, "vue-eslint-parser": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-7.0.0.tgz", diff --git a/client/package.json b/client/package.json index dea18a1..1cd78c3 100644 --- a/client/package.json +++ b/client/package.json @@ -35,6 +35,7 @@ "popper.js": "^1.16.1", "v-clipboard": "^2.2.3", "vue": "^2.6.11", + "vue-cookies": "^1.7.0", "vue-masonry": "^0.11.8" }, "devDependencies": { diff --git a/client/src/api/repositories.js b/client/src/api/repositories.js index a663bfa..96fddd7 100644 --- a/client/src/api/repositories.js +++ b/client/src/api/repositories.js @@ -3,6 +3,7 @@ import schoolsRepository from './schoolsRepository' import metaschoolsRepository from './metaschoolsRepository' import variablesRepository from './variablesRepository' import ingredientsRepository from './ingredientsRepository' +import usersRepository from './usersRepository' // List of possible repositories const repositories = { @@ -11,6 +12,7 @@ const repositories = { metaschools: metaschoolsRepository, variables: variablesRepository, ingredients: ingredientsRepository, + users: usersRepository, } // Usage : RepositoryFactoryInstance.get('reponame'); diff --git a/client/src/api/usersRepository.js b/client/src/api/usersRepository.js new file mode 100644 index 0000000..9320855 --- /dev/null +++ b/client/src/api/usersRepository.js @@ -0,0 +1,12 @@ +import api from './api' + +const resource = "/users" + +export default { + login(data) { + return api.post(`${resource}/login`, data) + }, + addOne(data) { + return api.post(`${resource}`, data) + }, +} \ No newline at end of file diff --git a/client/src/components/global/navbar/navbar.vue b/client/src/components/global/navbar/navbar.vue index db97f88..20b899c 100644 --- a/client/src/components/global/navbar/navbar.vue +++ b/client/src/components/global/navbar/navbar.vue @@ -11,6 +11,7 @@ diff --git a/client/src/main.js b/client/src/main.js index 9f46591..d4de66a 100644 --- a/client/src/main.js +++ b/client/src/main.js @@ -8,9 +8,13 @@ Globals.forEach(component => { Vue.component(component.name, component) }); -// Auth +// Environment require('dotenv').config() +// Cookies +import VueCookies from 'vue-cookies' +Vue.use(VueCookies) + // Jquery import jquery from 'jquery' window.$ = jquery @@ -26,7 +30,7 @@ import 'bootstrap/dist/js/bootstrap.js' import { BootstrapVue } from 'bootstrap-vue' Vue.use(BootstrapVue) -import { VueMasonryPlugin } from 'vue-masonry'; +import { VueMasonryPlugin } from 'vue-masonry' Vue.use(VueMasonryPlugin) import clipboard from 'v-clipboard' @@ -39,18 +43,12 @@ var filter = function(text, length, clamp){ node.innerHTML = text; var content = node.textContent; return content.length > length ? content.slice(0, length) + clamp : content; -}; -Vue.filter('truncate', filter); +} +Vue.filter('truncate', filter) // Router -import routes from './routes' +import router from './routes' Vue.use(VueRouter) -const router = new VueRouter({ - mode: 'history', - routes, - linkActiveClass: "", - linkExactActiveClass: "active", -}); // Mount Vue const app = new Vue({ diff --git a/client/src/pages/user/login-page.vue b/client/src/pages/user/login-page.vue index 2f4bb2f..e2db8f0 100644 --- a/client/src/pages/user/login-page.vue +++ b/client/src/pages/user/login-page.vue @@ -1,14 +1,65 @@ diff --git a/client/src/pages/user/profile-page.vue b/client/src/pages/user/profile-page.vue new file mode 100644 index 0000000..944eb37 --- /dev/null +++ b/client/src/pages/user/profile-page.vue @@ -0,0 +1,25 @@ + + + + + \ No newline at end of file diff --git a/client/src/routes.js b/client/src/routes.js index b442e0a..8ca8eaa 100644 --- a/client/src/routes.js +++ b/client/src/routes.js @@ -1,3 +1,6 @@ +import Vue from 'vue' +import VueRouter from 'vue-router' + // Pages import Index from "~/pages/index-page" @@ -9,33 +12,74 @@ import SchoolSingle from "~/pages/schools/single-school-page" import Login from "~/pages/user/login-page" import Register from "~/pages/user/register-page" +import Profile from "~/pages/user/profile-page" // Routes const routes = [ { - path: "*", redirect: "/", + path: "*", + redirect: "/", }, { - path: '/', component: Index, + path: '/', + component: Index, }, { - path: '/sorts', component: Spells, + path: '/connexion', + component: Login, }, { - path: '/sorts/:id', component: SpellSingle, props: true, + path: '/inscription', + component: Register, }, { - path: '/ecoles', component: Schools, + path: '/sorts', + component: Spells, }, { - path: '/ecoles/:id', component: SchoolSingle, props: true, + path: '/sorts/:id', + component: SpellSingle, + props: true, }, { - path: '/connexion', component: Login, + path: '/ecoles', + component: Schools, }, { - path: '/inscription', component: Register, + path: '/ecoles/:id', + component: SchoolSingle, + props: true, }, -]; + { + path: '/profil', + component: Profile, + props: true, + meta: { + authGuard: true, + } + }, +] -export default routes; \ No newline at end of file +const router = new VueRouter({ + mode: 'history', + routes, + linkActiveClass: "", + linkExactActiveClass: "active", +}) + +router.beforeEach((to, from, next) => { + if (to.matched.some(record => record.meta.authGuard)) { + if (Vue.$cookies.get('loggedUser') == null) { + next({ + path: '/connexion', + params: { nextUrl: to.fullPath } + }) + } else { + next() + } + } else { + next() + } +}) + +export default router; \ No newline at end of file