项目简介:这是一个网上教育平台
项目博客地址: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页面动态登录部分的逻辑判断和配置:
项目总结:
系统特点:采用了Django2.2和python3.7 最新的版本开发的功能,具有手机号动态登录,手机号注册,账号登录的功能
系统不足与可改进的地方:目前只做了users的模块,course、operations、organizations模块的还没完善