Pārlūkot izejas kodu

新添加了用户删除等功能,接下来引用django的重置密码库

Shellmiao 4 gadi atpakaļ
vecāks
revīzija
105571c02d

+ 1 - 0
MyBlog/MyBlog/settings.py

@@ -36,6 +36,7 @@ INSTALLED_APPS = [
     'django.contrib.messages',
     'django.contrib.staticfiles',
     'article',
+    'userprofile',
 ]
 
 MIDDLEWARE = [

+ 2 - 0
MyBlog/MyBlog/urls.py

@@ -17,6 +17,8 @@ from django.contrib import admin
 from django.urls import path, include
 
 urlpatterns = [
+    path('', include('article.urls', namespace='article')),
     path('admin/', admin.site.urls),
     path('article/', include('article.urls', namespace='article')),
+    path('user/', include('userprofile.urls', namespace='userprofile')),
 ]

BIN
MyBlog/db.sqlite3


+ 1 - 1
MyBlog/templates/footer.html

@@ -5,6 +5,6 @@
 </div>
 <footer class="py-3 bg-dark fixed-bottom">
     <div class="container">
-        <p class="m-0 text-center text-white">Copyright &copy; www.shellmiao.com 2021</p>
+        <p class="m-0 text-center text-white">Copyright &copy; blog.shellmiao.com 2021</p>
     </div>
 </footer>

+ 44 - 0
MyBlog/templates/header.html

@@ -15,6 +15,50 @@
                 <li class="nav-item">
                     <a class="nav-link" href="{% url 'article:article_list' %}">文章</a>
                 </li>
+                <!-- Django的 if 模板语句 -->
+                {% if user.is_authenticated %}
+                    <!-- 如果用户已经登录,则显示用户名下拉框 -->
+                    <li class="nav-item dropdown">
+                        <a class="nav-link dropdown-toggle" href="#" id="navbarDropdown" role="button"
+                           data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
+                            {{ user.username }}
+                        </a>
+                        <div class="dropdown-menu" aria-labelledby="navbarDropdown">
+                            <a class="dropdown-item" href="{% url 'userprofile:logout' %}">退出登录</a>
+                            <a class="dropdown-item" href="#" onclick="user_delete()">删除用户</a>
+                        </div>
+                        {% if user.is_authenticated %}
+                            <form
+                                    style="display:none;"
+                                    id="user_delete"
+                                    action="{% url 'userprofile:delete' user.id %}"
+                                    method="POST"
+                            >
+                                {% csrf_token %}
+                                <button type="submit">发送</button>
+                            </form>
+                            <script>
+                                function user_delete() {
+                                    // 调用layer弹窗组件
+                                    layer.open({
+                                        title: "删除用户",
+                                        content: "确认删除用户资料吗?",
+                                        yes: function (index, layero) {
+                                            $('form#user_delete button').click();
+                                            layer.close(index);
+                                        },
+                                    })
+                                }
+                            </script>
+                        {% endif %}
+                    </li>
+                    <!-- 如果用户未登录,则显示 “登录” -->
+                {% else %}
+                    <li class="nav-item">
+                        <a class="nav-link" href="{% url 'userprofile:login' %}">登录</a>
+                    </li>
+                    <!-- if 语句在这里结束 -->
+                {% endif %}
             </ul>
         </div>
 

+ 38 - 0
MyBlog/templates/userprofile/login.html

@@ -0,0 +1,38 @@
+{% extends "base.html" %}
+{% load static %}
+{% block title %}
+    登录
+{% endblock title %}
+{% block content %}
+    <div class="container">
+        <div class="row">
+            <div class="col-12">
+                <br>
+                <h5>还没有账号?</h5>
+                <h5>
+                    点击
+                    <a href='{% url "userprofile:register" %}'>
+                        注册账号
+                    </a>
+                    加入我们吧!
+                </h5>
+                <br>
+                <form method="post" action=".">
+                    {% csrf_token %}
+                    <!-- 账号 -->
+                    <div class="form-group">
+                        <label for="username">账号</label>
+                        <input type="text" class="form-control" id="username" name="username">
+                    </div>
+                    <!-- 密码 -->
+                    <div class="form-group">
+                        <label for="password">密码</label>
+                        <input type="password" class="form-control" id="password" name="password">
+                    </div>
+                    <!-- 提交按钮 -->
+                    <button type="submit" class="btn btn-primary">提交</button>
+                </form>
+            </div>
+        </div>
+    </div>
+{% endblock content %}

+ 39 - 0
MyBlog/templates/userprofile/register.html

@@ -0,0 +1,39 @@
+{% extends "base.html" %}
+{% load static %}
+{% block title %}
+    登录
+{% endblock title %}
+{% block content %}
+    <div class="container">
+        <div class="row">
+            <div class="col-12">
+                <br>
+                <form method="post" action=".">
+                    {% csrf_token %}
+                    <!-- 账号 -->
+                    <div class="form-group col-md-4">
+                        <label for="username">昵称</label>
+                        <input type="text" class="form-control" id="username" name="username" required>
+                    </div>
+                    <!-- 邮箱 -->
+                    <div class="form-group col-md-4">
+                        <label for="email">Email</label>
+                        <input type="text" class="form-control" id="email" name="email">
+                    </div>
+                    <!-- 密码 -->
+                    <div class="form-group col-md-4">
+                        <label for="password">设置密码</label>
+                        <input type="password" class="form-control" id="password" name="password" required>
+                    </div>
+                    <!-- 确认密码 -->
+                    <div class="form-group col-md-4">
+                        <label for="password2">确认密码</label>
+                        <input type="password" class="form-control" id="password2" name="password2" required>
+                    </div>
+                    <!-- 提交按钮 -->
+                    <button type="submit" class="btn btn-primary">提交</button>
+                </form>
+            </div>
+        </div>
+    </div>
+{% endblock content %}

+ 23 - 0
MyBlog/userprofile/form.py

@@ -0,0 +1,23 @@
+from django import forms
+from django.contrib.auth.models import User
+
+
+class UserLoginForm(forms.Form):
+    username = forms.CharField()
+    password = forms.CharField()
+
+
+class UserRegisterForm(forms.ModelForm):
+    password = forms.CharField()
+    password2 = forms.CharField()
+
+    class Meta:
+        model = User
+        fields = ('username', 'email')
+
+    def clean_password2(self):
+        data = self.cleaned_data
+        if data.get('password') == data.get('password2'):
+            return data.get('password')
+        else:
+            raise forms.ValidationError('密码输入不一致,请重试')

+ 11 - 0
MyBlog/userprofile/urls.py

@@ -0,0 +1,11 @@
+from django.urls import path
+from . import views
+
+app_name = 'userprofile'
+
+urlpatterns = [
+    path('login/', views.user_login, name='login'),
+    path('logout/', views.user_logout, name='logout'),
+    path('register/', views.user_register, name='register'),
+    path('delete/<int:id>', views.user_delete, name='delete'),
+]

+ 67 - 2
MyBlog/userprofile/views.py

@@ -1,3 +1,68 @@
-from django.shortcuts import render
+from django.shortcuts import render, redirect
+from django.contrib.auth import authenticate, login, logout
+from django.http import HttpResponse
+from .form import UserLoginForm, UserRegisterForm
+from django.contrib.auth.models import User
+from django.contrib.auth.decorators import login_required
 
-# Create your views here.
+
+def user_login(request):
+    if request.method == 'POST':
+        user_login_form = UserLoginForm(request.POST)
+        if user_login_form.is_valid():
+            # 清洗出合法的数据
+            data = user_login_form.cleaned_data
+            # 检验账号、密码是否正确匹配数据库中的某个用户
+            # 如果均匹配,则返回这个user对象
+            user = authenticate(username=data['username'], password=data['password'])
+            if user:
+                login(request, user)
+                return redirect("article:article_list")
+            else:
+                return HttpResponse("账号或密码输入不正确,请重新输入")
+        else:
+            return HttpResponse("账号或密码输入不合法")
+    elif request.method == 'GET':
+        user_login_form = UserLoginForm()
+        context = {'form': user_login_form}
+        return render(request, 'userprofile/login.html', context)
+    else:
+        return HttpResponse("请使用GET或POST请求数据")
+
+
+def user_logout(request):
+    logout(request)
+    return redirect("article:article_list")
+
+
+def user_register(request):
+    if request.method == 'POST':
+        user_register_form = UserRegisterForm(data=request.POST)
+        if user_register_form.is_valid():
+            new_user = user_register_form.save(commit=False)
+            new_user.set_password(user_register_form.cleaned_data['password'])
+            new_user.save()
+            login(request, new_user)
+            return redirect("article:article_list")
+        else:
+            return HttpResponse('注册表单输入有误,请重新输入')
+    elif request.method == 'GET':
+        user_register_form = UserRegisterForm()
+        context = {'form': user_register_form}
+        return render(request, 'userprofile/register.html', context)
+    else:
+        return HttpResponse('请使用GET或POST请求数据')
+
+
+@login_required(login_url='/user/login/')
+def user_delete(request, id):
+    if request.method == 'POST':
+        user = User.objects.get(id=id)
+        if request.user==user:
+            logout(request)
+            user.delete()
+            return redirect('article:article_list')
+        else:
+            return HttpResponse('你没有删除该用户的权限')
+    else:
+        return HttpResponse('仅接受POST请求')