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

第三章:百宝云实例演练

第三节:注册码系统

3.1注册码系统的设计图:

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

1)试用

2)生成注册码

3)解绑注册码

4)冻结注册码

5)解冻注册码

6)删除注册码

7)续费注册码

3.2试用功能

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

试用

字段

字段描述

id

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

pcid

机器码

begintime

试用开始时间

endtime

试用结束时间

num

试用次数

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

// 创建试用数据表
function sqlCreatTestDataBase()
    var 返回数组,ret
    ret = sqlitesqlarray("regtest.db","create table IF NOT EXISTS testManager(id integer primary key autoincrement,pcid,begintime,endtime,num);",返回数组)//创建表
    if(!ret)
        sendtextmsg("创建表失败:"& getlasterror(1))
        return false
    else
        return true
    end
end


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

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

 // 判断试用者是否可以验证通过
    功能 sqlCheckTesterLogin(pcID)
    // 通过传入的机器码,在数据库里查询,看数据库里是否有记录,没有则加入
    变量 sqlstr = 字符串格式化("select * from testManager where pcid='%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 = 字符串格式化("update testManager set num='%s',begintime='%s',endtime='%s' where pcid='%s';",num,begintime,endtime,pcID)
        发送文本消息("SQL: "&update)
        ret = sqlite数据库执行返回数组("regtest.db",update,返回数组)
        retmsg = "true"
否则
    // 第一次试用软件
        变量 begintime = 当前时间()
        变量 endtime = 指定时间("n",20,begintime)  // 试用时间20分钟
        
        变量 insert = 字符串格式化("insert into testManager(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 * from testManager where pcid='%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)
        发送文本消息("leave Time: "&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

注册码是否启动

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

// 创建数据库
function sqlCreatDataBase()
    var 返回数组,ret
    // id 数据库的自增编号
    // regcode 注册码
    // begintime 开始时间
    // endtime 结束时间
    // bindDevicesName 绑定的机器码
    // isbind  是否绑定
    // isFrozen  是否冻结
    // type   注册码类型
    // isactive 注册码是否启动
    ret = sqlitesqlarray("regtest.db","create table IF NOT EXISTS regManager(id integer primary key autoincrement,regcode,begintime,endtime,bindDevicesName,isbind,isFrozen,type,isactive);",返回数组)//创建表
    if(!ret)
        sendtextmsg("创建表失败:"& getlasterror(1))
        return false
    else
        return true
    end
end
 


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

5.4.1生成注册码

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

5.4.2解绑注册码

// 解绑注册码
    功能 sql解绑注册码(regKey)
    变量 返回数组,ret
    变量 sqlstr = 字符串格式化("select * from regManager where regcode='%s';",regKey)
    ret = sqlite数据库执行返回json("regtest.db",sqlstr,返回数组)
    如果(ret && 返回数组 != null)
        sqlstr = 字符串格式化("update regManager set isbind='false' where regcode='%s';",regKey)    
        ret = sqlite数据库执行返回json("regtest.db",sqlstr,返回数组)
        发送文本消息("sql解绑注册码")
        返回 真
    否则
        发送文本消息("sql解绑注册码")
        返回 假
    结束    
结束

5.4.3冻结注册码

 // 冻结注册码
     功能 sql冻结注册码(regKey)
    变量 返回数组,ret
    变量 sqlstr = 字符串格式化("select * from regManager where regcode='%s';",regKey)
    ret = sqlite数据库执行返回json("regtest.db",sqlstr,返回数组)
    如果(ret && 返回数组 != null)
        sqlstr = 字符串格式化("update regManager set isFrozen='true' where regcode='%s';",regKey)
        ret = sqlite数据库执行返回json("regtest.db",sqlstr,返回数组)
        发送文本消息("sql冻结注册码")
        返回 真
    否则
        发送文本消息("sql冻结注册码")
        返回 假
    结束
结束
 

5.4.4解冻注册码

 // 解冻注册码
    功能 sql解冻注册码(regKey)
    变量 返回数组,ret
    变量 sqlstr = 字符串格式化("select * from regManager where regcode='%s';",regKey)
    ret = sqlite数据库执行返回json("regtest.db",sqlstr,返回数组)
    如果(ret && 返回数组 != null)
        sqlstr = 字符串格式化("update regManager set isFrozen='false' where regcode='%s';",regKey)
        ret = sqlite数据库执行返回json("regtest.db",sqlstr,返回数组)
        发送文本消息("sql解冻注册码")
        返回 真
    否则
        发送文本消息("sql解冻注册码")
        返回 假
    结束
结束

5.4.5删除注册码

 // 删除注册码
    功能 sql删除注册码(regKey)
    变量 返回数组,ret
    变量 sqlstr = 字符串格式化("select * from regManager where regcode='%s';",regKey)
    ret = sqlite数据库执行返回json("regtest.db",sqlstr,返回数组)
    如果(ret && 返回数组 != null)
        sqlstr = 字符串格式化("delete from regManager where regcode='%s';",regKey)
        ret = sqlite数据库执行返回json("regtest.db",sqlstr,返回数组)
        发送文本消息("sql删除注册码")
        返回 真
    否则
        发送文本消息("sql删除注册码")
        返回 假
    结束
结束

5.4.6续费注册码

// sql续费注册码
    功能 sql续费注册码(regKey,type)
    变量 返回数组,ret
    变量 sqlstr = 字符串格式化("select * from regManager where regcode='%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 = 字符串格式化("update regManager set endtime='%s' where regcode='%s';",endtime,regKey)
        发送文本消息(sqlstr)
        ret = sqlite数据库执行返回json("regtest.db",sqlstr,返回数组)
        发送文本消息("sql续费注册码成功")
        返回 真
    否则
        发送文本消息("sql续费注册码成功")
        返回 假
    结束
结束
 

5.4.7注册码登录的处理

  // 判断登录者是否可以验证通过
    功能 sqlCheckLoginInfo(pcID,regKey)
    变量 sqlstr = 字符串格式化("select * from regManager where regcode='%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 = 字符串格式化("update regManager set bindDevicesName='%s',begintime='%s',endtime='%s',isbind='true',isactive='true' where regcode='%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 = 字符串格式化("update regManager set bindDevicesName='%s',isbind='true' where regcode='%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 * from regManager where regcode='%s' and bindDevicesName='%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 * from regManager"
    变量 返回数组,ret
    ret = sqlite数据库执行返回json("regtest.db",sqlstr,返回数组)
    发送文本消息("获取所有注册码:"&返回数组)
    返回 返回数组    
结束
 

3.5数据安全性

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Excel百宝箱12是Excel软件中的一种功能插件,主要提供了一系列实用的工具和功能,方便用户在处理数据和进行计算时提高工作效率。 首先,Excel百宝箱12中提供了各种数据处理和分析工具。我们可以使用数据筛选器和排序器,快速对数据进行筛选和排序,便于查找和分析数据。此外,插件还提供了高级筛选功能和透视表,可以根据多个条件对数据进行更复杂的筛选和分析,以展现数据背后的规律和趋势。 其次,Excel百宝箱12还包括了许多实用的计算工具。用户可以通过插件中的函数库,直接调用各种常用和高级的计算函数,如数学函数、统计函数、逻辑函数等,省去了手动编写公式的繁琐过程。此外,插件还提供了一些专门用于处理日期、时间和文本的函数,方便用户在处理工作中遇到的特殊数据类型时进行计算和处理。 另外,Excel百宝箱12还拥有一些其他实用的功能。比如,插件提供了数据去重和单元格合并功能,可以方便快速地对数据进行去重复和合并操作。还有流行的图表工具等,以便更好地展示和可视化数据。插件还包括了一些数据清理和错误检测的功能,可帮助用户检查和修复数据中的错误或异常,提高数据的准确性和可靠性。 总之,Excel百宝箱12作为一款实用的Excel插件,提供了丰富多样的数据处理和计算工具,使用户能够更高效地处理数据和进行各种复杂的分析和计算。无论是个人用户还是工作中的专业人士,都可以通过使用这个插件来提高工作效率和数据处理的质量。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值