Сборка REDL: панель на PHP 8, капча-тумблер, закрытые уязвимости, установщики в один клик
- панель работает на PHP 8.4 (оригинал под PHP 7.0): elFinder utf8_encode, apache_get_modules, warnings - капча выключена и управляется из админки (флаг captcha_enable + блок настроек) - закрыты две SQL-инъекции без авторизации (createAuthLog: пароль из POST и CF-Connecting-IP) - убрано хранение паролей в открытом виде в authlog, XSS в поле ref - установщики install-panel.sh и install-node.sh (оригинальный затирал sources.list репозиториями Debian 9) - современный Dockerfile (оригинальный на debian:stretch больше не собирается) - планировщик и автозапуск работают без systemd - брендинг REDL.IO, год 2026, ссылки на redl.io - документация на русском: ИЗМЕНЕНИЯ, БЕЗОПАСНОСТЬ, ИНСТРУКЦИЯ
This commit is contained in:
@@ -0,0 +1,106 @@
|
||||
<?php
|
||||
/*
|
||||
Copyright (c) 2020 HOSTINPL (HOSTING-RUS) https://vk.com/hosting_rus
|
||||
Developed by Samir Shelenko and Alexander Zemlyanoy (https://vk.com/id00v / https://vk.com/mrsasha082)
|
||||
*/
|
||||
?>
|
||||
<?php echo $header ?>
|
||||
<div class="content d-flex flex-column flex-column-fluid" id="kt_content">
|
||||
<div class="d-flex flex-column-fluid">
|
||||
<div class="container">
|
||||
<div class="row">
|
||||
<div class="col-xl-4 col-xxl-4 mb-4">
|
||||
<div class="card card-custom card-sticky">
|
||||
<div class="card-body px-5">
|
||||
<div class="px-4 mt-4 mb-10">
|
||||
<a href="/tickets/create" class="btn btn-block btn-primary font-weight-bold text-uppercase py-4 px-6 text-center">Написать</a>
|
||||
</div>
|
||||
<div class="navi navi-hover navi-active navi-link-rounded navi-bold navi-icon-center navi-light-icon">
|
||||
<div class="navi-item my-2">
|
||||
<a href="/tickets" class="navi-link">
|
||||
<span class="navi-icon mr-4">
|
||||
<i class="flaticon-computer icon-lg"></i>
|
||||
</span>
|
||||
<span class="navi-text font-weight-bolder font-size-lg">Мои запросы</span>
|
||||
</a>
|
||||
</div>
|
||||
<div class="navi-item my-2">
|
||||
<a href="/tickets/faq" class="navi-link">
|
||||
<span class="navi-icon mr-4">
|
||||
<i class="flaticon-book icon-lg"></i>
|
||||
</span>
|
||||
<span class="navi-text font-weight-bolder font-size-lg">База знаний</span>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-xl-8 col-xxl-8">
|
||||
<div class="card card-custom card-sticky">
|
||||
<div class="card-body px-5">
|
||||
<form method="POST" id="createForm" style="padding:0px; margin:0px;">
|
||||
<div class="form-group form-md-line-input mb-4">
|
||||
<input type="text" class="form-control" id="name" name="name" placeholder="Введите тему">
|
||||
</div>
|
||||
<div class="form-group form-md-line-input mb-4">
|
||||
<select class="form-control" id="category" name="category" aria-required="true" aria-invalid="false" aria-describedby="delivery-error">
|
||||
<?php foreach($category as $item): ?>
|
||||
<option value="<?php echo $item['category_id'] ?>"><?php echo $item['category_name'] ?></option>
|
||||
<?php endforeach; ?>
|
||||
</select>
|
||||
</div>
|
||||
<div class="form-group form-md-line-input mb-4">
|
||||
<textarea class="form-control" id="text" name="text" rows="3" placeholder="Сообщение..."></textarea>
|
||||
</div>
|
||||
<?php if(@$captcha_enable == '1'): ?>
|
||||
<div class="recaptcha">
|
||||
<center>
|
||||
<div class="g-recaptcha" data-sitekey="<?php echo $recaptcha ?>" id="recaptcha1"></div>
|
||||
</center>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
<hr>
|
||||
<button type="submit" class="btn btn-primary btn-lg btn-block">Отправить</button>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<?php if(@$captcha_enable == '1'): ?><script src="https://www.google.com/recaptcha/api.js?onload=recaptha&render=explicit" async defer></script><?php endif; ?>
|
||||
<script>
|
||||
var captcha_ticket;
|
||||
var recaptha = function() {
|
||||
captcha_ticket = grecaptcha.render('recaptcha1', {
|
||||
'sitekey' : '<?php echo $recaptcha ?>',
|
||||
'theme' : 'light'
|
||||
});
|
||||
};
|
||||
|
||||
$('#createForm').ajaxForm({
|
||||
url: '/tickets/create/ajax',
|
||||
dataType: 'text',
|
||||
success: function(data) {
|
||||
console.log(data);
|
||||
data = $.parseJSON(data);
|
||||
switch(data.status) {
|
||||
case 'error':
|
||||
toastr.error(data.error);
|
||||
window.grecaptcha && grecaptcha.reset(captcha_ticket);
|
||||
$('button[type=submit]').prop('disabled', false);
|
||||
break;
|
||||
case 'success':
|
||||
toastr.success(data.success);
|
||||
setTimeout("redirect('/tickets/view/index/" + data.id + "')", 1500);
|
||||
break;
|
||||
}
|
||||
},
|
||||
beforeSubmit: function(arr, $form, options) {
|
||||
$('button[type=submit]').prop('disabled', true);
|
||||
}
|
||||
});
|
||||
</script>
|
||||
<?php echo $footer ?>
|
||||
@@ -0,0 +1,298 @@
|
||||
<?php
|
||||
/*
|
||||
Copyright (c) 2020 HOSTINPL (HOSTING-RUS) https://vk.com/hosting_rus
|
||||
Developed by Samir Shelenko and Alexander Zemlyanoy (https://vk.com/id00v / https://vk.com/mrsasha082)
|
||||
*/
|
||||
?>
|
||||
<?php echo $header ?>
|
||||
<div class="content d-flex flex-column flex-column-fluid" id="kt_content">
|
||||
<div class="d-flex flex-column-fluid">
|
||||
<div class="container">
|
||||
<div class="row">
|
||||
<div class="col-xl-4 col-xxl-4 mb-4">
|
||||
<div class="card card-custom card-sticky">
|
||||
<div class="card-body px-5">
|
||||
<div class="px-4 mt-4 mb-10">
|
||||
<a href="/tickets/create" class="btn btn-block btn-primary font-weight-bold text-uppercase py-4 px-6 text-center">Написать</a>
|
||||
</div>
|
||||
<div class="navi navi-hover navi-active navi-link-rounded navi-bold navi-icon-center navi-light-icon">
|
||||
<div class="navi-item my-2">
|
||||
<a href="/tickets" class="navi-link">
|
||||
<span class="navi-icon mr-4">
|
||||
<i class="flaticon-computer icon-lg"></i>
|
||||
</span>
|
||||
<span class="navi-text font-weight-bolder font-size-lg">Мои запросы</span>
|
||||
</a>
|
||||
</div>
|
||||
<div class="navi-item my-2">
|
||||
<a href="/tickets/faq" class="navi-link active">
|
||||
<span class="navi-icon mr-4">
|
||||
<i class="flaticon-book icon-lg"></i>
|
||||
</span>
|
||||
<span class="navi-text font-weight-bolder font-size-lg">База знаний</span>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-xl-8 col-xxl-8">
|
||||
<div class="accordion accordion-solid accordion-toggle-plus" id="accordionExample">
|
||||
<div class="card">
|
||||
<div class="card-header" id="heading3">
|
||||
<div class="card-title collapsed" data-toggle="collapse" role="button" data-target="#collapse3" aria-expanded="false" aria-controls="collapseThree">
|
||||
Ошибка UnknownResponse
|
||||
</div>
|
||||
</div>
|
||||
<div id="collapse3" class="card-body-wrapper collapse" aria-labelledby="heading3" data-parent="#accordionExample" style="">
|
||||
<div class="card-body">
|
||||
<p>
|
||||
Данная ошибка решается переименовыванием сервера английскими буквами.
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="card">
|
||||
<div class="card-header" id="heading4">
|
||||
<div class="card-title collapsed" data-toggle="collapse" role="button" data-target="#collapse4" aria-expanded="false" aria-controls="collapseThree">
|
||||
Информация перед установкой плагинов
|
||||
</div>
|
||||
</div>
|
||||
<div id="collapse4" class="card-body-wrapper collapse" aria-labelledby="heading3" data-parent="#accordionExample" style="">
|
||||
<div class="card-body">
|
||||
<p>
|
||||
1. Устанавливайте только нужные Вам плагины.<br> 2. Слишком большое количество плагинов может вызвать увеличение пинга и лаги.<br> 3. Некоторые сочетания плагинов могут вызвать нестабильную работу сервера.
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="card">
|
||||
<div class="card-header" id="heading5">
|
||||
<div class="card-title collapsed" data-toggle="collapse" role="button" data-target="#collapse5" aria-expanded="false" aria-controls="collapseThree">
|
||||
Статус сервера Unknown
|
||||
</div>
|
||||
</div>
|
||||
<div id="collapse5" class="card-body-wrapper collapse" aria-labelledby="heading3" data-parent="#accordionExample" style="">
|
||||
<div class="card-body">
|
||||
<p>
|
||||
Проверьте наличие плагинов .so для вашего сервера в папке plugins, а также прописаны ли они в настройках сервера.
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="card">
|
||||
<div class="card-header" id="heading6">
|
||||
<div class="card-title collapsed" data-toggle="collapse" role="button" data-target="#collapse6" aria-expanded="false" aria-controls="collapseThree">
|
||||
Не запускается сервер
|
||||
</div>
|
||||
</div>
|
||||
<div id="collapse6" class="card-body-wrapper collapse" aria-labelledby="heading3" data-parent="#accordionExample" style="">
|
||||
<div class="card-body">
|
||||
<p>
|
||||
Прежде чем искать решение проблемы и писать нам в тех.поддержку в первую очередь необходимо выяснить, что за ошибка вам попалась.
|
||||
Для этого вам необходимо посмотреть логи сервера и логи запуска сервера.
|
||||
Это файлы server_log.txt и screenlog. Посмотреть вы их можете через ФТП, например.
|
||||
В эти файлы записываются всё, что сервер отдает в командную строку.
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="card">
|
||||
<div class="card-header" id="heading7">
|
||||
<div class="card-title collapsed" data-toggle="collapse" role="button" data-target="#collapse7" aria-expanded="false" aria-controls="collapseThree">
|
||||
Ручное добавление bind в файл конфигурации
|
||||
</div>
|
||||
</div>
|
||||
<div id="collapse7" class="card-body-wrapper collapse" aria-labelledby="heading3" data-parent="#accordionExample" style="">
|
||||
<div class="card-body">
|
||||
<p>
|
||||
Если получилось так, что вам как-то удалось заменить наш стандартный файл конфигурации на свой, где нет строки bind, или просто удалить эту строку из нашего, то для нормальной работы сервера (да и вообще для любой) стоит эту строку вернуть назад. Ваши действия:
|
||||
Скачать на компьютер файл конфигурации server.cfg
|
||||
Открыть файл в любом текстовом редакторе и добавить в самый конец такую строку:<br>
|
||||
bind<br>
|
||||
Сохранить файл<br>
|
||||
Закачать файл назад по фтп с заменой старого
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="card">
|
||||
<div class="card-header" id="heading8">
|
||||
<div class="card-title collapsed" data-toggle="collapse" role="button" data-target="#collapse8" aria-expanded="false" aria-controls="collapseThree">
|
||||
Файл конфигурации server.cfg (SAMP,CRMP,UNITED)
|
||||
</div>
|
||||
</div>
|
||||
<div id="collapse8" class="card-body-wrapper collapse" aria-labelledby="heading3" data-parent="#accordionExample" style="">
|
||||
<div class="card-body">
|
||||
<p>
|
||||
echo - Все, что стоит после этого параметра - будет выводится в консоль сервера при запуске. Стандартно установлено Executing Server Config...<br>
|
||||
lanmode - Указывает где работает сервер, в интернете или в локальной сети, 0 для интернета. Стандартно значение установлено на 0<br>
|
||||
maxplayers.<br>
|
||||
announce - Включает/выключает отображение сервера в Интернете.<br>
|
||||
port - Порт сервера.<br>
|
||||
hostname - Название вашего сервера.<br>
|
||||
gamemode(n) (N) (t) - Игровой мод<br>
|
||||
weburl - Адрес вашего сайта.<br>
|
||||
rcon_password - RCON пароль сервера.<br>
|
||||
filterscripts (N) - Скрипты<br>
|
||||
plugins (N) - Плагины<br>
|
||||
password (p) - Пароль сервера<br>
|
||||
mapname (m) - Название карты<br>
|
||||
bind - Указывает, на каком IP адресе работает сервер. Запрещено изменять на нашем хостинге.<br>
|
||||
rcon 0/1 - Включает/выключает возможность использования RCON-консоли.<br>
|
||||
maxnpc - Кол-во ботов, которые могут быть использоваться на сервере.<br>
|
||||
onfoot_rate - Технический параметр.<br>
|
||||
incar_rate - Технический параметр.<br>
|
||||
weapon_rate - Технический параметр.<br>
|
||||
stream_distance - Технический параметр.<br>
|
||||
stream_rate - Технический параметр.<br>
|
||||
Какой будет пинг?<br>
|
||||
Проверить пинг и общее качество игрового сервера вы можете на тестовых демо серверах.
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="card">
|
||||
<div class="card-header" id="heading9">
|
||||
<div class="card-title collapsed" data-toggle="collapse" role="button" data-target="#collapse9" aria-expanded="false" aria-controls="collapseThree">
|
||||
Minecraft PE: Мой сервер не запускается и просит выбрать язык, что делать? (Nukkit)
|
||||
</div>
|
||||
</div>
|
||||
<div id="collapse9" class="card-body-wrapper collapse" aria-labelledby="heading9" data-parent="#accordionExample" style="">
|
||||
<div class="card-body">
|
||||
<p>
|
||||
Создайте в корневой директории файл <code>nukkit.yml</code><br>
|
||||
Далее укажите в нем такой параметр:<br><br>
|
||||
<code>language: "rus"</code><br><br>
|
||||
Где rus это язык на котором будет работать сервер.<br><br>
|
||||
Поддерживаемые языки:<br>
|
||||
<code>eng => English</code><br>
|
||||
<code>chs => 中文(简体)</code><br>
|
||||
<code>cht => 中文(繁體)</code><br>
|
||||
<code>jpn => 日本語</code><br>
|
||||
<code>rus => Pyccĸий</code><br>
|
||||
<code>spa => Español</code><br>
|
||||
<code>pol => Polish</code><br>
|
||||
<code>bra => Português-Brasil</code><br>
|
||||
<code>kor => 한국어</code><br>
|
||||
<code>ukr => Українська</code><br>
|
||||
<code>deu => Deutsch</code><br>
|
||||
<code>ltu => Lietuviška</code><br>
|
||||
<code>idn => Indonesia</code><br>
|
||||
<code>cze => Czech</code>
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="card">
|
||||
<div class="card-header" id="heading10">
|
||||
<div class="card-title collapsed" data-toggle="collapse" role="button" data-target="#collapse10" aria-expanded="false" aria-controls="collapseThree">
|
||||
Как подключиться к серверу через ftp?
|
||||
</div>
|
||||
</div>
|
||||
<div id="collapse10" class="card-body-wrapper collapse" aria-labelledby="heading10" data-parent="#accordionExample" style="">
|
||||
<div class="card-body">
|
||||
<p>
|
||||
1. Скачать ftp-клиент, например: FileZilla<br>
|
||||
2. После запуска программы необходимо указать данные от ftp-сервера, их вы получите в управлении вашего игрового сервера, в разделе "FTP Доступ".<br>
|
||||
- в поле хост, введите ip-адрес сервера, с портам (21);<br>
|
||||
- в поле имя пользователя, введите ваш логин от ftp;<br>
|
||||
- в поле пароль, введите ваш пароль от ftp;<br>
|
||||
- поле порт указать "21";<br>
|
||||
3. После ввода данных, нажмите "Быстрое соединение"<br>
|
||||
В правом нижнем углу загрузится структура вашего игрового сервера. Здесь вы можете устанавливать любые плагины и выполнять любые настройки своего игрового сервера.
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="card">
|
||||
<div class="card-header" id="heading11">
|
||||
<div class="card-title collapsed" data-toggle="collapse" role="button" data-target="#collapse11" aria-expanded="false" aria-controls="collapseThree">
|
||||
Что такое купон?
|
||||
</div>
|
||||
</div>
|
||||
<div id="collapse11" class="card-body-wrapper collapse" aria-labelledby="heading3" data-parent="#accordionExample" style="">
|
||||
<div class="card-body">
|
||||
<p>
|
||||
Купон - это код,который вы вводите при заказе сервера,для получения скидки. (Вводить не обязательно).
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="card">
|
||||
<div class="card-header" id="heading11">
|
||||
<div class="card-title collapsed" data-toggle="collapse" role="button" data-target="#collapse12" aria-expanded="false" aria-controls="collapseThree">
|
||||
Как заработать бонусы?
|
||||
</div>
|
||||
</div>
|
||||
<div id="collapse12" class="card-body-wrapper collapse" aria-labelledby="heading12" data-parent="#accordionExample" style="">
|
||||
<div class="card-body">
|
||||
<p>
|
||||
Бонусы можно получить за пополнение баланса.
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="card">
|
||||
<div class="card-header" id="heading13">
|
||||
<div class="card-title collapsed" data-toggle="collapse" role="button" data-target="#collapse13" aria-expanded="false" aria-controls="collapseThree">
|
||||
Через сколько удаляется сервер если его не оплачивать?
|
||||
</div>
|
||||
</div>
|
||||
<div id="collapse13" class="card-body-wrapper collapse" aria-labelledby="heading3" data-parent="#accordionExample" style="">
|
||||
<div class="card-body">
|
||||
<p>
|
||||
Сервер удаляется через 24 часа с момента отключения.
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="card">
|
||||
<div class="card-header" id="heading14">
|
||||
<div class="card-title collapsed" data-toggle="collapse" role="button" data-target="#collapse14" aria-expanded="false" aria-controls="collapseThree">
|
||||
В обязанности службы технической поддержки хостинга входит решение следующих задач
|
||||
</div>
|
||||
</div>
|
||||
<div id="collapse14" class="card-body-wrapper collapse" aria-labelledby="heading3" data-parent="#accordionExample" style="">
|
||||
<div class="card-body">
|
||||
<p>
|
||||
Реагировать на проблемы неработоспособности функций хостинга. Предоставлять необходимую информацию касательно хостинга. Выполнять задачи поставленные клиентом (в случаи если эти задачи невозможно осуществить со стороны клиента, и эти задачи не входят в ряд дополнительных услуг.)
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="card">
|
||||
<div class="card-header" id="heading15">
|
||||
<div class="card-title collapsed" data-toggle="collapse" role="button" data-target="#collapse15" aria-expanded="false" aria-controls="collapseThree">
|
||||
Не входит обязанности службы технической поддержки
|
||||
</div>
|
||||
</div>
|
||||
<div id="collapse15" class="card-body-wrapper collapse" aria-labelledby="heading3" data-parent="#accordionExample" style="">
|
||||
<div class="card-body">
|
||||
<p>
|
||||
Устанавливать и настраивать плагины, моды, звуки, и т.д. даже в том случае, если клиент сам не в состоянии их настроить. Делать за клиента операции, которые может сделать клиент сам через FTP или Панель Управления в дальнейшем сокращёно ПУ Проводить обучение по настройке плагинов, по работе с серверами и другими услугами. Оказывать техподдержку лицам, которые не являются клиентами Хостинга. Проводить обучение по работе с серверами и другими услугами. Отвечать на вопросы которые не имеют отношения к сервисам хостинга.
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="card">
|
||||
<div class="card-header" id="heading16">
|
||||
<div class="card-title collapsed" data-toggle="collapse" role="button" data-target="#collapse16" aria-expanded="false" aria-controls="collapseThree">
|
||||
Важно знать и помнить
|
||||
</div>
|
||||
</div>
|
||||
<div id="collapse16" class="card-body-wrapper collapse" aria-labelledby="heading3" data-parent="#accordionExample" style="">
|
||||
<div class="card-body">
|
||||
<p>
|
||||
Хостинг не отвечает за работоспособность/стабильность Вашего сервера с установленными Вами не стандартных плагинов, карт и других файлов. Мы не несем ответственности за работоспособность сервера при Вашей самостоятельной его настройке, наша задача предоставить Вам выделенный полностью рабочий сервер. Мы не обязаны, исправлять какие либо Ваши ошибки после которых, сервер не запускается или работает нестабильно. Возможно мы сможем помочь Вам в каких-либо вопросах связанных с настройкой, но задавать их нужно во вкладке Тех.Поддержка
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<?php echo $footer ?>
|
||||
@@ -0,0 +1,82 @@
|
||||
<?php
|
||||
/*
|
||||
Copyright (c) 2020 HOSTINPL (HOSTING-RUS) https://vk.com/hosting_rus
|
||||
Developed by Samir Shelenko and Alexander Zemlyanoy (https://vk.com/id00v / https://vk.com/mrsasha082)
|
||||
*/
|
||||
?>
|
||||
<?php echo $header ?>
|
||||
<div class="content d-flex flex-column flex-column-fluid" id="kt_content">
|
||||
<div class="d-flex flex-column-fluid">
|
||||
<div class="container">
|
||||
<div class="row">
|
||||
<div class="col-xl-4 col-xxl-4 mb-4">
|
||||
<div class="card card-custom card-sticky">
|
||||
<div class="card-body px-5">
|
||||
<div class="px-4 mt-4 mb-10">
|
||||
<a href="/tickets/create" class="btn btn-block btn-primary font-weight-bold text-uppercase py-4 px-6 text-center">Написать</a>
|
||||
</div>
|
||||
<div class="navi navi-hover navi-active navi-link-rounded navi-bold navi-icon-center navi-light-icon">
|
||||
<div class="navi-item my-2">
|
||||
<a href="/tickets" class="navi-link active">
|
||||
<span class="navi-icon mr-4">
|
||||
<i class="flaticon-computer icon-lg"></i>
|
||||
</span>
|
||||
<span class="navi-text font-weight-bolder font-size-lg">Мои запросы</span>
|
||||
</a>
|
||||
</div>
|
||||
<div class="navi-item my-2">
|
||||
<a href="/tickets/faq" class="navi-link">
|
||||
<span class="navi-icon mr-4">
|
||||
<i class="flaticon-book icon-lg"></i>
|
||||
</span>
|
||||
<span class="navi-text font-weight-bolder font-size-lg">База знаний</span>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-xl-8 col-xxl-8">
|
||||
<?php foreach($tickets as $item): ?>
|
||||
<div class="card card-custom mb-4">
|
||||
<div class="card-header border-0" style="min-height: 0;padding-top: 0.5rem;padding-bottom: 0.5rem;">
|
||||
<h3 class="card-title"><span class="card-icon">
|
||||
<?php if($item['ticket_status'] == 0): ?>
|
||||
<i class="fa fa-user-lock text-primary" data-toggle="tooltip" data-placement="right" title="" data-original-title="Вопрос закрыт"></i>
|
||||
<?php elseif($item['ticket_status'] == 1): ?>
|
||||
<i class="fa fa-user-clock text-primary" data-toggle="tooltip" data-placement="right" title="" data-original-title="Ваш вопрос рассматривают"></i>
|
||||
<?php elseif($item['ticket_status'] == 2): ?>
|
||||
<i class="fa fa-user text-primary" data-toggle="tooltip" data-placement="right" title="" data-original-title="Ответ от администрации"></i>
|
||||
<?php endif; ?>
|
||||
</span><?php echo $item['ticket_name'] ?><small class="text-muted font-size-sm ml-2"><?php echo date("d.m.Y в H:i", strtotime($item['ticket_date_add'])) ?></small>
|
||||
</h3>
|
||||
<div class="card-toolbar">
|
||||
<a href="/tickets/view/index/<?php echo $item['ticket_id'] ?>" class="btn btn-icon btn-primary mr-2" style="height: 24px;" data-toggle="tooltip" data-placement="right" title="" data-original-title="Перейти" >
|
||||
<i class="fa fa-sign-in-alt"></i>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<?php endforeach; ?>
|
||||
<?php if(empty($tickets)): ?>
|
||||
<div class="alert alert-custom alert-light-primary fade show mb-4" role="alert">
|
||||
<div class="alert-icon">
|
||||
<i class="flaticon-exclamation"></i>
|
||||
</div>
|
||||
<div class="alert-text">На данный момент у вас нет запросов.</div>
|
||||
<div class="alert-close">
|
||||
<button type="button" class="close" data-dismiss="alert" aria-label="Close">
|
||||
<span aria-hidden="true">
|
||||
<i class="ki ki-close"></i>
|
||||
</span>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
<?php echo $pagination ?>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<?php echo $footer ?>
|
||||
@@ -0,0 +1,256 @@
|
||||
<?php
|
||||
/*
|
||||
Copyright (c) 2020 HOSTINPL (HOSTING-RUS) https://vk.com/hosting_rus
|
||||
Developed by Samir Shelenko and Alexander Zemlyanoy (https://vk.com/id00v / https://vk.com/mrsasha082)
|
||||
*/
|
||||
?>
|
||||
<?php echo $header ?>
|
||||
<div class="content d-flex flex-column flex-column-fluid" id="kt_content">
|
||||
<div class="d-flex flex-column-fluid">
|
||||
<div class="container">
|
||||
<div class="row">
|
||||
<div class="col-xl-4 col-xxl-4 mb-4 ">
|
||||
<div class="card card-custom card-sticky">
|
||||
<div class="card-body px-5">
|
||||
<div class="px-4 mt-4 mb-10">
|
||||
<a href="/tickets/create" class="btn btn-block btn-primary font-weight-bold text-uppercase py-4 px-6 text-center">Написать</a>
|
||||
</div>
|
||||
<div class="navi navi-hover navi-active navi-link-rounded navi-bold navi-icon-center navi-light-icon">
|
||||
<div class="navi-item my-2">
|
||||
<a href="/tickets" class="navi-link active">
|
||||
<span class="navi-icon mr-4">
|
||||
<i class="flaticon-computer icon-lg"></i>
|
||||
</span>
|
||||
<span class="navi-text font-weight-bolder font-size-lg">Мои запросы</span>
|
||||
</a>
|
||||
</div>
|
||||
<div class="navi-item my-2">
|
||||
<a href="/tickets/faq" class="navi-link">
|
||||
<span class="navi-icon mr-4">
|
||||
<i class="flaticon-book icon-lg"></i>
|
||||
</span>
|
||||
<span class="navi-text font-weight-bolder font-size-lg">База знаний</span>
|
||||
</a>
|
||||
</div>
|
||||
<hr>
|
||||
<div class="navi-item my-2">
|
||||
<a href="javascript:;" class="navi-link" data-toggle="tooltip" data-placement="right" title="" data-original-title="Тема запроса">
|
||||
<span class="navi-icon mr-4">
|
||||
<i class="flaticon-multimedia-2 icon-lg"></i>
|
||||
</span>
|
||||
<span class="navi-text"><?php echo $ticket['ticket_name'] ?></span>
|
||||
</a>
|
||||
<a href="javascript:;" class="navi-link" data-toggle="tooltip" data-placement="right" title="" data-original-title="Дата запроса">
|
||||
<span class="navi-icon mr-4">
|
||||
<i class="flaticon-calendar icon-lg"></i>
|
||||
</span>
|
||||
<span class="navi-text"><?php echo date("d.m.Y в H:i", strtotime($ticket['ticket_date_add'])) ?></span>
|
||||
</a>
|
||||
<a href="javascript:;" class="navi-link" data-toggle="tooltip" data-placement="right" title="" data-original-title="Статус запроса">
|
||||
<span class="navi-icon mr-4">
|
||||
<i class="flaticon-exclamation icon-lg"></i>
|
||||
</span>
|
||||
<span class="navi-text"><?php if($ticket['ticket_status'] == 0): ?>
|
||||
Запрос закрыт
|
||||
<?php elseif($ticket['ticket_status'] == 1): ?>
|
||||
Запрос открыт
|
||||
<?php elseif($ticket['ticket_status'] == 2): ?>
|
||||
Получен ответ
|
||||
<?php endif; ?></span>
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-xl-8 col-xxl-8">
|
||||
<form id="sendForm" action="" method="POST">
|
||||
<div class="card card-custom card-sticky">
|
||||
<div class="card-header align-items-center px-4 py-3">
|
||||
<div class="text-left flex-grow-1">
|
||||
<div class="dropdown dropdown-inline">
|
||||
<button type="button" class="btn btn-clean btn-sm btn-icon btn-icon-md" data-toggle="tooltip" data-placement="right" title="" data-original-title="Запрос №<?php echo $ticket['ticket_id'] ?>"><i class="fas fa-info-circle"></i>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
<div class="text-center flex-grow-1">
|
||||
<div class="text-dark-75 font-weight-bold font-size-h5">Статус поддержки</div>
|
||||
<div>
|
||||
<?php echo $sup_status ?>
|
||||
</div>
|
||||
</div>
|
||||
<div class="text-right flex-grow-1">
|
||||
<?php if($ticket['ticket_status'] != 0): ?>
|
||||
<button type="button" onClick="sendAction(<?php echo $ticket['ticket_id'] ?>,'closed')" class="btn btn-clean btn-sm btn-icon btn-icon-md" data-toggle="tooltip" data-placement="right" title="" data-original-title="Закрыть запрос">
|
||||
<i class="fa fa-lock"></i>
|
||||
</button>
|
||||
<?elseif($ticket['ticket_status'] == 0):?>
|
||||
<button type="button" class="btn btn-clean btn-sm btn-icon btn-icon-md disabled" data-toggle="tooltip" data-placement="right" title="" data-original-title="Запрос закрыт">
|
||||
<i class="fa fa-lock"></i>
|
||||
</button>
|
||||
<?endif;?>
|
||||
</div>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<div class="scroll scroll-pull" id="scroll" data-scroll="true" style="height: 350px; overflow: auto;" data-mobile-height="300">
|
||||
<div class="messages" id="messagess">
|
||||
<div class="alert alert-primary" role="alert">Получаю сообщения...</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="card-footer align-items-center">
|
||||
<?php if($ticket['ticket_status'] != 0): ?>
|
||||
<input type="text" class="form-control" type="text" id="text" name="text" placeholder="Напишите сообщение...">
|
||||
<?elseif($ticket['ticket_status'] == 0):?>
|
||||
<input type="text" class="form-control" type="text" id="text" name="text" placeholder="Запрос закрыт..." disabled>
|
||||
<?endif;?>
|
||||
<div class="d-flex align-items-center justify-content-between mt-5">
|
||||
<div class="mr-3">
|
||||
<div class="card card-body" style="margin-bottom: 1rem;padding: 1rem;">
|
||||
<div class="form-group" style="margin-bottom: 0rem;">
|
||||
<div class="checkbox-list">
|
||||
<label class="checkbox">
|
||||
<input type="checkbox" checked id="autoscroll">
|
||||
<span></span>Автообновление</label></span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div>
|
||||
<button type="button" class="btn btn-primary btn-icon" data-toggle="modal" data-target="#image"><i class="flaticon2-photo-camera"></i></button>
|
||||
<button class="btn btn-primary btn-icon" type="submit"><i class="flaticon2-paper-plane"></i></button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="modal fade" id="image" tabindex="-1" role="dialog" aria-labelledby="exampleModalLabel" aria-hidden="true">
|
||||
<div class="modal-dialog" role="document">
|
||||
<div class="modal-content">
|
||||
<div class="modal-header">
|
||||
<h5 class="modal-title" id="exampleModalLabel">Импорт изображения</h5>
|
||||
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
|
||||
<i aria-hidden="true" class="ki ki-close"></i>
|
||||
</button>
|
||||
</div>
|
||||
<div class="modal-body">
|
||||
<form id="imgForm" method="POST" action="" style="padding:0px; margin:0px;">
|
||||
<div class="alert alert-primary mb-5 p-5" role="alert">
|
||||
<div class="input-group">
|
||||
<div class="input-group-prepend">
|
||||
<span class="input-group-text">
|
||||
<i class="fas fa-camera text-primary"></i>
|
||||
</span>
|
||||
</div>
|
||||
<input class="form-control" id="file" name="userfile" type="file">
|
||||
<div class="input-group-append">
|
||||
<button type="submit" class="btn btn-light-primary btn-icon"><i class="fa fa-download"></i></button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<script>
|
||||
setInterval(function() {
|
||||
$.ajax({
|
||||
url: "/tickets/view/getMessagess",
|
||||
type: "POST",
|
||||
data: {tid: <?=$ticket['ticket_id']?>},
|
||||
success: function (data) {
|
||||
if (autoscroll.checked == true) {
|
||||
$("#messagess").html(data);
|
||||
var scroll = document.getElementById("scroll");
|
||||
scroll.scrollTop = scroll.scrollHeight;
|
||||
}
|
||||
}
|
||||
})
|
||||
}, 2000);
|
||||
|
||||
$('#imgForm').ajaxForm({
|
||||
url: '/tickets/view/uploadFile/<?php echo $ticket['ticket_id'] ?>',
|
||||
dataType: 'text',
|
||||
success: function(data) {
|
||||
console.log(data);
|
||||
data = $.parseJSON(data);
|
||||
switch(data.status) {
|
||||
case 'error':
|
||||
toastr.error(data.error);
|
||||
$('button[type=submit]').prop('disabled', false);
|
||||
$("#file").val("");
|
||||
break;
|
||||
case 'success':
|
||||
toastr.success(data.success);
|
||||
$('button[type=submit]').prop('disabled', false);
|
||||
$('#image').modal('hide');
|
||||
$("#file").val("");
|
||||
break;
|
||||
}
|
||||
},
|
||||
beforeSubmit: function(arr, $form, options) {
|
||||
$('button[type=submit]').prop('disabled', true);
|
||||
}
|
||||
});
|
||||
|
||||
$('#sendForm').ajaxForm({
|
||||
url: '/tickets/view/ajax/<?php echo $ticket['ticket_id'] ?>',
|
||||
dataType: 'text',
|
||||
success: function(data) {
|
||||
console.log(data);
|
||||
data = $.parseJSON(data);
|
||||
switch(data.status) {
|
||||
case 'error':
|
||||
toastr.error(data.error);
|
||||
$('button[type=submit]').prop('disabled', false);
|
||||
break;
|
||||
case 'success':
|
||||
toastr.success(data.success);
|
||||
$('button[type=submit]').prop('disabled', false);
|
||||
$('#text').val('');
|
||||
break;
|
||||
}
|
||||
},
|
||||
beforeSubmit: function(arr, $form, options) {
|
||||
$('button[type=submit]').prop('disabled', true);
|
||||
}
|
||||
});
|
||||
|
||||
function sendAction(ticketid, action) {
|
||||
switch(action) {
|
||||
case "closed":
|
||||
{
|
||||
if(!confirm("Вы уверенны в том, что хотите закрыть запрос?")) return;
|
||||
break;
|
||||
}
|
||||
}
|
||||
$.ajax({
|
||||
url: '/tickets/view/action/'+ticketid+'/'+action,
|
||||
dataType: 'text',
|
||||
success: function(data) {
|
||||
console.log(data);
|
||||
data = $.parseJSON(data);
|
||||
switch(data.status) {
|
||||
case 'error':
|
||||
toastr.error(data.error);
|
||||
$('#controlBtns button').prop('disabled', false);
|
||||
break;
|
||||
case 'success':
|
||||
toastr.success(data.success);
|
||||
setTimeout("reload()", 1500);
|
||||
break;
|
||||
}
|
||||
},
|
||||
beforeSend: function(arr, options) {
|
||||
if(action == "closed") toastr.warning("Закрываем запрос...");
|
||||
$('#controlBtns button').prop('disabled', true);
|
||||
}
|
||||
});
|
||||
}
|
||||
</script>
|
||||
<?php echo $footer ?>
|
||||
Reference in New Issue
Block a user