Skip to content

Commit 74d77eb

Browse files
author
Andres Vargas
committed
Login and logout
1 parent b8ce494 commit 74d77eb

File tree

4 files changed

+95
-1
lines changed

4 files changed

+95
-1
lines changed

demo/static/src/Pages/Login.vue

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
<template>
2+
<div class="p-6 bg-indigo-800 min-h-screen flex justify-center items-center">
3+
<div class="w-full max-w-md">
4+
<logo class="block mx-auto w-full max-w-xs fill-white" height="50" />
5+
<form class="mt-8 bg-white rounded-lg shadow-xl overflow-hidden" @submit.prevent="submit">
6+
<div class="px-10 py-12">
7+
<h1 class="text-center font-bold text-3xl">Welcome Back!</h1>
8+
<div class="mx-auto mt-6 w-24 border-b-2" />
9+
<text-input v-model="form.email" :errors="$page.errors.email" class="mt-10" label="Email" type="text" autofocus autocapitalize="off" />
10+
<text-input v-model="form.password" class="mt-6" label="Password" type="password" />
11+
<label class="mt-6 select-none flex items-center" for="remember">
12+
<input id="remember" v-model="form.remember" class="mr-1" type="checkbox">
13+
<span class="text-sm">Remember Me</span>
14+
</label>
15+
</div>
16+
<div class="px-10 py-4 bg-gray-100 border-t border-gray-200 flex justify-between items-center">
17+
<a class="hover:underline" tabindex="-1" href="#reset-password">Forget password?</a>
18+
<loading-button :loading="sending" class="btn-indigo" type="submit">Login</loading-button>
19+
</div>
20+
</form>
21+
</div>
22+
</div>
23+
</template>
24+
25+
<script>
26+
import LoadingButton from '../Shared/LoadingButton'
27+
import Logo from '../Shared/Logo'
28+
import TextInput from '../Shared/TextInput'
29+
30+
export default {
31+
metaInfo: { title: 'Login' },
32+
components: {
33+
LoadingButton,
34+
Logo,
35+
TextInput,
36+
},
37+
props: {
38+
errors: Object,
39+
},
40+
data() {
41+
return {
42+
sending: false,
43+
form: {
44+
45+
password: 'secret',
46+
remember: null,
47+
},
48+
}
49+
},
50+
methods: {
51+
submit() {
52+
this.sending = true
53+
this.$inertia.post(this.route('demo:login'), {
54+
email: this.form.email,
55+
password: this.form.password,
56+
remember: this.form.remember,
57+
}).then(() => this.sending = false)
58+
},
59+
},
60+
}
61+
</script>

demo/static/src/app.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,10 @@ import OrganizationEdit from "./Pages/Organizations.Edit";
2626
import ContactCreate from "./Pages/Contacts.Create";
2727
import OrganizationCreate from "./Pages/Organizations.Create";
2828

29+
import Login from "./Pages/Login";
2930

3031
const pages = {
32+
'Login': Login,
3133
'Index': Index,
3234
'Contacts': Contacts,
3335
'Contacts.Edit': ContactEdit,

demo/urls.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,20 @@
33
from demo.views import index , contacts,organizations
44
from demo.views import contact_edit, organization_edit
55
from demo.views import contact_create, organization_create
6+
from demo.views import login_view as login
7+
from demo.views import logout_view as logout
68

79
app_name="demo"
810

911
urlpatterns = [
1012

13+
path('login', login, name='login'),
14+
path('users/logout', logout, name='logout'),
15+
1116
path('reports', index, name='reports'),
1217
path('users/', index, name='users'),
13-
path('users/logout', index, name='logout'),
18+
19+
1420
path('users/edit/<int:id>', index, name='users.edit'),
1521
path('contacts/edit/<int:id>', contact_edit, name='contacts.edit'),
1622
path('contacts/create/', contact_create, name='contacts.create'),

demo/views.py

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@
1010
from .serializers import ContactSchema, OrganizationSchema
1111
import json
1212
from marshmallow import INCLUDE, ValidationError
13+
from django.contrib.auth import authenticate, login, logout
14+
1315

1416

1517
def organization_create(request):
@@ -155,3 +157,26 @@ def contact_create(request):
155157
def index(request):
156158
# share_flash(request, errors=["yeah",])
157159
return render_inertia(request, "Index")
160+
161+
def logout_view(request):
162+
logout(request)
163+
return redirect(reverse("demo:login"))
164+
165+
def login_view(request):
166+
errors = {}
167+
if request.user.is_authenticated:
168+
return redirect(reverse("demo:dashboard"))
169+
170+
if request.method == "POST":
171+
data = json.loads(request.body)
172+
username = data.get("email")
173+
password = data.get("password")
174+
user = authenticate(request, username=username, password=password)
175+
if user is not None:
176+
login(request, user)
177+
return redirect(reverse("demo:dashboard"))
178+
else:
179+
errors = {'email':["Wrong login",]}
180+
share_flash(request, errors=errors)
181+
props = {'errors':errors}
182+
return render_inertia(request, "Login",props)

0 commit comments

Comments
 (0)