Разработка компонента Льготы пользователей для открытого института

Оглавление

Реферат

Требуется функционал, определяющий льготное обучение пользователям открытого института.

Использовать только назначенные виды документов:

  • Удостоверение ветерана боевых действий
  • Справка об инвалидности
  • Справка о полном государственном обеспечении (для детей-сирот)
  • Диплом призера этапа всероссийской олимпиады школьников
  • Удостоверение к государственной награде Российской Федерации
  • Удостоверение к медали «За особые успехи в учении»

К документу, помимо скана самого документа, требуется дополнительная информация:

  • Кем выдан документ
  • Дата выдачи
  • Почтовый адрес организации, выдавшей документ

Тек же необходим служебный раздел с информацией о запросе действительности документа:

  • Запрос отправлен
  • Файл ответа

Использовать стек следующих технологий:

  • Операционная система: ubuntu
  • Сервер: apache
  • Языки программирования: php, js, sql
  • База данных: MySQL
  • Дополнительные библиотеки: jquery, bootstrap

Документы-основания для социальной и (или) академической льгот

Право на предоставление льготы имеют:

  • Ветераны боевых действий;
  • Граждане с установленной инвалидностью;
  • Дети сироты;
  • Призеры этапов всероссийской олимпиады школьников;
  • Лица, имеющие государственные награды;
  • Обладатели медали «За отличие в учении»;

Льготы вступают в силу после получения положительного ответа на запрос о подтверждении факта выдачи документа, являющегося основанием для их предоставления.

Для начала процесса оформления льготы, приложите скан подтверждающего документа и заполните о нем соответствующие сведения. Институт отправит запрос. В том случае, если ответ не поступит в установленные сроки, вам необходимо будет подтвердить статус справкой о выдаче соответствующего документа-основания.


База данных

MySQL 5.7

Таблицы

Льготы для обучающихся

Хранятся названия возможных оснований для льгот

SQL запрос
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 запрос
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 DEFAULT0’ COMMENT ‘Статус документа (проверен, на модерации, отклонен)’,
  u_privilege_sale int(11) NOT NULL DEFAULT0’ 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 запрос
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 пользователя в переменной системы

Получить из базы данных льготу пользователя:

PHP
$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 вёрстка кнопки загрузки выглядит следующим образом:

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

При нажатии на кнопку Открыть происходят следующие события:

  1. Данные обрабатывает js функция и при помощи ajax передаёт данные на сервер
  2. На сервере php обработчик сохраняет файлы на сервер и создаёт записи в базе данных.
  3. У пользователя обновляется блок Льготы

JS функция обработчик

По событию изменения поля ввода id users_privileges создать функцию обработчик файлов.

JavaScript
$(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({ … });
});
JavaScript

Ajax отправка данных на сервер:

JavaScript
$.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 );

Обработка данных на сервере:

PHP
// Задать переменную под массив ошибок
$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 вёрстка формы:

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. Необходимо заполнить все поля формы, чтобы кнопка разблокировалась.