From d8271747feece3835a2301ffa9c9b3f4717717e8 Mon Sep 17 00:00:00 2001 From: FrodoQian <1296541164@qq.com> Date: Sun, 28 Apr 2019 16:27:08 +0800 Subject: [PATCH 1/7] add 1.txt --- 1.txt | 1 + 1 file changed, 1 insertion(+) create mode 100644 1.txt diff --git a/1.txt b/1.txt new file mode 100644 index 0000000..190a180 --- /dev/null +++ b/1.txt @@ -0,0 +1 @@ +123 -- Gitee From ab58285f750cb447064e2f70b5c842c6e550f547 Mon Sep 17 00:00:00 2001 From: FrodoQian <1296541164@qq.com> Date: Sun, 28 Apr 2019 16:33:59 +0800 Subject: [PATCH 2/7] =?UTF-8?q?=E5=88=A0=E9=99=A41.txt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 1.txt | 1 - 1 file changed, 1 deletion(-) delete mode 100644 1.txt diff --git a/1.txt b/1.txt deleted file mode 100644 index 190a180..0000000 --- a/1.txt +++ /dev/null @@ -1 +0,0 @@ -123 -- Gitee From ba3b1207d8fed9699165455377fcaa3ae3fa1288 Mon Sep 17 00:00:00 2001 From: FrodoQian <1296541164@qq.com> Date: Mon, 29 Apr 2019 13:17:04 +0800 Subject: [PATCH 3/7] =?UTF-8?q?=E7=94=A8=E6=88=B7=E6=B3=A8=E5=86=8C?= =?UTF-8?q?=E9=A1=B5=E9=9D=A2=E5=92=8C=E7=94=A8=E6=88=B7=E7=99=BB=E5=BD=95?= =?UTF-8?q?=E9=A1=B5=E9=9D=A2=E5=8F=AF=E4=BB=A5=E6=98=BE=E7=A4=BA=E3=80=82?= =?UTF-8?q?register.html=E5=92=8Clogin.html=E4=B8=AD=E6=9C=89=E9=83=A8?= =?UTF-8?q?=E5=88=86=E5=85=B3=E8=81=94=E9=A6=96=E9=A1=B5index.html?= =?UTF-8?q?=E7=9A=84=E4=BB=A3=E7=A0=81=E8=A2=AB=E6=88=91=E6=B3=A8=E9=87=8A?= =?UTF-8?q?=E6=8E=89=EF=BC=8C=E9=9C=80=E8=A6=81=E9=93=BE=E6=8E=A5=E9=A6=96?= =?UTF-8?q?=E9=A1=B5=E7=9A=84=E6=97=B6=E5=80=99=E9=9C=80=E8=A6=81=E5=86=8D?= =?UTF-8?q?=E6=AC=A1=E6=89=93=E5=BC=80=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/users/forms.py | 6 ++- apps/users/urls.py | 4 ++ apps/users/views.py | 80 +++++++++++++++++++++++++++++++++ {youxue => boxuegu}/__init__.py | 0 {youxue => boxuegu}/settings.py | 0 {youxue => boxuegu}/urls.py | 5 +-- {youxue => boxuegu}/wsgi.py | 0 templates/login.html | 6 +-- templates/register.html | 6 +-- 9 files changed, 96 insertions(+), 11 deletions(-) rename {youxue => boxuegu}/__init__.py (100%) rename {youxue => boxuegu}/settings.py (100%) rename {youxue => boxuegu}/urls.py (91%) rename {youxue => boxuegu}/wsgi.py (100%) diff --git a/apps/users/forms.py b/apps/users/forms.py index 6919b26..42bfc67 100644 --- a/apps/users/forms.py +++ b/apps/users/forms.py @@ -1,9 +1,9 @@ - from django import forms from captcha.fields import CaptchaField from .models import UserProfile + class LoginForm(forms.Form): """ 登录表单 @@ -43,6 +43,7 @@ class UploadImageForm(forms.ModelForm): """ 上传图片验证表单 """ + class Meta: model = UserProfile fields = ['image'] @@ -52,6 +53,7 @@ class UserInfoForm(forms.ModelForm): """ 用户表单 """ + class Meta: model = UserProfile - fields = ['nick_name', 'gender', 'birthday', 'address', 'mobile'] \ No newline at end of file + fields = ['nick_name', 'gender', 'birthday', 'address', 'mobile'] diff --git a/apps/users/urls.py b/apps/users/urls.py index f763ba6..888595b 100644 --- a/apps/users/urls.py +++ b/apps/users/urls.py @@ -1,5 +1,9 @@ from django.conf.urls import url, include +from . import views urlpatterns = [ + # url(r'^register/$',views.UserRegister.as_view()), + url(r'^register/$', views.UserRegister.as_view(), name='register'), + url(r'^login/$', views.LoginView.as_view(), name='login'), ] diff --git a/apps/users/views.py b/apps/users/views.py index e69de29..dca4f8d 100644 --- a/apps/users/views.py +++ b/apps/users/views.py @@ -0,0 +1,80 @@ +from django.shortcuts import render +from django.urls import reverse +from django.views import View + +from .forms import RegisterForm, LoginForm +from django.http import HttpResponse, HttpResponsePermanentRedirect + + +# Create your views here. +class UserRegister(View): + + def get(self, request): + """ + 获取注册页面 + :param request: + :return: + """ + # 生成表单对象 + register_form = RegisterForm() + # 调用模版渲染生成表单 + return render(request, 'register.html', {'register_form': register_form}) + + + def post(self, request): + """ + 验证表单数据 + :param request: + :return: + """ + # 1、获取前端传递的表单数据 + data = request.POST + # 2、验证表单数据 + register_form = RegisterForm(data) + res = register_form.is_valid() # 验证成功返回True,验证失败返回False + + if res: + # # 验证成功,则执行相应业务逻辑操作,这里就直接返回验证成功后的字段数据 + # # 获取验证成功后的字段 + # username = register_form.cleaned_data['username'] + # + # return HttpResponse(username) + return render(request, 'index.html') + + # 验证失败,则在注册模板中通过register_form.errors获取错误 + return render(request, 'register.html', {'register_form': register_form}) + + +class LoginView(View): + def get(self, request): + """ + 获取注册页面 + :param request: + :return: + """ + # 生成表单对象 + login_form = LoginForm() + # 调用模版渲染生成表单 + return render(request, 'login.html', {'login.html': login_form}) + + def post(self, request): + """ + 验证表单数据 + :param request: + :return: + """ + # 1、获取前端传递的表单数据 + data = request.POST + # 2、验证表单数据 + login_form = LoginForm(data) + res = login_form.is_valid() # 验证成功返回True,验证失败返回False + + if res: + # 验证成功,则执行相应业务逻辑操作,这里就直接返回验证成功后的字段数据 + # 获取验证成功后的字段 + username = login_form.cleaned_data['username'] + + return HttpResponsePermanentRedirect(reverse('index')) + + # 验证失败,则在注册模板中通过register_form.errors获取错误 + return render(request, 'login.html', {'form_errors': login_form.errors}) diff --git a/youxue/__init__.py b/boxuegu/__init__.py similarity index 100% rename from youxue/__init__.py rename to boxuegu/__init__.py diff --git a/youxue/settings.py b/boxuegu/settings.py similarity index 100% rename from youxue/settings.py rename to boxuegu/settings.py diff --git a/youxue/urls.py b/boxuegu/urls.py similarity index 91% rename from youxue/urls.py rename to boxuegu/urls.py index 2774096..9f86996 100644 --- a/youxue/urls.py +++ b/boxuegu/urls.py @@ -20,8 +20,7 @@ from django.contrib import admin urlpatterns = [ url(r'^admin/', xadmin.site.urls), url(r'^captcha/', include('captcha.urls')), # 这是生成验证码的图片 - url('^', include('user_test.urls')), - - + # url('^', include('user_test.urls')), + url(r'^',include('users.urls')), ] diff --git a/youxue/wsgi.py b/boxuegu/wsgi.py similarity index 100% rename from youxue/wsgi.py rename to boxuegu/wsgi.py diff --git a/templates/login.html b/templates/login.html index 7acdab9..69d0540 100644 --- a/templates/login.html +++ b/templates/login.html @@ -27,9 +27,9 @@
@@ -58,7 +58,7 @@ {% if not form_errors %} {{ msg }} {% endif %}
{% csrf_token %} diff --git a/templates/register.html b/templates/register.html index 5c746d1..77c5534 100644 --- a/templates/register.html +++ b/templates/register.html @@ -27,9 +27,9 @@
-- Gitee From 9ee7def08b9854d3718f075fe87b63960e968ac2 Mon Sep 17 00:00:00 2001 From: FrodoQian <1296541164@qq.com> Date: Wed, 1 May 2019 11:07:09 +0800 Subject: [PATCH 4/7] =?UTF-8?q?=E5=8F=AF=E4=BB=A5=E5=AE=9E=E7=8E=B0?= =?UTF-8?q?=E6=B3=A8=E5=86=8C=E4=BF=A1=E6=81=AF=E4=BF=9D=E5=AD=98=E5=88=B0?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E5=BA=93=E4=B8=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/courses/urls.py | 3 +++ apps/courses/views.py | 20 ++++++++++++++++++++ apps/users/urls.py | 1 + apps/users/views.py | 21 ++++++++++++++++++--- boxuegu/settings.py | 22 +++++++++++----------- user_test/urls.py | 4 ++++ 6 files changed, 57 insertions(+), 14 deletions(-) diff --git a/apps/courses/urls.py b/apps/courses/urls.py index ba57aee..a3e46a1 100644 --- a/apps/courses/urls.py +++ b/apps/courses/urls.py @@ -1,5 +1,8 @@ from django.conf.urls import url +from . import views + urlpatterns = [ + url(r'^$', views.IndexView.as_view(), name="index"), ] diff --git a/apps/courses/views.py b/apps/courses/views.py index e69de29..9878df6 100644 --- a/apps/courses/views.py +++ b/apps/courses/views.py @@ -0,0 +1,20 @@ +from django.views import View + + +class IndexView(View): + + def get(self, request): + """ + 获取注册页面 + :param request: + :return: + """ + # 生成表单对象 + register_form = RegisterForm() + # 调用模版渲染生成表单 + return render(request, 'index.html', { + 'all_banners': all_banners, + 'courses': courses, + 'banner_courses': banner_courses, + 'course_orgs': course_orgs, + }) diff --git a/apps/users/urls.py b/apps/users/urls.py index 888595b..5ca1b47 100644 --- a/apps/users/urls.py +++ b/apps/users/urls.py @@ -6,4 +6,5 @@ urlpatterns = [ url(r'^register/$', views.UserRegister.as_view(), name='register'), url(r'^login/$', views.LoginView.as_view(), name='login'), + ] diff --git a/apps/users/views.py b/apps/users/views.py index dca4f8d..9d5635e 100644 --- a/apps/users/views.py +++ b/apps/users/views.py @@ -2,6 +2,7 @@ from django.shortcuts import render from django.urls import reverse from django.views import View +from users.models import UserProfile from .forms import RegisterForm, LoginForm from django.http import HttpResponse, HttpResponsePermanentRedirect @@ -20,7 +21,6 @@ class UserRegister(View): # 调用模版渲染生成表单 return render(request, 'register.html', {'register_form': register_form}) - def post(self, request): """ 验证表单数据 @@ -31,15 +31,30 @@ class UserRegister(View): data = request.POST # 2、验证表单数据 register_form = RegisterForm(data) + res = register_form.is_valid() # 验证成功返回True,验证失败返回False if res: - # # 验证成功,则执行相应业务逻辑操作,这里就直接返回验证成功后的字段数据 - # # 获取验证成功后的字段 + # 验证成功,则执行相应业务逻辑操作,这里就直接返回验证成功后的字段数据 + # 获取验证成功后的字段 # username = register_form.cleaned_data['username'] + # # return HttpResponse(username) + email = register_form.cleaned_data.get('email') + password = register_form.cleaned_data.get('password') + user = UserProfile.objects.create(email=email, password=password) return render(request, 'index.html') + # email = request.POST.get('email') + # password = request.POST.get('password') + # + # + # # 用户处理 + # user = UserProfile.objects.create_user( + # email=email, + # password=password, + # + # ) # 验证失败,则在注册模板中通过register_form.errors获取错误 return render(request, 'register.html', {'register_form': register_form}) diff --git a/boxuegu/settings.py b/boxuegu/settings.py index 2c02508..76b811c 100644 --- a/boxuegu/settings.py +++ b/boxuegu/settings.py @@ -28,6 +28,7 @@ ALLOWED_HOSTS = [] # Application definition import sys + # 设置 apps目录 sys.path.insert(0, os.path.join(BASE_DIR, 'apps')) INSTALLED_APPS = [ @@ -40,14 +41,13 @@ INSTALLED_APPS = [ 'xadmin', 'crispy_forms', 'pure_pagination', - 'captcha', # 图片验证生成模块 配合表单一块使用 - 'user_test.apps.UserConfig', # 测试应用创建,用来测试表单和图片验证码模块 - + 'captcha', # 图片验证生成模块 配合表单一块使用 + 'user_test.apps.UserConfig', # 测试应用创建,用来测试表单和图片验证码模块 - 'courses.apps.CoursesConfig', #课程管理应用 - 'operation.apps.OperationConfig', # 用户操作应用 - 'organization.apps.OrganizationConfig', # 学校管理应用 - 'users.apps.UsersConfig', # 用户应用 + 'courses.apps.CoursesConfig', # 课程管理应用 + 'operation.apps.OperationConfig', # 用户操作应用 + 'organization.apps.OrganizationConfig', # 学校管理应用 + 'users.apps.UsersConfig', # 用户应用 ] MIDDLEWARE = [ @@ -65,7 +65,7 @@ ROOT_URLCONF = 'boxuegu.urls' TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', - 'DIRS': [os.path.join(BASE_DIR,'templates')], + 'DIRS': [os.path.join(BASE_DIR, 'templates')], 'APP_DIRS': True, 'OPTIONS': { 'context_processors': [ @@ -129,9 +129,9 @@ USE_TZ = False # https://docs.djangoproject.com/en/1.11/howto/static-files/ STATIC_URL = '/static/' -MEDIA_URL='/media/' -STATICFILES_DIRS=[ os.path.join(BASE_DIR,'static')] -MEDIA_ROOT=os.path.join(BASE_DIR,'static/media') +MEDIA_URL = '/media/' +STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static')] +MEDIA_ROOT = os.path.join(BASE_DIR, 'static/media') # UserProfile 覆盖了 django 内置的 user 表 AUTH_USER_MODEL = 'users.UserProfile' diff --git a/user_test/urls.py b/user_test/urls.py index 7dde2e9..cea7cfc 100644 --- a/user_test/urls.py +++ b/user_test/urls.py @@ -3,3 +3,7 @@ from . import views urlpatterns = [ url('^user_test/',views.UserRegisterView.as_view()), ] + + + + -- Gitee From 47537de7ccb764fa2fe6a9e3f2463fce208696e3 Mon Sep 17 00:00:00 2001 From: zzy <18556579095@163.com> Date: Sun, 5 May 2019 15:50:35 +0800 Subject: [PATCH 5/7] =?UTF-8?q?=E4=BF=AE=E6=94=B9/=E5=BF=98=E8=AE=B0?= =?UTF-8?q?=E5=AF=86=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/users/urls.py | 4 +- apps/users/views.py | 86 +++++++++++++++++++++++++++++++++++++++- apps/utils/email_send.py | 56 ++++++++++++++++++++++++++ boxuegu/settings.py | 9 +++++ templates/forgetpwd.html | 4 +- templates/login.html | 2 +- 6 files changed, 155 insertions(+), 6 deletions(-) create mode 100644 apps/utils/email_send.py diff --git a/apps/users/urls.py b/apps/users/urls.py index 5ca1b47..ee52c06 100644 --- a/apps/users/urls.py +++ b/apps/users/urls.py @@ -5,6 +5,8 @@ urlpatterns = [ # url(r'^register/$',views.UserRegister.as_view()), url(r'^register/$', views.UserRegister.as_view(), name='register'), url(r'^login/$', views.LoginView.as_view(), name='login'), + url(r'^forget/$', views.ForgetPwdView.as_view(), name='forget_pwd'), + url(r'^reset/(?P.*)/$', views.ResetView.as_view(), name='reset_pwd'), - + url(r'^modify_pwd/', views.ModifyPwdView.as_view(), name='modify_pwd'), ] diff --git a/apps/users/views.py b/apps/users/views.py index 9d5635e..8d66ddc 100644 --- a/apps/users/views.py +++ b/apps/users/views.py @@ -1,9 +1,11 @@ +from django.contrib.auth.hashers import make_password from django.shortcuts import render from django.urls import reverse from django.views import View -from users.models import UserProfile -from .forms import RegisterForm, LoginForm +from users.models import UserProfile, EmailVerifyRecord +from utils.email_send import send_register_eamil +from .forms import RegisterForm, LoginForm, ForgetForm, ModifyPwdForm from django.http import HttpResponse, HttpResponsePermanentRedirect @@ -93,3 +95,83 @@ class LoginView(View): # 验证失败,则在注册模板中通过register_form.errors获取错误 return render(request, 'login.html', {'form_errors': login_form.errors}) + +class ForgetPwdView(View): + + def get(self,request): + forget_form = ForgetForm() + return render(request, 'forgetpwd.html', {'forget_form': forget_form}) + + def post(self,request): + #成功返回 + forget_form = ForgetForm(request.POST) + if forget_form.is_valid(): + email = request.POST.get('email', None) + send_register_eamil(email, 'forget') + return render(request, 'send_success.html') + # 失败返回 + else: + return render(request, 'forgetpwd.html', {'forget_form': forget_form}) + +# 激活用户 +class ActiveUserView(View): + def get(self, request, active_code): + # 查询邮箱验证记录是否存在 + all_record = EmailVerifyRecord.objects.filter(code = active_code) + + if all_record: + for record in all_record: + # 获取到对应的邮箱 + email = record.email + # 查找到邮箱对应的user + user = UserProfile.objects.get(email=email) + user.is_active = True + user.save() + # 验证码不对的时候跳转到激活失败页面 + else: + return render(request,'active_fail.html') + # 激活成功跳转到登录页面 + return render(request, "login.html", ) + + +class ResetView(View): + def get(self, request, active_code): + all_records = EmailVerifyRecord.objects.filter(code=active_code) + if all_records: + for record in all_records: + email = record.email + return render(request, "password_reset.html", {"email":email}) + else: + return render(request, "active_fail.html") + return render(request, "login.html") + + + +class ResetView(View): + def get(self, request, active_code): + all_records = EmailVerifyRecord.objects.filter(code=active_code) + if all_records: + for record in all_records: + email = record.email + return render(request, "password_reset.html", {"email":email}) + else: + return render(request, "active_fail.html") + return render(request, "login.html") + +class ModifyPwdView(View): + def post(self, request): + modify_form = ModifyPwdForm(request.POST) + if modify_form.is_valid(): + pwd1 = request.POST.get("password1", "") + pwd2 = request.POST.get("password2", "") + email = request.POST.get("email", "") + if pwd1 != pwd2: + return render(request, "password_reset.html", {"email":email, "msg":"密码不一致!"}) + user = UserProfile.objects.get(email=email) + user.password = make_password(pwd2) + user.save() + + return render(request, "login.html") + else: + email = request.POST.get("email", "") + return render(request, "password_reset.html", {"email":email, "modify_form":modify_form }) \ No newline at end of file diff --git a/apps/utils/email_send.py b/apps/utils/email_send.py new file mode 100644 index 0000000..70c9f22 --- /dev/null +++ b/apps/utils/email_send.py @@ -0,0 +1,56 @@ +# apps/utils/email_send.py + +from random import Random +from django.core.mail import send_mail + +from users.models import EmailVerifyRecord +from boxuegu.settings import EMAIL_FROM + +# 生成随机字符串 +def random_str(random_length=8): + str = '' + # 生成字符串的可选字符串.. + chars = 'AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz0123456789' + length = len(chars) - 1 + random = Random() + for i in range(random_length): + str += chars[random.randint(0, length)] + return str + +# 发送注册邮件 +def send_register_eamil(email, send_type="register"): + # 发送之前先保存到数据库,到时候查询链接是否存在 + # 实例化一个EmailVerifyRecord对象 + email_record = EmailVerifyRecord() + # 生成随机的code放入链接 + code = random_str(16) + email_record.code = code + email_record.email = email + email_record.send_type = send_type + + email_record.save() + + # 定义邮件内容: + email_title = "" + email_body = "" + + if send_type == "register": + email_title = "博学谷注册激活链接" + email_body = "请点击下面的链接激活你的账号: http://127.0.0.1:8000/active/{0}".format(code) + + # 使用Django内置函数完成邮件发送。四个参数:主题,邮件内容,从哪里发,接受者list + send_status = send_mail(email_title, email_body, EMAIL_FROM, [email]) + # 如果发送成功 + if send_status: + pass + + if send_type == "forget": + email_title = "博学谷找回你的密码链接" + email_body = "请点击下面的链接找回你的密码: http://127.0.0.1:8000/reset/{0}".format(code) + + # 使用Django内置函数完成邮件发送。四个参数:主题,邮件内容,从哪里发,接受者list + send_status = send_mail(email_title, email_body, EMAIL_FROM, [email]) + # 如果发送成功 + if send_status: + pass + diff --git a/boxuegu/settings.py b/boxuegu/settings.py index 76b811c..5934d2c 100644 --- a/boxuegu/settings.py +++ b/boxuegu/settings.py @@ -135,3 +135,12 @@ MEDIA_ROOT = os.path.join(BASE_DIR, 'static/media') # UserProfile 覆盖了 django 内置的 user 表 AUTH_USER_MODEL = 'users.UserProfile' + +# settings.py + +EMAIL_HOST = "smtp.qq.com" # SMTP服务器主机 +EMAIL_PORT = 25 # 端口 +EMAIL_HOST_USER = "zhangzhengyuzz@qq.com" # 邮箱地址 +EMAIL_HOST_PASSWORD = "xskspzdytxsxbfid" # 密码 +EMAIL_USE_TLS= True +EMAIL_FROM = "zhangzhengyuzz@qq.com" # 邮箱地址 \ No newline at end of file diff --git a/templates/forgetpwd.html b/templates/forgetpwd.html index 6a7f2ed..23efc44 100644 --- a/templates/forgetpwd.html +++ b/templates/forgetpwd.html @@ -26,9 +26,9 @@