百宝云注册码系统新手教程

第三章:百宝云实例演练

第三节:注册码系统

3.1注册码系统的设计图:

百宝云注册码系统新手教程_第1张图片

注册码系统一般都有以下这些功能:

1)试用

2)生成注册码

3)解绑注册码

4)冻结注册码

5)解冻注册码

6)删除注册码

7)续费注册码

3.2试用功能

由于要在存储试用的一些数据,因此需要使用到数据库来存储,下面是数据库试用内容。

试用

字段

字段描述

id

序号整型数据,主键且为自增

pcid

机器码

begintime

试用开始时间

endtime

试用结束时间

num

试用次数

创建试用表的百宝云代码如下:

//创建试用数据表

functionsqlCreatTestDataBase()

var返回数组,ret

ret=sqlitesqlarray("regtest.db","createtableIFNOTEXISTStestManager(idintegerprimarykeyautoincrement,pcid,begintime,endtime,num);",返回数组)//创建表

if(!ret)

sendtextmsg("创建表失败:"&getlasterror(1))

returnfalse

else

returntrue

end

end

试用的数据库创建完成之后,需要完善试用的其他功能了,如:验证试用登录、获取使用时间。

验证试用登录主要是判断是否允许当前的机器试用软件,百宝云端代码如下:

//判断试用者是否可以验证通过

功能sqlCheckTesterLogin(pcID)

//通过传入的机器码,在数据库里查询,看数据库里是否有记录,没有则加入

变量sqlstr=字符串格式化("select*fromtestManagerwherepcid='%s';",pcID)

变量返回数组,ret,retmsg="登录失败:未知错误"

ret=sqlite数据库执行返回数组("regtest.db",sqlstr,返回数组)

如果(返回数组!=null)

发送文本消息("Select="&返回数组)

//判断当前机器码的试用次数是否达到设定的最大值

变量num=返回数组[0]["num"]

发送文本消息("试用次数="&num)

如果(num>100)

retmsg="失败:试用次数达到最大值"

发送文本消息("失败:试用次数达到最大值")

返回"false"

结束

num++

变量begintime=当前时间()

变量endtime=指定时间("n",20,begintime)//试用时间20分钟

变量update=字符串格式化("updatetestManagersetnum='%s',begintime='%s',endtime='%s'wherepcid='%s';",num,begintime,endtime,pcID)

发送文本消息("SQL:"&update)

ret=sqlite数据库执行返回数组("regtest.db",update,返回数组)

retmsg="true"

否则

//第一次试用软件

变量begintime=当前时间()

变量endtime=指定时间("n",20,begintime)//试用时间20分钟

变量insert=字符串格式化("insertintotestManager(pcid,begintime,endtime,num)values('%s','%s','%s','1')",pcID,begintime,endtime)

发送文本消息("SQL:"&insert)

ret=sqlite数据库执行返回数组("regtest.db",insert,返回数组)

retmsg="true"

结束

返回retmsg

结束

获取用户试用的剩余时间,方便在软件里限制运行的时间。百宝云端代码如下:

//查询剩下的试用时间

功能sql查询试用时间(pcid)

//参数格式:机器码

变量sqlstr=字符串格式化("select*fromtestManagerwherepcid='%s';",pcid)

变量返回数组,ret,retMsg

ret=sqlite数据库执行返回数组("regtest.db",sqlstr,返回数组)

如果(返回数组==null)

发送文本消息("Error:"&获取错误信息(1))

retMsg="-1"

否则

变量begintime=返回数组[0]["begintime"]

变量endtime=返回数组[0]["endtime"]

变量nowtime=当前时间()

变量min=时间间隔("n",nowtime,endtime)

发送文本消息("leaveTime:"&min)

retMsg=min//返回剩余的时间:多少分钟

结束

返回retMsg

结束

为了注册码系统可以适用多平台,这里就使用百宝云内置的事件_post,把试用的验证查询试用剩余时间都通过post请求来完成。

post传入的第二个参数一个json格式的数据,格式为{"flag":"表示验证试用还是查询时间","pcid":"机器码"}

百宝云端的代码如下:

//执行客户端发来的post请求,并返回执行的结果,以网页源码的形式返回.

功能_post(token,arg)

发送文本消息("_post:"&arg)

变量paramArr=json转数组(arg)

如果(!是否数组(paramArr))

返回"错误的参数列表"

结束

变量flag=paramArr["flag"]

变量pcID=paramArr["pcid"]

选择(flag)

条件"试用"

返回sqlCheckTesterLogin(pcID)

条件"试用时间"

返回sql查询试用时间(pcID)

结束

结束

这样,客户端只需要使用post请求访问百宝云就可以完成:试用的验证以及查询试用剩余时间。

注册码系统的试用功能就这样完成了。

TC语言使用此试用系统的代码如下:

//Post方法与百宝云应用通信

功能runBbyFunctionPost(arg)

//post提交

变量token="aac5ddb832bbca6d2db00a7557152d5c"

变量params="token="&token&"&funparams="&arg

变量url="http://api.baibaoyun.com/cloudapi/CloudAppGetOrPostAPI"

变量post_ret=http提交请求("POST",url,params,"utf-8")

返回post_ret

结束

//检测软件的试用时间是否结束

功能检测试用脚本运行时间(ID)

变量param=字符串格式化("{\"flag\":\"试用时间\",\"pcid\":\"%s\",\"key\":\"%s\"}",pcID,"0")

循环(真)

等待(1000*60)

变量ret=runBbyFunctionPost(param)

如果(是否整型(ret))

如果(ret<0)

线程关闭(线程ID)//关闭正在运行的脚本,或者下面的消息框使用一个新的EXE程序来替代

消息框("试用时间到!")

退出()

结束

否则

变量arr=json转数组(ret)

消息框("试用失败,原因:"&arr["errMsg"])

结束

结束

结束

3.3注册码相关功能

注册码

字段

字段描述

id

序号整型数据,主键且为自增

regcode

注册码

begintime

注册码第一次启动的时间

endtime

注册码结束时间

bindDevicesName

绑定的机器码

isbind

是否绑定

isFrozen

是否冻结

type

注册码类型(天卡、周卡、月卡

isactive

注册码是否启动

创建注册码表的百宝云代码如下

//创建数据库

functionsqlCreatDataBase()

var返回数组,ret

//id数据库的自增编号

//regcode注册码

//begintime开始时间

//endtime结束时间

//bindDevicesName绑定的机器码

//isbind是否绑定

//isFrozen是否冻结

//type注册码类型

//isactive注册码是否启动

ret=sqlitesqlarray("regtest.db","createtableIFNOTEXISTSregManager(idintegerprimarykeyautoincrement,regcode,begintime,endtime,bindDevicesName,isbind,isFrozen,type,isactive);",返回数组)//创建表

if(!ret)

sendtextmsg("创建表失败:"&getlasterror(1))

returnfalse

else

returntrue

end

end

以下将是注册码常规操作的功能代码。

5.4.1生成注册码

根据传入的参数,生成相应类型的注册码。

//生成注册码功能

功能sql创建新注册码(param)

变量timestr=获取系统时间()

变量md5str=md5(timestr)

变量retArray=null,inserText

选择(param)

条件"ji"

inserText=字符串格式化("insertintoregManager(regcode,begintime,endtime,bindDevicesName,isbind,isFrozen,type,isactive)values('%s','','','','false','false','ji','false');",md5str)

条件"mouth"

inserText=字符串格式化("insertintoregManager(regcode,begintime,endtime,bindDevicesName,isbind,isFrozen,type,isactive)values('%s','','','','false','false','mouth','false');",md5str)

条件"week"

inserText=字符串格式化("insertintoregManager(regcode,begintime,endtime,bindDevicesName,isbind,isFrozen,type,isactive)values('%s','','','','false','false','week','false');",md5str)

条件"day"

inserText=字符串格式化("insertintoregManager(regcode,begintime,endtime,bindDevicesName,isbind,isFrozen,type,isactive)values('%s','','','','false','false','day','false');",md5str)

结束

变量ret=sqlite数据库执行返回json("regtest.db",inserText,retArray)

变量selectStr=字符串格式化("select*fromregManagerwhereregcode='%s';",md5str)

ret=sqlite数据库执行返回json("regtest.db",selectStr,retArray)

如果(ret)

发送文本消息("生成注册码["&md5str&"]成功")

返回retArray

否则

发送文本消息("生成注册码["&md5str&"]失败")

返回retArray

结束

结束

5.4.2解绑注册码

//解绑注册码

功能sql解绑注册码(regKey)

变量返回数组,ret

变量sqlstr=字符串格式化("select*fromregManagerwhereregcode='%s';",regKey)

ret=sqlite数据库执行返回json("regtest.db",sqlstr,返回数组)

如果(ret&&返回数组!=null)

sqlstr=字符串格式化("updateregManagersetisbind='false'whereregcode='%s';",regKey)

ret=sqlite数据库执行返回json("regtest.db",sqlstr,返回数组)

发送文本消息("sql解绑注册码")

返回真

否则

发送文本消息("sql解绑注册码")

返回假

结束

结束

5.4.3冻结注册码

//冻结注册码

功能sql冻结注册码(regKey)

变量返回数组,ret

变量sqlstr=字符串格式化("select*fromregManagerwhereregcode='%s';",regKey)

ret=sqlite数据库执行返回json("regtest.db",sqlstr,返回数组)

如果(ret&&返回数组!=null)

sqlstr=字符串格式化("updateregManagersetisFrozen='true'whereregcode='%s';",regKey)

ret=sqlite数据库执行返回json("regtest.db",sqlstr,返回数组)

发送文本消息("sql冻结注册码")

返回真

否则

发送文本消息("sql冻结注册码")

返回假

结束

结束

5.4.4解冻注册码

//解冻注册码

功能sql解冻注册码(regKey)

变量返回数组,ret

变量sqlstr=字符串格式化("select*fromregManagerwhereregcode='%s';",regKey)

ret=sqlite数据库执行返回json("regtest.db",sqlstr,返回数组)

如果(ret&&返回数组!=null)

sqlstr=字符串格式化("updateregManagersetisFrozen='false'whereregcode='%s';",regKey)

ret=sqlite数据库执行返回json("regtest.db",sqlstr,返回数组)

发送文本消息("sql解冻注册码")

返回真

否则

发送文本消息("sql解冻注册码")

返回假

结束

结束

5.4.5删除注册码

//删除注册码

功能sql删除注册码(regKey)

变量返回数组,ret

变量sqlstr=字符串格式化("select*fromregManagerwhereregcode='%s';",regKey)

ret=sqlite数据库执行返回json("regtest.db",sqlstr,返回数组)

如果(ret&&返回数组!=null)

sqlstr=字符串格式化("deletefromregManagerwhereregcode='%s';",regKey)

ret=sqlite数据库执行返回json("regtest.db",sqlstr,返回数组)

发送文本消息("sql删除注册码")

返回真

否则

发送文本消息("sql删除注册码")

返回假

结束

结束

5.4.6续费注册码

//sql续费注册码

功能sql续费注册码(regKey,type)

变量返回数组,ret

变量sqlstr=字符串格式化("select*fromregManagerwhereregcode='%s';",regKey)

ret=sqlite数据库执行返回数组("regtest.db",sqlstr,返回数组)

如果(ret&&返回数组!=null)

变量end1Time1=返回数组[0]["endtime"]

变量endtime=0

选择(type)

条件"ji"

endtime=指定时间("m",3,end1Time1)

条件"mouth"

endtime=指定时间("m",1,end1Time1)

条件"week"

endtime=指定时间("d",7,end1Time1)

条件"day"

endtime=指定时间("d",1,end1Time1)

结束

sqlstr=字符串格式化("updateregManagersetendtime='%s'whereregcode='%s';",endtime,regKey)

发送文本消息(sqlstr)

ret=sqlite数据库执行返回json("regtest.db",sqlstr,返回数组)

发送文本消息("sql续费注册码成功")

返回真

否则

发送文本消息("sql续费注册码成功")

返回假

结束

结束

5.4.7注册码登录的处理

//判断登录者是否可以验证通过

功能sqlCheckLoginInfo(pcID,regKey)

变量sqlstr=字符串格式化("select*fromregManagerwhereregcode='%s';",regKey)

变量返回数组,ret,retmsg="登录失败:未知错误"

ret=sqlite数据库执行返回数组("regtest.db",sqlstr,返回数组)

发送文本消息("sqlCheckLoginInfo:"&返回数组)

如果(返回数组!=null)

//判断注册码是否冻结了

如果(返回数组[0]["isFrozen"]=="true")

retmsg="登录失败:注册码已经冻结"

返回retmsg

结束

//判断注册码是否已经绑定了本机器

变量bindDevicesName=返回数组[0]["bindDevicesName"]

//第一次登录

如果(bindDevicesName=="")

变量begintime=当前时间()

变量endtime=0

选择(返回数组[0]["type"])

条件"ji"

endtime=指定时间("m",3,begintime)

条件"mouth"

endtime=指定时间("m",1,begintime)

条件"week"

endtime=指定时间("d",7,begintime)

条件"day"

endtime=指定时间("d",1,begintime)

结束

变量update=字符串格式化("updateregManagersetbindDevicesName='%s',begintime='%s',endtime='%s',isbind='true',isactive='true'whereregcode='%s';",pcID,begintime,endtime,regKey)

发送文本消息("SQL:"&update)

ret=sqlite数据库执行返回数组("regtest.db",update,返回数组)

变量min=时间间隔("n",begintime,endtime)

如果(min>0)

retmsg="登录成功:剩余时间="&min&"分钟"

结束

否则如果(bindDevicesName!=""&&bindDevicesName==pcID)//机器码相同的话,就直接返回剩余时间

变量begintime=返回数组[0]["begintime"]

变量endtime=返回数组[0]["endtime"]

变量nowtime=当前时间()

变量min=时间间隔("n",nowtime,endtime)

如果(min>0)

retmsg="登录成功:剩余时间="&min&"分钟"

否则

retmsg="登录失败:注册码已经过期"

结束

否则如果(bindDevicesName!=""&&bindDevicesName!=pcID)//机器码不同的就判断是否绑定了

变量isBind=返回数组[0]["isbind"]

如果(isBind=="true")

retmsg="登录失败:注册码已经绑定其他机器"

否则

变量update=字符串格式化("updateregManagersetbindDevicesName='%s',isbind='true'whereregcode='%s';",pcID,regKey)

发送文本消息("更换绑定机器码:"&update)

ret=sqlite数据库执行返回数组("regtest.db",update,返回数组)

变量endtime=返回数组[0]["endtime"]

变量nowtime=当前时间()

变量min=时间间隔("n",nowtime,endtime)

如果(min>0)

retmsg="登录成功:剩余时间="&min&"分钟"

否则

retmsg="登录失败:注册码已经过期"

结束

结束

结束

否则

发送文本消息("查询失败:"&获取错误信息(1))

retmsg="登录失败:注册码不存在"

结束

返回retmsg

结束

5.4.8查询注册码的使用时间

//查询注册码使用时间

功能sql查询注册码使用时间(pcID,regKey)

变量sqlstr=字符串格式化("select*fromregManagerwhereregcode='%s'andbindDevicesName='%s'",regKey,pcID)

变量返回数组,ret,retMsg

ret=sqlite数据库执行返回数组("regtest.db",sqlstr,返回数组)

如果(返回数组==null)

retMsg="查询失败:查询失败."

否则如果(返回数组[0]["isFrozen"]=="true")

retMsg="查询失败:注册码已经冻结."

否则

发送文本消息("isFrozen:"&返回数组[0]["isFrozen"])

变量begintime=返回数组[0]["begintime"]

变量endtime=返回数组[0]["endtime"]

变量nowtime=当前时间()

变量min=时间间隔("n",nowtime,endtime)

retMsg=min

结束

返回retMsg

结束

注册码的登录验证与剩余时间查询也是通过post的方法来实现的,具体代码如下:

//{"flag":"表示验证试用还是查询时间","pcid":"机器码"}

//执行客户端发来的post请求,并返回执行的结果,以网页源码的形式返回.

功能_post(token,arg)

发送文本消息("_post:"&arg)

变量paramArr=json转数组(arg)

如果(!是否数组(paramArr))

返回"错误的参数列表"

结束

变量flag=paramArr["flag"]

变量pcID=paramArr["pcid"]

选择(flag)

条件"注册码登录"

发送文本消息("注册码登录:"&arg)

变量regValue=paramArr["key"]

返回sqlCheckLoginInfo(pcID,regValue)

条件"查询注册码时间"

发送文本消息("查询注册码时间,机器码:"&arg)

变量regValue=paramArr["key"]

返回sql查询注册码使用时间(pcID,regValue)

结束

结束

3.4注册码管理端

考虑到注册码管理端可以是任何语言编写的,因此对注册码的管理操作,就放到_get事件里,对应的代码如下

//arg参数格式:{"flag":"表示验证试用还是查询时间","pcid":"机器码","type":"注册码类型,续费用的"}

功能_get(token,arg)

发送文本消息("_get:"&arg)

变量paramArr=json转数组(arg)

如果(!是否数组(paramArr))

返回"错误的参数列表"

结束

变量flag=paramArr["flag"]

变量pcid=paramArr["pcid"]

选择(flag)

条件"查询所有注册码"

发送文本消息("查询所有注册码")

返回sql获取注册码所有信息()

条件"解绑注册码"

发送文本消息("解绑注册码:"&pcid)

返回sql解绑注册码(pcid)

条件"冻结注册码"

发送文本消息("冻结注册码:"&pcid)

返回sql冻结注册码(pcid)

条件"解冻注册码"

发送文本消息("解冻注册码:"&pcid)

返回sql解冻注册码(pcid)

条件"删除注册码"

发送文本消息("删除注册码:"&pcid)

返回sql删除注册码(pcid)

条件"新建注册码"

发送文本消息("新建注册码,类型为:"&pcid)

返回sql创建新注册码(pcid)

条件"续费注册码"

变量type=paramArr["type"]

发送文本消息("续费注册码,类型为:"&type&"注册码:"&pcid)

返回sql续费注册码(pcid,type)

结束

结束

查询所有注册码的功能代码如下:

//返回所有注册码信息

功能sql获取注册码所有信息()

变量sqlstr="select*fromregManager"

变量返回数组,ret

ret=sqlite数据库执行返回json("regtest.db",sqlstr,返回数组)

发送文本消息("获取所有注册码:"&返回数组)

返回返回数组

结束

3.5数据安全性

针对数据的安全性,可以get与post的数据做加密处理,加密算法可以自己编写,也可以试用百宝云提供的加解密算法之后定期更新加解密算法,这样可以提升数据的安全性。

你可能感兴趣的:(百宝云注册码系统新手教程)