/* * Метод реализует сборку страницы для произведения вычислений на стороне клиента. * Идентификатор пользователя берется из значения сессии. * Входные параметры: * 1) Строка с идентификатором задачи. В строке должно находиться целое неотрицательное число или -1. * По умолчанию стоит -1, что обозначает, что нужный идентификатор не был установлен. * Все прочие значения являются ошибкой. * 2) Строка с именем функции. Имя функции может быть произвольной строкой содержащей печатные символы. * По умолчанию стоит -1, что обозначает, что нужное имя не было установлено. * Все прочие значения являются ошибкой. * Выходные параметры: * ActionResult, с помощью которого пользователь перенаправляется на страницу Master. * Если в ходе работы произошли ошибки, выводится сообщение об этом. * Побочные эффекты: * В ходе выполнения метода: * 1) может модифицироваться файл /App_Data/log.txt; * 2) устанавливается время последней активности пользователя. */ public ActionResult Calculation(string task = "-1", string func = "-1") { try { Models.DatabaseMediator db = new Models.DatabaseMediator(System.Web.HttpContext.Current.Server.MapPath("~")); db.setUserLastActivity((int)System.Web.HttpContext.Current.Session["user_id"], DateTime.UtcNow); db.close(); if (task != "-1" && func != "-1") { string taskFile = "/Content/data/" + task + ".js"; string funcFile = "/Content/func/" + func + ".js"; string html = "<script src=\"" + taskFile + "\"> </script>"; html += "<script src=\"" + funcFile + "\"> </script>"; html += "<script src=\"/Scripts/client_calc.js\"> </script>"; html += "<script> makeCalculation(\"" + task + "\"); </script>"; return(Content(html)); } return(View("Master")); } catch (Exception e) { System.IO.File.AppendAllText(System.Web.HttpContext.Current.Server.MapPath("~/App_Data/log.txt"), e.Message); ViewBag.MessagerFromControl = "Произошла ошибка, зайдите позже."; return(View("Master")); } }
/* * Метод собирает информацию о результате. * Идентификатор пользователя берется из значения сессии. * * Выходные параметры: * ActionResult, с помощью которого пользователь перенаправляется на страницу Results. * Если в ходе работы произошли ошибки, выводится сообщение об этом. * Побочные эффекты: * В ходе выполнения метода: * 1) может модифицироваться файл /App_Data/log.txt; */ public ActionResult Results() {//Форма статуса вычислений. Если вычисление закончено, то показан результат try { Models.DatabaseMediator db = new Models.DatabaseMediator(System.Web.HttpContext.Current.Server.MapPath("~")); //обращаемся к базе Models.Task[] array = db.getUserTasks((int)System.Web.HttpContext.Current.Session["user_id"]); //выцыганиваем id юзера из сессии db.close(); //ну и как то это всё обработали и вывели List <String> list = new List <String>(); string line; foreach (Models.Task t in array) { if (t.isSolved()) { // выводим using (StreamReader sr = new StreamReader(t.getResultFilePath())) { while ((line = sr.ReadLine()) != null) { list.Add(t.getTaskId() + ") " + line); } } } } if (list.Count == 0) { ViewBag.Out = null; } else { ViewBag.Out = list; } } catch (Exception e) { System.IO.File.AppendAllText(System.Web.HttpContext.Current.Server.MapPath("~/App_Data/log.txt"), e.Message); ViewBag.MessagerFromControl = "Произошла ошибка, зайдите позже."; return(View("Master")); } return(View()); }
/* * Метод отвечающий за сбор результата с клиента. Если существует родительская задача, её состояние обновляется. * Предполагается, что метод выполняется в фоновом для пользователя режиме. * Идентификатор пользователя берется из значения сессии. * Входные параметры: * 1) Строка с идентификатором задачи. В строке должно находиться целое неотрицательное число или -1. * По умолчанию стоит -1, что обозначает, что нужный идентификатор не был установлен. * Все прочие значения являются ошибкой. * 2) Строка с ответом на задачу. Ограничения не накладываются. * Выходные параметры: * ActionResult, с помощью которого пользователю предоставляется страница TransferOut. * Побочные эффекты: * 1) Ответ записывается в файл с № задачи. * 2) В ходе работы может модифицироваться файл /App_Data/log.txt; */ public ActionResult TransferOut(string task, string result) { try { int taskId = Convert.ToInt32(task);//каким-то образом получили id решеной задачи Models.DatabaseMediator db = new Models.DatabaseMediator(System.Web.HttpContext.Current.Server.MapPath("~")); Models.Task t = db.loadTask(taskId); //нашли нужную задачу t.setAnswer(result); //записали ответ db.saveTask(t); //сохранили в базу int userId = (int)System.Web.HttpContext.Current.Session["user_id"]; User u = db.getUser(userId); u.resetTask(); db.updateUser(u); int parent = t.getParentTaskId(); if (parent != -1) //если есть родитель пишем результат в родителя { Models.Task t2 = db.loadTask(parent); //нашли родительскую задачу bool fin = t2.updateTask(result); //обновили её db.saveTask(t2); db.close(); if (fin) {//если все данные родительской задачи получены, то ставим на выполнение Models.Scheduler s = new Models.Scheduler(System.Web.HttpContext.Current.Server.MapPath("~")); while (!s.setTask(t2)) { System.Threading.Thread.Sleep(2000); } } } } catch (Exception e) { System.IO.File.AppendAllText(System.Web.HttpContext.Current.Server.MapPath("~/App_Data/log.txt"), e.Message); ViewBag.MessagerFromControl = "Произошла ошибка, зайдите позже."; return(View("Master")); } return(View()); }
public ActionResult Login(string username, string password) { try { SHA256Managed hash = new SHA256Managed(); byte[] hashBytes = hash.ComputeHash(Encoding.UTF8.GetBytes(username + password)); string hashStr = BitConverter.ToString(hashBytes).Replace("-", ""); System.IO.StreamReader file = new System.IO.StreamReader(new FileStream(System.Web.HttpContext.Current.Server.MapPath("~/App_Data/Users.txt"), FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite)); string line; while ((line = file.ReadLine()) != null) { if (line != "") { string[] logins = line.Split(' '); if (hashStr == logins[1]) { Models.DatabaseMediator db = new Models.DatabaseMediator(System.Web.HttpContext.Current.Server.MapPath("~"));//обращаемся к базе Models.User u = db.getUserByLogin(logins[0]); db.setUserLastActivity(u.getId(), DateTime.UtcNow); System.Web.HttpContext.Current.Session["user_id"] = u.getId(); //выцыганиваем id из базы HttpContext.Response.Cookies["user"].Value = "id=" + u.getId().ToString(); db.close(); //закрыли базу FormsAuthentication.SetAuthCookie(username, false); HttpContext.Response.Cookies["login"].Value = username; System.IO.StreamReader file1 = new System.IO.StreamReader(new FileStream(System.Web.HttpContext.Current.Server.MapPath("~/App_Data/OnlineUsers.txt"), FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite)); List <KeyValuePair <string, string> > users = new List <KeyValuePair <string, string> >(); string line1; while ((line1 = file1.ReadLine()) != null) { if (line1 != "") { string[] str = line1.Split(' '); users.Add(new KeyValuePair <string, string>(str[0], str[1])); } } file1.Close(); System.IO.StreamWriter file2 = new System.IO.StreamWriter(new FileStream(System.Web.HttpContext.Current.Server.MapPath("~/App_Data/OnlineUsers.txt"), FileMode.Truncate, FileAccess.ReadWrite, FileShare.ReadWrite)); users.Add(new KeyValuePair <string, string>(username, Request.UserHostAddress)); string result = ""; foreach (var str in users) { result += str.Key + " " + str.Value + "\n"; } file2.Write(result); file2.Close(); file.Close(); return(View("Master")); } } } file.Close(); return(View("Index")); } catch (Exception e) { System.IO.File.AppendAllText(System.Web.HttpContext.Current.Server.MapPath("~/App_Data/log.txt"), e.Message); ViewBag.MessagerFromControl = "Произошла ошибка, зайдите позже."; return(View("Index")); } }