Различия
Показаны различия между двумя версиями страницы.
| Предыдущая версия справа и слева Предыдущая версия Следующая версия | Предыдущая версия | ||
|
tech:customer:rsv:install [2025/11/21 09:10] dmitry_kalashnikov [Проверка работы] |
tech:customer:rsv:install [2025/11/21 10:47] (текущий) dmitry_kalashnikov [Инструкция по установке Модуля проверки] |
||
|---|---|---|---|
| Строка 1: | Строка 1: | ||
| ====== Инструкция по установке Модуля проверки ====== | ====== Инструкция по установке Модуля проверки ====== | ||
| - | Создано тестовое приложение в виде server.js-файла, | + | Модуль проверки представляет собой |
| Исходный код находится в репозитории: | Исходный код находится в репозитории: | ||
| Пользователь: | Пользователь: | ||
| - | Пароль: | + | Пароль: |
| ===== Установка ===== | ===== Установка ===== | ||
| Строка 11: | Строка 12: | ||
| Сервер, | Сервер, | ||
| - | |||
| - | Последняя версия 0.1.2 аналогична идентификатору: | ||
| Чтобы получить доступ к репозиторию, | Чтобы получить доступ к репозиторию, | ||
| Строка 23: | Строка 22: | ||
| Далее, ввести пароль и логин пользователя, | Далее, ввести пароль и логин пользователя, | ||
| - | Для этого пользователя сгенерирован токен ecopsy_token:токен поэтому авторизоваться также можно через команду: | + | Для этого пользователя сгенерирован токен |
| < | < | ||
| - | docker login reg.hitsoft-it.com -u ecopsy_token -p токен | + | docker login reg.hitsoft-it.com -u ecopsy_token -p токен_ключ |
| </ | </ | ||
| Для запуска можно использовать docker compose, например, | Для запуска можно использовать docker compose, например, | ||
| - | < | + | < |
| version: ' | version: ' | ||
| Строка 64: | Строка 63: | ||
| Затем сервер будет доступен по адресу http:// | Затем сервер будет доступен по адресу http:// | ||
| - | Полный цикл установки | + | < |
| + | Полный цикл установки проверен на чистой системе Ubuntu 22.04.2 LTS, в которую был установлен только docker и его компоненты. | ||
| + | </ | ||
| + | ===== Программный интерфейс и параметры ===== | ||
| - | ===== Проверка работы | + | Адрес порта задаётся в конфигурации модуля при установке. Модуль проверки имеет точку входа через вызов функции '' |
| + | POST http:// | ||
| + | Content-type: | ||
| - | Создано тестовое приложение в виде | + | Тело запроса JSON: |
| - | '' | + | <code javascript> |
| - | '' | + | { |
| - | '' | + | dictId: string, //идентификатор диктанта для выбора соответствующего скрипта проверки; |
| + | dictSubId: string, //идентификатор подверсии диктанта для | ||
| + | userId: string, //идентификатор пользователя, написавшего | ||
| + | text: string, | ||
| + | | ||
| + | } | ||
| + | </ | ||
| - | При заданных параметрах сервер | + | Ответ: |
| + | <code javascript> | ||
| + | { | ||
| + | userId: string, // | ||
| + | skipped: boolean, // флаг пропуска проверки; | ||
| + | skipDetails: | ||
| + | reason: string, // | ||
| + | textSizePercent: | ||
| + | obsceneWords: | ||
| + | penaltyErrors: | ||
| + | }, | ||
| + | errors: { | ||
| + | orfo: int, // число орфографических ошибок; | ||
| + | punct: int, // | ||
| + | typo: int //число опечаток; | ||
| + | } | ||
| + | stats: // массив с аналитической статистикой, | ||
| + | { | ||
| + | name: string, // имя столбца, | ||
| + | value: string // значение в этом столбце; | ||
| + | }[] | ||
| + | } | ||
| + | </ | ||
| - | Сервер | + | ===== Подмодуль фильтрации ===== |
| + | Подмодуль фильтрации текстов включает в себя следующие функции: | ||
| + | |||
| + | * Фильтрация текстов по признаку объема (текст отличается от текста в задании, | ||
| + | * Предобработка текста на аберрантное поведение (в тексте нет обсценной лексики, | ||
| + | * После проверки каждого текстового задания на выходе выдаётся файл в формате JSON, содержащий следующие данные: | ||
| + | * флаг пропуска проверки (параметр '' | ||
| + | * причина пропуска, | ||
| + | * процент соответствия объёма текста, | ||
| + | * список найденных стоп-слов из словаря обсценной лексики (параметр '' | ||
| + | |||
| + | ===== Пример приложения ===== | ||
| + | |||
| + | Ниже указан javascript-код, | ||
| + | |||
| + | <code javascript> | ||
| + | const path = require(' | ||
| + | const fs = require(' | ||
| + | const request = require(' | ||
| + | const process = require(' | ||
| + | |||
| + | // URL для POST-запроса | ||
| + | const url = ' | ||
| + | |||
| + | // Путь к директории с текстовыми файлами | ||
| + | const dirpath = path.join(__dirname, | ||
| + | |||
| + | // Константа для перевода секунд в наносекунды (используется с process.hrtime) | ||
| + | const NS_PER_SEC = 1e9; | ||
| + | |||
| + | // Чтение всех файлов в директории | ||
| + | fs.readdir(dirpath, | ||
| + | // Отмечаем время начала обработки всех файлов | ||
| + | const allStart = process.hrtime(); | ||
| + | |||
| + | // Фильтруем только .txt файлы | ||
| + | const txtFiles = files.filter(el => path.extname(el) === ' | ||
| + | |||
| + | // Рекурсивная функция для последовательной отправки POST-запросов | ||
| + | function run(idx) { | ||
| + | if (idx < txtFiles.length) { | ||
| + | // Время начала обработки конкретного файла | ||
| + | const start = process.hrtime(); | ||
| + | |||
| + | // POST-запрос на сервер с содержимым файла и параметрами | ||
| + | request.post( | ||
| + | url, | ||
| + | { | ||
| + | json: { | ||
| + | returnStats: | ||
| + | dictId: ' | ||
| + | dictSubId: ' | ||
| + | userId: idx.toString(), | ||
| + | text: fs.readFileSync(dirpath + '/' | ||
| + | } | ||
| + | }, | ||
| + | function (error, response, body) { | ||
| + | if (!error && response.statusCode == 200) { | ||
| + | console.log(body); | ||
| + | } | ||
| + | |||
| + | // Логируем время обработки конкретного файла | ||
| + | console.log(' | ||
| + | |||
| + | // Рекурсивно вызываем следующую итерацию для следующего файла | ||
| + | run(idx + 1); | ||
| + | } | ||
| + | ); | ||
| + | } else { | ||
| + | // Когда все файлы обработаны, | ||
| + | const time = process.hrtime(allStart); | ||
| + | const nanoTime = time[0] * NS_PER_SEC + time[1] | ||
| + | console.log(' | ||
| + | |||
| + | // Выводим среднее время обработки одного файла | ||
| + | if (txtFiles.length > 0) { | ||
| + | console.log(' | ||
| + | } | ||
| + | } | ||
| + | } | ||
| + | |||
| + | // Запускаем рекурсивную обработку с первого файла | ||
| + | run(0) | ||
| + | }); | ||
| + | |||
| + | console.log(global.txtFiles) | ||
| + | </ | ||
| - | Если какой-то параметр пропущен, | ||