一、注册
1.注册之前端页面
<! DOCTYPE html >
< html lang = " en" >
< head> < meta charset = " UTF-8" > < title> 注册页面</ title> {% load static %}< script src = " {% static 'js/jquery.min.js' %}" > </ script> < link href = " {% static 'bootstrap/css/bootstrap.min.css' %}" rel = " stylesheet" > < script src = " {% static 'bootstrap/js/bootstrap.min.js' %}" > </ script> < script src = " {% static 'layer/layer.js' %}" > </ script> < style> body { font-family : Arial, sans-serif; margin : 0; padding : 0; background-image : url ( 'https://pegasus.epweike.com/Public/uploads/introduce/55dc0c8c010df.jpg' ) ; background-size : cover; background-repeat : no-repeat; background-position : center; min-height : 100vh; display : flex; justify-content : center; align-items : center; } .container { background-color : rgba ( 255, 255, 255, 0.9) ; border-radius : 10px; box-shadow : 0px 0px 10px rgba ( 0, 0, 0, 0.1) ; padding : 20px; text-align : center; width : 100%; max-width : 600px; } h1 { margin-top : 0; } .form-group { margin-bottom : 20px; } label { display : block; font-weight : bold; } .form-control { width : 100%; padding : 10px; border : 1px solid #ccc; border-radius : 5px; } .btn { background-color : #007bff; color : #fff; padding : 10px 20px; border : none; border-radius : 5px; cursor : pointer; width : 100%; } .btn:hover { background-color : #0056b3; } </ style>
</ head>
< body> < div class = " container" > < div class = " row" > < div class = " col-md-8 col-md-offset-2" > < h1 class = " text-center" > 注册页面</ h1> < div class = " form-group" > < label for = " username" > 用户姓名</ label> < input type = " text" id = " username" class = " form-control" msg = " 用户名必须填写" > </ div> < div class = " form-group" > < label for = " username" > 用户密码</ label> < input type = " password" id = " password" class = " form-control" msg = " 密码必须填写" > </ div> < div class = " form-group" > < label for = " username" > 确认密码</ label> < input type = " password" id = " re_password" class = " form-control" msg = " 确认密码必须填写" > </ div> < div class = " form-group" > < label for = " username" > 邮箱</ label> < input type = " text" id = " email" class = " form-control" msg = " 邮箱必须填写" > </ div> < div class = " form-group" > < label for = " myfile" > 上传头像:< img src = " /static/img/default.png" id = " myImg" width = " 100" alt = " " > </ label> < input type = " file" id = " myfile" style = " display : none" class = " form-control" > </ div> < div class = " form-group" > < input type = " button" value = " 提交" class = " btn btn-primary btn-block" > </ div> </ div> </ div>
</ div> {# 绑定点击事件 #}
< script> $ ( "#myfile" ) . change ( function ( ) { let myFileReaderObj = new FileReader ( ) ; { #var myFileDataObj = $ ( "#myfile" ) [ 0 ] . files[ 0 ] ; #} var myFileDataObj = $ ( this ) [ 0 ] . files[ 0 ] ; myFileReaderObj. readAsDataURL ( myFileDataObj) ; myFileReaderObj. onload = function ( ) { $ ( "#myImg" ) . attr ( 'src' , myFileReaderObj. result) ; } } ) ; $ ( ".btn" ) . click ( function ( ) { let username = $ ( "#username" ) . val ( ) ; let password = $ ( "#password" ) . val ( ) ; let re_password = $ ( "#re_password" ) . val ( ) ; let email = $ ( "#email" ) . val ( ) ; let myImg = $ ( "#myfile" ) [ 0 ] . files[ 0 ] ; console. log ( myImg) var ids = [ 'username' , 'password' , 're_password' , 'email' ] ; $. each ( ids, function ( index, value ) { if ( ! $ ( '#' + value) . val ( ) ) { layer. msg ( $ ( "#" + value) . attr ( 'msg' ) ) ; return ; } } ) ; if ( re_password !== password) { layer. msg ( '两次密码不一致' ) ; return ; } let formData = new FormData ( ) ; formData. append ( 'username' , username) ; formData. append ( 'password' , password) ; formData. append ( 're_password' , re_password) ; formData. append ( 'email' , email) ; formData. append ( 'myfile' , myImg) ; formData. append ( 'csrfmiddlewaretoken' , '{{ csrf_token }}' ) ; $. ajax ( { url : '' , type : 'post' , data : formData, contentType : false , processData : false , success : function ( res ) { if ( res. code === 200 ) { { #layer. msg ( res. msg, { 'icon' : 1 } , function ( ) { #} layer. msg ( res. msg, { } , function ( ) { location. href = res. url; } ) ; } else { layer. msg ( res. msg) ; } } , } ) ; } ) ;
</ script> </ body>
</ html>
2.注册之后台功能
def register ( request) : if request. method == 'POST' : back_dict = { 'code' : 200 , 'msg' : '注册成功' , 'data' : [ ] } username = request. POST. get( 'username' ) password = request. POST. get( 'password' ) re_password = request. POST. get( 're_password' ) email = request. POST. get( 'email' ) myfile = request. FILES. get( 'myfile' ) if not username: back_dict[ 'code' ] = 1001 back_dict[ 'msg' ] = '用户名必填' return JsonResponse( back_dict) if not password: back_dict[ 'code' ] = 1003 back_dict[ 'msg' ] = '密码必填' return JsonResponse( back_dict) if not re_password: back_dict[ 'code' ] = 1004 back_dict[ 'msg' ] = '确认密码必填' return JsonResponse( back_dict) if password != re_password: back_dict[ 'code' ] = 1002 back_dict[ 'msg' ] = '两次密码不一致' return JsonResponse( back_dict) if not email: back_dict[ 'code' ] = 1005 back_dict[ 'msg' ] = '邮箱必填' return JsonResponse( back_dict) new_pwd = get_md5( password) data_dict = { } data_dict[ 'username' ] = usernamedata_dict[ 'password' ] = new_pwd[ : 16 ] data_dict[ 'email' ] = emailif myfile: data_dict[ 'avatar' ] = myfilemodels. UserInfo. objects. create( ** data_dict) back_dict[ 'url' ] = '/login/' return JsonResponse( back_dict) return render( request, 'register.html' , locals ( ) )
3.密码加密加盐
from django. conf import settings
import hashlibdef get_md5 ( password) : m = hashlib. md5( ) pwd = password + settings. SECRET_KEYm. update( pwd. encode( 'utf8' ) ) return m. hexdigest( )
二、登录
1.登录之前端页面
<! DOCTYPE html >
< html lang = " en" >
< head> < meta charset = " UTF-8" > < title> 注册页面</ title> {% load static %}< script src = " {% static 'js/jquery.min.js' %}" > </ script> < link href = " {% static 'bootstrap/css/bootstrap.min.css' %}" rel = " stylesheet" > < script src = " {% static 'bootstrap/js/bootstrap.min.js' %}" > </ script> < script src = " {% static 'layer/layer.js' %}" > </ script> {# background: url('https://img0.baidu.com/it/u=741268616,1401664941&fm=253&app=138&size=w931&n=0&f=JPEG&fmt=auto?sec=1691859600&t=5c5bee3052ecec363c1ecc2eea9ac3f7') no-repeat; background-size: 100% 130%;#}< style> body { font-family : Arial, sans-serif; margin : 0; padding : 0; background-image : url ( 'https://pegasus.epweike.com/Public/uploads/introduce/55dc0c8c010df.jpg' ) ; background-size : cover; background-repeat : no-repeat; background-position : center; min-height : 100vh; display : flex; justify-content : center; align-items : center; } .container { background-color : rgba ( 255, 255, 255, 0.9) ; border-radius : 10px; box-shadow : 0px 0px 10px rgba ( 0, 0, 0, 0.1) ; padding : 20px; text-align : center; width : 100%; max-width : 600px; } h1 { margin-top : 0; } .form-group { margin-bottom : 20px; } label { display : block; font-weight : bold; } .form-control { width : 100%; padding : 10px; border : 1px solid #ccc; border-radius : 5px; } .btn { background-color : #007bff; color : #fff; padding : 10px 20px; border : none; border-radius : 5px; cursor : pointer; width : 100%; } .btn:hover { background-color : #0056b3; } </ style> </ head> < body> < div class = " container" > < div class = " row" > < div class = " col-md-8 col-md-offset-2" > < h1 class = " text-center" > 登录页面</ h1> < div class = " form-group" > < label for = " username" > 用户姓名</ label> < input type = " text" id = " username" class = " form-control" msg = " 用户名必须填写" > </ div> < div class = " form-group" > < label for = " username" > 用户密码</ label> < input type = " password" id = " password" class = " form-control" msg = " 密码必须填写" > </ div> < div class = " form-group" > < label for = " username" > 验证码</ label> < div class = " row" > < div class = " col-md-6" > < input type = " text" id = " code" class = " form-control" msg = " 验证码必须填写" > </ div> < div class = " col-md-6" > < img src = " /get_code/" style = " width: 160px; height: 35px;" alt = " " > </ div> </ div> </ div> < div class = " form-group" > < input type = " button" value = " 提交" class = " btn btn-primary btn-block" > </ div> </ div> </ div>
</ div> < script> $ ( ".btn" ) . click ( function ( ) { let username = $ ( "#username" ) . val ( ) ; let password = $ ( "#password" ) . val ( ) ; let code = $ ( "#code" ) . val ( ) ; var ids = [ 'username' , 'password' , 'code' ] ; $. each ( ids, function ( index, value ) { if ( ! $ ( '#' + value) . val ( ) ) { layer. msg ( $ ( "#" + value) . attr ( 'msg' ) ) ; return ; } } ) ; if ( code. length !== 5 ) { layer. msg ( '验证码输入不正确' ) ; return ; } $. ajax ( { url : '' , type : 'post' , data : { username : username, password : password, code : code, csrfmiddlewaretoken : '{{ csrf_token }}' } , success : function ( res ) { if ( res. code === 200 ) { { #layer. msg ( res. msg, { 'icon' : 1 } , function ( ) { #} layer. msg ( res. msg, { } , function ( ) { location. href = res. url; } ) ; } else { layer. msg ( res. msg, { } ) ; } } , } ) ; } ) ;
</ script> </ body>
</ html>
2.登录之后端
def login ( request) : '''验证码:一般是图片验证码,短信验证码(平台)滑动验证码(平台)验证码的作用:人机识别,防止爬虫------->一般都需要登录之后才能访问:param request::return:''' if request. method == 'POST' : back_dict = { 'code' : 200 , 'msg' : '登录成功,3s之后自动跳转' , 'data' : [ ] } username = request. POST. get( 'username' ) password = request. POST. get( 'password' ) code = request. POST. get( 'code' ) if not username: back_dict[ 'code' ] = 1006 back_dict[ 'msg' ] = '用户名必填' return JsonResponse( back_dict) if not password: back_dict[ 'code' ] = 1007 back_dict[ 'msg' ] = '密码必填' return JsonResponse( back_dict) if code. upper( ) != request. session. get( 'code' ) . upper( ) : back_dict[ 'code' ] = 1008 back_dict[ 'msg' ] = '验证码必填' return JsonResponse( back_dict) new_pwd = get_md5( password) user_obj = models. UserInfo. objects. filter ( username= username, password= new_pwd[ : 16 ] ) . first( ) if not user_obj: back_dict[ 'code' ] = 1009 back_dict[ 'msg' ] = '用户名或者密码错误' return JsonResponse( back_dict) request. session[ 'username' ] = user_obj. usernamerequest. session[ 'id' ] = user_obj. pkback_dict[ 'url' ] = '/home/' return JsonResponse( back_dict) return render( request, 'login.html' , locals ( ) )
2.登录之随机验证码
"""
图片相关的模块pip3 install pillow
"""
from PIL import Image, ImageDraw, ImageFont"""
Image:生成图片
ImageDraw:能够在图片上乱涂乱画
ImageFont:控制字体样式
"""
from io import BytesIO, StringIO"""
内存管理器模块
BytesIO:临时帮你存储数据 返回的时候数据是二进制
StringIO:临时帮你存储数据 返回的时候数据是字符串
"""
import randomdef get_random ( ) : return random. randint( 0 , 255 ) , random. randint( 0 , 255 ) , random. randint( 0 , 255 ) def get_code ( request) : img_obj = Image. new( 'RGB' , ( 430 , 35 ) , get_random( ) ) img_draw = ImageDraw. Draw( img_obj) img_font = ImageFont. truetype( 'static/font/yun.ttf' , 30 ) code = '' for i in range ( 5 ) : random_upper = chr ( random. randint( 65 , 90 ) ) random_lower = chr ( random. randint( 97 , 122 ) ) random_int = str ( random. randint( 0 , 9 ) ) tmp = random. choice( [ random_lower, random_upper, random_int] ) """为什么一个个写而不是生成好了之后再写因为一个个写能够控制每个字体的间隙 而生成好之后再写的话间隙就没法控制了""" img_draw. text( ( i * 60 + 60 , - 2 ) , tmp, get_random( ) , img_font) code += tmpprint ( code) request. session[ 'code' ] = codeio_obj = BytesIO( ) img_obj. save( io_obj, 'png' ) return HttpResponse( io_obj. getvalue( ) )
三、首页
1.首页之前端(导航条和模态框)
<! DOCTYPE html >
< html lang = " en" >
< head> < meta charset = " UTF-8" > < title> Title</ title> {% load static %}< script src = " {% static 'js/jquery.min.js' %}" > </ script> < link href = " {% static 'bootstrap/css/bootstrap.min.css' %}" rel = " stylesheet" > < script src = " {% static 'bootstrap/js/bootstrap.min.js' %}" > </ script> < script src = " {% static 'layer/layer.js' %}" > </ script> </ head>
< body> < nav class = " navbar navbar-inverse" > < div class = " container-fluid" > < div class = " navbar-header" > < button type = " button" class = " navbar-toggle collapsed" data-toggle = " collapse" data-target = " #bs-example-navbar-collapse-1" aria-expanded = " false" > < span class = " sr-only" > Toggle navigation</ span> < span class = " icon-bar" > </ span> < span class = " icon-bar" > </ span> < span class = " icon-bar" > </ span> </ button> < a class = " navbar-brand" href = " #" > 全球最大的博客网站</ a> </ div> < div class = " collapse navbar-collapse" id = " bs-example-navbar-collapse-1" > < ul class = " nav navbar-nav" > < li class = " active" > < a href = " #" > 文章 < span class = " sr-only" > (current)</ span> </ a> </ li> < li> < a href = " #" > 分类</ a> </ li> < li class = " dropdown" > < a href = " #" class = " dropdown-toggle" data-toggle = " dropdown" role = " button" aria-haspopup = " true" aria-expanded = " false" > 点我看更多美女哦 < span class = " caret" > </ span> </ a> < ul class = " dropdown-menu" > < li> < a href = " #" > Action</ a> </ li> < li> < a href = " #" > Another action</ a> </ li> < li> < a href = " #" > Something else here</ a> </ li> < li role = " separator" class = " divider" > </ li> < li> < a href = " #" > Separated link</ a> </ li> < li role = " separator" class = " divider" > </ li> < li> < a href = " #" > One more separated link</ a> </ li> </ ul> </ li> </ ul> < form class = " navbar-form navbar-left" > < div class = " form-group" > < input type = " text" class = " form-control" placeholder = " Search" > </ div> < button type = " submit" class = " btn btn-default" > 搜索</ button> </ form> < ul class = " nav navbar-nav navbar-right" > {% if request.session.username %}< li> < a href = " #" > {{ request.session.username }}</ a> </ li> < li class = " dropdown" > < a href = " #" class = " dropdown-toggle" data-toggle = " dropdown" role = " button" aria-haspopup = " true" aria-expanded = " false" > 更多操作 < span class = " caret" > </ span> </ a> < ul class = " dropdown-menu" > < li> < a href = " #" data-toggle = " modal" data-target = " .bs-example-modal-lg" > 修改密码</ a> </ li> < li> < a href = " #" > 更改头像</ a> </ li> < li> < a href = " /logout/" > 退出登录</ a> </ li> < li> < a href = " #" > 后台管理</ a> </ li> </ ul> </ li> {% else %}< li> < a href = " /login/" > 登录</ a> </ li> < li> < a href = " /register/" > 注册</ a> </ li> {% endif %}</ ul> < div class = " modal fade bs-example-modal-lg" tabindex = " -1" role = " dialog" aria-labelledby = " myLargeModalLabel" > < div class = " modal-dialog modal-lg" role = " document" > < div class = " modal-content" > < div class = " row" > < h1 class = " text-center" > 修改密码</ h1> < div class = " col-md-8 col-md-offset-2" > < div class = " form-group" > 用户名:< input type = " text" readonly value = " {{ request.session.username }}" class = " form-control" > </ div> < div class = " form-group" > 原密码:< input type = " password" id = " old_password" class = " form-control" msg = " 原密码必须输入" > </ div> < div class = " form-group" > 新密码:< input type = " password" id = " new_password" class = " form-control" msg = " 原密码必须输入" > </ div> < div class = " form-group" > 确认密码:< input type = " password" id = " re_password" class = " form-control" msg = " 原密码必须输入" > </ div> < div class = " form-group" > < input type = " button" value = " 修改密码" class = " btn btn-primary btn-block" > </ div> </ div> </ div> </ div> </ div> </ div> </ div> </ div>
</ nav> < script> $ ( ".btn" ) . click ( function ( ) { let old_password = $ ( "#old_password" ) . val ( ) ; let new_password = $ ( "#new_password" ) . val ( ) ; let re_password = $ ( "#re_password" ) . val ( ) ; let ids = [ 'old_password' , 'new_password' , 're_password' ] ; $. each ( ids, function ( index, value ) { if ( ! $ ( '#' + value) . val ( ) ) { layer. msg ( $ ( '#' + value) . attr ( 'msg' ) ) ; return ; } } ) ; $. ajax ( { url : '/set_password/' , type : 'post' , data : { old_password : old_password, new_password : new_password, re_password : re_password, csrfmiddlewaretoken : '{{ csrf_token }}' } , success : function ( res ) { if ( res. code == 200 ) { layer. msg ( res. msg, { } , function ( ) { location. reload ( ) ; } ) ; } else { layer. msg ( res. msg, { } ) ; } } } ) ; } ) ;
</ script> </ body>
</ html>
2.首页之后端(修改密码)
def set_password ( request) : if request. method == 'POST' : back_dict = { 'code' : 200 , 'msg' : '修改密码成功,3s后自动跳转' , 'data' : [ ] } old_password = request. POST. get( 'old_password' ) new_password = request. POST. get( 'new_password' ) re_password = request. POST. get( 're_password' ) if new_password != re_password: back_dict[ 'code' ] = 1200 back_dict[ 'msg' ] = '两次密码输入不一致' return JsonResponse( back_dict) old_pwd = get_md5( old_password) user_obj = models. UserInfo. objects. filter ( username= request. session. get( 'username' ) , password= old_pwd[ : 16 ] ) . first( ) if not user_obj: back_dict[ 'code' ] = 1201 back_dict[ 'msg' ] = '原密码不正确' return JsonResponse( back_dict) new_pwd = get_md5( new_password) print ( new_pwd) models. UserInfo. objects. filter ( pk= request. session. get( 'id' ) ) . update( password= new_pwd[ : 16 ] ) return JsonResponse( back_dict)