第四步:網絡驗證的邏輯開發
1.將model注冊到adminx.py中
1.在apps/yanzheng目錄下新建admin.py 文件,添加代碼:
import xadmin from xadmin import views from .models import Cards class BaseSetting(object): """ 引入更換主題功能 """ enable_themes = True use_bootswatch = True class GlobalSettings(object): """ 頁頭和頁腳 """ site_title = "雪易網絡驗證后台" site_footer = "雪易網絡驗證" # menu_style = "accordion"#如果加上,后台的菜單會變成下拉式 class CardsAdmin(object): list_display = ['user', 'kacode', 'time', 'is_used'] search_fields = ['user', 'kacode', 'time', 'is_used'] list_filter = ['user', 'kacode', 'time', 'is_used'] xadmin.site.register(Cards, CardsAdmin) xadmin.site.register(views.BaseAdminView, BaseSetting) xadmin.site.register(views.CommAdminView, GlobalSettings)
2.修改apps/yanzheng/apps.py為:
from django.apps import AppConfig class YanzhengConfig(AppConfig): name = 'yanzheng' verbose_name='驗證'
這時,再重啟項目,登錄到http://127.0.0.1:8000/xadmin/ 發現數據表已經出現在了后台菜單中,同時頁頭和頁尾也變了。
2.網絡驗證幾個功能的開發:
功能分析:
1、注冊功能
2、登錄功能
3、心跳包功能
4、生產充值卡密功能
5、充值功能
6、修改密碼功能
顯然是要跨站post的,所以到settings.py中把csrf關了:
MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', #屏蔽掉下面這一行,跨站post才可以正常進行,不然會403錯誤 #'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', ]
1.注冊功能:
1.在apps/yanzheng/目錄下新建form.py文件用於post提交上來數據的初步驗證,寫入驗證注冊信息的代碼:
from django import forms from .models import UserProfile class RegisterForm(forms.Form): """注冊信息的驗證""" uid = forms.CharField(required=True, max_length=150, error_messages={ 'required': '用戶名不能為空.', 'max_length':'用戶名過長!'}) pwd = forms.CharField(required=True, max_length=128, error_messages={ 'required': '密碼不能為空.', 'max_length': "密碼過長!"}) def clean(self): """查看用戶名是否已經被占用""" uid=self.cleaned_data.get('uid','') u=UserProfile.objects.filter(username=uid) if u: raise forms.ValidationError('此用戶名已經被占用') else: return self.cleaned_data
2.在apps/yanzheng/views.py中寫相關邏輯代碼:
from django.views.generic import View from .form import RegisterForm from django.shortcuts import render,redirect from django.http import HttpResponse from .models import UserProfile, import re import time import datetime class RegisterView(View): """注冊""" def post(self,request): reg_form=RegisterForm(request.POST) if reg_form.is_valid(): uid=request.POST.get('uid','') pwd=request.POST.get('pwd','') u=UserProfile() u.username=uid u.password=pwd u.save() msg="注冊成功!" else: msg=str(reg_form.errors) if re.findall("注冊成功!",msg): return HttpResponse(0) elif re.findall("此用戶名已經被占用",msg): return HttpResponse(1) elif re.findall("用戶名不能為空",msg): return HttpResponse(2) elif re.findall("用戶名過長",msg): return HttpResponse(3) elif re.findall("密碼不能為空",msg): return HttpResponse(4) elif re.findall("密碼過長",msg): return HttpResponse(5) else: return HttpResponse(6)
3.在urls.py中配置路由:
#...... from yanzheng.views import RegisterView urlpatterns = [ #...... path('register',RegisterView.as_view()), ]
2.登錄功能:
1.在form.py 中增加對跟登錄有關的post過來的數據的驗證代碼:
class LoginForm(forms.Form): """登錄""" uid = forms.CharField(required=True,error_messages={'required': '用戶名不能為空.',}) pwd = forms.CharField(required=True,error_messages={'required': '密碼不能為空.',})
2.在views.py中添加登錄相關的邏輯代碼:
from django.views.generic import View from .form import RegisterForm,LoginForm from django.shortcuts import render,redirect from django.http import HttpResponse from .models import UserProfile import re import time import datetime class LoginView(View): """登錄""" def post(self,request): login_form=LoginForm(request.POST) if login_form.is_valid(): uid=request.POST.get('uid','') pwd=request.POST.get('pwd','') u=UserProfile.objects.filter(username=uid).first() if u.password==pwd: if not u.is_ban: u_endtime_stamp=int(time.mktime(u.end_time.timetuple())) nowtime_stamp=int(time.time()) if u_endtime_stamp>nowtime_stamp: u.end_time=u.end_time.strftime('%Y-%m-%d %H:%M:%S') msg="登錄成功,到期時間:"+u.end_time else: msg="該賬戶已無剩余時間,請充值!" else: msg='此賬戶已經被凍結' else: msg='密碼錯誤' else: msg=str(login_form.errors) if re.findall("登錄成功",msg): return HttpResponse(msg) elif re.findall("請充值",msg): return HttpResponse(11) elif re.findall("此賬戶已經被凍結",msg): return HttpResponse(12) elif re.findall("密碼錯誤",msg): return HttpResponse(13) elif re.findall("用戶名不能為空",msg): return HttpResponse(14) elif re.findall("密碼不能為空",msg): return HttpResponse(15) else: return HttpResponse(16)
3.在urls.py中配置路由:
#...... from yanzheng.views import RegisterView,LoginView urlpatterns = [ #...... path('login',LoginView.as_view()), ]
3.心跳包功能:
1.這個雖然也是post數據,但是個人感覺沒必要寫form
2.在views.py中相關邏輯代碼:
from django.views.generic import View from django.http import HttpResponse from .models import UserProfile import re import time import datetime class PingView(View): """心跳包""" def post(self,request): uid = request.POST.get('uid', '') pwd = request.POST.get('pwd', '') u = UserProfile.objects.filter(username=uid).first() u_endtime_stamp = int(time.mktime(u.end_time.timetuple())) nowtime_stamp = int(time.time()) if u_endtime_stamp > nowtime_stamp: msg='0' else: msg ='1' return HttpResponse(msg)
3.在urls.py中配置路由:
#...... from yanzheng.views import RegisterView,LoginView,PingView urlpatterns = [ #...... path('ping',PingView.as_view()), ]
4.生產充值卡密功能:
1.我特意為充值卡密開發一個網頁
1.在templates目錄下新建一個html文件:index.html
2.到網上找一些素材模板,裝飾網頁,css文件放在static/css目錄下,js文件放在static/js目錄下,圖片文件放在media/image目錄下
3.為了引用到圖片文件,在apps/yanzheng目錄下的models.py中,為圖片文件的路徑建一個表:
class bg(models.Model): image=models.ImageField(upload_to='image',verbose_name='背景圖',default='image/bg.jpg')
然后打開Terminal執行經典的數據更新命令:
python manage.py makemigrations
python manage.py migrate
當然,2、3兩個步驟,只是為了讓生成卡密的網頁顯得更好看,而好看這件事,仁者見仁智者見智,讀者需要自己去網上挑選自己喜歡的網頁模板。
4.index.html文件代碼:
<!doctype html> {% load staticfiles %} <html lang="en"> <head> <meta charset="UTF-8"> <title>卡密工廠</title> <style> html{ background-image:url({{ MEDIA_URL }}{{ bgt.image }}); background-repeat:no-repeat; background-size:100% 100%; -moz-background-size:100% 100%; } </style> <link rel="stylesheet" type="text/css" href="{% static 'css/index.css' %}"> </head> <body> <form action="{% url 'card' %}" method="post"> <input type="hidden" name="key" value="{{ key }}"> <h1 id="info" style="color:red">{{ msg }}</h1> <label for="nums">生產張數:</label> <input type="text" name="nums" id="nums" value="100"/> <label for="unit">時間面值:</label> <select name="unit" id="unit"> <option value="0">小時</option> <option value="1" selected>天</option> <option value="2">星期</option> <option value="3">月</option> <option value="4">三月</option> <option value="5">半年</option> <option value="6">年</option> </select> <input type="submit" value="確認生產" style="cursor:pointer" onclick="info()"> </form> <script type="text/javascript" src="{% static 'js/index.js' %}"></script> <script> function info() { document.getElementById('info').innerHTML='正在生產卡密,請稍等……' } </script> </body> </html>
5.在views.py中開發 生產卡密功能的get方法:
生成卡密的頁面的view不能誰都可以訪問,為了安全起見,需要做一個登錄驗證限制!
我們項目中的views.py里寫的每個功能,都是基於類來實現的,而django自帶的“登錄驗證限制訪問” 裝飾器@login_required是不能使用了。
所以我們要自己定義一個腳本模塊來實現基於類的登錄限制訪問。
首先在apps目錄下,新建目錄untils,再在該目錄下新建py文件:mixin_untils.py 加入代碼:
from django.contrib.auth.decorators import login_required from django.utils.decorators import method_decorator class LoginRequiredMinxin(object): @method_decorator(login_required(login_url='/xadmin/')) def dispatch(self,request,*args,**kwargs): return super(LoginRequiredMinxin,self).dispatch(request,*args,**kwargs)
在views.py中開發生產卡密功能的get方法
from django.views.generic import View from .form import RegisterForm,LoginForm from django.shortcuts import render,redirect from django.http import HttpResponse from .models import UserProfile,Cards,bg import re import time import datetime import hashlib from netauth.settings import SECRET_KEY from untils.mixin_utils import LoginRequiredMinxin #...... class CardView(LoginRequiredMinxin,View): """生成卡密""" def get(self,request): key=request.user.password bgt=bg.objects.all().first() return render(request,'index.html',{'bgt':bgt,'key':key})
6.在urls.py中配置路由:
#...... from yanzheng.views import RegisterView,LoginView,PingView,CardView urlpatterns = [ #...... path('card',CardView.as_view(),name='card'), ]
然后運行django項目,瀏覽器get訪問:http://127.0.0.1:8000/card 在登錄以后,會看到下面這樣一個效果頁面:(當然了,再次強調,html文件是必須的,css和js文件,以及圖片文件,這些網頁的裝修方式,讀者可以根據自己的審美,自己去網上選素材,或者自己編寫。)
2.補齊views.py中生產卡密相關類的post方法:
class CardView(LoginRequiredMinxin,View): """生成卡密""" def get(self,request): key=request.user.password bgt=bg.objects.all().first() return render(request,'index.html',{'bgt':bgt,'key':key}) def post(self,request): key=request.POST.get('key','') if key==request.user.password: nums = request.POST.get('nums', '') if nums.isdigit(): n=abs(int(nums)) u=request.POST.get('unit','') for i in range(n): j = str(int(time.time())) k = str(i) l = j + k + SECRET_KEY i = hashlib.sha256() i.update(l.encode('utf8')) card=Cards() card.kacode=i.hexdigest() if u=='0': card.time=3600 elif u=='1': card.time = 3600*24 elif u=='2': card.time = 3600*24*7 elif u=='3': card.time = 3600*24*31 elif u=='4': card.time = 3600*24*31*3 elif u=='5': card.time = 3600*24*31*6 elif u=='6': card.time = 3600*24*31*12 card.save() return redirect('/xadmin/yanzheng/cards/') else: msg='生產張數必須是整數' else: msg='驗證失敗' return render(request,'index.html',{'msg':msg})
5.充值功能:
1.在form.py中寫對post過來的充值相關數據驗證的代碼:
from django import forms from .models import UserProfile class RechangForm(forms.Form): """充值驗證""" uid = forms.CharField(required=True, error_messages={'required': '用戶名不能為空.', }) code=forms.CharField(required=True, error_messages={'required': '卡密不能為空.', }) def clean(self): """查看用戶名是否存在""" uid=self.cleaned_data.get('uid','') u=UserProfile.objects.filter(username=uid) if u: return self.cleaned_data else: raise forms.ValidationError('此用戶名不存在')
2.在views.py中開發充值相關的代碼:
from django.views.generic import View from .form import RegisterForm,LoginForm,RechangForm,ResetPwdForm from django.shortcuts import render,redirect from django.http import HttpResponse from .models import UserProfile,Cards,bg import re import time import datetime import hashlib from netauth.settings import SECRET_KEY from untils.mixin_utils import LoginRequiredMinxin class RechargeView(View): """充值""" def post(self,request): rechange_form=RechangForm(request.POST) if rechange_form.is_valid(): code=request.POST.get('code','') card=Cards.objects.filter(kacode=code).last() if not card.is_used: t=card.time uid=request.POST.get('uid','') u=UserProfile.objects.filter(username=uid).first() u_endtime_stamp = int(time.mktime(u.end_time.timetuple())) nowtime_stamp = int(time.time()) #如果此賬戶本來的到期時間還沒到,在他的到期時間基礎上加時間,否則在現在的基礎上加時間 if u_endtime_stamp>nowtime_stamp: end_time=t+u_endtime_stamp u.end_time=datetime.datetime.fromtimestamp(end_time) else: end_time = t + nowtime_stamp u.end_time = datetime.datetime.fromtimestamp(end_time) msg=u.end_time.strftime('%Y-%m-%d %H:%M:%S') card.is_used = True card.user = u card.save() u.save() msg='充值成功!到期時間為:'+msg else: msg='此充值卡已使用過了!' else: msg=str(rechange_form.errors) if re.findall("充值成功",msg): return HttpResponse(msg) elif re.findall("此充值卡已使用過了!",msg): return HttpResponse(21) elif re.findall("此用戶名不存在",msg): return HttpResponse(22) elif re.findall("用戶名不能為空",msg): return HttpResponse(23) elif re.findall("卡密不能為空",msg): return HttpResponse(24) else: return HttpResponse(25)
3.在urls.py中配置路由:
#...... from yanzheng.views import RegisterView,LoginView,PingView,CardView,RechargeView urlpatterns = [ #...... path('recharge',RechargeView.as_view()), ]
6、修改密碼功能:
1.在form.py中寫對post過來的修改密碼相關數據驗證的代碼:
from django import forms from .models import UserProfile class ResetPwdForm(forms.Form): """重置密碼驗證""" uid = forms.CharField(required=True, error_messages={'required': '用戶名不能為空.', }) pwd1 = forms.CharField(required=True, error_messages={'required': '舊密碼不能為空.', }) pwd2 = forms.CharField(required=True, error_messages={'required': '新密碼不能為空.', }) def clean(self): """查看用戶名是否存在""" uid=self.cleaned_data.get('uid','') u=UserProfile.objects.filter(username=uid) if u: return self.cleaned_data else: raise forms.ValidationError('此用戶名不存在')
2.在views.py中開發重置密碼相關的代碼:
from django.views.generic import View from .form import RegisterForm,LoginForm,RechangForm,ResetPwdForm from django.shortcuts import render,redirect from django.http import HttpResponse from .models import UserProfile,Cards,bg import re import time import datetime import hashlib from netauth.settings import SECRET_KEY from untils.mixin_utils import LoginRequiredMinxin class ResetPwdView(View): """重置密碼""" def post(self,request): resetpwd_form=ResetPwdForm(request.POST) if resetpwd_form.is_valid(): uid=request.POST.get('uid','') u=UserProfile.objects.filter(username=uid).first() if u.password==request.POST.get('pwd1',''): u.password=request.POST.get('pwd2','') u.save() msg='修改密碼成功!' else: msg='舊密碼錯誤' else: msg=str(resetpwd_form.errors) if re.findall("修改密碼成功",msg): return HttpResponse(30) elif re.findall("舊密碼錯誤",msg): return HttpResponse(31) elif re.findall("此用戶名不存在",msg): return HttpResponse(32) elif re.findall("用戶名不能為空",msg): return HttpResponse(33) elif re.findall("舊密碼不能為空",msg): return HttpResponse(34) elif re.findall("新密碼不能為空",msg): return HttpResponse(35) else: return HttpResponse(36)
3.在urls.py中配置路由:
from django.contrib import admin from django.urls import path import xadmin from django.views.static import serve from netauth.settings import MEDIA_ROOT from yanzheng.views import RegisterView,LoginView,PingView,CardView,RechargeView,ResetPwdView urlpatterns = [ path('admin/', admin.site.urls), path('xadmin/', xadmin.site.urls), path('media/<path:path>',serve,{'document_root':MEDIA_ROOT}), path('register',RegisterView.as_view()), path('login',LoginView.as_view()), path('ping',PingView.as_view()), path('card',CardView.as_view(),name='card'), path('recharge',RechargeView.as_view()), #修改密碼路徑 path('resetpwd',ResetPwdView.as_view()), ]
3.優化+api文檔
1.優化
生產卡密的頁面,需要在xadmin后台有一個一鍵跳轉,在extra_apps/xadmin/templates/xadmin/base_site.html文件里找到頁面頭部div進行添加改寫:
<!--……--> <div id="top-nav" class="navbar navbar-xs navbar-inverse navbar-fixed-top"> <div class="navbar-header"> <a class="navbar-brand" href="/xadmin/">{% block branding %}{{ site_title }}{% endblock %}</a> </div> <!--增加一鍵跳轉到生產卡密網頁的圖標--> <a class="navbar-brand" href="/card">去生產卡密</a> <!--……-->
效果圖:
2.api文檔開發:
在項目目錄下新建:API文檔.py代碼:(我將文檔寫成了一個字典形式)
api={ 'host':'http://localhost:8000/', 'register':{ 'url':'host'+'register', 'method':'post', 'data':'uid='+'用戶名'+';pwd='+'密碼', '返回':{ 0:'注冊成功!', 1:'該用戶名已被占用', 2:'用戶名不能為空', 3:'用戶名過長,不能超過150位', 4:'密碼不能為空', 5:'密碼過長,不能超過128', 6:'未知錯誤', } }, 'login':{ 'url':'host'+'login', 'method':'post', 'data':'uid='+'用戶名'+';pwd='+'密碼', '返回':{ 'msg':'"登錄成功,到期時間:"+u.end_time', 11:'該賬戶已無剩余時間,請充值!', 12:'此賬戶已經被凍結', 13:'密碼錯誤', 14:'用戶名不能為空', 15:'密碼不能為空', 16:'未知錯誤' } }, 'ping':{ 'url':'host'+'ping', 'method':'post', 'data':'uid='+'用戶名'+';pwd='+'密碼', '返回':{ 0:'正常使用,未到期', 1:'軟件到期' }, }, 'card':{ '功能':'生成卡密', 'url':'host'+'card', 'method':'get'+'post', 'get':{ 'render':'index.html' }, 'post':{ 'data':{'nums':'生成張數','unit':'時間單位'} }, }, 'recharge':{ 'url':'host'+'recharge', 'method':'post', 'data':'uid='+'用戶名'+';code='+'密碼', '返回':{ 'msg':'充值成功', 21:'此充值卡已使用過了!', 22:'此用戶名不存在', 23:'用戶名不能為空', 24:'卡密不能為空', 25:'未知錯誤' }, }, 'resetpwd':{ 'url':'host'+'resetpwd', 'method':'post', 'data':'uid='+'用戶名'+';pwd1='+'舊密碼'+';pwd2='+'新密碼', '返回':{ 30:'修改密碼成功', 31:'舊密碼錯誤', 32:'此用戶名不存在', 33:'用戶名不能為空', 34:'舊密碼不能為空', 35:'新密碼不能為空', 36:'未知錯誤' }, } }
至此,服務端的代碼算是開發完啦!鼓掌!
第五步:易語言客戶端開發
易語言是一門中文編程語言,語法跟python奇像無比,簡直就是中文版python,而且易語言還生下來自帶IDE,開發軟件的交互界面,簡單方便不需要用鍵盤,用鼠標一根手指就可以完成,所以,在開發.exe軟件方面,沒有什么編程語言可以在易語言面前自稱功能強大。
1.易語言開發軟件交互界面(嗯,這個沒有什么好講的,小學生自學二十分鍾都能做出來的,直接上效果圖):
2.易語言代碼(因為博客園的富文本編輯框中,不支持易語言代碼所以有些失真,不過邏輯還可以看得出來):

.版本 2 .支持庫 spec .支持庫 EThread .程序集 窗口程序集_啟動窗口 .子程序 _按鈕1_被單擊, , , 注冊 .局部變量 url, 文本型, , , 網址 .局部變量 data, 文本型, , , 提交數據 .局部變量 str, 文本型, , , 返回數據 .如果真 (編輯框2.內容 ≠ 編輯框3.內容) 信息框 (“兩次輸入密碼不一致!”, 0, , ) 返回 () .如果真結束 url = host + “register” data = “uid=” + 編輯框1.內容 + “;pwd=” + 編輯框2.內容 str = 到文本 (網頁_訪問_對象 (url, 1, data, , )) .如果 (str = “0”) 信息框 (“恭喜注冊成功!快去充值登錄吧!”, 0, , ) 賬號 = 編輯框1.內容 密碼 = 編輯框2.內容 編輯框4.內容 = 賬號 編輯框5.內容 = 密碼 編輯框11.內容 = 賬號 編輯框7.內容 = 賬號 返回 () .否則 .如果 (str = “1”) 信息框 (“該用戶名已被占用”, 0, , ) 返回 () .否則 .如果 (str = “2”) 信息框 (“用戶名不能為空”, 0, , ) 返回 () .否則 .如果 (str = “3”) 信息框 (“用戶名過長,不能超過150位”, 0, , ) 返回 () .否則 .如果 (str = “4”) 信息框 (“密碼不能為空”, 0, , ) 返回 () .否則 .如果 (str = “5”) 信息框 (“密碼過長,不能超過128”, 0, , ) 返回 () .否則 .如果 (str = “6”) 信息框 (“未知錯誤”, 0, , ) 返回 () .否則 .如果結束 .如果結束 .如果結束 .如果結束 .如果結束 .如果結束 .如果結束 .子程序 _按鈕2_被單擊, , , 登錄 .局部變量 url, 文本型, , , 網址 .局部變量 data, 文本型, , , 提交數據 .局部變量 str, 文本型, , , 返回數據 url = host + “login” data = “uid=” + 編輯框4.內容 + “;pwd=” + 編輯框5.內容 str = 到文本 (網頁_訪問_對象 (url, 1, data, , )) str = 編碼_URL解碼 (str, 真) .如果 (str = “11”) 信息框 (“該賬戶已無剩余時間,請充值!”, 0, , ) 返回 () .否則 .如果 (str = “12”) 信息框 (“此賬戶已經被凍結!”, 0, , ) 返回 () .否則 .如果 (str = “13”) 信息框 (“密碼錯誤!”, 0, , ) 返回 () .否則 .如果 (str = “14”) 信息框 (“用戶名不能為空”, 0, , ) 返回 () .否則 .如果 (str = “15”) 信息框 (“密碼不能為空”, 0, , ) 返回 () .否則 .如果 (str = “16”) 信息框 (“未知錯誤”, 0, , ) 返回 () .否則 .如果 (尋找文本 (str, “登錄成功”, , 假) ≠ -1) 賬號 = 編輯框4.內容 密碼 = 編輯框5.內容 時鍾1.時鍾周期 = 1000 ping = 0 載入 (窗口1, , 假) _啟動窗口.可視 = 假 到期時間 = str 信息框 (str, 0, , ) 返回 () .否則 .如果結束 .如果結束 .如果結束 .如果結束 .如果結束 .如果結束 .如果結束 .子程序 _按鈕3_被單擊, , , 充值 .局部變量 url, 文本型, , , 網址 .局部變量 data, 文本型, , , 提交數據 .局部變量 str, 文本型, , , 返回數據 url = host + “recharge” data = “uid=” + 編輯框11.內容 + “;code=” + 編輯框6.內容 str = 到文本 (網頁_訪問_對象 (url, 1, data, , )) str = 編碼_URL解碼 (str, 真) 調試輸出 (str) .如果 (str = “21”) 信息框 (“此充值卡已使用過了!”, 0, , ) 返回 () .否則 .如果 (str = “22”) 信息框 (“此用戶名不存在!”, 0, , ) 返回 () .否則 .如果 (str = “23”) 信息框 (“用戶名不能為空!”, 0, , ) 返回 () .否則 .如果 (str = “24”) 信息框 (“卡密不能為空!”, 0, , ) 返回 () .否則 .如果 (str = “25”) 信息框 (“未知錯誤!”, 0, , ) 返回 () .否則 .如果 (尋找文本 (str, “充值成功”, , 假) ≠ -1) 到期時間 = str 信息框 (str, 0, , ) 返回 () .否則 .如果結束 .如果結束 .如果結束 .如果結束 .如果結束 .如果結束 .子程序 _按鈕4_被單擊, , , 修改密碼 .局部變量 url, 文本型, , , 網址 .局部變量 data, 文本型, , , 提交數據 .局部變量 str, 文本型, , , 返回數據 .如果真 (編輯框9.內容 ≠ 編輯框10.內容) 信息框 (“兩次輸入密碼不一致!”, 0, , ) 返回 () .如果真結束 url = host + “resetpwd” data = “uid=” + 編輯框7.內容 + “;pwd1=” + 編輯框8.內容 + “;pwd2=” + 編輯框9.內容 str = 到文本 (網頁_訪問_對象 (url, 1, data, , )) str = 編碼_URL解碼 (str, 真) .如果 (str = “30”) 信息框 (“密碼修改成功!”, 0, , ) 返回 () .否則 .如果 (str = “31”) 信息框 (“舊密碼錯誤!”, 0, , ) 返回 () .否則 .如果 (str = “32”) 信息框 (“此用戶名不存在!”, 0, , ) 返回 () .否則 .如果 (str = “33”) 信息框 (“舊密碼不能為空!”, 0, , ) 返回 () .否則 .如果 (str = “34”) 信息框 (“舊密碼不能為空!”, 0, , ) 返回 () .否則 .如果 (str = “35”) 信息框 (“新密碼不能為空!”, 0, , ) 返回 () .如果 (str = “36”) 信息框 (“未知錯誤!”, 0, , ) 返回 () .否則 .如果結束 .否則 .如果結束 .如果結束 .如果結束 .如果結束 .如果結束 .如果結束 .子程序 __啟動窗口_創建完畢 host = “http://localhost:8000/” .子程序 _時鍾1_周期事件 啟動線程 (&心跳, , ) .如果真 (ping > 5) 時鍾1.時鍾周期 = 0 信息框 (“與服務器斷開連接!”, 0, , ) 結束 () .如果真結束 .子程序 心跳, , , ping .局部變量 url, 文本型, , , 網址 .局部變量 data, 文本型, , , 提交數據 .局部變量 str, 文本型, , , 返回數據 url = host + “ping” data = “uid=” + 賬號 + “;pwd=” + 密碼 str = 到文本 (網頁_訪問_對象 (url, 1, data, , )) ping = ping + 1 .如果真 (str ≠ “”) ping = ping - 1 .如果真結束 .如果 (str = “0”) 返回 () .否則 .如果 (str = “1”) 時鍾1.時鍾周期 = 0 信息框 (“您的軟件已到期,請充值!”, 0, , ) 結束 () .否則 .如果結束 .如果結束
至此,python3+django2開發易語言網絡驗證的服務器端+客戶端都算開發完成啦!一個完整的項目,就這樣誕生啦!鼓掌!
然而,並不能高興太早,正如上一篇博客所說的那樣,這只是本套教程的第二部分,還有最恐怖的大BOSS:項目上線部署!下一篇博客,才是最嚴峻的!敬請期待!