Файл: Методика защиты информации в системах электронного документооборота (Выбор программных средств разработки).pdf
Добавлен: 25.04.2023
Просмотров: 159
Скачиваний: 2
Рисунок 4.2.4 – Шаблоны приложения document_cards Приложение document_cards содержит следующие шаблоны:
- document_card – отображение страницы просмотра карты документа;
- create_document – отображение страницы создания карты документа;
- edit_document_card – отображение страницы редактирования карты документа.
Шаблон document_card.html представлен в приложении Г.
Одна из сильных сторон Django – это автоматический интерфейс администратора. Он использует мета-данные модели, чтобы предоставить многофункциональный, готовый к использованию интерфейс для работы с содержимым сайта. Для настройки интерфейса администратора было установлено приложение Django-admin-tools, модифицирующее работу стандартной админки. Так же весь проект был настроен на русский язык, в файле settings.py, в моделях и в файле admin.py были созданы специальные классы, для настройки.
Результаты разработки в виде интерфейса пользователя представлены в приложении Г.
ЗАКЛЮЧЕНИЕ
В результате выполнения работы было реализовано веб-приложение для электронного документооборота с повышенным уровнем безопасности.
Таким образом, поставленные задачи работы успешно выполнены, цель достигнута. В дальнейшем планируется осуществление сопровождения системы: взаимодействие с пользователями для консультирования по вопросам эксплуатации системы, сбору требований по модификациям и доработкам системы, а так же реализация соответствующих модификаций и доработок.
В ходе данной работы были выполнены следующие работы:
- Изучена предметная область;
- Исследованы аналогичные системы;
- Разработано техническое задание на создание системы;
- Спроектирован пользовательский интерфейс;
- Спроектирована архитектура системы;
- Спроектирована база данных;
- Реализован функционал системы.
На данный момент система находится в стадии эксплуатационного тестирования.
СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ
- Двухфакторная аутентификация: что это и зачем оно нужно [Электронный ресурс]/ Kaspersky. Режим доступа: https://www.kaspersky.ru/blog/what_is_two_factor_authenticatio/4272/. Дата обращения: 03.06.18г.
- Применение двухэтапной аутентификации для повышения безопасности пользователей информационных систем / Палютина Г. Н. // Фундаментальные и прикладные научные исследования. – 2015. – 91-95 с. Дата обращения: 05.06.18г.
- Выбираем решение для персонального файлохранилища [Электронный ресурс]/ xakep.ru. Режим доступа: https://xakep.ru/2014/09/04/personal-cloud-storage-review/. Дата обращения: 07.06.18г.
- Nextcloud [Электронный ресурс]/ Национальная библиотека им. Н. Э. Баумана. Режим доступа: https://ru.bmstu.wiki/Nextcloud. Дата обращения: 15.06.18г.
- Пять недорогих Open Source-сервисов хранения для предприятий [Электронный ресурс]/ itWeek. Режим доступа: https://www.itweek.ru/foss/article/detail.php?ID=177233. Дата обращения: 04.06.18г.
- Поиск облачных сервисов для бизнеса и личной продуктивности, сравнение характеристик и цен [Электронный ресурс]/ Режим доступа: https://startpack.ru/. Дата обращения: 17.06.18г.
- А вы защищаете свои аккаунты двухфакторной или двухэтапной аутентификацией? [Электронный ресурс]/ Блог Вадима Стеркина. Режим доступа: http://www.outsidethebox.ms/18372/. Дата обращения: 14.06.18г.
- PHP vs Python vs Ruby для разработки веб-приложений: подробное сравнение [Электронный ресурс]/ Режим доступа: https://8d9.ru/php-vs-python-
vs-ruby-dlya-razrabotki-veb-prilozhenij-podrobnoe-sravnenie. Дата обращения: 15.06.18г.
- Programming python / Lutz M. – O'Reilly, 1996. – Т. 8. Дата обращения: 12.06.18г.
- SQLite vs MySQL vs PostgreSQL: сравнение систем управления базами данных [Электронный ресурс]/ Режим доступа: http://devacademy.ru/posts/sqlite-vs-mysql-vs-postgresql/. Дата обращения: 03.06.18г.
- Beginning Databases with PostgreSQL / Matthew N., Stones R. – Apress, 2005. Дата обращения: 12.06.18г.
- PostgreSQL [Электронный ресурс]/ Википедия – свободная энциклопедия. Режим доступа: https://ru.wikipedia.org/wiki/PostgreSQL. Дата обращения: 15.06.18г.
- PostgreSQL: introduction and concepts / Momjian B. – New York : Addison-Wesley, 2001. – Т. 192. Дата обращения: 17.06.18г.
- Django – фреймворк на Python [Электронный ресурс]/ Web creator. Режим доступа: https://web-creator.ru/articles/django. Дата обращения: 09.06.18г.
- Python web development with Django / Forcier J., Bissex P., Chun W. J.
– Addison-Wesley Professional, 2008. Дата обращения: 05.06.18г.
- Базы данных в Python [Электронный ресурс]/ Сообщество программистов Python. Режим доступа: https://python-scripts.com/database. Дата обращения: 14.06.18г.
- Часть 4. Python/Django и Hello World. Структура проекта Django и создание приложений [Электронный ресурс]/ Blog WebSofter, Режим доступа: http://blog.websofter.ru/chast-4-pythondjango-i-hello-world-structura-django-i- sozdanie-prilogheniy/ Дата обращения: 12.06.18г.
- Создаѐм своѐ первое приложение с Django, часть 1 [Электронный ресурс]/ Документация Django 1.9, Режим доступа: https://djbook.ru/rel1.9/intro/tutorial01.html. Дата обращения: 15.06.18г.
Требования к интерфейсу пользователя
Рисунок А.1 – Эскиз начальной страницы
Рисунок А.2 – Эскиз страницы ввода кода
Рисунок А.3 – Эскиз окна с ошибкой
Рисунок А.4 – Окно с сообщением о неработоспособности кода
Рисунок А.5 – Эскиз меню пользователя
Рисунок А.6 – Эскиз страницы смены пароля
Рисунок А.7 – Эскиз страницы просмотра категории
Рисунок А.8 – Эскиз страницы просмотра карты документа
Рисунок А.9 – Эскиз страницы создания категории
Рисунок А.10 – Эскиз страницы создания карты документа
Рисунок А.11 – Эскиз страницы редактирования категории
Рисунок А.12 – Эскиз страницы редактирования карты документа
Схема базы данных
Примеры шаблонов
Шаблон menu.html:
{% extends 'bootstrap3.html' %}
{% load bootstrap3 %}
{% load staticfiles %}
{% load mptt_tags %}
{% block menu %}
<link href={% static "categories/style.css" %} rel="stylesheet">
<div class="navbar navbar-inverse navbar-fixed-top" role="navigation">
<div class="container-fluid">
<div class="navbar-header">
<button type="button" class="navbar-toggle" data-toggle="collapse" data- target=".navbar-collapse">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a class="navbar-brand" href="/main">Личный кабинет</a>
</div>
<div class="navbar-collapse collapse">
<ul class="nav navbar-nav navbar-right">
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown">Здравствуйте, {{ user.last_name}} {{user.first_name }}<b class="caret"></b></a>
<ul class="dropdown-menu">
<li><a href="/change_password">Сменить пароль</a></li>
<li><a href="/logout">Выйти</a></li>
</ul>
</li>
</ul>
</div>
</div>
</div>
<div class="container-fluid">
<div class="row">
<div class="col-xs-12 col-sm-3 col-md-2 sidebar">
<div id="jquery-accordion-menu" class="jquery-accordion-menu black menu">
<ul>
{% recursetree categories %}
<li><span><a href="/categories/{{ node.category_id }}"><i class="fa fa- folder"></i>{{ node.name }}</a></span>
{% if not node.is_leaf_node %}
<ul>
{{ children }}
{% if node.docs %}
{% for docs in node.docs.all %}
{% if docs.delete == False %}
<li><span><a href="/document_cards/{{ docs.document_card_id
}}"><i class="fa fa-file-o"></i>{{ docs.name }}</a></span></li>
{% endif %}
{% endfor %}
{% endif %}
</ul>
{% elif node.is_leaf_node %}
{% for docs in node.docs.all %}
<ul>
{% for docs in node.docs.all %}
{% if docs.delete == False %}
<li><span><a href="/document_cards/{{ docs.document_card_id
}}"><i class="fa fa-file-o"></i>{{ docs.name }}</a></span></li>
{% endif %}
{% endfor %}
</ul>
{% endfor %}
{% endif %}
</li>
{% endrecursetree %}
</ul>
</div>
</div>
<div class="col-xs-12 col-sm-9 col-sm-offset-3 col-md-10 col-md-offset-2 main">
{% block info %}
<div class="table-responsive .bs-docs-sidebar ">
<table class="table nav">
<thead>
<tr>
<th>Название</th>
<th>Комментарий</th>
<th>Дата создания</th>
</tr>
</thead>
<tbody>
{% for parent in parents %}
<tr>
<td>
<div class="bs-docs-sidebar hidden-print">
<ul class="nav bs-docs-sidenav">
<li><a href="/categories/{{ parent.category_id }}"><span class="glyphicon glyphicon-folder-close"></span> {{ parent.name }}</a></li>
</ul>
</div>
</td>
<td>
<div class="bs-docs-sidebar hidden-print">
<ul class="nav bs-docs-sidenav">
<li><a>{{ parent.comment }}</a></li>
</ul>
</div>
</td>
<td>
<div class="bs-docs-sidebar hidden-print">
<ul class="nav bs-docs-sidenav">
{% for d in date %}
{% if d.category_id == parent.category_id %}
<li><a>{{ d.date }}</a></li>
{% endif %}
{% endfor %}
</ul>
</div>
</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
{% endblock %}
</div>
</div>
</div>
<script type="text/javascript" src="{% static 'categories/jquery.js' %}">
{% endblock %}
Шаблон document_card.html:
{% extends 'menu.html' %}
{% load bootstrap3 %}
{% bootstrap_pagination comment %}
{% load staticfiles %}
{% load mptt_tags %}
{% block info %}
<link href={% static "document_cards/style.css" %} rel="stylesheet">
<h1 class="page-header">{{ this.name }}</h1>
{% if this.comment %}
<div class="form-group">
<h4 class="page-header1">Комментарий</h4>
{{ this.comment }}
</div>
{% endif %}
<div class="form-group">
<h4 class="page-header1">Ссылка</h4>
{% if ext == '.doc' or ext == '.docx' %}
<i class="fa fa-file-word-o"></i>
{% elif ext == '.xls' or ext == '.xlsx' %}
<i class="fa fa-file-excel-o"></i>
{% elif ext == '.ppt' or ext == '.pptx' %}
<i class="fa fa-file-powerpoint-o"></i>
{% elif ext == '.mp3' or ext == '.flac' or ext == '.ape' or ext == '.ogg' or ext == '.waw' or ext == '.ac3' or ext == '.wma' or ext == '.m4a' or ext == '.aac' %}
<i class="fa fa-file-audio-o"></i>
{% elif ext == '.bmp' or ext == '.jpg' or ext == '.jpeg' or ext == '.png' or ext == '.gif' or ext == '.tiff' or ext == '.ico' or ext == '.raw' %}
<i class="fa fa-file-image-o"></i>
{% elif ext == '.avi' or ext == '.wmw' or ext == '.mkv' or ext == '.3gp' or ext == '.flv' or ext == '.mpeg' or ext == '.mp4' or ext == '.mov' or ext == '.vob' %}
<i class="fa fa-file-video-o"></i>
{% elif ext == '.rar' or ext == '.zip' or ext == '.7z' or ext == '.tar' or ext == '.gzip' or ext == '.gz' or ext == '.jar' %}
<i class="fa fa-file-archive-o"></i>
{% elif ext == '.pdf' %}
<i class="fa fa-file-pdf-o"></i>
{% elif ext == '.exe' %}
<i class="fa fa-file-code-o"></i>
{% else %}
<i class="fa fa-file"></i>
{% endif %}
<a href="{{ this.file.url }}" class="href">{{ doc_name }}</a>
</div>
<div class="form-group">
<h4 class="page-header1">Дата создания</h4>
{% for date in date %}
{% if date.document_card_id == this.document_card_id %}
{{ date.date }}
{% endif %}
{% endfor %}
</div>
<div class="text-right mrg-top-30">
<a class="btn btn-default" href="/document_cards/{{ this.document_card_id
}}/edit_document_card" role="button">Редактировать</a>
<a class="btn btn-default" href="/document_cards/{{ this.document_card_id
}}/delete_document_card" role="button">Удалить</a>
</div>
<div class="form-group form-comment" role="tabpanel" >
<ul class="nav nav-tabs" id="myTab" role="tablist">
<li class="nav-item active">
<a class="nav-link active" id="home-tab" data-toggle="tab" href="#home" role="tab" aria-controls="home" aria-expanded="true">Комментарии ({{ posts.count }})</a>
</li>
<li class="nav-item">
<a class="nav-link" id="profile-tab" data-toggle="tab" href="#profile" role="tab" aria- controls="profile">История</a>
</li>
</ul>
<div class="tab-content" id="myTabContent">
<div class="tab-pane fade in active" role="tabpanel" id="home" aria-labelledby="home-
tab">
{% if posts.count == 0%} Комментариев нет
<hr>
{% else %}
<div class="comments">
<ul class="media-list">
{% for comment in comment %}
<li class="media">
}}</div>
<div class="media-body">
<div class="media-heading">
{% for user in users %}
{% if comment.user_id == user.id %}
<div class="author">{{ user.last_name}} {{user.first_name
{% endif %}
{% endfor %}
<div class="metadata">
<span class="date">{{ comment.published }}</span>
</div>
</div>
<div class="media-text text-justify">{{ comment.message }}</div>
<hr>
</div>
</li>
{% endfor %}
</ul>
</div>
<div class="pagination">
<span class="step-links">
{% if comment.has_previous %}
<a href="?page={{ comment.previous_page_number }}"><span
class="glyphicon glyphicon-chevron-left"></span></a>
{% endif %}
<span class="current">
Страница {{ comment.number }} из {{ comment.paginator.num_pages }}
</span>
{% if comment.has_next %}
<a href="?page={{ comment.next_page_number }}"><span class="glyphicon glyphicon-chevron-right"></span></a>
{% endif %}
</span>
</div>
{% endif %}
<div class="comment">
<h4 class="title-comments">Добавить комментарий</h4>
<form class="form_comment" action="/main/document_card/{{ this.document_card_id }}/addpost" method="post">
{% csrf_token %}
<div class="form-group">
<textarea name="message" class="form-control" placeholder="Текст комментария" rows="4"></textarea>
</div>
<button class="btn btn-default" type="submit">Отправить</button>
</form>
</div>
</div>
<div class="tab-pane fade" id="profile" role="tabpanel" aria-labelledby="profile-tab">
<div class="comments">
<ul class="media-list">
{% for history in history %}
<li class="media">
<div class="media-body">
<div class="media-heading">
{% for user in users %}
{% if history.user_id == user.id %}
<div class="author">{{ user.last_name}} {{user.first_name }}</div>
{% endif %}
{% endfor %}
<div class="metadata">
<span class="date">{{ history.date }}</span>
</div>
</div>
<div class="media-text text-justify">
{% if history.action_id == 1 %}
Пользователь создал документ: Название: {{ history.name }}, Комментарий: {{ history.comment }}, Файл: {{ history.file }}
{% elif history.action_id == 2 %}
Пользователь отредактировал документ: Название: {{ history.name
}}, Комментарий: {{ history.comment }}, Файл: {{ history.file }}
{% elif history.action_id == 4 %}
Пользователь скачал документ {{ history.file }}
{% endif %}
</div>
<hr>
</div>
</li>
{% endfor %}
</ul>
</div>
</div>
</div>
</div>
<script type="text/javascript" src="{% static 'document_cards/jquery.js' %}">
{% endblock %}
Разработанный интерфейс
На рисунках Г.1 – Г.16 представлены интерфейсы всех страниц системы в браузере Google Chrome.
Рисунок Г.1 – Страница ввода логина и пароля