userlog.js 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. /**
  2. * ЭЛЕКТРОННЫЙ ЖУРНАЛ «ШКАЛА»: ПРОСМОТР ЛОГА ДЕЙСТВИЙ ПОЛЬЗОВАТЕЛЕЙ
  3. * Copyright © 2020, А.М.Гольдин. Modified BSD License
  4. */
  5. "use strict";
  6. // Показ лога (аргумент - тип: 0 - дети, 1 - сотрудники, 2 - все)
  7. const ulShow = async tip => {
  8. dqs("#ulResult").innerHTML = "<img src='static/preloader.gif'>";
  9. let roles = {
  10. "pupil":"учащийся", "par":"родитель",
  11. "staff":"сотрудник", "root":"гл.&nbsp;администратор"
  12. },
  13. source = ["#ulSelPupil", "#ulSelStaff", "#ulDt"],
  14. selmon = ["#ulMonthPup", "#ulMonthStaff"],
  15. name = dqs(source[tip]).value;
  16. let mon = "99"; // для запроса лога за одни сутки месяц не важен
  17. if (selmon[tip]) mon = dqs(selmon[tip]).value;
  18. let hour = dqs("#ulHour").value;
  19. tip = (tip == 0 || tip == 1) ? 0 : 1;
  20. let resp = await apireq("logGet", [tip, mon, hour, name]);
  21. if (resp == "none") {info(1, "Данные не получены с сервера"); return;}
  22. let logArr = JSON.parse(resp);
  23. if (!logArr.length) {
  24. dqs("#ulResult").innerHTML =
  25. "В логе нет записей, удовлетворяющих заданному фильтру";
  26. return;
  27. }
  28. let res = "<table><tr><th><nobr>Дата и время</nobr></th><th>Логин</th>" +
  29. "<th>Роль</th><th><nobr>IP-адрес</nobr></th></tr>";
  30. for (let rec of logArr) {
  31. let dtArr = (rec.d.split(' ')[0]).split('-'),
  32. dt = `${dtArr[2]}.${dtArr[1]} ${rec.d.split(' ')[1]}`;
  33. res += `<tr><td>${dt}</td><td>${rec.l}</td>`
  34. + `<td>${roles[rec.c]}</td><td>${rec.ip}</td></tr>`;
  35. }
  36. dqs("#ulResult").innerHTML = res + "</table>";
  37. }
  38. // Формирование списка детей в селекте выбора учащегося
  39. const ulPupListShow = async () => {
  40. let clName = dqs("#ulSelClass").value;
  41. let resp = await apireq("gradesGet", [clName, '', "a"]);
  42. if (resp == "none") {info(1, "Не могу получить список учащихся"); return;}
  43. let ulObj = JSON.parse(resp);
  44. let pupLgnArr = ulObj.puList ? ulObj.puList : []; // логины детей
  45. if (pupLgnArr.length) {
  46. let selPupilInner = '';
  47. for (let i=0; i<pupLgnArr.length; i++) selPupilInner +=
  48. `<option value="${pupLgnArr[i]}">${ulObj.pnList[i]}</option>`;
  49. dqs("#ulSelPupil").innerHTML = selPupilInner;
  50. }
  51. else {
  52. dqs("#ulSelPupil").innerHTML = '';
  53. info(0, "В этом классе (группе) нет учащихся!");
  54. }
  55. }
  56. // Формирование контента страницы (regNow, regYst, regYfin определены в ini.js)
  57. createSection("userlog", `
  58. <h3>Выбор фильтра для просмотра лога авторизации</h3>
  59. <p>Просмотр лога одного учащегося (родителя) за месяц</p>
  60. <select id="ulSelClass" onChange="ulPupListShow()"></select>
  61. <select id="ulSelPupil"></select>
  62. <select id="ulMonthPup"></select>
  63. <button type="button" onClick="ulShow(0)"> &gt;&gt; </button>
  64. <div id="ulStaff">
  65. <p>Просмотр лога одного сотрудника за месяц</p>
  66. <select id="ulSelStaff"></select>
  67. <select id="ulMonthStaff"></select>
  68. <button type="button" onClick="ulShow(1)"> &gt;&gt; </button>
  69. </div>
  70. <div id="ulAll">
  71. <p>Просмотр лога всех пользователей за один час</p>
  72. <input id="ulDt" type="date"
  73. min="${regYst}" max="${regYfin}" value="${regNow}">
  74. <select id="ulHour"></select>
  75. <button type="button" onClick="ulShow(2)"> &gt;&gt; </button>
  76. </div>
  77. <h3>Лог авторизации пользователей</h3><div id="ulResult"></div>
  78. `);
  79. // Динамически подгружаем контент страницы (имя метода = имени пункта меню!)
  80. getContent.userlog = async () => {
  81. let ulRole = dqs("#selRole").value,
  82. selClassInner = '',
  83. selStaffInner = "<option value='admin'>Гл. администратор</option>";
  84. dqs("#ulStaff").style.display = "none";
  85. dqs("#ulAll").style.display = "none";
  86. dqs("#ulResult").innerHTML = "Нет данных";
  87. // Формирование списка месяцев в селекте выбора месяца
  88. let monSelInner = '',
  89. month = ["сен", "окт", "ноя", "дек", "янв", "фев",
  90. "мар", "апр", "май", "июн", "июл", "авг"];
  91. for (let i=0; i<month.length; i++)
  92. monSelInner += `<option value="`
  93. + `${((i+8) % 12 + 1).toString().padStart(2, '0')}`
  94. + `">${month[i]}</option>`;
  95. dqs("#ulMonthPup").innerHTML = monSelInner;
  96. dqs("#ulMonthStaff").innerHTML = monSelInner;
  97. // Формирование списка часов в селекте выбора часа
  98. let hourSelInner = '';
  99. for (let i=0; i<24; i++) {
  100. let hour = i.toString().padStart(2, '0');
  101. hourSelInner += `<option value="${hour}">`
  102. + `c ${hour}:00 по ${hour}:59</option>`;
  103. }
  104. dqs("#ulHour").innerHTML = hourSelInner;
  105. // Если он классный руководитель, показываем ему только его классы
  106. if (ulRole == "tutor")
  107. for (let cl of uTutorCls) selClassInner += `<option>${cl}</option>`;
  108. // Если он администратор, показываем ему все фильтры
  109. else if (ulRole == "admin") {
  110. dqs("#ulStaff").style.display = "block";
  111. dqs("#ulAll").style.display = "block";
  112. // Показываем все классы
  113. let apiResp = await apireq("classesList");
  114. if (apiResp == "none") {info(1, "Не могу получить данные"); return;}
  115. let ulAllClasses = classSort(JSON.parse(apiResp));
  116. for (let cl of ulAllClasses)
  117. selClassInner += `<option>${cl}</option>`;
  118. // Показываем всех сотрудников
  119. apiResp = await apireq("teachList");
  120. if (apiResp == "none") {info(1, "Не могу получить данные"); return;}
  121. let ulAllStaff = JSON.parse(apiResp).sort(
  122. (u1, u2) => (u1.fio).localeCompare(u2.fio, "ru"));
  123. for (let st of ulAllStaff)
  124. selStaffInner += `<option value="${st.login}">${st.fio}</option>`;
  125. dqs("#ulSelStaff").innerHTML = selStaffInner;
  126. }
  127. dqs("#ulSelClass").innerHTML = selClassInner;
  128. ulPupListShow();
  129. };