Разработка компонента Льготы пользователей для открытого института
Оглавление
- Реферат
- Документы-основания для социальной и (или) академической льгот
- База данных
- Публичное использование
Реферат
Требуется функционал, определяющий льготное обучение пользователям открытого института.
Использовать только назначенные виды документов:
- Удостоверение ветерана боевых действий
- Справка об инвалидности
- Справка о полном государственном обеспечении (для детей-сирот)
- Диплом призера этапа всероссийской олимпиады школьников
- Удостоверение к государственной награде Российской Федерации
- Удостоверение к медали «За особые успехи в учении»
К документу, помимо скана самого документа, требуется дополнительная информация:
- Кем выдан документ
- Дата выдачи
- Почтовый адрес организации, выдавшей документ
Тек же необходим служебный раздел с информацией о запросе действительности документа:
- Запрос отправлен
- Файл ответа
Использовать стек следующих технологий:
- Операционная система: ubuntu
- Сервер: apache
- Языки программирования: php, js, sql
- База данных: MySQL
- Дополнительные библиотеки: jquery, bootstrap
Документы-основания для социальной и (или) академической льгот
Право на предоставление льготы имеют:
- Ветераны боевых действий;
- Граждане с установленной инвалидностью;
- Дети сироты;
- Призеры этапов всероссийской олимпиады школьников;
- Лица, имеющие государственные награды;
- Обладатели медали «За отличие в учении»;
Льготы вступают в силу после получения положительного ответа на запрос о подтверждении факта выдачи документа, являющегося основанием для их предоставления.
Для начала процесса оформления льготы, приложите скан подтверждающего документа и заполните о нем соответствующие сведения. Институт отправит запрос. В том случае, если ответ не поступит в установленные сроки, вам необходимо будет подтвердить статус справкой о выдаче соответствующего документа-основания.
База данных
MySQL 5.7
Таблицы
Льготы для обучающихся
Хранятся названия возможных оснований для льгот
SQL запрос
CREATE TABLE privileges (
privilege_id int(11) NOT NULL AUTO_INCREMENT COMMENT 'ID льготы',
privilege_name varchar(255) NOT NULL COMMENT 'Название льготы',
privilege_publish enum('n','y') NOT NULL DEFAULT 'n' COMMENT 'Состояние',
PRIMARY KEY (privilege_id)
) ENGINE=InnoDB AUTO_INCREMENT DEFAULT CHARSET=utf8 COMMENT='Льготы для обучающихся';
SQLПервичные данные
privilege_id | privilege_name | privilege_publish |
---|---|---|
1 | Удостоверение ветерана боевых действий | y |
2 | Справка об инвалидности | y |
3 | Справка о полном государственном обеспечении (для детей-сирот) | y |
4 | Диплом призера этапа всероссийской олимпиады школьников | y |
5 | Удостоверение к государственной награде Российской Федерации | y |
6 | Удостоверение к медали «За особые успехи в учении» | y |
Льготы пользователей
Хранятся записи льгот у пользователей.
SQL запрос
CREATE TABLE users_privileges (
u_privilege_id int(11) NOT NULL AUTO_INCREMENT COMMENT ‘ID льготы’,
user_id int(11) DEFAULT NULL COMMENT ‘ID пользователя’,
privilege_id int(11) DEFAULT NULL COMMENT ‘ID льготы’,
u_privilege_check int(1) NOT NULL DEFAULT ‘0’ COMMENT ‘Статус документа (проверен, на модерации, отклонен)’,
u_privilege_sale int(11) NOT NULL DEFAULT ‘0’ COMMENT ‘Размер скидки’,
u_privilege_check_user int(11) DEFAULT NULL COMMENT ‘Добавил пользователь’,
u_privilege_comment text NOT NULL COMMENT ‘Комментарий к скидке’,
u_privilege_check_date datetime DEFAULT NULL COMMENT ‘Дата проверки’,
PRIMARY KEY (u_privilege_id),
UNIQUE KEY user_id_2 (user_id),
KEY user_id (user_id),
KEY u_privilege_check_user (u_privilege_check_user),
KEY privilege_id (privilege_id),
CONSTRAINT users_privileges_ibfk_1 FOREIGN KEY (user_id) REFERENCES users (user_id) ON DELETE SET NULL ON UPDATE CASCADE,
CONSTRAINT users_privileges_ibfk_2 FOREIGN KEY (u_privilege_check_user) REFERENCES users (user_id) ON DELETE SET NULL ON UPDATE CASCADE,
CONSTRAINT users_privileges_ibfk_3 FOREIGN KEY (privilege_id) REFERENCES privileges (privilege_id) ON DELETE SET NULL ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT DEFAULT CHARSET=utf8 COMMENT=‘Льготы пользователей’;
SQLФайлы льгот пользователей
Хранятся записи путей до файлов льгот.
SQL запрос
CREATE TABLE u_privilege_files (
up_file_id int(11) NOT NULL AUTO_INCREMENT COMMENT ‘ID файла льготы’,
u_privilege_id int(11) DEFAULT NULL COMMENT ‘ID льготы’,
up_file text NOT NULL COMMENT ‘Ссылка на файл’,
up_file_date_add datetime NOT NULL COMMENT ‘Дата добавления документа’,
PRIMARY KEY (up_file_id),
KEY u_privilege_id (u_privilege_id),
CONSTRAINT u_privilege_files_ibfk_1 FOREIGN KEY (u_privilege_id) REFERENCES users_privileges (u_privilege_id) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT DEFAULT CHARSET=utf8 COMMENT=‘Ссылки на льготные документы’;
SQLПубличное использование
Блок в личном кабинете
В личном кабинете пользователя создать блок “Основания для льгот”.
В начале содержимого добавить Руководство пользователя
Для вывода данных в блок воспользоваться известными переменными:
- $_COOKIE[“id”] — ID пользователя в куках
- $user_id — ID пользователя в переменной системы
Получить из базы данных льготу пользователя:
$users_privileges = mysql_query("SELECT
users_privileges.u_privilege_id,
users_privileges.u_privilege_sale,
users_privileges.u_privilege_check_user,
users_privileges.u_privilege_comment,
users_privileges.u_privilege_check_date
FROM users_privileges
WHERE users_privileges.user_id = ". $user_id ."
LIMIT 1" );
$users_privilege = mysql_fetch_assoc( $users_privileges );
PHPЕсли в БД нет записи о льготе
Если в базе данных запись со льготой пользователя не найдена (не создана),
Вывести пользователю возможность загрузить отсканированный или сфотографированный документ.
Рис.: Внешний вид блока при отсутствии записи о льготе в базе данных
Добавление документа
При нажатии на ссылку Добавить документ вызывается диалоговое окно с выбором файла для загрузки.
Рис.: Диалоговое окно с выбором файла для загрузки.
Пользователь может выбрать один или несколько файлов для загрузки. К выбору допускаются только файлы изображений, указанных в accept
HTML вёрстка кнопки загрузки выглядит следующим образом:
<input type=«file» id=«users_privileges» multiple=«multiple» accept=«image/*» data-user-id=«<?php echo $user_id; ?>» style=«display: none;» />
<div class=«small text-gray»>К рассмотрению допускаются документы в формате .jpg, .jpeg, .png, .gif</div>
<label for=«users_privileges» class=«btn btn-white a-link»>Добавить документ</label>
HTMLПри нажатии на кнопку Открыть происходят следующие события:
- Данные обрабатывает js функция и при помощи ajax передаёт данные на сервер
- На сервере php обработчик сохраняет файлы на сервер и создаёт записи в базе данных.
- У пользователя обновляется блок Льготы
JS функция обработчик
По событию изменения поля ввода id users_privileges создать функцию обработчик файлов.
$(document).on(‘change’, ‘#users_privileges’, function(event){
// Создать константу files и записать в неё массив файлов из поля ввода
const files = this.files;
// Создать константу userId и записать в неё значение атрибута data-user-id из поля ввода
const userId = $(this).attr(‘data-user-id’);
// Остановить всплытие события
event.stopPropagation();
// Отменить действие события по умолчанию
event.preventDefault();
// Если файлы не выбраны
if( typeof files == ‘undefined’ ) {
// остановить выполнение скрипта
return;
}
// Создать переменную get_data и записать в неё экземпляр класса FormData()
let get_data = new FormData();
// Добавить в массив get_data поле show со значением setUserPrivilegesFiles
get_data.append( ‘show’, ‘setUserPrivilegesFiles’ );
// Добавить в массив get_data поле user_id со значением userId
get_data.append( ‘user_id’, userId );
// Передать массив файлов в цикл
$.each( files, function( key, value ){
// Добавить файл в массив get_data
get_data.append( key, value );
});
// При помощи ajax отправить get_data на сервер
$.ajax({ … });
});
JavaScriptAjax отправка данных на сервер:
$.ajax({
url: ‘/components/users/ajax.php’,
type: ‘POST’,
data: get_data,
cache: false,
dataType: ‘json’,
processData: false,
contentType: false,
beforeSend: function() {
$.each( files, function( key, value ){
// loader
});
},
success: function( respond, status, jqXHR ){
if( typeof respond.error === ‘undefined’ ){
getBoxUserPrivileges( userId );
} else {
console.log(‘ОШИБКА: ‘ + respond.error );
}
},
error: function( jqXHR, status, errorThrown ){
console.log( ‘ОШИБКА AJAX запроса: ‘ + status, jqXHR );
}
});
JavaScriptгде
- url — путь к файлу обработчику на сервере
- type — метод передачи данных
- data — данные
- dataType — формат данных
При завершению загрузки обновить блок Льготы
getBoxUserPrivileges( userId );
Обработка данных на сервере:
// Задать переменную под массив ошибок
$err = [];
// Получить заданный ID пользователя
$user_id = $_POST[«user_id»];
// Получить файлы к загрузке
$files = $_FILES;
// Указать путь к директории для загрузки файла
$uploaddir = ‘/images/users-privileges/’;
// Если директория не найдена, создать её
if( ! is_dir( $_SERVER[«DOCUMENT_ROOT»] . $uploaddir ) ) mkdir( $_SERVER[«DOCUMENT_ROOT»] . $uploaddir, 0700 );
// Создать переменную под массив с результатом
$response = [];
// Создать переменную под ID записи о льготе
$u_privilege_id = 0;
// Если ID пользователя не пуст И ID пользователя является числом ID пользователя > 0
if( !empty( $user_id ) && is_numeric( $user_id ) && $user_id > 0 ) {
// По ID пользователя получить из базы данных MySQL ID запись о льготе
$u_privileges = mysql_query(«SELECT u_privilege_id FROM users_privileges WHERE user_id = «. $user_id .» LIMIT 1″);
// Если запись о льготе в базе данных найдена
if( mysql_num_rows( $u_privileges ) > 0 ) {
// Получить результат в виде массива из базы данных и сохранить его в переменную
$u_privilege = mysql_fetch_assoc( $u_privileges );
// Присвоить найденную ID запись о льготе
$u_privilege_id = $u_privilege[«u_privilege_id»];
// Иначе запись о льготе в базе данных отсутствует
} else {
// Если удалось создать запись в базе данных
if ( mysql_query(«INSERT INTO users_privileges (user_id) VALUES (‘» . $user_id . «‘)») ) {
// Присвоить созданную ID запись о льготе
$u_privilege_id = mysql_insert_id();
// Иначе не удалось создать запись в базе данных
} else {
// Добавить ошибку в массив ошибок
$err[] = ‘Ошибка при создании записи в базе данных: ‘. mysql_error();
}
}
// Иначе ID пользователя не прошёл условие
} else {
// Добавить ошибку в массив ошибок
$err[] = ‘Пользователь не найден’;
}
// Передать в цикл массив полученных к загрузке файлов
foreach( $files as $file ){
// Создать переменную для имени файла и сформировать имя по структуре
$file_name = $user_id . «-« . random_string(6, «lower,upper,numbers») . «-« . cyrillic_translit( $file[‘name’] );
// Если длина строки имени файла больше 20
if( strlen( $file_name ) > 20 ) {
// Оставить только 16 символов с начала строки и добавить расширение
$file_name = substr( $file_name, 0, 16 ) .‘.’. pathinfo( $file_name, PATHINFO_EXTENSION );
}
// Если файл на сервер загрузился
if( move_uploaded_file( $file[‘tmp_name’], $_SERVER[«DOCUMENT_ROOT»] . $uploaddir . $file_name ) ){
// Сформировать данные для запись в БД
$privilege_file = $uploaddir . $file_name;
// Если записать в базу данных удалось
if( mysql_query(«INSERT INTO u_privilege_files (
u_privilege_id,
up_file,
up_file_date_add
) VALUES (
‘». $u_privilege_id .«‘,
‘». $privilege_file .«‘,
NOW()
)») ) {
// Записать в массив результата
$up_file_id = mysql_insert_id();
$response[] = $privilege_file;
// Иначе создать запись в базе данных не удалось
} else {
// Добавить ошибку в массив ошибок
$err[] = ‘Не удалось создать запись в базе данных: ‘. mysql_error();
}
}
}
$data = $response ? [‘files’ => $response] : [‘error’ => $err];
die( json_encode( $data ) );
PHPЕсли есть запись о льготе в базе данных
Если запись о льготе в базе данных о статусе Новый, вывести пользователю форму заполнения информации о льготе:
Поля формы
- Скрытые поля:
- u_privilege_id — ID записи в базе данных
- u_privilege_check — Новый статус при сохранении формы
- Обязательные к заполнению:
- privilege_id — Основание. Выбор из списка. Получить из базы данных список опубликованных оснований.
- u_privilege_doc_issued — Кем выдан документ. Текстовое поле
- u_privilege_doc_date — Дата выдачи документа. Выбор даты
- u_privilege_doc_company_adress — Адрес организации, выдавшей документ. Текстовое поле
HTML вёрстка формы:
<form id=«formUserPrivilegeEdit» action=«javascript:void(null);» onsubmit=«callUserPrivilegeEdit()»>
<div class=»box—body«>
<h4 class=»box—title«>Информация о документе</h4>
<p class=»small text—gray«>* все поля обязательны к заполнению.</p>
<input type=»hidden» name=»u_privilege_id» value=»‘. $u_privilege_id .'» />
<input type=»hidden» name=»u_privilege_check» value=»на проверке» />
$privileges = mysql_query(«SELECT privilege_id, privilege_name FROM privileges WHERE privilege_publish = ‘y‘» );
<div class=»form—group«>
<select class=»form—control» name=»privilege_id» required>
<option value=»»>Выберите основание</option>’;
while( $privilege = mysql_fetch_assoc( $privileges ) ) {
$selected = »;
if( $privilege_id[«privilege_id»] == $privilege_id ) $selected = ‘selected’;
<option value=«‘. $privilege[«privilege_id«] .'» ‘. $selected .’>‘. $privilege[«privilege_name»] .’</option>
}
</select>
</div>
<div class=»form—group«>
<label>Кем выдан документ (название организации) *</label>
<input type=»text» class=»form—control» name=»u_privilege_doc_issued» value=»‘. $u_privilege_doc_issued .'» required />
</div>
<div class=»form—group«>
<label>Дата выдачи *</label>
<input type=»date» class=»form—control» name=»u_privilege_doc_date» value=»‘. $u_privilege_doc_date .'» required />
</div>
<div class=»form—group«>
<label>Почтовый адрес организации, выдавшей документ *</label>
<textarea class=»form—control» name=»u_privilege_doc_company_adress» required>’. $u_privilege_doc_company_adress .'</textarea>
</div>
</div>
<div class=»box—footer clearfix«>
<button type=»submit» class=»btn btn—default btn—sm disabled pull—right«>Отправить на проверку</button>
</div>
</form>
HTMLПо умолчанию кнопка Отправить на проверку заблокирована при помощи атрибута disabled. Необходимо заполнить все поля формы, чтобы кнопка разблокировалась.