项目简介
项目简介:这是一个网上教育平台
项目博客地址:https://www.cnblogs.com/lpbg/p/11978630.html
项目的功能与特色:用动态验证码来完成手机登陆和注册
采取的技术栈:采用框架为django2.2 /xadmin,用配置的虚拟环境来开发,python3.7
项目借鉴源代码的github地址:幕课网的django开发教学视频
团队名称:
团队成员:(组长)林鹏
任务分配:林鹏:完成app的分析设计,后台的搭建,登陆注册功能的实现
前期调查和需求分析:
大致上分为 四个app(也就是四个模块,Django是按app来开发的)
- users--用户相关
- courese--课程相关
- organization--机构相关
- operation-用户操作相关
然后 users 这个app里有1个表
UserProfile
couese这个模块有:
- Course(课程模型/表)
- Lesson(章节模型/表)
- Video(视频模型/表)
- CourseResource(课程资源模型/表)
operation这个模块有:
- UserAsk(用户咨询表)
- CourseComments(课程评论表)
- UserFavorite(用户收藏表)
- UserMessage(用户信息表)
- UserCourse(用户课程表)
organization这个模块有:
- City(城市表)
- CourseOrg(课程机构表)
- Teacher(讲师表)
主要功能流程图:
注册功能流程图
登录功能流程图:

账号登录:
自己负责的模块:账号登录、动态登录、手机号注册模块
账号登录:使用username 和password登录
动态登录:使用手机号码,手机发送的验证码,图片验证码 校验之后 登录
手机号注册:使用手机号进行账号注册,通过图片验证码和手机验证码进行校验
账号登录:
class LoginView(View):
def get(self,request, *args, **kwargs):
#判断用户是否登录 是否登录的状态is_authenticated在django2.o之后版本都是属性如果是登录状态则重定向到首页
if request.user.is_authenticated:
return HttpResponseRedirect(reverse("index"))
login_form=DynamicLoginForm()
return render(request,"login.html",{
"login_form":login_form
})
def post(self,request, *args, **kwargs):
#表单验证
login_form=LoginForm(request.POST)
if login_form.is_valid():
user_name=login_form.cleaned_data["username"]
password=login_form.cleaned_data["password"]
# 用于通过用户名和密码查询用户是否存在
user = authenticate(username=user_name, password=password)
if user is not None:
#查询到用户
login(request,user)
#login方法会自动登录,request为上面django传递的参数
#登录成功之后返回页面
return HttpResponseRedirect(reverse("index"))
else:
# 未查询到用户
return render(request, "login.html", {"msg": "用户名或密码错误","login_form":login_form})
else:
return render(request,"login.html",{"login_form":login_form})
动态登录:
class DynamicLoginView(View):
def get(self, request, *args, **kwargs):
if request.user.is_authenticated:
return HttpResponseRedirect(reverse("index"))
def post(self, request, *args, **kwargs):
login_form=DynamicLoginPostForm(request.POST)
dynamic_login = True
if login_form.is_valid():
#用手机动态登录 没有注册账号用户依然可以使用
mobile = login_form.cleaned_data["mobile"]
#此时查询一下用户表
existd_users=UserProfile.objects.filter(mobile=mobile)
if existd_users:
#如果存在就登录
user =existd_users[0]
else:
#如果不存在就新建用户
user=UserProfile(username=mobile)
#此时设置了明文密码随机生成 8位数 ,数字加字符加特殊字符
password =generate_random(8,2)
#因为数据库里的密码是加密后的 所以不能直接存储明文密码需要通过set_password加密
user.set_password(password)
user.mobile=mobile
user.save()
login(request, user)
return HttpResponseRedirect(reverse("index"))
else:
dynamic_form=DynamicLoginForm()
return render(request, "login.html", {
"login_form": login_form,
"dynamic_login":dynamic_login,
"dynamic_form" :dynamic_form
#dynamic_form 把动态验证码的值传递过来
})
手机账号注册:
class RegisterView(View): def get(self, request, *args, **kwargs): register_get_form=RegisterGetForm() return render(request,"register.html",{ "register_get_form":register_get_form }) def post(self, request, *args, **kwargs): register_post_form = RegisterPostForm(request.POST) if register_post_form.is_valid(): # 如果验证通过说明不存在用户,要新建 mobile = register_post_form.cleaned_data["mobile"] password = register_post_form.cleaned_data["password"] #新建用户 user = UserProfile(username=mobile) # 因为数据库里的密码是加密后的 所以不能直接存储明文密码需要通过set_password加密 user.set_password(password) user.mobile = mobile user.save() login(request, user) return HttpResponseRedirect(reverse("index")) else: register_get_form = RegisterGetForm() return render(request, "register.html.html", { "register_get_form":register_get_form, "register_post_form":register_post_form, })
动态登录的表单验证:
class DynamicLoginPostForm(forms.Form):
mobile = forms.CharField(required=True,min_length=11,max_length=11)
code = forms.CharField(min_length=4,max_length=4,required=True)
def clean_code(self):
mobile = self.data.get("mobile")
code = self.data.get("code")
# 取出这两个值之后就是涉及到在redis中查询了
r = redis.Redis(host=REDIS_HOST, port=REDIS_PORT, db=0, charset="utf8", decode_responses=True)
redis_code = r.get(str(mobile))
# 然后比较两个code值
if code != redis_code:
raise forms.ValidationError("验证码不正确")
# 如果正确直接返回
return code
账号注册的表单验证:
class RegisterPostForm(forms.Form):
mobile = forms.CharField(required=True, min_length=11, max_length=11)
code = forms.CharField(min_length=4, max_length=4, required=True)
password = forms.CharField(min_length=4)
def clean_mobile(self):
mobile = self.data.get("mobile")
# 验证手机号码是否注册过
users=UserProfile.objects.filter(mobile=mobile)
if users:
raise forms.ValidationError("该手机号码已注册")
return mobile
def clean_code(self):
mobile = self.data.get("mobile")
code = self.data.get("code")
# 取出这两个值之后就是涉及到在redis中查询了
r = redis.Redis(host=REDIS_HOST, port=REDIS_PORT, db=0, charset="utf8", decode_responses=True)
redis_code = r.get(str(mobile))
# 然后比较两个code值
if code != redis_code:
raise forms.ValidationError("验证码不正确")
# 如果正确直接返回
前端html页面动态登录部分的逻辑判断和配置:
<form class="tab-form {% if dynamic_login %}{% else %}hide{% endif %}" action="{% url 'dynamic_login' %}" id="mobile_register_form" autocomplete="off" method="post" id="form2">
<div class="form-group marb20 {% if login_form.errors.username %}errorput{% endif %}">
<input id="jsRegMobile" name="mobile" value="{{login_form.mobile.value|default_if_none:''}}" type="text" placeholder="请输入您的手机号码">
</div>
<div class="form-group marb20 blur {% if login_form.errors.password %}errorput{% endif %}" id="jsRefreshCode">
{{ login_form.captcha }}
{{ dynamic_form.captcha }}
</div>
<div class="clearfix">
<div class="form-group marb8 verify-code">
<input id="jsPhoneRegCaptcha" name="code" value="{{login_form.code.value}}" type="text" placeholder="输入手机验证码">
</div>
<input class="verify-code-btn sendcode" id="jsSendCode" value="发送验证码">
</div>
<div class="error btns" id="jsMobileTips" style="">{% if login_form.errors %}{% for key,error in login_form.errors.items %}{{ error }}{% endfor %}{% else %}{{ msg }}{% endif %}</div>
<div class="auto-box marb8">
</div>
<input class="btn btn-green" id="jsMobileRegBtn" type="button" value="立即登录">
{% csrf_token %}
</form>
项目总结:
系统特点:采用了Django2.2和python3.7 最新的版本开发的功能,具有手机号动态登录,手机号注册,账号登录的功能
系统不足与可改进的地方:目前只做了users的模块,course、operations、organizations模块的还没完善

浙公网安备 33010602011771号