using System.Collections; using System.Collections.Generic; using UnityEngine; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using System; using System.Text.RegularExpressions; using System.Security.Cryptography; using System.Text; using UnityEngine.Networking; using UnityEngine.XR; using System.IO; public class Login : SingletonBaseMono { public GameObject loginGameObject; public GameObject tj1; public GameObject tj2; public string id; public string key; private static long Jan1st1970Ms = new DateTime(1970, 1, 1, 0, 0, 0, System.DateTimeKind.Utc).Ticks; [Header("朝向学生视角")] public Vector3 startPoint; public Vector3 startVector; [Header("朝向黑板视角")] public Vector3 endPoint; public Vector3 endVecotr; private string phoneNumber; /// /// 推荐课程 /// private string firseState; private Action sendListCallBack; private InputDevice leftHandController; private InputDevice rightHandController; void Start() { leftHandController = InputDevices.GetDeviceAtXRNode(XRNode.LeftHand); rightHandController = InputDevices.GetDeviceAtXRNode(XRNode.RightHand); } // Update is called once per frame void Update() { Vector2 axis; if (leftHandController.TryGetFeatureValue(CommonUsages.primary2DAxis, out axis)) { transform.Translate(new Vector3(axis.x, 0, axis.y) * Time.deltaTime); } if (rightHandController.TryGetFeatureValue(CommonUsages.primary2DAxis, out axis)) { transform.Translate(new Vector3(axis.x, 0, axis.y) * Time.deltaTime); } if (transform.position.x < -5) { transform.position = new Vector3(-5, transform.position.y, transform.position.z); } if (transform.position.x > 5) { transform.position = new Vector3(5, transform.position.y, transform.position.z); } if (transform.position.z < -10) { transform.position = new Vector3(transform.position.x, transform.position.y, -10); } if (transform.position.z > 10) { transform.position = new Vector3(transform.position.x, transform.position.y, 10); } } /// /// 发送成绩 /// public void SendList(ArrayData arrayData, Action sendListCallBack) { this.sendListCallBack = sendListCallBack; List arrays = new List(); arrays.Add(arrayData); string jsonValue = JsonConvert.SerializeObject(arrays); SaveLog("发送成绩"); SaveLog("发送成绩数据" + jsonValue); StartCoroutine(SendListCoroutine(jsonValue)); } public IEnumerator SendListCoroutine(string jsonValue) { Debug.Log(phoneNumber); WWWForm form = new WWWForm(); form.AddField("terminal-token", GetToken()); form.AddField("phoneNumber", phoneNumber); form.AddField("array", jsonValue); UnityWebRequest unityWebRequest = UnityWebRequest.Post("http://gdsyzxlwxx.dds-ai.cn/jxpc-server/third-api/vr/api/save-train-result", form); yield return unityWebRequest.SendWebRequest(); Debug.Log(unityWebRequest.downloadHandler.text); SaveLog("返回数据" + unityWebRequest.downloadHandler.text); sendListCallBack?.Invoke(unityWebRequest.downloadHandler.text); } public void InputPhoneNumber(string phoneNumber) { this.phoneNumber = phoneNumber; } public void GetList() { StartCoroutine(GetListCoroutine()); } public void SaveLog(string value) { string date = ((int)((DateTime.Now.ToUniversalTime().Ticks - 621355968000000000) / 100000000000)).ToString() + "0000"; string time = ((DateTime.UtcNow.Ticks - Jan1st1970Ms) / 10000).ToString(); File.AppendAllText(Application.persistentDataPath + "/" + date + ".txt", time + "__" + value + "\n"); } public IEnumerator GetListCoroutine() { Debug.Log(phoneNumber); SaveLog("获取推荐课程"); WWWForm form = new WWWForm(); form.AddField("terminal-token", GetToken()); form.AddField("phoneNumber", phoneNumber); UnityWebRequest unityWebRequest = UnityWebRequest.Post("http://gdsyzxlwxx.dds-ai.cn/jxpc-server/third-api/vr/api/get-train-state", form); yield return unityWebRequest.SendWebRequest(); loginGameObject.SetActive(false); JObject keyValuePairs = JObject.Parse(unityWebRequest.downloadHandler.text); string code = keyValuePairs["code"].ToString(); Debug.Log(unityWebRequest.downloadHandler.text); SaveLog("返回数据" + unityWebRequest.downloadHandler.text); if (code != "200") { } else { firseState = keyValuePairs["data"]["state"].ToString(); switch (firseState) { case "0": tj1.SetActive(false); tj2.SetActive(false); break; case "1": tj1.SetActive(true); tj2.SetActive(false); break; default: tj1.SetActive(false); tj2.SetActive(true); break; } } } private string GetToken() { Dictionary keyValuePairs = new Dictionary(); keyValuePairs.Add("clientId", id); keyValuePairs.Add("expiresTime", (DateTime.UtcNow.Ticks - Jan1st1970Ms) / 10000 + 200000); Debug.Log(keyValuePairs["expiresTime"]); string jsonString = JsonConvert.SerializeObject(keyValuePairs); string base64 = Convert.ToBase64String(Encoding.UTF8.GetBytes(jsonString)); string token = System.Web.HttpUtility.UrlEncode(base64 + "." + ComputeHmacSha256(base64, key)); token = Regex.Replace(token, "%3d", "%3D"); SaveLog("获取token:" + token); return token; } private string ComputeHmacSha256(string message, string secret) { var keyBytes = Encoding.UTF8.GetBytes(secret); var messageBytes = Encoding.UTF8.GetBytes(message); using (var hmac = new HMACSHA256(keyBytes)) { var hash = hmac.ComputeHash(messageBytes); return Convert.ToBase64String(hash); } } } public class ArrayData { /// /// 错误数量 /// public int wrongCount; /// /// 正确数量 /// public int correctCount; /// /// 错误选择情况 /// public List wrongQuestions; } public class WrongQuestionsItem { /// /// 错误题号 /// public string questionId; /// /// 错误选项 /// public string userWrongOption; }