using Cysharp.Threading.Tasks; using LitJson; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using Org.BouncyCastle.Utilities.Encoders; using SecretUtils; using System; using System.Collections; using System.Collections.Generic; using System.IO; using System.Text; using System.Text.RegularExpressions; using UnityEngine; using UnityEngine.Events; using UnityEngine.Networking; public class NetManager : BaseManager { private NetManager() { } public Dictionary webURLDic = new Dictionary(); public ExamData currentExamData = new ExamData(); public TaskListData taskListData = new TaskListData(); /// /// 网络访问的token /// public string token = ""; public string url; public string appId = "10009"; public string examId = "1";//试卷id public string examinationId = "1";//考场id public string stuId = "1";//用户id public string groupId = "1";//所在分组id public string operationType = "1";//用户操作类型 public string machineId;//机器码 public string batchId = "1";//学习批次id public int schemeID = 9001;//课程id public int totalTime = 0; public string[] stepStrArr; public string userName = ""; public D_SerData getSerData = new D_SerData(); public D_SerData sendSerData = new D_SerData(); private Action DoStartCoroutine; private Action getSerDataCompleteHandler; public async UniTask Get(string endpoint) { var getRequest = CreateRequest(endpoint); await getRequest.SendWebRequest(); #if UNITY_EDITOR Debug.Log("async req : " + getRequest.downloadHandler.text); #endif //T result = JsonConvert.DeserializeObject(getRequest.downloadHandler.text); var s = Encrypt.DecryptECB(getRequest.downloadHandler.text); T result = JsonConvert.DeserializeObject(s); getRequest.Dispose(); return result; } public async UniTask Get(string endpoint) { var getRequest = CreateRequest(endpoint); await getRequest.SendWebRequest(); getRequest.Dispose(); } /// /// 请求类型 /// public enum RequestType { GET = 0, POST = 1 } private UnityWebRequest CreateRequest(string path, RequestType type = RequestType.GET, object data = null) { var request = new UnityWebRequest(path, type.ToString()); if (data != null) { string reqJson = JsonConvert.SerializeObject(data); #if UNITY_EDITOR //Debug.Log($"async req json : {reqJson}"); #endif var bodyRaw = Encoding.UTF8.GetBytes(reqJson); request.uploadHandler = new UploadHandlerRaw(bodyRaw); } request.downloadHandler = new DownloadHandlerBuffer(); request.SetRequestHeader("Content-Type", "application/json"); request.SetRequestHeader("Authorization", token); return request; } public string UserName(string userNameInfo) { string encodedString = RemoveSlashAfterAmpersand(userNameInfo); StringBuilder sb = new StringBuilder(); bool collectingDigits = false; int currentNumber = 0; foreach (char c in encodedString) { if (char.IsDigit(c)) { currentNumber = currentNumber * 10 + (c - '0'); collectingDigits = true; } else { if (collectingDigits && currentNumber <= 0xFFFF) // Unicode码点范围是0x0000到0xFFFF(对于基本多语言平面) { char character = (char)currentNumber; sb.Append(character); currentNumber = 0; collectingDigits = false; } } } if (collectingDigits && currentNumber <= 0xFFFF) { sb.Append((char)currentNumber); } return ParseUnicodeEscapes(sb.ToString()); } private string ParseUnicodeEscapes(string input) { return Regex.Replace( input, @"\\u([0-9a-fA-F]{4})", match => ((char)int.Parse(match.Groups[1].Value, System.Globalization.NumberStyles.HexNumber)).ToString() ); } private string RemoveSlashAfterAmpersand(string input) { // 查找 & 的位置 int ampersandIndex = input.IndexOf('&'); // 如果没有 & 或者 & 后面没有 /,直接返回原字符串 if (ampersandIndex == -1 || ampersandIndex + 1 >= input.Length || input[ampersandIndex + 1] != '/') { return input; } // 查找第一个 / 的位置 int slashIndex = input.IndexOf('/', ampersandIndex); // 如果 & 后面存在 /,移除 & 到 / 之间的部分 if (slashIndex >= 0) { // 返回 & 后面的部分,去掉 / return input.Remove(ampersandIndex + 1, slashIndex - ampersandIndex); } return input; } public string GetTokenURL() { return url + webURLDic["GetToken"]; } //==========================================================移植结束 HQB public void Init(Action _DoStartCoroutine) { DoStartCoroutine = _DoStartCoroutine; machineId = UnityEngine.SystemInfo.deviceUniqueIdentifier;//机器码 schemeID = 9001;//课程id } public void init_getSerData(Action _getSerDataCompleteHandler) { getSerDataCompleteHandler = _getSerDataCompleteHandler; getSerDataCompleteHandler?.Invoke(); } private void backHandler1(string text) { Login login = JsonUtility.FromJson(text); token = login.token; getNewRecord(); } //获取上次保存的数据 private void getNewRecord() { string url = "member/pro/simulationStepRecord/getNewRecord?"; url += "appId=" + GameManager.NetMgr.appId + "&"; url += "examId=" + GameManager.NetMgr.examId + "&"; url += "examinationId=" + GameManager.NetMgr.examinationId + "&"; url += "stuId=" + GameManager.NetMgr.stuId + "&"; url += "groupId=" + GameManager.NetMgr.groupId + "&"; url += "operationType=" + GameManager.NetMgr.operationType + "&"; url += "machineId=" + GameManager.NetMgr.machineId + "&"; url += "batchId=" + GameManager.NetMgr.batchId + "&"; url += "courseId=" + GameManager.NetMgr.schemeID; DoStartCoroutine?.Invoke(GameManager.NetMgr.sendGet(url, backHandler));//发起请求 } private void backHandler(string text) { string[] arr = text.Split("\"data\":null"); if (arr.Length == 1) { D_SerDataParent d_SerDataParent = JsonUtility.FromJson(text); GameManager.NetMgr.getSerData = d_SerDataParent.data; } getSerDataCompleteHandler?.Invoke(); //{"msg":"操作成功","code":200, //"data":{"createBy":"106","createTime":"2024-10-17 18:37:22","updateBy":null,"updateTime":null,"remark":null,"pageNum":null,"pageSize":null,"id":"1296542589557669888","appId":"1","examId":"1","examinationId":"1","stuId":"1","groupId":"1","recordContentId":"1","operationType":"1","isComp":"1","currentProcess":"1","sumProcess":"1","score":"1","inTimes":"1"}} } private long lastTime; //增加保存数据 public void add() { JsonData jsonData = new JsonData(); jsonData["appId"] = GameManager.NetMgr.appId; jsonData["examId"] = GameManager.NetMgr.examId; jsonData["examinationId"] = GameManager.NetMgr.examinationId; jsonData["stuId"] = GameManager.NetMgr.stuId; jsonData["groupId"] = GameManager.NetMgr.groupId; jsonData["operationType"] = GameManager.NetMgr.operationType; jsonData["machineId"] = GameManager.NetMgr.machineId; jsonData["batchId"] = GameManager.NetMgr.batchId; jsonData["courseId"] = GameManager.NetMgr.schemeID; jsonData["recordContent"] = stepStrArr[int.Parse(GameManager.NetMgr.sendSerData.currentProcess)];//GameManager.NetMgr.sendSerData.recordContent;//记录文本id jsonData["isComp"] = GameManager.NetMgr.sendSerData.isComp;//是否完成 0:未完成 1:已完成 jsonData["currentProcess"] = GameManager.NetMgr.sendSerData.currentProcess;//当前步骤点 jsonData["sumProcess"] = GameManager.NetMgr.sendSerData.sumProcess;//总步骤点 jsonData["score"] = GameManager.NetMgr.sendSerData.score;//步骤分 DateTime unixStartTime = new DateTime(1970, 1, 1); DateTime now = DateTime.UtcNow; TimeSpan timeSpan = now - unixStartTime; long timestamp = (long)timeSpan.TotalMilliseconds; jsonData["inTimes"] = ((GetCurrentUnixTimestampMillis() - lastTime) / 1000.0f).ToString("F2"); setTime(); jsonData["remark"] = GameManager.NetMgr.sendSerData.remark;//备注 //DoStartCoroutine?.Invoke(GameManager.NetMgr.sendPost("member/pro/simulationStepRecord/add", jsonData, null)); var _post_json = Sm4Base.EncryptECB(Encoding.UTF8.GetBytes(jsonData.ToJson()), Encrypt._key); var _header = Encrypt.Header(GameManager.NetMgr.token); DoStartCoroutine?.Invoke(PostRequest(url + "member/pro/simulationStepRecord/add", Hex.ToHexString(_post_json), _header, result => { try { result = Encrypt.DecryptECB(result); Debug.Log(result); JObject jo = JObject.Parse(result); if (jo["code"].ToObject() == 200) { //TipPanel.ShowTip("上传分数成功"); } else { //TipPanel.ShowTip("上传分数失败;" + jo["msg"].ToString()); } } catch (Exception e) { Debug.Log($"{e.Message}\n ResultJosn:{result}"); } })); } public void setTime() { lastTime = GetCurrentUnixTimestampMillis(); } private long GetCurrentUnixTimestampMillis() { // Unix时间戳是从1970年1月1日开始计算 DateTime unixStartTime = new DateTime(1970, 1, 1); // 当前时间 DateTime now = DateTime.UtcNow; // 当前时间与Unix时间戳的时间间隔 TimeSpan timeSpan = now - unixStartTime; // 将时间间隔转换为毫秒数 long timestamp = (long)timeSpan.TotalMilliseconds; return timestamp; } //HQB 1203 移植 //增加保存数据 public void SendResult(string resultData) { JsonData jsonData = new JsonData(); jsonData["id"] = ""; jsonData["appId"] = GameManager.Instance.systemId.ToString(); jsonData["courseId"] = schemeID; jsonData["examId"] = examId; jsonData["examinationId"] = examinationId; jsonData["stuId"] = stuId; jsonData["groupId"] = groupId; jsonData["machineId"] = machineId; jsonData["batchId"] = batchId; jsonData["recordContent"] = resultData;//记录文本id jsonData["operationType"] = operationType; jsonData["isComp"] = sendSerData.isComp;//是否完成 0:未完成 1:已完成 jsonData["currentProcess"] = sendSerData.currentProcess;//当前步骤点 jsonData["sumProcess"] = sendSerData.sumProcess;//总步骤点 jsonData["score"] = sendSerData.score;//步骤分 jsonData["preScore"] = ""; jsonData["inTimes"] = (DateTime.Now - GameManager.RunModelMgr.startTime).TotalSeconds.ToString(); jsonData["remark"] = sendSerData.remark;//备注 jsonData["stepName"] = ""; jsonData["testPoint"] = ""; jsonData["defaultScore"] = ""; var _post_json = Sm4Base.EncryptECB(Encoding.UTF8.GetBytes(jsonData.ToJson()), Encrypt._key); var _header = Encrypt.Header(GameManager.NetMgr.token); DoStartCoroutine?.Invoke(PostRequest(url + webURLDic["练习学习"], Hex.ToHexString(_post_json), _header, result => { try { result = Encrypt.DecryptECB(result); Debug.Log(result); JObject jo = JObject.Parse(result); if (jo["code"].ToObject() == 200) { //TipPanel.ShowTip("上传分数成功"); } else { //TipPanel.ShowTip("上传分数失败;" + jo["msg"].ToString()); } } catch (Exception e) { Debug.Log($"{e.Message}\n ResultJosn:{result}"); } })); } public IEnumerator sendPost(string itf,JsonData jsonData,Action action) { string ds = jsonData.ToJson(); byte[] postBytes = Encoding.Default.GetBytes(ds); using (UnityWebRequest request = new UnityWebRequest(url + itf, "POST")) { request.uploadHandler = new UploadHandlerRaw(postBytes); request.downloadHandler = new DownloadHandlerBuffer(); request.SetRequestHeader("Content-Type", "application/json"); if (GameManager.NetMgr.token != "") { request.SetRequestHeader("Authorization", GameManager.NetMgr.token); } yield return request.SendWebRequest();//发送请求 if (request.responseCode == 200)//检验是否成功 { string text = request.downloadHandler.text; Debug.Log(text); action?.Invoke(text); } else { Debug.Log("请求失败:" + request.responseCode); } }//method传输方式,默认为Get; } public IEnumerator sendGet(string itf, Action action) { //string ds = jsonData.ToJson(); //byte[] postBytes = Encoding.Default.GetBytes(ds); UnityWebRequest request = new UnityWebRequest(url + "/" + itf, "GET");//method传输方式,默认为Get; //request.uploadHandler = new UploadHandlerRaw(postBytes); request.downloadHandler = new DownloadHandlerBuffer(); request.SetRequestHeader("Authorization", GameManager.NetMgr.token); yield return request.SendWebRequest();//发送请求 if (request.responseCode == 200)//检验是否成功 { string text = request.downloadHandler.text; Debug.Log(text); action?.Invoke(text); } else { Debug.Log("请求失败:" + request.responseCode); } } public async void GetConfig(UnityAction action) { string path = Application.streamingAssetsPath + "/info.ini"; if (File.Exists(path)) { string str = File.ReadAllText(path); if (str.Contains("ycjl")) { string text = str.Split("://")[1].Split("\'|")[0]; Debug.Log($"text=={text}"); if (text != "" && !string.IsNullOrEmpty(text)) { string[] arr = text.Split(','); //appld = arr[0]; examId = arr[0];//试卷id/任务ID examinationId = arr[1];//考场id stuId = arr[2];//用户id groupId = arr[3];//所在分组id operationType = arr[4];//用户操作类型 1.学习任务 2.练习 3.考试 batchId = arr[5];//学习批次id token = arr[6]; userName = UserName(arr[7]); //用户名 schemeID = int.Parse(arr[8]);//科目ID url = $"http://{arr[9]}";//Ip地址 totalTime = int.Parse(arr[10]);//总时间 // foreach (var item in arr) // { // Debug.Log(item); // } } } else { Debug.Log($"text==是空得"); } string pathJson = Application.streamingAssetsPath + "/Config/URLConfig.txt"; if (File.Exists(pathJson)) { string[] info = File.ReadAllLines(pathJson); for (int i = 0; i < info.Length; i++) { int index = i; if (info[index] != "") { webURLDic.Add(info[index].Split(",")[0], info[index].Split(",")[1]); Debug.Log(info[index]); } } if (operationType == "3") { string examUrl = url + webURLDic["试卷"] + examId; currentExamData = await Get(examUrl); taskListData = JsonConvert.DeserializeObject(currentExamData.data.backJson); action?.Invoke(true); } else { action?.Invoke(true); } } else { Debug.LogError("没有对应的文件Config/URLConfig.txt"); action?.Invoke(false); } } else { Debug.LogError("没有对应的文件info.ini"); Debug.LogError("没有对应的文件Config/URLConfig.txt"); action?.Invoke(false); } } /// /// /// /// public void SaveInfo(string info) { string path = Application.streamingAssetsPath + "/start.ini"; File.WriteAllText(path, info); } public IEnumerator PostRequest(string _url, string _post_json, Dictionary _header = null, Action _callback = null) { using (UnityWebRequest request = new UnityWebRequest(_url, "POST")) { var data = Encoding.UTF8.GetBytes(_post_json); request.uploadHandler = new UploadHandlerRaw(data); request.downloadHandler = new DownloadHandlerBuffer(); if (_header != null) { foreach (var item in _header) { request.SetRequestHeader(item.Key, item.Value); } } yield return request.SendWebRequest(); if (request.error != null) { Debug.Log(request.error); _callback?.Invoke(null); } else { if (request.responseCode == 200) { _callback?.Invoke(request.downloadHandler.text); } } } } } public class Login { public string msg; public string code; public string data; public string token; }