年前總算有時間可以把中控教程按部就班的寫一遍測試下
目前的中控腳本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 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