Sfoglia il codice sorgente

Add Login form and Core

- Added a login page /login
TODO: Add this form too all pages.
- Added Core, an Object which can be accessed from anywhere. Its added to the Vue prototype.
Ecconia 7 anni fa
parent
commit
74adb76403
5 ha cambiato i file con 105 aggiunte e 2 eliminazioni
  1. 12 2
      src/App.vue
  2. 4 0
      src/main.js
  3. 4 0
      src/router.js
  4. 11 0
      src/scripts/core.js
  5. 74 0
      src/views/Login.vue

+ 12 - 2
src/App.vue

@@ -13,7 +13,7 @@
 				<div v-if="user">
 				<div v-if="user">
 					<span>Username: {{ user.username }}</span>
 					<span>Username: {{ user.username }}</span>
 				</div>
 				</div>
-				<span v-else>Login</span>
+				<router-link class="rl" to="/login" v-else>Login</router-link>
 			</div>
 			</div>
 		</header>
 		</header>
 
 
@@ -78,7 +78,6 @@
 
 
 	header .logo {
 	header .logo {
 		display: inline-block;
 		display: inline-block;
-		padding: 0.2em 1em;
 	}
 	}
 
 
 	header .menu-container {
 	header .menu-container {
@@ -94,4 +93,15 @@
 		margin-left: 8px;
 		margin-left: 8px;
 		margin-right: 8px;
 		margin-right: 8px;
 	}
 	}
+
+	.rl {
+		text-decoration: none;
+		color: #aaa;
+		padding: 0.2em 1em;
+	}
+
+	.rl:hover {
+		color: #ddd;
+		background-color: #333;
+	}
 </style>
 </style>

+ 4 - 0
src/main.js

@@ -2,9 +2,13 @@ import Vue from 'vue'
 import App from './App.vue'
 import App from './App.vue'
 import router from './router'
 import router from './router'
 import store from './store'
 import store from './store'
+import Core from './scripts/core.js'
 
 
 Vue.config.productionTip = true
 Vue.config.productionTip = true
 
 
+const core = new Core(store)
+Vue.prototype.core = core
+
 new Vue({
 new Vue({
   router,
   router,
   store,
   store,

+ 4 - 0
src/router.js

@@ -15,6 +15,10 @@ export default new Router({
 			path: '/',
 			path: '/',
 			component: load('Mainpage')
 			component: load('Mainpage')
 		},
 		},
+		{
+			path: '/login',
+			component: load('Login'),
+		},
 		{
 		{
 			path: '/impressum',
 			path: '/impressum',
 			component: load('Impressum')
 			component: load('Impressum')

+ 11 - 0
src/scripts/core.js

@@ -0,0 +1,11 @@
+import axios from "axios";
+
+export default class {
+	constructor(vuex) {
+		this.vuex = vuex
+	}
+
+	lol(username, password) {
+		alert('Login attempt as user \'' + username + '\' with password \'' + password + '\'')
+	}
+}

+ 74 - 0
src/views/Login.vue

@@ -0,0 +1,74 @@
+<template>
+	<div>
+		<h1>Login</h1>
+
+		<div v-if="!user">
+			<span>Username: </span>
+			<input @keyup.enter="usernameDone()" v-model="username" placeholder="username" ref="username"><br>
+
+			<span>Password: </span>
+			<input @keyup.enter="passwordDone()" v-model="password" placeholder="password" type="password" ref="password"><br>
+
+			<button @click="buttonDone()">Login</button><span class="error">{{ error }}</span><br>
+		</div>
+		<span v-else>You are logged in.</span>
+	</div>
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+				error: '',
+				username: '',
+				password: '',
+			}
+		},
+		mounted() {
+			this.$refs.username.focus()
+		},
+		computed: {
+			user() {
+				return this.$store.state.user
+			},
+		},
+		methods: {
+			usernameDone() {
+				if(this.username !== '' || this.validateData()) {
+					this.$refs.password.focus()
+				}
+			},
+			passwordDone() {
+				if(this.validateData()) {
+					this.attemptLogin()
+				}
+			},
+			buttonDone() {
+				if(this.validateData()) {
+					this.attemptLogin()
+				}
+			},
+			validateData() {
+				if(this.username === '') {
+					this.error = 'Please input a username'
+					this.$refs.username.focus()
+				} else if(this.password === '') {
+					this.error = 'Please input a password'
+					this.$refs.password.focus()
+				} else {
+					return true
+				}
+				return false
+			},
+			attemptLogin() {
+				this.core.lol(this.username, this.password)
+			},
+		}
+	}
+</script>
+
+<style scoped>
+	.error {
+		color: #d00;
+	}
+</style>