首页 > 技术文章 > 紫猫中控-脚本界面的基本设计和代码结构

zjl8455482 2019-01-30 20:21 原文

年前总算有时间可以把中控教程按部就班的写一遍测试下

目前的中控脚本UI的实现目的

1.普通用户可以通过这个脚本界面读取到针对用户自己的对应的配置项内容

2.给用户提供两种甚至3 种读取修改到针对用户自己的对应的配置项内容的方式 以备不时之需 万一其中一个方式出现问题 还可以用其他方式补救

3.用户也可以通过脚本UI来修改自己在云端的配置项内容

UI的基本结构

image

1. 功能选择  我们脚本读取配置项内容 可以从云端获取 也可以直接用本地的这些项目  或者把本地的这些配置项上传到云端后再读取回来 来指导脚本的运行

2 云账号 这个是用户自己知道的账号 因为插件本身的限制  给它加上密码其实也可以 但是要修改sql.php的源码 目前只是按照老师的教程一点点的写出来 所以先不折腾 用户知道了这个云账号 每次把这个云账号写到界面上 云端每次就会返回 这个账号对应的配置项(推荐用户使用QQ号YY号 手机号 这样不太可能相互冲突的号码)

3 后面就是一些常见的脚本配置内容 这里你随便替换

UI代码

界面1:
{
    综合:
    {
    
    },    
    云配置:
    {
        
                文字框:
        {
            注释:"文字大小、高度、宽度是可选属性,如需使用默认值,可保持值为0或直接删除此属性",
            名称:"文字框5",
            显示内容:"     ",
            文字大小:0,
            高度:0,
            宽度:0
        },    
        
        
        水平布局:
        {
            文字框:
            {
                注释:"文字大小、高度、宽度是可选属性,如需使用默认值,可保持值为0或直接删除此属性",
                名称:"文字框1",
                显示内容:"功能选择",
                文字大小:0,
                高度:0,
                宽度:0
            },    
            下拉框:
            {
                注释:"初始选项是可选属性,默认值为0。模版中设置了三个选项,您可以根据需要增加或减少,注意各选项之间用逗号分隔。",
                名称:"功能选择",
                点击响应:"函数名1",
                选项:
                [
                "使用云配置",
                "使用本地配置",
                "本地配置上传至云并使用",
                ],
                初始选项:0
            },    
            
        },    

        水平布局:
        {
            文字框:
            {
                注释:"文字大小、高度、宽度是可选属性,如需使用默认值,可保持值为0或直接删除此属性",
                名称:"文字框2",
                显示内容:"云账号",
                文字大小:0,
                高度:0,
                宽度:0
            },    
            输入框:
            {
                注释:"初始文本、文字大小、最大输入长度、高度、宽度是可选属性,如需使用默认值,可保持值为0或直接删除此属性",
                名称:"云账号",
                提示内容:"云账号",
                初始文本:"",
                仅输入数字:false,
                文字大小:0,
                最大输入长度:0,
                高度:0,
                宽度:0
            },    
            
        },    
        水平布局:
        {
            文字框:
            {
                注释:"文字大小、高度、宽度是可选属性,如需使用默认值,可保持值为0或直接删除此属性",
                名称:"文字框3",
                显示内容:"加血比例",
                文字大小:0,
                高度:0,
                宽度:0
            },    
            下拉框:
            {
                注释:"初始选项是可选属性,默认值为0。模版中设置了三个选项,您可以根据需要增加或减少,注意各选项之间用逗号分隔。",
                名称:"加血比例",
                点击响应:"函数名1",
                选项:
                [
                "80%",
                "70%",
                "60%",
                "50%",
                "40%",
                "30%",
                "20%",
                ],
                初始选项:0
            },    
            
            
        },    
        多选框:
        {
            注释:"文字大小、高度、宽度是可选属性,如需使用默认值,可保持值为0或直接删除此属性",
            名称:"定时启动",
            提示内容:"定时启动",
            点击响应:"函数名1",
            选中:false,
            文字大小:0,
            高度:0,
            宽度:0
        },    
        
        多选框:
        {
            注释:"文字大小、高度、宽度是可选属性,如需使用默认值,可保持值为0或直接删除此属性",
            名称:"签到",
            提示内容:"签到",
            点击响应:"函数名1",
            选中:true,
            文字大小:0,
            高度:0,
            宽度:0
        },    
        水平布局:
        {
            文字框:
            {
                注释:"文字大小、高度、宽度是可选属性,如需使用默认值,可保持值为0或直接删除此属性",
                名称:"文字框4",
                显示内容:"循环次数",
                文字大小:0,
                高度:0,
                宽度:0
            },    
            输入框:
            {
                注释:"初始文本、文字大小、最大输入长度、高度、宽度是可选属性,如需使用默认值,可保持值为0或直接删除此属性",
                名称:"循环次数",
                提示内容:"循环次数",
                初始文本:"",
                仅输入数字:true,
                文字大小:0,
                最大输入长度:0,
                高度:0,
                宽度:0
            },    
            
        },    
        
        
        
        
    },    
    其他:
    {
    
    },    
    

}

对应源代码的结构:

源代码里面主要实现几个功能

1.接收界面上的几个参数 进行简单的检测

2.根据功能的不同 对应3个功能模块

(1)获取云配置功能

从界面获取的云账号 以此为依据 再云端查找对应的配置项内容 并反馈回来 还要对反馈进行检测 如果反馈回来为null或者空 则再获取一次 如果依然不行 就抛出异常 再日志里面标准 然后使用本地配置来运行脚本

(2)使用本地配置

没什么可说的

(3)上传本地配置到云端再使用

这个是给客户提供一个 它再脚本端就可以自由的修改自己账号对应的配置内容的手段 自然不够安全 但是也没什么大不了 因为这个没什么重要内容 如果想要给内容加密 也是可以的 紫猫插件有这方面的函数。基本流程是 根据界面云账号 把本地配置上传到云端 然后在云端再次找到该云账号对应的配置内容 和本地配置对比下看看是否一致来判断是否上传成功了

源码

Import "zm.luae" //导入插件,只需执行一次
zm.Init  //初始化插件,只需执行一次
Dim 功能选择=ReadUIConfig("功能选择")
Dim 网络数据库接口地址="http://192.168.0.102/sql.php"
Dim 网络数据库表名="测试表"
Dim 本地配置=""
Dim 本地配置表()
Dim 云配置//用来存放云配置json字符串
Dim 云配置表()//用来存放云配置表的
Dim UI界面的参数显示字符串 = ""
zm.NetDataInit 网络数据库接口地址, 网络数据库表名
//--------进行简单的UI参数的检测-------------------//
Dim 云账号=trim(ReadUIConfig("云账号"))
If 云账号 = ""  Then 
    Call show("云账号:[" & 云账号 & "] 不能为空")
    Delay 2000
    EndScript
ElseIf Len(云账号) < 6 Then
    Call show("云账号:[" & 云账号 & "] 不能小于6位")//utf8下 汉字占3个位置
    Delay 2000
    EndScript
Else 
    UI界面的参数显示字符串 = UI界面的参数显示字符串 & "云账号:[" & 云账号 & "]\n"
End If
/*
加血比例 
*/
Dim 加血比例=ReadUIConfig("加血比例")
If 加血比例 = 0 Then
    //80%
    加血比例=0.8
ElseIf 加血比例 = 1 Then
    //70%
    加血比例=0.7
ElseIf 加血比例 = 2 Then
    //60%
    加血比例=0.6
ElseIf 加血比例 = 3 Then
    //50%
    加血比例=0.5
ElseIf 加血比例 = 4 Then
    //40%
    加血比例=0.4
ElseIf 加血比例 = 5 Then
    //30%
    加血比例=0.3
ElseIf 加血比例 = 6 Then
    //20%
    加血比例=0.2
Else 
    Call show("加血比例:[" & 加血比例 & "] 出现未知内容")
    Delay 2000
    EndScript
End If
UI界面的参数显示字符串 = UI界面的参数显示字符串 & "加血比例:[" & CStr(加血比例) & "]\n"
Dim 定时启动=ReadUIConfig("定时启动")
If 定时启动 Then 
    UI界面的参数显示字符串 = UI界面的参数显示字符串 & "定时启动:[开启]\n"    
Else 
    UI界面的参数显示字符串 = UI界面的参数显示字符串 & "定时启动:[关闭]\n"
End If
Dim 签到=ReadUIConfig("签到")
If 签到 Then 
    UI界面的参数显示字符串 = UI界面的参数显示字符串 & "签到:[开启]\n"    
Else 
    UI界面的参数显示字符串 = UI界面的参数显示字符串 & "签到:[关闭]\n"
End If
Dim 循环次数=trim(ReadUIConfig("循环次数"))
If 循环次数 = "" or not IsNumeric(循环次数) Then 
    Call show("循环次数:[" & 循环次数 & "] 不能为空或者必须为数值")
    Delay 2000
    EndScript
Else 
    UI界面的参数显示字符串 = UI界面的参数显示字符串 & "循环次数:[" & 循环次数 & "]\n"
End If
For 3
    ShowMessage UI界面的参数显示字符串
    Delay 2000
Next
//检测合法性完毕把本地的配置整合成表 备用
本地配置表["云账号"]=云账号
本地配置表["加血比例"] = 加血比例
本地配置表["定时启动"] = 定时启动
本地配置表["签到"] = 签到
本地配置表["循环次数"] = 循环次数
//TracePrint 功能选择
//开始功能的分支
If 功能选择 = 0 Then 
    //读取云配置
    ShowMessage "读取云配置"
    Delay 1000
    云配置 = zm.NetDataGet(本地配置表["云账号"], 网络数据库表名)
    If IsNull(云配置) or Trim(云配置) = "" Then 
        For 2
            ShowMessage "<!!读取云配置失败为空 尝试再次获取>"
            Delay 1000        
        Next
        云配置=""
        云配置=zm.NetDataGet(本地配置表["云账号"],网络数据库表名)
        If IsNull(云配置) or Trim(云配置) = "" Then 
            For 2
                ShowMessage "<尝试读取两次云配置失败请重新上传该账号对应的云配置或者更换一个账号 >"
                Delay 2000        
            Next
            //使用以前的本地存储的配置 注意读取云配置失败这个异常一定要在日志或者网络日志里面加入 避免出现脚本一直使用本地配置导致问题
            云配置表=zm.Clone(本地配置表) //不能直接相等 
        Else 
            //注意有个大问题 字符串转table如果字符串不规范 转化的函数就会报错导致崩溃
            If is_json(云配置) = 1 Then 
                //从网络获取的内容符合json字符串格式 那么就可以把json字符串转化为表
                云配置表=Encode.JsonToTable(云配置)
            Else 
                //不符合要求怎么办 考虑使用本地配置来指导运行把
                ShowMessage "云配置表无法获取到 暂时使用本地配置"
                Delay 2000
                云配置表=zm.Clone(本地配置表) //不能直接相等 
            End If
        End If
    Else 
        //注意有个大问题 字符串转table如果字符串不规范 转化的函数就会报错导致崩溃
        If is_json(云配置) = 1 Then 
            //从网络获取的内容符合json字符串格式 那么就可以把json字符串转化为表
            云配置表=Encode.JsonToTable(云配置)
        Else 
            //不符合要求怎么办 考虑使用本地配置来指导运行把
            ShowMessage "云配置表无法获取到 暂时使用本地配置"
            Delay 2000
            云配置表=zm.Clone(本地配置表) //不能直接相等 
        End If
    End If
    TracePrint zm.VarInfo(云配置表)
ElseIf 功能选择 = 1 Then
    //读取本地配置
    ShowMessage "读取本地配置"
    Delay 1000
    云配置表=zm.Clone(本地配置表) //不能直接相等 
    TracePrint zm.VarInfo(本地配置表)
    TracePrint zm.VarInfo(云配置表)
ElseIf 功能选择 = 2 Then
    //读取本地配置上传到云端并使用这个刚更新的云配置
    ////先读取本地配置 开始接收UI的各种参数 集合成一个json字符串
    ShowMessage "上传本地配置到云端并使用"
    Delay 1000
    本地配置=Encode.TableToJson(本地配置表)
    //把本地得设置得配置上传到网络上
    zm.NetDataSet 本地配置表["云账号"], 本地配置, 网络数据库表名
    //再从网络上重新获取到这个网络配置 和本地得配置对比 是否相同
    云配置=zm.NetDataGet(本地配置表["云账号"],网络数据库表名)
    If IsNull(云配置) or Trim(云配置) = "" Then 
        For 2
            ShowMessage "<上传配置失败为空 尝试再次获取>"
            Delay 1000        
        Next
        云配置 = ""
        zm.NetDataSet 本地配置表["云账号"], 本地配置, 网络数据库表名
        云配置=zm.NetDataGet(本地配置表["云账号"],网络数据库表名)
        If IsNull(云配置) or Trim(云配置) = "" Then 
            For 2
                ShowMessage "<尝试获取两次上传配置失败>"
                Delay 1000        
            Next
            //使用以前的本地存储的配置
            云配置表=zm.Clone(本地配置表) //不能直接相等 
        Else 
            //比较下从网络获取的配置json字符串和本地的配置构成的字符串书否相同
            If Trim(本地配置) = Trim(云配置) Then 
                云配置表 = Encode.JsonToTable(云配置)
                TracePrint zm.VarInfo(云配置表)
                For 5
                    ShowMessage "[上传配置成功]"
                    Delay 1000
                Next
            Else 
                For 10
                    ShowMessage "<上传配置失败>"
                    Delay 1000
                Next
                //使用以前的本地存储的配置
                云配置表=zm.Clone(本地配置表) //不能直接相等 
            End If
        End If
    Else 
        //比较下从网络获取的配置json字符串和本地的配置构成的字符串书否相同
        If Trim(本地配置) = Trim(云配置) Then 
            For 10
                ShowMessage "[上传配置成功]"
                Delay 5000
            Next
            云配置表 = Encode.JsonToTable(云配置)
            TracePrint zm.VarInfo(云配置表)
            For 10
                ShowMessage "[上传配置成功]"
                Delay 5000
            Next
        Else 
            For 10
                ShowMessage "<上传配置失败>"
                Delay 1000
            Next
            //使用以前的本地存储的配置
            云配置表=zm.Clone(本地配置表) //不能直接相等 
        End If
    End If
End If
////注意 这个表的结构必须是key value两个字段 不是这个字段的话 上传下载会出现问题
/*
*作用 判断一个字符串是否是json字符串 但是只是简易判断 只是简单的正则判断下开头结尾是否是{}
*返回值 为0表示不是json字符串 为1表示是
*注意使用的是紫猫插件切记
*/
Function is_json(s)
    //关于正则的
    Dim ret() //返回表参数, 可以省略该参数
    Dim data=""
    Dim  pattern ="^{.*}$"
    Dim 结果=-1
    data = zm.RegExMatch(s, pattern, ret)
    If data then
        结果=1
    Else
        TracePrint "未匹配到数据"
        结果=0
    End If
    is_json=结果
End Function
Function show(显示数组或显示内容)
    ShowMessage 显示数组或显示内容
    TracePrint 显示数组或显示内容
End Function

关于最后一点 加密配置内容防止泄密的小知识

//把本地配置上传上去 上传之前 用自己的云账号作为密钥或者其他的什么你自己知道的密钥加密上传的内容
zm.NetDataSet 本地配置表["云账号"], zm.EncodeAES(本地配置, 云账号), 网络数据库表名

//从云端获取配置内容 内容要先解密 然后根据情况来进行判断和其他处理
zm.EncodeAES(zm.NetDataGet(本地配置表["云账号"], 网络数据库表名),云账号)

这样写的话 在数据库内部存储的就是密文  根本看不懂是什么


123

推荐阅读