add an lesson about axios

This commit is contained in:
Andreas Zweili 2021-03-19 17:28:32 +01:00
parent 8217fd60e2
commit 3e3fd51981
16 changed files with 7739 additions and 0 deletions

View File

@ -0,0 +1,5 @@
{
"presets": [
["env", { "modules": false }]
]
}

12
2021-03-19_axios-01-start/.gitignore vendored Normal file
View File

@ -0,0 +1,12 @@
.DS_Store
node_modules/
dist/
npm-debug.log
yarn-error.log
# Editor directories and files
.idea
*.suo
*.ntvs*
*.njsproj
*.sln

View File

@ -0,0 +1,18 @@
# vue-update
> Vue Auth & more
## Build Setup
``` bash
# install dependencies
npm install
# serve with hot reload at localhost:8080
npm run dev
# build for production with minification
npm run build
```
For detailed explanation on how things work, consult the [docs for vue-loader](http://vuejs.github.io/vue-loader).

View File

@ -0,0 +1,11 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>vue-update</title>
</head>
<body>
<div id="app"></div>
<script src="/dist/build.js"></script>
</body>
</html>

7086
2021-03-19_axios-01-start/package-lock.json generated Normal file

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,29 @@
{
"name": "vue-update",
"description": "Vue Auth & more",
"version": "1.0.0",
"author": "Maximilian Schwarzmüller <business@academind.com>",
"private": true,
"scripts": {
"dev": "cross-env NODE_ENV=development webpack-dev-server --open --hot",
"build": "cross-env NODE_ENV=production webpack --progress --hide-modules"
},
"dependencies": {
"axios": "^0.21.1",
"vue": "^2.4.4",
"vue-router": "^3.0.1",
"vuex": "^3.0.0"
},
"devDependencies": {
"babel-core": "^6.26.0",
"babel-loader": "^7.1.2",
"babel-preset-env": "^1.6.0",
"cross-env": "^5.0.5",
"css-loader": "^0.28.7",
"file-loader": "^1.1.4",
"vue-loader": "^13.0.5",
"vue-template-compiler": "^2.4.4",
"webpack": "^3.6.0",
"webpack-dev-server": "^2.9.1"
}
}

View File

@ -0,0 +1,23 @@
<template>
<div id="app">
<app-header />
<router-view></router-view>
</div>
</template>
<script>
import Header from './components/header/header.vue'
export default {
name: 'app',
components: {
'app-header': Header
}
}
</script>
<style>
body, html {
margin: 0;
font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
}
</style>

View File

@ -0,0 +1,102 @@
<template>
<div id="signin">
<div class="signin-form">
<form @submit.prevent="onSubmit">
<div class="input">
<label for="email">Mail</label>
<input
type="email"
id="email"
v-model="email">
</div>
<div class="input">
<label for="password">Password</label>
<input
type="password"
id="password"
v-model="password">
</div>
<div class="submit">
<button type="submit">Submit</button>
</div>
</form>
</div>
</div>
</template>
<script>
export default {
data () {
return {
email: '',
password: ''
}
},
methods: {
onSubmit () {
const formData = {
email: this.email,
password: this.password,
}
console.log(formData)
}
}
}
</script>
<style scoped>
.signin-form {
width: 400px;
margin: 30px auto;
border: 1px solid #eee;
padding: 20px;
box-shadow: 0 2px 3px #ccc;
}
.input {
margin: 10px auto;
}
.input label {
display: block;
color: #4e4e4e;
margin-bottom: 6px;
}
.input input {
font: inherit;
width: 100%;
padding: 6px 12px;
box-sizing: border-box;
border: 1px solid #ccc;
}
.input input:focus {
outline: none;
border: 1px solid #521751;
background-color: #eee;
}
.submit button {
border: 1px solid #521751;
color: #521751;
padding: 10px 20px;
font: inherit;
cursor: pointer;
}
.submit button:hover,
.submit button:active {
background-color: #521751;
color: white;
}
.submit button[disabled],
.submit button[disabled]:hover,
.submit button[disabled]:active {
border: 1px solid #ccc;
background-color: transparent;
color: #ccc;
cursor: not-allowed;
}
</style>

View File

@ -0,0 +1,197 @@
<template>
<div id="signup">
<div class="signup-form">
<form @submit.prevent="onSubmit">
<div class="input">
<label for="email">Mail</label>
<input
type="email"
id="email"
v-model="email">
</div>
<div class="input">
<label for="age">Your Age</label>
<input
type="number"
id="age"
v-model.number="age">
</div>
<div class="input">
<label for="password">Password</label>
<input
type="password"
id="password"
v-model="password">
</div>
<div class="input">
<label for="confirm-password">Confirm Password</label>
<input
type="password"
id="confirm-password"
v-model="confirmPassword">
</div>
<div class="input">
<label for="country">Country</label>
<select id="country" v-model="country">
<option value="usa">USA</option>
<option value="india">India</option>
<option value="uk">UK</option>
<option value="germany">Germany</option>
</select>
</div>
<div class="hobbies">
<h3>Add some Hobbies</h3>
<button @click="onAddHobby" type="button">Add Hobby</button>
<div class="hobby-list">
<div
class="input"
v-for="(hobbyInput, index) in hobbyInputs"
:key="hobbyInput.id">
<label :for="hobbyInput.id">Hobby #{{ index }}</label>
<input
type="text"
:id="hobbyInput.id"
v-model="hobbyInput.value">
<button @click="onDeleteHobby(hobbyInput.id)" type="button">X</button>
</div>
</div>
</div>
<div class="input inline">
<input type="checkbox" id="terms" v-model="terms">
<label for="terms">Accept Terms of Use</label>
</div>
<div class="submit">
<button type="submit">Submit</button>
</div>
</form>
</div>
</div>
</template>
<script>
export default {
data () {
return {
email: '',
age: null,
password: '',
confirmPassword: '',
country: 'usa',
hobbyInputs: [],
terms: false
}
},
methods: {
onAddHobby () {
const newHobby = {
id: Math.random() * Math.random() * 1000,
value: ''
}
this.hobbyInputs.push(newHobby)
},
onDeleteHobby (id) {
this.hobbyInputs = this.hobbyInputs.filter(hobby => hobby.id !== id)
},
onSubmit () {
const formData = {
email: this.email,
age: this.age,
password: this.password,
confirmPassword: this.confirmPassword,
country: this.country,
hobbies: this.hobbyInputs.map(hobby => hobby.value),
terms: this.terms
}
console.log(formData)
}
}
}
</script>
<style scoped>
.signup-form {
width: 400px;
margin: 30px auto;
border: 1px solid #eee;
padding: 20px;
box-shadow: 0 2px 3px #ccc;
}
.input {
margin: 10px auto;
}
.input label {
display: block;
color: #4e4e4e;
margin-bottom: 6px;
}
.input.inline label {
display: inline;
}
.input input {
font: inherit;
width: 100%;
padding: 6px 12px;
box-sizing: border-box;
border: 1px solid #ccc;
}
.input.inline input {
width: auto;
}
.input input:focus {
outline: none;
border: 1px solid #521751;
background-color: #eee;
}
.input select {
border: 1px solid #ccc;
font: inherit;
}
.hobbies button {
border: 1px solid #521751;
background: #521751;
color: white;
padding: 6px;
font: inherit;
cursor: pointer;
}
.hobbies button:hover,
.hobbies button:active {
background-color: #8d4288;
}
.hobbies input {
width: 90%;
}
.submit button {
border: 1px solid #521751;
color: #521751;
padding: 10px 20px;
font: inherit;
cursor: pointer;
}
.submit button:hover,
.submit button:active {
background-color: #521751;
color: white;
}
.submit button[disabled],
.submit button[disabled]:hover,
.submit button[disabled]:active {
border: 1px solid #ccc;
background-color: transparent;
color: #ccc;
cursor: not-allowed;
}
</style>

View File

@ -0,0 +1,16 @@
<template>
<div id="dashboard">
<h1>That's the dashboard!</h1>
<p>You should only get here if you're authenticated!</p>
</div>
</template>
<style scoped>
h1, p {
text-align: center;
}
p {
color: red;
}
</style>

View File

@ -0,0 +1,71 @@
<template>
<header id="header">
<div class="logo">
<router-link to="/">Vue - Complete Guide</router-link>
</div>
<nav>
<ul>
<li>
<router-link to="/signup">Sign Up</router-link>
</li>
<li>
<router-link to="/signin">Sign In</router-link>
</li>
<li>
<router-link to="/dashboard">Dashboard</router-link>
</li>
</ul>
</nav>
</header>
</template>
<style scoped>
#header {
height: 56px;
display: flex;
flex-flow: row;
justify-content: space-between;
align-items: center;
background-color: #521751;
padding: 0 20px;
}
.logo {
font-weight: bold;
color: white;
}
.logo a {
text-decoration: none;
color: white;
}
nav {
height: 100%;
}
ul {
list-style: none;
margin: 0;
padding: 0;
height: 100%;
display: flex;
flex-flow: row;
align-items: center;
}
li {
margin: 0 16px;
}
li a {
text-decoration: none;
color: white;
}
li a:hover,
li a:active,
li a.router-link-active {
color: #fa923f;
}
</style>

View File

@ -0,0 +1,49 @@
<template>
<div id="welcome">
<h1>Time to learn something new!</h1>
<p>You found the best place to learn - and now you're just one sign in (or sign up) away from it!</p>
<div class="cta">
<router-link to="/signup">Sign Up</router-link>
<router-link to="/signin">Sign In</router-link>
</div>
</div>
</template>
<style scoped>
#welcome {
width: 80%;
margin: auto;
}
h1 {
text-align: center;
}
p {
text-align: center;
}
.cta {
width: 300px;
margin: auto;
text-align: center;
}
.cta a {
margin: 10px;
text-decoration: none;
display: inline-block;
border: 1px solid #521751;
border-radius: 3px;
width: 100px;
padding: 10px;
box-sizing: border-box;
color: #521751;
}
.cta a:hover,
.cta a:active {
background-color: #521751;
color: white;
}
</style>

View File

@ -0,0 +1,12 @@
import Vue from 'vue'
import App from './App.vue'
import router from './router'
import store from './store'
new Vue({
el: '#app',
router,
store,
render: h => h(App)
})

View File

@ -0,0 +1,18 @@
import Vue from 'vue'
import VueRouter from 'vue-router'
import WelcomePage from './components/welcome/welcome.vue'
import DashboardPage from './components/dashboard/dashboard.vue'
import SignupPage from './components/auth/signup.vue'
import SigninPage from './components/auth/signin.vue'
Vue.use(VueRouter)
const routes = [
{ path: '/', component: WelcomePage },
{ path: '/signup', component: SignupPage },
{ path: '/signin', component: SigninPage },
{ path: '/dashboard', component: DashboardPage }
]
export default new VueRouter({mode: 'history', routes})

View File

@ -0,0 +1,19 @@
import Vue from 'vue'
import Vuex from 'vuex'
Vue.use(Vuex)
export default new Vuex.Store({
state: {
},
mutations: {
},
actions: {
},
getters: {
}
})

View File

@ -0,0 +1,71 @@
var path = require('path')
var webpack = require('webpack')
module.exports = {
entry: './src/main.js',
output: {
path: path.resolve(__dirname, './dist'),
publicPath: '/dist/',
filename: 'build.js'
},
module: {
rules: [
{
test: /\.vue$/,
loader: 'vue-loader',
options: {
loaders: {
}
// other vue-loader options go here
}
},
{
test: /\.js$/,
loader: 'babel-loader',
exclude: /node_modules/
},
{
test: /\.(png|jpg|gif|svg)$/,
loader: 'file-loader',
options: {
name: '[name].[ext]?[hash]'
}
}
]
},
resolve: {
alias: {
'vue$': 'vue/dist/vue.esm.js'
}
},
devServer: {
historyApiFallback: true,
noInfo: true,
overlay: true
},
performance: {
hints: false
},
devtool: '#eval-source-map'
}
if (process.env.NODE_ENV === 'production') {
module.exports.devtool = '#source-map'
// http://vue-loader.vuejs.org/en/workflow/production.html
module.exports.plugins = (module.exports.plugins || []).concat([
new webpack.DefinePlugin({
'process.env': {
NODE_ENV: '"production"'
}
}),
new webpack.optimize.UglifyJsPlugin({
sourceMap: true,
compress: {
warnings: false
}
}),
new webpack.LoaderOptionsPlugin({
minimize: true
})
])
}