From da2dbeb0fc62e9c87de3a18b04eb8bb3647ee7df Mon Sep 17 00:00:00 2001 From: TanelOrumaa Date: Mon, 6 Dec 2021 21:08:15 +0200 Subject: [PATCH] MOB-42 Redid the whole frontend part in Vue --- demoBackend/pom.xml | 87 ++++++++++++ demoBackend/src/demo-website/.npmrc | Bin 118 -> 122 bytes .../src/demo-website/package-lock.json | 132 +++++++++++++++--- demoBackend/src/demo-website/package.json | 7 +- demoBackend/src/demo-website/src/App.vue | 26 ++++ .../src/demo-website/src/components/Login.vue | 69 ++++++--- .../demo-website/src/components/Navbar.vue | 26 +++- .../demo-website/src/components/Welcome.vue | 30 ++++ demoBackend/src/demo-website/src/main.js | 50 +++++++ .../src/demo-website/src/pages/login/main.js | 10 -- .../demo-website/src/pages/welcome/main.js | 10 -- .../src/demo-website/src/router/index.js | 31 ++++ .../{pages/login/App.vue => views/Login.vue} | 8 +- .../welcome/App.vue => views/Welcome.vue} | 8 +- demoBackend/src/demo-website/src/web-eid.js | 4 +- demoBackend/src/demo-website/vue.config.js | 16 --- .../config/ValidationConfiguration.kt | 4 +- .../demobackend/web/LoginController.kt | 20 --- .../demobackend/web/SignatureController.kt | 20 --- .../web/rest/AuthenticationController.kt | 2 +- .../src/main/resources/static/css/main.css | 29 ---- .../src/main/resources/static/js/index.js | 14 -- .../src/main/resources/static/js/main.js | 71 ---------- .../src/main/resources/templates/index.html | 38 ----- .../main/resources/templates/signature.html | 35 ----- 25 files changed, 426 insertions(+), 321 deletions(-) create mode 100644 demoBackend/src/demo-website/src/App.vue create mode 100644 demoBackend/src/demo-website/src/components/Welcome.vue create mode 100644 demoBackend/src/demo-website/src/main.js delete mode 100644 demoBackend/src/demo-website/src/pages/login/main.js delete mode 100644 demoBackend/src/demo-website/src/pages/welcome/main.js create mode 100644 demoBackend/src/demo-website/src/router/index.js rename demoBackend/src/demo-website/src/{pages/login/App.vue => views/Login.vue} (63%) rename demoBackend/src/demo-website/src/{pages/welcome/App.vue => views/Welcome.vue} (63%) delete mode 100644 demoBackend/src/main/kotlin/com/tarkvaratehnika/demobackend/web/LoginController.kt delete mode 100644 demoBackend/src/main/kotlin/com/tarkvaratehnika/demobackend/web/SignatureController.kt delete mode 100644 demoBackend/src/main/resources/static/css/main.css delete mode 100644 demoBackend/src/main/resources/static/js/index.js delete mode 100644 demoBackend/src/main/resources/static/js/main.js delete mode 100644 demoBackend/src/main/resources/templates/index.html delete mode 100644 demoBackend/src/main/resources/templates/signature.html diff --git a/demoBackend/pom.xml b/demoBackend/pom.xml index 8b1f7a3..5ca20d3 100644 --- a/demoBackend/pom.xml +++ b/demoBackend/pom.xml @@ -18,6 +18,8 @@ 1.5.31 2.8.5 1.1.1 + v16.13.0 + 8.1.4 @@ -115,6 +117,91 @@ + + + com.github.eirslett + frontend-maven-plugin + 1.12.0 + + + + Install node and npm + + install-node-and-npm + + generate-resources + + ${node.version} + ${npm.version} + + + + + npm install + + npm + + generate-resources + + install + + + + + npm build + + npm + + process-resources + + run build + + + + + ${node.version} + src/demo-website + + + + + + org.apache.maven.plugins + maven-resources-plugin + + + Copy web-eid.js file to Vue root folder. + generate-resources + + copy-resources + + + src/demo-website/src + + + src/demo-website/node_modules/@web-eid/web-eid-library/dist/es + + + + + + Copy Vue frontend into Spring Boot target static folder + process-resources + + copy-resources + + + target/classes/static + + + src/demo-website/dist + true + + + + + + diff --git a/demoBackend/src/demo-website/.npmrc b/demoBackend/src/demo-website/.npmrc index ff1b0421a912f682b70b16977475e71f92df1512..85bdadef3f0a43b7945e6850d4b950ad7a2bd439 100644 GIT binary patch delta 12 ScmXS`Vtc=TFAz;+Dggj33= 6" } }, - "node_modules/@popperjs/core": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.0.tgz", - "integrity": "sha512-zrsUxjLOKAzdewIDRWy9nsV1GQsKBCWaGwsZQlCgr6/q+vjyZhFgqedLfFBuI9anTPEUT4APq9Mu0SZBTzIcGQ==", - "dev": true, - "peer": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/popperjs" - } - }, "node_modules/@soda/friendly-errors-webpack-plugin": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/@soda/friendly-errors-webpack-plugin/-/friendly-errors-webpack-plugin-1.8.1.tgz", @@ -2567,6 +2561,11 @@ "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", "dev": true }, + "node_modules/@vue/devtools-api": { + "version": "6.0.0-beta.20.1", + "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.0.0-beta.20.1.tgz", + "integrity": "sha512-R2rfiRY+kZugzWh9ZyITaovx+jpU4vgivAEAiz80kvh3yviiTU3CBuGuyWpSwGz9/C7TkSWVM/FtQRGlZ16n8Q==" + }, "node_modules/@vue/preload-webpack-plugin": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@vue/preload-webpack-plugin/-/preload-webpack-plugin-1.1.2.tgz", @@ -8669,6 +8668,14 @@ "integrity": "sha512-JVAfqNPTvNq3sB/VHQJAFxN/sPgKnsKrCwyRt15zwNCdrMMJDdcEOdubuy+DuJYYdm0ox1J4uzEuYKkN+9yhVg==", "dev": true }, + "node_modules/js-cookie": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/js-cookie/-/js-cookie-3.0.1.tgz", + "integrity": "sha512-+0rgsUXZu4ncpPxRL+lNEptWMOWl9etvPHc/koSRp6MPwpRYAhmk0dUG00J4bxVV3r9uUzfo24wW0knS07SKSw==", + "engines": { + "node": ">=12" + } + }, "node_modules/js-message": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/js-message/-/js-message-1.0.7.tgz", @@ -12104,6 +12111,11 @@ "integrity": "sha512-Vpfqwm4EnqGdlsBFNmHhxhElJYrdfcxPThu+ryKS5J8L/fhAwLazFZtq+S+TWZ9ANj2piSQLGj6NQg+lKPmxrw==", "dev": true }, + "node_modules/shvl": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/shvl/-/shvl-2.0.3.tgz", + "integrity": "sha512-V7C6S9Hlol6SzOJPnQ7qzOVEWUQImt3BNmmzh40wObhla3XOYMe4gGiYzLrJd5TFa+cI2f9LKIRJTTKZSTbWgw==" + }, "node_modules/side-channel": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", @@ -14151,6 +14163,17 @@ "integrity": "sha1-M7QHd3VMZDJXPBIMw4CLvRDUfwQ=", "dev": true }, + "node_modules/vue-router": { + "version": "4.0.12", + "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.0.12.tgz", + "integrity": "sha512-CPXvfqe+mZLB1kBWssssTiWg4EQERyqJZes7USiqfW9B5N2x+nHlnsM1D3b5CaJ6qgCvMmYJnz+G0iWjNCvXrg==", + "dependencies": { + "@vue/devtools-api": "^6.0.0-beta.18" + }, + "peerDependencies": { + "vue": "^3.0.0" + } + }, "node_modules/vue-style-loader": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/vue-style-loader/-/vue-style-loader-4.1.3.tgz", @@ -14173,6 +14196,37 @@ "integrity": "sha512-4gDntzrifFnCEvyoO8PqyJDmguXgVPxKiIxrBKjIowvL9l+N66196+72XVYR8BBf1Uv1Fgt3bGevJ+sEmxfZzw==", "dev": true }, + "node_modules/vuex": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/vuex/-/vuex-4.0.2.tgz", + "integrity": "sha512-M6r8uxELjZIK8kTKDGgZTYX/ahzblnzC4isU1tpmEuOIIKmV+TRdc+H4s8ds2NuZ7wpUTdGRzJRtoj+lI+pc0Q==", + "dependencies": { + "@vue/devtools-api": "^6.0.0-beta.11" + }, + "peerDependencies": { + "vue": "^3.0.2" + } + }, + "node_modules/vuex-persistedstate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/vuex-persistedstate/-/vuex-persistedstate-4.1.0.tgz", + "integrity": "sha512-3SkEj4NqwM69ikJdFVw6gObeB0NHyspRYMYkR/EbhR0hbvAKyR5gksVhtAfY1UYuWUOCCA0QNGwv9pOwdj+XUQ==", + "dependencies": { + "deepmerge": "^4.2.2", + "shvl": "^2.0.3" + }, + "peerDependencies": { + "vuex": "^3.0 || ^4.0.0-rc" + } + }, + "node_modules/vuex-persistedstate/node_modules/deepmerge": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", + "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/watchpack": { "version": "1.7.5", "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.5.tgz", @@ -16370,13 +16424,6 @@ "integrity": "sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==", "dev": true }, - "@popperjs/core": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.0.tgz", - "integrity": "sha512-zrsUxjLOKAzdewIDRWy9nsV1GQsKBCWaGwsZQlCgr6/q+vjyZhFgqedLfFBuI9anTPEUT4APq9Mu0SZBTzIcGQ==", - "dev": true, - "peer": true - }, "@soda/friendly-errors-webpack-plugin": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/@soda/friendly-errors-webpack-plugin/-/friendly-errors-webpack-plugin-1.8.1.tgz", @@ -17081,6 +17128,11 @@ } } }, + "@vue/devtools-api": { + "version": "6.0.0-beta.20.1", + "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.0.0-beta.20.1.tgz", + "integrity": "sha512-R2rfiRY+kZugzWh9ZyITaovx+jpU4vgivAEAiz80kvh3yviiTU3CBuGuyWpSwGz9/C7TkSWVM/FtQRGlZ16n8Q==" + }, "@vue/preload-webpack-plugin": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@vue/preload-webpack-plugin/-/preload-webpack-plugin-1.1.2.tgz", @@ -21944,6 +21996,11 @@ "integrity": "sha512-JVAfqNPTvNq3sB/VHQJAFxN/sPgKnsKrCwyRt15zwNCdrMMJDdcEOdubuy+DuJYYdm0ox1J4uzEuYKkN+9yhVg==", "dev": true }, + "js-cookie": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/js-cookie/-/js-cookie-3.0.1.tgz", + "integrity": "sha512-+0rgsUXZu4ncpPxRL+lNEptWMOWl9etvPHc/koSRp6MPwpRYAhmk0dUG00J4bxVV3r9uUzfo24wW0knS07SKSw==" + }, "js-message": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/js-message/-/js-message-1.0.7.tgz", @@ -24809,6 +24866,11 @@ "integrity": "sha512-Vpfqwm4EnqGdlsBFNmHhxhElJYrdfcxPThu+ryKS5J8L/fhAwLazFZtq+S+TWZ9ANj2piSQLGj6NQg+lKPmxrw==", "dev": true }, + "shvl": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/shvl/-/shvl-2.0.3.tgz", + "integrity": "sha512-V7C6S9Hlol6SzOJPnQ7qzOVEWUQImt3BNmmzh40wObhla3XOYMe4gGiYzLrJd5TFa+cI2f9LKIRJTTKZSTbWgw==" + }, "side-channel": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", @@ -26491,6 +26553,14 @@ } } }, + "vue-router": { + "version": "4.0.12", + "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.0.12.tgz", + "integrity": "sha512-CPXvfqe+mZLB1kBWssssTiWg4EQERyqJZes7USiqfW9B5N2x+nHlnsM1D3b5CaJ6qgCvMmYJnz+G0iWjNCvXrg==", + "requires": { + "@vue/devtools-api": "^6.0.0-beta.18" + } + }, "vue-style-loader": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/vue-style-loader/-/vue-style-loader-4.1.3.tgz", @@ -26515,6 +26585,30 @@ "integrity": "sha512-4gDntzrifFnCEvyoO8PqyJDmguXgVPxKiIxrBKjIowvL9l+N66196+72XVYR8BBf1Uv1Fgt3bGevJ+sEmxfZzw==", "dev": true }, + "vuex": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/vuex/-/vuex-4.0.2.tgz", + "integrity": "sha512-M6r8uxELjZIK8kTKDGgZTYX/ahzblnzC4isU1tpmEuOIIKmV+TRdc+H4s8ds2NuZ7wpUTdGRzJRtoj+lI+pc0Q==", + "requires": { + "@vue/devtools-api": "^6.0.0-beta.11" + } + }, + "vuex-persistedstate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/vuex-persistedstate/-/vuex-persistedstate-4.1.0.tgz", + "integrity": "sha512-3SkEj4NqwM69ikJdFVw6gObeB0NHyspRYMYkR/EbhR0hbvAKyR5gksVhtAfY1UYuWUOCCA0QNGwv9pOwdj+XUQ==", + "requires": { + "deepmerge": "^4.2.2", + "shvl": "^2.0.3" + }, + "dependencies": { + "deepmerge": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", + "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==" + } + } + }, "watchpack": { "version": "1.7.5", "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.5.tgz", diff --git a/demoBackend/src/demo-website/package.json b/demoBackend/src/demo-website/package.json index 9df9b72..6b29f94 100644 --- a/demoBackend/src/demo-website/package.json +++ b/demoBackend/src/demo-website/package.json @@ -10,10 +10,15 @@ "dependencies": { "@web-eid/web-eid-library": "../../../../web-eid.js/", "core-js": "^3.6.5", - "vue": "^3.0.0" + "js-cookie": "^3.0.1", + "vue": "^3.0.0", + "vue-router": "^4.0.0-0", + "vuex": "^4.0.2", + "vuex-persistedstate": "^4.1.0" }, "devDependencies": { "@vue/cli-plugin-babel": "~4.5.0", + "@vue/cli-plugin-router": "~4.5.0", "@vue/cli-service": "~4.5.0", "@vue/compiler-sfc": "^3.0.0", "babel-eslint": "^10.1.0", diff --git a/demoBackend/src/demo-website/src/App.vue b/demoBackend/src/demo-website/src/App.vue new file mode 100644 index 0000000..159a761 --- /dev/null +++ b/demoBackend/src/demo-website/src/App.vue @@ -0,0 +1,26 @@ + + + diff --git a/demoBackend/src/demo-website/src/components/Login.vue b/demoBackend/src/demo-website/src/components/Login.vue index 61858d4..dffcaf7 100644 --- a/demoBackend/src/demo-website/src/components/Login.vue +++ b/demoBackend/src/demo-website/src/components/Login.vue @@ -8,7 +8,16 @@

Read more from here.

- + + +
@@ -18,7 +27,6 @@
-

Token: {{ csrftoken }}

@@ -26,39 +34,41 @@ diff --git a/demoBackend/src/demo-website/src/components/Navbar.vue b/demoBackend/src/demo-website/src/components/Navbar.vue index 39fa050..6297a76 100644 --- a/demoBackend/src/demo-website/src/components/Navbar.vue +++ b/demoBackend/src/demo-website/src/components/Navbar.vue @@ -1,18 +1,36 @@ \ No newline at end of file diff --git a/demoBackend/src/demo-website/src/components/Welcome.vue b/demoBackend/src/demo-website/src/components/Welcome.vue new file mode 100644 index 0000000..fd86c45 --- /dev/null +++ b/demoBackend/src/demo-website/src/components/Welcome.vue @@ -0,0 +1,30 @@ + + + + + + diff --git a/demoBackend/src/demo-website/src/main.js b/demoBackend/src/demo-website/src/main.js new file mode 100644 index 0000000..79fe7bc --- /dev/null +++ b/demoBackend/src/demo-website/src/main.js @@ -0,0 +1,50 @@ +import {createApp} from 'vue'; +import App from './App.vue'; +import {createStore} from 'vuex' +import BootstrapVue3 from 'bootstrap-vue-3' +import createPersistedState from "vuex-persistedstate"; + +import 'bootstrap/dist/css/bootstrap.css' +import 'bootstrap-vue-3/dist/bootstrap-vue-3.css' +import router from "./router/index"; + +// Create a new store instance. +const store = createStore({ + state() { + return { + authenticated: false, + } + }, + mutations: { + setLoggedIn(state, isLoggedIn) { + console.log("Setting logged in: " + isLoggedIn); + state.authenticated = isLoggedIn; + } + }, + getters: { + getAuthenticated: state => { + return state.authenticated; + } + }, + plugins: [createPersistedState()], +}) + +router.beforeEach((to, from, next) => { + if (to.matched.some(record => record.meta.requiresAuth)) { + // this route requires auth, check if logged in + // if not, redirect to login page. + if (!store.state.authenticated) { + next({name: 'Login'}) + } else { + next() // go to wherever I'm going + } + } else { + next() // does not require auth, make sure to always call next()! + } +}) + +const app = createApp(App) +app.use(BootstrapVue3) +app.use(router) +app.use(store) +app.mount('#app') \ No newline at end of file diff --git a/demoBackend/src/demo-website/src/pages/login/main.js b/demoBackend/src/demo-website/src/pages/login/main.js deleted file mode 100644 index e56c388..0000000 --- a/demoBackend/src/demo-website/src/pages/login/main.js +++ /dev/null @@ -1,10 +0,0 @@ -import { createApp } from 'vue'; -import App from './App.vue'; -import BootstrapVue3 from 'bootstrap-vue-3' - -import 'bootstrap/dist/css/bootstrap.css' -import 'bootstrap-vue-3/dist/bootstrap-vue-3.css' - -const app = createApp(App) -app.use(BootstrapVue3) -app.mount('#app') \ No newline at end of file diff --git a/demoBackend/src/demo-website/src/pages/welcome/main.js b/demoBackend/src/demo-website/src/pages/welcome/main.js deleted file mode 100644 index e56c388..0000000 --- a/demoBackend/src/demo-website/src/pages/welcome/main.js +++ /dev/null @@ -1,10 +0,0 @@ -import { createApp } from 'vue'; -import App from './App.vue'; -import BootstrapVue3 from 'bootstrap-vue-3' - -import 'bootstrap/dist/css/bootstrap.css' -import 'bootstrap-vue-3/dist/bootstrap-vue-3.css' - -const app = createApp(App) -app.use(BootstrapVue3) -app.mount('#app') \ No newline at end of file diff --git a/demoBackend/src/demo-website/src/router/index.js b/demoBackend/src/demo-website/src/router/index.js new file mode 100644 index 0000000..4762302 --- /dev/null +++ b/demoBackend/src/demo-website/src/router/index.js @@ -0,0 +1,31 @@ +import { createRouter, createWebHistory } from 'vue-router' +import Login from '@/views/Login.vue' +import Welcome from "@/views/Welcome"; + +const routes = [ + { + path: '/', + name: 'Login', + component: Login, + meta: { + requiresAuth: false + } + }, + { + path: '/welcome', + name: 'Welcome', + component: Welcome, + meta: { + requiresAuth: true + } + } +] + +const router = createRouter({ + history: createWebHistory(process.env.BASE_URL), + routes +}) + + + +export default router diff --git a/demoBackend/src/demo-website/src/pages/login/App.vue b/demoBackend/src/demo-website/src/views/Login.vue similarity index 63% rename from demoBackend/src/demo-website/src/pages/login/App.vue rename to demoBackend/src/demo-website/src/views/Login.vue index aca0338..cb251da 100644 --- a/demoBackend/src/demo-website/src/pages/login/App.vue +++ b/demoBackend/src/demo-website/src/views/Login.vue @@ -1,16 +1,16 @@ - - - - - - - -
-

Welcome to Estonian ID card mobile authentication demo website. When using a mobile phone, you can log in to the - website using your ID card by using the button below.

-
Make sure you've installed the authentication app from: GitHub
- - -
- - \ No newline at end of file diff --git a/demoBackend/src/main/resources/templates/signature.html b/demoBackend/src/main/resources/templates/signature.html deleted file mode 100644 index 5c4bd12..0000000 --- a/demoBackend/src/main/resources/templates/signature.html +++ /dev/null @@ -1,35 +0,0 @@ - - - - Login - - - - - - - - - - -
-

Congratulations! You have just authenticated yourself using your mobile phone and your ID-card. You can try to - give a signature to a file now.

-
This page is still WIP, signing a document feature will be implemented later.
-
- -
- -
- - \ No newline at end of file