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' >${tab[0]}

















1   2   3   4   5   6   7

скачати

© Усі права захищені
написати до нас