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

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

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

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

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

UI的基本结构

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

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

//把本地配置上传上去 上传之前 用自己的云账号作为密钥或者其他的什么你自己知道的密钥加密上传的内容
zm.NetDataSet 本地配置表["云账号"], zm.EncodeAES(本地配置, 云账号), 网络数据库表名//从云端获取配置内容 内容要先解密 然后根据情况来进行判断和其他处理
zm.EncodeAES(zm.NetDataGet(本地配置表["云账号"], 网络数据库表名),云账号)

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

123

转载于:https://www.cnblogs.com/zjl8455482/p/10339683.html

紫猫中控-脚本界面的基本设计和代码结构相关推荐

  1. 简易中控紫猫插件版(3)压缩包使用说明

    1.环境配置 脚本运行环境:没什么说的 正常的最新版手机按键 当然还需要 最新的紫猫插件 中控运行环境:首先要保证把压缩包的所有php文件都扔到网站的根目录下 必须保证网站的php版本是5.4+ 不然 ...

  2. 【按键精灵源码】一个稍微复杂点的脚本界面

    大家好,我是公众号3分钟学堂的郭立员,继续我们按键精灵安卓版文章教程的讲解,这次带来的是一个群友的问题解答. 他在网上看到别人的脚本界面觉得不错,想要模仿一下,但是发现一些功能不会写,就来问我怎么做, ...

  3. python界面不同按钮实现不同功能-python tkinter实现界面切换的示例代码

    跳转实现思路 主程序相当于桌子: import tkinter as tk root = tk.Tk() 而不同的Frame相当于不同的桌布: face1 = tk.Frame(root) face2 ...

  4. python怎样实现界面的切换_python tkinter实现界面切换的示例代码

    跳转实现思路 主程序相当于桌子: import tkinter as tk root = tk.Tk() 而不同的Frame相当于不同的桌布: face1 = tk.Frame(root) face2 ...

  5. 从零开始,在pycharm中使用pyqt5和pyqt5-tools和QT Designer设计界面,不用敲代码

    从零开始,在pycharm中使用pyqt5和pyqt5-tools和QT Designer设计界面,不用敲代码 结果功能展示: 根据设计界面自动生成的python代码: from PyQt5 impo ...

  6. 脚本文件直接执行python代码

    脚本文件直接执行python代码

  7. SAP MM 由于没有维护Plant的Address信息导致不能在ME51N和ME21N界面里输入工厂代码

    SAP MM 由于没有维护Plant的Address信息导致不能在ME51N和ME21N界面里输入工厂代码 ME21N,视图创建采购订单,输入了Plant code 3600, 回车, Plant字段 ...

  8. java rhino 运行 js_java 脚本引擎Rhino执行js代码和文件

    测试js脚本引擎 public class helloworld { public static void main(String[] args) throws Exception { //获得脚本引 ...

  9. Jenkins学习(执行命令路径,脚本上传静态html代码)(一)

    Jenkins的安装 可参考https://www.cnblogs.com/yangzp/p/12953810.html sudo wget -O /etc/yum.repos.d/jenkins.r ...

  10. php欢迎界面代码,分享微信小程序欢迎界面开发的实例代码

    这篇文章主要分享微信小程序欢迎界面开发的实例代码的相关资料,这里实现欢迎界面的简单实例和实现代码及实现效果图,需要的朋友可以参考下 微信小程序 欢迎界面 市面上大多数的app都会有一个欢迎界面,下面将 ...

最新文章

  1. 从CPU缓存看缓存的套路
  2. 已成功与服务器建立连接,但是在登录过程中发生错误。 (provider: SSL Provider, error: 0 - 接收到的消息异常,或格式不正确。)
  3. Python基础教程:判断列表重复
  4. Android 缓存目录 Context.getExternalFilesDir()和Context.getExternalCacheDir()方法
  5. shell脚本采用crontab定时备份数据库日志
  6. priority_queue(优先队列)的简单构造与用法
  7. 论文浅尝 - EMNLP2020 | 跨媒体关键词预测: 多模态多头注意力和图像文本的统一框架...
  8. Express-hello
  9. python实现二分法查找_python二分法查找
  10. App后台开发运维和架构实践学习总结(3)——RestFul架构下API接口设计注意点
  11. mysql spool csv报错_Oracle使用spool快速导出超大表
  12. 如何安装.net framework?Win11安装net framework的方法
  13. 【OCP题库-12c】最新CUUG OCP 071考试题库(72题)
  14. python-matplotlib绘图 -应用subplots_adjust()方法解决图表与画布的间距问题
  15. 这个超级好哎 vector 容器的 怕失效
  16. 【勘误清单】《机器学习》 周志华 北京: 清华大学出版社
  17. can-utils使用
  18. 统计工作随笔—同比与环比(同期为负值)、百分点
  19. linux两个文件取交集、并集、差集
  20. autojs之控制台

热门文章

  1. 【Aspose for .NET】Aspose.word操作表格:在表格中插入行
  2. 铁路订票系统的简单设计
  3. Python实现图片转pdf
  4. Sentinel-2快速查询图幅号——基于MGRS_100kmSQ_ID_File_Geodatabase快速查询
  5. JSON日期时间的处理
  6. java 米与厘米 转换_米转码换算(米与码的换算关系)
  7. 软件测试之开发转测试相比于其他测试人员有哪些优势
  8. 【组合优化】旅行商问题Traveling Salesman Problem(TSP)-概述
  9. eight后缀勒索病毒百胜系统数据库成功恢复
  10. dimm和udimm_RDIMM和UDIMM内存的区别