1 2 3 4 5 6 7 Ім'я файлу: 2 diplom - гаврилов.doc Розширення: doc Розмір: 1001кб. Дата: 28.11.2021 скачати Пов'язані файли: магіст-Данещук-фініш-АПДЕЙТ.docx 2.6 Опис структури програмиРозробка дипломного проекту проходила з використанням, Java, фраємворка для веб-розробок Grails та системи управління базами даних MySQL. Інсталяція компонентів Для роботи Java-програм потрібно встановити JDK – безкоштовно розповсюджуваний комплект застосунків на мові Java. MySQL дуже простий в інсталяції. Для цього потрібно завантажити з офіційного сайту mysql- сервер. Для Grails потрібно завантажити і запустити на виконання інсталяційний пакет та прописати в «environment variable» змінну «GRAILS_HOME ». Після цих дій Grails готовий для використання. Створення каркасу програми Для створення програми в середовищі Grails потрібно ввести: grails create-app jdbview Grails створить структуру файлів та каталогів, яка буде виглядати таким чином (Рис. 5). Рис. 5 Головні каталоги conf – містить налаштування програми, з’єднання з базою даних та фільтри; controlles – каталог в якому містяться класи які будуть опрацьовувати дії користувачів та відповіді на запити з браузера; domain – містить класи які еквівалентні назвам таблиць та їх структури в базі даних; services – допоміжні класи для виконання конкретних задач які доступні в будь-якому місті програми; taglib – допоміжний клас, методи якого можуть бути використанні в «views»; views – каталог містить файли типу *.gsp еквівалентні *.jsp. Вони використовуються для відображення та введення інформації у вікні браузера. Conf В цьому каталозі створено клас SecurityFilters, який відповідає за забезпечення надійності несанкціонованого доступу до ресурсів програми: def filters = { all(controller:'*', action:'*') { before = { def settings = App_settings.findById(1) boolean installed = true if(settings == null){ installed = false }else{ if(!settings.installed){ installed = false } } if(installed){ if(!session.user && !actionName.equals('login') && !actionName.equals('not_found')){ redirect(controller:'user', action: 'login') return false } }else{ if(!actionName.equals('install')){ redirect(controller:'settings', action:'install') return false } } } А також відредаговано клас UrlMappings, в якому містяться правила посилань в запиті типу «GET»: "/"{ controller = 'manager' action = 'index' } "/login"{ controller = 'user' action = 'login' } "/logout"{ controller = 'user' action = 'logout' } "/account"{ controller = 'user' action = 'account' } "/settings"{ controller = 'settings' action = 'index' } "/install"{ controller = 'settings' action = 'install' } "500"(view:'/error') "404"(controller:'error', action:'not_found') Сontrolles Можна сказати головний каталог вякому відбувається аналіз запитів користувача та виконання відповідних дії. В ньому створено 4 сласи: ErrorController; ManagerController; SettingsController; UserController. ErrorController – цей клас відповідає за обробку помилок які можуть статися при неправильному використанні програми. Він містить not_found, sql_error методи для обробки неправильного URL- адресу та помилок які можуть статись при некоректному запиті до MySQL відповідно. Приклад метода обробки неправильного URL- адресу: def not_found = { def url = [request.'javax.servlet.error.request_uri'] flash.message = message(code:'default.message.404', args:url) } ManagerController – являється головним класом в якому знаходяться методи що використовуються для менеджерування баз даних. Доцьго класа також підключено два сервіса MySQLService і UserService, які будуть розглянуті пізніше. Приклад метода створення нової бази даних: def create_db = { if(request.method == 'POST' && !params.db_name.empty){ String db_name = params.db_name List db_info = [db_name] String db_character = params.db_character String db_collate = params.db_collate boolean new_db = MySQLService.create_db(db_name,db_character,db_collate) if(new_db){ log.info("[ ${UserService.current_user_name()} ] CREATE DB -${db_name}-") flash.message = message(code:"default.db_create.success", args:db_info) }else{ flash.message = message(code:"default.db_create.fail") } } redirect(controller:'manager', action:'index') } SettingsController – містить логіку яка керує налаштуваннями з’єднання до сервера MySQL, та курує процедурою інсталяції програми. Приклад метода, який відповідає за інсталяцію: def install = { if(request.method == 'POST'){ def settings = new App_settings() settings.installed = true settings.mysql_host = params.host.toString().trim() settings.mysql_port = params.port.toString().trim() settings.mysql_login = params.login.toString().trim() settings.mysql_password = params.password.toString().trim() settings.save() def user = new User() user.admin = true user.name = params.u_name.toString().trim() String password = params.u_password.toString().trim() String passwordHash = password.encodeAsMD5() user.password = passwordHash user.email = params.u_email user.save() def access = new Access_level() access.user_id = 1 access.create_db = true access.delete_db = true access.create_table = true access.delete_table = true access.alter_table = true access.add_row = true access.edit_row = true access.delete_row = true access.users_manager = true access.app_manager = true access.save() flash.message = message(code:"default.settings.install") redirect(controller:'manager', action:'index') } } UserController – відповідає за «вхід», «вихід» з програми, а також дозволяє переглянути користувачів, подивитись їх статуси, видалити чи додати нового, відредагувати рівень доступу. Приклад метода, який керує логінізацією: def login = { if(session.user_id != null){ redirect(controller:'manager', action:'index') }else { if(request.method == 'POST'){ String name = params.name.trim() String password = params.password.trim() if(name.size() < 1 || password.size() < 1 ){ flash.message = message(code:"default.message.login.blank") }else{ String passwordHash = password.encodeAsMD5() def user = User.findWhere(name: name, password: passwordHash) if(user == null){ flash.message = message(code:"default.message.login.false") }else{ session.user = name session.user_id = user.id user.online = true user.save() log.info("[ ${name} ] LOGIN") flash.message = message(code:"default.message.login.success") redirect(controller: 'manager', action:'index') } } } } } Domain В каталозі domain містяться класи які відповідають за структуру таблиць в базі 11SQLite, яка використовується для зберігання малої кількості даних, які потрібні для роботи програми. Приклад класу створення таблиці користувачів: class User { String name String password String email boolean online = false boolean admin = false String added = new Date().format('HH:mm:ss MM/dd/yyyy') static constraints = { name(size:3..20, unique: true) password(blank: false) email(unique: true, email: true) admin(nullable: true) } } Services Каталог services містить два класи MySQLService та UserService. Клас MySQLService являє собою інтерфейс для динамічних з’єднань з базами даних MySQL. Таки спосіб дозволяє робити MySQL запити в будь-який час та в будь-якому місті передаючи тільки параметри конкретному методу не потребуючи повторного введення MySQL команд. Наприклад, щоб показати всі таблиці в конкретній базі даних потрібно викликати метод класу MySQLService з відповідними параметрами: List tables = MySQLService.get_tables(db) де db – ім’я бази даних. Приклад метода, який повертає всі таблиці, які знаходяться у відповідній базі даних: def get_tables(String db){ def sql = connect() boolean use = sql.execute("USE "+db.trim()) List results = sql.rows("SHOW TABLES") return results } Клас UserService містить методи які повертають конкретну запитану інформацію. Наприклад щоб отримати ім’я поточного користувача не потрібно залазити в сесію і потім витягувати ім’я по індифікатору, достатньо викликати відповідний метод класу UserService: String name = UserService.current_user_name() Taglib Taglib це аналог services тільки методи які визначені в його класах можливо використовувати в *.gsp сторінках у вигляді тегів. Наприклад для динамічного підрахунку кількості таблиць в базах даних потрібно використати тег: метод якого реалізовано в класі HelperTagLib під назвою «get_tables_count». Views В цьому каталозі розміщено сторінки які використовуються для надання користувацького інтерфейсу при відкритті браузером. Крім стандартної HTML розмітки тут використовуються спеціальні g- теги, для виконання операцій розгалуження чи циклу, вставки шаблонів або генерування розмітки, яка при відображенні буде замінена на еквівалентні HTML теги. Приклад сторінки відображення списку доступних баз даних: ${db} - ${count} id='active' > 1 2 3 4 5 6 7 |