项目简介

项目简介:这是一个网上教育平台

项目博客地址: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(讲师表)

主要功能流程图:

注册功能流程图项目简介_第1张图片

 

登录功能流程图:

项目简介_第2张图片

账号登录:项目简介_第3张图片

 

自己负责的模块:账号登录、动态登录、手机号注册模块

账号登录:使用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模块的还没完善

你可能感兴趣的:(项目简介)