第六章学习完成

master
RogerWork 1 year ago
parent d9f1e705ac
commit 23f9d1fbbb
  1. 14
      django_demo/settings.py
  2. 3
      django_demo/urls.py
  3. 12
      static/dist/css/adminlte.min.css
  4. 10
      templates/user_manager/edit.html
  5. 49
      templates/user_manager/login.html
  6. 10
      templates/user_manager/test.html
  7. 33
      templates/user_manager/user_index.html
  8. 35
      templates/user_manager/user_reg.html
  9. 0
      user_manager/__init__.py
  10. 11
      user_manager/admin.py
  11. 6
      user_manager/apps.py
  12. 40
      user_manager/middle/mymiddle.py
  13. 19
      user_manager/middle/permmiddleware.py
  14. 47
      user_manager/migrations/0001_initial.py
  15. 17
      user_manager/migrations/0002_alter_myuser_options.py
  16. 0
      user_manager/migrations/__init__.py
  17. 17
      user_manager/models.py
  18. 3
      user_manager/tests.py
  19. 15
      user_manager/urls.py
  20. 106
      user_manager/views.py

@ -31,6 +31,7 @@ ALLOWED_HOSTS = []
INSTALLED_APPS = [
'orm_demo.apps.OrmDemoConfig',
'form_demo.apps.FormDemoConfig',
'user_manager.apps.UserManagerConfig',
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
@ -47,6 +48,9 @@ MIDDLEWARE = [
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
'user_manager.middle.mymiddle.AuthMiddleWare1',
'user_manager.middle.mymiddle.AuthMiddleWare2',
'user_manager.middle.permmiddleware.PermissionMiddleware',
]
ROOT_URLCONF = 'django_demo.urls'
@ -107,9 +111,11 @@ AUTH_PASSWORD_VALIDATORS = [
# Internationalization
# https://docs.djangoproject.com/en/4.1/topics/i18n/
LANGUAGE_CODE = 'en-us'
# LANGUAGE_CODE = 'en-us'
LANGUAGE_CODE = 'zh-hans'
TIME_ZONE = 'UTC'
# TIME_ZONE = 'UTC'
TIME_ZONE = 'Asia/Shanghai'
USE_I18N = True
@ -130,3 +136,7 @@ STATIC_ROOT = os.path.join(BASE_DIR, '/static')
# Media
MEDIA_URL = "/media/"
MEDIA_ROOT = os.path.join(BASE_DIR, "media")
AUTH_USER_MODEL = 'user_manager.MyUser'
LOGIN_URL = 'user_manager_login'

@ -21,5 +21,6 @@ from . import settings
urlpatterns = [
path('admin/', admin.site.urls),
path('', include('form_demo.urls'))
path('', include('form_demo.urls')),
path('', include('user_manager.urls')),
]

File diff suppressed because one or more lines are too long

@ -0,0 +1,10 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>edit</title>
</head>
<body>
<h1>用户修改页面</h1>
</body>
</html>

@ -0,0 +1,49 @@
{% load static %}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>用户登录</title>
<link rel="stylesheet" href="{% static 'dist/css/adminlte.min.css' %}">
</head>
<body class="hold-transition register-page">
<div class="register-box">
<div class="register-logo"><b>用户登录</b></div>
<div class="card">
<div class="card-body register-card-body">
<form action="" method="post">
{% csrf_token %}
<div class="input-group mb-3">
<input type="text" class="form-control" name="username" placeholder="用户名">
<div class="input-group-append">
<div class="input-group-text">
<span class="fas fa-user"></span>
</div>
</div>
</div>
<div class="input-group mb-3">
<input type="password" class="form-control" name="password" placeholder="密码">
<div class="input-group-append">
<div class="input-group-text">
<span class="fas fa-user"></span>
</div>
</div>
</div>
<div class="row">
<div class="col-8">
<label for="agreement">
{{ info }}
</label>
</div>
<div class="col-4">
<button type="submit" class="btn btn-primary btn-block">登录</button>
</div>
</div>
</form>
</div>
</div>
</div>
<form></form>
</body>
</html>

@ -0,0 +1,10 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Test</title>
</head>
<body>
<h1>Test Page</h1>
</body>
</html>

@ -0,0 +1,33 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>UserIndex</title>
</head>
<body>
欢迎{{ request.user }}来到商场系统!
<a href="{% url 'user_manager_logout' %}">退出登录</a>
<br>
用户信息列表
<table border="1px">
<tr>
<td>账号</td>
<td>用户名</td>
<td>email</td>
<td>操作</td>
</tr>
{% for user in users %}
<tr>
<td>{{ user.username }}</td>
<td>{{ user.first_name }} {{ user.last_name }}</td>
<td>{{ user.email }}</td>
<td><a href="{% url 'user_manager_edit' %}">修改</a></td>
{% if perms.myuser.delete_myuser %}
<td>删除</td>
{% endif %}
</tr>
{% endfor %}
</table>
</body>
</html>

@ -0,0 +1,35 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>用户注册</title>
</head>
<body>
{% load static %}
<link rel="stylesheet" href="{% static 'dist/css/adminlte.min.css' %}">
<form action="" method="POST">
{% csrf_token %}
<div class="input-group mb3">
<input type="text" class="form-control" name="username" placeholder="用户名">
</div>
<div class="input-group mb3">
<input type="email" class="form-control" name="email" placeholder="邮箱">
</div>
<div class="input-group mb3">
<input type="password" class="form-control" name="password" placeholder="密码">
</div>
<div class="input-group mb3">
<input type="password" class="form-control" name="re-password" placeholder="重复密码">
</div>
<div class="row">
<div class="col-8">
<label for="agreeTerms">{{ info }}</label>
</div>
<div class="col-4">
<button type="submit" class="btn-primary btn-block">注册</button>
</div>
</div>
</form>
</body>
</html>

@ -0,0 +1,11 @@
from django.contrib import admin
from user_manager.models import MyUser
# Register your models here.
class MyUserAdmin(admin.ModelAdmin):
list_display = ['username', 'email']
admin.site.register(MyUser, MyUserAdmin)

@ -0,0 +1,6 @@
from django.apps import AppConfig
class UserManagerConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
name = 'user_manager'

@ -0,0 +1,40 @@
from django.utils.deprecation import MiddlewareMixin
from django.http import HttpResponse
class AuthMiddleWare1(MiddlewareMixin):
def process_request(self, request):
print('process_request-1')
def process_view(self, request, callback, callback_args, callback_kwargs):
print('process_view-1')
def process_template_response(self, request, response):
print('process_template_response -1')
return response
def process_exception(self, request, exception):
print('process_exception-1')
def process_response(self, request, response):
print('prcoess_response-1')
return response
class AuthMiddleWare2(MiddlewareMixin):
def process_request(self, request):
print('process_request-2')
def process_view(self, request, callback, callback_args, callback_kwargs):
print('process_view-2')
def process_template_response(self, request, response):
print('process_template_response -2')
return response
def process_exception(self, request, exception):
print('process_exception-2')
def process_response(self, request, response):
print('prcoess_response-2')
return response

@ -0,0 +1,19 @@
from django.utils.deprecation import MiddlewareMixin
from django.shortcuts import redirect
import re
class PermissionMiddleware(MiddlewareMixin):
def process_request(self, request):
curr_path = request.path
print(curr_path)
# 白名单
white_list = ['/myuser_login/', '/myuser_reg']
for w in white_list:
if re.search(w, curr_path):
return None
# 验证登录
print(request.user.is_authenticated)
if not request.user.is_authenticated:
return redirect('/myuser_login/')

@ -0,0 +1,47 @@
# Generated by Django 4.2.3 on 2023-08-06 23:55
import django.contrib.auth.models
import django.contrib.auth.validators
from django.db import migrations, models
import django.utils.timezone
class Migration(migrations.Migration):
initial = True
dependencies = [
('auth', '0012_alter_user_first_name_max_length'),
]
operations = [
migrations.CreateModel(
name='MyUser',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('password', models.CharField(max_length=128, verbose_name='password')),
('last_login', models.DateTimeField(blank=True, null=True, verbose_name='last login')),
('is_superuser', models.BooleanField(default=False, help_text='Designates that this user has all permissions without explicitly assigning them.', verbose_name='superuser status')),
('username', models.CharField(error_messages={'unique': 'A user with that username already exists.'}, help_text='Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only.', max_length=150, unique=True, validators=[django.contrib.auth.validators.UnicodeUsernameValidator()], verbose_name='username')),
('first_name', models.CharField(blank=True, max_length=150, verbose_name='first name')),
('last_name', models.CharField(blank=True, max_length=150, verbose_name='last name')),
('email', models.EmailField(blank=True, max_length=254, verbose_name='email address')),
('is_staff', models.BooleanField(default=False, help_text='Designates whether the user can log into this admin site.', verbose_name='staff status')),
('is_active', models.BooleanField(default=True, help_text='Designates whether this user should be treated as active. Unselect this instead of deleting accounts.', verbose_name='active')),
('date_joined', models.DateTimeField(default=django.utils.timezone.now, verbose_name='date joined')),
('photo', models.CharField(max_length=50, verbose_name='用户头像')),
('weChat', models.CharField(max_length=30, verbose_name='微信')),
('level', models.CharField(max_length=1, verbose_name='用户等级')),
('groups', models.ManyToManyField(blank=True, help_text='The groups this user belongs to. A user will get all permissions granted to each of their groups.', related_name='user_set', related_query_name='user', to='auth.group', verbose_name='groups')),
('user_permissions', models.ManyToManyField(blank=True, help_text='Specific permissions for this user.', related_name='user_set', related_query_name='user', to='auth.permission', verbose_name='user permissions')),
],
options={
'verbose_name': 'user',
'verbose_name_plural': 'users',
'abstract': False,
},
managers=[
('objects', django.contrib.auth.models.UserManager()),
],
),
]

@ -0,0 +1,17 @@
# Generated by Django 4.2.3 on 2023-08-08 00:14
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('user_manager', '0001_initial'),
]
operations = [
migrations.AlterModelOptions(
name='myuser',
options={'permissions': (['check_myuser', '审核用户信息'],), 'verbose_name': 'user', 'verbose_name_plural': 'users'},
),
]

@ -0,0 +1,17 @@
from django.db import models
from django.contrib.auth.models import AbstractUser
# Create your models here.
class MyUser(AbstractUser):
photo = models.CharField('用户头像', max_length=50)
weChat = models.CharField('微信', max_length=30)
level = models.CharField('用户等级', max_length=1)
def __str__(self):
return self.username
class Meta(AbstractUser.Meta):
permissions = (
['check_myuser', '审核用户信息'],
)

@ -0,0 +1,3 @@
from django.test import TestCase
# Create your tests here.

@ -0,0 +1,15 @@
from django.contrib import admin
from django.urls import path, re_path, include
from user_manager import views
urlpatterns = [
path('user_reg/', views.user_reg),
path('user_login/', views.user_login),
path('myuser_reg/', views.myuser_reg),
path('myuser_login/', views.myuser_login, name='user_manager_login'),
path('myuser_index/', views.user_index),
path('myuser_logout/', views.myuser_logout, name='user_manager_logout'),
path('myuser_edit/', views.myuser_edit, name='user_manager_edit'),
path('test/', views.test_middle, name='test'),
]

@ -0,0 +1,106 @@
from django.shortcuts import render, redirect
from django.http.response import HttpResponse
from django.urls import reverse
from django.contrib.auth import authenticate, login, logout
from django.contrib.auth.models import User
from django.contrib.auth.decorators import login_required, permission_required
from user_manager.models import MyUser
# Create your views here.
def user_reg(request):
if request.method == 'GET':
return render(request, 'user_manager/user_reg.html')
if request.method == 'POST':
user_name = request.POST.get('username')
user_pw = request.POST.get('password')
if User.objects.filter(username=user_name):
info_msg = '用户已经存在'
else:
user_data = {'username': user_name, 'password': user_pw, 'email': request.POST.get('email'), 'is_staff': 1,
'is_active': 1, 'is_superuser': 1}
User.objects.create_user(**user_data)
info_msg = '添加用户成功'
return render(request, 'user_manager/user_reg.html', {'info': info_msg})
def user_login(request):
if request.method == 'GET':
return render(request, 'user_manager/login.html')
if request.method == 'POST':
user_name = request.POST.get('username')
user_pw = request.POST.get('password')
if User.objects.filter(username=user_name):
user = authenticate(username=user_name, password=user_pw)
print(user)
if user:
print(user.is_active)
if user.is_active:
login(request, user)
info = '登录成功'
else:
info = '用户未激活'
else:
info = '账号密码错误'
else:
info = '账号不存在'
return render(request, 'user_manager/login.html', {'info': info})
def myuser_reg(request):
if request.method == 'GET':
return render(request, 'user_manager/user_reg.html')
if request.method == 'POST':
uname = request.POST.get('username')
pwd = request.POST.get('password')
if MyUser.objects.filter(username=uname):
info = '用户已存在'
else:
d = dict(username=uname, password=pwd, email=request.POST.get('email'), is_staff=1, is_active=1,
is_superuser=1, photo='', weChat='coder', level='1')
user = MyUser.objects.create_user(**d)
info = '注册成功'
return render(request, 'user_manager/user_reg.html', {'info': info})
def myuser_login(request):
if request.method == 'GET':
return render(request, 'user_manager/login.html')
if request.method == 'POST':
uname = request.POST.get('username')
pwd = request.POST.get('password')
if MyUser.objects.filter(username=uname):
user = authenticate(username=uname, password=pwd)
if user:
if user.is_active:
login(request, user)
info = '登录成功'
else:
info = '用户未激活'
else:
info = '账号密码错误'
else:
info = '用户不存在'
return render(request, 'user_manager/login.html', {'info': info})
@permission_required('user_manager.change_myuser')
@login_required
def myuser_edit(request):
return render(request, 'user_manager/edit.html')
def myuser_logout(request):
logout(request)
return redirect(reverse('user_manager_login'))
@permission_required('user_manager.view_myuser')
@login_required
def user_index(request):
users = MyUser.objects.all()
return render(request, 'user_manager/user_index.html', {'users': users})
def test_middle(request):
return HttpResponse('执行了')
Loading…
Cancel
Save