#手机验证码
This commit is contained in:
parent
3c976c69d8
commit
84b8ee5a73
|
@ -24,7 +24,7 @@ BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
|
||||||
SECRET_KEY = 'tj5m7-ns_6x_fvn2^q+7+2fopq!#7taqv!9ai(c_45i5!%m=*z'
|
SECRET_KEY = 'tj5m7-ns_6x_fvn2^q+7+2fopq!#7taqv!9ai(c_45i5!%m=*z'
|
||||||
|
|
||||||
# SECURITY WARNING: don't run with debug turned on in production!
|
# SECURITY WARNING: don't run with debug turned on in production!
|
||||||
DEBUG = False
|
DEBUG = True
|
||||||
|
|
||||||
ALLOWED_HOSTS = ['*']
|
ALLOWED_HOSTS = ['*']
|
||||||
|
|
||||||
|
|
|
@ -605,3 +605,9 @@ class News(models.Model):
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return self.title
|
return self.title
|
||||||
|
|
||||||
|
#手机验证码验证表
|
||||||
|
class CheckCode(models.Model):
|
||||||
|
phone_code = models.CharField('手机验证码',max_length=256,null=True,blank=True)
|
||||||
|
phone = models.CharField('电话号',max_length=256,null=True,blank=True)
|
||||||
|
c_time = models.DateField('时间',null=True,blank=True)
|
||||||
|
|
|
@ -0,0 +1,133 @@
|
||||||
|
{% extends 'dashboard/base/base.html' %}
|
||||||
|
{% load static %}
|
||||||
|
{% block css %}
|
||||||
|
<style>
|
||||||
|
body.login_page {
|
||||||
|
background-color: rgba(116, 77, 144, 1.0)
|
||||||
|
/*#744d90*/;
|
||||||
|
background-image: url('{% static 'image/login-bg.png' %}');
|
||||||
|
background-attachment: fixed;
|
||||||
|
height: 100%;
|
||||||
|
max-height: 100%;
|
||||||
|
min-height: 99%;
|
||||||
|
overflow: hidden;
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.loginpage h1 a {
|
||||||
|
height: 92px;
|
||||||
|
margin: 0px auto 0px auto;
|
||||||
|
padding: 0;
|
||||||
|
text-decoration: none;
|
||||||
|
-moz-background-size: 345px 92px;
|
||||||
|
-o-background-size: 345px 92px;
|
||||||
|
background-size: 345px 92px;
|
||||||
|
background-color: transparent;
|
||||||
|
min-height: 92px;
|
||||||
|
width: auto;
|
||||||
|
background-image: url("{% static 'image/login-logo.png' %}");
|
||||||
|
background-position: center top;
|
||||||
|
background-repeat: no-repeat;
|
||||||
|
text-indent: -9999px;
|
||||||
|
outline: 0;
|
||||||
|
overflow: hidden;
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
{% endblock %}
|
||||||
|
{% block header %} {% endblock %}
|
||||||
|
{% block content %}
|
||||||
|
|
||||||
|
<body class=" login_page">
|
||||||
|
|
||||||
|
|
||||||
|
<div class="login-wrapper">
|
||||||
|
{% if messages %}
|
||||||
|
<div class="alert alert-success alert-dismissible" role="alert">
|
||||||
|
<button type="button" class="close" data-dismiss="alert">
|
||||||
|
<span aria-hidden="true">×</span>
|
||||||
|
<span class="sr-only">Close</span>
|
||||||
|
</button>
|
||||||
|
{% for message in messages %}
|
||||||
|
{{ message }}.<br/>
|
||||||
|
{% endfor %}
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
<div id="login"
|
||||||
|
class="login loginpage col-lg-offset-4 col-lg-4 col-md-offset-3 col-md-6 col-sm-offset-3 col-sm-6 col-xs-offset-2 col-xs-8">
|
||||||
|
<h1><a href="#" title="Login Page" tabindex="-1">Ultra Admin</a></h1>
|
||||||
|
|
||||||
|
<form name="loginform" id="loginform" action="{% url 'dashboard-login-for-phone' %}" method="post">{% csrf_token %}
|
||||||
|
<p>
|
||||||
|
<label for="user_login">手机号<br/>
|
||||||
|
<input type="text" name="username" id="user_login" class="input" size="20" placeholder="请输入手机号"/><button type="button" class="btn btn-success">获取验证码</button></label>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<label for="user_pass">验证码<br/>
|
||||||
|
<input type="text" name="password" id="user_pass" class="input" size="20"
|
||||||
|
placeholder="请输入验证码"/></label>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p class="submit">
|
||||||
|
<input type="submit" name="wp-submit" id="wp-submit" class="btn btn-orange btn-block"
|
||||||
|
value="登录"/>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
</form>
|
||||||
|
<p id="nav">
|
||||||
|
<a class="pull-left" href="#" title="Password Lost and Found">忘记密码</a>
|
||||||
|
<a href="#" title="Password Lost and Found" style="margin-left: 30%">账号登录</a>
|
||||||
|
<a class="pull-right" href="{% url 'dashboard-register' %}" title="Sign Up">注册</a>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<!-- LOAD FILES AT PAGE END FOR FASTER LOADING -->
|
||||||
|
<!-- General section box modal start -->
|
||||||
|
<div class="modal" id="section-settings" tabindex="-1" role="dialog" aria-labelledby="ultraModal-Label"
|
||||||
|
aria-hidden="true">
|
||||||
|
<div class="modal-dialog animated bounceInDown">
|
||||||
|
<div class="modal-content">
|
||||||
|
<div class="modal-header">
|
||||||
|
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
|
||||||
|
<h4 class="modal-title">Section Settings</h4>
|
||||||
|
</div>
|
||||||
|
<div class="modal-body">
|
||||||
|
|
||||||
|
Body goes here...
|
||||||
|
|
||||||
|
</div>
|
||||||
|
<div class="modal-footer">
|
||||||
|
<button data-dismiss="modal" class="btn btn-default" type="button">Close</button>
|
||||||
|
<button class="btn btn-success" type="button">Save changes</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<!-- modal end -->
|
||||||
|
</body>
|
||||||
|
{% endblock %}
|
||||||
|
{% block add_js %}
|
||||||
|
<script>
|
||||||
|
$(function () {
|
||||||
|
$(".next-captcha").click(function (e) {
|
||||||
|
e.preventDefault();
|
||||||
|
$.getJSON("{% url 'refresh-captcha' %}", function (json) {
|
||||||
|
// This should update your captcha image src and captcha hidden input
|
||||||
|
// debugger;
|
||||||
|
var status = json['status'];
|
||||||
|
console.log(status);
|
||||||
|
console.log("6666666666666666666666666666666");
|
||||||
|
var new_cptch_key = json['new_cptch_key'];
|
||||||
|
var new_cptch_image = json['new_cptch_image'];
|
||||||
|
id_captcha_0 = $("#id_reg_captcha_0");
|
||||||
|
img = $(".captcha");
|
||||||
|
id_captcha_0.attr("value", new_cptch_key);
|
||||||
|
img.attr("src", new_cptch_image);
|
||||||
|
});
|
||||||
|
|
||||||
|
});
|
||||||
|
})
|
||||||
|
</script>
|
||||||
|
{% endblock %}
|
|
@ -93,6 +93,7 @@
|
||||||
</form>
|
</form>
|
||||||
<p id="nav">
|
<p id="nav">
|
||||||
<a class="pull-left" href="#" title="Password Lost and Found">忘记密码</a>
|
<a class="pull-left" href="#" title="Password Lost and Found">忘记密码</a>
|
||||||
|
<a href="{% url 'dashboard-login-for-phone' %}" title="Password Lost and Found" style="margin-left: 30%">手机号登录</a>
|
||||||
<a class="pull-right" href="{% url 'dashboard-register' %}" title="Sign Up">注册</a>
|
<a class="pull-right" href="{% url 'dashboard-register' %}" title="Sign Up">注册</a>
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
|
@ -10,7 +10,6 @@
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</ul>
|
</ul>
|
||||||
<script>
|
<script>
|
||||||
|
|
||||||
$(function () {
|
$(function () {
|
||||||
console.log("2222222222222222")
|
console.log("2222222222222222")
|
||||||
$('.autocomplete-panel-item').click(function (e) {
|
$('.autocomplete-panel-item').click(function (e) {
|
||||||
|
|
|
@ -0,0 +1,40 @@
|
||||||
|
import http.client
|
||||||
|
from urllib import parse
|
||||||
|
import json
|
||||||
|
#服务地址
|
||||||
|
sms_host = "sms.yunpian.com"
|
||||||
|
voice_host = "voice.yunpian.com"
|
||||||
|
#端口号
|
||||||
|
port = 443
|
||||||
|
#版本号
|
||||||
|
version = "v2"
|
||||||
|
#模板短信接口的URI
|
||||||
|
sms_tpl_send_uri = "/" + version + "/sms/tpl_single_send.json"
|
||||||
|
|
||||||
|
def tpl_send_sms(apikey, tpl_id, tpl_value, mobile):
|
||||||
|
"""
|
||||||
|
模板接口发短信
|
||||||
|
"""
|
||||||
|
params = parse.urlencode({
|
||||||
|
'apikey': apikey,
|
||||||
|
'tpl_id': tpl_id,
|
||||||
|
'tpl_value': parse.urlencode(tpl_value),
|
||||||
|
'mobile': mobile
|
||||||
|
})
|
||||||
|
headers = {
|
||||||
|
"Content-type": "application/x-www-form-urlencoded",
|
||||||
|
"Accept": "text/plain"
|
||||||
|
}
|
||||||
|
conn = http.client.HTTPSConnection(sms_host, port=port, timeout=30)
|
||||||
|
conn.request("POST", sms_tpl_send_uri, params, headers)
|
||||||
|
response = conn.getresponse()
|
||||||
|
response_str = response.read()
|
||||||
|
conn.close()
|
||||||
|
return response_str
|
||||||
|
#【甘肃大未来科技】政务新媒体监测预警:#dateStart#至#dateEnd#,#type# #name# 无更新,请予以关注提醒。
|
||||||
|
|
||||||
|
apikey = "304eb08353f7ebf00596737acfc31f53"
|
||||||
|
mobile = "18119305139"
|
||||||
|
tpl_id = 4041392 #【甘肃大未来科技】政务新媒体监测预警:#dateStart#至#dateEnd#,#type# #name# 无更新,请予以关注提醒。
|
||||||
|
tpl_value = {'#dateStart#':'10月1日','#dateEnd#':'10日','#type#':'微信公众号','#name#':'武山县人民政府网'}
|
||||||
|
print (tpl_send_sms(apikey, tpl_id, tpl_value, mobile) )
|
|
@ -6,6 +6,9 @@ from dashboard import views
|
||||||
urlpatterns = [
|
urlpatterns = [
|
||||||
path('index/', views.index, name='dashboard-index'),
|
path('index/', views.index, name='dashboard-index'),
|
||||||
path('', views.user_login, name='dashboard-login'),
|
path('', views.user_login, name='dashboard-login'),
|
||||||
|
path('user/login/for/phone/', views.user_login_for_phone, name='dashboard-login-for-phone'),
|
||||||
|
#发送手机验证码
|
||||||
|
path('author/code/',views.author_code,name='author-code'),
|
||||||
path('refresh_captcha/', views.refresh_captcha, name='refresh-captcha'),
|
path('refresh_captcha/', views.refresh_captcha, name='refresh-captcha'),
|
||||||
path('logout/', views.user_logout, name='dashboard-logout'),
|
path('logout/', views.user_logout, name='dashboard-logout'),
|
||||||
path('register/', views.register, name='dashboard-register'),
|
path('register/', views.register, name='dashboard-register'),
|
||||||
|
|
|
@ -1,8 +1,12 @@
|
||||||
import json
|
import json
|
||||||
|
import http.client
|
||||||
|
import random
|
||||||
|
import time
|
||||||
|
from urllib import parse
|
||||||
from captcha.helpers import captcha_image_url
|
from captcha.helpers import captcha_image_url
|
||||||
from captcha.models import CaptchaStore
|
from captcha.models import CaptchaStore
|
||||||
from dateutil import relativedelta
|
from dateutil import relativedelta
|
||||||
|
from django.conf import settings
|
||||||
from django.contrib import messages
|
from django.contrib import messages
|
||||||
from django.contrib.auth import logout, authenticate, login
|
from django.contrib.auth import logout, authenticate, login
|
||||||
from django.contrib.auth.models import User
|
from django.contrib.auth.models import User
|
||||||
|
@ -12,7 +16,9 @@ from django.shortcuts import render
|
||||||
import datetime
|
import datetime
|
||||||
|
|
||||||
# Create your views here.
|
# Create your views here.
|
||||||
from dashboard.models import Userprofile, Organization, Area_code_2020, Weixin, Weibo, Toutiao, Qita, News, Douyin
|
from dashboard.models import Userprofile, Organization, Area_code_2020, Weixin, Weibo, Toutiao, Qita, News, Douyin, \
|
||||||
|
CheckCode
|
||||||
|
from dashboard.yunpian import YunPian
|
||||||
|
|
||||||
|
|
||||||
def refresh_captcha(request):
|
def refresh_captcha(request):
|
||||||
|
@ -78,7 +84,72 @@ def user_login(request):
|
||||||
messages.error(request, '账号或密码错误,请您确认账号和密码')
|
messages.error(request, '账号或密码错误,请您确认账号和密码')
|
||||||
return render(request, 'dashboard/login.html', {'hash_key': hash_key, 'image_url': image_url})
|
return render(request, 'dashboard/login.html', {'hash_key': hash_key, 'image_url': image_url})
|
||||||
|
|
||||||
|
def user_login_for_phone(request):
|
||||||
|
if request.method == 'GET':
|
||||||
|
return render(request,'dashboard/login-for-phone.html')
|
||||||
|
elif request.method == 'POST':
|
||||||
|
p_code = request.POST.get('check_code')
|
||||||
|
phone = request.POST.get('phone')
|
||||||
|
try:
|
||||||
|
check_code = CheckCode.objects.get(phone_code=p_code, phone=phone)
|
||||||
|
if float(time.time()) - float(check_code.c_time) > 60:
|
||||||
|
check_code.delete()
|
||||||
|
return '验证码超时已被删除'
|
||||||
|
print(21333333333)
|
||||||
|
check_code.delete()
|
||||||
|
return '登录成功'
|
||||||
|
except:
|
||||||
|
print(1233333333)
|
||||||
|
def author_code(request):
|
||||||
|
sms_host = "sms.yunpian.com"
|
||||||
|
voice_host = "voice.yunpian.com"
|
||||||
|
# 端口号
|
||||||
|
port = 443
|
||||||
|
# 版本号
|
||||||
|
version = "v2"
|
||||||
|
# 模板短信接口的URI
|
||||||
|
sms_tpl_send_uri = "/" + version + "/sms/tpl_single_send.json"
|
||||||
|
# if request.method == 'GET':
|
||||||
|
# phone = request.POST.get('phone')
|
||||||
|
apikey = "304eb08353f7ebf00596737acfc31f53"
|
||||||
|
mobile = "18119305139"
|
||||||
|
tpl_id = 4041392
|
||||||
|
|
||||||
|
str = ""
|
||||||
|
for i in range(6):
|
||||||
|
ch = chr(random.randrange(ord('0'), ord('9') + 1))
|
||||||
|
str += ch
|
||||||
|
print(str)
|
||||||
|
tpl_value = {'#dateStart#': '10月1日', '#dateEnd#': '10日', '#type#': '微信公众号', '#name#': str}
|
||||||
|
params = parse.urlencode({
|
||||||
|
'apikey': apikey,
|
||||||
|
'tpl_id': tpl_id,
|
||||||
|
'tpl_value': parse.urlencode(tpl_value),
|
||||||
|
'mobile': mobile
|
||||||
|
})
|
||||||
|
headers = {
|
||||||
|
"Content-type": "application/x-www-form-urlencoded",
|
||||||
|
"Accept": "text/plain"
|
||||||
|
}
|
||||||
|
conn = http.client.HTTPSConnection(sms_host, port=port, timeout=30)
|
||||||
|
conn.request("POST", sms_tpl_send_uri, params, headers)
|
||||||
|
response = conn.getresponse()
|
||||||
|
response_str = response.read()
|
||||||
|
conn.close()
|
||||||
|
return response_str
|
||||||
|
# return HttpResponse('ok')
|
||||||
|
# a = YunPian(settings.API_KEY)
|
||||||
|
# a.send_sms(phone_code, mobile)
|
||||||
|
# try:
|
||||||
|
# check_code = CheckCode.objects.get(phone=mobile)
|
||||||
|
#
|
||||||
|
# check_code.phone_code = phone_code
|
||||||
|
# check_code.save()
|
||||||
|
# except:
|
||||||
|
# print(phone_code, mobile, 1111111111)
|
||||||
|
# check_code = CheckCode(phone_code=phone_code, phone=mobile)
|
||||||
|
# check_code.save()
|
||||||
|
# return JsonResponse({'data': '验证码发送成功'})
|
||||||
def user_logout(request):
|
def user_logout(request):
|
||||||
logout(request)
|
logout(request)
|
||||||
return HttpResponseRedirect('/')
|
return HttpResponseRedirect('/')
|
||||||
|
@ -93,7 +164,7 @@ def register(request):
|
||||||
# phone = None
|
# phone = None
|
||||||
image = None
|
image = None
|
||||||
flag = False
|
flag = False
|
||||||
o = None
|
user_organization = None
|
||||||
sex = None
|
sex = None
|
||||||
hash_key = CaptchaStore.generate_key()
|
hash_key = CaptchaStore.generate_key()
|
||||||
image_url = captcha_image_url(hash_key)
|
image_url = captcha_image_url(hash_key)
|
||||||
|
@ -103,6 +174,7 @@ def register(request):
|
||||||
messages.error(request, '请选择单位')
|
messages.error(request, '请选择单位')
|
||||||
else:
|
else:
|
||||||
o = request.POST.get('organization')
|
o = request.POST.get('organization')
|
||||||
|
user_organization = Organization.objects.get(name=o).id
|
||||||
if not request.POST.get('name'):
|
if not request.POST.get('name'):
|
||||||
messages.error(request, '请输入姓名')
|
messages.error(request, '请输入姓名')
|
||||||
else:
|
else:
|
||||||
|
@ -159,9 +231,10 @@ def register(request):
|
||||||
# user.is_staff = True
|
# user.is_staff = True
|
||||||
# user.first_name = phone
|
# user.first_name = phone
|
||||||
|
|
||||||
userprofile = Userprofile(name=name, image=image, user_id=user.id, organization_id=o, sex=sex, status=0)
|
userprofile = Userprofile(name=name, image=image, user_id=user.id, organization_id=user_organization, sex=sex, status=0)
|
||||||
user.save()
|
|
||||||
userprofile.save()
|
userprofile.save()
|
||||||
|
user.save()
|
||||||
messages.success(request, '注册成功,请登录')
|
messages.success(request, '注册成功,请登录')
|
||||||
return HttpResponseRedirect('/')
|
return HttpResponseRedirect('/')
|
||||||
return render(request, 'dashboard/register.html',
|
return render(request, 'dashboard/register.html',
|
||||||
|
@ -225,6 +298,7 @@ def get_organization(request):
|
||||||
topten_list = []
|
topten_list = []
|
||||||
for i in o:
|
for i in o:
|
||||||
d = dict()
|
d = dict()
|
||||||
|
d['id'] = str(i.id)
|
||||||
d['name'] = i.name
|
d['name'] = i.name
|
||||||
if i.province:
|
if i.province:
|
||||||
d['province'] = Area_code_2020.objects.get(code=i.province).name
|
d['province'] = Area_code_2020.objects.get(code=i.province).name
|
||||||
|
|
|
@ -0,0 +1,22 @@
|
||||||
|
import requests
|
||||||
|
|
||||||
|
|
||||||
|
class YunPian(object):
|
||||||
|
def __init__(self, api_key):
|
||||||
|
self.api_key = api_key
|
||||||
|
self.single_send_url = 'https://sms.yunpian.com/v2/sms/single_send.json'
|
||||||
|
|
||||||
|
def send_sms(self, code, mobile):
|
||||||
|
params = {
|
||||||
|
'apikey': self.api_key,
|
||||||
|
'mobile': mobile,
|
||||||
|
'text': {'#dateStart#':'10月1日','#dateEnd#':'10日','#type#':'微信公众号','#name#':'武山县人民政府网'}
|
||||||
|
}
|
||||||
|
# text必须要跟云片后台的模板内容 保持一致,不然发送不出去!
|
||||||
|
r = requests.post(self.single_send_url, data=params)
|
||||||
|
print(r)
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
yun_pian = YunPian('304eb08353f7ebf00596737acfc31f53')
|
||||||
|
yun_pian.send_sms('1862', '18119305139')
|
Loading…
Reference in New Issue