python3+django2 开发易语言网络验证(中)

第四步:网络验证的逻辑开发

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"/>
    &nbsp;&nbsp;
    <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>
&nbsp;&nbsp;&nbsp;&nbsp;
    <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:项目上线部署!下一篇博客,才是最严峻的!敬请期待!

原文地址:https://www.cnblogs.com/xuepangzi/p/8981812.html

时间: 2024-11-10 04:17:02

python3+django2 开发易语言网络验证(中)的相关文章

python3+django2 开发易语言网络验证(上)

创作背景: 在某论坛中下载到一套php开发易语言网络验证的教程,照着看下来,花了两天的时间,结果发现教程里开发的网络验证,以及随着教程一起给学员的源码,都存在着根本用不了的bug!我想要看看能不能在原本的基础上修改,却出现了一大堆坑,不是这儿少个$ ,就是那少个 ;  要不就是哪{}包的不对了,擦,不是说php是世界上最好的语言吗?怎么感觉是世界上最坑的语言呢? 也许因为一般的程序员都是从C启蒙,进而C++,后又转Java,忽然见到php,顿时感觉简单明快,好像见到亲人了似的:而我易语言启蒙,进

易语言 网络编程

易语言如何进行套接字(Socket)呢,它比较麻烦些因为一般是别人提供易语言模块 不过也有 个弱点易模块开发者基本是个人性质有些人会恶作剧编写一些非法性质的代码,那么这就会 造成一种安全隐患,那么回到正题我们如何去编写Socket应用,不过首先我建议首先封装. 上图是一个简单的Client / Server调用易模块的示例代码,本人不是一名合格的易程序员而 是.NET上的一名程序员,所以在我封装命名上是按照.NET上Socket的一些风格,不过对于 你们查阅代码而言并不会有多大影响. Socke

COM对象在易语言中的理解和使用

在windows编程中,会用到COM对象,那什么是COM对象呢?如果第一次接触,一定是不好理解这个概念的!我记得我第一次接触COM对象这个概念的时候,可以说是一头雾水! 什么是COM对象?下面是个人看了很多资料和实践所得到的理解: 一 com对象跟对象编程里面的对象概念应该是一样的,都是对象.竟然都是对象,那么一定都有属性和方法. 二 com对象,官方说法是组件对象模型(compoment object model),他是一组规范,是MicroSoft创建的一组二进制和网络标准,用于解决两个组件

网络采集软件核心技术剖析系列(3)---如何使用C#语言下载博文中的全部图片到本地并可以离线浏览

一 本系列随笔概览及产生的背景 本系列开篇受到大家的热烈欢迎,这对博主是莫大的鼓励,此为本系列第三篇,希望大家继续支持,为我继续写作提供动力. 自己开发的豆约翰博客备份专家软件工具问世3年多以来,深受广大博客写作和阅读爱好者的喜爱.同时也不乏一些技术爱好者咨询我,这个软件里面各种实用的功能是如何实现的. 该软件使用.NET技术开发,为回馈社区,现将该软件中用到的核心技术,开辟一个专栏,写一个系列文章,以飨广大技术爱好者. 本系列文章除了讲解网络采编发用到的各种重要技术之外,也提供了不少问题的解决

D语言在VS中的开发环境配置 &ndash; Visual-D插件

VS作为windows下强大的开发工具,这里不作介绍.要使用VS工具来开发D语言需要使用到以下几个工具VS的一个插件VisualD插件及DMD编译器. 一.下载相关工具 1.下载Visual Studio工具 VS可以在http://msdn.itellyou.cn/网站上下载,这个网站比较稳定,如下图所示,我下载的是Visual Studio 2013 Update 3,这个工具共有3.98GB,软件比较大,使用迅雷下载比较好. 2.下载DMD编译器 DMD是D语言的一种编译器,该编译器自2.

易语言等软件自动获取管理员权限,在64位Windows7系统非管理员帐户中执行

昨天有易语言开发者向我求助,说他用易语言编译的32位程序软件,发布给64位操作系统Win 7用户使用,因为该用户确定没有管理员权限,而程序启动时又要求必须输入管理员密码,如此陷入困境. 目标企业用户管理严格,要求为普通用户分配管理员权限是不切实际的,只能开发人员从软件开发的角度在技术上解决. 我听到这个问题后,第一感觉是微软用户帐户控制(UAC)引发的,估计通过给 exe 添加特定的 manifest 资源应该可以解决.于是我给了他一段代码,让他用 ResHacker 之类的软件添加到软件里面去

Python3+ Django2.7开发web排坑记001

今天用Python3+Django开发第一个web项目,记录碰到的第一个坑. 用django命令创建项目后,运行manage.py就能在本地默认的127.0.0.1:8000看到页面启动了. 当你想把显示的页面改成中午,第一个坑就出现了. 我一开始照着书上教程把 settings.py 的 LANGUAGE_CODE 改成了zh-Hans  然后报错了 啊!难受啊.为啥呢,查了半天网上的,有说改成zh-cn的  有说要改时区TIME_ZONE为亚洲/上海的  有说改成CCT的. 然后试来试去都不

易语言开发人工智能自动写文章软件!逆天了

我们今天要给大家分享一款可以自动写原创文章的软件,是我自己开发的,开发原理其实很简单,对接了网上某人工智能平台的API,实现了自动写文章的功能! 软件使用的文章渲染算法也是基于:乔姆斯基转换-生成语法进行生成的,效果还是不错!通过这个软件,你每天生成上万篇文章应该是不在话下,而且是原创的哦!软件的实现功能用的是易语言!我们先来抓包吧!数据我们已经抓包了,下面做的就是把数据封包到易语言子程序里面!我们已经把抓包到的数据已经封装到了易语言的子程序里面,然后通过"调试输出"成功返回正确的AP

新手如何制作防破解网络验证系统?

百宝云介绍 百宝云是一款云服务器产品,专为快速打造个人云端服务器的云应用产品.你不用懂任何高深的技术,只需要懂百宝云的脚本语言即可,百宝云的脚本语言支持中文开发和英文开发,一个开发菜鸟也能轻轻松松上手开发自己的网络服务,百宝云提供完善的全套服务.强大的第三方接口可以和任何开发语言对接,开发者无需变更自己熟悉的开发环境,仅仅需要按照百宝云语言规范,通过com组件,Get或者Post的方式即可轻松访问自己的云端服务器. 百宝云提供的不仅仅是一种虚拟机或者一个操作系统,而是全面的,统一规划的网络服务架